diff options
author | Yi Zou <yi.zou@intel.com> | 2010-05-18 12:00:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-05-18 22:44:18 -0400 |
commit | be5d507d9af23c45983c828394cc4f6d728b18eb (patch) | |
tree | dba962b8623fe5398e4c2697136c795705842d0e /drivers/net | |
parent | 0b746e08cd7fb35d80c184f8e3f4656aa1f1ae11 (diff) |
ixgbe: fix wrong offset to fc_frame_header in ixgbe_fcoe_ddp
Make sure we point to the right offset of the fc_frame_header when
VLAN header exists and HW has VLAN stripping disabled.
Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_fcoe.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/net/ixgbe/ixgbe_fcoe.c b/drivers/net/ixgbe/ixgbe_fcoe.c index 6493049b663d..a82d2fcaac97 100644 --- a/drivers/net/ixgbe/ixgbe_fcoe.c +++ b/drivers/net/ixgbe/ixgbe_fcoe.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #endif /* CONFIG_IXGBE_DCB */ | 32 | #endif /* CONFIG_IXGBE_DCB */ |
33 | #include <linux/if_ether.h> | 33 | #include <linux/if_ether.h> |
34 | #include <linux/gfp.h> | 34 | #include <linux/gfp.h> |
35 | #include <linux/if_vlan.h> | ||
35 | #include <scsi/scsi_cmnd.h> | 36 | #include <scsi/scsi_cmnd.h> |
36 | #include <scsi/scsi_device.h> | 37 | #include <scsi/scsi_device.h> |
37 | #include <scsi/fc/fc_fs.h> | 38 | #include <scsi/fc/fc_fs.h> |
@@ -312,10 +313,12 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter, | |||
312 | if (fcerr == IXGBE_FCERR_BADCRC) | 313 | if (fcerr == IXGBE_FCERR_BADCRC) |
313 | skb->ip_summed = CHECKSUM_NONE; | 314 | skb->ip_summed = CHECKSUM_NONE; |
314 | 315 | ||
315 | skb_reset_network_header(skb); | 316 | if (eth_hdr(skb)->h_proto == htons(ETH_P_8021Q)) |
316 | skb_set_transport_header(skb, skb_network_offset(skb) + | 317 | fh = (struct fc_frame_header *)(skb->data + |
317 | sizeof(struct fcoe_hdr)); | 318 | sizeof(struct vlan_hdr) + sizeof(struct fcoe_hdr)); |
318 | fh = (struct fc_frame_header *)skb_transport_header(skb); | 319 | else |
320 | fh = (struct fc_frame_header *)(skb->data + | ||
321 | sizeof(struct fcoe_hdr)); | ||
319 | fctl = ntoh24(fh->fh_f_ctl); | 322 | fctl = ntoh24(fh->fh_f_ctl); |
320 | if (fctl & FC_FC_EX_CTX) | 323 | if (fctl & FC_FC_EX_CTX) |
321 | xid = be16_to_cpu(fh->fh_ox_id); | 324 | xid = be16_to_cpu(fh->fh_ox_id); |