diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 26e9db8c1b95..5782511c9459 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -4804,7 +4804,8 @@ static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) | |||
4804 | struct tg3 *tp = tnapi->tp; | 4804 | struct tg3 *tp = tnapi->tp; |
4805 | 4805 | ||
4806 | prefetch(tnapi->hw_status); | 4806 | prefetch(tnapi->hw_status); |
4807 | prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); | 4807 | if (tnapi->rx_rcb) |
4808 | prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); | ||
4808 | 4809 | ||
4809 | if (likely(!tg3_irq_sync(tp))) | 4810 | if (likely(!tg3_irq_sync(tp))) |
4810 | napi_schedule(&tnapi->napi); | 4811 | napi_schedule(&tnapi->napi); |
@@ -4822,7 +4823,8 @@ static irqreturn_t tg3_msi(int irq, void *dev_id) | |||
4822 | struct tg3 *tp = tnapi->tp; | 4823 | struct tg3 *tp = tnapi->tp; |
4823 | 4824 | ||
4824 | prefetch(tnapi->hw_status); | 4825 | prefetch(tnapi->hw_status); |
4825 | prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); | 4826 | if (tnapi->rx_rcb) |
4827 | prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); | ||
4826 | /* | 4828 | /* |
4827 | * Writing any value to intr-mbox-0 clears PCI INTA# and | 4829 | * Writing any value to intr-mbox-0 clears PCI INTA# and |
4828 | * chip-internal interrupt pending events. | 4830 | * chip-internal interrupt pending events. |
@@ -5765,6 +5767,9 @@ static void tg3_free_rings(struct tg3 *tp) | |||
5765 | for (j = 0; j < tp->irq_cnt; j++) { | 5767 | for (j = 0; j < tp->irq_cnt; j++) { |
5766 | struct tg3_napi *tnapi = &tp->napi[j]; | 5768 | struct tg3_napi *tnapi = &tp->napi[j]; |
5767 | 5769 | ||
5770 | if (!tnapi->tx_buffers) | ||
5771 | continue; | ||
5772 | |||
5768 | for (i = 0; i < TG3_TX_RING_SIZE; ) { | 5773 | for (i = 0; i < TG3_TX_RING_SIZE; ) { |
5769 | struct tx_ring_info *txp; | 5774 | struct tx_ring_info *txp; |
5770 | struct sk_buff *skb; | 5775 | struct sk_buff *skb; |
@@ -5815,10 +5820,12 @@ static int tg3_init_rings(struct tg3 *tp) | |||
5815 | 5820 | ||
5816 | tnapi->tx_prod = 0; | 5821 | tnapi->tx_prod = 0; |
5817 | tnapi->tx_cons = 0; | 5822 | tnapi->tx_cons = 0; |
5818 | memset(tnapi->tx_ring, 0, TG3_TX_RING_BYTES); | 5823 | if (tnapi->tx_ring) |
5824 | memset(tnapi->tx_ring, 0, TG3_TX_RING_BYTES); | ||
5819 | 5825 | ||
5820 | tnapi->rx_rcb_ptr = 0; | 5826 | tnapi->rx_rcb_ptr = 0; |
5821 | memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); | 5827 | if (tnapi->rx_rcb) |
5828 | memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); | ||
5822 | } | 5829 | } |
5823 | 5830 | ||
5824 | return tg3_rx_prodring_alloc(tp, &tp->prodring[0]); | 5831 | return tg3_rx_prodring_alloc(tp, &tp->prodring[0]); |
@@ -5898,6 +5905,13 @@ static int tg3_alloc_consistent(struct tg3 *tp) | |||
5898 | 5905 | ||
5899 | memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); | 5906 | memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); |
5900 | 5907 | ||
5908 | /* | ||
5909 | * If multivector RSS is enabled, vector 0 does not handle | ||
5910 | * rx or tx interrupts. Don't allocate any resources for it. | ||
5911 | */ | ||
5912 | if (!i && (tp->tg3_flags3 & TG3_FLG3_ENABLE_RSS)) | ||
5913 | continue; | ||
5914 | |||
5901 | tnapi->rx_rcb = pci_alloc_consistent(tp->pdev, | 5915 | tnapi->rx_rcb = pci_alloc_consistent(tp->pdev, |
5902 | TG3_RX_RCB_RING_BYTES(tp), | 5916 | TG3_RX_RCB_RING_BYTES(tp), |
5903 | &tnapi->rx_rcb_mapping); | 5917 | &tnapi->rx_rcb_mapping); |
@@ -10166,8 +10180,13 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
10166 | struct tg3_napi *tnapi, *rnapi; | 10180 | struct tg3_napi *tnapi, *rnapi; |
10167 | struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; | 10181 | struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; |
10168 | 10182 | ||
10169 | tnapi = &tp->napi[0]; | 10183 | if (tp->irq_cnt > 1) { |
10170 | rnapi = &tp->napi[0]; | 10184 | tnapi = &tp->napi[1]; |
10185 | rnapi = &tp->napi[1]; | ||
10186 | } else { | ||
10187 | tnapi = &tp->napi[0]; | ||
10188 | rnapi = &tp->napi[0]; | ||
10189 | } | ||
10171 | coal_now = tnapi->coal_now | rnapi->coal_now; | 10190 | coal_now = tnapi->coal_now | rnapi->coal_now; |
10172 | 10191 | ||
10173 | if (loopback_mode == TG3_MAC_LOOPBACK) { | 10192 | if (loopback_mode == TG3_MAC_LOOPBACK) { |