V4L/DVB (9540): dsbr100: add disabled controls and fix version
[safe/jmp/linux-2.6] / drivers / net / chelsio / cxgb2.c
index 7d0f24f..9b6011e 100644 (file)
@@ -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;
 
@@ -252,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]);
@@ -269,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);
 
@@ -294,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;
@@ -342,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;
 }
@@ -370,7 +374,9 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
        "TxInternalMACXmitError",
        "TxFramesWithExcessiveDeferral",
        "TxFCSErrors",
-
+       "TxJumboFramesOk",
+       "TxJumboOctetsOk",
+       
        "RxOctetsOK",
        "RxOctetsBad",
        "RxUnicastFramesOK",
@@ -388,16 +394,17 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
        "RxInRangeLengthErrors",
        "RxOutOfRangeLengthField",
        "RxFrameTooLongErrors",
+       "RxJumboFramesOk",
+       "RxJumboOctetsOk",
 
        /* Port stats */
-       "RxPackets",
        "RxCsumGood",
-       "TxPackets",
        "TxCsumOffload",
        "TxTso",
        "RxVlan",
        "TxVlan",
-
+       "TxNeedHeadroom", 
+       
        /* Interrupt stats */
        "rx drops",
        "pure_rsps",
@@ -427,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);
@@ -435,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)
@@ -449,28 +461,61 @@ 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_intr_counts *t;
        struct sge_port_stats ss;
-       unsigned int len;
 
        s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL);
-
-       len = sizeof(u64)*(&s->TxFCSErrors + 1 - &s->TxOctetsOK);
-       memcpy(data, &s->TxOctetsOK, len);
-       data += len;
-
-       len = sizeof(u64)*(&s->RxFrameTooLongErrors + 1 - &s->RxOctetsOK);
-       memcpy(data, &s->RxOctetsOK, len);
-       data += len;
-
+       t = t1_sge_get_intr_counts(adapter->sge);
        t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
-       memcpy(data, &ss, sizeof(ss));
-       data += sizeof(ss);
 
-       t = t1_sge_get_intr_counts(adapter->sge);
+       *data++ = s->TxOctetsOK;
+       *data++ = s->TxOctetsBad;
+       *data++ = s->TxUnicastFramesOK;
+       *data++ = s->TxMulticastFramesOK;
+       *data++ = s->TxBroadcastFramesOK;
+       *data++ = s->TxPauseFrames;
+       *data++ = s->TxFramesWithDeferredXmissions;
+       *data++ = s->TxLateCollisions;
+       *data++ = s->TxTotalCollisions;
+       *data++ = s->TxFramesAbortedDueToXSCollisions;
+       *data++ = s->TxUnderrun;
+       *data++ = s->TxLengthErrors;
+       *data++ = s->TxInternalMACXmitError;
+       *data++ = s->TxFramesWithExcessiveDeferral;
+       *data++ = s->TxFCSErrors;
+       *data++ = s->TxJumboFramesOK;
+       *data++ = s->TxJumboOctetsOK;
+
+       *data++ = s->RxOctetsOK;
+       *data++ = s->RxOctetsBad;
+       *data++ = s->RxUnicastFramesOK;
+       *data++ = s->RxMulticastFramesOK;
+       *data++ = s->RxBroadcastFramesOK;
+       *data++ = s->RxPauseFrames;
+       *data++ = s->RxFCSErrors;
+       *data++ = s->RxAlignErrors;
+       *data++ = s->RxSymbolErrors;
+       *data++ = s->RxDataErrors;
+       *data++ = s->RxSequenceErrors;
+       *data++ = s->RxRuntErrors;
+       *data++ = s->RxJabberErrors;
+       *data++ = s->RxInternalMACRcvError;
+       *data++ = s->RxInRangeLengthErrors;
+       *data++ = s->RxOutOfRangeLengthField;
+       *data++ = s->RxFrameTooLongErrors;
+       *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;
@@ -507,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
@@ -529,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;
@@ -589,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;
 
@@ -624,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;
@@ -635,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;
 
@@ -664,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;
@@ -682,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;
@@ -691,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;
@@ -707,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 ||
@@ -731,7 +776,7 @@ 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;
 
        adapter->params.sge.rx_coalesce_usecs = c->rx_coalesce_usecs;
        adapter->params.sge.coalesce_enable = c->use_adaptive_rx_coalesce;
@@ -742,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;
@@ -752,7 +797,7 @@ 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;
 }
@@ -765,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;
 }
@@ -790,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) {
@@ -845,7 +887,7 @@ 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)
@@ -860,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;
 
@@ -873,33 +915,23 @@ 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_interrupt(adapter->pdev->irq, adapter);
@@ -978,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)
 {
@@ -1010,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;
@@ -1042,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 */
 
@@ -1087,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;
 
@@ -1099,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 */
@@ -1110,23 +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
-#ifdef CONFIG_CHELSIO_T1_NAPI
-               netdev->weight = 64;
-               netdev->poll = t1_poll;
-#endif
+
+               netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
 
                SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
        }
@@ -1355,7 +1390,7 @@ 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->priv;
+       struct adapter *adapter = dev->ml_priv;
        int i;
 
        for_each_port(adapter, i) {