|
@@ -326,6 +326,7 @@ static void b53_get_vlan_entry(struct b53_device *dev, u16 vid,
|
|
|
|
|
|
static void b53_set_forwarding(struct b53_device *dev, int enable)
|
|
|
{
|
|
|
+ struct dsa_switch *ds = dev->ds;
|
|
|
u8 mgmt;
|
|
|
|
|
|
b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
|
|
@@ -336,6 +337,15 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
|
|
|
mgmt &= ~SM_SW_FWD_EN;
|
|
|
|
|
|
b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt);
|
|
|
+
|
|
|
+ /* Include IMP port in dumb forwarding mode when no tagging protocol is
|
|
|
+ * set
|
|
|
+ */
|
|
|
+ if (ds->ops->get_tag_protocol(ds) == DSA_TAG_PROTO_NONE) {
|
|
|
+ b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, &mgmt);
|
|
|
+ mgmt |= B53_MII_DUMB_FWDG_EN;
|
|
|
+ b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void b53_enable_vlan(struct b53_device *dev, bool enable)
|
|
@@ -598,7 +608,8 @@ static void b53_switch_reset_gpio(struct b53_device *dev)
|
|
|
|
|
|
static int b53_switch_reset(struct b53_device *dev)
|
|
|
{
|
|
|
- u8 mgmt;
|
|
|
+ unsigned int timeout = 1000;
|
|
|
+ u8 mgmt, reg;
|
|
|
|
|
|
b53_switch_reset_gpio(dev);
|
|
|
|
|
@@ -607,6 +618,28 @@ static int b53_switch_reset(struct b53_device *dev)
|
|
|
b53_write8(dev, B53_CTRL_PAGE, B53_SOFTRESET, 0x00);
|
|
|
}
|
|
|
|
|
|
+ /* This is specific to 58xx devices here, do not use is58xx() which
|
|
|
+ * covers the larger Starfigther 2 family, including 7445/7278 which
|
|
|
+ * still use this driver as a library and need to perform the reset
|
|
|
+ * earlier.
|
|
|
+ */
|
|
|
+ if (dev->chip_id == BCM58XX_DEVICE_ID) {
|
|
|
+ b53_read8(dev, B53_CTRL_PAGE, B53_SOFTRESET, ®);
|
|
|
+ reg |= SW_RST | EN_SW_RST | EN_CH_RST;
|
|
|
+ b53_write8(dev, B53_CTRL_PAGE, B53_SOFTRESET, reg);
|
|
|
+
|
|
|
+ do {
|
|
|
+ b53_read8(dev, B53_CTRL_PAGE, B53_SOFTRESET, ®);
|
|
|
+ if (!(reg & SW_RST))
|
|
|
+ break;
|
|
|
+
|
|
|
+ usleep_range(1000, 2000);
|
|
|
+ } while (timeout-- > 0);
|
|
|
+
|
|
|
+ if (timeout == 0)
|
|
|
+ return -ETIMEDOUT;
|
|
|
+ }
|
|
|
+
|
|
|
b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
|
|
|
|
|
|
if (!(mgmt & SM_SW_FWD_EN)) {
|
|
@@ -1731,7 +1764,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
|
|
|
.vlans = 4096,
|
|
|
.enabled_ports = 0x1ff,
|
|
|
.arl_entries = 4,
|
|
|
- .cpu_port = B53_CPU_PORT_25,
|
|
|
+ .cpu_port = B53_CPU_PORT,
|
|
|
.vta_regs = B53_VTA_REGS,
|
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|