b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
 }
 
+static void b53_port_set_learning(struct b53_device *dev, int port,
+                                 bool learning)
+{
+       u16 reg;
+
+       b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, ®);
+       if (learning)
+               reg &= ~BIT(port);
+       else
+               reg |= BIT(port);
+       b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, reg);
+}
+
 int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
 {
        struct b53_device *dev = ds->priv;
 
        b53_port_set_ucast_flood(dev, port, true);
        b53_port_set_mcast_flood(dev, port, true);
+       b53_port_set_learning(dev, port, false);
 
        if (dev->ops->irq_enable)
                ret = dev->ops->irq_enable(dev, port);
 
        b53_port_set_ucast_flood(dev, port, true);
        b53_port_set_mcast_flood(dev, port, true);
+       b53_port_set_learning(dev, port, false);
 }
 
 static void b53_enable_mib(struct b53_device *dev)
                     struct switchdev_brport_flags flags,
                     struct netlink_ext_ack *extack)
 {
-       if (flags.mask & ~(BR_FLOOD | BR_MCAST_FLOOD))
+       if (flags.mask & ~(BR_FLOOD | BR_MCAST_FLOOD | BR_LEARNING))
                return -EINVAL;
 
        return 0;
        if (flags.mask & BR_MCAST_FLOOD)
                b53_port_set_mcast_flood(ds->priv, port,
                                         !!(flags.val & BR_MCAST_FLOOD));
+       if (flags.mask & BR_LEARNING)
+               b53_port_set_learning(ds->priv, port,
+                                     !!(flags.val & BR_LEARNING));
 
        return 0;
 }
 
        reg &= ~P_TXQ_PSM_VDD(port);
        core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL);
 
-       /* Enable learning */
-       reg = core_readl(priv, CORE_DIS_LEARN);
-       reg &= ~BIT(port);
-       core_writel(priv, reg, CORE_DIS_LEARN);
-
        /* Enable Broadcom tags for that port if requested */
-       if (priv->brcm_tag_mask & BIT(port)) {
+       if (priv->brcm_tag_mask & BIT(port))
                b53_brcm_hdr_setup(ds, port);
 
-               /* Disable learning on ASP port */
-               if (port == 7) {
-                       reg = core_readl(priv, CORE_DIS_LEARN);
-                       reg |= BIT(port);
-                       core_writel(priv, reg, CORE_DIS_LEARN);
-               }
-       }
-
        /* Configure Traffic Class to QoS mapping, allow each priority to map
         * to a different queue number
         */