Skip to content

Commit f25b119

Browse files
Padmanabh Ratnakardavem330
authored andcommitted
be2net: Fix error messages while driver load for VFs
VF does not have privileges to execute many commands. When VFs try to execute those commands there are unnecessary error messages. Fix this by executing only those commands for which VF has privilege. Signed-off-by: Padmanabh Ratnakar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a85e998 commit f25b119

File tree

5 files changed

+173
-2
lines changed

5 files changed

+173
-2
lines changed

drivers/net/ethernet/emulex/benet/be.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ struct be_adapter {
390390

391391
struct delayed_work func_recovery_work;
392392
u32 flags;
393+
u32 cmd_privileges;
393394
/* Ethtool knobs and info */
394395
char fw_ver[FW_VER_LEN];
395396
int if_handle; /* Used to configure filtering */

drivers/net/ethernet/emulex/benet/be_cmds.c

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,55 @@
1919
#include "be.h"
2020
#include "be_cmds.h"
2121

22+
static struct be_cmd_priv_map cmd_priv_map[] = {
23+
{
24+
OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
25+
CMD_SUBSYSTEM_ETH,
26+
BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
27+
BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
28+
},
29+
{
30+
OPCODE_COMMON_GET_FLOW_CONTROL,
31+
CMD_SUBSYSTEM_COMMON,
32+
BE_PRIV_LNKQUERY | BE_PRIV_VHADM |
33+
BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
34+
},
35+
{
36+
OPCODE_COMMON_SET_FLOW_CONTROL,
37+
CMD_SUBSYSTEM_COMMON,
38+
BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
39+
BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
40+
},
41+
{
42+
OPCODE_ETH_GET_PPORT_STATS,
43+
CMD_SUBSYSTEM_ETH,
44+
BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
45+
BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
46+
},
47+
{
48+
OPCODE_COMMON_GET_PHY_DETAILS,
49+
CMD_SUBSYSTEM_COMMON,
50+
BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
51+
BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
52+
}
53+
};
54+
55+
static bool be_cmd_allowed(struct be_adapter *adapter, u8 opcode,
56+
u8 subsystem)
57+
{
58+
int i;
59+
int num_entries = sizeof(cmd_priv_map)/sizeof(struct be_cmd_priv_map);
60+
u32 cmd_privileges = adapter->cmd_privileges;
61+
62+
for (i = 0; i < num_entries; i++)
63+
if (opcode == cmd_priv_map[i].opcode &&
64+
subsystem == cmd_priv_map[i].subsystem)
65+
if (!(cmd_privileges & cmd_priv_map[i].priv_mask))
66+
return false;
67+
68+
return true;
69+
}
70+
2271
static inline void *embedded_payload(struct be_mcc_wrb *wrb)
2372
{
2473
return wrb->payload.embedded_payload;
@@ -1332,6 +1381,10 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
13321381
struct lancer_cmd_req_pport_stats *req;
13331382
int status = 0;
13341383

1384+
if (!be_cmd_allowed(adapter, OPCODE_ETH_GET_PPORT_STATS,
1385+
CMD_SUBSYSTEM_ETH))
1386+
return -EPERM;
1387+
13351388
spin_lock_bh(&adapter->mcc_lock);
13361389

13371390
wrb = wrb_from_mccq(adapter);
@@ -1711,6 +1764,10 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
17111764
struct be_cmd_req_set_flow_control *req;
17121765
int status;
17131766

1767+
if (!be_cmd_allowed(adapter, OPCODE_COMMON_SET_FLOW_CONTROL,
1768+
CMD_SUBSYSTEM_COMMON))
1769+
return -EPERM;
1770+
17141771
spin_lock_bh(&adapter->mcc_lock);
17151772

17161773
wrb = wrb_from_mccq(adapter);
@@ -1740,6 +1797,10 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
17401797
struct be_cmd_req_get_flow_control *req;
17411798
int status;
17421799

1800+
if (!be_cmd_allowed(adapter, OPCODE_COMMON_GET_FLOW_CONTROL,
1801+
CMD_SUBSYSTEM_COMMON))
1802+
return -EPERM;
1803+
17431804
spin_lock_bh(&adapter->mcc_lock);
17441805

17451806
wrb = wrb_from_mccq(adapter);
@@ -2306,6 +2367,10 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
23062367
struct be_dma_mem cmd;
23072368
int status;
23082369

2370+
if (!be_cmd_allowed(adapter, OPCODE_COMMON_GET_PHY_DETAILS,
2371+
CMD_SUBSYSTEM_COMMON))
2372+
return -EPERM;
2373+
23092374
spin_lock_bh(&adapter->mcc_lock);
23102375

23112376
wrb = wrb_from_mccq(adapter);
@@ -2465,6 +2530,42 @@ int be_cmd_req_native_mode(struct be_adapter *adapter)
24652530
return status;
24662531
}
24672532

2533+
/* Get privilege(s) for a function */
2534+
int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
2535+
u32 domain)
2536+
{
2537+
struct be_mcc_wrb *wrb;
2538+
struct be_cmd_req_get_fn_privileges *req;
2539+
int status;
2540+
2541+
spin_lock_bh(&adapter->mcc_lock);
2542+
2543+
wrb = wrb_from_mccq(adapter);
2544+
if (!wrb) {
2545+
status = -EBUSY;
2546+
goto err;
2547+
}
2548+
2549+
req = embedded_payload(wrb);
2550+
2551+
be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2552+
OPCODE_COMMON_GET_FN_PRIVILEGES, sizeof(*req),
2553+
wrb, NULL);
2554+
2555+
req->hdr.domain = domain;
2556+
2557+
status = be_mcc_notify_wait(adapter);
2558+
if (!status) {
2559+
struct be_cmd_resp_get_fn_privileges *resp =
2560+
embedded_payload(wrb);
2561+
*privilege = le32_to_cpu(resp->privilege_mask);
2562+
}
2563+
2564+
err:
2565+
spin_unlock_bh(&adapter->mcc_lock);
2566+
return status;
2567+
}
2568+
24682569
/* Uses synchronous MCCQ */
24692570
int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
24702571
bool *pmac_id_active, u32 *pmac_id, u8 domain)
@@ -2682,6 +2783,10 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
26822783
int payload_len = sizeof(*req);
26832784
struct be_dma_mem cmd;
26842785

2786+
if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
2787+
CMD_SUBSYSTEM_ETH))
2788+
return -EPERM;
2789+
26852790
memset(&cmd, 0, sizeof(struct be_dma_mem));
26862791
cmd.size = sizeof(struct be_cmd_resp_acpi_wol_magic_config_v1);
26872792
cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,

drivers/net/ethernet/emulex/benet/be_cmds.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ struct be_mcc_mailbox {
200200
#define OPCODE_COMMON_GET_PROFILE_CONFIG 164
201201
#define OPCODE_COMMON_SET_PROFILE_CONFIG 165
202202
#define OPCODE_COMMON_SET_HSW_CONFIG 153
203+
#define OPCODE_COMMON_GET_FN_PRIVILEGES 170
203204
#define OPCODE_COMMON_READ_OBJECT 171
204205
#define OPCODE_COMMON_WRITE_OBJECT 172
205206

@@ -1432,6 +1433,41 @@ struct be_cmd_resp_set_func_cap {
14321433
u8 rsvd[212];
14331434
};
14341435

1436+
/*********************** Function Privileges ***********************/
1437+
enum {
1438+
BE_PRIV_DEFAULT = 0x1,
1439+
BE_PRIV_LNKQUERY = 0x2,
1440+
BE_PRIV_LNKSTATS = 0x4,
1441+
BE_PRIV_LNKMGMT = 0x8,
1442+
BE_PRIV_LNKDIAG = 0x10,
1443+
BE_PRIV_UTILQUERY = 0x20,
1444+
BE_PRIV_FILTMGMT = 0x40,
1445+
BE_PRIV_IFACEMGMT = 0x80,
1446+
BE_PRIV_VHADM = 0x100,
1447+
BE_PRIV_DEVCFG = 0x200,
1448+
BE_PRIV_DEVSEC = 0x400
1449+
};
1450+
#define MAX_PRIVILEGES (BE_PRIV_VHADM | BE_PRIV_DEVCFG | \
1451+
BE_PRIV_DEVSEC)
1452+
#define MIN_PRIVILEGES BE_PRIV_DEFAULT
1453+
1454+
struct be_cmd_priv_map {
1455+
u8 opcode;
1456+
u8 subsystem;
1457+
u32 priv_mask;
1458+
};
1459+
1460+
struct be_cmd_req_get_fn_privileges {
1461+
struct be_cmd_req_hdr hdr;
1462+
u32 rsvd;
1463+
};
1464+
1465+
struct be_cmd_resp_get_fn_privileges {
1466+
struct be_cmd_resp_hdr hdr;
1467+
u32 privilege_mask;
1468+
};
1469+
1470+
14351471
/******************** GET/SET_MACLIST **************************/
14361472
#define BE_MAX_MAC 64
14371473
struct be_cmd_req_get_mac_list {
@@ -1766,6 +1802,11 @@ struct be_cmd_resp_set_profile_config {
17661802
struct be_cmd_req_hdr hdr;
17671803
};
17681804

1805+
static inline bool check_privilege(struct be_adapter *adapter, u32 flags)
1806+
{
1807+
return flags & adapter->cmd_privileges ? true : false;
1808+
}
1809+
17691810
extern int be_pci_fnum_get(struct be_adapter *adapter);
17701811
extern int be_fw_wait_ready(struct be_adapter *adapter);
17711812
extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
@@ -1862,6 +1903,8 @@ extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter);
18621903
extern int be_cmd_req_native_mode(struct be_adapter *adapter);
18631904
extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
18641905
extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf);
1906+
extern int be_cmd_get_fn_privileges(struct be_adapter *adapter,
1907+
u32 *privilege, u32 domain);
18651908
extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
18661909
bool *pmac_id_active, u32 *pmac_id,
18671910
u8 domain);

drivers/net/ethernet/emulex/benet/be_ethtool.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,9 @@ be_get_reg_len(struct net_device *netdev)
261261
struct be_adapter *adapter = netdev_priv(netdev);
262262
u32 log_size = 0;
263263

264+
if (!check_privilege(adapter, MAX_PRIVILEGES))
265+
return 0;
266+
264267
if (be_physfn(adapter)) {
265268
if (lancer_chip(adapter))
266269
log_size = lancer_cmd_get_file_len(adapter,
@@ -787,6 +790,10 @@ static int
787790
be_get_eeprom_len(struct net_device *netdev)
788791
{
789792
struct be_adapter *adapter = netdev_priv(netdev);
793+
794+
if (!check_privilege(adapter, MAX_PRIVILEGES))
795+
return 0;
796+
790797
if (lancer_chip(adapter)) {
791798
if (be_physfn(adapter))
792799
return lancer_cmd_get_file_len(adapter,

drivers/net/ethernet/emulex/benet/be_main.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2745,6 +2745,11 @@ static void be_setup_init(struct be_adapter *adapter)
27452745
adapter->be3_native = false;
27462746
adapter->promiscuous = false;
27472747
adapter->eq_next_idx = 0;
2748+
2749+
if (be_physfn(adapter))
2750+
adapter->cmd_privileges = MAX_PRIVILEGES;
2751+
else
2752+
adapter->cmd_privileges = MIN_PRIVILEGES;
27482753
}
27492754

27502755
static int be_get_mac_addr(struct be_adapter *adapter, u8 *mac, u32 if_handle,
@@ -2917,6 +2922,13 @@ static int be_setup(struct be_adapter *adapter)
29172922
if (status)
29182923
goto err;
29192924

2925+
be_cmd_get_fn_privileges(adapter, &adapter->cmd_privileges, 0);
2926+
/* In UMC mode FW does not return right privileges.
2927+
* Override with correct privilege equivalent to PF.
2928+
*/
2929+
if (be_is_mc(adapter))
2930+
adapter->cmd_privileges = MAX_PRIVILEGES;
2931+
29202932
en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST |
29212933
BE_IF_FLAGS_MULTICAST | BE_IF_FLAGS_PASS_L3L4_ERRORS;
29222934

@@ -2973,8 +2985,8 @@ static int be_setup(struct be_adapter *adapter)
29732985
dev_warn(dev, "device doesn't support SRIOV\n");
29742986
}
29752987

2976-
be_cmd_get_phy_info(adapter);
2977-
if (be_pause_supported(adapter))
2988+
status = be_cmd_get_phy_info(adapter);
2989+
if (!status && be_pause_supported(adapter))
29782990
adapter->phy.fc_autoneg = 1;
29792991

29802992
schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
@@ -3711,6 +3723,9 @@ u32 be_get_fw_log_level(struct be_adapter *adapter)
37113723
u32 level = 0;
37123724
int j;
37133725

3726+
if (lancer_chip(adapter))
3727+
return 0;
3728+
37143729
memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
37153730
extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
37163731
extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size,

0 commit comments

Comments
 (0)