aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
authorMatt Carlson <mcarlson@broadcom.com>2010-06-05 13:24:34 -0400
committerDavid S. Miller <davem@davemloft.net>2010-06-06 20:56:00 -0400
commit2430b031be8d3eb57f22f2df6fb3784564109db0 (patch)
treeabcdd30bca7f5e2378ef03e8d42a9b9b00015cc4 /drivers/net/tg3.c
parent2601d8a0049c8b5d29cd5adb844a305a804e505f (diff)
tg3: Allow single MSI-X vector allocations
This patch changes the code to make it legal to allocate only one MSI-X vector. It also fixes a bug where the driver was not checking for error return codes from pci_enable_msix(). Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r--drivers/net/tg3.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 3dccc58e6496..d169337bc7ef 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -145,8 +145,6 @@
145#define TG3_RX_JMB_BUFF_RING_SIZE \ 145#define TG3_RX_JMB_BUFF_RING_SIZE \
146 (sizeof(struct ring_info) * TG3_RX_JUMBO_RING_SIZE) 146 (sizeof(struct ring_info) * TG3_RX_JUMBO_RING_SIZE)
147 147
148#define TG3_RSS_MIN_NUM_MSIX_VECS 2
149
150/* Due to a hardware bug, the 5701 can only DMA to memory addresses 148/* Due to a hardware bug, the 5701 can only DMA to memory addresses
151 * that are at least dword aligned when used in PCIX mode. The driver 149 * that are at least dword aligned when used in PCIX mode. The driver
152 * works around this bug by double copying the packet. This workaround 150 * works around this bug by double copying the packet. This workaround
@@ -8797,9 +8795,9 @@ static bool tg3_enable_msix(struct tg3 *tp)
8797 } 8795 }
8798 8796
8799 rc = pci_enable_msix(tp->pdev, msix_ent, tp->irq_cnt); 8797 rc = pci_enable_msix(tp->pdev, msix_ent, tp->irq_cnt);
8800 if (rc != 0) { 8798 if (rc < 0) {
8801 if (rc < TG3_RSS_MIN_NUM_MSIX_VECS) 8799 return false;
8802 return false; 8800 } else if (rc != 0) {
8803 if (pci_enable_msix(tp->pdev, msix_ent, rc)) 8801 if (pci_enable_msix(tp->pdev, msix_ent, rc))
8804 return false; 8802 return false;
8805 netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n", 8803 netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n",
@@ -8807,16 +8805,18 @@ static bool tg3_enable_msix(struct tg3 *tp)
8807 tp->irq_cnt = rc; 8805 tp->irq_cnt = rc;
8808 } 8806 }
8809 8807
8810 tp->tg3_flags3 |= TG3_FLG3_ENABLE_RSS;
8811
8812 for (i = 0; i < tp->irq_max; i++) 8808 for (i = 0; i < tp->irq_max; i++)
8813 tp->napi[i].irq_vec = msix_ent[i].vector; 8809 tp->napi[i].irq_vec = msix_ent[i].vector;
8814 8810
8815 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) { 8811 tp->dev->real_num_tx_queues = 1;
8816 tp->tg3_flags3 |= TG3_FLG3_ENABLE_TSS; 8812 if (tp->irq_cnt > 1) {
8817 tp->dev->real_num_tx_queues = tp->irq_cnt - 1; 8813 tp->tg3_flags3 |= TG3_FLG3_ENABLE_RSS;
8818 } else 8814
8819 tp->dev->real_num_tx_queues = 1; 8815 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) {
8816 tp->tg3_flags3 |= TG3_FLG3_ENABLE_TSS;
8817 tp->dev->real_num_tx_queues = tp->irq_cnt - 1;
8818 }
8819 }
8820 8820
8821 return true; 8821 return true;
8822} 8822}