mac_entry->addr);
 }
 
+static void hns_dsaf_setup_mc_mask(struct dsaf_device *dsaf_dev,
+                                  u8 port_num, u8 *mask, u8 *addr)
+{
+       if (MAC_IS_BROADCAST(addr))
+               memset(mask, 0xff, ETH_ALEN);
+       else
+               memcpy(mask, dsaf_dev->mac_cb[port_num]->mc_mask, ETH_ALEN);
+}
+
 static void hns_dsaf_mc_mask_bit_clear(char *dst, const char *src)
 {
        u16 *a = (u16 *)dst;
        struct dsaf_drv_tbl_tcam_key tmp_mac_key;
        struct dsaf_tbl_tcam_data tcam_data;
        u8 mc_addr[ETH_ALEN];
-       u8 *mc_mask;
        int mskid;
 
        /*chechk mac addr */
        }
 
        ether_addr_copy(mc_addr, mac_entry->addr);
-       mc_mask = dsaf_dev->mac_cb[mac_entry->in_port_num]->mc_mask;
        if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) {
+               u8 mc_mask[ETH_ALEN];
+
                /* prepare for key data setting */
+               hns_dsaf_setup_mc_mask(dsaf_dev, mac_entry->in_port_num,
+                                      mc_mask, mac_entry->addr);
                hns_dsaf_mc_mask_bit_clear(mc_addr, mc_mask);
 
                /* config key mask */
        struct dsaf_drv_tbl_tcam_key mask_key, tmp_mac_key;
        struct dsaf_tbl_tcam_data *pmask_key = NULL;
        u8 mc_addr[ETH_ALEN];
-       u8 *mc_mask;
 
        if (!(void *)mac_entry) {
                dev_err(dsaf_dev->dev,
 
        /* always mask vlan_id field */
        ether_addr_copy(mc_addr, mac_entry->addr);
-       mc_mask = dsaf_dev->mac_cb[mac_entry->in_port_num]->mc_mask;
 
        if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) {
+               u8 mc_mask[ETH_ALEN];
+
                /* prepare for key data setting */
+               hns_dsaf_setup_mc_mask(dsaf_dev, mac_entry->in_port_num,
+                                      mc_mask, mac_entry->addr);
                hns_dsaf_mc_mask_bit_clear(mc_addr, mc_mask);
 
                /* config key mask */
-               hns_dsaf_set_mac_key(dsaf_dev, &mask_key, 0x00, 0xff, mc_addr);
+               hns_dsaf_set_mac_key(dsaf_dev, &mask_key, 0x00, 0xff, mc_mask);
 
                mask_key.high.val = le32_to_cpu(mask_key.high.val);
                mask_key.low.val = le32_to_cpu(mask_key.low.val);