ar71xx: ag71xx: fix max frame length setup of the built-in switches
[openwrt.git] / target / linux / ar71xx / files / drivers / net / ethernet / atheros / ag71xx / ag71xx_ar7240.c
index 49f0775..d4ccc02 100644 (file)
@@ -36,7 +36,8 @@
 #define AR7240_FLOOD_MASK_BROAD_TO_CPU BIT(26)
 
 #define AR7240_REG_GLOBAL_CTRL         0x30
-#define AR7240_GLOBAL_CTRL_MTU_M       BITM(12)
+#define AR7240_GLOBAL_CTRL_MTU_M       BITM(11)
+#define AR9340_GLOBAL_CTRL_MTU_M       BITM(14)
 
 #define AR7240_REG_VTU                 0x0040
 #define   AR7240_VTU_OP                        BITM(3)
 #define   AR934X_REG_OPER_MODE1_PHY4_MII_EN    BIT(28)
 
 #define AR934X_REG_FLOOD_MASK          0x2c
+#define   AR934X_FLOOD_MASK_MC_DP(_p)  BIT(16 + (_p))
 #define   AR934X_FLOOD_MASK_BC_DP(_p)  BIT(25 + (_p))
 
 #define AR934X_REG_QM_CTRL             0x3c
@@ -580,9 +582,15 @@ static void ar7240sw_setup(struct ar7240sw *as)
                /* Enable ARP frame acknowledge */
                ar7240sw_reg_set(mii, AR934X_REG_QM_CTRL,
                                 AR934X_QM_CTRL_ARP_EN);
-               /* Enable Broadcast frames transmitted to the CPU */
+               /* Enable Broadcast/Multicast frames transmitted to the CPU */
                ar7240sw_reg_set(mii, AR934X_REG_FLOOD_MASK,
-                                AR934X_FLOOD_MASK_BC_DP(0));
+                                AR934X_FLOOD_MASK_BC_DP(0) |
+                                AR934X_FLOOD_MASK_MC_DP(0));
+
+               /* setup MTU */
+               ar7240sw_reg_rmw(mii, AR7240_REG_GLOBAL_CTRL,
+                                AR9340_GLOBAL_CTRL_MTU_M,
+                                AR9340_GLOBAL_CTRL_MTU_M);
 
                /* Enable MIB counters */
                ar7240sw_reg_set(mii, AR7240_REG_MIB_FUNCTION0,
@@ -599,11 +607,12 @@ static void ar7240sw_setup(struct ar7240sw *as)
                /* Enable Broadcast frames transmitted to the CPU */
                ar7240sw_reg_set(mii, AR7240_REG_FLOOD_MASK,
                                 AR7240_FLOOD_MASK_BROAD_TO_CPU);
-       }
 
-       /* setup MTU */
-       ar7240sw_reg_rmw(mii, AR7240_REG_GLOBAL_CTRL, AR7240_GLOBAL_CTRL_MTU_M,
-                        1536);
+               /* setup MTU */
+               ar7240sw_reg_rmw(mii, AR7240_REG_GLOBAL_CTRL,
+                                AR7240_GLOBAL_CTRL_MTU_M,
+                                AR7240_GLOBAL_CTRL_MTU_M);
+       }
 
        /* setup Service TAG */
        ar7240sw_reg_rmw(mii, AR7240_REG_SERVICE_TAG, AR7240_SERVICE_TAG_M, 0);
@@ -1041,7 +1050,7 @@ static struct ar7240sw *ar7240_probe(struct ag71xx *ag)
        if ((phy_id1 != AR7240_PHY_ID1 || phy_id2 != AR7240_PHY_ID2) &&
            (phy_id1 != AR934X_PHY_ID1 || phy_id2 != AR934X_PHY_ID2)) {
                pr_err("%s: unknown phy id '%04x:%04x'\n",
-                      ag->dev->name, phy_id1, phy_id2);
+                      dev_name(&mii->dev), phy_id1, phy_id2);
                return NULL;
        }
 
@@ -1072,7 +1081,7 @@ static struct ar7240sw *ar7240_probe(struct ag71xx *ag)
                                         AR934X_OPER_MODE0_PHY_MII_EN);
                } else {
                        pr_err("%s: invalid PHY interface mode\n",
-                              ag->dev->name);
+                              dev_name(&mii->dev));
                        goto err_free;
                }
 
@@ -1085,7 +1094,7 @@ static struct ar7240sw *ar7240_probe(struct ag71xx *ag)
                }
        } else {
                pr_err("%s: unsupported chip, ctrl=%08x\n",
-                       ag->dev->name, ctrl);
+                       dev_name(&mii->dev), ctrl);
                goto err_free;
        }
 
@@ -1096,7 +1105,7 @@ static struct ar7240sw *ar7240_probe(struct ag71xx *ag)
        if (register_switch(&as->swdev, ag->dev) < 0)
                goto err_free;
 
-       pr_info("%s: Found an %s\n", ag->dev->name, swdev->name);
+       pr_info("%s: Found an %s\n", dev_name(&mii->dev), swdev->name);
 
        /* initialize defaults */
        for (i = 0; i < AR7240_MAX_VLANS; i++)
@@ -1163,7 +1172,7 @@ void ag71xx_ar7240_stop(struct ag71xx *ag)
        cancel_delayed_work_sync(&ag->link_work);
 }
 
-int __devinit ag71xx_ar7240_init(struct ag71xx *ag)
+int ag71xx_ar7240_init(struct ag71xx *ag)
 {
        struct ar7240sw *as;