diff options
author | Ron Mercer <ron.mercer@qlogic.com> | 2009-02-12 19:38:03 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-02-12 19:38:03 -0500 |
commit | 0d979f74a920bcc18eb451d363f02083a625294c (patch) | |
tree | 944bbf8282c99fc3d71b94559e7dc74af263604a | |
parent | 06a3d510faf6fdec43daaf6f4d94fe24edf650cd (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>
-rw-r--r-- | drivers/net/qlge/qlge_main.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index fc7d210ec96b..54b0a9e9d898 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) |