diff options
author | Sucheta Chakraborty <sucheta.chakraborty@qlogic.com> | 2010-10-04 00:20:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-05 01:46:50 -0400 |
commit | 7e56cac4b68805470849ba373dd313ba0e7cdb81 (patch) | |
tree | ac25d1e2bd40838b37e9e51a2c6ab8afc321b982 /drivers/net/qlcnic/qlcnic_main.c | |
parent | b501595cbb8afeaa9aaa870b3d29ef051403511a (diff) |
qlcnic: fix vlan TSO on big endian machine
o desc->vlan_tci is in __le16 format. Doing htons and
cpu_to_le64 again on vlan_tci, result in invalid value on ppc.
Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_main.c')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index a3d7705a2dd..6001f41a70a 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -28,6 +28,7 @@ | |||
28 | 28 | ||
29 | #include "qlcnic.h" | 29 | #include "qlcnic.h" |
30 | 30 | ||
31 | #include <linux/swab.h> | ||
31 | #include <linux/dma-mapping.h> | 32 | #include <linux/dma-mapping.h> |
32 | #include <linux/if_vlan.h> | 33 | #include <linux/if_vlan.h> |
33 | #include <net/ip.h> | 34 | #include <net/ip.h> |
@@ -1834,11 +1835,12 @@ static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter) | |||
1834 | } | 1835 | } |
1835 | 1836 | ||
1836 | static void qlcnic_change_filter(struct qlcnic_adapter *adapter, | 1837 | static void qlcnic_change_filter(struct qlcnic_adapter *adapter, |
1837 | u64 uaddr, u16 vlan_id, struct qlcnic_host_tx_ring *tx_ring) | 1838 | u64 uaddr, __le16 vlan_id, struct qlcnic_host_tx_ring *tx_ring) |
1838 | { | 1839 | { |
1839 | struct cmd_desc_type0 *hwdesc; | 1840 | struct cmd_desc_type0 *hwdesc; |
1840 | struct qlcnic_nic_req *req; | 1841 | struct qlcnic_nic_req *req; |
1841 | struct qlcnic_mac_req *mac_req; | 1842 | struct qlcnic_mac_req *mac_req; |
1843 | struct qlcnic_vlan_req *vlan_req; | ||
1842 | u32 producer; | 1844 | u32 producer; |
1843 | u64 word; | 1845 | u64 word; |
1844 | 1846 | ||
@@ -1856,7 +1858,8 @@ static void qlcnic_change_filter(struct qlcnic_adapter *adapter, | |||
1856 | mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | 1858 | mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; |
1857 | memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN); | 1859 | memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN); |
1858 | 1860 | ||
1859 | req->words[1] = cpu_to_le64(vlan_id); | 1861 | vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; |
1862 | vlan_req->vlan_id = vlan_id; | ||
1860 | 1863 | ||
1861 | tx_ring->producer = get_next_index(producer, tx_ring->num_desc); | 1864 | tx_ring->producer = get_next_index(producer, tx_ring->num_desc); |
1862 | } | 1865 | } |
@@ -1875,7 +1878,7 @@ qlcnic_send_filter(struct qlcnic_adapter *adapter, | |||
1875 | struct hlist_node *tmp_hnode, *n; | 1878 | struct hlist_node *tmp_hnode, *n; |
1876 | struct hlist_head *head; | 1879 | struct hlist_head *head; |
1877 | u64 src_addr = 0; | 1880 | u64 src_addr = 0; |
1878 | u16 vlan_id = 0; | 1881 | __le16 vlan_id = 0; |
1879 | u8 hindex; | 1882 | u8 hindex; |
1880 | 1883 | ||
1881 | if (!compare_ether_addr(phdr->h_source, adapter->mac_addr)) | 1884 | if (!compare_ether_addr(phdr->h_source, adapter->mac_addr)) |
@@ -1928,7 +1931,8 @@ qlcnic_tso_check(struct net_device *netdev, | |||
1928 | struct vlan_ethhdr *vh; | 1931 | struct vlan_ethhdr *vh; |
1929 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1932 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
1930 | u32 producer = tx_ring->producer; | 1933 | u32 producer = tx_ring->producer; |
1931 | int vlan_oob = first_desc->flags_opcode & cpu_to_le16(FLAGS_VLAN_OOB); | 1934 | __le16 vlan_oob = first_desc->flags_opcode & |
1935 | cpu_to_le16(FLAGS_VLAN_OOB); | ||
1932 | 1936 | ||
1933 | if (*(skb->data) & BIT_0) { | 1937 | if (*(skb->data) & BIT_0) { |
1934 | flags |= BIT_0; | 1938 | flags |= BIT_0; |
@@ -1999,7 +2003,8 @@ qlcnic_tso_check(struct net_device *netdev, | |||
1999 | vh = (struct vlan_ethhdr *)((char *)hwdesc + 2); | 2003 | vh = (struct vlan_ethhdr *)((char *)hwdesc + 2); |
2000 | skb_copy_from_linear_data(skb, vh, 12); | 2004 | skb_copy_from_linear_data(skb, vh, 12); |
2001 | vh->h_vlan_proto = htons(ETH_P_8021Q); | 2005 | vh->h_vlan_proto = htons(ETH_P_8021Q); |
2002 | vh->h_vlan_TCI = htons(first_desc->vlan_TCI); | 2006 | vh->h_vlan_TCI = (__be16)swab16((u16)first_desc->vlan_TCI); |
2007 | |||
2003 | skb_copy_from_linear_data_offset(skb, 12, | 2008 | skb_copy_from_linear_data_offset(skb, 12, |
2004 | (char *)vh + 16, copy_len - 16); | 2009 | (char *)vh + 16, copy_len - 16); |
2005 | 2010 | ||