diff options
author | luka <luka@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-11-11 20:03:56 +0000 |
---|---|---|
committer | luka <luka@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-11-11 20:03:56 +0000 |
commit | 133d66da06e979b099f831b63f28ab0670992547 (patch) | |
tree | 7ede525bb03dcd04ed361c83bedfe8a11235786d /target/linux/cns3xxx/patches-3.3/430-ethernet_fix_tx_completion.patch | |
parent | f9aaf2e1ab0177d9ca741d3bcf867ffc8e25d91c (diff) |
cns3xxx: convert ethernet patches to files
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34161 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/cns3xxx/patches-3.3/430-ethernet_fix_tx_completion.patch')
-rw-r--r-- | target/linux/cns3xxx/patches-3.3/430-ethernet_fix_tx_completion.patch | 110 |
1 files changed, 0 insertions, 110 deletions
diff --git a/target/linux/cns3xxx/patches-3.3/430-ethernet_fix_tx_completion.patch b/target/linux/cns3xxx/patches-3.3/430-ethernet_fix_tx_completion.patch deleted file mode 100644 index 9a16c99f8..000000000 --- a/target/linux/cns3xxx/patches-3.3/430-ethernet_fix_tx_completion.patch +++ /dev/null @@ -1,110 +0,0 @@ ---- a/drivers/net/ethernet/cavium/cns3xxx_eth.c -+++ b/drivers/net/ethernet/cavium/cns3xxx_eth.c -@@ -28,6 +28,7 @@ - - #define RX_DESCS 128 - #define TX_DESCS 128 -+#define TX_DESC_RESERVE 20 - - #define RX_POOL_ALLOC_SIZE (sizeof(struct rx_desc) * RX_DESCS) - #define TX_POOL_ALLOC_SIZE (sizeof(struct tx_desc) * TX_DESCS) -@@ -266,6 +267,7 @@ struct _tx_ring { - u32 cur_index; - int num_used; - int num_count; -+ bool stopped; - }; - - struct _rx_ring { -@@ -546,7 +548,34 @@ out: - rx_ring->alloc_index = i; - } - --static void clear_tx_desc(struct sw *sw) -+static void eth_check_num_used(struct _tx_ring *tx_ring) -+{ -+ bool stop = false; -+ int i; -+ -+ if (tx_ring->num_used >= TX_DESCS - TX_DESC_RESERVE) -+ stop = true; -+ -+ if (tx_ring->stopped == stop) -+ return; -+ -+ tx_ring->stopped = stop; -+ for (i = 0; i < 4; i++) { -+ struct port *port = switch_port_tab[i]; -+ struct net_device *dev; -+ -+ if (!port) -+ continue; -+ -+ dev = port->netdev; -+ if (stop) -+ netif_stop_queue(dev); -+ else -+ netif_wake_queue(dev); -+ } -+} -+ -+static void eth_complete_tx(struct sw *sw) - { - struct _tx_ring *tx_ring = sw->tx_ring; - struct tx_desc *desc; -@@ -555,9 +584,6 @@ static void clear_tx_desc(struct sw *sw) - int num_used = tx_ring->num_used; - struct sk_buff *skb; - -- if (num_used < (TX_DESCS >> 1)) -- return; -- - index = tx_ring->free_index; - desc = &(tx_ring)->desc[index]; - for (i = 0; i < num_used; i++) { -@@ -580,6 +606,7 @@ static void clear_tx_desc(struct sw *sw) - } - tx_ring->free_index = index; - tx_ring->num_used -= i; -+ eth_check_num_used(tx_ring); - } - - static int eth_poll(struct napi_struct *napi, int budget) -@@ -688,6 +715,10 @@ static int eth_poll(struct napi_struct * - - enable_rx_dma(sw); - -+ spin_lock_bh(&tx_lock); -+ eth_complete_tx(sw); -+ spin_unlock_bh(&tx_lock); -+ - return received; - } - -@@ -732,21 +763,19 @@ static int eth_xmit(struct sk_buff *skb, - skb_walk_frags(skb, skb1) - nr_desc++; - -- spin_lock(&tx_lock); -+ spin_lock_bh(&tx_lock); - -+ eth_complete_tx(sw); - if ((tx_ring->num_used + nr_desc + 1) >= TX_DESCS) { -- clear_tx_desc(sw); -- if ((tx_ring->num_used + nr_desc + 1) >= TX_DESCS) { -- spin_unlock(&tx_lock); -- return NETDEV_TX_BUSY; -- } -+ spin_unlock_bh(&tx_lock); -+ return NETDEV_TX_BUSY; - } - - index = index0 = tx_ring->cur_index; - index_last = (index0 + nr_desc) % TX_DESCS; - tx_ring->cur_index = (index_last + 1) % TX_DESCS; - -- spin_unlock(&tx_lock); -+ spin_unlock_bh(&tx_lock); - - config0 = FORCE_ROUTE; - if (skb->ip_summed == CHECKSUM_PARTIAL) |