be2net: Use new implementation of get mac list command
authorPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Fri, 3 Feb 2012 09:50:17 +0000 (09:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 4 Feb 2012 21:06:28 +0000 (16:06 -0500)
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: Mammatha Edhala <mammatha.edhala@emulex.com>
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
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 dd6e8e2..29dff7d 100644 (file)
@@ -2300,52 +2300,81 @@ err:
 
 /* Uses synchronous MCCQ */
 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_cmd_req_get_mac_list *req;
        int status;
        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);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
                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,
                                OPCODE_COMMON_GET_MAC_LIST, sizeof(*req),
-                               wrb, NULL);
+                               wrb, &get_mac_list_cmd);
 
        req->hdr.domain = domain;
+       req->mac_type = MAC_ADDRESS_TYPE_NETWORK;
+       req->perm_override = 1;
 
        status = be_mcc_notify_wait(adapter);
        if (!status) {
                struct be_cmd_resp_get_mac_list *resp =
-                                               embedded_payload(wrb);
-               int i;
-               u8 *ctxt = &resp->context[0][0];
-               status = -EIO;
-               mac_count = resp->mac_count;
-               be_dws_le_to_cpu(&resp->context, sizeof(resp->context));
+                                               get_mac_list_cmd.va;
+               mac_count = resp->true_mac_count + resp->pseudo_mac_count;
+               /* Mac list returned could contain one or more active mac_ids
+                * or one or more pseudo permanant mac addresses. If an active
+                * mac_id is present, return first active mac_id found
+                */
                for (i = 0; i < mac_count; i++) {
-                       if (!AMAP_GET_BITS(struct amap_get_mac_list_context,
-                                          act, ctxt)) {
-                               *pmac_id = AMAP_GET_BITS
-                                       (struct amap_get_mac_list_context,
-                                        macid, ctxt);
-                               status = 0;
-                               break;
+                       struct get_list_macaddr *mac_entry;
+                       u16 mac_addr_size;
+                       u32 mac_id;
+
+                       mac_entry = &resp->macaddr_list[i];
+                       mac_addr_size = le16_to_cpu(mac_entry->mac_addr_size);
+                       /* 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);
+       pci_free_consistent(adapter->pdev, get_mac_list_cmd.size,
+                       get_mac_list_cmd.va, get_mac_list_cmd.dma);
        return status;
 }
 
index bbd012b..5bb66c8 100644 (file)
@@ -1346,22 +1346,36 @@ struct be_cmd_resp_set_func_cap {
 
 /******************** GET/SET_MACLIST  **************************/
 #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_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;
 
 struct be_cmd_resp_get_mac_list {
        struct be_cmd_resp_hdr hdr;
-       u8 mac_count;
-       u8 rsvd1;
-       u16 rsvd2;
-       u8 context[sizeof(struct amap_get_mac_list_context) / 8][BE_MAX_MAC];
+       struct get_list_macaddr fd_macaddr; /* Factory default mac */
+       struct get_list_macaddr macid_macaddr; /* soft mac */
+       u8 true_mac_count;
+       u8 pseudo_mac_count;
+       u8 mac_list_size;
+       u8 rsvd;
+       /* perm override mac */
+       struct get_list_macaddr macaddr_list[BE_MAX_MAC];
 } __packed;
 
 struct be_cmd_req_set_mac_list {
@@ -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 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,
-                                                       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,
                                                u8 mac_count, u32 domain);
 
index 1395f80..7804987 100644 (file)
@@ -2608,19 +2608,28 @@ static void be_setup_init(struct be_adapter *adapter)
        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;
-       int status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id);
-       if (status != 0)
-               goto do_none;
-       status = be_cmd_mac_addr_query(adapter, mac,
-                       MAC_ADDRESS_TYPE_NETWORK,
-                       false, adapter->if_handle, pmac_id);
+       int status;
+       bool pmac_id_active;
+
+       status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id_active,
+                                                       &pmac_id, mac);
        if (status != 0)
                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:
        return status;
 }
@@ -2685,7 +2694,7 @@ static int be_setup(struct be_adapter *adapter)
          */
        if (!be_physfn(adapter)) {
                if (lancer_chip(adapter))
-                       status = be_configure_mac_from_list(adapter, mac);
+                       status = be_add_mac_from_list(adapter, mac);
                else
                        status = be_cmd_mac_addr_query(adapter, mac,
                                        MAC_ADDRESS_TYPE_NETWORK, false,