tg3: Give MSI-X vec 1 rx backlog space
[safe/jmp/linux-2.6] / drivers / net / tg3.c
index d29282f..661e9dd 100644 (file)
@@ -4733,7 +4733,7 @@ next_pkt_nopost:
        tw32_rx_mbox(tnapi->consmbox, sw_idx);
 
        /* Refill RX ring(s). */
-       if (!(tp->tg3_flags3 & TG3_FLG3_ENABLE_RSS) || tnapi == &tp->napi[1]) {
+       if (!(tp->tg3_flags3 & TG3_FLG3_ENABLE_RSS)) {
                if (work_mask & RXD_OPAQUE_RING_STD) {
                        tpr->rx_std_prod_idx = std_prod_idx % TG3_RX_RING_SIZE;
                        tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG,
@@ -4755,7 +4755,8 @@ next_pkt_nopost:
                tpr->rx_std_prod_idx = std_prod_idx % TG3_RX_RING_SIZE;
                tpr->rx_jmb_prod_idx = jmb_prod_idx % TG3_RX_JUMBO_RING_SIZE;
 
-               napi_schedule(&tp->napi[1].napi);
+               if (tnapi != &tp->napi[1])
+                       napi_schedule(&tp->napi[1].napi);
        }
 
        return received;
@@ -4893,25 +4894,23 @@ static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget)
                work_done += tg3_rx(tnapi, budget - work_done);
 
        if ((tp->tg3_flags3 & TG3_FLG3_ENABLE_RSS) && tnapi == &tp->napi[1]) {
+               struct tg3_rx_prodring_set *dpr = &tp->prodring[0];
                int i;
-               u32 std_prod_idx = tp->prodring[0].rx_std_prod_idx;
-               u32 jmb_prod_idx = tp->prodring[0].rx_jmb_prod_idx;
+               u32 std_prod_idx = dpr->rx_std_prod_idx;
+               u32 jmb_prod_idx = dpr->rx_jmb_prod_idx;
 
-               for (i = 2; i < tp->irq_cnt; i++)
-                       tg3_rx_prodring_xfer(tp, tnapi->prodring,
-                                            tp->napi[i].prodring);
+               for (i = 1; i < tp->irq_cnt; i++)
+                       tg3_rx_prodring_xfer(tp, dpr, tp->napi[i].prodring);
 
                wmb();
 
-               if (std_prod_idx != tp->prodring[0].rx_std_prod_idx) {
-                       u32 mbox = TG3_RX_STD_PROD_IDX_REG;
-                       tw32_rx_mbox(mbox, tp->prodring[0].rx_std_prod_idx);
-               }
+               if (std_prod_idx != dpr->rx_std_prod_idx)
+                       tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG,
+                                    dpr->rx_std_prod_idx);
 
-               if (jmb_prod_idx != tp->prodring[0].rx_jmb_prod_idx) {
-                       u32 mbox = TG3_RX_JMB_PROD_IDX_REG;
-                       tw32_rx_mbox(mbox, tp->prodring[0].rx_jmb_prod_idx);
-               }
+               if (jmb_prod_idx != dpr->rx_jmb_prod_idx)
+                       tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG,
+                                    dpr->rx_jmb_prod_idx);
 
                mmiowb();
        }
@@ -6173,8 +6172,7 @@ static void tg3_free_rings(struct tg3 *tp)
                        dev_kfree_skb_any(skb);
                }
 
-               if (tp->irq_cnt == 1 || j != tp->irq_cnt - 1)
-                       tg3_rx_prodring_free(tp, &tp->prodring[j]);
+               tg3_rx_prodring_free(tp, &tp->prodring[j]);
        }
 }
 
@@ -6210,9 +6208,10 @@ static int tg3_init_rings(struct tg3 *tp)
                if (tnapi->rx_rcb)
                        memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
 
-               if ((tp->irq_cnt == 1 || i != tp->irq_cnt - 1) &&
-                       tg3_rx_prodring_alloc(tp, &tp->prodring[i]))
+               if (tg3_rx_prodring_alloc(tp, &tp->prodring[i])) {
+                       tg3_free_rings(tp);
                        return -ENOMEM;
+               }
        }
 
        return 0;
@@ -6259,7 +6258,7 @@ static void tg3_free_consistent(struct tg3 *tp)
                tp->hw_stats = NULL;
        }
 
-       for (i = 0; i < (tp->irq_cnt == 1 ? 1 : tp->irq_cnt - 1); i++)
+       for (i = 0; i < tp->irq_cnt; i++)
                tg3_rx_prodring_fini(tp, &tp->prodring[i]);
 }
 
@@ -6271,7 +6270,7 @@ static int tg3_alloc_consistent(struct tg3 *tp)
 {
        int i;
 
-       for (i = 0; i < (tp->irq_cnt == 1 ? 1 : tp->irq_cnt - 1); i++) {
+       for (i = 0; i < tp->irq_cnt; i++) {
                if (tg3_rx_prodring_init(tp, &tp->prodring[i]))
                        goto err_out;
        }
@@ -6336,10 +6335,7 @@ static int tg3_alloc_consistent(struct tg3 *tp)
                        break;
                }
 
-               if (tp->irq_cnt == 1)
-                       tnapi->prodring = &tp->prodring[0];
-               else if (i)
-                       tnapi->prodring = &tp->prodring[i - 1];
+               tnapi->prodring = &tp->prodring[i];
 
                /*
                 * If multivector RSS is enabled, vector 0 does not handle