aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXi Wang <wangxi11@huawei.com>2018-06-04 12:50:09 -0400
committerDavid S. Miller <davem@davemloft.net>2018-06-04 17:32:56 -0400
commitf0b964e5e4bb6b0c152f8064bb69a0f3d32a5096 (patch)
treeeba41ef68f77b802a503b98472d8710a47462769
parent0e3990356d2518691e17c1ecbf7868833b6e6704 (diff)
net: hns: Fix the process of adding broadcast addresses to tcam
If the multicast mask value in device tree is configured not all 0xff, the broadcast mac will be lost from tcam table after the execution of command 'ifconfig up'. The address is appended by hns_ae_start, but will be clear later by hns_nic_set_rx_mode called in dev_open process. This patch fixed it by not use the multicast mask when add a broadcast address. Fixes: b5996f11ea54 ("net: add Hisilicon Network Subsystem basic ethernet support") Signed-off-by: Xi Wang <wangxi11@huawei.com> Signed-off-by: Peng Li <lipeng321@huawei.com> Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e0bc79ea3d88..85e1d14514fc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -1648,6 +1648,15 @@ int hns_dsaf_rm_mac_addr(
1648 mac_entry->addr); 1648 mac_entry->addr);
1649} 1649}
1650 1650
1651static void hns_dsaf_setup_mc_mask(struct dsaf_device *dsaf_dev,
1652 u8 port_num, u8 *mask, u8 *addr)
1653{
1654 if (MAC_IS_BROADCAST(addr))
1655 memset(mask, 0xff, ETH_ALEN);
1656 else
1657 memcpy(mask, dsaf_dev->mac_cb[port_num]->mc_mask, ETH_ALEN);
1658}
1659
1651static void hns_dsaf_mc_mask_bit_clear(char *dst, const char *src) 1660static void hns_dsaf_mc_mask_bit_clear(char *dst, const char *src)
1652{ 1661{
1653 u16 *a = (u16 *)dst; 1662 u16 *a = (u16 *)dst;
@@ -1676,7 +1685,6 @@ int hns_dsaf_add_mac_mc_port(struct dsaf_device *dsaf_dev,
1676 struct dsaf_drv_tbl_tcam_key tmp_mac_key; 1685 struct dsaf_drv_tbl_tcam_key tmp_mac_key;
1677 struct dsaf_tbl_tcam_data tcam_data; 1686 struct dsaf_tbl_tcam_data tcam_data;
1678 u8 mc_addr[ETH_ALEN]; 1687 u8 mc_addr[ETH_ALEN];
1679 u8 *mc_mask;
1680 int mskid; 1688 int mskid;
1681 1689
1682 /*chechk mac addr */ 1690 /*chechk mac addr */
@@ -1687,9 +1695,12 @@ int hns_dsaf_add_mac_mc_port(struct dsaf_device *dsaf_dev,
1687 } 1695 }
1688 1696
1689 ether_addr_copy(mc_addr, mac_entry->addr); 1697 ether_addr_copy(mc_addr, mac_entry->addr);
1690 mc_mask = dsaf_dev->mac_cb[mac_entry->in_port_num]->mc_mask;
1691 if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) { 1698 if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) {
1699 u8 mc_mask[ETH_ALEN];
1700
1692 /* prepare for key data setting */ 1701 /* prepare for key data setting */
1702 hns_dsaf_setup_mc_mask(dsaf_dev, mac_entry->in_port_num,
1703 mc_mask, mac_entry->addr);
1693 hns_dsaf_mc_mask_bit_clear(mc_addr, mc_mask); 1704 hns_dsaf_mc_mask_bit_clear(mc_addr, mc_mask);
1694 1705
1695 /* config key mask */ 1706 /* config key mask */
@@ -1844,7 +1855,6 @@ int hns_dsaf_del_mac_mc_port(struct dsaf_device *dsaf_dev,
1844 struct dsaf_drv_tbl_tcam_key mask_key, tmp_mac_key; 1855 struct dsaf_drv_tbl_tcam_key mask_key, tmp_mac_key;
1845 struct dsaf_tbl_tcam_data *pmask_key = NULL; 1856 struct dsaf_tbl_tcam_data *pmask_key = NULL;
1846 u8 mc_addr[ETH_ALEN]; 1857 u8 mc_addr[ETH_ALEN];
1847 u8 *mc_mask;
1848 1858
1849 if (!(void *)mac_entry) { 1859 if (!(void *)mac_entry) {
1850 dev_err(dsaf_dev->dev, 1860 dev_err(dsaf_dev->dev,
@@ -1861,14 +1871,17 @@ int hns_dsaf_del_mac_mc_port(struct dsaf_device *dsaf_dev,
1861 1871
1862 /* always mask vlan_id field */ 1872 /* always mask vlan_id field */
1863 ether_addr_copy(mc_addr, mac_entry->addr); 1873 ether_addr_copy(mc_addr, mac_entry->addr);
1864 mc_mask = dsaf_dev->mac_cb[mac_entry->in_port_num]->mc_mask;
1865 1874
1866 if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) { 1875 if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) {
1876 u8 mc_mask[ETH_ALEN];
1877
1867 /* prepare for key data setting */ 1878 /* prepare for key data setting */
1879 hns_dsaf_setup_mc_mask(dsaf_dev, mac_entry->in_port_num,
1880 mc_mask, mac_entry->addr);
1868 hns_dsaf_mc_mask_bit_clear(mc_addr, mc_mask); 1881 hns_dsaf_mc_mask_bit_clear(mc_addr, mc_mask);
1869 1882
1870 /* config key mask */ 1883 /* config key mask */
1871 hns_dsaf_set_mac_key(dsaf_dev, &mask_key, 0x00, 0xff, mc_addr); 1884 hns_dsaf_set_mac_key(dsaf_dev, &mask_key, 0x00, 0xff, mc_mask);
1872 1885
1873 mask_key.high.val = le32_to_cpu(mask_key.high.val); 1886 mask_key.high.val = le32_to_cpu(mask_key.high.val);
1874 mask_key.low.val = le32_to_cpu(mask_key.low.val); 1887 mask_key.low.val = le32_to_cpu(mask_key.low.val);