Merge commit 'origin/master' into next
[pandora-kernel.git] / drivers / net / enic / enic_main.c
index 7d60551..8005b60 100644 (file)
@@ -400,10 +400,13 @@ static irqreturn_t enic_isr_legacy(int irq, void *data)
                return IRQ_NONE;        /* not our interrupt */
        }
 
-       if (ENIC_TEST_INTR(pba, ENIC_INTX_NOTIFY))
+       if (ENIC_TEST_INTR(pba, ENIC_INTX_NOTIFY)) {
+               vnic_intr_return_all_credits(&enic->intr[ENIC_INTX_NOTIFY]);
                enic_notify_check(enic);
+       }
 
        if (ENIC_TEST_INTR(pba, ENIC_INTX_ERR)) {
+               vnic_intr_return_all_credits(&enic->intr[ENIC_INTX_ERR]);
                enic_log_q_error(enic);
                /* schedule recovery from WQ/RQ error */
                schedule_work(&enic->reset);
@@ -411,8 +414,8 @@ static irqreturn_t enic_isr_legacy(int irq, void *data)
        }
 
        if (ENIC_TEST_INTR(pba, ENIC_INTX_WQ_RQ)) {
-               if (netif_rx_schedule_prep(&enic->napi))
-                       __netif_rx_schedule(&enic->napi);
+               if (napi_schedule_prep(&enic->napi))
+                       __napi_schedule(&enic->napi);
        } else {
                vnic_intr_unmask(&enic->intr[ENIC_INTX_WQ_RQ]);
        }
@@ -440,7 +443,7 @@ static irqreturn_t enic_isr_msi(int irq, void *data)
         * writes).
         */
 
-       netif_rx_schedule(&enic->napi);
+       napi_schedule(&enic->napi);
 
        return IRQ_HANDLED;
 }
@@ -450,7 +453,7 @@ static irqreturn_t enic_isr_msix_rq(int irq, void *data)
        struct enic *enic = data;
 
        /* schedule NAPI polling for RQ cleanup */
-       netif_rx_schedule(&enic->napi);
+       napi_schedule(&enic->napi);
 
        return IRQ_HANDLED;
 }
@@ -476,6 +479,8 @@ static irqreturn_t enic_isr_msix_err(int irq, void *data)
 {
        struct enic *enic = data;
 
+       vnic_intr_return_all_credits(&enic->intr[ENIC_MSIX_ERR]);
+
        enic_log_q_error(enic);
 
        /* schedule recovery from WQ/RQ error */
@@ -488,8 +493,8 @@ static irqreturn_t enic_isr_msix_notify(int irq, void *data)
 {
        struct enic *enic = data;
 
+       vnic_intr_return_all_credits(&enic->intr[ENIC_MSIX_NOTIFY]);
        enic_notify_check(enic);
-       vnic_intr_unmask(&enic->intr[ENIC_MSIX_NOTIFY]);
 
        return IRQ_HANDLED;
 }
@@ -570,11 +575,11 @@ static inline void enic_queue_wq_skb_tso(struct enic *enic,
         * to each TCP segment resulting from the TSO.
         */
 
-       if (skb->protocol == __constant_htons(ETH_P_IP)) {
+       if (skb->protocol == cpu_to_be16(ETH_P_IP)) {
                ip_hdr(skb)->check = 0;
                tcp_hdr(skb)->check = ~csum_tcpudp_magic(ip_hdr(skb)->saddr,
                        ip_hdr(skb)->daddr, 0, IPPROTO_TCP, 0);
-       } else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
+       } else if (skb->protocol == cpu_to_be16(ETH_P_IPV6)) {
                tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
                        &ipv6_hdr(skb)->daddr, 0, IPPROTO_TCP, 0);
        }
@@ -616,7 +621,7 @@ static inline void enic_queue_wq_skb(struct enic *enic,
                        vlan_tag_insert, vlan_tag);
 }
 
-/* netif_tx_lock held, process context with BHs disabled */
+/* netif_tx_lock held, process context with BHs disabled, or BH */
 static int enic_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
 {
        struct enic *enic = netdev_priv(netdev);
@@ -656,8 +661,6 @@ static int enic_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
        if (vnic_wq_desc_avail(wq) < MAX_SKB_FRAGS + 1)
                netif_stop_queue(netdev);
 
-       netdev->trans_start = jiffies;
-
        spin_unlock_irqrestore(&enic->wq_lock[0], flags);
 
        return NETDEV_TX_OK;
@@ -683,7 +686,7 @@ static struct net_device_stats *enic_get_stats(struct net_device *netdev)
        net_stats->rx_bytes = stats->rx.rx_bytes_ok;
        net_stats->rx_errors = stats->rx.rx_errors;
        net_stats->multicast = stats->rx.rx_multicast_frames_ok;
-       net_stats->rx_crc_errors = stats->rx.rx_crc_errors;
+       net_stats->rx_crc_errors = enic->rq_bad_fcs;
        net_stats->rx_dropped = stats->rx.rx_no_bufs;
 
        return net_stats;
@@ -928,12 +931,8 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
 
        if (packet_error) {
 
-               if (bytes_written > 0 && !fcs_ok) {
-                       if (net_ratelimit())
-                               printk(KERN_ERR PFX
-                                       "%s: packet error: bad FCS\n",
-                                       netdev->name);
-               }
+               if (bytes_written > 0 && !fcs_ok)
+                       enic->rq_bad_fcs++;
 
                dev_kfree_skb_any(skb);
 
@@ -1068,8 +1067,8 @@ static int enic_poll(struct napi_struct *napi, int budget)
                if (netdev->features & NETIF_F_LRO)
                        lro_flush_all(&enic->lro_mgr);
 
-               netif_rx_complete(napi);
-               vnic_intr_unmask(&enic->intr[ENIC_MSIX_RQ]);
+               napi_complete(napi);
+               vnic_intr_unmask(&enic->intr[ENIC_INTX_WQ_RQ]);
        }
 
        return rq_work_done;
@@ -1095,9 +1094,9 @@ static int enic_poll_msix(struct napi_struct *napi, int budget)
 
                vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf);
 
-               /* Accumulate intr event credits for this polling
+               /* Return intr event credits for this polling
                 * cycle.  An intr event is the completion of a
-                * a WQ or RQ packet.
+                * RQ packet.
                 */
 
                vnic_intr_return_credits(&enic->intr[ENIC_MSIX_RQ],
@@ -1112,7 +1111,7 @@ static int enic_poll_msix(struct napi_struct *napi, int budget)
                if (netdev->features & NETIF_F_LRO)
                        lro_flush_all(&enic->lro_mgr);
 
-               netif_rx_complete(napi);
+               napi_complete(napi);
                vnic_intr_unmask(&enic->intr[ENIC_MSIX_RQ]);
        }
 
@@ -1461,6 +1460,26 @@ static int enic_dev_soft_reset(struct enic *enic)
        return err;
 }
 
+static int enic_set_niccfg(struct enic *enic)
+{
+       const u8 rss_default_cpu = 0;
+       const u8 rss_hash_type = 0;
+       const u8 rss_hash_bits = 0;
+       const u8 rss_base_cpu = 0;
+       const u8 rss_enable = 0;
+       const u8 tso_ipid_split_en = 0;
+       const u8 ig_vlan_strip_en = 1;
+
+       /* Enable VLAN tag stripping.  RSS not enabled (yet).
+       */
+
+       return enic_set_nic_cfg(enic,
+               rss_default_cpu, rss_hash_type,
+               rss_hash_bits, rss_base_cpu,
+               rss_enable, tso_ipid_split_en,
+               ig_vlan_strip_en);
+}
+
 static void enic_reset(struct work_struct *work)
 {
        struct enic *enic = container_of(work, struct enic, reset);
@@ -1476,8 +1495,10 @@ static void enic_reset(struct work_struct *work)
 
        enic_stop(enic->netdev);
        enic_dev_soft_reset(enic);
+       vnic_dev_init(enic->vdev, 0);
        enic_reset_mcaddrs(enic);
        enic_init_vnic_resources(enic);
+       enic_set_niccfg(enic);
        enic_open(enic->netdev);
 
        rtnl_unlock();
@@ -1620,14 +1641,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        unsigned int i;
        int err;
 
-       const u8 rss_default_cpu = 0;
-       const u8 rss_hash_type = 0;
-       const u8 rss_hash_bits = 0;
-       const u8 rss_base_cpu = 0;
-       const u8 rss_enable = 0;
-       const u8 tso_ipid_split_en = 0;
-       const u8 ig_vlan_strip_en = 1;
-
        /* Allocate net device structure and initialize.  Private
         * instance data is initialized to zero.
         */
@@ -1670,15 +1683,15 @@ static int __devinit enic_probe(struct pci_dev *pdev,
         * fail to 32-bit.
         */
 
-       err = pci_set_dma_mask(pdev, DMA_40BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(40));
        if (err) {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR PFX
                                "No usable DMA configuration, aborting.\n");
                        goto err_out_release_regions;
                }
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR PFX
                                "Unable to obtain 32-bit DMA "
@@ -1686,7 +1699,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
                        goto err_out_release_regions;
                }
        } else {
-               err = pci_set_consistent_dma_mask(pdev, DMA_40BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(40));
                if (err) {
                        printk(KERN_ERR PFX
                                "Unable to obtain 40-bit DMA "
@@ -1793,14 +1806,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
 
        enic_init_vnic_resources(enic);
 
-       /* Enable VLAN tag stripping.  RSS not enabled (yet).
-        */
-
-       err = enic_set_nic_cfg(enic,
-               rss_default_cpu, rss_hash_type,
-               rss_hash_bits, rss_base_cpu,
-               rss_enable, tso_ipid_split_en,
-               ig_vlan_strip_en);
+       err = enic_set_niccfg(enic);
        if (err) {
                printk(KERN_ERR PFX
                        "Failed to config nic, aborting.\n");
@@ -1858,7 +1864,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        if (using_dac)
                netdev->features |= NETIF_F_HIGHDMA;
 
-
        enic->csum_rx_enabled = ENIC_SETTING(enic, RXCSUM);
 
        enic->lro_mgr.max_aggr = ENIC_LRO_MAX_AGGR;
@@ -1870,7 +1875,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        enic->lro_mgr.ip_summed = CHECKSUM_COMPLETE;
        enic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
 
-
        err = register_netdev(netdev);
        if (err) {
                printk(KERN_ERR PFX