[SCSI] fcoe, libfc: check offload features from LLD through netdev
authorYi Zou <yi.zou@intel.com>
Fri, 27 Feb 2009 22:07:04 +0000 (14:07 -0800)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 13 Mar 2009 20:13:48 +0000 (15:13 -0500)
This checks if net_devices supports FCoE offload ops in netdev_ops and it
if it does, then sets up the corresponding flags in the associated fc_lport.

For large send offload, the maximum length supported in one large send is now
described by the added lso_max in fc_lport, which is setup initially from
netdev->gso_max_size.

Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/fcoe/fcoe_sw.c
include/scsi/libfc.h

index da210eb..d99217d 100644 (file)
@@ -133,6 +133,13 @@ static int fcoe_sw_lport_config(struct fc_lport *lp)
        /* lport fc_lport related configuration */
        fc_lport_config(lp);
 
+       /* offload related configuration */
+       lp->crc_offload = 0;
+       lp->seq_offload = 0;
+       lp->lro_enabled = 0;
+       lp->lro_xid = 0;
+       lp->lso_max = 0;
+
        return 0;
 }
 
@@ -186,7 +193,27 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
        if (fc->real_dev->features & NETIF_F_SG)
                lp->sg_supp = 1;
 
-
+#ifdef NETIF_F_FCOE_CRC
+       if (netdev->features & NETIF_F_FCOE_CRC) {
+               lp->crc_offload = 1;
+               printk(KERN_DEBUG "fcoe:%s supports FCCRC offload\n",
+                      netdev->name);
+       }
+#endif
+#ifdef NETIF_F_FSO
+       if (netdev->features & NETIF_F_FSO) {
+               lp->seq_offload = 1;
+               lp->lso_max = netdev->gso_max_size;
+               printk(KERN_DEBUG "fcoe:%s supports LSO for max len 0x%x\n",
+                      netdev->name, lp->lso_max);
+       }
+#endif
+       if (netdev->fcoe_ddp_xid) {
+               lp->lro_enabled = 1;
+               lp->lro_xid = netdev->fcoe_ddp_xid;
+               printk(KERN_DEBUG "fcoe:%s supports LRO for max xid 0x%x\n",
+                      netdev->name, lp->lro_xid);
+       }
        skb_queue_head_init(&fc->fcoe_pending_queue);
        fc->fcoe_pending_queue_active = 0;
 
index a2e126b..61c746c 100644 (file)
@@ -654,6 +654,7 @@ struct fc_lport {
        u16                     link_speed;
        u16                     link_supported_speeds;
        u16                     lro_xid;        /* max xid for fcoe lro */
+       unsigned int            lso_max;        /* max large send size */
        struct fc_ns_fts        fcts;           /* FC-4 type masks */
        struct fc_els_rnid_gen  rnid_gen;       /* RNID information */