Commit e5e1ee89 authored by Padmanabh Ratnakar's avatar Padmanabh Ratnakar Committed by David S. Miller

be2net: Use new implementation of get mac list command

VFs use get mac list command to get their mac address. The format of
this command has changed. Update driver to use the new format.
Signed-off-by: default avatarMammatha Edhala <mammatha.edhala@emulex.com>
Signed-off-by: default avatarPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 57cd80d4
...@@ -2300,52 +2300,81 @@ int be_cmd_req_native_mode(struct be_adapter *adapter) ...@@ -2300,52 +2300,81 @@ int be_cmd_req_native_mode(struct be_adapter *adapter)
/* Uses synchronous MCCQ */ /* Uses synchronous MCCQ */
int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain, int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain,
u32 *pmac_id) bool *pmac_id_active, u32 *pmac_id, u8 *mac)
{ {
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
struct be_cmd_req_get_mac_list *req; struct be_cmd_req_get_mac_list *req;
int status; int status;
int mac_count; int mac_count;
struct be_dma_mem get_mac_list_cmd;
int i;
memset(&get_mac_list_cmd, 0, sizeof(struct be_dma_mem));
get_mac_list_cmd.size = sizeof(struct be_cmd_resp_get_mac_list);
get_mac_list_cmd.va = pci_alloc_consistent(adapter->pdev,
get_mac_list_cmd.size,
&get_mac_list_cmd.dma);
if (!get_mac_list_cmd.va) {
dev_err(&adapter->pdev->dev,
"Memory allocation failure during GET_MAC_LIST\n");
return -ENOMEM;
}
spin_lock_bh(&adapter->mcc_lock); spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter); wrb = wrb_from_mccq(adapter);
if (!wrb) { if (!wrb) {
status = -EBUSY; status = -EBUSY;
goto err; goto out;
} }
req = embedded_payload(wrb);
req = get_mac_list_cmd.va;
be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_GET_MAC_LIST, sizeof(*req), OPCODE_COMMON_GET_MAC_LIST, sizeof(*req),
wrb, NULL); wrb, &get_mac_list_cmd);
req->hdr.domain = domain; req->hdr.domain = domain;
req->mac_type = MAC_ADDRESS_TYPE_NETWORK;
req->perm_override = 1;
status = be_mcc_notify_wait(adapter); status = be_mcc_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_get_mac_list *resp = struct be_cmd_resp_get_mac_list *resp =
embedded_payload(wrb); get_mac_list_cmd.va;
int i; mac_count = resp->true_mac_count + resp->pseudo_mac_count;
u8 *ctxt = &resp->context[0][0]; /* Mac list returned could contain one or more active mac_ids
status = -EIO; * or one or more pseudo permanant mac addresses. If an active
mac_count = resp->mac_count; * mac_id is present, return first active mac_id found
be_dws_le_to_cpu(&resp->context, sizeof(resp->context)); */
for (i = 0; i < mac_count; i++) { for (i = 0; i < mac_count; i++) {
if (!AMAP_GET_BITS(struct amap_get_mac_list_context, struct get_list_macaddr *mac_entry;
act, ctxt)) { u16 mac_addr_size;
*pmac_id = AMAP_GET_BITS u32 mac_id;
(struct amap_get_mac_list_context,
macid, ctxt); mac_entry = &resp->macaddr_list[i];
status = 0; mac_addr_size = le16_to_cpu(mac_entry->mac_addr_size);
break; /* mac_id is a 32 bit value and mac_addr size
* is 6 bytes
*/
if (mac_addr_size == sizeof(u32)) {
*pmac_id_active = true;
mac_id = mac_entry->mac_addr_id.s_mac_id.mac_id;
*pmac_id = le32_to_cpu(mac_id);
goto out;
} }
ctxt += sizeof(struct amap_get_mac_list_context) / 8;
} }
/* If no active mac_id found, return first pseudo mac addr */
*pmac_id_active = false;
memcpy(mac, resp->macaddr_list[0].mac_addr_id.macaddr,
ETH_ALEN);
} }
err: out:
spin_unlock_bh(&adapter->mcc_lock); spin_unlock_bh(&adapter->mcc_lock);
pci_free_consistent(adapter->pdev, get_mac_list_cmd.size,
get_mac_list_cmd.va, get_mac_list_cmd.dma);
return status; return status;
} }
......
...@@ -1346,22 +1346,36 @@ struct be_cmd_resp_set_func_cap { ...@@ -1346,22 +1346,36 @@ struct be_cmd_resp_set_func_cap {
/******************** GET/SET_MACLIST **************************/ /******************** GET/SET_MACLIST **************************/
#define BE_MAX_MAC 64 #define BE_MAX_MAC 64
struct amap_get_mac_list_context {
u8 macid[31];
u8 act;
} __packed;
struct be_cmd_req_get_mac_list { struct be_cmd_req_get_mac_list {
struct be_cmd_req_hdr hdr; struct be_cmd_req_hdr hdr;
u32 rsvd; u8 mac_type;
u8 perm_override;
u16 iface_id;
u32 mac_id;
u32 rsvd[3];
} __packed;
struct get_list_macaddr {
u16 mac_addr_size;
union {
u8 macaddr[6];
struct {
u8 rsvd[2];
u32 mac_id;
} __packed s_mac_id;
} __packed mac_addr_id;
} __packed; } __packed;
struct be_cmd_resp_get_mac_list { struct be_cmd_resp_get_mac_list {
struct be_cmd_resp_hdr hdr; struct be_cmd_resp_hdr hdr;
u8 mac_count; struct get_list_macaddr fd_macaddr; /* Factory default mac */
u8 rsvd1; struct get_list_macaddr macid_macaddr; /* soft mac */
u16 rsvd2; u8 true_mac_count;
u8 context[sizeof(struct amap_get_mac_list_context) / 8][BE_MAX_MAC]; u8 pseudo_mac_count;
u8 mac_list_size;
u8 rsvd;
/* perm override mac */
struct get_list_macaddr macaddr_list[BE_MAX_MAC];
} __packed; } __packed;
struct be_cmd_req_set_mac_list { struct be_cmd_req_set_mac_list {
...@@ -1575,7 +1589,7 @@ extern int be_cmd_req_native_mode(struct be_adapter *adapter); ...@@ -1575,7 +1589,7 @@ extern int be_cmd_req_native_mode(struct be_adapter *adapter);
extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size); extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf);
extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain, extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain,
u32 *pmac_id); bool *pmac_id_active, u32 *pmac_id, u8 *mac);
extern int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, extern int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
u8 mac_count, u32 domain); u8 mac_count, u32 domain);
...@@ -2608,19 +2608,28 @@ static void be_setup_init(struct be_adapter *adapter) ...@@ -2608,19 +2608,28 @@ static void be_setup_init(struct be_adapter *adapter)
adapter->eq_next_idx = 0; adapter->eq_next_idx = 0;
} }
static int be_configure_mac_from_list(struct be_adapter *adapter, u8 *mac) static int be_add_mac_from_list(struct be_adapter *adapter, u8 *mac)
{ {
u32 pmac_id; u32 pmac_id;
int status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id); int status;
if (status != 0) bool pmac_id_active;
goto do_none;
status = be_cmd_mac_addr_query(adapter, mac, status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id_active,
MAC_ADDRESS_TYPE_NETWORK, &pmac_id, mac);
false, adapter->if_handle, pmac_id);
if (status != 0) if (status != 0)
goto do_none; goto do_none;
status = be_cmd_pmac_add(adapter, mac, adapter->if_handle,
&adapter->pmac_id, 0); if (pmac_id_active) {
status = be_cmd_mac_addr_query(adapter, mac,
MAC_ADDRESS_TYPE_NETWORK,
false, adapter->if_handle, pmac_id);
if (!status)
adapter->pmac_id = pmac_id;
} else {
status = be_cmd_pmac_add(adapter, mac,
adapter->if_handle, &adapter->pmac_id, 0);
}
do_none: do_none:
return status; return status;
} }
...@@ -2685,7 +2694,7 @@ static int be_setup(struct be_adapter *adapter) ...@@ -2685,7 +2694,7 @@ static int be_setup(struct be_adapter *adapter)
*/ */
if (!be_physfn(adapter)) { if (!be_physfn(adapter)) {
if (lancer_chip(adapter)) if (lancer_chip(adapter))
status = be_configure_mac_from_list(adapter, mac); status = be_add_mac_from_list(adapter, mac);
else else
status = be_cmd_mac_addr_query(adapter, mac, status = be_cmd_mac_addr_query(adapter, mac,
MAC_ADDRESS_TYPE_NETWORK, false, MAC_ADDRESS_TYPE_NETWORK, false,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment