diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2013-07-23 05:55:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-24 18:41:52 -0400 |
commit | 04a060280a083860e4d4723b878d69af1ba53ec9 (patch) | |
tree | 941165710b7d7b65626af406a31ff3044c081e99 /drivers/net/ethernet/emulex | |
parent | 5a712c13d3641a3bed243753f115434a7125e440 (diff) |
be2net: allow VFs to program MAC and VLAN filters
In the current design VFs were not allowed to program MAC/VLAN filters.
Only the PF driver was allowed to configure/provision MAC and transparent
VLANs to a VF. Change this to support MAC/VLAN filtering on a VF by a VM.
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 32 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 13 |
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 */ | ||
2610 | int 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); | ||
2636 | err: | ||
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 | ||
1478 | struct 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); | |||
1921 | extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); | 1927 | extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); |
1922 | extern int be_cmd_get_fn_privileges(struct be_adapter *adapter, | 1928 | extern int be_cmd_get_fn_privileges(struct be_adapter *adapter, |
1923 | u32 *privilege, u32 domain); | 1929 | u32 *privilege, u32 domain); |
1930 | extern int be_cmd_set_fn_privileges(struct be_adapter *adapter, | ||
1931 | u32 privileges, u32 vf_num); | ||
1924 | extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, | 1932 | extern 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 | */ |