aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/igb
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-07-17 04:56:23 -0400
committerDavid S. Miller <davem@davemloft.net>2008-07-17 22:21:07 -0400
commitfd2ea0a79faad824258af5dcec1927aa24d81c16 (patch)
tree644fd4ce92227cc319c7a54c63ea07a96b8c6b8d /drivers/net/igb
parent24344d2600108b9b79a60c0e4c43b3c499856d14 (diff)
net: Use queue aware tests throughout.
This effectively "flips the switch" by making the core networking and multiqueue-aware drivers use the new TX multiqueue structures. Non-multiqueue drivers need no changes. The interfaces they use such as netif_stop_queue() degenerate into an operation on TX queue zero. So everything "just works" for them. Code that really wants to do "X" to all TX queues now invokes a routine that does so, such as netif_tx_wake_all_queues(), netif_tx_stop_all_queues(), etc. pktgen and netpoll required a little bit more surgery than the others. In particular the pktgen changes, whilst functional, could be largely improved. The initial check in pktgen_xmit() will sometimes check the wrong queue, which is mostly harmless. The thing to do is probably to invoke fill_packet() earlier. The bulk of the netpoll changes is to make the code operate solely on the TX queue indicated by by the SKB queue mapping. Setting of the SKB queue mapping is entirely confined inside of net/core/dev.c:dev_pick_tx(). If we end up needing any kind of special semantics (drops, for example) it will be implemented here. Finally, we now have a "real_num_tx_queues" which is where the driver indicates how many TX queues are actually active. With IGB changes from Jeff Kirsher. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/igb')
-rw-r--r--drivers/net/igb/igb_main.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 471c194cd54..81bba6983dd 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -533,7 +533,7 @@ msi_only:
533 adapter->flags |= IGB_FLAG_HAS_MSI; 533 adapter->flags |= IGB_FLAG_HAS_MSI;
534 534
535 /* Notify the stack of the (possibly) reduced Tx Queue count. */ 535 /* Notify the stack of the (possibly) reduced Tx Queue count. */
536 adapter->netdev->egress_subqueue_count = adapter->num_tx_queues; 536 adapter->netdev->real_num_tx_queues = adapter->num_tx_queues;
537 return; 537 return;
538} 538}
539 539
@@ -821,9 +821,7 @@ void igb_down(struct igb_adapter *adapter)
821 wr32(E1000_RCTL, rctl & ~E1000_RCTL_EN); 821 wr32(E1000_RCTL, rctl & ~E1000_RCTL_EN);
822 /* flush and sleep below */ 822 /* flush and sleep below */
823 823
824 netif_stop_queue(netdev); 824 netif_tx_stop_all_queues(netdev);
825 for (i = 0; i < adapter->num_tx_queues; i++)
826 netif_stop_subqueue(netdev, i);
827 825
828 /* disable transmits in the hardware */ 826 /* disable transmits in the hardware */
829 tctl = rd32(E1000_TCTL); 827 tctl = rd32(E1000_TCTL);
@@ -1266,9 +1264,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
1266 1264
1267 /* tell the stack to leave us alone until igb_open() is called */ 1265 /* tell the stack to leave us alone until igb_open() is called */
1268 netif_carrier_off(netdev); 1266 netif_carrier_off(netdev);
1269 netif_stop_queue(netdev); 1267 netif_tx_stop_all_queues(netdev);
1270 for (i = 0; i < adapter->num_tx_queues; i++)
1271 netif_stop_subqueue(netdev, i);
1272 1268
1273 strcpy(netdev->name, "eth%d"); 1269 strcpy(netdev->name, "eth%d");
1274 err = register_netdev(netdev); 1270 err = register_netdev(netdev);
@@ -2315,7 +2311,6 @@ static void igb_watchdog_task(struct work_struct *work)
2315 struct e1000_mac_info *mac = &adapter->hw.mac; 2311 struct e1000_mac_info *mac = &adapter->hw.mac;
2316 u32 link; 2312 u32 link;
2317 s32 ret_val; 2313 s32 ret_val;
2318 int i;
2319 2314
2320 if ((netif_carrier_ok(netdev)) && 2315 if ((netif_carrier_ok(netdev)) &&
2321 (rd32(E1000_STATUS) & E1000_STATUS_LU)) 2316 (rd32(E1000_STATUS) & E1000_STATUS_LU))
@@ -2371,9 +2366,7 @@ static void igb_watchdog_task(struct work_struct *work)
2371 } 2366 }
2372 2367
2373 netif_carrier_on(netdev); 2368 netif_carrier_on(netdev);
2374 netif_wake_queue(netdev); 2369 netif_tx_wake_all_queues(netdev);
2375 for (i = 0; i < adapter->num_tx_queues; i++)
2376 netif_wake_subqueue(netdev, i);
2377 2370
2378 if (!test_bit(__IGB_DOWN, &adapter->state)) 2371 if (!test_bit(__IGB_DOWN, &adapter->state))
2379 mod_timer(&adapter->phy_info_timer, 2372 mod_timer(&adapter->phy_info_timer,
@@ -2385,9 +2378,7 @@ static void igb_watchdog_task(struct work_struct *work)
2385 adapter->link_duplex = 0; 2378 adapter->link_duplex = 0;
2386 dev_info(&adapter->pdev->dev, "NIC Link is Down\n"); 2379 dev_info(&adapter->pdev->dev, "NIC Link is Down\n");
2387 netif_carrier_off(netdev); 2380 netif_carrier_off(netdev);
2388 netif_stop_queue(netdev); 2381 netif_tx_stop_all_queues(netdev);
2389 for (i = 0; i < adapter->num_tx_queues; i++)
2390 netif_stop_subqueue(netdev, i);
2391 if (!test_bit(__IGB_DOWN, &adapter->state)) 2382 if (!test_bit(__IGB_DOWN, &adapter->state))
2392 mod_timer(&adapter->phy_info_timer, 2383 mod_timer(&adapter->phy_info_timer,
2393 round_jiffies(jiffies + 2 * HZ)); 2384 round_jiffies(jiffies + 2 * HZ));