Annotation of Gnu-Mach/linux/src/drivers/net/sis900.c, revision 1.1.1.1

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, &reg);
                    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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.