Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[cascardo/linux.git] / drivers / net / r8169.c
index c821da2..dddf6ae 100644 (file)
@@ -81,6 +81,10 @@ static const int multicast_filter_limit = 32;
 #define RTL8169_TX_TIMEOUT     (6*HZ)
 #define RTL8169_PHY_TIMEOUT    (10*HZ)
 
+#define RTL_EEPROM_SIG         cpu_to_le32(0x8129)
+#define RTL_EEPROM_SIG_MASK    cpu_to_le32(0xffff)
+#define RTL_EEPROM_SIG_ADDR    0x0000
+
 /* write/read MMIO register */
 #define RTL_W8(reg, val8)      writeb ((val8), ioaddr + (reg))
 #define RTL_W16(reg, val16)    writew ((val16), ioaddr + (reg))
@@ -470,6 +474,7 @@ struct rtl8169_private {
        void (*hw_start)(struct net_device *);
        unsigned int (*phy_reset_pending)(void __iomem *);
        unsigned int (*link_ok)(void __iomem *);
+       int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
        int pcie_cap;
        struct delayed_work task;
        unsigned features;
@@ -1825,9 +1830,11 @@ static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        struct rtl8169_private *tp = netdev_priv(dev);
        struct mii_ioctl_data *data = if_mii(ifr);
 
-       if (!netif_running(dev))
-               return -ENODEV;
+       return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
+}
 
+static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
+{
        switch (cmd) {
        case SIOCGMIIPHY:
                data->phy_id = 32; /* Internal PHY */
@@ -1846,6 +1853,11 @@ static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        return -EOPNOTSUPP;
 }
 
+static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
+{
+       return -EOPNOTSUPP;
+}
+
 static const struct rtl_cfg_info {
        void (*hw_start)(struct net_device *);
        unsigned int region;
@@ -1911,73 +1923,25 @@ static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
        }
 }
 
-static int rtl_eeprom_read(struct pci_dev *pdev, int cap, int addr, __le32 *val)
-{
-       int ret, count = 100;
-       u16 status = 0;
-       u32 value;
-
-       ret = pci_write_config_word(pdev, cap + PCI_VPD_ADDR, addr);
-       if (ret < 0)
-               return ret;
-
-       do {
-               udelay(10);
-               ret = pci_read_config_word(pdev, cap + PCI_VPD_ADDR, &status);
-               if (ret < 0)
-                       return ret;
-       } while (!(status & PCI_VPD_ADDR_F) && --count);
-
-       if (!(status & PCI_VPD_ADDR_F))
-               return -ETIMEDOUT;
-
-       ret = pci_read_config_dword(pdev, cap + PCI_VPD_DATA, &value);
-       if (ret < 0)
-               return ret;
-
-       *val = cpu_to_le32(value);
-
-       return 0;
-}
-
-static void rtl_init_mac_address(struct rtl8169_private *tp,
-                                void __iomem *ioaddr)
-{
-       struct pci_dev *pdev = tp->pci_dev;
-       u8 cfg1;
-       int vpd_cap;
-       u8 mac[8];
-       DECLARE_MAC_BUF(buf);
-
-       cfg1 = RTL_R8(Config1);
-       if (!(cfg1  & VPD)) {
-               dprintk("VPD access not enabled, enabling\n");
-               RTL_W8(Cfg9346, Cfg9346_Unlock);
-               RTL_W8(Config1, cfg1 | VPD);
-               RTL_W8(Cfg9346, Cfg9346_Lock);
-       }
-
-       vpd_cap = pci_find_capability(pdev, PCI_CAP_ID_VPD);
-       if (!vpd_cap)
-               return;
-
-       /* MAC address is stored in EEPROM at offset 0x0e
-        * Realtek says: "The VPD address does not have to be a DWORD-aligned
-        * address as defined in the PCI 2.2 Specifications, but the VPD data
-        * is always consecutive 4-byte data starting from the VPD address
-        * specified."
-        */
-       if (rtl_eeprom_read(pdev, vpd_cap, 0x000e, (__le32*)&mac[0]) < 0 ||
-           rtl_eeprom_read(pdev, vpd_cap, 0x0012, (__le32*)&mac[4]) < 0) {
-               dprintk("Reading MAC address from EEPROM failed\n");
-               return;
-       }
-
-       dprintk("MAC address found in EEPROM: %s\n", print_mac(buf, mac));
+static const struct net_device_ops rtl8169_netdev_ops = {
+       .ndo_open               = rtl8169_open,
+       .ndo_stop               = rtl8169_close,
+       .ndo_get_stats          = rtl8169_get_stats,
+       .ndo_start_xmit         = rtl8169_start_xmit,
+       .ndo_tx_timeout         = rtl8169_tx_timeout,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_change_mtu         = rtl8169_change_mtu,
+       .ndo_set_mac_address    = rtl_set_mac_address,
+       .ndo_do_ioctl           = rtl8169_ioctl,
+       .ndo_set_multicast_list = rtl_set_rx_mode,
+#ifdef CONFIG_R8169_VLAN
+       .ndo_vlan_rx_register   = rtl8169_vlan_rx_register,
+#endif
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = rtl8169_netpoll,
+#endif
 
-       /* Write MAC address */
-       rtl_rar_set(tp, mac);
-}
+};
 
 static int __devinit
 rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
@@ -2005,6 +1969,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        SET_NETDEV_DEV(dev, &pdev->dev);
+       dev->netdev_ops = &rtl8169_netdev_ops;
        tp = netdev_priv(dev);
        tp->dev = dev;
        tp->pci_dev = pdev;
@@ -2140,6 +2105,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                tp->phy_reset_enable = rtl8169_tbi_reset_enable;
                tp->phy_reset_pending = rtl8169_tbi_reset_pending;
                tp->link_ok = rtl8169_tbi_link_ok;
+               tp->do_ioctl = rtl_tbi_ioctl;
 
                tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
        } else {
@@ -2148,43 +2114,27 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                tp->phy_reset_enable = rtl8169_xmii_reset_enable;
                tp->phy_reset_pending = rtl8169_xmii_reset_pending;
                tp->link_ok = rtl8169_xmii_link_ok;
-
-               dev->do_ioctl = rtl8169_ioctl;
+               tp->do_ioctl = rtl_xmii_ioctl;
        }
 
        spin_lock_init(&tp->lock);
 
        tp->mmio_addr = ioaddr;
 
-       rtl_init_mac_address(tp, ioaddr);
-
        /* Get MAC address */
        for (i = 0; i < MAC_ADDR_LEN; i++)
                dev->dev_addr[i] = RTL_R8(MAC0 + i);
        memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
-       dev->open = rtl8169_open;
-       dev->hard_start_xmit = rtl8169_start_xmit;
-       dev->get_stats = rtl8169_get_stats;
        SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
-       dev->stop = rtl8169_close;
-       dev->tx_timeout = rtl8169_tx_timeout;
-       dev->set_multicast_list = rtl_set_rx_mode;
        dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
        dev->irq = pdev->irq;
        dev->base_addr = (unsigned long) ioaddr;
-       dev->change_mtu = rtl8169_change_mtu;
-       dev->set_mac_address = rtl_set_mac_address;
 
        netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
 
 #ifdef CONFIG_R8169_VLAN
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-       dev->vlan_rx_register = rtl8169_vlan_rx_register;
-#endif
-
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       dev->poll_controller = rtl8169_netpoll;
 #endif
 
        tp->intr_mask = 0xffff;
@@ -3550,7 +3500,6 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
                        if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
                                netif_receive_skb(skb);
 
-                       dev->last_rx = jiffies;
                        dev->stats.rx_bytes += pkt_size;
                        dev->stats.rx_packets++;
                }