Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 289882
b: refs/heads/master
c: e5e1ee8
h: refs/heads/master
v: v3
  • Loading branch information
Padmanabh Ratnakar authored and David S. Miller committed Feb 4, 2012
1 parent 99e53d8 commit 3542878
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 57cd80d4d511748f3973accc6919e7e1e1936ebb
refs/heads/master: e5e1ee89461543043a0144e6dac90547fefe2f89
67 changes: 48 additions & 19 deletions trunk/drivers/net/ethernet/emulex/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -2300,52 +2300,81 @@ int be_cmd_req_native_mode(struct be_adapter *adapter)

/* 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;
}

Expand Down
36 changes: 25 additions & 11 deletions trunk/drivers/net/ethernet/emulex/benet/be_cmds.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);

29 changes: 19 additions & 10 deletions trunk/drivers/net/ethernet/emulex/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 3542878

Please sign in to comment.