This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / net / starfire.c
index 0eb660a..f87ff13 100644 (file)
@@ -312,9 +312,6 @@ static int full_duplex[MAX_UNITS] = {0, };
 
 #include <linux/if_vlan.h>
 
-#define COMPAT_MOD_INC_USE_COUNT
-#define COMPAT_MOD_DEC_USE_COUNT
-
 #define init_tx_timer(dev, func, timeout) \
        dev->tx_timeout = func; \
        dev->watchdog_timeo = timeout;
@@ -799,12 +796,13 @@ static struct net_device_stats *get_stats(struct net_device *dev);
 static int     netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 static int     netdev_close(struct net_device *dev);
 static void    netdev_media_change(struct net_device *dev);
+static struct ethtool_ops ethtool_ops;
 
 
 #ifdef VLAN_SUPPORT
 static void netdev_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 {
-        struct netdev_private *np = dev->priv;
+        struct netdev_private *np = netdev_priv(dev);
 
         spin_lock(&np->lock);
        if (debug > 2)
@@ -816,7 +814,7 @@ static void netdev_vlan_rx_register(struct net_device *dev, struct vlan_group *g
 
 static void netdev_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
 
        spin_lock(&np->lock);
        if (debug > 1)
@@ -827,7 +825,7 @@ static void netdev_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
 
 static void netdev_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
 
        spin_lock(&np->lock);
        if (debug > 1)
@@ -880,7 +878,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
 
        irq = pdev->irq;
 
-       if (pci_request_regions (pdev, dev->name)) {
+       if (pci_request_regions (pdev, DRV_NAME)) {
                printk(KERN_ERR DRV_NAME " %d: cannot reserve PCI resources, aborting\n", card_idx);
                goto err_out_free_netdev;
        }
@@ -951,7 +949,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
        dev->base_addr = ioaddr;
        dev->irq = irq;
 
-       np = dev->priv;
+       np = netdev_priv(dev);
        spin_lock_init(&np->lock);
        pci_set_drvdata(pdev, dev);
 
@@ -1015,6 +1013,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
        dev->get_stats = &get_stats;
        dev->set_multicast_list = &set_rx_mode;
        dev->do_ioctl = &netdev_ioctl;
+       SET_ETHTOOL_OPS(dev, &ethtool_ops);
 
        if (mtu)
                dev->mtu = mtu;
@@ -1102,20 +1101,15 @@ static void mdio_write(struct net_device *dev, int phy_id, int location, int val
 
 static int netdev_open(struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        long ioaddr = dev->base_addr;
        int i, retval;
        size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size;
 
        /* Do we ever need to reset the chip??? */
-
-       COMPAT_MOD_INC_USE_COUNT;
-
        retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev);
-       if (retval) {
-               COMPAT_MOD_DEC_USE_COUNT;
+       if (retval)
                return retval;
-       }
 
        /* Disable the Rx and Tx, and reset the chip. */
        writel(0, ioaddr + GenCtrl);
@@ -1132,10 +1126,8 @@ static int netdev_open(struct net_device *dev)
                rx_ring_size = sizeof(struct starfire_rx_desc) * RX_RING_SIZE;
                np->queue_mem_size = tx_done_q_size + rx_done_q_size + tx_ring_size + rx_ring_size;
                np->queue_mem = pci_alloc_consistent(np->pci_dev, np->queue_mem_size, &np->queue_mem_dma);
-               if (np->queue_mem == 0) {
-                       COMPAT_MOD_DEC_USE_COUNT;
+               if (np->queue_mem == 0)
                        return -ENOMEM;
-               }
 
                np->tx_done_q     = np->queue_mem;
                np->tx_done_q_dma = np->queue_mem_dma;
@@ -1267,7 +1259,7 @@ static int netdev_open(struct net_device *dev)
 
 static void check_duplex(struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        u16 reg0;
        int silly_count = 1000;
 
@@ -1302,7 +1294,7 @@ static void check_duplex(struct net_device *dev)
 
 static void tx_timeout(struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        long ioaddr = dev->base_addr;
        int old_debug;
 
@@ -1332,7 +1324,7 @@ static void tx_timeout(struct net_device *dev)
 /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
 static void init_ring(struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        int i;
 
        np->cur_rx = np->cur_tx = np->reap_tx = 0;
@@ -1378,7 +1370,7 @@ static void init_ring(struct net_device *dev)
 
 static int start_tx(struct sk_buff *skb, struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        unsigned int entry;
        u32 status;
        int i;
@@ -1497,7 +1489,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs
        int handled = 0;
 
        ioaddr = dev->base_addr;
-       np = dev->priv;
+       np = netdev_priv(dev);
 
        do {
                u32 intr_status = readl(ioaddr + IntrClear);
@@ -1597,7 +1589,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs
    for clarity, code sharing between NAPI/non-NAPI, and better register allocation. */
 static int __netdev_rx(struct net_device *dev, int *quota)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        u32 desc_status;
        int retcode = 0;
 
@@ -1752,7 +1744,7 @@ static int netdev_poll(struct net_device *dev, int *budget)
 
 static void refill_rx_ring(struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        struct sk_buff *skb;
        int entry = -1;
 
@@ -1780,7 +1772,7 @@ static void refill_rx_ring(struct net_device *dev)
 
 static void netdev_media_change(struct net_device *dev)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        long ioaddr = dev->base_addr;
        u16 reg0, reg1, reg4, reg5;
        u32 new_tx_mode;
@@ -1855,7 +1847,7 @@ static void netdev_media_change(struct net_device *dev)
 
 static void netdev_error(struct net_device *dev, int intr_status)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
 
        /* Came close to underrunning the Tx FIFO, increase threshold. */
        if (intr_status & IntrTxDataLow) {
@@ -1883,7 +1875,7 @@ static void netdev_error(struct net_device *dev, int intr_status)
 static struct net_device_stats *get_stats(struct net_device *dev)
 {
        long ioaddr = dev->base_addr;
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
 
        /* This adapter architecture needs no SMP locks. */
        np->stats.tx_bytes = readl(ioaddr + 0x57010);
@@ -1917,7 +1909,7 @@ static void set_rx_mode(struct net_device *dev)
        struct dev_mc_list *mclist;
        int i;
 #ifdef VLAN_SUPPORT
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
 
        rx_mode |= VlanMode;
        if (np->vlgrp) {
@@ -1996,106 +1988,89 @@ static void set_rx_mode(struct net_device *dev)
        writel(rx_mode, ioaddr + RxFilterMode);
 }
 
+static int check_if_running(struct net_device *dev)
+{
+       if (!netif_running(dev))
+               return -EINVAL;
+       return 0;
+}
 
-static int netdev_ethtool_ioctl(struct net_device *dev, void __user *useraddr)
+static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
-       struct ethtool_cmd ecmd;
-       struct netdev_private *np = dev->priv;
-
-       if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-               return -EFAULT;
-
-       switch (ecmd.cmd) {
-       case ETHTOOL_GDRVINFO: {
-               struct ethtool_drvinfo info;
-               memset(&info, 0, sizeof(info));
-               info.cmd = ecmd.cmd;
-               strcpy(info.driver, DRV_NAME);
-               strcpy(info.version, DRV_VERSION);
-               *info.fw_version = 0;
-               strcpy(info.bus_info, PCI_SLOT_NAME(np->pci_dev));
-               if (copy_to_user(useraddr, &info, sizeof(info)))
-                      return -EFAULT;
-               return 0;
-       }
+       struct netdev_private *np = netdev_priv(dev);
+       strcpy(info->driver, DRV_NAME);
+       strcpy(info->version, DRV_VERSION);
+       strcpy(info->bus_info, PCI_SLOT_NAME(np->pci_dev));
+}
 
-       /* get settings */
-       case ETHTOOL_GSET: {
-               struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-               spin_lock_irq(&np->lock);
-               mii_ethtool_gset(&np->mii_if, &ecmd);
-               spin_unlock_irq(&np->lock);
-               if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
-                       return -EFAULT;
-               return 0;
-       }
-       /* set settings */
-       case ETHTOOL_SSET: {
-               int r;
-               struct ethtool_cmd ecmd;
-               if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-                       return -EFAULT;
-               spin_lock_irq(&np->lock);
-               r = mii_ethtool_sset(&np->mii_if, &ecmd);
-               spin_unlock_irq(&np->lock);
-               check_duplex(dev);
-               return r;
-       }
-       /* restart autonegotiation */
-       case ETHTOOL_NWAY_RST: {
-               return mii_nway_restart(&np->mii_if);
-       }
-       /* get link status */
-       case ETHTOOL_GLINK: {
-               struct ethtool_value edata = {ETHTOOL_GLINK};
-               edata.data = mii_link_ok(&np->mii_if);
-               if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                       return -EFAULT;
-               return 0;
-       }
+static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+{
+       struct netdev_private *np = netdev_priv(dev);
+       spin_lock_irq(&np->lock);
+       mii_ethtool_gset(&np->mii_if, ecmd);
+       spin_unlock_irq(&np->lock);
+       return 0;
+}
 
-       /* get message-level */
-       case ETHTOOL_GMSGLVL: {
-               struct ethtool_value edata = {ETHTOOL_GMSGLVL};
-               edata.data = debug;
-               if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                       return -EFAULT;
-               return 0;
-       }
-       /* set message-level */
-       case ETHTOOL_SMSGLVL: {
-               struct ethtool_value edata;
-               if (copy_from_user(&edata, useraddr, sizeof(edata)))
-                       return -EFAULT;
-               debug = edata.data;
-               return 0;
-       }
-       default:
-               return -EOPNOTSUPP;
-       }
+static int set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+{
+       struct netdev_private *np = netdev_priv(dev);
+       int res;
+       spin_lock_irq(&np->lock);
+       res = mii_ethtool_sset(&np->mii_if, ecmd);
+       spin_unlock_irq(&np->lock);
+       check_duplex(dev);
+       return res;
 }
 
+static int nway_reset(struct net_device *dev)
+{
+       struct netdev_private *np = netdev_priv(dev);
+       return mii_nway_restart(&np->mii_if);
+}
+
+static u32 get_link(struct net_device *dev)
+{
+       struct netdev_private *np = netdev_priv(dev);
+       return mii_link_ok(&np->mii_if);
+}
+
+static u32 get_msglevel(struct net_device *dev)
+{
+       return debug;
+}
+
+static void set_msglevel(struct net_device *dev, u32 val)
+{
+       debug = val;
+}
+
+static struct ethtool_ops ethtool_ops = {
+       .begin = check_if_running,
+       .get_drvinfo = get_drvinfo,
+       .get_settings = get_settings,
+       .set_settings = set_settings,
+       .nway_reset = nway_reset,
+       .get_link = get_link,
+       .get_msglevel = get_msglevel,
+       .set_msglevel = set_msglevel,
+};
 
 static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
+       struct mii_ioctl_data *data = if_mii(rq);
        int rc;
 
        if (!netif_running(dev))
                return -EINVAL;
 
-       if (cmd == SIOCETHTOOL)
-               rc = netdev_ethtool_ioctl(dev, rq->ifr_data);
-
-       else {
-               struct mii_ioctl_data *data = if_mii(rq);
-               spin_lock_irq(&np->lock);
-               rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL);
-               spin_unlock_irq(&np->lock);
+       spin_lock_irq(&np->lock);
+       rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL);
+       spin_unlock_irq(&np->lock);
 
-               if ((cmd == SIOCSMIIREG) && (data->phy_id == np->phys[0]))
-                       check_duplex(dev);
-       }
+       if ((cmd == SIOCSMIIREG) && (data->phy_id == np->phys[0]))
+               check_duplex(dev);
 
        return rc;
 }
@@ -2103,7 +2078,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 static int netdev_close(struct net_device *dev)
 {
        long ioaddr = dev->base_addr;
-       struct netdev_private *np = dev->priv;
+       struct netdev_private *np = netdev_priv(dev);
        int i;
 
        netif_stop_queue(dev);
@@ -2165,8 +2140,6 @@ static int netdev_close(struct net_device *dev)
                np->tx_info[i].skb = NULL;
        }
 
-       COMPAT_MOD_DEC_USE_COUNT;
-
        return 0;
 }
 
@@ -2174,16 +2147,16 @@ static int netdev_close(struct net_device *dev)
 static void __devexit starfire_remove_one (struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
-       struct netdev_private *np;
+       struct netdev_private *np = netdev_priv(dev);
 
        if (!dev)
                BUG();
 
-       np = dev->priv;
+       unregister_netdev(dev);
+
        if (np->queue_mem)
                pci_free_consistent(pdev, np->queue_mem_size, np->queue_mem, np->queue_mem_dma);
 
-       unregister_netdev(dev);
 
        /* XXX: add wakeup code -- requires firmware for MagicPacket */
        pci_set_power_state(pdev, 3);   /* go to sleep in D3 mode */