aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>2015-07-22 01:45:12 -0400
committerDavid S. Miller <davem@davemloft.net>2015-07-25 01:41:22 -0400
commita155a5db9389c4088c0901e665002332f2503660 (patch)
tree80498895d24efe11ff26d800400e56f5ea37a092
parent045a0fa0c5f5ea0f16c009f924ea579634afbba8 (diff)
be2net: support ndo_get_phys_port_id()
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>
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c7
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h8
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c22
4 files changed, 36 insertions, 4 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index cb5777bb7429..8cd384d0e38a 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -105,6 +105,8 @@
105 105
106#define MAX_VFS 30 /* Max VFs supported by BE3 FW */ 106#define MAX_VFS 30 /* Max VFs supported by BE3 FW */
107#define FW_VER_LEN 32 107#define FW_VER_LEN 32
108#define CNTL_SERIAL_NUM_WORDS 8 /* Controller serial number words */
109#define CNTL_SERIAL_NUM_WORD_SZ (sizeof(u16)) /* Byte-sz of serial num word */
108 110
109#define RSS_INDIR_TABLE_LEN 128 111#define RSS_INDIR_TABLE_LEN 128
110#define RSS_HASH_KEY_LEN 40 112#define RSS_HASH_KEY_LEN 40
@@ -590,6 +592,7 @@ struct be_adapter {
590 struct rss_info rss_info; 592 struct rss_info rss_info;
591 /* Filters for packets that need to be sent to BMC */ 593 /* Filters for packets that need to be sent to BMC */
592 u32 bmc_filt_mask; 594 u32 bmc_filt_mask;
595 u16 serial_num[CNTL_SERIAL_NUM_WORDS];
593}; 596};
594 597
595#define be_physfn(adapter) (!adapter->virtfn) 598#define be_physfn(adapter) (!adapter->virtfn)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index ecad46f79653..3be1fbdcdd02 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -2852,10 +2852,11 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
2852 struct be_mcc_wrb *wrb; 2852 struct be_mcc_wrb *wrb;
2853 struct be_cmd_req_cntl_attribs *req; 2853 struct be_cmd_req_cntl_attribs *req;
2854 struct be_cmd_resp_cntl_attribs *resp; 2854 struct be_cmd_resp_cntl_attribs *resp;
2855 int status; 2855 int status, i;
2856 int payload_len = max(sizeof(*req), sizeof(*resp)); 2856 int payload_len = max(sizeof(*req), sizeof(*resp));
2857 struct mgmt_controller_attrib *attribs; 2857 struct mgmt_controller_attrib *attribs;
2858 struct be_dma_mem attribs_cmd; 2858 struct be_dma_mem attribs_cmd;
2859 u32 *serial_num;
2859 2860
2860 if (mutex_lock_interruptible(&adapter->mbox_lock)) 2861 if (mutex_lock_interruptible(&adapter->mbox_lock))
2861 return -1; 2862 return -1;
@@ -2886,6 +2887,10 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
2886 if (!status) { 2887 if (!status) {
2887 attribs = attribs_cmd.va + sizeof(struct be_cmd_resp_hdr); 2888 attribs = attribs_cmd.va + sizeof(struct be_cmd_resp_hdr);
2888 adapter->hba_port_num = attribs->hba_attribs.phy_port; 2889 adapter->hba_port_num = attribs->hba_attribs.phy_port;
2890 serial_num = attribs->hba_attribs.controller_serial_number;
2891 for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++)
2892 adapter->serial_num[i] = le32_to_cpu(serial_num[i]) &
2893 (BIT_MASK(16) - 1);
2889 } 2894 }
2890 2895
2891err: 2896err:
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index a4479f7488d3..36d835bd5f3c 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -1637,10 +1637,12 @@ struct be_cmd_req_set_qos {
1637struct mgmt_hba_attribs { 1637struct mgmt_hba_attribs {
1638 u32 rsvd0[24]; 1638 u32 rsvd0[24];
1639 u8 controller_model_number[32]; 1639 u8 controller_model_number[32];
1640 u32 rsvd1[79]; 1640 u32 rsvd1[16];
1641 u8 rsvd2[3]; 1641 u32 controller_serial_number[8];
1642 u32 rsvd2[55];
1643 u8 rsvd3[3];
1642 u8 phy_port; 1644 u8 phy_port;
1643 u32 rsvd3[13]; 1645 u32 rsvd4[13];
1644} __packed; 1646} __packed;
1645 1647
1646struct mgmt_controller_attrib { 1648struct mgmt_controller_attrib {
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index c996dd76f546..5e92db8947d9 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -5219,6 +5219,27 @@ static netdev_features_t be_features_check(struct sk_buff *skb,
5219} 5219}
5220#endif 5220#endif
5221 5221
5222static int be_get_phys_port_id(struct net_device *dev,
5223 struct netdev_phys_item_id *ppid)
5224{
5225 int i, id_len = CNTL_SERIAL_NUM_WORDS * CNTL_SERIAL_NUM_WORD_SZ + 1;
5226 struct be_adapter *adapter = netdev_priv(dev);
5227 u8 *id;
5228
5229 if (MAX_PHYS_ITEM_ID_LEN < id_len)
5230 return -ENOSPC;
5231
5232 ppid->id[0] = adapter->hba_port_num + 1;
5233 id = &ppid->id[1];
5234 for (i = CNTL_SERIAL_NUM_WORDS - 1; i >= 0;
5235 i--, id += CNTL_SERIAL_NUM_WORD_SZ)
5236 memcpy(id, &adapter->serial_num[i], CNTL_SERIAL_NUM_WORD_SZ);
5237
5238 ppid->id_len = id_len;
5239
5240 return 0;
5241}
5242
5222static const struct net_device_ops be_netdev_ops = { 5243static const struct net_device_ops be_netdev_ops = {
5223 .ndo_open = be_open, 5244 .ndo_open = be_open,
5224 .ndo_stop = be_close, 5245 .ndo_stop = be_close,
@@ -5249,6 +5270,7 @@ static const struct net_device_ops be_netdev_ops = {
5249 .ndo_del_vxlan_port = be_del_vxlan_port, 5270 .ndo_del_vxlan_port = be_del_vxlan_port,
5250 .ndo_features_check = be_features_check, 5271 .ndo_features_check = be_features_check,
5251#endif 5272#endif
5273 .ndo_get_phys_port_id = be_get_phys_port_id,
5252}; 5274};
5253 5275
5254static void be_netdev_init(struct net_device *netdev) 5276static void be_netdev_init(struct net_device *netdev)