/* crc offload */
        if (likely(lp->crc_offload)) {
-               skb->ip_summed = CHECKSUM_COMPLETE;
+               skb->ip_summed = CHECKSUM_PARTIAL;
                skb->csum_start = skb_headroom(skb);
                skb->csum_offset = skb->len;
                crc = 0;
                FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
        hp->fcoe_sof = sof;
 
+#ifdef NETIF_F_FSO
+       /* fcoe lso, mss is in max_payload which is non-zero for FCP data */
+       if (lp->seq_offload && fr_max_payload(fp)) {
+               skb_shinfo(skb)->gso_type = SKB_GSO_FCOE;
+               skb_shinfo(skb)->gso_size = fr_max_payload(fp);
+       } else {
+               skb_shinfo(skb)->gso_type = 0;
+               skb_shinfo(skb)->gso_size = 0;
+       }
+#endif
        /* update tx stats: regardless if LLD fails */
        stats = lp->dev_stats[smp_processor_id()];
        if (stats) {