be2net: support ndo_get_phys_port_id()
authorSriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
Wed, 22 Jul 2015 05:45:12 +0000 (11:15 +0530)
committerDavid S. Miller <davem@davemloft.net>
Sat, 25 Jul 2015 05:41:22 +0000 (22:41 -0700)
Add be_get_phys_port_id() function to report physical port id. The port id
should be unique across different be2net devices in the system. We use the
chip serial number along with the physical port number for this.

Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_cmds.c
drivers/net/ethernet/emulex/benet/be_cmds.h
drivers/net/ethernet/emulex/benet/be_main.c

index cb5777bb74292a951602cd1d963e38bc472e46bf..8cd384d0e38ae79b8acfcf3834b004e34d4a9ddd 100644 (file)
 
 #define MAX_VFS                        30 /* Max VFs supported by BE3 FW */
 #define FW_VER_LEN             32
+#define        CNTL_SERIAL_NUM_WORDS   8  /* Controller serial number words */
+#define        CNTL_SERIAL_NUM_WORD_SZ (sizeof(u16)) /* Byte-sz of serial num word */
 
 #define        RSS_INDIR_TABLE_LEN     128
 #define RSS_HASH_KEY_LEN       40
@@ -590,6 +592,7 @@ struct be_adapter {
        struct rss_info rss_info;
        /* Filters for packets that need to be sent to BMC */
        u32 bmc_filt_mask;
+       u16 serial_num[CNTL_SERIAL_NUM_WORDS];
 };
 
 #define be_physfn(adapter)             (!adapter->virtfn)
index ecad46f796539f9b5a4dcc331939fee6da3bb1d3..3be1fbdcdd0215cbd6589001b3a11c2091d309c2 100644 (file)
@@ -2852,10 +2852,11 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_cntl_attribs *req;
        struct be_cmd_resp_cntl_attribs *resp;
-       int status;
+       int status, i;
        int payload_len = max(sizeof(*req), sizeof(*resp));
        struct mgmt_controller_attrib *attribs;
        struct be_dma_mem attribs_cmd;
+       u32 *serial_num;
 
        if (mutex_lock_interruptible(&adapter->mbox_lock))
                return -1;
@@ -2886,6 +2887,10 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
        if (!status) {
                attribs = attribs_cmd.va + sizeof(struct be_cmd_resp_hdr);
                adapter->hba_port_num = attribs->hba_attribs.phy_port;
+               serial_num = attribs->hba_attribs.controller_serial_number;
+               for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++)
+                       adapter->serial_num[i] = le32_to_cpu(serial_num[i]) &
+                               (BIT_MASK(16) - 1);
        }
 
 err:
index a4479f7488d3cb663091283da9781b2ff99b7505..36d835bd5f3c06f86020e4c192c02cf074bf2340 100644 (file)
@@ -1637,10 +1637,12 @@ struct be_cmd_req_set_qos {
 struct mgmt_hba_attribs {
        u32 rsvd0[24];
        u8 controller_model_number[32];
-       u32 rsvd1[79];
-       u8 rsvd2[3];
+       u32 rsvd1[16];
+       u32 controller_serial_number[8];
+       u32 rsvd2[55];
+       u8 rsvd3[3];
        u8 phy_port;
-       u32 rsvd3[13];
+       u32 rsvd4[13];
 } __packed;
 
 struct mgmt_controller_attrib {
index c996dd76f5461253dc841ebf2fe539f813954b2b..5e92db8947d99525791be5f74fa99ffa257b04a2 100644 (file)
@@ -5219,6 +5219,27 @@ static netdev_features_t be_features_check(struct sk_buff *skb,
 }
 #endif
 
+static int be_get_phys_port_id(struct net_device *dev,
+                              struct netdev_phys_item_id *ppid)
+{
+       int i, id_len = CNTL_SERIAL_NUM_WORDS * CNTL_SERIAL_NUM_WORD_SZ + 1;
+       struct be_adapter *adapter = netdev_priv(dev);
+       u8 *id;
+
+       if (MAX_PHYS_ITEM_ID_LEN < id_len)
+               return -ENOSPC;
+
+       ppid->id[0] = adapter->hba_port_num + 1;
+       id = &ppid->id[1];
+       for (i = CNTL_SERIAL_NUM_WORDS - 1; i >= 0;
+            i--, id += CNTL_SERIAL_NUM_WORD_SZ)
+               memcpy(id, &adapter->serial_num[i], CNTL_SERIAL_NUM_WORD_SZ);
+
+       ppid->id_len = id_len;
+
+       return 0;
+}
+
 static const struct net_device_ops be_netdev_ops = {
        .ndo_open               = be_open,
        .ndo_stop               = be_close,
@@ -5249,6 +5270,7 @@ static const struct net_device_ops be_netdev_ops = {
        .ndo_del_vxlan_port     = be_del_vxlan_port,
        .ndo_features_check     = be_features_check,
 #endif
+       .ndo_get_phys_port_id   = be_get_phys_port_id,
 };
 
 static void be_netdev_init(struct net_device *netdev)