Lines Matching +full:individual +full:- +full:port +full:- +full:switching

3  * Xircom Realport 10/100 (RE-100) driver 
6 * including the CE2, CE IIps, RE-10, CEM28, CEM33, CE33, CEM56,
7 * CE3-100, CE3B, RE-100, REM10BT, and REM56G-100.
9 * 2000-09-24 <[email protected]> The Xircom CE3B-100 may not
37 * the restrictions contained in a BSD-style copyright.)
127 #define XIRCREG_EDP 4 /* Ethernet Data Port Register */
160 DisableAutoTx = 0x40, /* disable auto-transmit */
164 /* values for the leds: Bits 2-0 for led 1
165 * 0 disabled Bits 5-3 for led 2
181 #define XIRCREG4_LMD 14 /* Local Memory Data Port */
202 #define XIRCREG42_BOC 10 /* Back-Off Configuration */
208 #define XIRCREG50_IA 8 /* Individual Address (8-13) */
248 * the second enables the usage of the complete on-chip buffer. We use the
318 unsigned int ioaddr = dev->base_addr;
382 PutWord(XIRCREG2_GPR2-1, 0x0e0e); in mii_putbit()
384 PutWord(XIRCREG2_GPR2-1, 0x0f0f); in mii_putbit()
387 PutWord(XIRCREG2_GPR2-1, 0x0c0c); in mii_putbit()
389 PutWord(XIRCREG2_GPR2-1, 0x0d0d); in mii_putbit()
414 unsigned m = 1 << (len-1); in mii_wbits()
479 dev_dbg(&link->dev, "attach()\n"); in xirc2ps_probe()
484 return -ENOMEM; in xirc2ps_probe()
486 local->dev = dev; in xirc2ps_probe()
487 local->p_dev = link; in xirc2ps_probe()
488 link->priv = dev; in xirc2ps_probe()
491 link->config_index = 1; in xirc2ps_probe()
494 dev->netdev_ops = &netdev_ops; in xirc2ps_probe()
495 dev->ethtool_ops = &netdev_ethtool_ops; in xirc2ps_probe()
496 dev->watchdog_timeo = TX_TIMEOUT; in xirc2ps_probe()
497 INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task); in xirc2ps_probe()
505 struct net_device *dev = link->priv; in xirc2ps_detach()
510 cancel_work_sync(&local->tx_timeout_task); in xirc2ps_detach()
512 dev_dbg(&link->dev, "detach\n"); in xirc2ps_detach()
525 * Media-Id bits:
532 * Prod-Id bits:
542 struct net_device *dev = link->priv; in set_card_type()
550 dev_err(&link->dev, "invalid CIS -- sorry\n"); in set_card_type()
558 dev_dbg(&link->dev, "cisrev=%02x mediaid=%02x prodid=%02x\n", in set_card_type()
561 local->mohawk = 0; in set_card_type()
562 local->dingo = 0; in set_card_type()
563 local->modem = 0; in set_card_type()
564 local->card_type = XIR_UNKNOWN; in set_card_type()
574 local->modem = 1; in set_card_type()
576 case 1: local->card_type = XIR_CEM ; break; in set_card_type()
577 case 2: local->card_type = XIR_CEM2 ; break; in set_card_type()
578 case 3: local->card_type = XIR_CEM3 ; break; in set_card_type()
579 case 4: local->card_type = XIR_CEM33 ; break; in set_card_type()
580 case 5: local->card_type = XIR_CEM56M; in set_card_type()
581 local->mohawk = 1; in set_card_type()
585 local->card_type = XIR_CEM56 ; in set_card_type()
586 local->mohawk = 1; in set_card_type()
587 local->dingo = 1; in set_card_type()
592 case 1: local->card_type = has_ce2_string(link)? XIR_CE2 : XIR_CE ; in set_card_type()
594 case 2: local->card_type = XIR_CE2; break; in set_card_type()
595 case 3: local->card_type = XIR_CE3; in set_card_type()
596 local->mohawk = 1; in set_card_type()
600 if (local->card_type == XIR_CE || local->card_type == XIR_CEM) { in set_card_type()
604 if (local->card_type == XIR_UNKNOWN) in set_card_type()
618 if (p_dev->prod_id[2] && strstr(p_dev->prod_id[2], "CE2")) in has_ce2_string()
628 if ((p_dev->resource[0]->start & 0xf) == 8) in xirc2ps_config_modem()
629 return -ENODEV; in xirc2ps_config_modem()
631 p_dev->resource[0]->end = 16; in xirc2ps_config_modem()
632 p_dev->resource[1]->end = 8; in xirc2ps_config_modem()
633 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_modem()
634 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config_modem()
635 p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_modem()
636 p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; in xirc2ps_config_modem()
637 p_dev->io_lines = 10; in xirc2ps_config_modem()
639 p_dev->resource[1]->start = p_dev->resource[0]->start; in xirc2ps_config_modem()
641 p_dev->resource[0]->start = ioaddr; in xirc2ps_config_modem()
645 return -ENODEV; in xirc2ps_config_modem()
652 resource_size_t tmp = p_dev->resource[1]->start; in xirc2ps_config_check()
654 tmp += (*pass ? (p_dev->config_index & 0x20 ? -24 : 8) in xirc2ps_config_check()
655 : (p_dev->config_index & 0x20 ? 8 : -24)); in xirc2ps_config_check()
657 if ((p_dev->resource[0]->start & 0xf) == 8) in xirc2ps_config_check()
658 return -ENODEV; in xirc2ps_config_check()
660 p_dev->resource[0]->end = 18; in xirc2ps_config_check()
661 p_dev->resource[1]->end = 8; in xirc2ps_config_check()
662 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_check()
663 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config_check()
664 p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_check()
665 p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; in xirc2ps_config_check()
666 p_dev->io_lines = 10; in xirc2ps_config_check()
668 p_dev->resource[1]->start = p_dev->resource[0]->start; in xirc2ps_config_check()
669 p_dev->resource[0]->start = tmp; in xirc2ps_config_check()
680 if (tuple->TupleDataLen != 13) in pcmcia_get_mac_ce()
681 return -EINVAL; in pcmcia_get_mac_ce()
682 if ((tuple->TupleData[0] != 2) || (tuple->TupleData[1] != 1) || in pcmcia_get_mac_ce()
683 (tuple->TupleData[2] != 6)) in pcmcia_get_mac_ce()
684 return -EINVAL; in pcmcia_get_mac_ce()
686 dev_addr_mod(dev, 2, &tuple->TupleData[2], 4); in pcmcia_get_mac_ce()
694 struct net_device *dev = link->priv; in xirc2ps_config()
701 local->dingo_ccr = NULL; in xirc2ps_config()
703 dev_dbg(&link->dev, "config\n"); in xirc2ps_config()
706 if (link->has_manf_id == 0) { in xirc2ps_config()
711 switch (link->manf_id) { in xirc2ps_config()
713 local->manf_str = "Xircom"; in xirc2ps_config()
716 local->manf_str = "Accton"; in xirc2ps_config()
720 local->manf_str = "Compaq"; in xirc2ps_config()
723 local->manf_str = "Intel"; in xirc2ps_config()
726 local->manf_str = "Toshiba"; in xirc2ps_config()
730 (unsigned)link->manf_id); in xirc2ps_config()
733 dev_dbg(&link->dev, "found %s card\n", local->manf_str); in xirc2ps_config()
743 /* not found: try to get the node-id from tuple 0x89 */ in xirc2ps_config()
751 err = -1; in xirc2ps_config()
760 pr_notice("node-id not found in CIS\n"); in xirc2ps_config()
764 if (local->modem) { in xirc2ps_config()
766 link->config_flags |= CONF_AUTO_SET_IO; in xirc2ps_config()
768 if (local->dingo) { in xirc2ps_config()
769 /* Take the Modem IO port from the CIS and scan for a free in xirc2ps_config()
770 * Ethernet port */ in xirc2ps_config()
776 * mirrored every 32 bytes. Actually we use a mirrored port for in xirc2ps_config()
789 link->io_lines = 10; in xirc2ps_config()
790 link->resource[0]->end = 16; in xirc2ps_config()
791 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config()
793 link->resource[0]->start = ioaddr; in xirc2ps_config()
797 link->resource[0]->start = 0; /* let CS decide */ in xirc2ps_config()
810 link->config_flags |= CONF_ENABLE_IRQ; in xirc2ps_config()
812 link->config_flags |= CONF_ENABLE_SPKR; in xirc2ps_config()
817 if (local->dingo) { in xirc2ps_config()
820 * the base address of the ethernet port (BasePort1) is written in xirc2ps_config()
824 link->resource[1]->start & 0xff); in xirc2ps_config()
829 (link->resource[1]->start >> 8) & 0xff); in xirc2ps_config()
837 link->resource[2]->flags = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | in xirc2ps_config()
839 link->resource[2]->start = link->resource[2]->end = 0; in xirc2ps_config()
840 if ((err = pcmcia_request_window(link, link->resource[2], 0))) in xirc2ps_config()
843 local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; in xirc2ps_config()
844 if ((err = pcmcia_map_mem_page(link, link->resource[2], 0))) in xirc2ps_config()
850 writeb(0x47, local->dingo_ccr + CISREG_COR); in xirc2ps_config()
851 ioaddr = link->resource[0]->start; in xirc2ps_config()
852 writeb(ioaddr & 0xff , local->dingo_ccr + CISREG_IOBASE_0); in xirc2ps_config()
853 writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1); in xirc2ps_config()
860 tmp = readb(local->dingo_ccr + i*2); in xirc2ps_config()
866 tmp = readb(local->dingo_ccr + 0x20 + i*2); in xirc2ps_config()
872 tmp = readb(local->dingo_ccr + 0x40 + i*2); in xirc2ps_config()
879 writeb(0x01, local->dingo_ccr + 0x20); in xirc2ps_config()
880 writeb(0x0c, local->dingo_ccr + 0x22); in xirc2ps_config()
881 writeb(0x00, local->dingo_ccr + 0x24); in xirc2ps_config()
882 writeb(0x00, local->dingo_ccr + 0x26); in xirc2ps_config()
883 writeb(0x00, local->dingo_ccr + 0x28); in xirc2ps_config()
887 local->probe_port=0; in xirc2ps_config()
889 local->probe_port = dev->if_port = 1; in xirc2ps_config()
891 (local->mohawk && if_port==4)) in xirc2ps_config()
892 dev->if_port = if_port; in xirc2ps_config()
897 dev->irq = link->irq; in xirc2ps_config()
898 dev->base_addr = link->resource[0]->start; in xirc2ps_config()
900 if (local->dingo) in xirc2ps_config()
903 SET_NETDEV_DEV(dev, &link->dev); in xirc2ps_config()
911 netdev_info(dev, "%s: port %#3lx, irq %d, hwaddr %pM\n", in xirc2ps_config()
912 local->manf_str, (u_long)dev->base_addr, (int)dev->irq, in xirc2ps_config()
913 dev->dev_addr); in xirc2ps_config()
919 return -ENODEV; in xirc2ps_config()
922 return -ENODEV; in xirc2ps_config()
928 dev_dbg(&link->dev, "release\n"); in xirc2ps_release()
930 if (link->resource[2]->end) { in xirc2ps_release()
931 struct net_device *dev = link->priv; in xirc2ps_release()
933 if (local->dingo) in xirc2ps_release()
934 iounmap(local->dingo_ccr - 0x0800); in xirc2ps_release()
944 struct net_device *dev = link->priv; in xirc2ps_suspend()
946 if (link->open) { in xirc2ps_suspend()
956 struct net_device *dev = link->priv; in xirc2ps_resume()
958 if (link->open) { in xirc2ps_resume()
984 * -- on a laptop? in xirc2ps_interrupt()
990 ioaddr = dev->base_addr; in xirc2ps_interrupt()
991 if (lp->mohawk) { /* must disable the interrupt */ in xirc2ps_interrupt()
995 pr_debug("%s: interrupt %d at %#x.\n", dev->name, irq, ioaddr); in xirc2ps_interrupt()
1005 pr_debug("%s: interrupt %d for dead card\n", dev->name, irq); in xirc2ps_interrupt()
1019 dev->name, int_status, eth_status, rx_status, tx_status); in xirc2ps_interrupt()
1028 dev->stats.rx_dropped++; in xirc2ps_interrupt()
1029 pr_debug("%s: RX drop, too much done\n", dev->name); in xirc2ps_interrupt()
1041 dev->stats.rx_dropped++; in xirc2ps_interrupt()
1044 if (lp->silicon == 0 ) { /* work around a hardware bug */ in xirc2ps_interrupt()
1060 i--; in xirc2ps_interrupt()
1069 else if (lp->mohawk) { in xirc2ps_interrupt()
1081 unsigned int edpreg = ioaddr+XIRCREG_EDP-2; in xirc2ps_interrupt()
1095 skb->protocol = eth_type_trans(skb, dev); in xirc2ps_interrupt()
1097 dev->stats.rx_packets++; in xirc2ps_interrupt()
1098 dev->stats.rx_bytes += pktlen; in xirc2ps_interrupt()
1100 dev->stats.multicast++; in xirc2ps_interrupt()
1106 dev->stats.rx_frame_errors++; in xirc2ps_interrupt()
1107 pr_debug("%s: Packet too long\n", dev->name); in xirc2ps_interrupt()
1110 dev->stats.rx_crc_errors++; in xirc2ps_interrupt()
1111 pr_debug("%s: CRC error\n", dev->name); in xirc2ps_interrupt()
1114 dev->stats.rx_fifo_errors++; /* okay ? */ in xirc2ps_interrupt()
1115 pr_debug("%s: Alignment error\n", dev->name); in xirc2ps_interrupt()
1125 dev->stats.rx_over_errors++; in xirc2ps_interrupt()
1134 n = lp->last_ptr_value; in xirc2ps_interrupt()
1136 lp->last_ptr_value = nn; in xirc2ps_interrupt()
1138 dev->stats.tx_packets += 256 - n; in xirc2ps_interrupt()
1139 else if (n == nn) { /* happens sometimes - don't know why */ in xirc2ps_interrupt()
1142 dev->stats.tx_packets += lp->last_ptr_value - n; in xirc2ps_interrupt()
1150 dev->stats.tx_aborted_errors++; in xirc2ps_interrupt()
1157 u_long duration = jiffies - start_ticks; in xirc2ps_interrupt()
1182 PutByte(XIRCREG_CR, EnableIntr); /* re-enable interrupts */ in xirc2ps_interrupt()
1197 struct net_device *dev = local->dev; in xirc2ps_tx_timeout_task()
1208 dev->stats.tx_errors++; in xirc_tx_timeout()
1210 schedule_work(&lp->tx_timeout_task); in xirc_tx_timeout()
1217 unsigned int ioaddr = dev->base_addr; in do_start_xmit()
1220 unsigned pktlen = skb->len; in do_start_xmit()
1244 /* TRS doesn't work - (indeed it is eliminated with sil-rev 1) */ in do_start_xmit()
1247 dev->name, freespace, okay ? " (okay)":" (not enough)"); in do_start_xmit()
1253 outsw(ioaddr+XIRCREG_EDP, skb->data, pktlen>>1); in do_start_xmit()
1255 PutByte(XIRCREG_EDP, skb->data[pktlen-1]); in do_start_xmit()
1257 if (lp->mohawk) in do_start_xmit()
1261 dev->stats.tx_bytes += pktlen; in do_start_xmit()
1275 unsigned int ioaddr = sa_info->ioaddr; in set_address()
1279 if (sa_info->reg_nr > 15) { in set_address()
1280 sa_info->reg_nr = 8; in set_address()
1281 sa_info->page_nr++; in set_address()
1282 SelectPage(sa_info->page_nr); in set_address()
1284 if (sa_info->mohawk) in set_address()
1285 PutByte(sa_info->reg_nr++, addr[5 - i]); in set_address()
1287 PutByte(sa_info->reg_nr++, addr[i]); in set_address()
1292 * Set all addresses: This first one is the individual address,
1294 * the rest is filled with the individual address.
1298 unsigned int ioaddr = dev->base_addr; in set_addresses()
1309 sa_info.page_nr = 0x50 - 1; in set_addresses()
1310 sa_info.mohawk = lp->mohawk; in set_addresses()
1313 set_address(&sa_info, dev->dev_addr); in set_addresses()
1318 set_address(&sa_info, ha->addr); in set_addresses()
1321 set_address(&sa_info, dev->dev_addr); in set_addresses()
1334 unsigned int ioaddr = dev->base_addr; in set_multicast_list()
1340 if (dev->flags & IFF_PROMISC) { /* snoop */ in set_multicast_list()
1342 } else if (netdev_mc_count(dev) > 9 || (dev->flags & IFF_ALLMULTI)) { in set_multicast_list()
1364 if (map->port != 255 && map->port != dev->if_port) { in do_config()
1365 if (map->port > 4) in do_config()
1366 return -EINVAL; in do_config()
1367 if (!map->port) { in do_config()
1368 local->probe_port = 1; in do_config()
1369 WRITE_ONCE(dev->if_port, 1); in do_config()
1371 local->probe_port = 0; in do_config()
1372 WRITE_ONCE(dev->if_port, map->port); in do_config()
1374 netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]); in do_config()
1375 do_reset(dev,1); /* not the fine way :-) */ in do_config()
1387 struct pcmcia_device *link = lp->p_dev; in do_open()
1389 dev_dbg(&link->dev, "do_open(%p)\n", dev); in do_open()
1394 return -ENODEV; in do_open()
1397 link->open++; in do_open()
1408 strscpy(info->driver, "xirc2ps_cs", sizeof(info->driver)); in netdev_get_drvinfo()
1409 snprintf(info->bus_info, sizeof(info->bus_info), "PCMCIA 0x%lx", in netdev_get_drvinfo()
1410 dev->base_addr); in netdev_get_drvinfo()
1421 unsigned int ioaddr = dev->base_addr; in do_ioctl()
1424 pr_debug("%s: ioctl(%-.6s, %#04x) %04x %04x %04x %04x\n", in do_ioctl()
1425 dev->name, rq->ifr_ifrn.ifrn_name, cmd, in do_ioctl()
1426 data->phy_id, data->reg_num, data->val_in, data->val_out); in do_ioctl()
1428 if (!local->mohawk) in do_ioctl()
1429 return -EOPNOTSUPP; in do_ioctl()
1433 data->phy_id = 0; /* we have only this address */ in do_ioctl()
1436 data->val_out = mii_rd(ioaddr, data->phy_id & 0x1f, in do_ioctl()
1437 data->reg_num & 0x1f); in do_ioctl()
1440 mii_wr(ioaddr, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in, in do_ioctl()
1444 return -EOPNOTSUPP; in do_ioctl()
1453 unsigned int ioaddr = dev->base_addr; in hardreset()
1459 if (local->mohawk) in hardreset()
1470 unsigned int ioaddr = dev->base_addr; in do_reset()
1473 pr_debug("%s: do_reset(%p,%d)\n", dev->name, dev, full); in do_reset()
1480 if (local->mohawk) { in do_reset()
1492 local->last_ptr_value = 0; in do_reset()
1493 local->silicon = local->mohawk ? (GetByte(XIRCREG4_BOV) & 0x70) >> 4 in do_reset()
1496 if (local->probe_port) { in do_reset()
1497 if (!local->mohawk) { in do_reset()
1500 local->probe_port = 0; in do_reset()
1502 } else if (dev->if_port == 2) { /* enable 10Base2 */ in do_reset()
1515 pr_debug("%s: ESR is: %#02x\n", dev->name, value); in do_reset()
1525 if (local->mohawk) in do_reset()
1529 pr_debug("%s: ECR is: %#02x\n", dev->name, value); in do_reset()
1534 if (local->silicon != 1) { in do_reset()
1563 if (full && local->mohawk && init_mii(dev)) { in do_reset()
1564 if (dev->if_port == 4 || local->dingo || local->new_mii) { in do_reset()
1572 if (dev->if_port == 2) /* enable 10Base2 */ in do_reset()
1583 dev->if_port = (value & MediaSelect) ? 1 : 2; in do_reset()
1588 if (dev->if_port == 1 || dev->if_port == 4) /* TP: Link and Activity */ in do_reset()
1590 else /* Coax: Not-Collision and Activity */ in do_reset()
1593 if (local->dingo) in do_reset()
1609 if (local->modem && !local->dingo) { /* do some magic */ in do_reset()
1611 PutByte(0x10, 0x11); /* unmask master-int bit */ in do_reset()
1616 if_names[dev->if_port], local->silicon); in do_reset()
1624 * Initialize the Media-Independent-Interface
1631 unsigned int ioaddr = dev->base_addr; in init_mii()
1636 dev->if_port = if_port; in init_mii()
1637 local->probe_port = 0; in init_mii()
1645 local->new_mii = (mii_rd(ioaddr, 0, 2) != 0xffff); in init_mii()
1647 if (local->probe_port) in init_mii()
1649 else if (dev->if_port == 4) in init_mii()
1659 local->probe_port = 0; in init_mii()
1663 if (local->probe_port) { in init_mii()
1677 if (!local->new_mii) { in init_mii()
1682 dev->if_port = (GetByte(XIRCREG_ESR) & MediaSelect) ? 1 : 2; in init_mii()
1688 dev->if_port = 4; in init_mii()
1690 dev->if_port = 1; in init_mii()
1701 unsigned int ioaddr = dev->base_addr; in do_powerdown()
1713 unsigned int ioaddr = dev->base_addr; in do_stop()
1715 struct pcmcia_device *link = lp->p_dev; in do_stop()
1717 dev_dbg(&link->dev, "do_stop(%p)\n", dev); in do_stop()
1720 return -ENODEV; in do_stop()
1732 link->open--; in do_stop()
1747 PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
1748 PCMCIA_DEVICE_PROD_ID13("Xircom", "PS-CE2-10", 0x2e3ee845, 0x947d9073),
1749 PCMCIA_DEVICE_PROD_ID13("Xircom", "R2E-100BTX", 0x2e3ee845, 0x2464a6e3),
1750 PCMCIA_DEVICE_PROD_ID13("Xircom", "RE-10", 0x2e3ee845, 0x3e08d609),
1756 /* also matches CFE-10 cards! */
1779 int ints[10] = { -1 }; in setup_xirc2ps_cs()
1783 #define MAYBE_SET(X,Y) if (ints[0] >= Y && ints[Y] != -1) { X = ints[Y]; } in setup_xirc2ps_cs()