Commit feeb3712 authored by David S. Miller's avatar David S. Miller

Merge branch 'hns3-promisc-updates'

Huazhong Tan says:

====================
net: hns3: add two promisc mode updates

This series includes two updates related to promisc mode for the HNS3
ethernet driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 62f148d8 4e2471f7
...@@ -5183,9 +5183,8 @@ static int hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc, ...@@ -5183,9 +5183,8 @@ static int hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
static void hclge_request_update_promisc_mode(struct hnae3_handle *handle) static void hclge_request_update_promisc_mode(struct hnae3_handle *handle)
{ {
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back;
set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state); set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
} }
static void hclge_sync_fd_state(struct hclge_dev *hdev) static void hclge_sync_fd_state(struct hclge_dev *hdev)
...@@ -8050,6 +8049,7 @@ int hclge_vport_start(struct hclge_vport *vport) ...@@ -8050,6 +8049,7 @@ int hclge_vport_start(struct hclge_vport *vport)
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state); set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
vport->last_active_jiffies = jiffies; vport->last_active_jiffies = jiffies;
if (test_bit(vport->vport_id, hdev->vport_config_block)) { if (test_bit(vport->vport_id, hdev->vport_config_block)) {
...@@ -10048,7 +10048,6 @@ static void hclge_restore_hw_table(struct hclge_dev *hdev) ...@@ -10048,7 +10048,6 @@ static void hclge_restore_hw_table(struct hclge_dev *hdev)
hclge_restore_mac_table_common(vport); hclge_restore_mac_table_common(vport);
hclge_restore_vport_vlan_table(vport); hclge_restore_vport_vlan_table(vport);
set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state);
set_bit(HCLGE_STATE_FD_USER_DEF_CHANGED, &hdev->state); set_bit(HCLGE_STATE_FD_USER_DEF_CHANGED, &hdev->state);
hclge_restore_fd_entries(handle); hclge_restore_fd_entries(handle);
} }
...@@ -11500,10 +11499,7 @@ static int hclge_set_vf_trust(struct hnae3_handle *handle, int vf, bool enable) ...@@ -11500,10 +11499,7 @@ static int hclge_set_vf_trust(struct hnae3_handle *handle, int vf, bool enable)
{ {
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
u32 new_trusted = enable ? 1 : 0; u32 new_trusted = enable ? 1 : 0;
bool en_bc_pmc;
int ret;
vport = hclge_get_vf_vport(hdev, vf); vport = hclge_get_vf_vport(hdev, vf);
if (!vport) if (!vport)
...@@ -11512,18 +11508,9 @@ static int hclge_set_vf_trust(struct hnae3_handle *handle, int vf, bool enable) ...@@ -11512,18 +11508,9 @@ static int hclge_set_vf_trust(struct hnae3_handle *handle, int vf, bool enable)
if (vport->vf_info.trusted == new_trusted) if (vport->vf_info.trusted == new_trusted)
return 0; return 0;
/* Disable promisc mode for VF if it is not trusted any more. */
if (!enable && vport->vf_info.promisc_enable) {
en_bc_pmc = ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2;
ret = hclge_set_vport_promisc_mode(vport, false, false,
en_bc_pmc);
if (ret)
return ret;
vport->vf_info.promisc_enable = 0;
hclge_inform_vf_promisc_info(vport);
}
vport->vf_info.trusted = new_trusted; vport->vf_info.trusted = new_trusted;
set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
hclge_task_schedule(hdev, 0);
return 0; return 0;
} }
...@@ -12417,22 +12404,50 @@ static void hclge_sync_promisc_mode(struct hclge_dev *hdev) ...@@ -12417,22 +12404,50 @@ static void hclge_sync_promisc_mode(struct hclge_dev *hdev)
struct hnae3_handle *handle = &vport->nic; struct hnae3_handle *handle = &vport->nic;
u8 tmp_flags; u8 tmp_flags;
int ret; int ret;
u16 i;
if (vport->last_promisc_flags != vport->overflow_promisc_flags) { if (vport->last_promisc_flags != vport->overflow_promisc_flags) {
set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state); set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
vport->last_promisc_flags = vport->overflow_promisc_flags; vport->last_promisc_flags = vport->overflow_promisc_flags;
} }
if (test_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state)) { if (test_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state)) {
tmp_flags = handle->netdev_flags | vport->last_promisc_flags; tmp_flags = handle->netdev_flags | vport->last_promisc_flags;
ret = hclge_set_promisc_mode(handle, tmp_flags & HNAE3_UPE, ret = hclge_set_promisc_mode(handle, tmp_flags & HNAE3_UPE,
tmp_flags & HNAE3_MPE); tmp_flags & HNAE3_MPE);
if (!ret) { if (!ret) {
clear_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state); clear_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE,
&vport->state);
hclge_enable_vlan_filter(handle, hclge_enable_vlan_filter(handle,
tmp_flags & HNAE3_VLAN_FLTR); tmp_flags & HNAE3_VLAN_FLTR);
} }
} }
for (i = 1; i < hdev->num_alloc_vport; i++) {
bool uc_en = false;
bool mc_en = false;
bool bc_en;
vport = &hdev->vport[i];
if (!test_and_clear_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE,
&vport->state))
continue;
if (vport->vf_info.trusted) {
uc_en = vport->vf_info.request_uc_en > 0;
mc_en = vport->vf_info.request_mc_en > 0;
}
bc_en = vport->vf_info.request_bc_en > 0;
ret = hclge_cmd_set_promisc_mode(hdev, vport->vport_id, uc_en,
mc_en, bc_en);
if (ret) {
set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE,
&vport->state);
return;
}
}
} }
static bool hclge_module_existed(struct hclge_dev *hdev) static bool hclge_module_existed(struct hclge_dev *hdev)
......
...@@ -224,7 +224,6 @@ enum HCLGE_DEV_STATE { ...@@ -224,7 +224,6 @@ enum HCLGE_DEV_STATE {
HCLGE_STATE_STATISTICS_UPDATING, HCLGE_STATE_STATISTICS_UPDATING,
HCLGE_STATE_CMD_DISABLE, HCLGE_STATE_CMD_DISABLE,
HCLGE_STATE_LINK_UPDATING, HCLGE_STATE_LINK_UPDATING,
HCLGE_STATE_PROMISC_CHANGED,
HCLGE_STATE_RST_FAIL, HCLGE_STATE_RST_FAIL,
HCLGE_STATE_FD_TBL_CHANGED, HCLGE_STATE_FD_TBL_CHANGED,
HCLGE_STATE_FD_CLEAR_ALL, HCLGE_STATE_FD_CLEAR_ALL,
...@@ -952,6 +951,7 @@ struct hclge_rss_tuple_cfg { ...@@ -952,6 +951,7 @@ struct hclge_rss_tuple_cfg {
enum HCLGE_VPORT_STATE { enum HCLGE_VPORT_STATE {
HCLGE_VPORT_STATE_ALIVE, HCLGE_VPORT_STATE_ALIVE,
HCLGE_VPORT_STATE_MAC_TBL_CHANGE, HCLGE_VPORT_STATE_MAC_TBL_CHANGE,
HCLGE_VPORT_STATE_PROMISC_CHANGE,
HCLGE_VPORT_STATE_MAX HCLGE_VPORT_STATE_MAX
}; };
...@@ -972,7 +972,9 @@ struct hclge_vf_info { ...@@ -972,7 +972,9 @@ struct hclge_vf_info {
u32 spoofchk; u32 spoofchk;
u32 max_tx_rate; u32 max_tx_rate;
u32 trusted; u32 trusted;
u16 promisc_enable; u8 request_uc_en;
u8 request_mc_en;
u8 request_bc_en;
}; };
struct hclge_vport { struct hclge_vport {
......
...@@ -231,19 +231,15 @@ static int hclge_map_unmap_ring_to_vf_vector(struct hclge_vport *vport, bool en, ...@@ -231,19 +231,15 @@ static int hclge_map_unmap_ring_to_vf_vector(struct hclge_vport *vport, bool en,
return ret; return ret;
} }
static int hclge_set_vf_promisc_mode(struct hclge_vport *vport, static void hclge_set_vf_promisc_mode(struct hclge_vport *vport,
struct hclge_mbx_vf_to_pf_cmd *req) struct hclge_mbx_vf_to_pf_cmd *req)
{ {
bool en_bc = req->msg.en_bc ? true : false;
bool en_uc = req->msg.en_uc ? true : false;
bool en_mc = req->msg.en_mc ? true : false;
struct hnae3_handle *handle = &vport->nic; struct hnae3_handle *handle = &vport->nic;
int ret; struct hclge_dev *hdev = vport->back;
if (!vport->vf_info.trusted) { vport->vf_info.request_uc_en = req->msg.en_uc;
en_uc = false; vport->vf_info.request_mc_en = req->msg.en_mc;
en_mc = false; vport->vf_info.request_bc_en = req->msg.en_bc;
}
if (req->msg.en_limit_promisc) if (req->msg.en_limit_promisc)
set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags); set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
...@@ -251,22 +247,8 @@ static int hclge_set_vf_promisc_mode(struct hclge_vport *vport, ...@@ -251,22 +247,8 @@ static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, clear_bit(HNAE3_PFLAG_LIMIT_PROMISC,
&handle->priv_flags); &handle->priv_flags);
ret = hclge_set_vport_promisc_mode(vport, en_uc, en_mc, en_bc); set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
hclge_task_schedule(hdev, 0);
vport->vf_info.promisc_enable = (en_uc || en_mc) ? 1 : 0;
return ret;
}
void hclge_inform_vf_promisc_info(struct hclge_vport *vport)
{
u8 dest_vfid = (u8)vport->vport_id;
u8 msg_data[2];
memcpy(&msg_data[0], &vport->vf_info.promisc_enable, sizeof(u16));
hclge_send_mbx_msg(vport, msg_data, sizeof(msg_data),
HCLGE_MBX_PUSH_PROMISC_INFO, dest_vfid);
} }
static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport, static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport,
...@@ -748,11 +730,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev) ...@@ -748,11 +730,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
req); req);
break; break;
case HCLGE_MBX_SET_PROMISC_MODE: case HCLGE_MBX_SET_PROMISC_MODE:
ret = hclge_set_vf_promisc_mode(vport, req); hclge_set_vf_promisc_mode(vport, req);
if (ret)
dev_err(&hdev->pdev->dev,
"PF fail(%d) to set VF promisc mode\n",
ret);
break; break;
case HCLGE_MBX_SET_UNICAST: case HCLGE_MBX_SET_UNICAST:
ret = hclge_set_vf_uc_mac_addr(vport, req); ret = hclge_set_vf_uc_mac_addr(vport, req);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment