Lines Matching +full:bank +full:- +full:ioport
8 TDK LAK-CD021 and CONTEC C-NET(PC)C support added by
9 Nobuhiro Katayama, kata-[email protected]
12 Network code is based on the "FMV-18x driver" by Yutaka TAMIYA
16 Written 1993-94 by Donald Becker.
50 #include <linux/ioport.h>
124 ioport offset from the base address
135 #define NODE_ID 8 /* node ID register (bank 0) */
136 #define MAR_ADR 8 /* multicast address registers (bank 1) */
138 #define DATAPORT 8 /* buffer mem port registers (bank 2) */
148 #define UNGERMANN_MAC_ID 0x18 /* UNGERMANN-BASS hardware address */
202 #define BANK_0 0xa0 /* bank 0 (CONFIG_1) */
203 #define BANK_1 0xa4 /* bank 1 (CONFIG_1) */
204 #define BANK_2 0xa8 /* bank 2 (CONFIG_1) */
217 #define BANK_0U 0x20 /* bank 0 (CONFIG_1) */
218 #define BANK_1U 0x24 /* bank 1 (CONFIG_1) */
219 #define BANK_2U 0x28 /* bank 2 (CONFIG_1) */
237 dev_dbg(&link->dev, "fmvj18x_attach()\n"); in fmvj18x_probe()
242 return -ENOMEM; in fmvj18x_probe()
244 link->priv = dev; in fmvj18x_probe()
245 lp->p_dev = link; in fmvj18x_probe()
246 lp->base = NULL; in fmvj18x_probe()
249 link->resource[0]->end = 32; in fmvj18x_probe()
250 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; in fmvj18x_probe()
253 link->config_flags |= CONF_ENABLE_IRQ; in fmvj18x_probe()
255 dev->netdev_ops = &fjn_netdev_ops; in fmvj18x_probe()
256 dev->watchdog_timeo = TX_TIMEOUT; in fmvj18x_probe()
258 dev->ethtool_ops = &netdev_ethtool_ops; in fmvj18x_probe()
267 struct net_device *dev = link->priv; in fmvj18x_detach()
269 dev_dbg(&link->dev, "fmvj18x_detach\n"); in fmvj18x_detach()
287 link->resource[1]->start = serial_base[i]; in mfc_try_io_port()
288 link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; in mfc_try_io_port()
289 if (link->resource[1]->start == 0) { in mfc_try_io_port()
290 link->resource[1]->end = 0; in mfc_try_io_port()
305 Ungermann-Bass Access/CARD accepts 0x300,0x320,0x340,0x360 in ungermann_try_io_port()
306 0x380,0x3c0 only for ioport. in ungermann_try_io_port()
309 link->resource[0]->start = ioaddr; in ungermann_try_io_port()
313 link->config_index = in ungermann_try_io_port()
314 ((link->resource[0]->start & 0x0f0) >> 3) | 0x22; in ungermann_try_io_port()
328 struct net_device *dev = link->priv; in fmvj18x_config()
339 dev_dbg(&link->dev, "fmvj18x_config\n"); in fmvj18x_config()
341 link->io_lines = 5; in fmvj18x_config()
352 switch (link->manf_id) { in fmvj18x_config()
355 if (link->card_id == PRODID_TDK_GN3410 || in fmvj18x_config()
356 link->card_id == PRODID_TDK_NP9610 || in fmvj18x_config()
357 link->card_id == PRODID_TDK_MN3200) { in fmvj18x_config()
359 link->config_base = 0x800; in fmvj18x_config()
360 link->config_index = 0x47; in fmvj18x_config()
361 link->resource[1]->end = 8; in fmvj18x_config()
366 link->config_base = 0x800; in fmvj18x_config()
367 link->config_index = 0x47; in fmvj18x_config()
368 link->resource[1]->end = 8; in fmvj18x_config()
372 link->config_base = 0x800; in fmvj18x_config()
373 link->config_index = 0x47; in fmvj18x_config()
374 link->resource[1]->end = 8; in fmvj18x_config()
380 if (link->config_base == 0x0fe0) in fmvj18x_config()
382 else if (link->card_id == PRODID_FUJITSU_MBH10302) in fmvj18x_config()
383 /* RATOC REX-5588/9822/4886's PRODID are 0004(=MBH10302), in fmvj18x_config()
386 else if (link->card_id == PRODID_FUJITSU_MBH10304) in fmvj18x_config()
396 switch (link->manf_id) { in fmvj18x_config()
398 if (link->card_id == PRODID_FUJITSU_MBH10304) { in fmvj18x_config()
400 link->config_index = 0x20; in fmvj18x_config()
403 link->config_index = 1; in fmvj18x_config()
411 link->config_index = 1; in fmvj18x_config()
415 if (link->resource[1]->end != 0) { in fmvj18x_config()
433 dev->irq = link->irq; in fmvj18x_config()
434 dev->base_addr = link->resource[0]->start; in fmvj18x_config()
436 if (resource_size(link->resource[1]) != 0) { in fmvj18x_config()
441 ioaddr = dev->base_addr; in fmvj18x_config()
449 /* Power On chip and select bank 0 */ in fmvj18x_config()
464 card_name = "FMV-J182"; in fmvj18x_config()
478 card_name = "TDK LAK-CD021"; in fmvj18x_config()
482 card_name = "PK-UG-J001"; in fmvj18x_config()
486 card_name = "C-NET(PC)C"; in fmvj18x_config()
499 if (fmvj18x_get_hwinfo(link, buggybuf) == -1) { in fmvj18x_config()
504 card_name = "FMV-J182"; in fmvj18x_config()
512 card_name = "FMV-J181"; in fmvj18x_config()
516 lp->cardtype = cardtype; in fmvj18x_config()
517 SET_NETDEV_DEV(dev, &link->dev); in fmvj18x_config()
527 dev->base_addr, dev->irq, dev->dev_addr); in fmvj18x_config()
533 return -ENODEV; in fmvj18x_config()
543 link->resource[2]->flags |= WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; in fmvj18x_get_hwinfo()
544 link->resource[2]->start = 0; link->resource[2]->end = 0; in fmvj18x_get_hwinfo()
545 i = pcmcia_request_window(link, link->resource[2], 0); in fmvj18x_get_hwinfo()
547 return -1; in fmvj18x_get_hwinfo()
549 base = ioremap(link->resource[2]->start, resource_size(link->resource[2])); in fmvj18x_get_hwinfo()
551 pcmcia_release_window(link, link->resource[2]); in fmvj18x_get_hwinfo()
552 return -1; in fmvj18x_get_hwinfo()
555 pcmcia_map_mem_page(link, link->resource[2], 0); in fmvj18x_get_hwinfo()
565 if (readb(base+(i-1)*2) == 0xff && in fmvj18x_get_hwinfo()
580 j = pcmcia_release_window(link, link->resource[2]); in fmvj18x_get_hwinfo()
581 return (i != 0x200) ? 0 : -1; in fmvj18x_get_hwinfo()
589 struct net_device *dev = link->priv; in fmvj18x_setup_mfc()
594 link->resource[3]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; in fmvj18x_setup_mfc()
595 link->resource[3]->start = link->resource[3]->end = 0; in fmvj18x_setup_mfc()
596 i = pcmcia_request_window(link, link->resource[3], 0); in fmvj18x_setup_mfc()
598 return -1; in fmvj18x_setup_mfc()
600 lp->base = ioremap(link->resource[3]->start, in fmvj18x_setup_mfc()
601 resource_size(link->resource[3])); in fmvj18x_setup_mfc()
602 if (lp->base == NULL) { in fmvj18x_setup_mfc()
604 return -1; in fmvj18x_setup_mfc()
607 i = pcmcia_map_mem_page(link, link->resource[3], 0); in fmvj18x_setup_mfc()
609 iounmap(lp->base); in fmvj18x_setup_mfc()
610 lp->base = NULL; in fmvj18x_setup_mfc()
611 return -1; in fmvj18x_setup_mfc()
614 ioaddr = dev->base_addr; in fmvj18x_setup_mfc()
615 writeb(0x47, lp->base+0x800); /* Config Option Register of LAN */ in fmvj18x_setup_mfc()
616 writeb(0x0, lp->base+0x802); /* Config and Status Register */ in fmvj18x_setup_mfc()
618 writeb(ioaddr & 0xff, lp->base+0x80a); /* I/O Base(Low) of LAN */ in fmvj18x_setup_mfc()
619 writeb((ioaddr >> 8) & 0xff, lp->base+0x80c); /* I/O Base(High) of LAN */ in fmvj18x_setup_mfc()
621 writeb(0x45, lp->base+0x820); /* Config Option Register of Modem */ in fmvj18x_setup_mfc()
622 writeb(0x8, lp->base+0x822); /* Config and Status Register */ in fmvj18x_setup_mfc()
632 struct net_device *dev = link->priv; in fmvj18x_release()
636 dev_dbg(&link->dev, "fmvj18x_release\n"); in fmvj18x_release()
638 if (lp->base != NULL) { in fmvj18x_release()
639 tmp = lp->base; in fmvj18x_release()
640 lp->base = NULL; /* set NULL before iounmap */ in fmvj18x_release()
650 struct net_device *dev = link->priv; in fmvj18x_suspend()
652 if (link->open) in fmvj18x_suspend()
660 struct net_device *dev = link->priv; in fmvj18x_resume()
662 if (link->open) { in fmvj18x_resume()
675 …PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922…
676 …PCMCIA_DEVICE_PROD_ID12("Eiger labs,Inc.", "EPX-10BT PC Card Ethernet 10BT", 0xf47e6c66, 0x877f992…
677 PCMCIA_DEVICE_PROD_ID12("FUJITSU", "LAN Card(FMV-J182)", 0x6ee5a3d8, 0x5baf31db),
680 PCMCIA_DEVICE_PROD_ID12("HITACHI", "HT-4840-11", 0xf4f43949, 0x773910f4),
684 PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CD02x", 0x1eae9475, 0x8fa0ee70),
685 PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CF010", 0x1eae9475, 0x7683bc9a),
691 PCMCIA_PFC_DEVICE_PROD_ID12(0, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
722 ioaddr = dev->base_addr; in fjn_interrupt()
738 pr_debug("%s: interrupt, rx_status %02x.\n", dev->name, rx_stat); in fjn_interrupt()
746 dev->stats.tx_packets += lp->sent ; in fjn_interrupt()
747 lp->sent = 0 ; in fjn_interrupt()
748 if (lp->tx_queue) { in fjn_interrupt()
749 outb(DO_TX | lp->tx_queue, ioaddr + TX_START); in fjn_interrupt()
750 lp->sent = lp->tx_queue ; in fjn_interrupt()
751 lp->tx_queue = 0; in fjn_interrupt()
752 lp->tx_queue_len = 0; in fjn_interrupt()
755 lp->tx_started = 0; in fjn_interrupt()
759 pr_debug("%s: exiting interrupt,\n", dev->name); in fjn_interrupt()
765 if (lp->base != NULL) { in fjn_interrupt()
767 writeb(0x01, lp->base+0x802); in fjn_interrupt()
768 writeb(0x09, lp->base+0x822); in fjn_interrupt()
780 unsigned int ioaddr = dev->base_addr; in fjn_tx_timeout()
792 dev->stats.tx_errors++; in fjn_tx_timeout()
797 lp->tx_started = 0; in fjn_tx_timeout()
798 lp->tx_queue = 0; in fjn_tx_timeout()
799 lp->tx_queue_len = 0; in fjn_tx_timeout()
800 lp->sent = 0; in fjn_tx_timeout()
801 lp->open_time = jiffies; in fjn_tx_timeout()
810 unsigned int ioaddr = dev->base_addr; in fjn_start_xmit()
811 short length = skb->len; in fjn_start_xmit()
823 unsigned char *buf = skb->data; in fjn_start_xmit()
832 (unsigned long)skb->len); in fjn_start_xmit()
833 dev->stats.tx_bytes += skb->len; in fjn_start_xmit()
844 lp->tx_queue++; in fjn_start_xmit()
845 lp->tx_queue_len += ((length+3) & ~1); in fjn_start_xmit()
847 if (lp->tx_started == 0) { in fjn_start_xmit()
849 outb(DO_TX | lp->tx_queue, ioaddr + TX_START); in fjn_start_xmit()
850 lp->sent = lp->tx_queue ; in fjn_start_xmit()
851 lp->tx_queue = 0; in fjn_start_xmit()
852 lp->tx_queue_len = 0; in fjn_start_xmit()
853 lp->tx_started = 1; in fjn_start_xmit()
857 if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) ) in fjn_start_xmit()
861 if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) && in fjn_start_xmit()
862 lp->tx_queue < 127 ) in fjn_start_xmit()
868 /* Re-enable interrupts */ in fjn_start_xmit()
882 unsigned int ioaddr = dev->base_addr; in fjn_reset()
893 /* Power On chip and select bank 0 */ in fjn_reset()
894 if (lp->cardtype == MBH10302) in fjn_reset()
906 outb(dev->dev_addr[i], ioaddr + NODE_ID + i); in fjn_reset()
911 /* Switch to bank 2 (runtime mode) */ in fjn_reset()
912 if (lp->cardtype == MBH10302) in fjn_reset()
918 if( lp->cardtype == TDK || lp->cardtype == CONTEC) in fjn_reset()
944 if (lp->cardtype == MBH10302) in fjn_reset()
952 if (lp->cardtype == MBH10302) in fjn_reset()
960 unsigned int ioaddr = dev->base_addr; in fjn_rx()
961 int boguscount = 10; /* 5 -> 10: by agy 19940922 */ in fjn_rx()
964 dev->name, inb(ioaddr + RX_STATUS)); in fjn_rx()
978 dev->stats.rx_errors++; in fjn_rx()
979 if (status & F_LEN_ERR) dev->stats.rx_length_errors++; in fjn_rx()
980 if (status & F_ALG_ERR) dev->stats.rx_frame_errors++; in fjn_rx()
981 if (status & F_CRC_ERR) dev->stats.rx_crc_errors++; in fjn_rx()
982 if (status & F_OVR_FLO) dev->stats.rx_over_errors++; in fjn_rx()
989 netdev_notice(dev, "The FMV-18x claimed a very large packet, size %d\n", in fjn_rx()
992 dev->stats.rx_errors++; in fjn_rx()
998 dev->stats.rx_dropped++; in fjn_rx()
1005 skb->protocol = eth_type_trans(skb, dev); in fjn_rx()
1010 dev->name, pkt_len); in fjn_rx()
1012 pr_debug(" %02x", skb->data[i]); in fjn_rx()
1017 dev->stats.rx_packets++; in fjn_rx()
1018 dev->stats.rx_bytes += pkt_len; in fjn_rx()
1020 if (--boguscount <= 0) in fjn_rx()
1024 /* If any worth-while packets have been received, dev_rint() in fjn_rx()
1026 when we get to the bottom-half routine. */ in fjn_rx()
1028 if (lp->cardtype != TDK) { in fjn_rx()
1039 "%d ticks.\n", dev->name, inb(ioaddr + RX_MODE), i); in fjn_rx()
1049 strscpy(info->driver, DRV_NAME, sizeof(info->driver)); in netdev_get_drvinfo()
1050 strscpy(info->version, DRV_VERSION, sizeof(info->version)); in netdev_get_drvinfo()
1051 snprintf(info->bus_info, sizeof(info->bus_info), in netdev_get_drvinfo()
1052 "PCMCIA 0x%lx", dev->base_addr); in netdev_get_drvinfo()
1066 struct pcmcia_device *link = lp->p_dev; in fjn_open()
1068 pr_debug("fjn_open('%s').\n", dev->name); in fjn_open()
1071 return -ENODEV; in fjn_open()
1073 link->open++; in fjn_open()
1077 lp->tx_started = 0; in fjn_open()
1078 lp->tx_queue = 0; in fjn_open()
1079 lp->tx_queue_len = 0; in fjn_open()
1080 lp->open_time = jiffies; in fjn_open()
1091 struct pcmcia_device *link = lp->p_dev; in fjn_close()
1092 unsigned int ioaddr = dev->base_addr; in fjn_close()
1094 pr_debug("fjn_close('%s').\n", dev->name); in fjn_close()
1096 lp->open_time = 0; in fjn_close()
1105 /* Update the statistics -- ToDo. */ in fjn_close()
1107 /* Power-down the chip. Green, green, green! */ in fjn_close()
1111 if (lp->cardtype == MBH10302) in fjn_close()
1114 link->open--; in fjn_close()
1127 unsigned int ioaddr = dev->base_addr; in set_rx_mode()
1143 if (dev->flags & IFF_PROMISC) { in set_rx_mode()
1147 (dev->flags & IFF_ALLMULTI)) { in set_rx_mode()
1148 /* Too many to filter perfectly -- accept all multicasts. */ in set_rx_mode()
1159 unsigned int bit = ether_crc_le(ETH_ALEN, ha->addr) >> 26; in set_rx_mode()
1165 /* Switch to bank 1 and set the multicast table. */ in set_rx_mode()