aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c32
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h8
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c13
3 files changed, 53 insertions, 0 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 632c0d323867..5d37601df03f 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -2606,6 +2606,38 @@ err:
2606 return status; 2606 return status;
2607} 2607}
2608 2608
2609/* Set privilege(s) for a function */
2610int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
2611 u32 domain)
2612{
2613 struct be_mcc_wrb *wrb;
2614 struct be_cmd_req_set_fn_privileges *req;
2615 int status;
2616
2617 spin_lock_bh(&adapter->mcc_lock);
2618
2619 wrb = wrb_from_mccq(adapter);
2620 if (!wrb) {
2621 status = -EBUSY;
2622 goto err;
2623 }
2624
2625 req = embedded_payload(wrb);
2626 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2627 OPCODE_COMMON_SET_FN_PRIVILEGES, sizeof(*req),
2628 wrb, NULL);
2629 req->hdr.domain = domain;
2630 if (lancer_chip(adapter))
2631 req->privileges_lancer = cpu_to_le32(privileges);
2632 else
2633 req->privileges = cpu_to_le32(privileges);
2634
2635 status = be_mcc_notify_wait(adapter);
2636err:
2637 spin_unlock_bh(&adapter->mcc_lock);
2638 return status;
2639}
2640
2609/* pmac_id_valid: true => pmac_id is supplied and MAC address is requested. 2641/* pmac_id_valid: true => pmac_id is supplied and MAC address is requested.
2610 * pmac_id_valid: false => pmac_id or MAC address is requested. 2642 * pmac_id_valid: false => pmac_id or MAC address is requested.
2611 * If pmac_id is returned, pmac_id_valid is returned as true 2643 * If pmac_id is returned, pmac_id_valid is returned as true
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 7ecca3b591a6..671a89d84f98 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -202,6 +202,7 @@ struct be_mcc_mailbox {
202#define OPCODE_COMMON_READ_TRANSRECV_DATA 73 202#define OPCODE_COMMON_READ_TRANSRECV_DATA 73
203#define OPCODE_COMMON_GET_PORT_NAME 77 203#define OPCODE_COMMON_GET_PORT_NAME 77
204#define OPCODE_COMMON_SET_INTERRUPT_ENABLE 89 204#define OPCODE_COMMON_SET_INTERRUPT_ENABLE 89
205#define OPCODE_COMMON_SET_FN_PRIVILEGES 100
205#define OPCODE_COMMON_GET_PHY_DETAILS 102 206#define OPCODE_COMMON_GET_PHY_DETAILS 102
206#define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103 207#define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103
207#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 208#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121
@@ -1474,6 +1475,11 @@ struct be_cmd_resp_get_fn_privileges {
1474 u32 privilege_mask; 1475 u32 privilege_mask;
1475}; 1476};
1476 1477
1478struct be_cmd_req_set_fn_privileges {
1479 struct be_cmd_req_hdr hdr;
1480 u32 privileges; /* Used by BE3, SH-R */
1481 u32 privileges_lancer; /* Used by Lancer */
1482};
1477 1483
1478/******************** GET/SET_MACLIST **************************/ 1484/******************** GET/SET_MACLIST **************************/
1479#define BE_MAX_MAC 64 1485#define BE_MAX_MAC 64
@@ -1921,6 +1927,8 @@ extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
1921extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); 1927extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf);
1922extern int be_cmd_get_fn_privileges(struct be_adapter *adapter, 1928extern int be_cmd_get_fn_privileges(struct be_adapter *adapter,
1923 u32 *privilege, u32 domain); 1929 u32 *privilege, u32 domain);
1930extern int be_cmd_set_fn_privileges(struct be_adapter *adapter,
1931 u32 privileges, u32 vf_num);
1924extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, 1932extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
1925 bool *pmac_id_active, u32 *pmac_id, 1933 bool *pmac_id_active, u32 *pmac_id,
1926 u8 domain); 1934 u8 domain);
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 29e7870e0b35..858bb473bd42 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2880,6 +2880,7 @@ static int be_vf_setup(struct be_adapter *adapter)
2880 u16 def_vlan, lnk_speed; 2880 u16 def_vlan, lnk_speed;
2881 int status, old_vfs, vf; 2881 int status, old_vfs, vf;
2882 struct device *dev = &adapter->pdev->dev; 2882 struct device *dev = &adapter->pdev->dev;
2883 u32 privileges;
2883 2884
2884 old_vfs = pci_num_vf(adapter->pdev); 2885 old_vfs = pci_num_vf(adapter->pdev);
2885 if (old_vfs) { 2886 if (old_vfs) {
@@ -2923,6 +2924,18 @@ static int be_vf_setup(struct be_adapter *adapter)
2923 } 2924 }
2924 2925
2925 for_all_vfs(adapter, vf_cfg, vf) { 2926 for_all_vfs(adapter, vf_cfg, vf) {
2927 /* Allow VFs to programs MAC/VLAN filters */
2928 status = be_cmd_get_fn_privileges(adapter, &privileges, vf + 1);
2929 if (!status && !(privileges & BE_PRIV_FILTMGMT)) {
2930 status = be_cmd_set_fn_privileges(adapter,
2931 privileges |
2932 BE_PRIV_FILTMGMT,
2933 vf + 1);
2934 if (!status)
2935 dev_info(dev, "VF%d has FILTMGMT privilege\n",
2936 vf);
2937 }
2938
2926 /* BE3 FW, by default, caps VF TX-rate to 100mbps. 2939 /* BE3 FW, by default, caps VF TX-rate to 100mbps.
2927 * Allow full available bandwidth 2940 * Allow full available bandwidth
2928 */ 2941 */