aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYi Zou <yi.zou@intel.com>2009-02-27 17:07:04 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-03-13 16:13:48 -0400
commitea1e9a9df5e1fde7ad8878c85b4a097cad0ddcea (patch)
tree5594c002619125f8976c7d3dacdd6791db497d2e
parent4d288d5767f853bfca25adc7b6030dc95518cb2e (diff)
[SCSI] fcoe, libfc: check offload features from LLD through netdev
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>
-rw-r--r--drivers/scsi/fcoe/fcoe_sw.c29
-rw-r--r--include/scsi/libfc.h1
2 files changed, 29 insertions, 1 deletions
diff --git a/drivers/scsi/fcoe/fcoe_sw.c b/drivers/scsi/fcoe/fcoe_sw.c
index da210eba1941..d99217d05104 100644
--- a/drivers/scsi/fcoe/fcoe_sw.c
+++ b/drivers/scsi/fcoe/fcoe_sw.c
@@ -133,6 +133,13 @@ static int fcoe_sw_lport_config(struct fc_lport *lp)
133 /* lport fc_lport related configuration */ 133 /* lport fc_lport related configuration */
134 fc_lport_config(lp); 134 fc_lport_config(lp);
135 135
136 /* offload related configuration */
137 lp->crc_offload = 0;
138 lp->seq_offload = 0;
139 lp->lro_enabled = 0;
140 lp->lro_xid = 0;
141 lp->lso_max = 0;
142
136 return 0; 143 return 0;
137} 144}
138 145
@@ -186,7 +193,27 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
186 if (fc->real_dev->features & NETIF_F_SG) 193 if (fc->real_dev->features & NETIF_F_SG)
187 lp->sg_supp = 1; 194 lp->sg_supp = 1;
188 195
189 196#ifdef NETIF_F_FCOE_CRC
197 if (netdev->features & NETIF_F_FCOE_CRC) {
198 lp->crc_offload = 1;
199 printk(KERN_DEBUG "fcoe:%s supports FCCRC offload\n",
200 netdev->name);
201 }
202#endif
203#ifdef NETIF_F_FSO
204 if (netdev->features & NETIF_F_FSO) {
205 lp->seq_offload = 1;
206 lp->lso_max = netdev->gso_max_size;
207 printk(KERN_DEBUG "fcoe:%s supports LSO for max len 0x%x\n",
208 netdev->name, lp->lso_max);
209 }
210#endif
211 if (netdev->fcoe_ddp_xid) {
212 lp->lro_enabled = 1;
213 lp->lro_xid = netdev->fcoe_ddp_xid;
214 printk(KERN_DEBUG "fcoe:%s supports LRO for max xid 0x%x\n",
215 netdev->name, lp->lro_xid);
216 }
190 skb_queue_head_init(&fc->fcoe_pending_queue); 217 skb_queue_head_init(&fc->fcoe_pending_queue);
191 fc->fcoe_pending_queue_active = 0; 218 fc->fcoe_pending_queue_active = 0;
192 219
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index a2e126b86e3e..61c746cf55f3 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -654,6 +654,7 @@ struct fc_lport {
654 u16 link_speed; 654 u16 link_speed;
655 u16 link_supported_speeds; 655 u16 link_supported_speeds;
656 u16 lro_xid; /* max xid for fcoe lro */ 656 u16 lro_xid; /* max xid for fcoe lro */
657 unsigned int lso_max; /* max large send size */
657 struct fc_ns_fts fcts; /* FC-4 type masks */ 658 struct fc_ns_fts fcts; /* FC-4 type masks */
658 struct fc_els_rnid_gen rnid_gen; /* RNID information */ 659 struct fc_els_rnid_gen rnid_gen; /* RNID information */
659 660