ixgbe: Add support for netdev_ops.ndo_fcoe_get_wwn to 82599
authorYi Zou <yi.zou@intel.com>
Wed, 28 Oct 2009 18:24:56 +0000 (18:24 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Oct 2009 08:04:03 +0000 (01:04 -0700)
Implements the netdev_ops.ndo_fcoe_get_wwn in 82599 if it finds valid
prefix for the World Wide Node Name (WWNN) or World Wide Port Name (WWPN),
as well as valid SAN MAC address.

Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe_fcoe.c
drivers/net/ixgbe/ixgbe_main.c

index 2b854161c61b1c36b46b11f9c9b614f45b10b31b..7eb08a6d3f997dd585f508129c754843c8c470a5 100644 (file)
@@ -457,6 +457,7 @@ extern int ixgbe_fcoe_disable(struct net_device *netdev);
 extern u8 ixgbe_fcoe_getapp(struct ixgbe_adapter *adapter);
 extern u8 ixgbe_fcoe_setapp(struct ixgbe_adapter *adapter, u8 up);
 #endif /* CONFIG_IXGBE_DCB */
+extern int ixgbe_fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type);
 #endif /* IXGBE_FCOE */
 
 #endif /* _IXGBE_H_ */
index a3c9f99515e27c72708c92912da0f4e486423bf0..edecdc853c14f53419d6a388301c56f79787f2e6 100644 (file)
@@ -718,3 +718,49 @@ u8 ixgbe_fcoe_setapp(struct ixgbe_adapter *adapter, u8 up)
        return 1;
 }
 #endif /* CONFIG_IXGBE_DCB */
+
+/**
+ * ixgbe_fcoe_get_wwn - get world wide name for the node or the port
+ * @netdev : ixgbe adapter
+ * @wwn : the world wide name
+ * @type: the type of world wide name
+ *
+ * Returns the node or port world wide name if both the prefix and the san
+ * mac address are valid, then the wwn is formed based on the NAA-2 for
+ * IEEE Extended name identifier (ref. to T10 FC-LS Spec., Sec. 15.3).
+ *
+ * Returns : 0 on success
+ */
+int ixgbe_fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
+{
+       int rc = -EINVAL;
+       u16 prefix = 0xffff;
+       struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       struct ixgbe_mac_info *mac = &adapter->hw.mac;
+
+       switch (type) {
+       case NETDEV_FCOE_WWNN:
+               prefix = mac->wwnn_prefix;
+               break;
+       case NETDEV_FCOE_WWPN:
+               prefix = mac->wwpn_prefix;
+               break;
+       default:
+               break;
+       }
+
+       if ((prefix != 0xffff) &&
+           is_valid_ether_addr(mac->san_addr)) {
+               *wwn = ((u64) prefix << 48) |
+                      ((u64) mac->san_addr[0] << 40) |
+                      ((u64) mac->san_addr[1] << 32) |
+                      ((u64) mac->san_addr[2] << 24) |
+                      ((u64) mac->san_addr[3] << 16) |
+                      ((u64) mac->san_addr[4] << 8)  |
+                      ((u64) mac->san_addr[5]);
+               rc = 0;
+       }
+       return rc;
+}
+
+
index 4c8a44919705c78157af5931c5b790ef2941a96f..45c5faf0824af84477f5ed303419c47cbe25c1bf 100644 (file)
@@ -5449,6 +5449,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_fcoe_ddp_done = ixgbe_fcoe_ddp_put,
        .ndo_fcoe_enable = ixgbe_fcoe_enable,
        .ndo_fcoe_disable = ixgbe_fcoe_disable,
+       .ndo_fcoe_get_wwn = ixgbe_fcoe_get_wwn,
 #endif /* IXGBE_FCOE */
 };