diff options
author | Yi Zou <yi.zou@intel.com> | 2009-10-21 19:28:03 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:00:33 -0500 |
commit | b7a727f1af953b00352d3a4b6c458c6e2872f94b (patch) | |
tree | a0ac9838d71b3690c9947f77ba8aa96d84bdbfed /drivers/scsi/fcoe | |
parent | d37322a43ebac79eef417149f5696390cf8872db (diff) |
[SCSI] fcoe: Call ndo_fcoe_enable/disable to turn FCoE feature on/off in LLD
Calls ndo_fcoe_enabled() of the associated netdev upon creating the FCoE
instance to make sure LLD has all necessary resources allocated and setup
properly before passing FCoE traffic. Similarly, calls ndo_fcoe_disable()
upon destroying the FCoE instance on the associated netdev to allow the LLD
to release all allocated resources for FCoE.
Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/fcoe')
-rw-r--r-- | drivers/scsi/fcoe/fcoe.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c index c66b9fa7d674..aef29afb6e71 100644 --- a/drivers/scsi/fcoe/fcoe.c +++ b/drivers/scsi/fcoe/fcoe.c | |||
@@ -161,9 +161,18 @@ static int fcoe_interface_setup(struct fcoe_interface *fcoe, | |||
161 | struct fcoe_ctlr *fip = &fcoe->ctlr; | 161 | struct fcoe_ctlr *fip = &fcoe->ctlr; |
162 | struct netdev_hw_addr *ha; | 162 | struct netdev_hw_addr *ha; |
163 | u8 flogi_maddr[ETH_ALEN]; | 163 | u8 flogi_maddr[ETH_ALEN]; |
164 | const struct net_device_ops *ops; | ||
164 | 165 | ||
165 | fcoe->netdev = netdev; | 166 | fcoe->netdev = netdev; |
166 | 167 | ||
168 | /* Let LLD initialize for FCoE */ | ||
169 | ops = netdev->netdev_ops; | ||
170 | if (ops->ndo_fcoe_enable) { | ||
171 | if (ops->ndo_fcoe_enable(netdev)) | ||
172 | FCOE_NETDEV_DBG(netdev, "Failed to enable FCoE" | ||
173 | " specific feature for LLD.\n"); | ||
174 | } | ||
175 | |||
167 | /* Do not support for bonding device */ | 176 | /* Do not support for bonding device */ |
168 | if ((netdev->priv_flags & IFF_MASTER_ALB) || | 177 | if ((netdev->priv_flags & IFF_MASTER_ALB) || |
169 | (netdev->priv_flags & IFF_SLAVE_INACTIVE) || | 178 | (netdev->priv_flags & IFF_SLAVE_INACTIVE) || |
@@ -262,6 +271,7 @@ void fcoe_interface_cleanup(struct fcoe_interface *fcoe) | |||
262 | struct net_device *netdev = fcoe->netdev; | 271 | struct net_device *netdev = fcoe->netdev; |
263 | struct fcoe_ctlr *fip = &fcoe->ctlr; | 272 | struct fcoe_ctlr *fip = &fcoe->ctlr; |
264 | u8 flogi_maddr[ETH_ALEN]; | 273 | u8 flogi_maddr[ETH_ALEN]; |
274 | const struct net_device_ops *ops; | ||
265 | 275 | ||
266 | /* | 276 | /* |
267 | * Don't listen for Ethernet packets anymore. | 277 | * Don't listen for Ethernet packets anymore. |
@@ -281,6 +291,14 @@ void fcoe_interface_cleanup(struct fcoe_interface *fcoe) | |||
281 | if (fip->spma) | 291 | if (fip->spma) |
282 | dev_unicast_delete(netdev, fip->ctl_src_addr); | 292 | dev_unicast_delete(netdev, fip->ctl_src_addr); |
283 | dev_mc_delete(netdev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0); | 293 | dev_mc_delete(netdev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0); |
294 | |||
295 | /* Tell the LLD we are done w/ FCoE */ | ||
296 | ops = netdev->netdev_ops; | ||
297 | if (ops->ndo_fcoe_disable) { | ||
298 | if (ops->ndo_fcoe_disable(netdev)) | ||
299 | FCOE_NETDEV_DBG(netdev, "Failed to disable FCoE" | ||
300 | " specific feature for LLD.\n"); | ||
301 | } | ||
284 | } | 302 | } |
285 | 303 | ||
286 | /** | 304 | /** |