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 /drivers/scsi/fcoe | |
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>
Diffstat (limited to 'drivers/scsi/fcoe')
-rw-r--r-- | drivers/scsi/fcoe/fcoe_sw.c | 29 |
1 files changed, 28 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 | ||