2    sis190.c: Silicon Integrated Systems SiS190 ethernet driver
 
   4    Copyright (c) 2003 K.M. Liu <kmliu@sis.com>
 
   5    Copyright (c) 2003, 2004 Jeff Garzik <jgarzik@pobox.com>
 
   6    Copyright (c) 2003, 2004, 2005 Francois Romieu <romieu@fr.zoreil.com>
 
   8    Based on r8169.c, tg3.c, 8139cp.c, skge.c, epic100.c and SiS 190/191
 
  11    This software may be used and distributed according to the terms of
 
  12    the GNU General Public License (GPL), incorporated herein by reference.
 
  13    Drivers based on or derived from this code fall under the GPL and must
 
  14    retain the authorship, copyright and license notice.  This file is not
 
  15    a complete program and may only be used when the entire operating
 
  16    system is licensed under the GPL.
 
  18    See the file COPYING in this distribution for more information.
 
  22 #include <linux/module.h>
 
  23 #include <linux/moduleparam.h>
 
  24 #include <linux/netdevice.h>
 
  25 #include <linux/rtnetlink.h>
 
  26 #include <linux/etherdevice.h>
 
  27 #include <linux/ethtool.h>
 
  28 #include <linux/pci.h>
 
  29 #include <linux/mii.h>
 
  30 #include <linux/delay.h>
 
  31 #include <linux/crc32.h>
 
  32 #include <linux/dma-mapping.h>
 
  35 #define net_drv(p, arg...)      if (netif_msg_drv(p)) \
 
  37 #define net_probe(p, arg...)    if (netif_msg_probe(p)) \
 
  39 #define net_link(p, arg...)     if (netif_msg_link(p)) \
 
  41 #define net_intr(p, arg...)     if (netif_msg_intr(p)) \
 
  43 #define net_tx_err(p, arg...)   if (netif_msg_tx_err(p)) \
 
  46 #define PHY_MAX_ADDR            32
 
  47 #define PHY_ID_ANY              0x1f
 
  48 #define MII_REG_ANY             0x1f
 
  50 #define DRV_VERSION             "1.2"
 
  51 #define DRV_NAME                "sis190"
 
  52 #define SIS190_DRIVER_NAME      DRV_NAME " Gigabit Ethernet driver " DRV_VERSION
 
  53 #define PFX DRV_NAME ": "
 
  55 #define sis190_rx_skb                   netif_rx
 
  56 #define sis190_rx_quota(count, quota)   count
 
  58 #define MAC_ADDR_LEN            6
 
  60 #define NUM_TX_DESC             64      /* [8..1024] */
 
  61 #define NUM_RX_DESC             64      /* [8..8192] */
 
  62 #define TX_RING_BYTES           (NUM_TX_DESC * sizeof(struct TxDesc))
 
  63 #define RX_RING_BYTES           (NUM_RX_DESC * sizeof(struct RxDesc))
 
  64 #define RX_BUF_SIZE             1536
 
  65 #define RX_BUF_MASK             0xfff8
 
  67 #define SIS190_REGS_SIZE        0x80
 
  68 #define SIS190_TX_TIMEOUT       (6*HZ)
 
  69 #define SIS190_PHY_TIMEOUT      (10*HZ)
 
  70 #define SIS190_MSG_DEFAULT      (NETIF_MSG_DRV | NETIF_MSG_PROBE | \
 
  71                                  NETIF_MSG_LINK | NETIF_MSG_IFUP | \
 
  74 /* Enhanced PHY access register bit definitions */
 
  75 #define EhnMIIread              0x0000
 
  76 #define EhnMIIwrite             0x0020
 
  77 #define EhnMIIdataShift         16
 
  78 #define EhnMIIpmdShift          6       /* 7016 only */
 
  79 #define EhnMIIregShift          11
 
  80 #define EhnMIIreq               0x0010
 
  81 #define EhnMIInotDone           0x0010
 
  83 /* Write/read MMIO register */
 
  84 #define SIS_W8(reg, val)        writeb ((val), ioaddr + (reg))
 
  85 #define SIS_W16(reg, val)       writew ((val), ioaddr + (reg))
 
  86 #define SIS_W32(reg, val)       writel ((val), ioaddr + (reg))
 
  87 #define SIS_R8(reg)             readb (ioaddr + (reg))
 
  88 #define SIS_R16(reg)            readw (ioaddr + (reg))
 
  89 #define SIS_R32(reg)            readl (ioaddr + (reg))
 
  91 #define SIS_PCI_COMMIT()        SIS_R32(IntrControl)
 
  93 enum sis190_registers {
 
  95         TxDescStartAddr         = 0x04,
 
  96         rsv0                    = 0x08, // reserved
 
  97         TxSts                   = 0x0c, // unused (Control/Status)
 
  99         RxDescStartAddr         = 0x14,
 
 100         rsv1                    = 0x18, // reserved
 
 101         RxSts                   = 0x1c, // unused
 
 105         IntrTimer               = 0x2c, // unused (Interupt Timer)
 
 106         PMControl               = 0x30, // unused (Power Mgmt Control/Status)
 
 107         rsv2                    = 0x34, // reserved
 
 110         StationControl          = 0x40,
 
 112         GIoCR                   = 0x48, // unused (GMAC IO Compensation)
 
 113         GIoCtrl                 = 0x4c, // unused (GMAC IO Control)
 
 115         TxLimit                 = 0x54, // unused (Tx MAC Timer/TryLimit)
 
 116         RGDelay                 = 0x58, // unused (RGMII Tx Internal Delay)
 
 117         rsv3                    = 0x5c, // reserved
 
 121         // Undocumented         = 0x6c,
 
 123         RxWolData               = 0x74, // unused (Rx WOL Data Access)
 
 124         RxMPSControl            = 0x78, // unused (Rx MPS Control)
 
 125         rsv4                    = 0x7c, // reserved
 
 128 enum sis190_register_content {
 
 130         SoftInt                 = 0x40000000,   // unused
 
 131         Timeup                  = 0x20000000,   // unused
 
 132         PauseFrame              = 0x00080000,   // unused
 
 133         MagicPacket             = 0x00040000,   // unused
 
 134         WakeupFrame             = 0x00020000,   // unused
 
 135         LinkChange              = 0x00010000,
 
 136         RxQEmpty                = 0x00000080,
 
 138         TxQ1Empty               = 0x00000020,   // unused
 
 139         TxQ1Int                 = 0x00000010,
 
 140         TxQ0Empty               = 0x00000008,   // unused
 
 141         TxQ0Int                 = 0x00000004,
 
 147         CmdRxEnb                = 0x08,         // unused
 
 149         RxBufEmpty              = 0x01,         // unused
 
 152         Cfg9346_Lock            = 0x00,         // unused
 
 153         Cfg9346_Unlock          = 0xc0,         // unused
 
 156         AcceptErr               = 0x20,         // unused
 
 157         AcceptRunt              = 0x10,         // unused
 
 158         AcceptBroadcast         = 0x0800,
 
 159         AcceptMulticast         = 0x0400,
 
 160         AcceptMyPhys            = 0x0200,
 
 161         AcceptAllPhys           = 0x0100,
 
 165         RxCfgDMAShift           = 8,            // 0x1a in RxControl ?
 
 168         TxInterFrameGapShift    = 24,
 
 169         TxDMAShift              = 8, /* DMA burst value (0-7) is shift this many bits */
 
 171         LinkStatus              = 0x02,         // unused
 
 172         FullDup                 = 0x01,         // unused
 
 175         TBILinkOK               = 0x02000000,   // unused
 
 192 enum _DescStatusBit {
 
 194         OWNbit          = 0x80000000, // RXOWN/TXOWN
 
 195         INTbit          = 0x40000000, // RXINT/TXINT
 
 196         CRCbit          = 0x00020000, // CRCOFF/CRCEN
 
 197         PADbit          = 0x00010000, // PREADD/PADEN
 
 199         RingEnd         = 0x80000000,
 
 201         LSEN            = 0x08000000, // TSO ? -- FR
 
 220         ColCountMask    = 0x0000ffff,
 
 234         RxDescCountMask = 0x7f000000, // multi-desc pkt when > 1 ? -- FR
 
 243         RxSizeMask      = 0x0000ffff
 
 245          * The asic could apparently do vlan, TSO, jumbo (sis191 only) and
 
 246          * provide two (unused with Linux) Tx queues. No publically
 
 247          * available documentation alas.
 
 251 enum sis190_eeprom_access_register_bits {
 
 252         EECS    = 0x00000001,   // unused
 
 253         EECLK   = 0x00000002,   // unused
 
 254         EEDO    = 0x00000008,   // unused
 
 255         EEDI    = 0x00000004,   // unused
 
 258         EEWOP   = 0x00000100    // unused
 
 261 /* EEPROM Addresses */
 
 262 enum sis190_eeprom_address {
 
 263         EEPROMSignature = 0x00,
 
 264         EEPROMCLK       = 0x01, // unused
 
 269 enum sis190_feature {
 
 275 struct sis190_private {
 
 276         void __iomem *mmio_addr;
 
 277         struct pci_dev *pci_dev;
 
 278         struct net_device *dev;
 
 287         struct RxDesc *RxDescRing;
 
 288         struct TxDesc *TxDescRing;
 
 289         struct sk_buff *Rx_skbuff[NUM_RX_DESC];
 
 290         struct sk_buff *Tx_skbuff[NUM_TX_DESC];
 
 291         struct work_struct phy_task;
 
 292         struct timer_list timer;
 
 294         struct mii_if_info mii_if;
 
 295         struct list_head first_phy;
 
 300         struct list_head list;
 
 307 enum sis190_phy_type {
 
 314 static struct mii_chip_info {
 
 319 } mii_chip_table[] = {
 
 320         { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 },
 
 321         { "Broadcom PHY AC131",   { 0x0143, 0xbc70 }, LAN, 0 },
 
 322         { "Agere PHY ET1101B",    { 0x0282, 0xf010 }, LAN, 0 },
 
 323         { "Marvell PHY 88E1111",  { 0x0141, 0x0cc0 }, LAN, F_PHY_88E1111 },
 
 324         { "Realtek PHY RTL8201",  { 0x0000, 0x8200 }, LAN, 0 },
 
 328 static const struct {
 
 330 } sis_chip_info[] = {
 
 331         { "SiS 190 PCI Fast Ethernet adapter" },
 
 332         { "SiS 191 PCI Gigabit Ethernet adapter" },
 
 335 static struct pci_device_id sis190_pci_tbl[] = {
 
 336         { PCI_DEVICE(PCI_VENDOR_ID_SI, 0x0190), 0, 0, 0 },
 
 337         { PCI_DEVICE(PCI_VENDOR_ID_SI, 0x0191), 0, 0, 1 },
 
 341 MODULE_DEVICE_TABLE(pci, sis190_pci_tbl);
 
 343 static int rx_copybreak = 200;
 
 349 MODULE_DESCRIPTION("SiS sis190 Gigabit Ethernet driver");
 
 350 module_param(rx_copybreak, int, 0);
 
 351 MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
 
 352 module_param_named(debug, debug.msg_enable, int, 0);
 
 353 MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
 
 354 MODULE_AUTHOR("K.M. Liu <kmliu@sis.com>, Ueimor <romieu@fr.zoreil.com>");
 
 355 MODULE_VERSION(DRV_VERSION);
 
 356 MODULE_LICENSE("GPL");
 
 358 static const u32 sis190_intr_mask =
 
 359         RxQEmpty | RxQInt | TxQ1Int | TxQ0Int | RxHalt | TxHalt | LinkChange;
 
 362  * Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
 
 363  * The chips use a 64 element hash table based on the Ethernet CRC.
 
 365 static const int multicast_filter_limit = 32;
 
 367 static void __mdio_cmd(void __iomem *ioaddr, u32 ctl)
 
 371         SIS_W32(GMIIControl, ctl);
 
 375         for (i = 0; i < 100; i++) {
 
 376                 if (!(SIS_R32(GMIIControl) & EhnMIInotDone))
 
 382                 printk(KERN_ERR PFX "PHY command failed !\n");
 
 385 static void mdio_write(void __iomem *ioaddr, int phy_id, int reg, int val)
 
 387         __mdio_cmd(ioaddr, EhnMIIreq | EhnMIIwrite |
 
 388                 (((u32) reg) << EhnMIIregShift) | (phy_id << EhnMIIpmdShift) |
 
 389                 (((u32) val) << EhnMIIdataShift));
 
 392 static int mdio_read(void __iomem *ioaddr, int phy_id, int reg)
 
 394         __mdio_cmd(ioaddr, EhnMIIreq | EhnMIIread |
 
 395                 (((u32) reg) << EhnMIIregShift) | (phy_id << EhnMIIpmdShift));
 
 397         return (u16) (SIS_R32(GMIIControl) >> EhnMIIdataShift);
 
 400 static void __mdio_write(struct net_device *dev, int phy_id, int reg, int val)
 
 402         struct sis190_private *tp = netdev_priv(dev);
 
 404         mdio_write(tp->mmio_addr, phy_id, reg, val);
 
 407 static int __mdio_read(struct net_device *dev, int phy_id, int reg)
 
 409         struct sis190_private *tp = netdev_priv(dev);
 
 411         return mdio_read(tp->mmio_addr, phy_id, reg);
 
 414 static u16 mdio_read_latched(void __iomem *ioaddr, int phy_id, int reg)
 
 416         mdio_read(ioaddr, phy_id, reg);
 
 417         return mdio_read(ioaddr, phy_id, reg);
 
 420 static u16 __devinit sis190_read_eeprom(void __iomem *ioaddr, u32 reg)
 
 425         if (!(SIS_R32(ROMControl) & 0x0002))
 
 428         SIS_W32(ROMInterface, EEREQ | EEROP | (reg << 10));
 
 430         for (i = 0; i < 200; i++) {
 
 431                 if (!(SIS_R32(ROMInterface) & EEREQ)) {
 
 432                         data = (SIS_R32(ROMInterface) & 0xffff0000) >> 16;
 
 441 static void sis190_irq_mask_and_ack(void __iomem *ioaddr)
 
 443         SIS_W32(IntrMask, 0x00);
 
 444         SIS_W32(IntrStatus, 0xffffffff);
 
 448 static void sis190_asic_down(void __iomem *ioaddr)
 
 450         /* Stop the chip's Tx and Rx DMA processes. */
 
 452         SIS_W32(TxControl, 0x1a00);
 
 453         SIS_W32(RxControl, 0x1a00);
 
 455         sis190_irq_mask_and_ack(ioaddr);
 
 458 static void sis190_mark_as_last_descriptor(struct RxDesc *desc)
 
 460         desc->size |= cpu_to_le32(RingEnd);
 
 463 static inline void sis190_give_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
 
 465         u32 eor = le32_to_cpu(desc->size) & RingEnd;
 
 468         desc->size = cpu_to_le32((rx_buf_sz & RX_BUF_MASK) | eor);
 
 470         desc->status = cpu_to_le32(OWNbit | INTbit);
 
 473 static inline void sis190_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
 
 476         desc->addr = cpu_to_le32(mapping);
 
 477         sis190_give_to_asic(desc, rx_buf_sz);
 
 480 static inline void sis190_make_unusable_by_asic(struct RxDesc *desc)
 
 483         desc->addr = cpu_to_le32(0xdeadbeef);
 
 484         desc->size &= cpu_to_le32(RingEnd);
 
 489 static struct sk_buff *sis190_alloc_rx_skb(struct sis190_private *tp,
 
 492         u32 rx_buf_sz = tp->rx_buf_sz;
 
 495         skb = netdev_alloc_skb(tp->dev, rx_buf_sz);
 
 499                 mapping = pci_map_single(tp->pci_dev, skb->data, tp->rx_buf_sz,
 
 501                 sis190_map_to_asic(desc, mapping, rx_buf_sz);
 
 503                 sis190_make_unusable_by_asic(desc);
 
 508 static u32 sis190_rx_fill(struct sis190_private *tp, struct net_device *dev,
 
 513         for (cur = start; cur < end; cur++) {
 
 514                 unsigned int i = cur % NUM_RX_DESC;
 
 516                 if (tp->Rx_skbuff[i])
 
 519                 tp->Rx_skbuff[i] = sis190_alloc_rx_skb(tp, tp->RxDescRing + i);
 
 521                 if (!tp->Rx_skbuff[i])
 
 527 static bool sis190_try_rx_copy(struct sis190_private *tp,
 
 528                                struct sk_buff **sk_buff, int pkt_size,
 
 534         if (pkt_size >= rx_copybreak)
 
 537         skb = netdev_alloc_skb(tp->dev, pkt_size + 2);
 
 541         pci_dma_sync_single_for_device(tp->pci_dev, addr, pkt_size,
 
 544         skb_copy_to_linear_data(skb, sk_buff[0]->data, pkt_size);
 
 551 static inline int sis190_rx_pkt_err(u32 status, struct net_device_stats *stats)
 
 553 #define ErrMask (OVRUN | SHORT | LIMIT | MIIER | NIBON | COLON | ABORT)
 
 555         if ((status & CRCOK) && !(status & ErrMask))
 
 558         if (!(status & CRCOK))
 
 559                 stats->rx_crc_errors++;
 
 560         else if (status & OVRUN)
 
 561                 stats->rx_over_errors++;
 
 562         else if (status & (SHORT | LIMIT))
 
 563                 stats->rx_length_errors++;
 
 564         else if (status & (MIIER | NIBON | COLON))
 
 565                 stats->rx_frame_errors++;
 
 571 static int sis190_rx_interrupt(struct net_device *dev,
 
 572                                struct sis190_private *tp, void __iomem *ioaddr)
 
 574         struct net_device_stats *stats = &dev->stats;
 
 575         u32 rx_left, cur_rx = tp->cur_rx;
 
 578         rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
 
 579         rx_left = sis190_rx_quota(rx_left, (u32) dev->quota);
 
 581         for (; rx_left > 0; rx_left--, cur_rx++) {
 
 582                 unsigned int entry = cur_rx % NUM_RX_DESC;
 
 583                 struct RxDesc *desc = tp->RxDescRing + entry;
 
 586                 if (le32_to_cpu(desc->status) & OWNbit)
 
 589                 status = le32_to_cpu(desc->PSize);
 
 591                 // net_intr(tp, KERN_INFO "%s: Rx PSize = %08x.\n", dev->name,
 
 594                 if (sis190_rx_pkt_err(status, stats) < 0)
 
 595                         sis190_give_to_asic(desc, tp->rx_buf_sz);
 
 597                         struct sk_buff *skb = tp->Rx_skbuff[entry];
 
 598                         dma_addr_t addr = le32_to_cpu(desc->addr);
 
 599                         int pkt_size = (status & RxSizeMask) - 4;
 
 600                         struct pci_dev *pdev = tp->pci_dev;
 
 602                         if (unlikely(pkt_size > tp->rx_buf_sz)) {
 
 603                                 net_intr(tp, KERN_INFO
 
 604                                          "%s: (frag) status = %08x.\n",
 
 607                                 stats->rx_length_errors++;
 
 608                                 sis190_give_to_asic(desc, tp->rx_buf_sz);
 
 613                         if (sis190_try_rx_copy(tp, &skb, pkt_size, addr)) {
 
 614                                 pci_dma_sync_single_for_device(pdev, addr,
 
 615                                         tp->rx_buf_sz, PCI_DMA_FROMDEVICE);
 
 616                                 sis190_give_to_asic(desc, tp->rx_buf_sz);
 
 618                                 pci_unmap_single(pdev, addr, tp->rx_buf_sz,
 
 620                                 tp->Rx_skbuff[entry] = NULL;
 
 621                                 sis190_make_unusable_by_asic(desc);
 
 624                         skb_put(skb, pkt_size);
 
 625                         skb->protocol = eth_type_trans(skb, dev);
 
 629                         dev->last_rx = jiffies;
 
 631                         stats->rx_bytes += pkt_size;
 
 632                         if ((status & BCAST) == MCAST)
 
 636         count = cur_rx - tp->cur_rx;
 
 639         delta = sis190_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
 
 640         if (!delta && count && netif_msg_intr(tp))
 
 641                 printk(KERN_INFO "%s: no Rx buffer allocated.\n", dev->name);
 
 642         tp->dirty_rx += delta;
 
 644         if (((tp->dirty_rx + NUM_RX_DESC) == tp->cur_rx) && netif_msg_intr(tp))
 
 645                 printk(KERN_EMERG "%s: Rx buffers exhausted.\n", dev->name);
 
 650 static void sis190_unmap_tx_skb(struct pci_dev *pdev, struct sk_buff *skb,
 
 655         len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
 
 657         pci_unmap_single(pdev, le32_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
 
 659         memset(desc, 0x00, sizeof(*desc));
 
 662 static inline int sis190_tx_pkt_err(u32 status, struct net_device_stats *stats)
 
 664 #define TxErrMask       (WND | TABRT | FIFO | LINK)
 
 666         if (!unlikely(status & TxErrMask))
 
 670                 stats->tx_window_errors++;
 
 672                 stats->tx_aborted_errors++;
 
 674                 stats->tx_fifo_errors++;
 
 676                 stats->tx_carrier_errors++;
 
 683 static void sis190_tx_interrupt(struct net_device *dev,
 
 684                                 struct sis190_private *tp, void __iomem *ioaddr)
 
 686         struct net_device_stats *stats = &dev->stats;
 
 687         u32 pending, dirty_tx = tp->dirty_tx;
 
 689          * It would not be needed if queueing was allowed to be enabled
 
 690          * again too early (hint: think preempt and unclocked smp systems).
 
 692         unsigned int queue_stopped;
 
 695         pending = tp->cur_tx - dirty_tx;
 
 696         queue_stopped = (pending == NUM_TX_DESC);
 
 698         for (; pending; pending--, dirty_tx++) {
 
 699                 unsigned int entry = dirty_tx % NUM_TX_DESC;
 
 700                 struct TxDesc *txd = tp->TxDescRing + entry;
 
 701                 u32 status = le32_to_cpu(txd->status);
 
 707                 skb = tp->Tx_skbuff[entry];
 
 709                 if (likely(sis190_tx_pkt_err(status, stats) == 0)) {
 
 711                         stats->tx_bytes += skb->len;
 
 712                         stats->collisions += ((status & ColCountMask) - 1);
 
 715                 sis190_unmap_tx_skb(tp->pci_dev, skb, txd);
 
 716                 tp->Tx_skbuff[entry] = NULL;
 
 717                 dev_kfree_skb_irq(skb);
 
 720         if (tp->dirty_tx != dirty_tx) {
 
 721                 tp->dirty_tx = dirty_tx;
 
 724                         netif_wake_queue(dev);
 
 729  * The interrupt handler does all of the Rx thread work and cleans up after
 
 732 static irqreturn_t sis190_interrupt(int irq, void *__dev)
 
 734         struct net_device *dev = __dev;
 
 735         struct sis190_private *tp = netdev_priv(dev);
 
 736         void __iomem *ioaddr = tp->mmio_addr;
 
 737         unsigned int handled = 0;
 
 740         status = SIS_R32(IntrStatus);
 
 742         if ((status == 0xffffffff) || !status)
 
 747         if (unlikely(!netif_running(dev))) {
 
 748                 sis190_asic_down(ioaddr);
 
 752         SIS_W32(IntrStatus, status);
 
 754         // net_intr(tp, KERN_INFO "%s: status = %08x.\n", dev->name, status);
 
 756         if (status & LinkChange) {
 
 757                 net_intr(tp, KERN_INFO "%s: link change.\n", dev->name);
 
 758                 schedule_work(&tp->phy_task);
 
 762                 sis190_rx_interrupt(dev, tp, ioaddr);
 
 764         if (status & TxQ0Int)
 
 765                 sis190_tx_interrupt(dev, tp, ioaddr);
 
 767         return IRQ_RETVAL(handled);
 
 770 #ifdef CONFIG_NET_POLL_CONTROLLER
 
 771 static void sis190_netpoll(struct net_device *dev)
 
 773         struct sis190_private *tp = netdev_priv(dev);
 
 774         struct pci_dev *pdev = tp->pci_dev;
 
 776         disable_irq(pdev->irq);
 
 777         sis190_interrupt(pdev->irq, dev);
 
 778         enable_irq(pdev->irq);
 
 782 static void sis190_free_rx_skb(struct sis190_private *tp,
 
 783                                struct sk_buff **sk_buff, struct RxDesc *desc)
 
 785         struct pci_dev *pdev = tp->pci_dev;
 
 787         pci_unmap_single(pdev, le32_to_cpu(desc->addr), tp->rx_buf_sz,
 
 789         dev_kfree_skb(*sk_buff);
 
 791         sis190_make_unusable_by_asic(desc);
 
 794 static void sis190_rx_clear(struct sis190_private *tp)
 
 798         for (i = 0; i < NUM_RX_DESC; i++) {
 
 799                 if (!tp->Rx_skbuff[i])
 
 801                 sis190_free_rx_skb(tp, tp->Rx_skbuff + i, tp->RxDescRing + i);
 
 805 static void sis190_init_ring_indexes(struct sis190_private *tp)
 
 807         tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
 
 810 static int sis190_init_ring(struct net_device *dev)
 
 812         struct sis190_private *tp = netdev_priv(dev);
 
 814         sis190_init_ring_indexes(tp);
 
 816         memset(tp->Tx_skbuff, 0x0, NUM_TX_DESC * sizeof(struct sk_buff *));
 
 817         memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
 
 819         if (sis190_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
 
 822         sis190_mark_as_last_descriptor(tp->RxDescRing + NUM_RX_DESC - 1);
 
 831 static void sis190_set_rx_mode(struct net_device *dev)
 
 833         struct sis190_private *tp = netdev_priv(dev);
 
 834         void __iomem *ioaddr = tp->mmio_addr;
 
 836         u32 mc_filter[2];       /* Multicast hash filter */
 
 839         if (dev->flags & IFF_PROMISC) {
 
 841                         AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
 
 843                 mc_filter[1] = mc_filter[0] = 0xffffffff;
 
 844         } else if ((dev->mc_count > multicast_filter_limit) ||
 
 845                    (dev->flags & IFF_ALLMULTI)) {
 
 846                 /* Too many to filter perfectly -- accept all multicasts. */
 
 847                 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
 
 848                 mc_filter[1] = mc_filter[0] = 0xffffffff;
 
 850                 struct dev_mc_list *mclist;
 
 853                 rx_mode = AcceptBroadcast | AcceptMyPhys;
 
 854                 mc_filter[1] = mc_filter[0] = 0;
 
 855                 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
 
 856                      i++, mclist = mclist->next) {
 
 858                                 ether_crc(ETH_ALEN, mclist->dmi_addr) & 0x3f;
 
 859                         mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
 
 860                         rx_mode |= AcceptMulticast;
 
 864         spin_lock_irqsave(&tp->lock, flags);
 
 866         SIS_W16(RxMacControl, rx_mode | 0x2);
 
 867         SIS_W32(RxHashTable, mc_filter[0]);
 
 868         SIS_W32(RxHashTable + 4, mc_filter[1]);
 
 870         spin_unlock_irqrestore(&tp->lock, flags);
 
 873 static void sis190_soft_reset(void __iomem *ioaddr)
 
 875         SIS_W32(IntrControl, 0x8000);
 
 877         SIS_W32(IntrControl, 0x0);
 
 878         sis190_asic_down(ioaddr);
 
 881 static void sis190_hw_start(struct net_device *dev)
 
 883         struct sis190_private *tp = netdev_priv(dev);
 
 884         void __iomem *ioaddr = tp->mmio_addr;
 
 886         sis190_soft_reset(ioaddr);
 
 888         SIS_W32(TxDescStartAddr, tp->tx_dma);
 
 889         SIS_W32(RxDescStartAddr, tp->rx_dma);
 
 891         SIS_W32(IntrStatus, 0xffffffff);
 
 892         SIS_W32(IntrMask, 0x0);
 
 893         SIS_W32(GMIIControl, 0x0);
 
 894         SIS_W32(TxMacControl, 0x60);
 
 895         SIS_W16(RxMacControl, 0x02);
 
 896         SIS_W32(RxHashTable, 0x0);
 
 898         SIS_W32(RxWolCtrl, 0x0);
 
 899         SIS_W32(RxWolData, 0x0);
 
 903         sis190_set_rx_mode(dev);
 
 905         /* Enable all known interrupts by setting the interrupt mask. */
 
 906         SIS_W32(IntrMask, sis190_intr_mask);
 
 908         SIS_W32(TxControl, 0x1a00 | CmdTxEnb);
 
 909         SIS_W32(RxControl, 0x1a1d);
 
 911         netif_start_queue(dev);
 
 914 static void sis190_phy_task(struct work_struct *work)
 
 916         struct sis190_private *tp =
 
 917                 container_of(work, struct sis190_private, phy_task);
 
 918         struct net_device *dev = tp->dev;
 
 919         void __iomem *ioaddr = tp->mmio_addr;
 
 920         int phy_id = tp->mii_if.phy_id;
 
 925         if (!netif_running(dev))
 
 928         val = mdio_read(ioaddr, phy_id, MII_BMCR);
 
 929         if (val & BMCR_RESET) {
 
 930                 // FIXME: needlessly high ?  -- FR 02/07/2005
 
 931                 mod_timer(&tp->timer, jiffies + HZ/10);
 
 932         } else if (!(mdio_read_latched(ioaddr, phy_id, MII_BMSR) &
 
 933                      BMSR_ANEGCOMPLETE)) {
 
 934                 netif_carrier_off(dev);
 
 935                 net_link(tp, KERN_WARNING "%s: auto-negotiating...\n",
 
 937                 mod_timer(&tp->timer, jiffies + SIS190_PHY_TIMEOUT);
 
 945                         { LPA_1000XFULL | LPA_SLCT, 0x07000c00 | 0x00001000,
 
 946                                 "1000 Mbps Full Duplex" },
 
 947                         { LPA_1000XHALF | LPA_SLCT, 0x07000c00,
 
 948                                 "1000 Mbps Half Duplex" },
 
 949                         { LPA_100FULL, 0x04000800 | 0x00001000,
 
 950                                 "100 Mbps Full Duplex" },
 
 951                         { LPA_100HALF, 0x04000800,
 
 952                                 "100 Mbps Half Duplex" },
 
 953                         { LPA_10FULL, 0x04000400 | 0x00001000,
 
 954                                 "10 Mbps Full Duplex" },
 
 955                         { LPA_10HALF, 0x04000400,
 
 956                                 "10 Mbps Half Duplex" },
 
 957                         { 0, 0x04000400, "unknown" }
 
 961                 val = mdio_read(ioaddr, phy_id, 0x1f);
 
 962                 net_link(tp, KERN_INFO "%s: mii ext = %04x.\n", dev->name, val);
 
 964                 val = mdio_read(ioaddr, phy_id, MII_LPA);
 
 965                 adv = mdio_read(ioaddr, phy_id, MII_ADVERTISE);
 
 966                 net_link(tp, KERN_INFO "%s: mii lpa = %04x adv = %04x.\n",
 
 967                          dev->name, val, adv);
 
 971                 for (p = reg31; p->val; p++) {
 
 972                         if ((val & p->val) == p->val)
 
 976                 p->ctl |= SIS_R32(StationControl) & ~0x0f001c00;
 
 978                 if ((tp->features & F_HAS_RGMII) &&
 
 979                     (tp->features & F_PHY_BCM5461)) {
 
 980                         // Set Tx Delay in RGMII mode.
 
 981                         mdio_write(ioaddr, phy_id, 0x18, 0xf1c7);
 
 983                         mdio_write(ioaddr, phy_id, 0x1c, 0x8c00);
 
 984                         p->ctl |= 0x03000000;
 
 987                 SIS_W32(StationControl, p->ctl);
 
 989                 if (tp->features & F_HAS_RGMII) {
 
 990                         SIS_W32(RGDelay, 0x0441);
 
 991                         SIS_W32(RGDelay, 0x0440);
 
 994                 net_link(tp, KERN_INFO "%s: link on %s mode.\n", dev->name,
 
 996                 netif_carrier_on(dev);
 
1003 static void sis190_phy_timer(unsigned long __opaque)
 
1005         struct net_device *dev = (struct net_device *)__opaque;
 
1006         struct sis190_private *tp = netdev_priv(dev);
 
1008         if (likely(netif_running(dev)))
 
1009                 schedule_work(&tp->phy_task);
 
1012 static inline void sis190_delete_timer(struct net_device *dev)
 
1014         struct sis190_private *tp = netdev_priv(dev);
 
1016         del_timer_sync(&tp->timer);
 
1019 static inline void sis190_request_timer(struct net_device *dev)
 
1021         struct sis190_private *tp = netdev_priv(dev);
 
1022         struct timer_list *timer = &tp->timer;
 
1025         timer->expires = jiffies + SIS190_PHY_TIMEOUT;
 
1026         timer->data = (unsigned long)dev;
 
1027         timer->function = sis190_phy_timer;
 
1031 static void sis190_set_rxbufsize(struct sis190_private *tp,
 
1032                                  struct net_device *dev)
 
1034         unsigned int mtu = dev->mtu;
 
1036         tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE;
 
1037         /* RxDesc->size has a licence to kill the lower bits */
 
1038         if (tp->rx_buf_sz & 0x07) {
 
1040                 tp->rx_buf_sz &= RX_BUF_MASK;
 
1044 static int sis190_open(struct net_device *dev)
 
1046         struct sis190_private *tp = netdev_priv(dev);
 
1047         struct pci_dev *pdev = tp->pci_dev;
 
1050         sis190_set_rxbufsize(tp, dev);
 
1053          * Rx and Tx descriptors need 256 bytes alignment.
 
1054          * pci_alloc_consistent() guarantees a stronger alignment.
 
1056         tp->TxDescRing = pci_alloc_consistent(pdev, TX_RING_BYTES, &tp->tx_dma);
 
1057         if (!tp->TxDescRing)
 
1060         tp->RxDescRing = pci_alloc_consistent(pdev, RX_RING_BYTES, &tp->rx_dma);
 
1061         if (!tp->RxDescRing)
 
1064         rc = sis190_init_ring(dev);
 
1068         sis190_request_timer(dev);
 
1070         rc = request_irq(dev->irq, sis190_interrupt, IRQF_SHARED, dev->name, dev);
 
1072                 goto err_release_timer_2;
 
1074         sis190_hw_start(dev);
 
1078 err_release_timer_2:
 
1079         sis190_delete_timer(dev);
 
1080         sis190_rx_clear(tp);
 
1082         pci_free_consistent(tp->pci_dev, RX_RING_BYTES, tp->RxDescRing,
 
1085         pci_free_consistent(tp->pci_dev, TX_RING_BYTES, tp->TxDescRing,
 
1090 static void sis190_tx_clear(struct sis190_private *tp)
 
1094         for (i = 0; i < NUM_TX_DESC; i++) {
 
1095                 struct sk_buff *skb = tp->Tx_skbuff[i];
 
1100                 sis190_unmap_tx_skb(tp->pci_dev, skb, tp->TxDescRing + i);
 
1101                 tp->Tx_skbuff[i] = NULL;
 
1104                 tp->dev->stats.tx_dropped++;
 
1106         tp->cur_tx = tp->dirty_tx = 0;
 
1109 static void sis190_down(struct net_device *dev)
 
1111         struct sis190_private *tp = netdev_priv(dev);
 
1112         void __iomem *ioaddr = tp->mmio_addr;
 
1113         unsigned int poll_locked = 0;
 
1115         sis190_delete_timer(dev);
 
1117         netif_stop_queue(dev);
 
1120                 spin_lock_irq(&tp->lock);
 
1122                 sis190_asic_down(ioaddr);
 
1124                 spin_unlock_irq(&tp->lock);
 
1126                 synchronize_irq(dev->irq);
 
1131                 synchronize_sched();
 
1133         } while (SIS_R32(IntrMask));
 
1135         sis190_tx_clear(tp);
 
1136         sis190_rx_clear(tp);
 
1139 static int sis190_close(struct net_device *dev)
 
1141         struct sis190_private *tp = netdev_priv(dev);
 
1142         struct pci_dev *pdev = tp->pci_dev;
 
1146         free_irq(dev->irq, dev);
 
1148         pci_free_consistent(pdev, TX_RING_BYTES, tp->TxDescRing, tp->tx_dma);
 
1149         pci_free_consistent(pdev, RX_RING_BYTES, tp->RxDescRing, tp->rx_dma);
 
1151         tp->TxDescRing = NULL;
 
1152         tp->RxDescRing = NULL;
 
1157 static int sis190_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
1159         struct sis190_private *tp = netdev_priv(dev);
 
1160         void __iomem *ioaddr = tp->mmio_addr;
 
1161         u32 len, entry, dirty_tx;
 
1162         struct TxDesc *desc;
 
1165         if (unlikely(skb->len < ETH_ZLEN)) {
 
1166                 if (skb_padto(skb, ETH_ZLEN)) {
 
1167                         dev->stats.tx_dropped++;
 
1175         entry = tp->cur_tx % NUM_TX_DESC;
 
1176         desc = tp->TxDescRing + entry;
 
1178         if (unlikely(le32_to_cpu(desc->status) & OWNbit)) {
 
1179                 netif_stop_queue(dev);
 
1180                 net_tx_err(tp, KERN_ERR PFX
 
1181                            "%s: BUG! Tx Ring full when queue awake!\n",
 
1183                 return NETDEV_TX_BUSY;
 
1186         mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
 
1188         tp->Tx_skbuff[entry] = skb;
 
1190         desc->PSize = cpu_to_le32(len);
 
1191         desc->addr = cpu_to_le32(mapping);
 
1193         desc->size = cpu_to_le32(len);
 
1194         if (entry == (NUM_TX_DESC - 1))
 
1195                 desc->size |= cpu_to_le32(RingEnd);
 
1199         desc->status = cpu_to_le32(OWNbit | INTbit | DEFbit | CRCbit | PADbit);
 
1205         SIS_W32(TxControl, 0x1a00 | CmdReset | CmdTxEnb);
 
1207         dev->trans_start = jiffies;
 
1209         dirty_tx = tp->dirty_tx;
 
1210         if ((tp->cur_tx - NUM_TX_DESC) == dirty_tx) {
 
1211                 netif_stop_queue(dev);
 
1213                 if (dirty_tx != tp->dirty_tx)
 
1214                         netif_wake_queue(dev);
 
1217         return NETDEV_TX_OK;
 
1220 static void sis190_free_phy(struct list_head *first_phy)
 
1222         struct sis190_phy *cur, *next;
 
1224         list_for_each_entry_safe(cur, next, first_phy, list) {
 
1230  *      sis190_default_phy - Select default PHY for sis190 mac.
 
1231  *      @dev: the net device to probe for
 
1233  *      Select first detected PHY with link as default.
 
1234  *      If no one is link on, select PHY whose types is HOME as default.
 
1235  *      If HOME doesn't exist, select LAN.
 
1237 static u16 sis190_default_phy(struct net_device *dev)
 
1239         struct sis190_phy *phy, *phy_home, *phy_default, *phy_lan;
 
1240         struct sis190_private *tp = netdev_priv(dev);
 
1241         struct mii_if_info *mii_if = &tp->mii_if;
 
1242         void __iomem *ioaddr = tp->mmio_addr;
 
1245         phy_home = phy_default = phy_lan = NULL;
 
1247         list_for_each_entry(phy, &tp->first_phy, list) {
 
1248                 status = mdio_read_latched(ioaddr, phy->phy_id, MII_BMSR);
 
1250                 // Link ON & Not select default PHY & not ghost PHY.
 
1251                 if ((status & BMSR_LSTATUS) &&
 
1253                     (phy->type != UNKNOWN)) {
 
1256                         status = mdio_read(ioaddr, phy->phy_id, MII_BMCR);
 
1257                         mdio_write(ioaddr, phy->phy_id, MII_BMCR,
 
1258                                    status | BMCR_ANENABLE | BMCR_ISOLATE);
 
1259                         if (phy->type == HOME)
 
1261                         else if (phy->type == LAN)
 
1268                         phy_default = phy_home;
 
1270                         phy_default = phy_lan;
 
1272                         phy_default = list_entry(&tp->first_phy,
 
1273                                                  struct sis190_phy, list);
 
1276         if (mii_if->phy_id != phy_default->phy_id) {
 
1277                 mii_if->phy_id = phy_default->phy_id;
 
1278                 net_probe(tp, KERN_INFO
 
1279                        "%s: Using transceiver at address %d as default.\n",
 
1280                        pci_name(tp->pci_dev), mii_if->phy_id);
 
1283         status = mdio_read(ioaddr, mii_if->phy_id, MII_BMCR);
 
1284         status &= (~BMCR_ISOLATE);
 
1286         mdio_write(ioaddr, mii_if->phy_id, MII_BMCR, status);
 
1287         status = mdio_read_latched(ioaddr, mii_if->phy_id, MII_BMSR);
 
1292 static void sis190_init_phy(struct net_device *dev, struct sis190_private *tp,
 
1293                             struct sis190_phy *phy, unsigned int phy_id,
 
1296         void __iomem *ioaddr = tp->mmio_addr;
 
1297         struct mii_chip_info *p;
 
1299         INIT_LIST_HEAD(&phy->list);
 
1300         phy->status = mii_status;
 
1301         phy->phy_id = phy_id;
 
1303         phy->id[0] = mdio_read(ioaddr, phy_id, MII_PHYSID1);
 
1304         phy->id[1] = mdio_read(ioaddr, phy_id, MII_PHYSID2);
 
1306         for (p = mii_chip_table; p->type; p++) {
 
1307                 if ((p->id[0] == phy->id[0]) &&
 
1308                     (p->id[1] == (phy->id[1] & 0xfff0))) {
 
1314                 phy->type = (p->type == MIX) ?
 
1315                         ((mii_status & (BMSR_100FULL | BMSR_100HALF)) ?
 
1316                                 LAN : HOME) : p->type;
 
1317                 tp->features |= p->feature;
 
1319                 phy->type = UNKNOWN;
 
1321         net_probe(tp, KERN_INFO "%s: %s transceiver at address %d.\n",
 
1322                   pci_name(tp->pci_dev),
 
1323                   (phy->type == UNKNOWN) ? "Unknown PHY" : p->name, phy_id);
 
1326 static void sis190_mii_probe_88e1111_fixup(struct sis190_private *tp)
 
1328         if (tp->features & F_PHY_88E1111) {
 
1329                 void __iomem *ioaddr = tp->mmio_addr;
 
1330                 int phy_id = tp->mii_if.phy_id;
 
1336                 p = (tp->features & F_HAS_RGMII) ? reg[0] : reg[1];
 
1338                 mdio_write(ioaddr, phy_id, 0x1b, p[0]);
 
1340                 mdio_write(ioaddr, phy_id, 0x14, p[1]);
 
1346  *      sis190_mii_probe - Probe MII PHY for sis190
 
1347  *      @dev: the net device to probe for
 
1349  *      Search for total of 32 possible mii phy addresses.
 
1350  *      Identify and set current phy if found one,
 
1351  *      return error if it failed to found.
 
1353 static int __devinit sis190_mii_probe(struct net_device *dev)
 
1355         struct sis190_private *tp = netdev_priv(dev);
 
1356         struct mii_if_info *mii_if = &tp->mii_if;
 
1357         void __iomem *ioaddr = tp->mmio_addr;
 
1361         INIT_LIST_HEAD(&tp->first_phy);
 
1363         for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) {
 
1364                 struct sis190_phy *phy;
 
1367                 status = mdio_read_latched(ioaddr, phy_id, MII_BMSR);
 
1369                 // Try next mii if the current one is not accessible.
 
1370                 if (status == 0xffff || status == 0x0000)
 
1373                 phy = kmalloc(sizeof(*phy), GFP_KERNEL);
 
1375                         sis190_free_phy(&tp->first_phy);
 
1380                 sis190_init_phy(dev, tp, phy, phy_id, status);
 
1382                 list_add(&tp->first_phy, &phy->list);
 
1385         if (list_empty(&tp->first_phy)) {
 
1386                 net_probe(tp, KERN_INFO "%s: No MII transceivers found!\n",
 
1387                           pci_name(tp->pci_dev));
 
1392         /* Select default PHY for mac */
 
1393         sis190_default_phy(dev);
 
1395         sis190_mii_probe_88e1111_fixup(tp);
 
1398         mii_if->mdio_read = __mdio_read;
 
1399         mii_if->mdio_write = __mdio_write;
 
1400         mii_if->phy_id_mask = PHY_ID_ANY;
 
1401         mii_if->reg_num_mask = MII_REG_ANY;
 
1406 static void sis190_mii_remove(struct net_device *dev)
 
1408         struct sis190_private *tp = netdev_priv(dev);
 
1410         sis190_free_phy(&tp->first_phy);
 
1413 static void sis190_release_board(struct pci_dev *pdev)
 
1415         struct net_device *dev = pci_get_drvdata(pdev);
 
1416         struct sis190_private *tp = netdev_priv(dev);
 
1418         iounmap(tp->mmio_addr);
 
1419         pci_release_regions(pdev);
 
1420         pci_disable_device(pdev);
 
1424 static struct net_device * __devinit sis190_init_board(struct pci_dev *pdev)
 
1426         struct sis190_private *tp;
 
1427         struct net_device *dev;
 
1428         void __iomem *ioaddr;
 
1431         dev = alloc_etherdev(sizeof(*tp));
 
1433                 net_drv(&debug, KERN_ERR PFX "unable to alloc new ethernet\n");
 
1438         SET_NETDEV_DEV(dev, &pdev->dev);
 
1440         tp = netdev_priv(dev);
 
1442         tp->msg_enable = netif_msg_init(debug.msg_enable, SIS190_MSG_DEFAULT);
 
1444         rc = pci_enable_device(pdev);
 
1446                 net_probe(tp, KERN_ERR "%s: enable failure\n", pci_name(pdev));
 
1447                 goto err_free_dev_1;
 
1452         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
 
1453                 net_probe(tp, KERN_ERR "%s: region #0 is no MMIO resource.\n",
 
1455                 goto err_pci_disable_2;
 
1457         if (pci_resource_len(pdev, 0) < SIS190_REGS_SIZE) {
 
1458                 net_probe(tp, KERN_ERR "%s: invalid PCI region size(s).\n",
 
1460                 goto err_pci_disable_2;
 
1463         rc = pci_request_regions(pdev, DRV_NAME);
 
1465                 net_probe(tp, KERN_ERR PFX "%s: could not request regions.\n",
 
1467                 goto err_pci_disable_2;
 
1470         rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
 
1472                 net_probe(tp, KERN_ERR "%s: DMA configuration failed.\n",
 
1474                 goto err_free_res_3;
 
1477         pci_set_master(pdev);
 
1479         ioaddr = ioremap(pci_resource_start(pdev, 0), SIS190_REGS_SIZE);
 
1481                 net_probe(tp, KERN_ERR "%s: cannot remap MMIO, aborting\n",
 
1484                 goto err_free_res_3;
 
1488         tp->mmio_addr = ioaddr;
 
1490         sis190_irq_mask_and_ack(ioaddr);
 
1492         sis190_soft_reset(ioaddr);
 
1497         pci_release_regions(pdev);
 
1499         pci_disable_device(pdev);
 
1507 static void sis190_tx_timeout(struct net_device *dev)
 
1509         struct sis190_private *tp = netdev_priv(dev);
 
1510         void __iomem *ioaddr = tp->mmio_addr;
 
1513         /* Disable Tx, if not already */
 
1514         tmp8 = SIS_R8(TxControl);
 
1515         if (tmp8 & CmdTxEnb)
 
1516                 SIS_W8(TxControl, tmp8 & ~CmdTxEnb);
 
1519         net_tx_err(tp, KERN_INFO "%s: Transmit timeout, status %08x %08x.\n",
 
1520                    dev->name, SIS_R32(TxControl), SIS_R32(TxSts));
 
1522         /* Disable interrupts by clearing the interrupt mask. */
 
1523         SIS_W32(IntrMask, 0x0000);
 
1525         /* Stop a shared interrupt from scavenging while we are. */
 
1526         spin_lock_irq(&tp->lock);
 
1527         sis190_tx_clear(tp);
 
1528         spin_unlock_irq(&tp->lock);
 
1530         /* ...and finally, reset everything. */
 
1531         sis190_hw_start(dev);
 
1533         netif_wake_queue(dev);
 
1536 static void sis190_set_rgmii(struct sis190_private *tp, u8 reg)
 
1538         tp->features |= (reg & 0x80) ? F_HAS_RGMII : 0;
 
1541 static int __devinit sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev,
 
1542                                                      struct net_device *dev)
 
1544         struct sis190_private *tp = netdev_priv(dev);
 
1545         void __iomem *ioaddr = tp->mmio_addr;
 
1549         net_probe(tp, KERN_INFO "%s: Read MAC address from EEPROM\n",
 
1552         /* Check to see if there is a sane EEPROM */
 
1553         sig = (u16) sis190_read_eeprom(ioaddr, EEPROMSignature);
 
1555         if ((sig == 0xffff) || (sig == 0x0000)) {
 
1556                 net_probe(tp, KERN_INFO "%s: Error EEPROM read %x.\n",
 
1557                           pci_name(pdev), sig);
 
1561         /* Get MAC address from EEPROM */
 
1562         for (i = 0; i < MAC_ADDR_LEN / 2; i++) {
 
1563                 u16 w = sis190_read_eeprom(ioaddr, EEPROMMACAddr + i);
 
1565                 ((__le16 *)dev->dev_addr)[i] = cpu_to_le16(w);
 
1568         sis190_set_rgmii(tp, sis190_read_eeprom(ioaddr, EEPROMInfo));
 
1574  *      sis190_get_mac_addr_from_apc - Get MAC address for SiS96x model
 
1576  *      @dev:  network device to get address for
 
1578  *      SiS96x model, use APC CMOS RAM to store MAC address.
 
1579  *      APC CMOS RAM is accessed through ISA bridge.
 
1580  *      MAC address is read into @net_dev->dev_addr.
 
1582 static int __devinit sis190_get_mac_addr_from_apc(struct pci_dev *pdev,
 
1583                                                   struct net_device *dev)
 
1585         static const u16 __devinitdata ids[] = { 0x0965, 0x0966, 0x0968 };
 
1586         struct sis190_private *tp = netdev_priv(dev);
 
1587         struct pci_dev *isa_bridge;
 
1591         net_probe(tp, KERN_INFO "%s: Read MAC address from APC.\n",
 
1594         for (i = 0; i < ARRAY_SIZE(ids); i++) {
 
1595                 isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, ids[i], NULL);
 
1601                 net_probe(tp, KERN_INFO "%s: Can not find ISA bridge.\n",
 
1606         /* Enable port 78h & 79h to access APC Registers. */
 
1607         pci_read_config_byte(isa_bridge, 0x48, &tmp8);
 
1608         reg = (tmp8 & ~0x02);
 
1609         pci_write_config_byte(isa_bridge, 0x48, reg);
 
1611         pci_read_config_byte(isa_bridge, 0x48, ®);
 
1613         for (i = 0; i < MAC_ADDR_LEN; i++) {
 
1614                 outb(0x9 + i, 0x78);
 
1615                 dev->dev_addr[i] = inb(0x79);
 
1621         sis190_set_rgmii(tp, reg);
 
1623         /* Restore the value to ISA Bridge */
 
1624         pci_write_config_byte(isa_bridge, 0x48, tmp8);
 
1625         pci_dev_put(isa_bridge);
 
1631  *      sis190_init_rxfilter - Initialize the Rx filter
 
1632  *      @dev: network device to initialize
 
1634  *      Set receive filter address to our MAC address
 
1635  *      and enable packet filtering.
 
1637 static inline void sis190_init_rxfilter(struct net_device *dev)
 
1639         struct sis190_private *tp = netdev_priv(dev);
 
1640         void __iomem *ioaddr = tp->mmio_addr;
 
1644         ctl = SIS_R16(RxMacControl);
 
1646          * Disable packet filtering before setting filter.
 
1647          * Note: SiS's driver writes 32 bits but RxMacControl is 16 bits
 
1648          * only and followed by RxMacAddr (6 bytes). Strange. -- FR
 
1650         SIS_W16(RxMacControl, ctl & ~0x0f00);
 
1652         for (i = 0; i < MAC_ADDR_LEN; i++)
 
1653                 SIS_W8(RxMacAddr + i, dev->dev_addr[i]);
 
1655         SIS_W16(RxMacControl, ctl);
 
1659 static int __devinit sis190_get_mac_addr(struct pci_dev *pdev,
 
1660                                          struct net_device *dev)
 
1664         rc = sis190_get_mac_addr_from_eeprom(pdev, dev);
 
1668                 pci_read_config_byte(pdev, 0x73, ®);
 
1670                 if (reg & 0x00000001)
 
1671                         rc = sis190_get_mac_addr_from_apc(pdev, dev);
 
1676 static void sis190_set_speed_auto(struct net_device *dev)
 
1678         struct sis190_private *tp = netdev_priv(dev);
 
1679         void __iomem *ioaddr = tp->mmio_addr;
 
1680         int phy_id = tp->mii_if.phy_id;
 
1683         net_link(tp, KERN_INFO "%s: Enabling Auto-negotiation.\n", dev->name);
 
1685         val = mdio_read(ioaddr, phy_id, MII_ADVERTISE);
 
1687         // Enable 10/100 Full/Half Mode, leave MII_ADVERTISE bit4:0
 
1689         mdio_write(ioaddr, phy_id, MII_ADVERTISE, (val & ADVERTISE_SLCT) |
 
1690                    ADVERTISE_100FULL | ADVERTISE_10FULL |
 
1691                    ADVERTISE_100HALF | ADVERTISE_10HALF);
 
1693         // Enable 1000 Full Mode.
 
1694         mdio_write(ioaddr, phy_id, MII_CTRL1000, ADVERTISE_1000FULL);
 
1696         // Enable auto-negotiation and restart auto-negotiation.
 
1697         mdio_write(ioaddr, phy_id, MII_BMCR,
 
1698                    BMCR_ANENABLE | BMCR_ANRESTART | BMCR_RESET);
 
1701 static int sis190_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 
1703         struct sis190_private *tp = netdev_priv(dev);
 
1705         return mii_ethtool_gset(&tp->mii_if, cmd);
 
1708 static int sis190_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 
1710         struct sis190_private *tp = netdev_priv(dev);
 
1712         return mii_ethtool_sset(&tp->mii_if, cmd);
 
1715 static void sis190_get_drvinfo(struct net_device *dev,
 
1716                                struct ethtool_drvinfo *info)
 
1718         struct sis190_private *tp = netdev_priv(dev);
 
1720         strcpy(info->driver, DRV_NAME);
 
1721         strcpy(info->version, DRV_VERSION);
 
1722         strcpy(info->bus_info, pci_name(tp->pci_dev));
 
1725 static int sis190_get_regs_len(struct net_device *dev)
 
1727         return SIS190_REGS_SIZE;
 
1730 static void sis190_get_regs(struct net_device *dev, struct ethtool_regs *regs,
 
1733         struct sis190_private *tp = netdev_priv(dev);
 
1734         unsigned long flags;
 
1736         if (regs->len > SIS190_REGS_SIZE)
 
1737                 regs->len = SIS190_REGS_SIZE;
 
1739         spin_lock_irqsave(&tp->lock, flags);
 
1740         memcpy_fromio(p, tp->mmio_addr, regs->len);
 
1741         spin_unlock_irqrestore(&tp->lock, flags);
 
1744 static int sis190_nway_reset(struct net_device *dev)
 
1746         struct sis190_private *tp = netdev_priv(dev);
 
1748         return mii_nway_restart(&tp->mii_if);
 
1751 static u32 sis190_get_msglevel(struct net_device *dev)
 
1753         struct sis190_private *tp = netdev_priv(dev);
 
1755         return tp->msg_enable;
 
1758 static void sis190_set_msglevel(struct net_device *dev, u32 value)
 
1760         struct sis190_private *tp = netdev_priv(dev);
 
1762         tp->msg_enable = value;
 
1765 static const struct ethtool_ops sis190_ethtool_ops = {
 
1766         .get_settings   = sis190_get_settings,
 
1767         .set_settings   = sis190_set_settings,
 
1768         .get_drvinfo    = sis190_get_drvinfo,
 
1769         .get_regs_len   = sis190_get_regs_len,
 
1770         .get_regs       = sis190_get_regs,
 
1771         .get_link       = ethtool_op_get_link,
 
1772         .get_msglevel   = sis190_get_msglevel,
 
1773         .set_msglevel   = sis190_set_msglevel,
 
1774         .nway_reset     = sis190_nway_reset,
 
1777 static int sis190_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
1779         struct sis190_private *tp = netdev_priv(dev);
 
1781         return !netif_running(dev) ? -EINVAL :
 
1782                 generic_mii_ioctl(&tp->mii_if, if_mii(ifr), cmd, NULL);
 
1785 static int __devinit sis190_init_one(struct pci_dev *pdev,
 
1786                                      const struct pci_device_id *ent)
 
1788         static int printed_version = 0;
 
1789         struct sis190_private *tp;
 
1790         struct net_device *dev;
 
1791         void __iomem *ioaddr;
 
1793         DECLARE_MAC_BUF(mac);
 
1795         if (!printed_version) {
 
1796                 net_drv(&debug, KERN_INFO SIS190_DRIVER_NAME " loaded.\n");
 
1797                 printed_version = 1;
 
1800         dev = sis190_init_board(pdev);
 
1806         pci_set_drvdata(pdev, dev);
 
1808         tp = netdev_priv(dev);
 
1809         ioaddr = tp->mmio_addr;
 
1811         rc = sis190_get_mac_addr(pdev, dev);
 
1813                 goto err_release_board;
 
1815         sis190_init_rxfilter(dev);
 
1817         INIT_WORK(&tp->phy_task, sis190_phy_task);
 
1819         dev->open = sis190_open;
 
1820         dev->stop = sis190_close;
 
1821         dev->do_ioctl = sis190_ioctl;
 
1822         dev->tx_timeout = sis190_tx_timeout;
 
1823         dev->watchdog_timeo = SIS190_TX_TIMEOUT;
 
1824         dev->hard_start_xmit = sis190_start_xmit;
 
1825 #ifdef CONFIG_NET_POLL_CONTROLLER
 
1826         dev->poll_controller = sis190_netpoll;
 
1828         dev->set_multicast_list = sis190_set_rx_mode;
 
1829         SET_ETHTOOL_OPS(dev, &sis190_ethtool_ops);
 
1830         dev->irq = pdev->irq;
 
1831         dev->base_addr = (unsigned long) 0xdead;
 
1833         spin_lock_init(&tp->lock);
 
1835         rc = sis190_mii_probe(dev);
 
1837                 goto err_release_board;
 
1839         rc = register_netdev(dev);
 
1841                 goto err_remove_mii;
 
1843         net_probe(tp, KERN_INFO "%s: %s at %p (IRQ: %d), "
 
1845                   pci_name(pdev), sis_chip_info[ent->driver_data].name,
 
1846                   ioaddr, dev->irq, print_mac(mac, dev->dev_addr));
 
1848         net_probe(tp, KERN_INFO "%s: %s mode.\n", dev->name,
 
1849                   (tp->features & F_HAS_RGMII) ? "RGMII" : "GMII");
 
1851         netif_carrier_off(dev);
 
1853         sis190_set_speed_auto(dev);
 
1858         sis190_mii_remove(dev);
 
1860         sis190_release_board(pdev);
 
1864 static void __devexit sis190_remove_one(struct pci_dev *pdev)
 
1866         struct net_device *dev = pci_get_drvdata(pdev);
 
1868         sis190_mii_remove(dev);
 
1869         flush_scheduled_work();
 
1870         unregister_netdev(dev);
 
1871         sis190_release_board(pdev);
 
1872         pci_set_drvdata(pdev, NULL);
 
1875 static struct pci_driver sis190_pci_driver = {
 
1877         .id_table       = sis190_pci_tbl,
 
1878         .probe          = sis190_init_one,
 
1879         .remove         = __devexit_p(sis190_remove_one),
 
1882 static int __init sis190_init_module(void)
 
1884         return pci_register_driver(&sis190_pci_driver);
 
1887 static void __exit sis190_cleanup_module(void)
 
1889         pci_unregister_driver(&sis190_pci_driver);
 
1892 module_init(sis190_init_module);
 
1893 module_exit(sis190_cleanup_module);