aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorRon Mercer <ron.mercer@qlogic.com>2009-02-12 19:38:03 -0500
committerDavid S. Miller <davem@davemloft.net>2009-02-12 19:38:03 -0500
commit0d979f74a920bcc18eb451d363f02083a625294c (patch)
tree944bbf8282c99fc3d71b94559e7dc74af263604a /drivers/net
parent06a3d510faf6fdec43daaf6f4d94fe24edf650cd (diff)
qlge: bugfix: Fix TSO breakage.
Moved the buffer mapping to a point after TSO logic has modified the iph->check field. We were seeing stale data on the PCIe bus. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/qlge/qlge_main.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index fc7d210ec96..54b0a9e9d89 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -1936,10 +1936,6 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
1936 tx_ring_desc = &tx_ring->q[tx_ring->prod_idx]; 1936 tx_ring_desc = &tx_ring->q[tx_ring->prod_idx];
1937 mac_iocb_ptr = tx_ring_desc->queue_entry; 1937 mac_iocb_ptr = tx_ring_desc->queue_entry;
1938 memset((void *)mac_iocb_ptr, 0, sizeof(mac_iocb_ptr)); 1938 memset((void *)mac_iocb_ptr, 0, sizeof(mac_iocb_ptr));
1939 if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) != NETDEV_TX_OK) {
1940 QPRINTK(qdev, TX_QUEUED, ERR, "Could not map the segments.\n");
1941 return NETDEV_TX_BUSY;
1942 }
1943 1939
1944 mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB; 1940 mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
1945 mac_iocb_ptr->tid = tx_ring_desc->index; 1941 mac_iocb_ptr->tid = tx_ring_desc->index;
@@ -1965,6 +1961,12 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
1965 ql_hw_csum_setup(skb, 1961 ql_hw_csum_setup(skb,
1966 (struct ob_mac_tso_iocb_req *)mac_iocb_ptr); 1962 (struct ob_mac_tso_iocb_req *)mac_iocb_ptr);
1967 } 1963 }
1964 if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) !=
1965 NETDEV_TX_OK) {
1966 QPRINTK(qdev, TX_QUEUED, ERR,
1967 "Could not map the segments.\n");
1968 return NETDEV_TX_BUSY;
1969 }
1968 QL_DUMP_OB_MAC_IOCB(mac_iocb_ptr); 1970 QL_DUMP_OB_MAC_IOCB(mac_iocb_ptr);
1969 tx_ring->prod_idx++; 1971 tx_ring->prod_idx++;
1970 if (tx_ring->prod_idx == tx_ring->wq_len) 1972 if (tx_ring->prod_idx == tx_ring->wq_len)