Lines Matching +full:no +full:- +full:read +full:- +full:rollover
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 <psheer@icon.co.za> The Xircom CE3B-100 may not
37 * the restrictions contained in a BSD-style copyright.)
55 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
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
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;
351 * Turn around for read
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()
405 d = GetByte(XIRCREG2_GPR2); /* read MDIO */ in mii_getbit()
408 return d & 0x20; /* read MDIO */ in mii_getbit()
414 unsigned m = 1 << (len-1); in mii_wbits()
428 mii_wbits(ioaddr, 0x06, 4); /* Start and opcode for read */ in mii_rd()
430 mii_wbits(ioaddr, phyreg, 5); /* PHY register to read */ in mii_rd()
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()
507 dev_dbg(&link->dev, "detach\n"); in xirc2ps_detach()
520 * Media-Id bits:
527 * Prod-Id bits:
537 struct net_device *dev = link->priv; in set_card_type()
545 dev_err(&link->dev, "invalid CIS -- sorry\n"); in set_card_type()
553 dev_dbg(&link->dev, "cisrev=%02x mediaid=%02x prodid=%02x\n", in set_card_type()
556 local->mohawk = 0; in set_card_type()
557 local->dingo = 0; in set_card_type()
558 local->modem = 0; in set_card_type()
559 local->card_type = XIR_UNKNOWN; in set_card_type()
569 local->modem = 1; in set_card_type()
571 case 1: local->card_type = XIR_CEM ; break; in set_card_type()
572 case 2: local->card_type = XIR_CEM2 ; break; in set_card_type()
573 case 3: local->card_type = XIR_CEM3 ; break; in set_card_type()
574 case 4: local->card_type = XIR_CEM33 ; break; in set_card_type()
575 case 5: local->card_type = XIR_CEM56M; in set_card_type()
576 local->mohawk = 1; in set_card_type()
580 local->card_type = XIR_CEM56 ; in set_card_type()
581 local->mohawk = 1; in set_card_type()
582 local->dingo = 1; in set_card_type()
587 case 1: local->card_type = has_ce2_string(link)? XIR_CE2 : XIR_CE ; in set_card_type()
589 case 2: local->card_type = XIR_CE2; break; in set_card_type()
590 case 3: local->card_type = XIR_CE3; in set_card_type()
591 local->mohawk = 1; in set_card_type()
595 if (local->card_type == XIR_CE || local->card_type == XIR_CEM) { in set_card_type()
599 if (local->card_type == XIR_UNKNOWN) in set_card_type()
613 if (p_dev->prod_id[2] && strstr(p_dev->prod_id[2], "CE2")) in has_ce2_string()
623 if ((p_dev->resource[0]->start & 0xf) == 8) in xirc2ps_config_modem()
624 return -ENODEV; in xirc2ps_config_modem()
626 p_dev->resource[0]->end = 16; in xirc2ps_config_modem()
627 p_dev->resource[1]->end = 8; in xirc2ps_config_modem()
628 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_modem()
629 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config_modem()
630 p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_modem()
631 p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; in xirc2ps_config_modem()
632 p_dev->io_lines = 10; in xirc2ps_config_modem()
634 p_dev->resource[1]->start = p_dev->resource[0]->start; in xirc2ps_config_modem()
636 p_dev->resource[0]->start = ioaddr; in xirc2ps_config_modem()
640 return -ENODEV; in xirc2ps_config_modem()
647 resource_size_t tmp = p_dev->resource[1]->start; in xirc2ps_config_check()
649 tmp += (*pass ? (p_dev->config_index & 0x20 ? -24 : 8) in xirc2ps_config_check()
650 : (p_dev->config_index & 0x20 ? 8 : -24)); in xirc2ps_config_check()
652 if ((p_dev->resource[0]->start & 0xf) == 8) in xirc2ps_config_check()
653 return -ENODEV; in xirc2ps_config_check()
655 p_dev->resource[0]->end = 18; in xirc2ps_config_check()
656 p_dev->resource[1]->end = 8; in xirc2ps_config_check()
657 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_check()
658 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config_check()
659 p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; in xirc2ps_config_check()
660 p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; in xirc2ps_config_check()
661 p_dev->io_lines = 10; in xirc2ps_config_check()
663 p_dev->resource[1]->start = p_dev->resource[0]->start; in xirc2ps_config_check()
664 p_dev->resource[0]->start = tmp; in xirc2ps_config_check()
675 if (tuple->TupleDataLen != 13) in pcmcia_get_mac_ce()
676 return -EINVAL; in pcmcia_get_mac_ce()
677 if ((tuple->TupleData[0] != 2) || (tuple->TupleData[1] != 1) || in pcmcia_get_mac_ce()
678 (tuple->TupleData[2] != 6)) in pcmcia_get_mac_ce()
679 return -EINVAL; in pcmcia_get_mac_ce()
681 dev_addr_mod(dev, 2, &tuple->TupleData[2], 4); in pcmcia_get_mac_ce()
689 struct net_device *dev = link->priv; in xirc2ps_config()
696 local->dingo_ccr = NULL; in xirc2ps_config()
698 dev_dbg(&link->dev, "config\n"); in xirc2ps_config()
701 if (link->has_manf_id == 0) { in xirc2ps_config()
706 switch (link->manf_id) { in xirc2ps_config()
708 local->manf_str = "Xircom"; in xirc2ps_config()
711 local->manf_str = "Accton"; in xirc2ps_config()
715 local->manf_str = "Compaq"; in xirc2ps_config()
718 local->manf_str = "Intel"; in xirc2ps_config()
721 local->manf_str = "Toshiba"; in xirc2ps_config()
725 (unsigned)link->manf_id); in xirc2ps_config()
728 dev_dbg(&link->dev, "found %s card\n", local->manf_str); in xirc2ps_config()
738 /* not found: try to get the node-id from tuple 0x89 */ in xirc2ps_config()
746 err = -1; in xirc2ps_config()
755 pr_notice("node-id not found in CIS\n"); in xirc2ps_config()
759 if (local->modem) { in xirc2ps_config()
761 link->config_flags |= CONF_AUTO_SET_IO; in xirc2ps_config()
763 if (local->dingo) { in xirc2ps_config()
782 pr_notice("no ports available\n"); in xirc2ps_config()
784 link->io_lines = 10; in xirc2ps_config()
785 link->resource[0]->end = 16; in xirc2ps_config()
786 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config()
788 link->resource[0]->start = ioaddr; in xirc2ps_config()
792 link->resource[0]->start = 0; /* let CS decide */ in xirc2ps_config()
805 link->config_flags |= CONF_ENABLE_IRQ; in xirc2ps_config()
807 link->config_flags |= CONF_ENABLE_SPKR; in xirc2ps_config()
812 if (local->dingo) { in xirc2ps_config()
819 link->resource[1]->start & 0xff); in xirc2ps_config()
824 (link->resource[1]->start >> 8) & 0xff); in xirc2ps_config()
828 /* There is no config entry for the Ethernet part which in xirc2ps_config()
832 link->resource[2]->flags = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | in xirc2ps_config()
834 link->resource[2]->start = link->resource[2]->end = 0; in xirc2ps_config()
835 if ((err = pcmcia_request_window(link, link->resource[2], 0))) in xirc2ps_config()
838 local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; in xirc2ps_config()
839 if ((err = pcmcia_map_mem_page(link, link->resource[2], 0))) in xirc2ps_config()
842 /* Setup the CCRs; there are no infos in the CIS about the Ethernet in xirc2ps_config()
845 writeb(0x47, local->dingo_ccr + CISREG_COR); in xirc2ps_config()
846 ioaddr = link->resource[0]->start; in xirc2ps_config()
847 writeb(ioaddr & 0xff , local->dingo_ccr + CISREG_IOBASE_0); in xirc2ps_config()
848 writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1); in xirc2ps_config()
855 tmp = readb(local->dingo_ccr + i*2); in xirc2ps_config()
861 tmp = readb(local->dingo_ccr + 0x20 + i*2); in xirc2ps_config()
867 tmp = readb(local->dingo_ccr + 0x40 + i*2); in xirc2ps_config()
874 writeb(0x01, local->dingo_ccr + 0x20); in xirc2ps_config()
875 writeb(0x0c, local->dingo_ccr + 0x22); in xirc2ps_config()
876 writeb(0x00, local->dingo_ccr + 0x24); in xirc2ps_config()
877 writeb(0x00, local->dingo_ccr + 0x26); in xirc2ps_config()
878 writeb(0x00, local->dingo_ccr + 0x28); in xirc2ps_config()
882 local->probe_port=0; in xirc2ps_config()
884 local->probe_port = dev->if_port = 1; in xirc2ps_config()
886 (local->mohawk && if_port==4)) in xirc2ps_config()
887 dev->if_port = if_port; in xirc2ps_config()
892 dev->irq = link->irq; in xirc2ps_config()
893 dev->base_addr = link->resource[0]->start; in xirc2ps_config()
895 if (local->dingo) in xirc2ps_config()
898 SET_NETDEV_DEV(dev, &link->dev); in xirc2ps_config()
907 local->manf_str, (u_long)dev->base_addr, (int)dev->irq, in xirc2ps_config()
908 dev->dev_addr); in xirc2ps_config()
914 return -ENODEV; in xirc2ps_config()
917 return -ENODEV; in xirc2ps_config()
923 dev_dbg(&link->dev, "release\n"); in xirc2ps_release()
925 if (link->resource[2]->end) { in xirc2ps_release()
926 struct net_device *dev = link->priv; in xirc2ps_release()
928 if (local->dingo) in xirc2ps_release()
929 iounmap(local->dingo_ccr - 0x0800); in xirc2ps_release()
939 struct net_device *dev = link->priv; in xirc2ps_suspend()
941 if (link->open) { in xirc2ps_suspend()
951 struct net_device *dev = link->priv; in xirc2ps_resume()
953 if (link->open) { in xirc2ps_resume()
977 ulong start_ticks = jiffies; /* fixme: jiffies rollover every 497 days in xirc2ps_interrupt()
979 * -- on a laptop? in xirc2ps_interrupt()
985 ioaddr = dev->base_addr; in xirc2ps_interrupt()
986 if (lp->mohawk) { /* must disable the interrupt */ in xirc2ps_interrupt()
990 pr_debug("%s: interrupt %d at %#x.\n", dev->name, irq, ioaddr); in xirc2ps_interrupt()
993 /* Read the ISR to see whats the cause for the interrupt. in xirc2ps_interrupt()
1000 pr_debug("%s: interrupt %d for dead card\n", dev->name, irq); in xirc2ps_interrupt()
1014 dev->name, int_status, eth_status, rx_status, tx_status); in xirc2ps_interrupt()
1023 dev->stats.rx_dropped++; in xirc2ps_interrupt()
1024 pr_debug("%s: RX drop, too much done\n", dev->name); in xirc2ps_interrupt()
1036 dev->stats.rx_dropped++; in xirc2ps_interrupt()
1039 if (lp->silicon == 0 ) { /* work around a hardware bug */ in xirc2ps_interrupt()
1055 i--; in xirc2ps_interrupt()
1064 else if (lp->mohawk) { in xirc2ps_interrupt()
1076 unsigned int edpreg = ioaddr+XIRCREG_EDP-2; in xirc2ps_interrupt()
1090 skb->protocol = eth_type_trans(skb, dev); in xirc2ps_interrupt()
1092 dev->stats.rx_packets++; in xirc2ps_interrupt()
1093 dev->stats.rx_bytes += pktlen; in xirc2ps_interrupt()
1095 dev->stats.multicast++; in xirc2ps_interrupt()
1101 dev->stats.rx_frame_errors++; in xirc2ps_interrupt()
1102 pr_debug("%s: Packet too long\n", dev->name); in xirc2ps_interrupt()
1105 dev->stats.rx_crc_errors++; in xirc2ps_interrupt()
1106 pr_debug("%s: CRC error\n", dev->name); in xirc2ps_interrupt()
1109 dev->stats.rx_fifo_errors++; /* okay ? */ in xirc2ps_interrupt()
1110 pr_debug("%s: Alignment error\n", dev->name); in xirc2ps_interrupt()
1120 dev->stats.rx_over_errors++; in xirc2ps_interrupt()
1129 n = lp->last_ptr_value; in xirc2ps_interrupt()
1131 lp->last_ptr_value = nn; in xirc2ps_interrupt()
1132 if (nn < n) /* rollover */ in xirc2ps_interrupt()
1133 dev->stats.tx_packets += 256 - n; in xirc2ps_interrupt()
1134 else if (n == nn) { /* happens sometimes - don't know why */ in xirc2ps_interrupt()
1137 dev->stats.tx_packets += lp->last_ptr_value - n; in xirc2ps_interrupt()
1145 dev->stats.tx_aborted_errors++; in xirc2ps_interrupt()
1152 u_long duration = jiffies - start_ticks; in xirc2ps_interrupt()
1177 PutByte(XIRCREG_CR, EnableIntr); /* re-enable interrupts */ in xirc2ps_interrupt()
1192 struct net_device *dev = local->dev; in xirc2ps_tx_timeout_task()
1203 dev->stats.tx_errors++; in xirc_tx_timeout()
1205 schedule_work(&lp->tx_timeout_task); in xirc_tx_timeout()
1212 unsigned int ioaddr = dev->base_addr; in do_start_xmit()
1215 unsigned pktlen = skb->len; in do_start_xmit()
1241 /* TRS doesn't work - (indeed it is eliminated with sil-rev 1) */ in do_start_xmit()
1244 dev->name, freespace, okay ? " (okay)":" (not enough)"); in do_start_xmit()
1250 outsw(ioaddr+XIRCREG_EDP, skb->data, pktlen>>1); in do_start_xmit()
1252 PutByte(XIRCREG_EDP, skb->data[pktlen-1]); in do_start_xmit()
1254 if (lp->mohawk) in do_start_xmit()
1258 dev->stats.tx_bytes += pktlen; in do_start_xmit()
1272 unsigned int ioaddr = sa_info->ioaddr; in set_address()
1276 if (sa_info->reg_nr > 15) { in set_address()
1277 sa_info->reg_nr = 8; in set_address()
1278 sa_info->page_nr++; in set_address()
1279 SelectPage(sa_info->page_nr); in set_address()
1281 if (sa_info->mohawk) in set_address()
1282 PutByte(sa_info->reg_nr++, addr[5 - i]); in set_address()
1284 PutByte(sa_info->reg_nr++, addr[i]); in set_address()
1295 unsigned int ioaddr = dev->base_addr; in set_addresses()
1306 sa_info.page_nr = 0x50 - 1; in set_addresses()
1307 sa_info.mohawk = lp->mohawk; in set_addresses()
1310 set_address(&sa_info, dev->dev_addr); in set_addresses()
1315 set_address(&sa_info, ha->addr); in set_addresses()
1318 set_address(&sa_info, dev->dev_addr); in set_addresses()
1331 unsigned int ioaddr = dev->base_addr; in set_multicast_list()
1337 if (dev->flags & IFF_PROMISC) { /* snoop */ in set_multicast_list()
1339 } else if (netdev_mc_count(dev) > 9 || (dev->flags & IFF_ALLMULTI)) { in set_multicast_list()
1361 if (map->port != 255 && map->port != dev->if_port) { in do_config()
1362 if (map->port > 4) in do_config()
1363 return -EINVAL; in do_config()
1364 if (!map->port) { in do_config()
1365 local->probe_port = 1; in do_config()
1366 dev->if_port = 1; in do_config()
1368 local->probe_port = 0; in do_config()
1369 dev->if_port = map->port; in do_config()
1371 netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]); in do_config()
1372 do_reset(dev,1); /* not the fine way :-) */ in do_config()
1384 struct pcmcia_device *link = lp->p_dev; in do_open()
1386 dev_dbg(&link->dev, "do_open(%p)\n", dev); in do_open()
1391 return -ENODEV; in do_open()
1394 link->open++; in do_open()
1405 strscpy(info->driver, "xirc2ps_cs", sizeof(info->driver)); in netdev_get_drvinfo()
1406 snprintf(info->bus_info, sizeof(info->bus_info), "PCMCIA 0x%lx", in netdev_get_drvinfo()
1407 dev->base_addr); in netdev_get_drvinfo()
1418 unsigned int ioaddr = dev->base_addr; in do_ioctl()
1421 pr_debug("%s: ioctl(%-.6s, %#04x) %04x %04x %04x %04x\n", in do_ioctl()
1422 dev->name, rq->ifr_ifrn.ifrn_name, cmd, in do_ioctl()
1423 data->phy_id, data->reg_num, data->val_in, data->val_out); in do_ioctl()
1425 if (!local->mohawk) in do_ioctl()
1426 return -EOPNOTSUPP; in do_ioctl()
1430 data->phy_id = 0; /* we have only this address */ in do_ioctl()
1432 case SIOCGMIIREG: /* Read the specified MII register. */ in do_ioctl()
1433 data->val_out = mii_rd(ioaddr, data->phy_id & 0x1f, in do_ioctl()
1434 data->reg_num & 0x1f); in do_ioctl()
1437 mii_wr(ioaddr, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in, in do_ioctl()
1441 return -EOPNOTSUPP; in do_ioctl()
1450 unsigned int ioaddr = dev->base_addr; in hardreset()
1456 if (local->mohawk) in hardreset()
1467 unsigned int ioaddr = dev->base_addr; in do_reset()
1470 pr_debug("%s: do_reset(%p,%d)\n", dev->name, dev, full); in do_reset()
1477 if (local->mohawk) { in do_reset()
1489 local->last_ptr_value = 0; in do_reset()
1490 local->silicon = local->mohawk ? (GetByte(XIRCREG4_BOV) & 0x70) >> 4 in do_reset()
1493 if (local->probe_port) { in do_reset()
1494 if (!local->mohawk) { in do_reset()
1497 local->probe_port = 0; in do_reset()
1499 } else if (dev->if_port == 2) { /* enable 10Base2 */ in do_reset()
1511 value = GetByte(XIRCREG_ESR); /* read the ESR */ in do_reset()
1512 pr_debug("%s: ESR is: %#02x\n", dev->name, value); in do_reset()
1522 if (local->mohawk) in do_reset()
1526 pr_debug("%s: ECR is: %#02x\n", dev->name, value); in do_reset()
1531 if (local->silicon != 1) { in do_reset()
1560 if (full && local->mohawk && init_mii(dev)) { in do_reset()
1561 if (dev->if_port == 4 || local->dingo || local->new_mii) { in do_reset()
1569 if (dev->if_port == 2) /* enable 10Base2 */ in do_reset()
1577 } else { /* No MII */ in do_reset()
1579 value = GetByte(XIRCREG_ESR); /* read the ESR */ in do_reset()
1580 dev->if_port = (value & MediaSelect) ? 1 : 2; in do_reset()
1585 if (dev->if_port == 1 || dev->if_port == 4) /* TP: Link and Activity */ in do_reset()
1587 else /* Coax: Not-Collision and Activity */ in do_reset()
1590 if (local->dingo) in do_reset()
1606 if (local->modem && !local->dingo) { /* do some magic */ in do_reset()
1608 PutByte(0x10, 0x11); /* unmask master-int bit */ in do_reset()
1613 if_names[dev->if_port], local->silicon); in do_reset()
1615 * where regs with offset below 8 can't be read after an access in do_reset()
1621 * Initialize the Media-Independent-Interface
1628 unsigned int ioaddr = dev->base_addr; in init_mii()
1633 dev->if_port = if_port; in init_mii()
1634 local->probe_port = 0; in init_mii()
1640 return 0; /* No MII */ in init_mii()
1642 local->new_mii = (mii_rd(ioaddr, 0, 2) != 0xffff); in init_mii()
1644 if (local->probe_port) in init_mii()
1646 else if (dev->if_port == 4) in init_mii()
1647 control = 0x2000; /* no auto neg, 100mbs mode */ in init_mii()
1649 control = 0x0000; /* no auto neg, 10mbs mode */ in init_mii()
1656 local->probe_port = 0; in init_mii()
1660 if (local->probe_port) { in init_mii()
1674 if (!local->new_mii) { in init_mii()
1679 dev->if_port = (GetByte(XIRCREG_ESR) & MediaSelect) ? 1 : 2; in init_mii()
1685 dev->if_port = 4; in init_mii()
1687 dev->if_port = 1; in init_mii()
1698 unsigned int ioaddr = dev->base_addr; in do_powerdown()
1710 unsigned int ioaddr = dev->base_addr; in do_stop()
1712 struct pcmcia_device *link = lp->p_dev; in do_stop()
1714 dev_dbg(&link->dev, "do_stop(%p)\n", dev); in do_stop()
1717 return -ENODEV; in do_stop()
1729 link->open--; in do_stop()
1744 PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
1745 PCMCIA_DEVICE_PROD_ID13("Xircom", "PS-CE2-10", 0x2e3ee845, 0x947d9073),
1746 PCMCIA_DEVICE_PROD_ID13("Xircom", "R2E-100BTX", 0x2e3ee845, 0x2464a6e3),
1747 PCMCIA_DEVICE_PROD_ID13("Xircom", "RE-10", 0x2e3ee845, 0x3e08d609),
1753 /* also matches CFE-10 cards! */
1776 int ints[10] = { -1 }; in setup_xirc2ps_cs()
1780 #define MAYBE_SET(X,Y) if (ints[0] >= Y && ints[Y] != -1) { X = ints[Y]; } in setup_xirc2ps_cs()