diff options
author | Dhananjay Phadke <dhananjay@netxen.com> | 2009-04-07 18:50:40 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-04-08 18:58:25 -0400 |
commit | d877f1e344f5515988d9dcd6db5d4285911778a3 (patch) | |
tree | 27b711302f80335942d870655ee80b7ba6e0eac0 /drivers/net/netxen/netxen_nic_main.c | |
parent | 1b1f789818c6be9437cfe199932ee13faafca60f (diff) |
netxen: refactor transmit code
o move tx stuff into nx_host_tx_ring structure, this will
help managing multiple tx rings in future.
o sanitize some variable names
Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 52 |
1 files changed, 25 insertions, 27 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 853dee8057d..22b2d491c78 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -107,10 +107,10 @@ static uint32_t crb_cmd_producer[4] = { | |||
107 | 107 | ||
108 | void | 108 | void |
109 | netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, | 109 | netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, |
110 | uint32_t crb_producer) | 110 | struct nx_host_tx_ring *tx_ring, u32 producer) |
111 | { | 111 | { |
112 | adapter->pci_write_normalize(adapter, | 112 | adapter->pci_write_normalize(adapter, |
113 | adapter->crb_addr_cmd_producer, crb_producer); | 113 | tx_ring->crb_cmd_producer, producer); |
114 | } | 114 | } |
115 | 115 | ||
116 | static uint32_t crb_cmd_consumer[4] = { | 116 | static uint32_t crb_cmd_consumer[4] = { |
@@ -120,10 +120,10 @@ static uint32_t crb_cmd_consumer[4] = { | |||
120 | 120 | ||
121 | static inline void | 121 | static inline void |
122 | netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, | 122 | netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, |
123 | u32 crb_consumer) | 123 | struct nx_host_tx_ring *tx_ring, u32 consumer) |
124 | { | 124 | { |
125 | adapter->pci_write_normalize(adapter, | 125 | adapter->pci_write_normalize(adapter, |
126 | adapter->crb_addr_cmd_consumer, crb_consumer); | 126 | tx_ring->crb_cmd_consumer, consumer); |
127 | } | 127 | } |
128 | 128 | ||
129 | static uint32_t msi_tgt_status[8] = { | 129 | static uint32_t msi_tgt_status[8] = { |
@@ -814,6 +814,7 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
814 | struct pci_dev *pdev = adapter->pdev; | 814 | struct pci_dev *pdev = adapter->pdev; |
815 | int err, ring; | 815 | int err, ring; |
816 | struct nx_host_rds_ring *rds_ring; | 816 | struct nx_host_rds_ring *rds_ring; |
817 | struct nx_host_tx_ring *tx_ring; | ||
817 | 818 | ||
818 | err = netxen_init_firmware(adapter); | 819 | err = netxen_init_firmware(adapter); |
819 | if (err != 0) { | 820 | if (err != 0) { |
@@ -843,13 +844,12 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
843 | } | 844 | } |
844 | 845 | ||
845 | if (adapter->fw_major < 4) { | 846 | if (adapter->fw_major < 4) { |
846 | adapter->crb_addr_cmd_producer = | 847 | tx_ring = &adapter->tx_ring; |
847 | crb_cmd_producer[adapter->portnum]; | 848 | tx_ring->crb_cmd_producer = crb_cmd_producer[adapter->portnum]; |
848 | adapter->crb_addr_cmd_consumer = | 849 | tx_ring->crb_cmd_consumer = crb_cmd_consumer[adapter->portnum]; |
849 | crb_cmd_consumer[adapter->portnum]; | ||
850 | 850 | ||
851 | netxen_nic_update_cmd_producer(adapter, 0); | 851 | netxen_nic_update_cmd_producer(adapter, tx_ring, 0); |
852 | netxen_nic_update_cmd_consumer(adapter, 0); | 852 | netxen_nic_update_cmd_consumer(adapter, tx_ring, 0); |
853 | } | 853 | } |
854 | 854 | ||
855 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { | 855 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { |
@@ -1304,7 +1304,7 @@ static int | |||
1304 | netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | 1304 | netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) |
1305 | { | 1305 | { |
1306 | struct netxen_adapter *adapter = netdev_priv(netdev); | 1306 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1307 | struct netxen_hardware_context *hw = &adapter->ahw; | 1307 | struct nx_host_tx_ring *tx_ring = &adapter->tx_ring; |
1308 | unsigned int first_seg_len = skb->len - skb->data_len; | 1308 | unsigned int first_seg_len = skb->len - skb->data_len; |
1309 | struct netxen_cmd_buffer *pbuf; | 1309 | struct netxen_cmd_buffer *pbuf; |
1310 | struct netxen_skb_frag *buffrag; | 1310 | struct netxen_skb_frag *buffrag; |
@@ -1315,28 +1315,26 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1315 | 1315 | ||
1316 | u32 producer, consumer; | 1316 | u32 producer, consumer; |
1317 | int frag_count, no_of_desc; | 1317 | int frag_count, no_of_desc; |
1318 | u32 num_txd = adapter->num_txd; | 1318 | u32 num_txd = tx_ring->num_desc; |
1319 | bool is_tso = false; | 1319 | bool is_tso = false; |
1320 | 1320 | ||
1321 | frag_count = skb_shinfo(skb)->nr_frags + 1; | 1321 | frag_count = skb_shinfo(skb)->nr_frags + 1; |
1322 | 1322 | ||
1323 | /* There 4 fragments per descriptor */ | 1323 | /* 4 fragments per cmd des */ |
1324 | no_of_desc = (frag_count + 3) >> 2; | 1324 | no_of_desc = (frag_count + 3) >> 2; |
1325 | 1325 | ||
1326 | producer = adapter->cmd_producer; | 1326 | producer = tx_ring->producer; |
1327 | smp_mb(); | 1327 | smp_mb(); |
1328 | consumer = adapter->last_cmd_consumer; | 1328 | consumer = tx_ring->sw_consumer; |
1329 | if ((no_of_desc+2) > find_diff_among(producer, consumer, num_txd)) { | 1329 | if ((no_of_desc+2) > find_diff_among(producer, consumer, num_txd)) { |
1330 | netif_stop_queue(netdev); | 1330 | netif_stop_queue(netdev); |
1331 | smp_mb(); | 1331 | smp_mb(); |
1332 | return NETDEV_TX_BUSY; | 1332 | return NETDEV_TX_BUSY; |
1333 | } | 1333 | } |
1334 | 1334 | ||
1335 | /* Copy the descriptors into the hardware */ | 1335 | hwdesc = &tx_ring->desc_head[producer]; |
1336 | hwdesc = &hw->cmd_desc_head[producer]; | ||
1337 | netxen_clear_cmddesc((u64 *)hwdesc); | 1336 | netxen_clear_cmddesc((u64 *)hwdesc); |
1338 | /* Take skb->data itself */ | 1337 | pbuf = &tx_ring->cmd_buf_arr[producer]; |
1339 | pbuf = &adapter->cmd_buf_arr[producer]; | ||
1340 | 1338 | ||
1341 | is_tso = netxen_tso_check(netdev, hwdesc, skb); | 1339 | is_tso = netxen_tso_check(netdev, hwdesc, skb); |
1342 | 1340 | ||
@@ -1365,9 +1363,9 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1365 | if ((i & 0x3) == 0) { | 1363 | if ((i & 0x3) == 0) { |
1366 | k = 0; | 1364 | k = 0; |
1367 | producer = get_next_index(producer, num_txd); | 1365 | producer = get_next_index(producer, num_txd); |
1368 | hwdesc = &hw->cmd_desc_head[producer]; | 1366 | hwdesc = &tx_ring->desc_head[producer]; |
1369 | netxen_clear_cmddesc((u64 *)hwdesc); | 1367 | netxen_clear_cmddesc((u64 *)hwdesc); |
1370 | pbuf = &adapter->cmd_buf_arr[producer]; | 1368 | pbuf = &tx_ring->cmd_buf_arr[producer]; |
1371 | pbuf->skb = NULL; | 1369 | pbuf->skb = NULL; |
1372 | } | 1370 | } |
1373 | frag = &skb_shinfo(skb)->frags[i - 1]; | 1371 | frag = &skb_shinfo(skb)->frags[i - 1]; |
@@ -1419,8 +1417,8 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1419 | more_hdr = 0; | 1417 | more_hdr = 0; |
1420 | } | 1418 | } |
1421 | /* copy the MAC/IP/TCP headers to the cmd descriptor list */ | 1419 | /* copy the MAC/IP/TCP headers to the cmd descriptor list */ |
1422 | hwdesc = &hw->cmd_desc_head[producer]; | 1420 | hwdesc = &tx_ring->desc_head[producer]; |
1423 | pbuf = &adapter->cmd_buf_arr[producer]; | 1421 | pbuf = &tx_ring->cmd_buf_arr[producer]; |
1424 | pbuf->skb = NULL; | 1422 | pbuf->skb = NULL; |
1425 | 1423 | ||
1426 | /* copy the first 64 bytes */ | 1424 | /* copy the first 64 bytes */ |
@@ -1429,8 +1427,8 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1429 | producer = get_next_index(producer, num_txd); | 1427 | producer = get_next_index(producer, num_txd); |
1430 | 1428 | ||
1431 | if (more_hdr) { | 1429 | if (more_hdr) { |
1432 | hwdesc = &hw->cmd_desc_head[producer]; | 1430 | hwdesc = &tx_ring->desc_head[producer]; |
1433 | pbuf = &adapter->cmd_buf_arr[producer]; | 1431 | pbuf = &tx_ring->cmd_buf_arr[producer]; |
1434 | pbuf->skb = NULL; | 1432 | pbuf->skb = NULL; |
1435 | /* copy the next 64 bytes - should be enough except | 1433 | /* copy the next 64 bytes - should be enough except |
1436 | * for pathological case | 1434 | * for pathological case |
@@ -1443,10 +1441,10 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1443 | } | 1441 | } |
1444 | } | 1442 | } |
1445 | 1443 | ||
1446 | adapter->cmd_producer = producer; | 1444 | tx_ring->producer = producer; |
1447 | adapter->stats.txbytes += skb->len; | 1445 | adapter->stats.txbytes += skb->len; |
1448 | 1446 | ||
1449 | netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer); | 1447 | netxen_nic_update_cmd_producer(adapter, tx_ring, producer); |
1450 | 1448 | ||
1451 | adapter->stats.xmitcalled++; | 1449 | adapter->stats.xmitcalled++; |
1452 | netdev->trans_start = jiffies; | 1450 | netdev->trans_start = jiffies; |