pegasus: fix USB device ID for ETX-US2
[safe/jmp/linux-2.6] / drivers / net / bnx2.c
index 320526b..188e356 100644 (file)
 #include "bnx2_fw.h"
 
 #define DRV_MODULE_NAME                "bnx2"
-#define DRV_MODULE_VERSION     "2.0.9"
-#define DRV_MODULE_RELDATE     "April 27, 2010"
+#define DRV_MODULE_VERSION     "2.0.15"
+#define DRV_MODULE_RELDATE     "May 4, 2010"
 #define FW_MIPS_FILE_06                "bnx2/bnx2-mips-06-5.0.0.j6.fw"
 #define FW_RV2P_FILE_06                "bnx2/bnx2-rv2p-06-5.0.0.j3.fw"
-#define FW_MIPS_FILE_09                "bnx2/bnx2-mips-09-5.0.0.j9.fw"
+#define FW_MIPS_FILE_09                "bnx2/bnx2-mips-09-5.0.0.j15.fw"
 #define FW_RV2P_FILE_09_Ax     "bnx2/bnx2-rv2p-09ax-5.0.0.j10.fw"
 #define FW_RV2P_FILE_09                "bnx2/bnx2-rv2p-09-5.0.0.j10.fw"
 
@@ -656,19 +656,11 @@ bnx2_netif_stop(struct bnx2 *bp, bool stop_cnic)
        if (stop_cnic)
                bnx2_cnic_stop(bp);
        if (netif_running(bp->dev)) {
-               int i;
-
                bnx2_napi_disable(bp);
                netif_tx_disable(bp->dev);
-               /* prevent tx timeout */
-               for (i = 0; i <  bp->dev->num_tx_queues; i++) {
-                       struct netdev_queue *txq;
-
-                       txq = netdev_get_tx_queue(bp->dev, i);
-                       txq->trans_start = jiffies;
-               }
        }
        bnx2_disable_int_sync(bp);
+       netif_carrier_off(bp->dev);     /* prevent tx timeout */
 }
 
 static void
@@ -677,6 +669,10 @@ bnx2_netif_start(struct bnx2 *bp, bool start_cnic)
        if (atomic_dec_and_test(&bp->intr_sem)) {
                if (netif_running(bp->dev)) {
                        netif_tx_wake_all_queues(bp->dev);
+                       spin_lock_bh(&bp->phy_lock);
+                       if (bp->link_up)
+                               netif_carrier_on(bp->dev);
+                       spin_unlock_bh(&bp->phy_lock);
                        bnx2_napi_enable(bp);
                        bnx2_enable_int(bp);
                        if (start_cnic)
@@ -2719,6 +2715,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
        }
 
        rx_buf->skb = skb;
+       rx_buf->desc = (struct l2_fhdr *) skb->data;
        dma_unmap_addr_set(rx_buf, mapping, mapping);
 
        rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
@@ -2941,6 +2938,7 @@ bnx2_reuse_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
        rxr->rx_prod_bseq += bp->rx_buf_use_size;
 
        prod_rx_buf->skb = skb;
+       prod_rx_buf->desc = (struct l2_fhdr *) skb->data;
 
        if (cons == prod)
                return;
@@ -3074,6 +3072,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
        u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
        struct l2_fhdr *rx_hdr;
        int rx_pkt = 0, pg_ring_used = 0;
+       struct pci_dev *pdev = bp->pdev;
 
        hw_cons = bnx2_get_hw_rx_cons(bnapi);
        sw_cons = rxr->rx_cons;
@@ -3086,7 +3085,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
        while (sw_cons != hw_cons) {
                unsigned int len, hdr_len;
                u32 status;
-               struct sw_bd *rx_buf;
+               struct sw_bd *rx_buf, *next_rx_buf;
                struct sk_buff *skb;
                dma_addr_t dma_addr;
                u16 vtag = 0;
@@ -3097,7 +3096,14 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
 
                rx_buf = &rxr->rx_buf_ring[sw_ring_cons];
                skb = rx_buf->skb;
+               prefetchw(skb);
 
+               if (!get_dma_ops(&pdev->dev)->sync_single_for_cpu) {
+                       next_rx_buf =
+                               &rxr->rx_buf_ring[
+                                       RX_RING_IDX(NEXT_RX_BD(sw_cons))];
+                       prefetch(next_rx_buf->desc);
+               }
                rx_buf->skb = NULL;
 
                dma_addr = dma_unmap_addr(rx_buf, mapping);
@@ -3106,7 +3112,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
                        BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,
                        PCI_DMA_FROMDEVICE);
 
-               rx_hdr = (struct l2_fhdr *) skb->data;
+               rx_hdr = rx_buf->desc;
                len = rx_hdr->l2_fhdr_pkt_len;
                status = rx_hdr->l2_fhdr_status;
 
@@ -5764,7 +5770,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
        rx_buf = &rxr->rx_buf_ring[rx_start_idx];
        rx_skb = rx_buf->skb;
 
-       rx_hdr = (struct l2_fhdr *) rx_skb->data;
+       rx_hdr = rx_buf->desc;
        skb_reserve(rx_skb, BNX2_RX_OFFSET);
 
        pci_dma_sync_single_for_cpu(bp->pdev,
@@ -6291,14 +6297,23 @@ static void
 bnx2_dump_state(struct bnx2 *bp)
 {
        struct net_device *dev = bp->dev;
+       u32 mcp_p0, mcp_p1;
 
        netdev_err(dev, "DEBUG: intr_sem[%x]\n", atomic_read(&bp->intr_sem));
-       netdev_err(dev, "DEBUG: EMAC_TX_STATUS[%08x] RPM_MGMT_PKT_CTRL[%08x]\n",
+       netdev_err(dev, "DEBUG: EMAC_TX_STATUS[%08x] EMAC_RX_STATUS[%08x]\n",
                   REG_RD(bp, BNX2_EMAC_TX_STATUS),
+                  REG_RD(bp, BNX2_EMAC_RX_STATUS));
+       netdev_err(dev, "DEBUG: RPM_MGMT_PKT_CTRL[%08x]\n",
                   REG_RD(bp, BNX2_RPM_MGMT_PKT_CTRL));
+       if (CHIP_NUM(bp) == CHIP_NUM_5709) {
+               mcp_p0 = BNX2_MCP_STATE_P0;
+               mcp_p1 = BNX2_MCP_STATE_P1;
+       } else {
+               mcp_p0 = BNX2_MCP_STATE_P0_5708;
+               mcp_p1 = BNX2_MCP_STATE_P1_5708;
+       }
        netdev_err(dev, "DEBUG: MCP_STATE_P0[%08x] MCP_STATE_P1[%08x]\n",
-                  bnx2_reg_rd_ind(bp, BNX2_MCP_STATE_P0),
-                  bnx2_reg_rd_ind(bp, BNX2_MCP_STATE_P1));
+                  bnx2_reg_rd_ind(bp, mcp_p0), bnx2_reg_rd_ind(bp, mcp_p1));
        netdev_err(dev, "DEBUG: HC_STATS_INTERRUPT_STATUS[%08x]\n",
                   REG_RD(bp, BNX2_HC_STATS_INTERRUPT_STATUS));
        if (bp->flags & BNX2_FLAG_USING_MSIX)