aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-04-07 18:50:40 -0400
committerDavid S. Miller <davem@davemloft.net>2009-04-08 18:58:25 -0400
commitd877f1e344f5515988d9dcd6db5d4285911778a3 (patch)
tree27b711302f80335942d870655ee80b7ba6e0eac0 /drivers/net/netxen/netxen_nic_main.c
parent1b1f789818c6be9437cfe199932ee13faafca60f (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.c52
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
108void 108void
109netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, 109netxen_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
116static uint32_t crb_cmd_consumer[4] = { 116static uint32_t crb_cmd_consumer[4] = {
@@ -120,10 +120,10 @@ static uint32_t crb_cmd_consumer[4] = {
120 120
121static inline void 121static inline void
122netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, 122netxen_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
129static uint32_t msi_tgt_status[8] = { 129static 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
1304netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) 1304netxen_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;