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()
676 if (tuple->TupleDataLen != 13) in pcmcia_get_mac_ce()
677 return -EINVAL; in pcmcia_get_mac_ce()
678 if ((tuple->TupleData[0] != 2) || (tuple->TupleData[1] != 1) || in pcmcia_get_mac_ce()
679 (tuple->TupleData[2] != 6)) in pcmcia_get_mac_ce()
680 return -EINVAL; in pcmcia_get_mac_ce()
683 dev->dev_addr[i] = tuple->TupleData[i+2]; in pcmcia_get_mac_ce()
691 struct net_device *dev = link->priv; in xirc2ps_config()
698 local->dingo_ccr = NULL; in xirc2ps_config()
700 dev_dbg(&link->dev, "config\n"); in xirc2ps_config()
703 if (link->has_manf_id == 0) { in xirc2ps_config()
708 switch (link->manf_id) { in xirc2ps_config()
710 local->manf_str = "Xircom"; in xirc2ps_config()
713 local->manf_str = "Accton"; in xirc2ps_config()
717 local->manf_str = "Compaq"; in xirc2ps_config()
720 local->manf_str = "Intel"; in xirc2ps_config()
723 local->manf_str = "Toshiba"; in xirc2ps_config()
727 (unsigned)link->manf_id); in xirc2ps_config()
730 dev_dbg(&link->dev, "found %s card\n", local->manf_str); in xirc2ps_config()
740 /* not found: try to get the node-id from tuple 0x89 */ in xirc2ps_config()
748 dev->dev_addr[i] = buf[i+2]; in xirc2ps_config()
750 err = -1; in xirc2ps_config()
759 pr_notice("node-id not found in CIS\n"); in xirc2ps_config()
763 if (local->modem) { in xirc2ps_config()
765 link->config_flags |= CONF_AUTO_SET_IO; in xirc2ps_config()
767 if (local->dingo) { in xirc2ps_config()
786 pr_notice("no ports available\n"); in xirc2ps_config()
788 link->io_lines = 10; in xirc2ps_config()
789 link->resource[0]->end = 16; in xirc2ps_config()
790 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in xirc2ps_config()
792 link->resource[0]->start = ioaddr; in xirc2ps_config()
796 link->resource[0]->start = 0; /* let CS decide */ in xirc2ps_config()
811 link->config_flags |= CONF_ENABLE_IRQ; in xirc2ps_config()
813 link->config_flags |= CONF_ENABLE_SPKR; in xirc2ps_config()
818 if (local->dingo) { in xirc2ps_config()
825 link->resource[1]->start & 0xff); in xirc2ps_config()
830 (link->resource[1]->start >> 8) & 0xff); in xirc2ps_config()
834 /* There is no config entry for the Ethernet part which in xirc2ps_config()
838 link->resource[2]->flags = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | in xirc2ps_config()
840 link->resource[2]->start = link->resource[2]->end = 0; in xirc2ps_config()
841 if ((err = pcmcia_request_window(link, link->resource[2], 0))) in xirc2ps_config()
844 local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; in xirc2ps_config()
845 if ((err = pcmcia_map_mem_page(link, link->resource[2], 0))) in xirc2ps_config()
848 /* Setup the CCRs; there are no infos in the CIS about the Ethernet in xirc2ps_config()
851 writeb(0x47, local->dingo_ccr + CISREG_COR); in xirc2ps_config()
852 ioaddr = link->resource[0]->start; in xirc2ps_config()
853 writeb(ioaddr & 0xff , local->dingo_ccr + CISREG_IOBASE_0); in xirc2ps_config()
854 writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1); in xirc2ps_config()
861 tmp = readb(local->dingo_ccr + i*2); in xirc2ps_config()
867 tmp = readb(local->dingo_ccr + 0x20 + i*2); in xirc2ps_config()
873 tmp = readb(local->dingo_ccr + 0x40 + i*2); in xirc2ps_config()
880 writeb(0x01, local->dingo_ccr + 0x20); in xirc2ps_config()
881 writeb(0x0c, local->dingo_ccr + 0x22); in xirc2ps_config()
882 writeb(0x00, local->dingo_ccr + 0x24); in xirc2ps_config()
883 writeb(0x00, local->dingo_ccr + 0x26); in xirc2ps_config()
884 writeb(0x00, local->dingo_ccr + 0x28); in xirc2ps_config()
888 local->probe_port=0; in xirc2ps_config()
890 local->probe_port = dev->if_port = 1; in xirc2ps_config()
892 (local->mohawk && if_port==4)) in xirc2ps_config()
893 dev->if_port = if_port; in xirc2ps_config()
898 dev->irq = link->irq; in xirc2ps_config()
899 dev->base_addr = link->resource[0]->start; in xirc2ps_config()
901 if (local->dingo) in xirc2ps_config()
904 SET_NETDEV_DEV(dev, &link->dev); in xirc2ps_config()
913 local->manf_str, (u_long)dev->base_addr, (int)dev->irq, in xirc2ps_config()
914 dev->dev_addr); in xirc2ps_config()
920 return -ENODEV; in xirc2ps_config()
923 return -ENODEV; in xirc2ps_config()
929 dev_dbg(&link->dev, "release\n"); in xirc2ps_release()
931 if (link->resource[2]->end) { in xirc2ps_release()
932 struct net_device *dev = link->priv; in xirc2ps_release()
934 if (local->dingo) in xirc2ps_release()
935 iounmap(local->dingo_ccr - 0x0800); in xirc2ps_release()
945 struct net_device *dev = link->priv; in xirc2ps_suspend()
947 if (link->open) { in xirc2ps_suspend()
957 struct net_device *dev = link->priv; in xirc2ps_resume()
959 if (link->open) { in xirc2ps_resume()
983 ulong start_ticks = jiffies; /* fixme: jiffies rollover every 497 days in xirc2ps_interrupt()
985 * -- on a laptop? in xirc2ps_interrupt()
991 ioaddr = dev->base_addr; in xirc2ps_interrupt()
992 if (lp->mohawk) { /* must disable the interrupt */ in xirc2ps_interrupt()
996 pr_debug("%s: interrupt %d at %#x.\n", dev->name, irq, ioaddr); in xirc2ps_interrupt()
999 /* Read the ISR to see whats the cause for the interrupt. in xirc2ps_interrupt()
1006 pr_debug("%s: interrupt %d for dead card\n", dev->name, irq); in xirc2ps_interrupt()
1020 dev->name, int_status, eth_status, rx_status, tx_status); in xirc2ps_interrupt()
1029 dev->stats.rx_dropped++; in xirc2ps_interrupt()
1030 pr_debug("%s: RX drop, too much done\n", dev->name); in xirc2ps_interrupt()
1042 dev->stats.rx_dropped++; in xirc2ps_interrupt()
1045 if (lp->silicon == 0 ) { /* work around a hardware bug */ in xirc2ps_interrupt()
1061 i--; in xirc2ps_interrupt()
1070 else if (lp->mohawk) { in xirc2ps_interrupt()
1082 unsigned int edpreg = ioaddr+XIRCREG_EDP-2; in xirc2ps_interrupt()
1096 skb->protocol = eth_type_trans(skb, dev); in xirc2ps_interrupt()
1098 dev->stats.rx_packets++; in xirc2ps_interrupt()
1099 dev->stats.rx_bytes += pktlen; in xirc2ps_interrupt()
1101 dev->stats.multicast++; in xirc2ps_interrupt()
1107 dev->stats.rx_frame_errors++; in xirc2ps_interrupt()
1108 pr_debug("%s: Packet too long\n", dev->name); in xirc2ps_interrupt()
1111 dev->stats.rx_crc_errors++; in xirc2ps_interrupt()
1112 pr_debug("%s: CRC error\n", dev->name); in xirc2ps_interrupt()
1115 dev->stats.rx_fifo_errors++; /* okay ? */ in xirc2ps_interrupt()
1116 pr_debug("%s: Alignment error\n", dev->name); in xirc2ps_interrupt()
1126 dev->stats.rx_over_errors++; in xirc2ps_interrupt()
1135 n = lp->last_ptr_value; in xirc2ps_interrupt()
1137 lp->last_ptr_value = nn; in xirc2ps_interrupt()
1138 if (nn < n) /* rollover */ in xirc2ps_interrupt()
1139 dev->stats.tx_packets += 256 - n; in xirc2ps_interrupt()
1140 else if (n == nn) { /* happens sometimes - don't know why */ in xirc2ps_interrupt()
1143 dev->stats.tx_packets += lp->last_ptr_value - n; in xirc2ps_interrupt()
1151 dev->stats.tx_aborted_errors++; in xirc2ps_interrupt()
1158 u_long duration = jiffies - start_ticks; in xirc2ps_interrupt()
1183 PutByte(XIRCREG_CR, EnableIntr); /* re-enable interrupts */ in xirc2ps_interrupt()
1198 struct net_device *dev = local->dev; in xirc2ps_tx_timeout_task()
1209 dev->stats.tx_errors++; in xirc_tx_timeout()
1211 schedule_work(&lp->tx_timeout_task); in xirc_tx_timeout()
1218 unsigned int ioaddr = dev->base_addr; in do_start_xmit()
1221 unsigned pktlen = skb->len; in do_start_xmit()
1247 /* TRS doesn't work - (indeed it is eliminated with sil-rev 1) */ in do_start_xmit()
1250 dev->name, freespace, okay ? " (okay)":" (not enough)"); in do_start_xmit()
1256 outsw(ioaddr+XIRCREG_EDP, skb->data, pktlen>>1); in do_start_xmit()
1258 PutByte(XIRCREG_EDP, skb->data[pktlen-1]); in do_start_xmit()
1260 if (lp->mohawk) in do_start_xmit()
1264 dev->stats.tx_bytes += pktlen; in do_start_xmit()
1278 unsigned int ioaddr = sa_info->ioaddr; in set_address()
1282 if (sa_info->reg_nr > 15) { in set_address()
1283 sa_info->reg_nr = 8; in set_address()
1284 sa_info->page_nr++; in set_address()
1285 SelectPage(sa_info->page_nr); in set_address()
1287 if (sa_info->mohawk) in set_address()
1288 PutByte(sa_info->reg_nr++, addr[5 - i]); in set_address()
1290 PutByte(sa_info->reg_nr++, addr[i]); in set_address()
1301 unsigned int ioaddr = dev->base_addr; in set_addresses()
1312 sa_info.page_nr = 0x50 - 1; in set_addresses()
1313 sa_info.mohawk = lp->mohawk; in set_addresses()
1316 set_address(&sa_info, dev->dev_addr); in set_addresses()
1321 set_address(&sa_info, ha->addr); in set_addresses()
1324 set_address(&sa_info, dev->dev_addr); in set_addresses()
1337 unsigned int ioaddr = dev->base_addr; in set_multicast_list()
1343 if (dev->flags & IFF_PROMISC) { /* snoop */ in set_multicast_list()
1345 } else if (netdev_mc_count(dev) > 9 || (dev->flags & IFF_ALLMULTI)) { in set_multicast_list()
1367 if (map->port != 255 && map->port != dev->if_port) { in do_config()
1368 if (map->port > 4) in do_config()
1369 return -EINVAL; in do_config()
1370 if (!map->port) { in do_config()
1371 local->probe_port = 1; in do_config()
1372 dev->if_port = 1; in do_config()
1374 local->probe_port = 0; in do_config()
1375 dev->if_port = map->port; in do_config()
1377 netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]); in do_config()
1378 do_reset(dev,1); /* not the fine way :-) */ in do_config()
1390 struct pcmcia_device *link = lp->p_dev; in do_open()
1392 dev_dbg(&link->dev, "do_open(%p)\n", dev); in do_open()
1397 return -ENODEV; in do_open()
1400 link->open++; in do_open()
1411 strlcpy(info->driver, "xirc2ps_cs", sizeof(info->driver)); in netdev_get_drvinfo()
1412 snprintf(info->bus_info, sizeof(info->bus_info), "PCMCIA 0x%lx", in netdev_get_drvinfo()
1413 dev->base_addr); in netdev_get_drvinfo()
1424 unsigned int ioaddr = dev->base_addr; in do_ioctl()
1427 pr_debug("%s: ioctl(%-.6s, %#04x) %04x %04x %04x %04x\n", in do_ioctl()
1428 dev->name, rq->ifr_ifrn.ifrn_name, cmd, in do_ioctl()
1429 data->phy_id, data->reg_num, data->val_in, data->val_out); in do_ioctl()
1431 if (!local->mohawk) in do_ioctl()
1432 return -EOPNOTSUPP; in do_ioctl()
1436 data->phy_id = 0; /* we have only this address */ in do_ioctl()
1438 case SIOCGMIIREG: /* Read the specified MII register. */ in do_ioctl()
1439 data->val_out = mii_rd(ioaddr, data->phy_id & 0x1f, in do_ioctl()
1440 data->reg_num & 0x1f); in do_ioctl()
1443 mii_wr(ioaddr, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in, in do_ioctl()
1447 return -EOPNOTSUPP; in do_ioctl()
1456 unsigned int ioaddr = dev->base_addr; in hardreset()
1462 if (local->mohawk) in hardreset()
1473 unsigned int ioaddr = dev->base_addr; in do_reset()
1476 pr_debug("%s: do_reset(%p,%d)\n", dev->name, dev, full); in do_reset()
1483 if (local->mohawk) { in do_reset()
1495 local->last_ptr_value = 0; in do_reset()
1496 local->silicon = local->mohawk ? (GetByte(XIRCREG4_BOV) & 0x70) >> 4 in do_reset()
1499 if (local->probe_port) { in do_reset()
1500 if (!local->mohawk) { in do_reset()
1503 local->probe_port = 0; in do_reset()
1505 } else if (dev->if_port == 2) { /* enable 10Base2 */ in do_reset()
1517 value = GetByte(XIRCREG_ESR); /* read the ESR */ in do_reset()
1518 pr_debug("%s: ESR is: %#02x\n", dev->name, value); in do_reset()
1528 if (local->mohawk) in do_reset()
1532 pr_debug("%s: ECR is: %#02x\n", dev->name, value); in do_reset()
1537 if (local->silicon != 1) { in do_reset()
1566 if (full && local->mohawk && init_mii(dev)) { in do_reset()
1567 if (dev->if_port == 4 || local->dingo || local->new_mii) { in do_reset()
1575 if (dev->if_port == 2) /* enable 10Base2 */ in do_reset()
1583 } else { /* No MII */ in do_reset()
1585 value = GetByte(XIRCREG_ESR); /* read the ESR */ in do_reset()
1586 dev->if_port = (value & MediaSelect) ? 1 : 2; in do_reset()
1591 if (dev->if_port == 1 || dev->if_port == 4) /* TP: Link and Activity */ in do_reset()
1593 else /* Coax: Not-Collision and Activity */ in do_reset()
1596 if (local->dingo) in do_reset()
1612 if (local->modem && !local->dingo) { /* do some magic */ in do_reset()
1614 PutByte(0x10, 0x11); /* unmask master-int bit */ in do_reset()
1619 if_names[dev->if_port], local->silicon); in do_reset()
1621 * where regs with offset below 8 can't be read after an access in do_reset()
1627 * Initialize the Media-Independent-Interface
1634 unsigned int ioaddr = dev->base_addr; in init_mii()
1639 dev->if_port = if_port; in init_mii()
1640 local->probe_port = 0; in init_mii()
1646 return 0; /* No MII */ in init_mii()
1648 local->new_mii = (mii_rd(ioaddr, 0, 2) != 0xffff); in init_mii()
1650 if (local->probe_port) in init_mii()
1652 else if (dev->if_port == 4) in init_mii()
1653 control = 0x2000; /* no auto neg, 100mbs mode */ in init_mii()
1655 control = 0x0000; /* no auto neg, 10mbs mode */ in init_mii()
1662 local->probe_port = 0; in init_mii()
1666 if (local->probe_port) { in init_mii()
1680 if (!local->new_mii) { in init_mii()
1685 dev->if_port = (GetByte(XIRCREG_ESR) & MediaSelect) ? 1 : 2; in init_mii()
1691 dev->if_port = 4; in init_mii()
1693 dev->if_port = 1; in init_mii()
1704 unsigned int ioaddr = dev->base_addr; in do_powerdown()
1716 unsigned int ioaddr = dev->base_addr; in do_stop()
1718 struct pcmcia_device *link = lp->p_dev; in do_stop()
1720 dev_dbg(&link->dev, "do_stop(%p)\n", dev); in do_stop()
1723 return -ENODEV; in do_stop()
1735 link->open--; in do_stop()
1750 PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
1751 PCMCIA_DEVICE_PROD_ID13("Xircom", "PS-CE2-10", 0x2e3ee845, 0x947d9073),
1752 PCMCIA_DEVICE_PROD_ID13("Xircom", "R2E-100BTX", 0x2e3ee845, 0x2464a6e3),
1753 PCMCIA_DEVICE_PROD_ID13("Xircom", "RE-10", 0x2e3ee845, 0x3e08d609),
1759 /* also matches CFE-10 cards! */
1782 int ints[10] = { -1 }; in setup_xirc2ps_cs()
1786 #define MAYBE_SET(X,Y) if (ints[0] >= Y && ints[Y] != -1) { X = ints[Y]; } in setup_xirc2ps_cs()