diff options
author | Yi Zou <yi.zou@intel.com> | 2009-02-27 17:07:04 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-03-13 16:13:48 -0400 |
commit | ea1e9a9df5e1fde7ad8878c85b4a097cad0ddcea (patch) | |
tree | 5594c002619125f8976c7d3dacdd6791db497d2e | |
parent | 4d288d5767f853bfca25adc7b6030dc95518cb2e (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.c | 29 | ||||
-rw-r--r-- | include/scsi/libfc.h | 1 |
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 | ||