| From aec6c209cc22302cedee926f4e61f49533d02aa7 Mon Sep 17 00:00:00 2001 |
| From: Yonglong Liu <liuyonglong@huawei.com> |
| Date: Thu, 4 Apr 2019 16:46:45 +0800 |
| Subject: net: hns: fix ICMP6 neighbor solicitation messages discard problem |
| |
| [ Upstream commit f058e46855dcbc28edb2ed4736f38a71fd19cadb ] |
| |
| ICMP6 neighbor solicitation messages will be discard by the Hip06 |
| chips, because of not setting forwarding pool. Enable promisc mode |
| has the same problem. |
| |
| This patch fix the wrong forwarding table configs for the multicast |
| vague matching when enable promisc mode, and add forwarding pool |
| for the forwarding table. |
| |
| Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org> |
| --- |
| .../ethernet/hisilicon/hns/hns_dsaf_main.c | 33 +++++++++++++++---- |
| 1 file changed, 27 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
| index ac55db065f16..f5ff07cb2b72 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
| +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
| @@ -2750,6 +2750,17 @@ int hns_dsaf_get_regs_count(void) |
| return DSAF_DUMP_REGS_NUM; |
| } |
| |
| +static int hns_dsaf_get_port_id(u8 port) |
| +{ |
| + if (port < DSAF_SERVICE_NW_NUM) |
| + return port; |
| + |
| + if (port >= DSAF_BASE_INNER_PORT_NUM) |
| + return port - DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM; |
| + |
| + return -EINVAL; |
| +} |
| + |
| static void set_promisc_tcam_enable(struct dsaf_device *dsaf_dev, u32 port) |
| { |
| struct dsaf_tbl_tcam_ucast_cfg tbl_tcam_ucast = {0, 1, 0, 0, 0x80}; |
| @@ -2815,23 +2826,33 @@ static void set_promisc_tcam_enable(struct dsaf_device *dsaf_dev, u32 port) |
| memset(&temp_key, 0x0, sizeof(temp_key)); |
| mask_entry.addr[0] = 0x01; |
| hns_dsaf_set_mac_key(dsaf_dev, &mask_key, mask_entry.in_vlan_id, |
| - port, mask_entry.addr); |
| + 0xf, mask_entry.addr); |
| tbl_tcam_mcast.tbl_mcast_item_vld = 1; |
| tbl_tcam_mcast.tbl_mcast_old_en = 0; |
| |
| - if (port < DSAF_SERVICE_NW_NUM) { |
| - mskid = port; |
| - } else if (port >= DSAF_BASE_INNER_PORT_NUM) { |
| - mskid = port - DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM; |
| - } else { |
| + /* set MAC port to handle multicast */ |
| + mskid = hns_dsaf_get_port_id(port); |
| + if (mskid == -EINVAL) { |
| dev_err(dsaf_dev->dev, "%s,pnum(%d)error,key(%#x:%#x)\n", |
| dsaf_dev->ae_dev.name, port, |
| mask_key.high.val, mask_key.low.val); |
| return; |
| } |
| + dsaf_set_bit(tbl_tcam_mcast.tbl_mcast_port_msk[mskid / 32], |
| + mskid % 32, 1); |
| |
| + /* set pool bit map to handle multicast */ |
| + mskid = hns_dsaf_get_port_id(port_num); |
| + if (mskid == -EINVAL) { |
| + dev_err(dsaf_dev->dev, |
| + "%s, pool bit map pnum(%d)error,key(%#x:%#x)\n", |
| + dsaf_dev->ae_dev.name, port_num, |
| + mask_key.high.val, mask_key.low.val); |
| + return; |
| + } |
| dsaf_set_bit(tbl_tcam_mcast.tbl_mcast_port_msk[mskid / 32], |
| mskid % 32, 1); |
| + |
| memcpy(&temp_key, &mask_key, sizeof(mask_key)); |
| hns_dsaf_tcam_mc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_mc, |
| (struct dsaf_tbl_tcam_data *)(&mask_key), |
| -- |
| 2.20.1 |
| |