V4L/DVB (9540): dsbr100: add disabled controls and fix version
[safe/jmp/linux-2.6] / drivers / net / chelsio / cxgb2.c
index 0ca5b07..9b6011e 100644 (file)
@@ -69,14 +69,14 @@ static inline void cancel_mac_stats_update(struct adapter *ap)
        cancel_delayed_work(&ap->stats_update_task);
 }
 
-#define MAX_CMDQ_ENTRIES 16384
-#define MAX_CMDQ1_ENTRIES 1024
-#define MAX_RX_BUFFERS 16384
-#define MAX_RX_JUMBO_BUFFERS 16384
+#define MAX_CMDQ_ENTRIES       16384
+#define MAX_CMDQ1_ENTRIES      1024
+#define MAX_RX_BUFFERS         16384
+#define MAX_RX_JUMBO_BUFFERS   16384
 #define MAX_TX_BUFFERS_HIGH    16384U
 #define MAX_TX_BUFFERS_LOW     1536U
 #define MAX_TX_BUFFERS         1460U
-#define MIN_FL_ENTRIES 32
+#define MIN_FL_ENTRIES         32
 
 #define DFLT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | \
                         NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP |\
@@ -120,7 +120,7 @@ static const char pci_speed[][4] = {
  */
 static void t1_set_rxmode(struct net_device *dev)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct cmac *mac = adapter->port[dev->if_port].mac;
        struct t1_rx_mode rm;
 
@@ -143,7 +143,7 @@ static void link_report(struct port_info *p)
                        case SPEED_100:   s = "100Mbps"; break;
                }
 
-       printk(KERN_INFO "%s: link up, %s, %s-duplex\n",
+               printk(KERN_INFO "%s: link up, %s, %s-duplex\n",
                       p->dev->name, s,
                       p->link_config.duplex == DUPLEX_FULL ? "full" : "half");
        }
@@ -220,9 +220,8 @@ static int cxgb_up(struct adapter *adapter)
 
        t1_interrupts_clear(adapter);
 
-       adapter->params.has_msi = !disable_msi && pci_enable_msi(adapter->pdev) == 0;
-       err = request_irq(adapter->pdev->irq,
-                         t1_select_intr_handler(adapter),
+       adapter->params.has_msi = !disable_msi && !pci_enable_msi(adapter->pdev);
+       err = request_irq(adapter->pdev->irq, t1_interrupt,
                          adapter->params.has_msi ? 0 : IRQF_SHARED,
                          adapter->name, adapter);
        if (err) {
@@ -234,7 +233,7 @@ static int cxgb_up(struct adapter *adapter)
 
        t1_sge_start(adapter->sge);
        t1_interrupts_enable(adapter);
- out_err:
+out_err:
        return err;
 }
 
@@ -253,11 +252,14 @@ static void cxgb_down(struct adapter *adapter)
 static int cxgb_open(struct net_device *dev)
 {
        int err;
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        int other_ports = adapter->open_device_map & PORT_MASK;
 
-       if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0)
+       napi_enable(&adapter->napi);
+       if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) {
+               napi_disable(&adapter->napi);
                return err;
+       }
 
        __set_bit(dev->if_port, &adapter->open_device_map);
        link_start(&adapter->port[dev->if_port]);
@@ -270,11 +272,12 @@ static int cxgb_open(struct net_device *dev)
 
 static int cxgb_close(struct net_device *dev)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct port_info *p = &adapter->port[dev->if_port];
        struct cmac *mac = p->mac;
 
        netif_stop_queue(dev);
+       napi_disable(&adapter->napi);
        mac->ops->disable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
        netif_carrier_off(dev);
 
@@ -295,7 +298,7 @@ static int cxgb_close(struct net_device *dev)
 
 static struct net_device_stats *t1_get_stats(struct net_device *dev)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct port_info *p = &adapter->port[dev->if_port];
        struct net_device_stats *ns = &p->netstats;
        const struct cmac_statistics *pstats;
@@ -343,14 +346,14 @@ static struct net_device_stats *t1_get_stats(struct net_device *dev)
 
 static u32 get_msglevel(struct net_device *dev)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        return adapter->msg_enable;
 }
 
 static void set_msglevel(struct net_device *dev, u32 val)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        adapter->msg_enable = val;
 }
@@ -371,7 +374,9 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
        "TxInternalMACXmitError",
        "TxFramesWithExcessiveDeferral",
        "TxFCSErrors",
-
+       "TxJumboFramesOk",
+       "TxJumboOctetsOk",
+       
        "RxOctetsOK",
        "RxOctetsBad",
        "RxUnicastFramesOK",
@@ -389,14 +394,21 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
        "RxInRangeLengthErrors",
        "RxOutOfRangeLengthField",
        "RxFrameTooLongErrors",
+       "RxJumboFramesOk",
+       "RxJumboOctetsOk",
 
-       "TSO",
-       "VLANextractions",
-       "VLANinsertions",
+       /* Port stats */
        "RxCsumGood",
        "TxCsumOffload",
-       "RxDrops"
-
+       "TxTso",
+       "RxVlan",
+       "TxVlan",
+       "TxNeedHeadroom", 
+       
+       /* Interrupt stats */
+       "rx drops",
+       "pure_rsps",
+       "unhandled irqs",
        "respQ_empty",
        "respQ_overflow",
        "freelistQ_empty",
@@ -404,10 +416,6 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
        "pkt_mismatch",
        "cmdQ_full0",
        "cmdQ_full1",
-       "tx_ipfrags",
-       "tx_reg_pkts",
-       "tx_lso_pkts",
-       "tx_do_cksum",
 
        "espi_DIP2ParityErr",
        "espi_DIP4Err",
@@ -426,7 +434,7 @@ static int get_regs_len(struct net_device *dev)
 
 static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        strcpy(info->driver, DRV_NAME);
        strcpy(info->version, DRV_VERSION);
@@ -434,9 +442,14 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
        strcpy(info->bus_info, pci_name(adapter->pdev));
 }
 
-static int get_stats_count(struct net_device *dev)
+static int get_sset_count(struct net_device *dev, int sset)
 {
-       return ARRAY_SIZE(stats_strings);
+       switch (sset) {
+       case ETH_SS_STATS:
+               return ARRAY_SIZE(stats_strings);
+       default:
+               return -EOPNOTSUPP;
+       }
 }
 
 static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
@@ -448,15 +461,15 @@ static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
 static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
                      u64 *data)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct cmac *mac = adapter->port[dev->if_port].mac;
        const struct cmac_statistics *s;
-       const struct sge_port_stats *ss;
        const struct sge_intr_counts *t;
+       struct sge_port_stats ss;
 
        s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL);
-       ss = t1_sge_get_port_stats(adapter->sge, dev->if_port);
        t = t1_sge_get_intr_counts(adapter->sge);
+       t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
 
        *data++ = s->TxOctetsOK;
        *data++ = s->TxOctetsBad;
@@ -473,6 +486,8 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
        *data++ = s->TxInternalMACXmitError;
        *data++ = s->TxFramesWithExcessiveDeferral;
        *data++ = s->TxFCSErrors;
+       *data++ = s->TxJumboFramesOK;
+       *data++ = s->TxJumboOctetsOK;
 
        *data++ = s->RxOctetsOK;
        *data++ = s->RxOctetsBad;
@@ -491,36 +506,37 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
        *data++ = s->RxInRangeLengthErrors;
        *data++ = s->RxOutOfRangeLengthField;
        *data++ = s->RxFrameTooLongErrors;
-
-       *data++ = ss->tso;
-       *data++ = ss->vlan_xtract;
-       *data++ = ss->vlan_insert;
-       *data++ = ss->rx_cso_good;
-       *data++ = ss->tx_cso;
-       *data++ = ss->rx_drops;
-
-       *data++ = (u64)t->respQ_empty;
-       *data++ = (u64)t->respQ_overflow;
-       *data++ = (u64)t->freelistQ_empty;
-       *data++ = (u64)t->pkt_too_big;
-       *data++ = (u64)t->pkt_mismatch;
-       *data++ = (u64)t->cmdQ_full[0];
-       *data++ = (u64)t->cmdQ_full[1];
-       *data++ = (u64)t->tx_ipfrags;
-       *data++ = (u64)t->tx_reg_pkts;
-       *data++ = (u64)t->tx_lso_pkts;
-       *data++ = (u64)t->tx_do_cksum;
+       *data++ = s->RxJumboFramesOK;
+       *data++ = s->RxJumboOctetsOK;
+
+       *data++ = ss.rx_cso_good;
+       *data++ = ss.tx_cso;
+       *data++ = ss.tx_tso;
+       *data++ = ss.vlan_xtract;
+       *data++ = ss.vlan_insert;
+       *data++ = ss.tx_need_hdrroom;
+       
+       *data++ = t->rx_drops;
+       *data++ = t->pure_rsps;
+       *data++ = t->unhandled_irqs;
+       *data++ = t->respQ_empty;
+       *data++ = t->respQ_overflow;
+       *data++ = t->freelistQ_empty;
+       *data++ = t->pkt_too_big;
+       *data++ = t->pkt_mismatch;
+       *data++ = t->cmdQ_full[0];
+       *data++ = t->cmdQ_full[1];
 
        if (adapter->espi) {
                const struct espi_intr_counts *e;
 
                e = t1_espi_get_intr_counts(adapter->espi);
-               *data++ = (u64) e->DIP2_parity_err;
-               *data++ = (u64) e->DIP4_err;
-               *data++ = (u64) e->rx_drops;
-               *data++ = (u64) e->tx_drops;
-               *data++ = (u64) e->rx_ovflw;
-               *data++ = (u64) e->parity_err;
+               *data++ = e->DIP2_parity_err;
+               *data++ = e->DIP4_err;
+               *data++ = e->rx_drops;
+               *data++ = e->tx_drops;
+               *data++ = e->rx_ovflw;
+               *data++ = e->parity_err;
        }
 }
 
@@ -536,7 +552,7 @@ static inline void reg_block_dump(struct adapter *ap, void *buf,
 static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
                     void *buf)
 {
-       struct adapter *ap = dev->priv;
+       struct adapter *ap = dev->ml_priv;
 
        /*
         * Version scheme: bits 0..9: chip version, bits 10..15: chip revision
@@ -558,7 +574,7 @@ static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
 
 static int get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct port_info *p = &adapter->port[dev->if_port];
 
        cmd->supported = p->link_config.supported;
@@ -618,7 +634,7 @@ static int speed_duplex_to_caps(int speed, int duplex)
 
 static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct port_info *p = &adapter->port[dev->if_port];
        struct link_config *lc = &p->link_config;
 
@@ -653,7 +669,7 @@ static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 static void get_pauseparam(struct net_device *dev,
                           struct ethtool_pauseparam *epause)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct port_info *p = &adapter->port[dev->if_port];
 
        epause->autoneg = (p->link_config.requested_fc & PAUSE_AUTONEG) != 0;
@@ -664,7 +680,7 @@ static void get_pauseparam(struct net_device *dev,
 static int set_pauseparam(struct net_device *dev,
                          struct ethtool_pauseparam *epause)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct port_info *p = &adapter->port[dev->if_port];
        struct link_config *lc = &p->link_config;
 
@@ -693,14 +709,14 @@ static int set_pauseparam(struct net_device *dev,
 
 static u32 get_rx_csum(struct net_device *dev)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        return (adapter->flags & RX_CSUM_ENABLED) != 0;
 }
 
 static int set_rx_csum(struct net_device *dev, u32 data)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        if (data)
                adapter->flags |= RX_CSUM_ENABLED;
@@ -711,7 +727,7 @@ static int set_rx_csum(struct net_device *dev, u32 data)
 
 static int set_tso(struct net_device *dev, u32 value)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        if (!(adapter->flags & TSO_CAPABLE))
                return value ? -EOPNOTSUPP : 0;
@@ -720,7 +736,7 @@ static int set_tso(struct net_device *dev, u32 value)
 
 static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        int jumbo_fl = t1_is_T1B(adapter) ? 1 : 0;
 
        e->rx_max_pending = MAX_RX_BUFFERS;
@@ -736,7 +752,7 @@ static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
 
 static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        int jumbo_fl = t1_is_T1B(adapter) ? 1 : 0;
 
        if (e->rx_pending > MAX_RX_BUFFERS || e->rx_mini_pending ||
@@ -748,7 +764,7 @@ static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
                return -EINVAL;
 
        if (adapter->flags & FULL_INIT_DONE)
-       return -EBUSY;
+               return -EBUSY;
 
        adapter->params.sge.freelQ_size[!jumbo_fl] = e->rx_pending;
        adapter->params.sge.freelQ_size[jumbo_fl] = e->rx_jumbo_pending;
@@ -760,21 +776,10 @@ static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
 
 static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
-       /*
-        * If RX coalescing is requested we use NAPI, otherwise interrupts.
-        * This choice can be made only when all ports and the TOE are off.
-        */
-       if (adapter->open_device_map == 0)
-               adapter->params.sge.polling = c->use_adaptive_rx_coalesce;
-
-       if (adapter->params.sge.polling) {
-               adapter->params.sge.rx_coalesce_usecs = 0;
-       } else {
-               adapter->params.sge.rx_coalesce_usecs = c->rx_coalesce_usecs;
-       }
-       adapter->params.sge.coalesce_enable = c->use_adaptive_rx_coalesce;
+       adapter->params.sge.rx_coalesce_usecs = c->rx_coalesce_usecs;
+       adapter->params.sge.coalesce_enable = c->use_adaptive_rx_coalesce;
        adapter->params.sge.sample_interval_usecs = c->rate_sample_interval;
        t1_sge_set_coalesce_params(adapter->sge, &adapter->params.sge);
        return 0;
@@ -782,7 +787,7 @@ static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 
 static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        c->rx_coalesce_usecs = adapter->params.sge.rx_coalesce_usecs;
        c->rate_sample_interval = adapter->params.sge.sample_interval_usecs;
@@ -792,9 +797,9 @@ static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 
 static int get_eeprom_len(struct net_device *dev)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
-       return t1_is_asic(adapter) ? EEPROM_SIZE : 0;
+       return t1_is_asic(adapter) ? EEPROM_SIZE : 0;
 }
 
 #define EEPROM_MAGIC(ap) \
@@ -805,11 +810,11 @@ static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e,
 {
        int i;
        u8 buf[EEPROM_SIZE] __attribute__((aligned(4)));
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        e->magic = EEPROM_MAGIC(adapter);
        for (i = e->offset & ~3; i < e->offset + e->len; i += sizeof(u32))
-               t1_seeprom_read(adapter, i, (u32 *)&buf[i]);
+               t1_seeprom_read(adapter, i, (__le32 *)&buf[i]);
        memcpy(data, buf + e->offset, e->len);
        return 0;
 }
@@ -830,23 +835,20 @@ static const struct ethtool_ops t1_ethtool_ops = {
        .set_pauseparam    = set_pauseparam,
        .get_rx_csum       = get_rx_csum,
        .set_rx_csum       = set_rx_csum,
-       .get_tx_csum       = ethtool_op_get_tx_csum,
        .set_tx_csum       = ethtool_op_set_tx_csum,
-       .get_sg            = ethtool_op_get_sg,
        .set_sg            = ethtool_op_set_sg,
        .get_link          = ethtool_op_get_link,
        .get_strings       = get_strings,
-       .get_stats_count   = get_stats_count,
+       .get_sset_count    = get_sset_count,
        .get_ethtool_stats = get_stats,
        .get_regs_len      = get_regs_len,
        .get_regs          = get_regs,
-       .get_tso           = ethtool_op_get_tso,
        .set_tso           = set_tso,
 };
 
 static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct mii_ioctl_data *data = if_mii(req);
 
        switch (cmd) {
@@ -858,7 +860,7 @@ static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
                u32 val;
 
                if (!phy->mdio_read)
-           return -EOPNOTSUPP;
+                       return -EOPNOTSUPP;
                phy->mdio_read(adapter, data->phy_id, 0, data->reg_num & 0x1f,
                               &val);
                data->val_out = val;
@@ -870,7 +872,7 @@ static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
                if (!capable(CAP_NET_ADMIN))
                    return -EPERM;
                if (!phy->mdio_write)
-           return -EOPNOTSUPP;
+                       return -EOPNOTSUPP;
                phy->mdio_write(adapter, data->phy_id, 0, data->reg_num & 0x1f,
                                data->val_in);
                break;
@@ -885,13 +887,13 @@ static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
 static int t1_change_mtu(struct net_device *dev, int new_mtu)
 {
        int ret;
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct cmac *mac = adapter->port[dev->if_port].mac;
 
        if (!mac->ops->set_mtu)
-       return -EOPNOTSUPP;
+               return -EOPNOTSUPP;
        if (new_mtu < 68)
-       return -EINVAL;
+               return -EINVAL;
        if ((ret = mac->ops->set_mtu(mac, new_mtu)))
                return ret;
        dev->mtu = new_mtu;
@@ -900,7 +902,7 @@ static int t1_change_mtu(struct net_device *dev, int new_mtu)
 
 static int t1_set_mac_addr(struct net_device *dev, void *p)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
        struct cmac *mac = adapter->port[dev->if_port].mac;
        struct sockaddr *addr = p;
 
@@ -913,36 +915,26 @@ static int t1_set_mac_addr(struct net_device *dev, void *p)
 }
 
 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
-static void vlan_rx_register(struct net_device *dev,
+static void t1_vlan_rx_register(struct net_device *dev,
                                   struct vlan_group *grp)
 {
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        spin_lock_irq(&adapter->async_lock);
        adapter->vlan_grp = grp;
        t1_set_vlan_accel(adapter, grp != NULL);
        spin_unlock_irq(&adapter->async_lock);
 }
-
-static void vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct adapter *adapter = dev->priv;
-
-       spin_lock_irq(&adapter->async_lock);
-       if (adapter->vlan_grp)
-               adapter->vlan_grp->vlan_devices[vid] = NULL;
-       spin_unlock_irq(&adapter->async_lock);
-}
 #endif
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void t1_netpoll(struct net_device *dev)
 {
        unsigned long flags;
-       struct adapter *adapter = dev->priv;
+       struct adapter *adapter = dev->ml_priv;
 
        local_irq_save(flags);
-       t1_select_intr_handler(adapter)(adapter->pdev->irq, adapter);
+       t1_interrupt(adapter->pdev->irq, adapter);
        local_irq_restore(flags);
 }
 #endif
@@ -951,10 +943,11 @@ static void t1_netpoll(struct net_device *dev)
  * Periodic accumulation of MAC statistics.  This is used only if the MAC
  * does not have any other way to prevent stats counter overflow.
  */
-static void mac_stats_task(void *data)
+static void mac_stats_task(struct work_struct *work)
 {
        int i;
-       struct adapter *adapter = data;
+       struct adapter *adapter =
+               container_of(work, struct adapter, stats_update_task.work);
 
        for_each_port(adapter, i) {
                struct port_info *p = &adapter->port[i];
@@ -975,9 +968,10 @@ static void mac_stats_task(void *data)
 /*
  * Processes elmer0 external interrupts in process context.
  */
-static void ext_intr_task(void *data)
+static void ext_intr_task(struct work_struct *work)
 {
-       struct adapter *adapter = data;
+       struct adapter *adapter =
+               container_of(work, struct adapter, ext_intr_handler_task);
 
        t1_elmer0_ext_intr_handler(adapter);
 
@@ -1016,6 +1010,24 @@ void t1_fatal_err(struct adapter *adapter)
                 adapter->name);
 }
 
+static const struct net_device_ops cxgb_netdev_ops = {
+       .ndo_open               = cxgb_open,
+       .ndo_stop               = cxgb_close,
+       .ndo_start_xmit         = t1_start_xmit,
+       .ndo_get_stats          = t1_get_stats,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_set_multicast_list = t1_set_rxmode,
+       .ndo_do_ioctl           = t1_ioctl,
+       .ndo_change_mtu         = t1_change_mtu,
+       .ndo_set_mac_address    = t1_set_mac_addr,
+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+       .ndo_vlan_rx_register   = t1_vlan_rx_register,
+#endif
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = t1_netpoll,
+#endif
+};
+
 static int __devinit init_one(struct pci_dev *pdev,
                              const struct pci_device_id *ent)
 {
@@ -1048,7 +1060,7 @@ static int __devinit init_one(struct pci_dev *pdev,
                pci_using_dac = 1;
 
                if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
-                       CH_ERR("%s: unable to obtain 64-bit DMA for"
+                       CH_ERR("%s: unable to obtain 64-bit DMA for "
                               "consistent allocations\n", pci_name(pdev));
                        err = -ENODEV;
                        goto out_disable_pdev;
@@ -1080,11 +1092,10 @@ static int __devinit init_one(struct pci_dev *pdev,
                        goto out_free_dev;
                }
 
-               SET_MODULE_OWNER(netdev);
                SET_NETDEV_DEV(netdev, &pdev->dev);
 
                if (!adapter) {
-                       adapter = netdev->priv;
+                       adapter = netdev_priv(netdev);
                        adapter->pdev = pdev;
                        adapter->port[0].dev = netdev;  /* so we don't leak it */
 
@@ -1111,9 +1122,9 @@ static int __devinit init_one(struct pci_dev *pdev,
                        spin_lock_init(&adapter->mac_lock);
 
                        INIT_WORK(&adapter->ext_intr_handler_task,
-                                 ext_intr_task, adapter);
-                       INIT_WORK(&adapter->stats_update_task, mac_stats_task,
-                                 adapter);
+                                 ext_intr_task);
+                       INIT_DELAYED_WORK(&adapter->stats_update_task,
+                                         mac_stats_task);
 
                        pci_set_drvdata(pdev, netdev);
                }
@@ -1125,7 +1136,7 @@ static int __devinit init_one(struct pci_dev *pdev,
                netdev->if_port = i;
                netdev->mem_start = mmio_start;
                netdev->mem_end = mmio_start + mmio_len - 1;
-               netdev->priv = adapter;
+               netdev->ml_priv = adapter;
                netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
                netdev->features |= NETIF_F_LLTX;
 
@@ -1137,8 +1148,6 @@ static int __devinit init_one(struct pci_dev *pdev,
                        adapter->flags |= VLAN_ACCEL_CAPABLE;
                        netdev->features |=
                                NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-                       netdev->vlan_rx_register = vlan_rx_register;
-                       netdev->vlan_rx_kill_vid = vlan_rx_kill_vid;
 #endif
 
                        /* T204: disable TSO */
@@ -1148,20 +1157,11 @@ static int __devinit init_one(struct pci_dev *pdev,
                        }
                }
 
-               netdev->open = cxgb_open;
-               netdev->stop = cxgb_close;
-               netdev->hard_start_xmit = t1_start_xmit;
+               netdev->netdev_ops = &cxgb_netdev_ops;
                netdev->hard_header_len += (adapter->flags & TSO_CAPABLE) ?
                        sizeof(struct cpl_tx_pkt_lso) : sizeof(struct cpl_tx_pkt);
-               netdev->get_stats = t1_get_stats;
-               netdev->set_multicast_list = t1_set_rxmode;
-               netdev->do_ioctl = t1_ioctl;
-               netdev->change_mtu = t1_change_mtu;
-               netdev->set_mac_address = t1_set_mac_addr;
-#ifdef CONFIG_NET_POLL_CONTROLLER
-               netdev->poll_controller = t1_netpoll;
-#endif
-               netdev->weight = 64;
+
+               netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
 
                SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
        }
@@ -1216,9 +1216,9 @@ static int __devinit init_one(struct pci_dev *pdev,
 
        return 0;
 
- out_release_adapter_res:
+out_release_adapter_res:
        t1_free_sw_modules(adapter);
- out_free_dev:
+out_free_dev:
        if (adapter) {
                if (adapter->regs)
                        iounmap(adapter->regs);
@@ -1227,7 +1227,7 @@ static int __devinit init_one(struct pci_dev *pdev,
                                free_netdev(adapter->port[i].dev);
        }
        pci_release_regions(pdev);
- out_disable_pdev:
+out_disable_pdev:
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
        return err;
@@ -1278,28 +1278,27 @@ static int t1_clock(struct adapter *adapter, int mode)
        int M_MEM_VAL;
 
        enum {
-               M_CORE_BITS = 9,
-               T_CORE_VAL = 0,
-               T_CORE_BITS = 2,
-               N_CORE_VAL = 0,
-               N_CORE_BITS = 2,
-               M_MEM_BITS = 9,
-               T_MEM_VAL = 0,
-               T_MEM_BITS = 2,
-               N_MEM_VAL = 0,
-               N_MEM_BITS = 2,
-               NP_LOAD = 1 << 17,
-               S_LOAD_MEM = 1 << 5,
-               S_LOAD_CORE = 1 << 6,
-               S_CLOCK = 1 << 3
+               M_CORE_BITS     = 9,
+               T_CORE_VAL      = 0,
+               T_CORE_BITS     = 2,
+               N_CORE_VAL      = 0,
+               N_CORE_BITS     = 2,
+               M_MEM_BITS      = 9,
+               T_MEM_VAL       = 0,
+               T_MEM_BITS      = 2,
+               N_MEM_VAL       = 0,
+               N_MEM_BITS      = 2,
+               NP_LOAD         = 1 << 17,
+               S_LOAD_MEM      = 1 << 5,
+               S_LOAD_CORE     = 1 << 6,
+               S_CLOCK         = 1 << 3
        };
 
        if (!t1_is_T1B(adapter))
                return -ENODEV; /* Can't re-clock this chip. */
 
-       if (mode & 2) {
+       if (mode & 2)
                return 0;       /* show current mode. */
-       }
 
        if ((adapter->t1powersave & 1) == (mode & 1))
                return -EALREADY;       /* ASIC already running in mode. */
@@ -1391,26 +1390,26 @@ static inline void t1_sw_reset(struct pci_dev *pdev)
 static void __devexit remove_one(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
+       struct adapter *adapter = dev->ml_priv;
+       int i;
 
-       if (dev) {
-               int i;
-               struct adapter *adapter = dev->priv;
-
-               for_each_port(adapter, i)
-                       if (test_bit(i, &adapter->registered_device_map))
-                               unregister_netdev(adapter->port[i].dev);
+       for_each_port(adapter, i) {
+               if (test_bit(i, &adapter->registered_device_map))
+                       unregister_netdev(adapter->port[i].dev);
+       }
 
-               t1_free_sw_modules(adapter);
-               iounmap(adapter->regs);
-               while (--i >= 0)
-                       if (adapter->port[i].dev)
-                               free_netdev(adapter->port[i].dev);
+       t1_free_sw_modules(adapter);
+       iounmap(adapter->regs);
 
-               pci_release_regions(pdev);
-               pci_disable_device(pdev);
-               pci_set_drvdata(pdev, NULL);
-               t1_sw_reset(pdev);
+       while (--i >= 0) {
+               if (adapter->port[i].dev)
+                       free_netdev(adapter->port[i].dev);
        }
+
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+       t1_sw_reset(pdev);
 }
 
 static struct pci_driver driver = {