b53: improve overriding CPU port state on BCM5301X
[lede.git] / target / linux / generic / files / drivers / net / phy / b53 / b53_common.c
index 39027c1771066e6eb9cdba0f088e84de7eec9885..ac7c10cadcc6197daa67c0e785180c8ce8ad3f19 100644 (file)
@@ -189,7 +189,8 @@ static void b53_set_vlan_entry(struct b53_device *dev, u16 vid, u16 members,
                u32 entry = 0;
 
                if (members) {
-                       entry = (untag << VA_UNTAG_S) | members;
+                       entry = ((untag & VA_UNTAG_MASK_25) << VA_UNTAG_S_25) |
+                               members;
                        if (dev->core_rev >= 3)
                                entry |= VA_VALID_25_R4 | vid << VA_VID_HIGH_S;
                        else
@@ -203,7 +204,8 @@ static void b53_set_vlan_entry(struct b53_device *dev, u16 vid, u16 members,
                u16 entry = 0;
 
                if (members)
-                       entry = (untag << VA_UNTAG_S) | members | VA_VALID_65;
+                       entry = ((untag & VA_UNTAG_MASK_65) << VA_UNTAG_S_65) |
+                               members | VA_VALID_65;
 
                b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_WRITE_65, entry);
                b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_65, vid |
@@ -406,11 +408,11 @@ static void b53_enable_mib(struct b53_device *dev)
 {
        u8 gc;
 
-       b53_read8(dev, B53_CTRL_PAGE, B53_GLOBAL_CONFIG, &gc);
+       b53_read8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, &gc);
 
        gc &= ~(GC_RESET_MIB | GC_MIB_AC_EN);
 
-       b53_write8(dev, B53_CTRL_PAGE, B53_GLOBAL_CONFIG, gc);
+       b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc);
 }
 
 static int b53_apply(struct b53_device *dev)
@@ -457,7 +459,7 @@ static int b53_apply(struct b53_device *dev)
        return 0;
 }
 
-void b53_switch_reset_gpio(struct b53_device *dev)
+static void b53_switch_reset_gpio(struct b53_device *dev)
 {
        int gpio = dev->reset_gpio;
 
@@ -478,6 +480,7 @@ void b53_switch_reset_gpio(struct b53_device *dev)
 
 static int b53_switch_reset(struct b53_device *dev)
 {
+       u8 cpu_port = dev->sw_dev.cpu_port;
        u8 mgmt;
 
        b53_switch_reset_gpio(dev);
@@ -523,7 +526,7 @@ static int b53_switch_reset(struct b53_device *dev)
                                return -EINVAL;
                        }
                }
-       } else if ((is531x5(dev) || is5301x(dev)) && dev->sw_dev.cpu_port == B53_CPU_PORT) {
+       } else if (is531x5(dev) && cpu_port == B53_CPU_PORT) {
                u8 mii_port_override;
 
                b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
@@ -531,6 +534,33 @@ static int b53_switch_reset(struct b53_device *dev)
                b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
                           mii_port_override | PORT_OVERRIDE_EN |
                           PORT_OVERRIDE_LINK);
+       } else if (is5301x(dev)) {
+               if (cpu_port == 8) {
+                       u8 mii_port_override;
+
+                       b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
+                                 &mii_port_override);
+                       mii_port_override |= PORT_OVERRIDE_LINK |
+                                            PORT_OVERRIDE_RX_FLOW |
+                                            PORT_OVERRIDE_TX_FLOW |
+                                            PORT_OVERRIDE_SPEED_2000M |
+                                            PORT_OVERRIDE_EN;
+                       b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
+                                  mii_port_override);
+
+                       /* TODO: Ports 5 & 7 require some extra handling */
+               } else {
+                       u8 po_reg = B53_GMII_PORT_OVERRIDE_CTRL(cpu_port);
+                       u8 gmii_po;
+
+                       b53_read8(dev, B53_CTRL_PAGE, po_reg, &gmii_po);
+                       gmii_po |= GMII_PO_LINK |
+                                  GMII_PO_RX_FLOW |
+                                  GMII_PO_TX_FLOW |
+                                  GMII_PO_EN |
+                                  GMII_PO_SPEED_2000M;
+                       b53_write8(dev, B53_CTRL_PAGE, po_reg, gmii_po);
+               }
        }
 
        b53_enable_mib(dev);
@@ -1127,6 +1157,19 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
                .sw_ops = &b53_switch_ops,
        },
+       {
+               .chip_id = BCM53128_DEVICE_ID,
+               .dev_name = "BCM53128",
+               .alias = "bcm53128",
+               .vlans = 4096,
+               .enabled_ports = 0x1ff,
+               .cpu_port = B53_CPU_PORT,
+               .vta_regs = B53_VTA_REGS,
+               .duplex_reg = B53_DUPLEX_STAT_GE,
+               .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
+               .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
+               .sw_ops = &b53_switch_ops,
+       },
        {
                .chip_id = BCM63XX_DEVICE_ID,
                .dev_name = "BCM63xx",
@@ -1146,7 +1189,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .alias = "bcm53011",
                .vlans = 4096,
                .enabled_ports = 0x1f,
-               .cpu_port = B53_CPU_PORT_25, // TODO: auto detect
+               .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
                .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
@@ -1159,7 +1202,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .alias = "bcm53011",
                .vlans = 4096,
                .enabled_ports = 0x1f,
-               .cpu_port = B53_CPU_PORT_25, // TODO: auto detect
+               .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
                .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
@@ -1172,7 +1215,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .alias = "bcm53011",
                .vlans = 4096,
                .enabled_ports = 0x1f,
-               .cpu_port = B53_CPU_PORT_25, // TODO: auto detect
+               .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
                .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
@@ -1185,7 +1228,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .alias = "bcm53018",
                .vlans = 4096,
                .enabled_ports = 0x1f,
-               .cpu_port = B53_CPU_PORT_25, // TODO: auto detect
+               .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
                .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
@@ -1198,7 +1241,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .alias = "bcm53019",
                .vlans = 4096,
                .enabled_ports = 0x1f,
-               .cpu_port = B53_CPU_PORT_25, // TODO: auto detect
+               .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
                .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
@@ -1207,7 +1250,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
        },
 };
 
-int b53_switch_init(struct b53_device *dev)
+static int b53_switch_init(struct b53_device *dev)
 {
        struct switch_dev *sw_dev = &dev->sw_dev;
        unsigned i;
@@ -1292,7 +1335,8 @@ int b53_switch_init(struct b53_device *dev)
 
        dev->reset_gpio = b53_switch_get_reset_gpio(dev);
        if (dev->reset_gpio >= 0) {
-               ret = devm_gpio_request_one(dev->dev, dev->reset_gpio, GPIOF_OUT_INIT_HIGH, "robo_reset");
+               ret = devm_gpio_request_one(dev->dev, dev->reset_gpio,
+                                           GPIOF_OUT_INIT_HIGH, "robo_reset");
                if (ret)
                        return ret;
        }
@@ -1361,6 +1405,7 @@ int b53_switch_detect(struct b53_device *dev)
                switch (id32) {
                case BCM53115_DEVICE_ID:
                case BCM53125_DEVICE_ID:
+               case BCM53128_DEVICE_ID:
                case BCM53010_DEVICE_ID:
                case BCM53011_DEVICE_ID:
                case BCM53012_DEVICE_ID: