Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vlan: conditional inclusion of FCoE hooks to match netdevice.h and bnx2x

Way back in 3c9c36bcedd426f2be2826da43e5163de61735f7 the
ndo_fcoe_get_wwn pointer was switched from depending on CONFIG_FCOE to
CONFIG_LIBFCOE in order to allow building FCoE support into the bnx2x
driver and used by bnx2fc without including the generic software fcoe
module.

But, FCoE is generally used over an 802.1q VLAN, and the implementation
of ndo_fcoe_get_wwn in the 8021q module was not similarly changed. The
result is that if CONFIG_FCOE is disabled, then bnz2fc cannot make a
call to ndo_fcoe_get_wwn through the 8021q interface to the underlying
bnx2x interface. The bnx2fc driver then falls back to a potentially
different mapping of Ethernet MAC to Fibre Channel WWN, creating an
incompatibility with the fabric and target configurations when compared
to the WWNs used by pre-boot firmware and differently-configured
kernels.

So make the conditional inclusion of FCoE code in 8021q match the
conditional inclusion in netdevice.h

Signed-off-by: Chris Leech <cleech@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Chris Leech and committed by
David S. Miller
0a89eb92 5ba57801

+16 -12
+16 -12
net/8021q/vlan_dev.c
··· 443 443 return rc; 444 444 } 445 445 446 - static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type) 447 - { 448 - struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; 449 - const struct net_device_ops *ops = real_dev->netdev_ops; 450 - int rc = -EINVAL; 451 - 452 - if (ops->ndo_fcoe_get_wwn) 453 - rc = ops->ndo_fcoe_get_wwn(real_dev, wwn, type); 454 - return rc; 455 - } 456 - 457 446 static int vlan_dev_fcoe_ddp_target(struct net_device *dev, u16 xid, 458 447 struct scatterlist *sgl, unsigned int sgc) 459 448 { ··· 453 464 if (ops->ndo_fcoe_ddp_target) 454 465 rc = ops->ndo_fcoe_ddp_target(real_dev, xid, sgl, sgc); 455 466 467 + return rc; 468 + } 469 + #endif 470 + 471 + #ifdef NETDEV_FCOE_WWNN 472 + static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type) 473 + { 474 + struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; 475 + const struct net_device_ops *ops = real_dev->netdev_ops; 476 + int rc = -EINVAL; 477 + 478 + if (ops->ndo_fcoe_get_wwn) 479 + rc = ops->ndo_fcoe_get_wwn(real_dev, wwn, type); 456 480 return rc; 457 481 } 458 482 #endif ··· 796 794 .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, 797 795 .ndo_fcoe_enable = vlan_dev_fcoe_enable, 798 796 .ndo_fcoe_disable = vlan_dev_fcoe_disable, 799 - .ndo_fcoe_get_wwn = vlan_dev_fcoe_get_wwn, 800 797 .ndo_fcoe_ddp_target = vlan_dev_fcoe_ddp_target, 798 + #endif 799 + #ifdef NETDEV_FCOE_WWNN 800 + .ndo_fcoe_get_wwn = vlan_dev_fcoe_get_wwn, 801 801 #endif 802 802 #ifdef CONFIG_NET_POLL_CONTROLLER 803 803 .ndo_poll_controller = vlan_dev_poll_controller,