|
|
1.1 ! root 1: /* sis900.c: A SiS 900/7016 PCI Fast Ethernet driver for Linux. ! 2: Copyright 1999 Silicon Integrated System Corporation ! 3: Revision: 1.06.11 Apr. 30 2002 ! 4: ! 5: Modified from the driver which is originally written by Donald Becker. ! 6: ! 7: This software may be used and distributed according to the terms ! 8: of the GNU Public License (GPL), incorporated herein by reference. ! 9: Drivers based on this skeleton fall under the GPL and must retain ! 10: the authorship (implicit copyright) notice. ! 11: ! 12: References: ! 13: SiS 7016 Fast Ethernet PCI Bus 10/100 Mbps LAN Controller with OnNow Support, ! 14: preliminary Rev. 1.0 Jan. 14, 1998 ! 15: SiS 900 Fast Ethernet PCI Bus 10/100 Mbps LAN Single Chip with OnNow Support, ! 16: preliminary Rev. 1.0 Nov. 10, 1998 ! 17: SiS 7014 Single Chip 100BASE-TX/10BASE-T Physical Layer Solution, ! 18: preliminary Rev. 1.0 Jan. 18, 1998 ! 19: http://www.sis.com.tw/support/databook.htm ! 20: ! 21: Rev 1.06.11 Apr. 25 2002 Mufasa Yang ([email protected]) added SiS962 support ! 22: Rev 1.06.10 Dec. 18 2001 Hui-Fen Hsu workaround for EDB & RTL8201 PHY ! 23: Rev 1.06.09 Sep. 28 2001 Hui-Fen Hsu update for 630ET & workaround for ICS1893 PHY ! 24: Rev 1.06.08 Mar. 2 2001 Hui-Fen Hsu ([email protected]) some bug fix & 635M/B support ! 25: Rev 1.06.07 Jan. 8 2001 Lei-Chun Chang added RTL8201 PHY support ! 26: Rev 1.06.06 Sep. 6 2000 Lei-Chun Chang added ICS1893 PHY support ! 27: Rev 1.06.05 Aug. 22 2000 Lei-Chun Chang ([email protected]) modified 630E equalier workaroung rule ! 28: Rev 1.06.03 Dec. 23 1999 Ollie Lho Third release ! 29: Rev 1.06.02 Nov. 23 1999 Ollie Lho bug in mac probing fixed ! 30: Rev 1.06.01 Nov. 16 1999 Ollie Lho CRC calculation provide by Joseph Zbiciak ([email protected]) ! 31: Rev 1.06 Nov. 4 1999 Ollie Lho ([email protected]) Second release ! 32: Rev 1.05.05 Oct. 29 1999 Ollie Lho ([email protected]) Single buffer Tx/Rx ! 33: Chin-Shan Li ([email protected]) Added AMD Am79c901 HomePNA PHY support ! 34: Rev 1.05 Aug. 7 1999 Jim Huang ([email protected]) Initial release ! 35: */ ! 36: ! 37: #include <linux/module.h> ! 38: #include <linux/version.h> ! 39: #include <linux/kernel.h> ! 40: #include <linux/sched.h> ! 41: #include <linux/string.h> ! 42: #include <linux/timer.h> ! 43: #include <linux/errno.h> ! 44: #include <linux/ioport.h> ! 45: #include <linux/malloc.h> ! 46: #include <linux/interrupt.h> ! 47: #include <linux/pci.h> ! 48: #include <linux/netdevice.h> ! 49: #include <linux/bios32.h> ! 50: #include <linux/compatmac.h> ! 51: ! 52: #include <linux/etherdevice.h> ! 53: #include <linux/skbuff.h> ! 54: #include <asm/processor.h> /* Processor type for cache alignment. */ ! 55: #include <asm/bitops.h> ! 56: #include <asm/io.h> ! 57: #include <linux/delay.h> ! 58: #include <asm/types.h> ! 59: #include "sis900.h" ! 60: ! 61: ! 62: #if LINUX_VERSION_CODE < 0x20159 ! 63: #define dev_free_skb(skb) dev_kfree_skb (skb, FREE_WRITE); ! 64: #else /* Grrr, incompatible changes should change the name. */ ! 65: #define dev_free_skb(skb) dev_kfree_skb(skb); ! 66: #endif ! 67: ! 68: static const char *version = ! 69: "sis900.c: modified v1.06.11 4/30/2002"; ! 70: ! 71: static int max_interrupt_work = 20; ! 72: static int multicast_filter_limit = 128; ! 73: ! 74: #define sis900_debug debug ! 75: static int sis900_debug = 0; ! 76: ! 77: /* Time in jiffies before concluding the transmitter is hung. */ ! 78: #define TX_TIMEOUT (4*HZ) ! 79: ! 80: enum pci_flags_bit { ! 81: PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, ! 82: PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, ! 83: }; ! 84: ! 85: struct mac_chip_info { ! 86: const char *name; ! 87: u16 vendor_id, device_id, flags; ! 88: int io_size; ! 89: struct device *(*probe) (struct mac_chip_info *mac, long ioaddr, int irq, ! 90: int pci_index, unsigned char pci_device_fn, unsigned char pci_bus, struct device * net_dev); ! 91: }; ! 92: static struct device * sis900_mac_probe (struct mac_chip_info * mac, long ioaddr, int irq, ! 93: int pci_index, unsigned char pci_device_fn, ! 94: unsigned char pci_bus, struct device * net_dev); ! 95: static struct mac_chip_info mac_chip_table[] = { ! 96: { "SiS 900 PCI Fast Ethernet", PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_900, ! 97: PCI_COMMAND_IO|PCI_COMMAND_MASTER, SIS900_TOTAL_SIZE, sis900_mac_probe}, ! 98: { "SiS 7016 PCI Fast Ethernet",PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7016, ! 99: PCI_COMMAND_IO|PCI_COMMAND_MASTER, SIS900_TOTAL_SIZE, sis900_mac_probe}, ! 100: {0,}, /* 0 terminatted list. */ ! 101: }; ! 102: ! 103: static void sis900_read_mode(struct device *net_dev, int *speed, int *duplex); ! 104: ! 105: static struct mii_chip_info { ! 106: const char * name; ! 107: u16 phy_id0; ! 108: u16 phy_id1; ! 109: u8 phy_types; ! 110: #define HOME 0x0001 ! 111: #define LAN 0x0002 ! 112: #define MIX 0x0003 ! 113: } mii_chip_table[] = { ! 114: { "SiS 900 Internal MII PHY", 0x001d, 0x8000, LAN }, ! 115: { "SiS 7014 Physical Layer Solution", 0x0016, 0xf830, LAN }, ! 116: { "AMD 79C901 10BASE-T PHY", 0x0000, 0x6B70, LAN }, ! 117: { "AMD 79C901 HomePNA PHY", 0x0000, 0x6B90, HOME}, ! 118: { "ICS LAN PHY", 0x0015, 0xF440, LAN }, ! 119: { "NS 83851 PHY", 0x2000, 0x5C20, MIX }, ! 120: { "Realtek RTL8201 PHY", 0x0000, 0x8200, LAN }, ! 121: {0,}, ! 122: }; ! 123: ! 124: struct mii_phy { ! 125: struct mii_phy * next; ! 126: int phy_addr; ! 127: u16 phy_id0; ! 128: u16 phy_id1; ! 129: u16 status; ! 130: u8 phy_types; ! 131: }; ! 132: ! 133: typedef struct _BufferDesc { ! 134: u32 link; ! 135: u32 cmdsts; ! 136: u32 bufptr; ! 137: } BufferDesc; ! 138: ! 139: struct sis900_private { ! 140: struct device *next_module; ! 141: struct enet_statistics stats; ! 142: ! 143: /* struct pci_dev * pci_dev;*/ ! 144: unsigned char pci_bus; ! 145: unsigned char pci_device_fn; ! 146: int pci_index; ! 147: ! 148: struct mac_chip_info * mac; ! 149: struct mii_phy * mii; ! 150: struct mii_phy * first_mii; /* record the first mii structure */ ! 151: unsigned int cur_phy; ! 152: ! 153: struct timer_list timer; /* Link status detection timer. */ ! 154: u8 autong_complete; /* 1: auto-negotiate complete */ ! 155: ! 156: unsigned int cur_rx, dirty_rx; /* producer/comsumer pointers for Tx/Rx ring */ ! 157: unsigned int cur_tx, dirty_tx; ! 158: ! 159: /* The saved address of a sent/receive-in-place packet buffer */ ! 160: struct sk_buff *tx_skbuff[NUM_TX_DESC]; ! 161: struct sk_buff *rx_skbuff[NUM_RX_DESC]; ! 162: BufferDesc tx_ring[NUM_TX_DESC]; ! 163: BufferDesc rx_ring[NUM_RX_DESC]; ! 164: ! 165: unsigned int tx_full; /* The Tx queue is full. */ ! 166: int LinkOn; ! 167: }; ! 168: ! 169: #ifdef MODULE ! 170: #if LINUX_VERSION_CODE > 0x20115 ! 171: MODULE_AUTHOR("Jim Huang <[email protected]>, Ollie Lho <[email protected]>"); ! 172: MODULE_DESCRIPTION("SiS 900 PCI Fast Ethernet driver"); ! 173: MODULE_PARM(multicast_filter_limit, "i"); ! 174: MODULE_PARM(max_interrupt_work, "i"); ! 175: MODULE_PARM(debug, "i"); ! 176: #endif ! 177: #endif ! 178: ! 179: static int sis900_open(struct device *net_dev); ! 180: static int sis900_mii_probe (unsigned char pci_bus, unsigned char pci_device_fn, struct device * net_dev); ! 181: static void sis900_init_rxfilter (struct device * net_dev); ! 182: static u16 read_eeprom(long ioaddr, int location); ! 183: static u16 mdio_read(struct device *net_dev, int phy_id, int location); ! 184: static void mdio_write(struct device *net_dev, int phy_id, int location, int val); ! 185: static void sis900_timer(unsigned long data); ! 186: static void sis900_check_mode (struct device *net_dev, struct mii_phy *mii_phy); ! 187: static void sis900_tx_timeout(struct device *net_dev); ! 188: static void sis900_init_tx_ring(struct device *net_dev); ! 189: static void sis900_init_rx_ring(struct device *net_dev); ! 190: static int sis900_start_xmit(struct sk_buff *skb, struct device *net_dev); ! 191: static int sis900_rx(struct device *net_dev); ! 192: static void sis900_finish_xmit (struct device *net_dev); ! 193: static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs); ! 194: static int sis900_close(struct device *net_dev); ! 195: static int mii_ioctl(struct device *net_dev, struct ifreq *rq, int cmd); ! 196: static struct enet_statistics *sis900_get_stats(struct device *net_dev); ! 197: static u16 sis900_compute_hashtable_index(u8 *addr, u8 revision); ! 198: static void set_rx_mode(struct device *net_dev); ! 199: static void sis900_reset(struct device *net_dev); ! 200: static void sis630_set_eq(struct device *net_dev, u8 revision); ! 201: static u16 sis900_default_phy(struct device * net_dev); ! 202: static void sis900_set_capability( struct device *net_dev ,struct mii_phy *phy); ! 203: static u16 sis900_reset_phy(struct device *net_dev, int phy_addr); ! 204: static void sis900_auto_negotiate(struct device *net_dev, int phy_addr); ! 205: static void sis900_set_mode (long ioaddr, int speed, int duplex); ! 206: ! 207: /* A list of all installed SiS900 devices, for removing the driver module. */ ! 208: static struct device *root_sis900_dev = NULL; ! 209: ! 210: #ifdef HAVE_DEVLIST ! 211: struct netdev_entry netcard_drv = ! 212: {"sis900", sis900_probe, SIS900_TOTAL_SIZE, NULL}; ! 213: #endif ! 214: ! 215: /* walk through every ethernet PCI devices to see if some of them are matched with our card list*/ ! 216: int sis900_probe (struct device * net_dev) ! 217: { ! 218: int found = 0; ! 219: int pci_index = 0; ! 220: unsigned char pci_bus, pci_device_fn; ! 221: long ioaddr; ! 222: int irq; ! 223: ! 224: if (!pcibios_present()) ! 225: return -ENODEV; ! 226: ! 227: for (; pci_index < 0xff; pci_index++) ! 228: { ! 229: u16 vendor, device, pci_command; ! 230: struct mac_chip_info *mac; ! 231: ! 232: if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pci_index, ! 233: &pci_bus, &pci_device_fn) != PCIBIOS_SUCCESSFUL) ! 234: break; ! 235: ! 236: pcibios_read_config_word(pci_bus, pci_device_fn, PCI_VENDOR_ID, &vendor); ! 237: pcibios_read_config_word(pci_bus, pci_device_fn, PCI_DEVICE_ID, &device); ! 238: ! 239: for (mac = mac_chip_table; mac->vendor_id; mac++) ! 240: { ! 241: if (vendor == mac->vendor_id && device == mac->device_id) break; ! 242: } ! 243: ! 244: /* pci_dev does not match any of our cards */ ! 245: if (mac->vendor_id == 0) ! 246: continue; ! 247: ! 248: { ! 249: u32 pci_ioaddr; ! 250: u8 pci_irq_line; ! 251: ! 252: pcibios_read_config_byte(pci_bus, pci_device_fn, ! 253: PCI_INTERRUPT_LINE, &pci_irq_line); ! 254: pcibios_read_config_dword(pci_bus, pci_device_fn, ! 255: PCI_BASE_ADDRESS_0, &pci_ioaddr); ! 256: ioaddr = pci_ioaddr & ~3; ! 257: irq = pci_irq_line; ! 258: ! 259: if ((mac->flags & PCI_USES_IO) && ! 260: check_region (pci_ioaddr, mac->io_size)) ! 261: continue; ! 262: ! 263: pcibios_read_config_word(pci_bus, pci_device_fn, ! 264: PCI_COMMAND, &pci_command); ! 265: ! 266: { ! 267: u8 lat; ! 268: ! 269: pcibios_read_config_byte(pci_bus, pci_device_fn, PCI_LATENCY_TIMER, &lat); ! 270: if (lat < 16) { ! 271: printk("PCI: Increasing latency timer of device %02x:%02x to 64\n", ! 272: pci_bus, pci_device_fn); ! 273: pcibios_write_config_byte(pci_bus, pci_device_fn, PCI_LATENCY_TIMER, 64); ! 274: } ! 275: } ! 276: net_dev = mac->probe (mac, ioaddr, irq, pci_index, pci_device_fn, pci_bus, net_dev); ! 277: if (net_dev != NULL) ! 278: { ! 279: found++; ! 280: } ! 281: net_dev = NULL; ! 282: } ! 283: } ! 284: return found ? 0 : -ENODEV; ! 285: ! 286: } ! 287: ! 288: /* older SiS900 and friends, use EEPROM to store MAC address */ ! 289: static int ! 290: sis900_get_mac_addr(long ioaddr, struct device *net_dev) ! 291: { ! 292: u16 signature; ! 293: int i; ! 294: ! 295: /* check to see if we have sane EEPROM */ ! 296: signature = (u16) read_eeprom(ioaddr, EEPROMSignature); ! 297: if (signature == 0xffff || signature == 0x0000) { ! 298: printk (KERN_INFO "%s: Error EERPOM read %x\n", ! 299: net_dev->name, signature); ! 300: return 0; ! 301: } ! 302: ! 303: /* get MAC address from EEPROM */ ! 304: for (i = 0; i < 3; i++) ! 305: ((u16 *)(net_dev->dev_addr))[i] = read_eeprom(ioaddr, i+EEPROMMACAddr); ! 306: return 1; ! 307: } ! 308: ! 309: /* SiS630E model, use APC CMOS RAM to store MAC address */ ! 310: static int sis630e_get_mac_addr(long ioaddr, int pci_index, struct device *net_dev) ! 311: { ! 312: u8 reg; ! 313: int i; ! 314: u8 pci_bus, pci_dfn; ! 315: int not_found; ! 316: ! 317: not_found = pcibios_find_device(0x1039, 0x0008, ! 318: pci_index, ! 319: &pci_bus, ! 320: &pci_dfn); ! 321: if (not_found) { ! 322: printk("%s: Can not find ISA bridge\n", net_dev->name); ! 323: return 0; ! 324: } ! 325: pcibios_read_config_byte(pci_bus, pci_dfn, 0x48, ®); ! 326: pcibios_write_config_byte(pci_bus, pci_dfn, 0x48, reg | 0x40); ! 327: ! 328: for (i = 0; i < 6; i++) { ! 329: outb(0x09 + i, 0x70); ! 330: ((u8 *)(net_dev->dev_addr))[i] = inb(0x71); ! 331: } ! 332: pcibios_write_config_byte(pci_bus, pci_dfn, 0x48, reg & ~0x40); ! 333: ! 334: return 1; ! 335: } ! 336: ! 337: /* 635 model : set Mac reload bit and get mac address from rfdr */ ! 338: static int sis635_get_mac_addr(struct device *net_dev) ! 339: { ! 340: long ioaddr = net_dev->base_addr; ! 341: u32 rfcrSave; ! 342: u32 i; ! 343: ! 344: rfcrSave = inl(rfcr + ioaddr); ! 345: ! 346: outl(rfcrSave | RELOAD, ioaddr + cr); ! 347: outl(0, ioaddr + cr); ! 348: ! 349: /* disable packet filtering before setting filter */ ! 350: outl(rfcrSave & ~RFEN, rfcr + ioaddr); ! 351: ! 352: /* load MAC addr to filter data register */ ! 353: for (i = 0 ; i < 3 ; i++) { ! 354: outl((i << RFADDR_shift), ioaddr + rfcr); ! 355: *( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr); ! 356: } ! 357: ! 358: /* enable packet filitering */ ! 359: outl(rfcrSave | RFEN, rfcr + ioaddr); ! 360: ! 361: return 1; ! 362: } ! 363: ! 364: ! 365: /** ! 366: * sis962_get_mac_addr: - Get MAC address for SiS962 model ! 367: * @pci_dev: the sis900 pci device ! 368: * @net_dev: the net device to get address for ! 369: * ! 370: * SiS962 model, use EEPROM to store MAC address. And EEPROM is shared by ! 371: * LAN and 1394. When access EEPROM, send EEREQ signal to hardware first ! 372: * and wait for EEGNT. If EEGNT is ON, EEPROM is permitted to be access ! 373: * by LAN, otherwise is not. After MAC address is read from EEPROM, send ! 374: * EEDONE signal to refuse EEPROM access by LAN. ! 375: * MAC address is read into @net_dev->dev_addr. ! 376: */ ! 377: ! 378: static int sis962_get_mac_addr(struct device *net_dev) ! 379: { ! 380: long ioaddr = net_dev->base_addr; ! 381: long ee_addr = ioaddr + mear; ! 382: u32 waittime = 0; ! 383: int i; ! 384: ! 385: outl(EEREQ, ee_addr); ! 386: while(waittime < 2000) { ! 387: if(inl(ee_addr) & EEGNT) { ! 388: /* get MAC address from EEPROM */ ! 389: for (i = 0; i < 3; i++) ! 390: ((u16 *)(net_dev->dev_addr))[i] = read_eeprom(ioaddr, i+EEPROMMACAddr); ! 391: outl(EEDONE, ee_addr); ! 392: return 1; ! 393: } else { ! 394: udelay(1); ! 395: waittime ++; ! 396: } ! 397: } ! 398: outl(EEDONE, ee_addr); ! 399: return 0; ! 400: } ! 401: ! 402: struct device * ! 403: sis900_mac_probe (struct mac_chip_info *mac, long ioaddr, int irq, int pci_index, ! 404: unsigned char pci_device_fn, unsigned char pci_bus, struct device * net_dev) ! 405: { ! 406: struct sis900_private *sis_priv; ! 407: static int did_version = 0; ! 408: ! 409: u8 revision; ! 410: int i, ret = 0; ! 411: ! 412: if (did_version++ == 0) ! 413: printk(KERN_INFO "%s\n", version); ! 414: ! 415: if ((net_dev = init_etherdev(net_dev, 0)) == NULL) ! 416: return NULL; ! 417: ! 418: if ((net_dev->priv = kmalloc(sizeof(struct sis900_private), GFP_KERNEL)) == NULL) { ! 419: unregister_netdev(net_dev); ! 420: return NULL; ! 421: } ! 422: ! 423: sis_priv = net_dev->priv; ! 424: memset(sis_priv, 0, sizeof(struct sis900_private)); ! 425: ! 426: /* We do a request_region() to register /proc/ioports info. */ ! 427: request_region(ioaddr, mac->io_size, net_dev->name); ! 428: net_dev->base_addr = ioaddr; ! 429: net_dev->irq = irq; ! 430: ! 431: sis_priv->mac = mac; ! 432: sis_priv->pci_bus = pci_bus; ! 433: sis_priv->pci_device_fn = pci_device_fn; ! 434: sis_priv->pci_index = pci_index; ! 435: ! 436: pcibios_read_config_byte(pci_bus, pci_device_fn, PCI_CLASS_REVISION, &revision); ! 437: ! 438: if ( revision == SIS630E_900_REV ) ! 439: ret = sis630e_get_mac_addr(ioaddr, pci_index, net_dev); ! 440: else if ((revision > 0x81) && (revision <= 0x90)) ! 441: ret = sis635_get_mac_addr(net_dev); ! 442: else if (revision == SIS962_900_REV) ! 443: ret = sis962_get_mac_addr(net_dev); ! 444: else ! 445: ret = sis900_get_mac_addr(ioaddr, net_dev); ! 446: ! 447: if (ret == 0) { ! 448: unregister_netdev(net_dev); ! 449: return NULL; ! 450: } ! 451: ! 452: /* print some information about our NIC */ ! 453: printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ", net_dev->name, mac->name, ! 454: ioaddr, irq); ! 455: for (i = 0; i < 5; i++) ! 456: printk("%2.2x:", (u8)net_dev->dev_addr[i]); ! 457: printk("%2.2x.\n", net_dev->dev_addr[i]); ! 458: ! 459: /* 630ET : set the mii access mode as software-mode */ ! 460: if (revision == SIS630ET_900_REV) ! 461: outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr); ! 462: ! 463: /* probe for mii transceiver */ ! 464: if (sis900_mii_probe(pci_bus, pci_device_fn, net_dev) == 0) { ! 465: unregister_netdev(net_dev); ! 466: kfree(sis_priv); ! 467: release_region(ioaddr, mac->io_size); ! 468: return NULL; ! 469: } ! 470: ! 471: sis_priv->next_module = root_sis900_dev; ! 472: root_sis900_dev = net_dev; ! 473: ! 474: /* The SiS900-specific entries in the device structure. */ ! 475: net_dev->open = &sis900_open; ! 476: net_dev->hard_start_xmit = &sis900_start_xmit; ! 477: net_dev->stop = &sis900_close; ! 478: net_dev->get_stats = &sis900_get_stats; ! 479: net_dev->set_multicast_list = &set_rx_mode; ! 480: net_dev->do_ioctl = &mii_ioctl; ! 481: ! 482: return net_dev; ! 483: } ! 484: ! 485: /* sis900_mii_probe: - Probe MII PHY for sis900 */ ! 486: static int sis900_mii_probe (unsigned char pci_bus, unsigned char pci_device_fn, struct device * net_dev) ! 487: { ! 488: struct sis900_private * sis_priv = (struct sis900_private *)net_dev->priv; ! 489: u16 poll_bit = MII_STAT_LINK, status = 0; ! 490: unsigned int timeout = jiffies + 5 * HZ; ! 491: int phy_addr; ! 492: u8 revision; ! 493: ! 494: sis_priv->mii = NULL; ! 495: ! 496: /* search for total of 32 possible mii phy addresses */ ! 497: for (phy_addr = 0; phy_addr < 32; phy_addr++) { ! 498: struct mii_phy * mii_phy = NULL; ! 499: u16 mii_status; ! 500: int i; ! 501: ! 502: for(i=0; i<2; i++) ! 503: mii_status = mdio_read(net_dev, phy_addr, MII_STATUS); ! 504: ! 505: if (mii_status == 0xffff || mii_status == 0x0000) ! 506: /* the mii is not accessable, try next one */ ! 507: continue; ! 508: ! 509: if ((mii_phy = kmalloc(sizeof(struct mii_phy), GFP_KERNEL)) == NULL) { ! 510: printk(KERN_INFO "Cannot allocate mem for struct mii_phy\n"); ! 511: return 0; ! 512: } ! 513: ! 514: mii_phy->phy_id0 = mdio_read(net_dev, phy_addr, MII_PHY_ID0); ! 515: mii_phy->phy_id1 = mdio_read(net_dev, phy_addr, MII_PHY_ID1); ! 516: mii_phy->phy_addr = phy_addr; ! 517: mii_phy->status = mii_status; ! 518: mii_phy->next = sis_priv->mii; ! 519: sis_priv->mii = mii_phy; ! 520: sis_priv->first_mii = mii_phy; ! 521: ! 522: for (i=0; mii_chip_table[i].phy_id1; i++) ! 523: if ( ( mii_phy->phy_id0 == mii_chip_table[i].phy_id0 ) && ! 524: ( (mii_phy->phy_id1 & 0xFFF0) == mii_chip_table[i].phy_id1 )){ ! 525: ! 526: mii_phy->phy_types = mii_chip_table[i].phy_types; ! 527: if(mii_chip_table[i].phy_types == MIX) ! 528: mii_phy->phy_types = ! 529: (mii_status & (MII_STAT_CAN_TX_FDX | MII_STAT_CAN_TX))?LAN:HOME; ! 530: printk(KERN_INFO "%s: %s transceiver found at address %d.\n", ! 531: net_dev->name, mii_chip_table[i].name, phy_addr); ! 532: break; ! 533: } ! 534: ! 535: if( !mii_chip_table[i].phy_id1 ) ! 536: printk(KERN_INFO "%s: Unknown PHY transceiver found at address %d.\n", ! 537: net_dev->name, phy_addr); ! 538: } ! 539: ! 540: if (sis_priv->mii == NULL) { ! 541: printk(KERN_INFO "%s: No MII transceivers found!\n", ! 542: net_dev->name); ! 543: return 0; ! 544: } ! 545: ! 546: /* Slect Default PHY to put in sis_priv->mii & sis_priv->cur_phy */ ! 547: sis_priv->mii = NULL; ! 548: sis900_default_phy( net_dev ); ! 549: ! 550: /* Reset PHY if default PHY is internal sis900 */ ! 551: if( (sis_priv->mii->phy_id0 == 0x001D) && ! 552: ( (sis_priv->mii->phy_id1&0xFFF0) == 0x8000) ) ! 553: status = sis900_reset_phy( net_dev, sis_priv->cur_phy ); ! 554: ! 555: /* workaround for ICS1893 PHY */ ! 556: if ((sis_priv->mii->phy_id0 == 0x0015) && ! 557: ((sis_priv->mii->phy_id1&0xFFF0) == 0xF440)) ! 558: mdio_write(net_dev, sis_priv->cur_phy, 0x0018, 0xD200); ! 559: ! 560: if( status & MII_STAT_LINK ){ ! 561: while (poll_bit) ! 562: { ! 563: poll_bit ^= (mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS) & poll_bit); ! 564: if (jiffies >= timeout) ! 565: { ! 566: printk(KERN_WARNING "%s: reset phy and link down now\n", net_dev->name); ! 567: return -ETIME; ! 568: } ! 569: } ! 570: } ! 571: ! 572: pcibios_read_config_byte(pci_bus, pci_device_fn, PCI_CLASS_REVISION, &revision); ! 573: if (revision == SIS630E_900_REV) { ! 574: /* SiS 630E has some bugs on default value of PHY registers */ ! 575: mdio_write(net_dev, sis_priv->cur_phy, MII_ANADV, 0x05e1); ! 576: mdio_write(net_dev, sis_priv->cur_phy, MII_CONFIG1, 0x22); ! 577: mdio_write(net_dev, sis_priv->cur_phy, MII_CONFIG2, 0xff00); ! 578: mdio_write(net_dev, sis_priv->cur_phy, MII_MASK, 0xffc0); ! 579: //mdio_write(net_dev, sis_priv->cur_phy, MII_CONTROL, 0x1000); ! 580: } ! 581: ! 582: if (sis_priv->mii->status & MII_STAT_LINK) ! 583: sis_priv->LinkOn = TRUE; ! 584: else ! 585: sis_priv->LinkOn = FALSE; ! 586: ! 587: return 1; ! 588: } ! 589: ! 590: ! 591: /* sis900_default_phy : Select one default PHY for sis900 mac */ ! 592: static u16 sis900_default_phy(struct device * net_dev) ! 593: { ! 594: struct sis900_private * sis_priv = (struct sis900_private *)net_dev->priv; ! 595: struct mii_phy *phy = NULL, *phy_home = NULL, *default_phy = NULL; ! 596: u16 status; ! 597: ! 598: for( phy=sis_priv->first_mii; phy; phy=phy->next ){ ! 599: status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); ! 600: status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); ! 601: ! 602: /* Link ON & Not select deafalut PHY */ ! 603: if ( (status & MII_STAT_LINK) && !(default_phy) ) ! 604: default_phy = phy; ! 605: else{ ! 606: status = mdio_read(net_dev, phy->phy_addr, MII_CONTROL); ! 607: mdio_write(net_dev, phy->phy_addr, MII_CONTROL, ! 608: status | MII_CNTL_AUTO | MII_CNTL_ISOLATE); ! 609: if( phy->phy_types == HOME ) ! 610: phy_home = phy; ! 611: } ! 612: } ! 613: ! 614: if( (!default_phy) && phy_home ) ! 615: default_phy = phy_home; ! 616: else if(!default_phy) ! 617: default_phy = sis_priv->first_mii; ! 618: ! 619: if( sis_priv->mii != default_phy ){ ! 620: sis_priv->mii = default_phy; ! 621: sis_priv->cur_phy = default_phy->phy_addr; ! 622: printk(KERN_INFO "%s: Using transceiver found at address %d as default\n", net_dev->name,sis_priv->cur_phy); ! 623: } ! 624: ! 625: status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL); ! 626: status &= (~MII_CNTL_ISOLATE); ! 627: ! 628: mdio_write(net_dev, sis_priv->cur_phy, MII_CONTROL, status); ! 629: status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); ! 630: status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); ! 631: ! 632: return status; ! 633: } ! 634: ! 635: ! 636: /* sis900_set_capability : set the media capability of network adapter */ ! 637: static void sis900_set_capability( struct device *net_dev , struct mii_phy *phy ) ! 638: { ! 639: u16 cap; ! 640: u16 status; ! 641: ! 642: status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); ! 643: status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); ! 644: ! 645: cap = MII_NWAY_CSMA_CD | ! 646: ((phy->status & MII_STAT_CAN_TX_FDX)? MII_NWAY_TX_FDX:0) | ! 647: ((phy->status & MII_STAT_CAN_TX) ? MII_NWAY_TX:0) | ! 648: ((phy->status & MII_STAT_CAN_T_FDX) ? MII_NWAY_T_FDX:0)| ! 649: ((phy->status & MII_STAT_CAN_T) ? MII_NWAY_T:0); ! 650: ! 651: mdio_write( net_dev, phy->phy_addr, MII_ANADV, cap ); ! 652: } ! 653: ! 654: ! 655: /* Delay between EEPROM clock transitions. */ ! 656: #define eeprom_delay() inl(ee_addr) ! 657: ! 658: /* Read Serial EEPROM through EEPROM Access Register, Note that location is ! 659: in word (16 bits) unit */ ! 660: static u16 read_eeprom(long ioaddr, int location) ! 661: { ! 662: int i; ! 663: u16 retval = 0; ! 664: long ee_addr = ioaddr + mear; ! 665: u32 read_cmd = location | EEread; ! 666: ! 667: outl(0, ee_addr); ! 668: eeprom_delay(); ! 669: outl(EECS, ee_addr); ! 670: eeprom_delay(); ! 671: ! 672: /* Shift the read command (9) bits out. */ ! 673: for (i = 8; i >= 0; i--) { ! 674: u32 dataval = (read_cmd & (1 << i)) ? EEDI | EECS : EECS; ! 675: outl(dataval, ee_addr); ! 676: eeprom_delay(); ! 677: outl(dataval | EECLK, ee_addr); ! 678: eeprom_delay(); ! 679: } ! 680: outb(EECS, ee_addr); ! 681: eeprom_delay(); ! 682: ! 683: /* read the 16-bits data in */ ! 684: for (i = 16; i > 0; i--) { ! 685: outl(EECS, ee_addr); ! 686: eeprom_delay(); ! 687: outl(EECS | EECLK, ee_addr); ! 688: eeprom_delay(); ! 689: retval = (retval << 1) | ((inl(ee_addr) & EEDO) ? 1 : 0); ! 690: eeprom_delay(); ! 691: } ! 692: ! 693: /* Terminate the EEPROM access. */ ! 694: outl(0, ee_addr); ! 695: eeprom_delay(); ! 696: // outl(EECLK, ee_addr); ! 697: ! 698: return (retval); ! 699: } ! 700: ! 701: /* Read and write the MII management registers using software-generated ! 702: serial MDIO protocol. Note that the command bits and data bits are ! 703: send out seperately */ ! 704: #define mdio_delay() inl(mdio_addr) ! 705: ! 706: static void mdio_idle(long mdio_addr) ! 707: { ! 708: outl(MDIO | MDDIR, mdio_addr); ! 709: mdio_delay(); ! 710: outl(MDIO | MDDIR | MDC, mdio_addr); ! 711: } ! 712: ! 713: /* Syncronize the MII management interface by shifting 32 one bits out. */ ! 714: static void mdio_reset(long mdio_addr) ! 715: { ! 716: int i; ! 717: ! 718: for (i = 31; i >= 0; i--) { ! 719: outl(MDDIR | MDIO, mdio_addr); ! 720: mdio_delay(); ! 721: outl(MDDIR | MDIO | MDC, mdio_addr); ! 722: mdio_delay(); ! 723: } ! 724: return; ! 725: } ! 726: ! 727: static u16 mdio_read(struct device *net_dev, int phy_id, int location) ! 728: { ! 729: long mdio_addr = net_dev->base_addr + mear; ! 730: int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift); ! 731: u16 retval = 0; ! 732: int i; ! 733: ! 734: mdio_reset(mdio_addr); ! 735: mdio_idle(mdio_addr); ! 736: ! 737: for (i = 15; i >= 0; i--) { ! 738: int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR; ! 739: outl(dataval, mdio_addr); ! 740: mdio_delay(); ! 741: outl(dataval | MDC, mdio_addr); ! 742: mdio_delay(); ! 743: } ! 744: ! 745: /* Read the 16 data bits. */ ! 746: for (i = 16; i > 0; i--) { ! 747: outl(0, mdio_addr); ! 748: mdio_delay(); ! 749: retval = (retval << 1) | ((inl(mdio_addr) & MDIO) ? 1 : 0); ! 750: outl(MDC, mdio_addr); ! 751: mdio_delay(); ! 752: } ! 753: outl(0x00, mdio_addr); ! 754: ! 755: return retval; ! 756: } ! 757: ! 758: static void mdio_write(struct device *net_dev, int phy_id, int location, int value) ! 759: { ! 760: long mdio_addr = net_dev->base_addr + mear; ! 761: int mii_cmd = MIIwrite|(phy_id<<MIIpmdShift)|(location<<MIIregShift); ! 762: int i; ! 763: ! 764: mdio_reset(mdio_addr); ! 765: mdio_idle(mdio_addr); ! 766: ! 767: /* Shift the command bits out. */ ! 768: for (i = 15; i >= 0; i--) { ! 769: int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR; ! 770: outb(dataval, mdio_addr); ! 771: mdio_delay(); ! 772: outb(dataval | MDC, mdio_addr); ! 773: mdio_delay(); ! 774: } ! 775: mdio_delay(); ! 776: ! 777: /* Shift the value bits out. */ ! 778: for (i = 15; i >= 0; i--) { ! 779: int dataval = (value & (1 << i)) ? MDDIR | MDIO : MDDIR; ! 780: outl(dataval, mdio_addr); ! 781: mdio_delay(); ! 782: outl(dataval | MDC, mdio_addr); ! 783: mdio_delay(); ! 784: } ! 785: mdio_delay(); ! 786: ! 787: /* Clear out extra bits. */ ! 788: for (i = 2; i > 0; i--) { ! 789: outb(0, mdio_addr); ! 790: mdio_delay(); ! 791: outb(MDC, mdio_addr); ! 792: mdio_delay(); ! 793: } ! 794: outl(0x00, mdio_addr); ! 795: ! 796: return; ! 797: } ! 798: ! 799: static u16 sis900_reset_phy(struct device *net_dev, int phy_addr) ! 800: { ! 801: int i = 0; ! 802: u16 status; ! 803: ! 804: while (i++ < 2) ! 805: status = mdio_read(net_dev, phy_addr, MII_STATUS); ! 806: ! 807: mdio_write( net_dev, phy_addr, MII_CONTROL, MII_CNTL_RESET ); ! 808: ! 809: return status; ! 810: } ! 811: ! 812: static int ! 813: sis900_open(struct device *net_dev) ! 814: { ! 815: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 816: long ioaddr = net_dev->base_addr; ! 817: u8 revision; ! 818: ! 819: /* Soft reset the chip. */ ! 820: sis900_reset(net_dev); ! 821: ! 822: /* Equalizer workaroung Rule */ ! 823: pcibios_read_config_byte(sis_priv->pci_bus, sis_priv->pci_device_fn, PCI_CLASS_REVISION, &revision); ! 824: sis630_set_eq(net_dev, revision); ! 825: ! 826: if (request_irq(net_dev->irq, &sis900_interrupt, SA_SHIRQ, net_dev->name, net_dev)) { ! 827: return -EAGAIN; ! 828: } ! 829: ! 830: MOD_INC_USE_COUNT; ! 831: ! 832: sis900_init_rxfilter(net_dev); ! 833: ! 834: sis900_init_tx_ring(net_dev); ! 835: sis900_init_rx_ring(net_dev); ! 836: ! 837: set_rx_mode(net_dev); ! 838: ! 839: net_dev->tbusy = 0; ! 840: net_dev->interrupt = 0; ! 841: net_dev->start = 1; ! 842: ! 843: /* Workaround for EDB */ ! 844: sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); ! 845: ! 846: /* Enable all known interrupts by setting the interrupt mask. */ ! 847: outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); ! 848: outl(RxENA | inl(ioaddr + cr), ioaddr + cr); ! 849: outl(IE, ioaddr + ier); ! 850: ! 851: sis900_check_mode(net_dev, sis_priv->mii); ! 852: ! 853: /* Set the timer to switch to check for link beat and perhaps switch ! 854: to an alternate media type. */ ! 855: init_timer(&sis_priv->timer); ! 856: sis_priv->timer.expires = jiffies + HZ; ! 857: sis_priv->timer.data = (unsigned long)net_dev; ! 858: sis_priv->timer.function = &sis900_timer; ! 859: add_timer(&sis_priv->timer); ! 860: ! 861: return 0; ! 862: } ! 863: ! 864: /* set receive filter address to our MAC address */ ! 865: static void ! 866: sis900_init_rxfilter (struct device * net_dev) ! 867: { ! 868: long ioaddr = net_dev->base_addr; ! 869: u32 rfcrSave; ! 870: u32 i; ! 871: ! 872: rfcrSave = inl(rfcr + ioaddr); ! 873: ! 874: /* disable packet filtering before setting filter */ ! 875: outl(rfcrSave & ~RFEN, rfcr + ioaddr); ! 876: ! 877: /* load MAC addr to filter data register */ ! 878: for (i = 0 ; i < 3 ; i++) { ! 879: u32 w; ! 880: ! 881: w = (u32) *((u16 *)(net_dev->dev_addr)+i); ! 882: outl((i << RFADDR_shift), ioaddr + rfcr); ! 883: outl(w, ioaddr + rfdr); ! 884: ! 885: if (sis900_debug > 2) { ! 886: printk(KERN_INFO "%s: Receive Filter Addrss[%d]=%x\n", ! 887: net_dev->name, i, inl(ioaddr + rfdr)); ! 888: } ! 889: } ! 890: ! 891: /* enable packet filitering */ ! 892: outl(rfcrSave | RFEN, rfcr + ioaddr); ! 893: } ! 894: ! 895: /* Initialize the Tx ring. */ ! 896: static void ! 897: sis900_init_tx_ring(struct device *net_dev) ! 898: { ! 899: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 900: long ioaddr = net_dev->base_addr; ! 901: int i; ! 902: ! 903: sis_priv->tx_full = 0; ! 904: sis_priv->dirty_tx = sis_priv->cur_tx = 0; ! 905: ! 906: for (i = 0; i < NUM_TX_DESC; i++) { ! 907: sis_priv->tx_skbuff[i] = NULL; ! 908: ! 909: sis_priv->tx_ring[i].link = (u32) virt_to_bus(&sis_priv->tx_ring[i+1]); ! 910: sis_priv->tx_ring[i].cmdsts = 0; ! 911: sis_priv->tx_ring[i].bufptr = 0; ! 912: } ! 913: sis_priv->tx_ring[i-1].link = (u32) virt_to_bus(&sis_priv->tx_ring[0]); ! 914: ! 915: /* load Transmit Descriptor Register */ ! 916: outl(virt_to_bus(&sis_priv->tx_ring[0]), ioaddr + txdp); ! 917: if (sis900_debug > 2) ! 918: printk(KERN_INFO "%s: TX descriptor register loaded with: %8.8x\n", ! 919: net_dev->name, inl(ioaddr + txdp)); ! 920: } ! 921: ! 922: /* Initialize the Rx descriptor ring, pre-allocate recevie buffers */ ! 923: static void ! 924: sis900_init_rx_ring(struct device *net_dev) ! 925: { ! 926: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 927: long ioaddr = net_dev->base_addr; ! 928: int i; ! 929: ! 930: sis_priv->cur_rx = 0; ! 931: sis_priv->dirty_rx = 0; ! 932: ! 933: /* init RX descriptor */ ! 934: for (i = 0; i < NUM_RX_DESC; i++) { ! 935: sis_priv->rx_skbuff[i] = NULL; ! 936: ! 937: sis_priv->rx_ring[i].link = (u32) virt_to_bus(&sis_priv->rx_ring[i+1]); ! 938: sis_priv->rx_ring[i].cmdsts = 0; ! 939: sis_priv->rx_ring[i].bufptr = 0; ! 940: } ! 941: sis_priv->rx_ring[i-1].link = (u32) virt_to_bus(&sis_priv->rx_ring[0]); ! 942: ! 943: /* allocate sock buffers */ ! 944: for (i = 0; i < NUM_RX_DESC; i++) { ! 945: struct sk_buff *skb; ! 946: ! 947: if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) { ! 948: /* not enough memory for skbuff, this makes a "hole" ! 949: on the buffer ring, it is not clear how the ! 950: hardware will react to this kind of degenerated ! 951: buffer */ ! 952: break; ! 953: } ! 954: skb->dev = net_dev; ! 955: sis_priv->rx_skbuff[i] = skb; ! 956: sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE; ! 957: sis_priv->rx_ring[i].bufptr = virt_to_bus(skb->tail); ! 958: } ! 959: sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC); ! 960: ! 961: /* load Receive Descriptor Register */ ! 962: outl(virt_to_bus(&sis_priv->rx_ring[0]), ioaddr + rxdp); ! 963: if (sis900_debug > 2) ! 964: printk(KERN_INFO "%s: RX descriptor register loaded with: %8.8x\n", ! 965: net_dev->name, inl(ioaddr + rxdp)); ! 966: } ! 967: ! 968: /** ! 969: * sis630_set_eq: - set phy equalizer value for 630 LAN ! 970: * @net_dev: the net device to set equalizer value ! 971: * @revision: 630 LAN revision number ! 972: * ! 973: * 630E equalizer workaround rule(Cyrus Huang 08/15) ! 974: * PHY register 14h(Test) ! 975: * Bit 14: 0 -- Automatically dectect (default) ! 976: * 1 -- Manually set Equalizer filter ! 977: * Bit 13: 0 -- (Default) ! 978: * 1 -- Speed up convergence of equalizer setting ! 979: * Bit 9 : 0 -- (Default) ! 980: * 1 -- Disable Baseline Wander ! 981: * Bit 3~7 -- Equalizer filter setting ! 982: * Link ON: Set Bit 9, 13 to 1, Bit 14 to 0 ! 983: * Then calculate equalizer value ! 984: * Then set equalizer value, and set Bit 14 to 1, Bit 9 to 0 ! 985: * Link Off:Set Bit 13 to 1, Bit 14 to 0 ! 986: * Calculate Equalizer value: ! 987: * When Link is ON and Bit 14 is 0, SIS900PHY will auto-dectect proper equalizer value. ! 988: * When the equalizer is stable, this value is not a fixed value. It will be within ! 989: * a small range(eg. 7~9). Then we get a minimum and a maximum value(eg. min=7, max=9) ! 990: * 0 <= max <= 4 --> set equalizer to max ! 991: * 5 <= max <= 14 --> set equalizer to max+1 or set equalizer to max+2 if max == min ! 992: * max >= 15 --> set equalizer to max+5 or set equalizer to max+6 if max == min ! 993: */ ! 994: ! 995: static void sis630_set_eq(struct device *net_dev, u8 revision) ! 996: { ! 997: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 998: u16 reg14h, eq_value, max_value=0, min_value=0; ! 999: u8 host_bridge_rev; ! 1000: int i, maxcount=10; ! 1001: int not_found; ! 1002: u8 pci_bus, pci_device_fn; ! 1003: ! 1004: if ( !(revision == SIS630E_900_REV || revision == SIS630EA1_900_REV || ! 1005: revision == SIS630A_900_REV || revision == SIS630ET_900_REV) ) ! 1006: return; ! 1007: not_found = pcibios_find_device(SIS630_VENDOR_ID, SIS630_DEVICE_ID, ! 1008: sis_priv->pci_index, ! 1009: &pci_bus, ! 1010: &pci_device_fn); ! 1011: if (not_found) ! 1012: pcibios_read_config_byte(pci_bus, pci_device_fn, PCI_CLASS_REVISION, &host_bridge_rev); ! 1013: ! 1014: if (sis_priv->LinkOn) { ! 1015: reg14h=mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); ! 1016: mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, (0x2200 | reg14h) & 0xBFFF); ! 1017: for (i=0; i < maxcount; i++) { ! 1018: eq_value=(0x00F8 & mdio_read(net_dev, sis_priv->cur_phy, MII_RESV)) >> 3; ! 1019: if (i == 0) ! 1020: max_value=min_value=eq_value; ! 1021: max_value=(eq_value > max_value) ? eq_value : max_value; ! 1022: min_value=(eq_value < min_value) ? eq_value : min_value; ! 1023: } ! 1024: /* 630E rule to determine the equalizer value */ ! 1025: if (revision == SIS630E_900_REV || revision == SIS630EA1_900_REV || ! 1026: revision == SIS630ET_900_REV) { ! 1027: if (max_value < 5) ! 1028: eq_value=max_value; ! 1029: else if (max_value >= 5 && max_value < 15) ! 1030: eq_value=(max_value == min_value) ? max_value+2 : max_value+1; ! 1031: else if (max_value >= 15) ! 1032: eq_value=(max_value == min_value) ? max_value+6 : max_value+5; ! 1033: } ! 1034: /* 630B0&B1 rule to determine the equalizer value */ ! 1035: if (revision == SIS630A_900_REV && ! 1036: (host_bridge_rev == SIS630B0 || host_bridge_rev == SIS630B1)) { ! 1037: if (max_value == 0) ! 1038: eq_value=3; ! 1039: else ! 1040: eq_value=(max_value+min_value+1)/2; ! 1041: } ! 1042: /* write equalizer value and setting */ ! 1043: reg14h=mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); ! 1044: reg14h=(reg14h & 0xFF07) | ((eq_value << 3) & 0x00F8); ! 1045: reg14h=(reg14h | 0x6000) & 0xFDFF; ! 1046: mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, reg14h); ! 1047: } ! 1048: else { ! 1049: reg14h=mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); ! 1050: if (revision == SIS630A_900_REV && ! 1051: (host_bridge_rev == SIS630B0 || host_bridge_rev == SIS630B1)) ! 1052: mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, (reg14h | 0x2200) & 0xBFFF); ! 1053: else ! 1054: mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, (reg14h | 0x2000) & 0xBFFF); ! 1055: } ! 1056: return; ! 1057: } ! 1058: ! 1059: ! 1060: /* on each timer ticks we check two things, Link Status (ON/OFF) and ! 1061: Link Mode (10/100/Full/Half) ! 1062: */ ! 1063: static void sis900_timer(unsigned long data) ! 1064: { ! 1065: struct device *net_dev = (struct device *)data; ! 1066: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1067: struct mii_phy *mii_phy = sis_priv->mii; ! 1068: static int next_tick = 5*HZ; ! 1069: u16 status; ! 1070: u8 revision; ! 1071: ! 1072: if(!sis_priv->autong_complete){ ! 1073: int speed, duplex = 0; ! 1074: ! 1075: sis900_read_mode(net_dev, &speed, &duplex); ! 1076: if(duplex){ ! 1077: sis900_set_mode(net_dev->base_addr, speed, duplex); ! 1078: pcibios_read_config_byte(sis_priv->pci_bus, sis_priv->pci_device_fn, PCI_CLASS_REVISION, &revision); ! 1079: sis630_set_eq(net_dev, revision); ! 1080: } ! 1081: ! 1082: sis_priv->timer.expires = jiffies + HZ; ! 1083: add_timer(&sis_priv->timer); ! 1084: return; ! 1085: } ! 1086: ! 1087: status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); ! 1088: status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); ! 1089: ! 1090: /* Link OFF -> ON */ ! 1091: if ( !sis_priv->LinkOn ) { ! 1092: LookForLink: ! 1093: /* Search for new PHY */ ! 1094: status = sis900_default_phy( net_dev ); ! 1095: mii_phy = sis_priv->mii; ! 1096: ! 1097: if( status & MII_STAT_LINK ){ ! 1098: sis900_check_mode(net_dev, mii_phy); ! 1099: sis_priv->LinkOn = TRUE; ! 1100: } ! 1101: } ! 1102: /* Link ON -> OFF */ ! 1103: else{ ! 1104: if( !(status & MII_STAT_LINK) ){ ! 1105: sis_priv->LinkOn = FALSE; ! 1106: printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); ! 1107: ! 1108: /* Change mode issue */ ! 1109: if( (mii_phy->phy_id0 == 0x001D) && ! 1110: ( (mii_phy->phy_id1 & 0xFFF0) == 0x8000 )) ! 1111: sis900_reset_phy( net_dev, sis_priv->cur_phy ); ! 1112: ! 1113: pcibios_read_config_byte(sis_priv->pci_bus, sis_priv->pci_device_fn, PCI_CLASS_REVISION, &revision); ! 1114: sis630_set_eq(net_dev, revision); ! 1115: ! 1116: goto LookForLink; ! 1117: } ! 1118: } ! 1119: ! 1120: sis_priv->timer.expires = jiffies + next_tick; ! 1121: add_timer(&sis_priv->timer); ! 1122: } ! 1123: ! 1124: static void sis900_check_mode (struct device *net_dev, struct mii_phy *mii_phy) ! 1125: { ! 1126: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1127: long ioaddr = net_dev->base_addr; ! 1128: int speed, duplex; ! 1129: ! 1130: if( mii_phy->phy_types == LAN ){ ! 1131: outl( ~EXD & inl( ioaddr + cfg ), ioaddr + cfg); ! 1132: sis900_set_capability(net_dev , mii_phy); ! 1133: sis900_auto_negotiate(net_dev, sis_priv->cur_phy); ! 1134: }else{ ! 1135: outl(EXD | inl( ioaddr + cfg ), ioaddr + cfg); ! 1136: speed = HW_SPEED_HOME; ! 1137: duplex = FDX_CAPABLE_HALF_SELECTED; ! 1138: sis900_set_mode(net_dev->base_addr, speed, duplex); ! 1139: sis_priv->autong_complete = 1; ! 1140: } ! 1141: } ! 1142: ! 1143: static void sis900_set_mode (long ioaddr, int speed, int duplex) ! 1144: { ! 1145: u32 tx_flags = 0, rx_flags = 0; ! 1146: ! 1147: if( inl(ioaddr + cfg) & EDB_MASTER_EN ){ ! 1148: tx_flags = TxATP | (DMA_BURST_64 << TxMXDMA_shift) | (TX_FILL_THRESH << TxFILLT_shift); ! 1149: rx_flags = DMA_BURST_64 << RxMXDMA_shift; ! 1150: } ! 1151: else{ ! 1152: tx_flags = TxATP | (DMA_BURST_512 << TxMXDMA_shift) | (TX_FILL_THRESH << TxFILLT_shift); ! 1153: rx_flags = DMA_BURST_512 << RxMXDMA_shift; ! 1154: } ! 1155: ! 1156: if (speed == HW_SPEED_HOME || speed == HW_SPEED_10_MBPS ) { ! 1157: rx_flags |= (RxDRNT_10 << RxDRNT_shift); ! 1158: tx_flags |= (TxDRNT_10 << TxDRNT_shift); ! 1159: } ! 1160: else { ! 1161: rx_flags |= (RxDRNT_100 << RxDRNT_shift); ! 1162: tx_flags |= (TxDRNT_100 << TxDRNT_shift); ! 1163: } ! 1164: ! 1165: if (duplex == FDX_CAPABLE_FULL_SELECTED) { ! 1166: tx_flags |= (TxCSI | TxHBI); ! 1167: rx_flags |= RxATX; ! 1168: } ! 1169: ! 1170: outl (tx_flags, ioaddr + txcfg); ! 1171: outl (rx_flags, ioaddr + rxcfg); ! 1172: } ! 1173: ! 1174: ! 1175: static void sis900_auto_negotiate(struct device *net_dev, int phy_addr) ! 1176: { ! 1177: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1178: int i = 0; ! 1179: u32 status; ! 1180: ! 1181: while (i++ < 2) ! 1182: status = mdio_read(net_dev, phy_addr, MII_STATUS); ! 1183: ! 1184: if (!(status & MII_STAT_LINK)){ ! 1185: printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); ! 1186: sis_priv->autong_complete = 1; ! 1187: sis_priv->LinkOn = FALSE; ! 1188: return; ! 1189: } ! 1190: ! 1191: /* (Re)start AutoNegotiate */ ! 1192: mdio_write(net_dev, phy_addr, MII_CONTROL, ! 1193: MII_CNTL_AUTO | MII_CNTL_RST_AUTO); ! 1194: sis_priv->autong_complete = 0; ! 1195: } ! 1196: ! 1197: ! 1198: static void sis900_read_mode(struct device *net_dev, int *speed, int *duplex) ! 1199: { ! 1200: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1201: struct mii_phy *phy = sis_priv->mii; ! 1202: int phy_addr = sis_priv->cur_phy; ! 1203: u32 status; ! 1204: u16 autoadv, autorec; ! 1205: int i = 0; ! 1206: ! 1207: while (i++ < 2) ! 1208: status = mdio_read(net_dev, phy_addr, MII_STATUS); ! 1209: ! 1210: if (!(status & MII_STAT_LINK)) return; ! 1211: ! 1212: /* AutoNegotiate completed */ ! 1213: autoadv = mdio_read(net_dev, phy_addr, MII_ANADV); ! 1214: autorec = mdio_read(net_dev, phy_addr, MII_ANLPAR); ! 1215: status = autoadv & autorec; ! 1216: ! 1217: *speed = HW_SPEED_10_MBPS; ! 1218: *duplex = FDX_CAPABLE_HALF_SELECTED; ! 1219: ! 1220: if (status & (MII_NWAY_TX | MII_NWAY_TX_FDX)) ! 1221: *speed = HW_SPEED_100_MBPS; ! 1222: if (status & ( MII_NWAY_TX_FDX | MII_NWAY_T_FDX)) ! 1223: *duplex = FDX_CAPABLE_FULL_SELECTED; ! 1224: ! 1225: sis_priv->autong_complete = 1; ! 1226: ! 1227: /* Workaround for Realtek RTL8201 PHY issue */ ! 1228: if((phy->phy_id0 == 0x0000) && ((phy->phy_id1 & 0xFFF0) == 0x8200)){ ! 1229: if(mdio_read(net_dev, phy_addr, MII_CONTROL) & MII_CNTL_FDX) ! 1230: *duplex = FDX_CAPABLE_FULL_SELECTED; ! 1231: if(mdio_read(net_dev, phy_addr, 0x0019) & 0x01) ! 1232: *speed = HW_SPEED_100_MBPS; ! 1233: } ! 1234: ! 1235: printk(KERN_INFO "%s: Media Link On %s %s-duplex \n", ! 1236: net_dev->name, ! 1237: *speed == HW_SPEED_100_MBPS ? ! 1238: "100mbps" : "10mbps", ! 1239: *duplex == FDX_CAPABLE_FULL_SELECTED ? ! 1240: "full" : "half"); ! 1241: } ! 1242: ! 1243: ! 1244: static void sis900_tx_timeout(struct device *net_dev) ! 1245: { ! 1246: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1247: long ioaddr = net_dev->base_addr; ! 1248: int i; ! 1249: ! 1250: printk(KERN_INFO "%s: Transmit timeout, status %8.8x %8.8x \n", ! 1251: net_dev->name, inl(ioaddr + cr), inl(ioaddr + isr)); ! 1252: ! 1253: /* Disable interrupts by clearing the interrupt mask. */ ! 1254: outl(0x0000, ioaddr + imr); ! 1255: ! 1256: /* discard unsent packets, should this code section be protected by ! 1257: cli(), sti() ?? */ ! 1258: sis_priv->dirty_tx = sis_priv->cur_tx = 0; ! 1259: for (i = 0; i < NUM_TX_DESC; i++) { ! 1260: if (sis_priv->tx_skbuff[i] != NULL) { ! 1261: dev_free_skb(sis_priv->tx_skbuff[i]); ! 1262: sis_priv->tx_skbuff[i] = 0; ! 1263: sis_priv->tx_ring[i].cmdsts = 0; ! 1264: sis_priv->tx_ring[i].bufptr = 0; ! 1265: sis_priv->stats.tx_dropped++; ! 1266: } ! 1267: } ! 1268: net_dev->trans_start = jiffies; ! 1269: net_dev->tbusy = sis_priv->tx_full = 0; ! 1270: ! 1271: /* FIXME: Should we restart the transmission thread here ?? */ ! 1272: outl(TxENA | inl(ioaddr + cr), ioaddr + cr); ! 1273: ! 1274: /* Enable all known interrupts by setting the interrupt mask. */ ! 1275: outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); ! 1276: return; ! 1277: } ! 1278: ! 1279: static int ! 1280: sis900_start_xmit(struct sk_buff *skb, struct device *net_dev) ! 1281: { ! 1282: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1283: long ioaddr = net_dev->base_addr; ! 1284: unsigned int entry; ! 1285: ! 1286: /* test tbusy to see if we have timeout situation then set it */ ! 1287: if (test_and_set_bit(0, (void*)&net_dev->tbusy) != 0) { ! 1288: if (jiffies - net_dev->trans_start > TX_TIMEOUT) ! 1289: sis900_tx_timeout(net_dev); ! 1290: return 1; ! 1291: } ! 1292: ! 1293: /* Calculate the next Tx descriptor entry. */ ! 1294: entry = sis_priv->cur_tx % NUM_TX_DESC; ! 1295: sis_priv->tx_skbuff[entry] = skb; ! 1296: ! 1297: /* set the transmit buffer descriptor and enable Transmit State Machine */ ! 1298: sis_priv->tx_ring[entry].bufptr = virt_to_bus(skb->data); ! 1299: sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len); ! 1300: outl(TxENA | inl(ioaddr + cr), ioaddr + cr); ! 1301: ! 1302: if (++sis_priv->cur_tx - sis_priv->dirty_tx < NUM_TX_DESC) { ! 1303: /* Typical path, clear tbusy to indicate more ! 1304: transmission is possible */ ! 1305: clear_bit(0, (void*)&net_dev->tbusy); ! 1306: } else { ! 1307: /* no more transmit descriptor avaiable, tbusy remain set */ ! 1308: sis_priv->tx_full = 1; ! 1309: } ! 1310: ! 1311: net_dev->trans_start = jiffies; ! 1312: ! 1313: { ! 1314: int i; ! 1315: for (i = 0; i < 100000; i++); /* GRUIIIIIK */ ! 1316: } ! 1317: ! 1318: if (sis900_debug > 3) ! 1319: printk(KERN_INFO "%s: Queued Tx packet at %p size %d " ! 1320: "to slot %d.\n", ! 1321: net_dev->name, skb->data, (int)skb->len, entry); ! 1322: ! 1323: return 0; ! 1324: } ! 1325: ! 1326: /* The interrupt handler does all of the Rx thread work and cleans up ! 1327: after the Tx thread. */ ! 1328: static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs) ! 1329: { ! 1330: struct device *net_dev = (struct device *)dev_instance; ! 1331: int boguscnt = max_interrupt_work; ! 1332: long ioaddr = net_dev->base_addr; ! 1333: u32 status; ! 1334: ! 1335: #if defined(__i386__) ! 1336: /* A lock to prevent simultaneous entry bug on Intel SMP machines. */ ! 1337: if (test_and_set_bit(0, (void*)&net_dev->interrupt)) { ! 1338: printk(KERN_INFO "%s: SMP simultaneous entry of " ! 1339: "an interrupt handler.\n", net_dev->name); ! 1340: net_dev->interrupt = 0; /* Avoid halting machine. */ ! 1341: return; ! 1342: } ! 1343: #else ! 1344: if (net_dev->interrupt) { ! 1345: printk(KERN_INFO "%s: Re-entering the interrupt handler.\n", ! 1346: net_dev->name); ! 1347: return; ! 1348: } ! 1349: net_dev->interrupt = 1; ! 1350: #endif ! 1351: ! 1352: do { ! 1353: status = inl(ioaddr + isr); ! 1354: ! 1355: if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) ! 1356: /* nothing intresting happened */ ! 1357: break; ! 1358: ! 1359: /* why dow't we break after Tx/Rx case ?? keyword: full-duplex */ ! 1360: if (status & (RxORN | RxERR | RxOK)) ! 1361: /* Rx interrupt */ ! 1362: sis900_rx(net_dev); ! 1363: ! 1364: if (status & (TxURN | TxERR | TxIDLE)) ! 1365: /* Tx interrupt */ ! 1366: sis900_finish_xmit(net_dev); ! 1367: ! 1368: /* something strange happened !!! */ ! 1369: if (status & HIBERR) { ! 1370: printk(KERN_INFO "%s: Abnormal interrupt," ! 1371: "status %#8.8x.\n", net_dev->name, status); ! 1372: break; ! 1373: } ! 1374: if (--boguscnt < 0) { ! 1375: printk(KERN_INFO "%s: Too much work at interrupt, " ! 1376: "interrupt status = %#8.8x.\n", ! 1377: net_dev->name, status); ! 1378: break; ! 1379: } ! 1380: } while (1); ! 1381: ! 1382: if (sis900_debug > 4) ! 1383: printk(KERN_INFO "%s: exiting interrupt, " ! 1384: "interrupt status = 0x%#8.8x.\n", ! 1385: net_dev->name, inl(ioaddr + isr)); ! 1386: ! 1387: #if defined(__i386__) ! 1388: clear_bit(0, (void*)&net_dev->interrupt); ! 1389: #else ! 1390: net_dev->interrupt = 0; ! 1391: #endif ! 1392: return; ! 1393: } ! 1394: ! 1395: /* Process receive interrupt events, put buffer to higher layer and refill buffer pool ! 1396: Note: This fucntion is called by interrupt handler, don't do "too much" work here */ ! 1397: static int sis900_rx(struct device *net_dev) ! 1398: { ! 1399: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1400: long ioaddr = net_dev->base_addr; ! 1401: unsigned int entry = sis_priv->cur_rx % NUM_RX_DESC; ! 1402: u32 rx_status = sis_priv->rx_ring[entry].cmdsts; ! 1403: ! 1404: if (sis900_debug > 4) ! 1405: printk(KERN_INFO "sis900_rx, cur_rx:%4.4d, dirty_rx:%4.4d " ! 1406: "status:0x%8.8x\n", ! 1407: sis_priv->cur_rx, sis_priv->dirty_rx, rx_status); ! 1408: ! 1409: while (rx_status & OWN) { ! 1410: unsigned int rx_size; ! 1411: ! 1412: rx_size = (rx_status & DSIZE) - CRC_SIZE; ! 1413: ! 1414: if (rx_status & (ABORT|OVERRUN|TOOLONG|RUNT|RXISERR|CRCERR|FAERR)) { ! 1415: /* corrupted packet received */ ! 1416: if (sis900_debug > 4) ! 1417: printk(KERN_INFO "%s: Corrupted packet " ! 1418: "received, buffer status = 0x%8.8x.\n", ! 1419: net_dev->name, rx_status); ! 1420: sis_priv->stats.rx_errors++; ! 1421: if (rx_status & OVERRUN) ! 1422: sis_priv->stats.rx_over_errors++; ! 1423: if (rx_status & (TOOLONG|RUNT)) ! 1424: sis_priv->stats.rx_length_errors++; ! 1425: if (rx_status & (RXISERR | FAERR)) ! 1426: sis_priv->stats.rx_frame_errors++; ! 1427: if (rx_status & CRCERR) ! 1428: sis_priv->stats.rx_crc_errors++; ! 1429: /* reset buffer descriptor state */ ! 1430: sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; ! 1431: } else { ! 1432: struct sk_buff * skb; ! 1433: ! 1434: /* This situation should never happen, but due to ! 1435: some unknow bugs, it is possible that ! 1436: we are working on NULL sk_buff :-( */ ! 1437: if (sis_priv->rx_skbuff[entry] == NULL) { ! 1438: printk(KERN_INFO "%s: NULL pointer " ! 1439: "encountered in Rx ring, skipping\n", ! 1440: net_dev->name); ! 1441: break; ! 1442: } ! 1443: ! 1444: /* gvie the socket buffer to upper layers */ ! 1445: skb = sis_priv->rx_skbuff[entry]; ! 1446: skb_put(skb, rx_size); ! 1447: skb->protocol = eth_type_trans(skb, net_dev); ! 1448: netif_rx(skb); ! 1449: ! 1450: /* some network statistics */ ! 1451: if ((rx_status & BCAST) == MCAST) ! 1452: sis_priv->stats.multicast++; ! 1453: net_dev->last_rx = jiffies; ! 1454: /* sis_priv->stats.rx_bytes += rx_size;*/ ! 1455: sis_priv->stats.rx_packets++; ! 1456: ! 1457: /* refill the Rx buffer, what if there is not enought memory for ! 1458: new socket buffer ?? */ ! 1459: if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) { ! 1460: /* not enough memory for skbuff, this makes a "hole" ! 1461: on the buffer ring, it is not clear how the ! 1462: hardware will react to this kind of degenerated ! 1463: buffer */ ! 1464: printk(KERN_INFO "%s: Memory squeeze," ! 1465: "deferring packet.\n", ! 1466: net_dev->name); ! 1467: sis_priv->rx_skbuff[entry] = NULL; ! 1468: /* reset buffer descriptor state */ ! 1469: sis_priv->rx_ring[entry].cmdsts = 0; ! 1470: sis_priv->rx_ring[entry].bufptr = 0; ! 1471: sis_priv->stats.rx_dropped++; ! 1472: break; ! 1473: } ! 1474: skb->dev = net_dev; ! 1475: sis_priv->rx_skbuff[entry] = skb; ! 1476: sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; ! 1477: sis_priv->rx_ring[entry].bufptr = virt_to_bus(skb->tail); ! 1478: sis_priv->dirty_rx++; ! 1479: } ! 1480: sis_priv->cur_rx++; ! 1481: entry = sis_priv->cur_rx % NUM_RX_DESC; ! 1482: rx_status = sis_priv->rx_ring[entry].cmdsts; ! 1483: } // while ! 1484: ! 1485: /* refill the Rx buffer, what if the rate of refilling is slower than ! 1486: consuming ?? */ ! 1487: for (;sis_priv->cur_rx - sis_priv->dirty_rx > 0; sis_priv->dirty_rx++) { ! 1488: struct sk_buff *skb; ! 1489: ! 1490: entry = sis_priv->dirty_rx % NUM_RX_DESC; ! 1491: ! 1492: if (sis_priv->rx_skbuff[entry] == NULL) { ! 1493: if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) { ! 1494: /* not enough memory for skbuff, this makes a "hole" ! 1495: on the buffer ring, it is not clear how the ! 1496: hardware will react to this kind of degenerated ! 1497: buffer */ ! 1498: printk(KERN_INFO "%s: Memory squeeze," ! 1499: "deferring packet.\n", ! 1500: net_dev->name); ! 1501: sis_priv->stats.rx_dropped++; ! 1502: break; ! 1503: } ! 1504: skb->dev = net_dev; ! 1505: sis_priv->rx_skbuff[entry] = skb; ! 1506: sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; ! 1507: sis_priv->rx_ring[entry].bufptr = virt_to_bus(skb->tail); ! 1508: } ! 1509: } ! 1510: ! 1511: /* re-enable the potentially idle receive state matchine */ ! 1512: outl(RxENA | inl(ioaddr + cr), ioaddr + cr ); ! 1513: ! 1514: return 0; ! 1515: } ! 1516: ! 1517: /* finish up transmission of packets, check for error condition and free skbuff etc. ! 1518: Note: This fucntion is called by interrupt handler, don't do "too much" work here */ ! 1519: static void sis900_finish_xmit (struct device *net_dev) ! 1520: { ! 1521: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1522: ! 1523: for (; sis_priv->dirty_tx < sis_priv->cur_tx; sis_priv->dirty_tx++) { ! 1524: unsigned int entry; ! 1525: u32 tx_status; ! 1526: ! 1527: entry = sis_priv->dirty_tx % NUM_TX_DESC; ! 1528: tx_status = sis_priv->tx_ring[entry].cmdsts; ! 1529: ! 1530: if (tx_status & OWN) { ! 1531: /* The packet is not transmitted yet (owned by hardware) ! ! 1532: Note: the interrupt is generated only when Tx Machine ! 1533: is idle, so this is an almost impossible case */ ! 1534: break; ! 1535: } ! 1536: ! 1537: if (tx_status & (ABORT | UNDERRUN | OWCOLL)) { ! 1538: /* packet unsuccessfully transmitted */ ! 1539: if (sis900_debug > 4) ! 1540: printk(KERN_INFO "%s: Transmit " ! 1541: "error, Tx status %8.8x.\n", ! 1542: net_dev->name, tx_status); ! 1543: sis_priv->stats.tx_errors++; ! 1544: if (tx_status & UNDERRUN) ! 1545: sis_priv->stats.tx_fifo_errors++; ! 1546: if (tx_status & ABORT) ! 1547: sis_priv->stats.tx_aborted_errors++; ! 1548: if (tx_status & NOCARRIER) ! 1549: sis_priv->stats.tx_carrier_errors++; ! 1550: if (tx_status & OWCOLL) ! 1551: sis_priv->stats.tx_window_errors++; ! 1552: } else { ! 1553: /* packet successfully transmitted */ ! 1554: sis_priv->stats.collisions += (tx_status & COLCNT) >> 16; ! 1555: /* sis_priv->stats.tx_bytes += tx_status & DSIZE;*/ ! 1556: sis_priv->stats.tx_packets++; ! 1557: } ! 1558: /* Free the original skb. */ ! 1559: dev_free_skb(sis_priv->tx_skbuff[entry]); ! 1560: sis_priv->tx_skbuff[entry] = NULL; ! 1561: sis_priv->tx_ring[entry].bufptr = 0; ! 1562: sis_priv->tx_ring[entry].cmdsts = 0; ! 1563: } ! 1564: ! 1565: if (sis_priv->tx_full && net_dev->tbusy && ! 1566: sis_priv->cur_tx - sis_priv->dirty_tx < NUM_TX_DESC - 4) { ! 1567: /* The ring is no longer full, clear tbusy, tx_full and ! 1568: schedule more transmission by marking NET_BH */ ! 1569: sis_priv->tx_full = 0; ! 1570: clear_bit(0, (void *)&net_dev->tbusy); ! 1571: mark_bh(NET_BH); ! 1572: } ! 1573: } ! 1574: ! 1575: static int ! 1576: sis900_close(struct device *net_dev) ! 1577: { ! 1578: long ioaddr = net_dev->base_addr; ! 1579: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1580: int i; ! 1581: ! 1582: net_dev->start = 0; ! 1583: net_dev->tbusy = 1; ! 1584: ! 1585: /* Disable interrupts by clearing the interrupt mask. */ ! 1586: outl(0x0000, ioaddr + imr); ! 1587: outl(0x0000, ioaddr + ier); ! 1588: ! 1589: /* Stop the chip's Tx and Rx Status Machine */ ! 1590: outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr); ! 1591: ! 1592: del_timer(&sis_priv->timer); ! 1593: ! 1594: free_irq(net_dev->irq, net_dev); ! 1595: ! 1596: /* Free Tx and RX skbuff */ ! 1597: for (i = 0; i < NUM_RX_DESC; i++) { ! 1598: if (sis_priv->rx_skbuff[i] != NULL) ! 1599: dev_free_skb(sis_priv->rx_skbuff[i]); ! 1600: sis_priv->rx_skbuff[i] = 0; ! 1601: } ! 1602: for (i = 0; i < NUM_TX_DESC; i++) { ! 1603: if (sis_priv->tx_skbuff[i] != NULL) ! 1604: dev_free_skb(sis_priv->tx_skbuff[i]); ! 1605: sis_priv->tx_skbuff[i] = 0; ! 1606: } ! 1607: ! 1608: /* Green! Put the chip in low-power mode. */ ! 1609: ! 1610: MOD_DEC_USE_COUNT; ! 1611: ! 1612: return 0; ! 1613: } ! 1614: ! 1615: static int mii_ioctl(struct device *net_dev, struct ifreq *rq, int cmd) ! 1616: { ! 1617: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1618: u16 *data = (u16 *)&rq->ifr_data; ! 1619: ! 1620: switch(cmd) { ! 1621: case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ ! 1622: data[0] = sis_priv->mii->phy_addr; ! 1623: /* Fall Through */ ! 1624: case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ ! 1625: data[3] = mdio_read(net_dev, data[0] & 0x1f, data[1] & 0x1f); ! 1626: return 0; ! 1627: case SIOCDEVPRIVATE+2: /* Write the specified MII register */ ! 1628: if (!suser()) ! 1629: return -EPERM; ! 1630: mdio_write(net_dev, data[0] & 0x1f, data[1] & 0x1f, data[2]); ! 1631: return 0; ! 1632: default: ! 1633: return -EOPNOTSUPP; ! 1634: } ! 1635: } ! 1636: ! 1637: static struct enet_statistics * ! 1638: sis900_get_stats(struct device *net_dev) ! 1639: { ! 1640: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1641: ! 1642: return &sis_priv->stats; ! 1643: } ! 1644: ! 1645: ! 1646: /* SiS 900 uses the most sigificant 7 bits to index a 128 bits multicast ! 1647: * hash table, which makes this function a little bit different from other drivers ! 1648: * SiS 900 B0 & 635 M/B uses the most significat 8 bits to index 256 bits ! 1649: * multicast hash table. ! 1650: */ ! 1651: static u16 sis900_compute_hashtable_index(u8 *addr, u8 revision) ! 1652: { ! 1653: ! 1654: /* what is the correct value of the POLYNOMIAL ?? ! 1655: Donald Becker use 0x04C11DB7U ! 1656: Joseph Zbiciak [email protected] gives me the ! 1657: correct answer, thank you Joe !! */ ! 1658: #define POLYNOMIAL 0x04C11DB7L ! 1659: u32 crc = 0xffffffff, msb; ! 1660: int i, j; ! 1661: u32 byte; ! 1662: ! 1663: for (i = 0; i < 6; i++) { ! 1664: byte = *addr++; ! 1665: for (j = 0; j < 8; j++) { ! 1666: msb = crc >> 31; ! 1667: crc <<= 1; ! 1668: if (msb ^ (byte & 1)) { ! 1669: crc ^= POLYNOMIAL; ! 1670: } ! 1671: byte >>= 1; ! 1672: } ! 1673: } ! 1674: ! 1675: /* leave 8 or 7 most siginifant bits */ ! 1676: if((revision >= SIS635A_900_REV) || (revision == SIS900B_900_REV)) ! 1677: return ((int)(crc >> 24)); ! 1678: else ! 1679: return ((int)(crc >> 25)); ! 1680: } ! 1681: ! 1682: static void set_rx_mode(struct device *net_dev) ! 1683: { ! 1684: long ioaddr = net_dev->base_addr; ! 1685: struct sis900_private * sis_priv = (struct sis900_private *)net_dev->priv; ! 1686: u16 mc_filter[16] = {0}; /* 256/128 bits multicast hash table */ ! 1687: int i, table_entries; ! 1688: u32 rx_mode; ! 1689: u8 revision; ! 1690: ! 1691: /* 635 Hash Table entires = 256(2^16) */ ! 1692: pcibios_read_config_byte(sis_priv->pci_bus, sis_priv->pci_device_fn, PCI_CLASS_REVISION, &revision); ! 1693: if((revision >= SIS635A_900_REV) || (revision == SIS900B_900_REV)) ! 1694: table_entries = 16; ! 1695: else ! 1696: table_entries = 8; ! 1697: ! 1698: if (net_dev->flags & IFF_PROMISC) { ! 1699: /* Accept any kinds of packets */ ! 1700: rx_mode = RFPromiscuous; ! 1701: for (i = 0; i < table_entries; i++) ! 1702: mc_filter[i] = 0xffff; ! 1703: } else if ((net_dev->mc_count > multicast_filter_limit) || ! 1704: (net_dev->flags & IFF_ALLMULTI)) { ! 1705: /* too many multicast addresses or accept all multicast packets */ ! 1706: rx_mode = RFAAB | RFAAM; ! 1707: for (i = 0; i < table_entries; i++) ! 1708: mc_filter[i] = 0xffff; ! 1709: } else { ! 1710: /* Accept Broadcast packets, destination addresses match our MAC address, ! 1711: use Receive Filter to reject unwanted MCAST packets */ ! 1712: struct dev_mc_list *mclist; ! 1713: rx_mode = RFAAB; ! 1714: for (i = 0, mclist = net_dev->mc_list; mclist && i < net_dev->mc_count; ! 1715: i++, mclist = mclist->next) ! 1716: set_bit(sis900_compute_hashtable_index(mclist->dmi_addr, revision), ! 1717: mc_filter); ! 1718: } ! 1719: ! 1720: /* update Multicast Hash Table in Receive Filter */ ! 1721: for (i = 0; i < table_entries; i++) { ! 1722: /* why plus 0x04 ??, That makes the correct value for hash table. */ ! 1723: outl((u32)(0x00000004+i) << RFADDR_shift, ioaddr + rfcr); ! 1724: outl(mc_filter[i], ioaddr + rfdr); ! 1725: } ! 1726: ! 1727: outl(RFEN | rx_mode, ioaddr + rfcr); ! 1728: ! 1729: /* sis900 is capatable of looping back packet at MAC level for debugging purpose */ ! 1730: if (net_dev->flags & IFF_LOOPBACK) { ! 1731: u32 cr_saved; ! 1732: /* We must disable Tx/Rx before setting loopback mode */ ! 1733: cr_saved = inl(ioaddr + cr); ! 1734: outl(cr_saved | TxDIS | RxDIS, ioaddr + cr); ! 1735: /* enable loopback */ ! 1736: outl(inl(ioaddr + txcfg) | TxMLB, ioaddr + txcfg); ! 1737: outl(inl(ioaddr + rxcfg) | RxATX, ioaddr + rxcfg); ! 1738: /* restore cr */ ! 1739: outl(cr_saved, ioaddr + cr); ! 1740: } ! 1741: ! 1742: return; ! 1743: } ! 1744: ! 1745: static void sis900_reset(struct device *net_dev) ! 1746: { ! 1747: long ioaddr = net_dev->base_addr; ! 1748: struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; ! 1749: int i = 0; ! 1750: u8 revision; ! 1751: u32 status = TxRCMP | RxRCMP; ! 1752: ! 1753: outl(0, ioaddr + ier); ! 1754: outl(0, ioaddr + imr); ! 1755: outl(0, ioaddr + rfcr); ! 1756: ! 1757: outl(RxRESET | TxRESET | RESET | inl(ioaddr + cr), ioaddr + cr); ! 1758: ! 1759: /* Check that the chip has finished the reset. */ ! 1760: while (status && (i++ < 1000)) { ! 1761: status ^= (inl(isr + ioaddr) & status); ! 1762: } ! 1763: ! 1764: pcibios_read_config_byte(sis_priv->pci_bus, sis_priv->pci_device_fn, PCI_CLASS_REVISION, &revision); ! 1765: if( (revision >= SIS635A_900_REV) || (revision == SIS900B_900_REV) ) ! 1766: outl(PESEL | RND_CNT, ioaddr + cfg); ! 1767: else ! 1768: outl(PESEL, ioaddr + cfg); ! 1769: } ! 1770: ! 1771: #ifdef MODULE ! 1772: int init_module(void) ! 1773: { ! 1774: return sis900_probe(NULL); ! 1775: } ! 1776: ! 1777: void ! 1778: cleanup_module(void) ! 1779: { ! 1780: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */ ! 1781: while (root_sis900_dev) { ! 1782: struct sis900_private *sis_priv = ! 1783: (struct sis900_private *)root_sis900_dev->priv; ! 1784: struct device *next_dev = sis_priv->next_module; ! 1785: struct mii_phy *phy = NULL; ! 1786: ! 1787: while(sis_priv->first_mii){ ! 1788: phy = sis_priv->first_mii; ! 1789: sis_priv->first_mii = phy->next; ! 1790: kfree(phy); ! 1791: } ! 1792: ! 1793: unregister_netdev(root_sis900_dev); ! 1794: release_region(root_sis900_dev->base_addr, ! 1795: sis_priv->mac->io_size); ! 1796: kfree(sis_priv); ! 1797: kfree(root_sis900_dev); ! 1798: ! 1799: root_sis900_dev = next_dev; ! 1800: } ! 1801: } ! 1802: ! 1803: #endif /* MODULE */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.