Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
[NIU]: Fix 1G PHY link state handling.
[NET]: Fix TX timeout regression in Intel drivers.

+19 -7
+6 -3
drivers/net/e1000/e1000_main.c
··· 3919 3919 { 3920 3920 struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); 3921 3921 struct net_device *poll_dev = adapter->netdev; 3922 - int work_done = 0; 3922 + int tx_cleaned = 0, work_done = 0; 3923 3923 3924 3924 /* Must NOT use netdev_priv macro here. */ 3925 3925 adapter = poll_dev->priv; ··· 3929 3929 * simultaneously. A failure obtaining the lock means 3930 3930 * tx_ring[0] is currently being cleaned anyway. */ 3931 3931 if (spin_trylock(&adapter->tx_queue_lock)) { 3932 - e1000_clean_tx_irq(adapter, 3933 - &adapter->tx_ring[0]); 3932 + tx_cleaned = e1000_clean_tx_irq(adapter, 3933 + &adapter->tx_ring[0]); 3934 3934 spin_unlock(&adapter->tx_queue_lock); 3935 3935 } 3936 3936 3937 3937 adapter->clean_rx(adapter, &adapter->rx_ring[0], 3938 3938 &work_done, budget); 3939 + 3940 + if (tx_cleaned) 3941 + work_done = budget; 3939 3942 3940 3943 /* If budget not fully consumed, exit the polling mode */ 3941 3944 if (work_done < budget) {
+5 -2
drivers/net/e1000e/netdev.c
··· 1384 1384 { 1385 1385 struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); 1386 1386 struct net_device *poll_dev = adapter->netdev; 1387 - int work_done = 0; 1387 + int tx_cleaned = 0, work_done = 0; 1388 1388 1389 1389 /* Must NOT use netdev_priv macro here. */ 1390 1390 adapter = poll_dev->priv; ··· 1394 1394 * simultaneously. A failure obtaining the lock means 1395 1395 * tx_ring is currently being cleaned anyway. */ 1396 1396 if (spin_trylock(&adapter->tx_queue_lock)) { 1397 - e1000_clean_tx_irq(adapter); 1397 + tx_cleaned = e1000_clean_tx_irq(adapter); 1398 1398 spin_unlock(&adapter->tx_queue_lock); 1399 1399 } 1400 1400 1401 1401 adapter->clean_rx(adapter, &work_done, budget); 1402 + 1403 + if (tx_cleaned) 1404 + work_done = budget; 1402 1405 1403 1406 /* If budget not fully consumed, exit the polling mode */ 1404 1407 if (work_done < budget) {
+5 -2
drivers/net/ixgbe/ixgbe_main.c
··· 1468 1468 struct ixgbe_adapter *adapter = container_of(napi, 1469 1469 struct ixgbe_adapter, napi); 1470 1470 struct net_device *netdev = adapter->netdev; 1471 - int work_done = 0; 1471 + int tx_cleaned = 0, work_done = 0; 1472 1472 1473 1473 /* In non-MSIX case, there is no multi-Tx/Rx queue */ 1474 - ixgbe_clean_tx_irq(adapter, adapter->tx_ring); 1474 + tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring); 1475 1475 ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done, 1476 1476 budget); 1477 + 1478 + if (tx_cleaned) 1479 + work_done = budget; 1477 1480 1478 1481 /* If budget not fully consumed, exit the polling mode */ 1479 1482 if (work_done < budget) {
+3
drivers/net/niu.c
··· 1319 1319 1320 1320 static int link_status_1g(struct niu *np, int *link_up_p) 1321 1321 { 1322 + struct niu_link_config *lp = &np->link_config; 1322 1323 u16 current_speed, bmsr; 1323 1324 unsigned long flags; 1324 1325 u8 current_duplex; ··· 1387 1386 link_up = 0; 1388 1387 } 1389 1388 } 1389 + lp->active_speed = current_speed; 1390 + lp->active_duplex = current_duplex; 1390 1391 err = 0; 1391 1392 1392 1393 out: