diff options
Diffstat (limited to 'drivers/net/dsa/b53/b53_common.c')
| -rw-r--r-- | drivers/net/dsa/b53/b53_common.c | 78 | 
1 files changed, 78 insertions, 0 deletions
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 59cdfc51ce06..3464ce5e7470 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1209,6 +1209,50 @@ static void b53_force_port_config(struct b53_device *dev, int port,  	b53_write8(dev, B53_CTRL_PAGE, off, reg);  } +static void b53_adjust_63xx_rgmii(struct dsa_switch *ds, int port, +				  phy_interface_t interface) +{ +	struct b53_device *dev = ds->priv; +	u8 rgmii_ctrl = 0, off; + +	if (port == dev->imp_port) +		off = B53_RGMII_CTRL_IMP; +	else +		off = B53_RGMII_CTRL_P(port); + +	b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl); + +	switch (interface) { +	case PHY_INTERFACE_MODE_RGMII_ID: +		rgmii_ctrl |= (RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); +		break; +	case PHY_INTERFACE_MODE_RGMII_RXID: +		rgmii_ctrl &= ~(RGMII_CTRL_DLL_TXC); +		rgmii_ctrl |= RGMII_CTRL_DLL_RXC; +		break; +	case PHY_INTERFACE_MODE_RGMII_TXID: +		rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC); +		rgmii_ctrl |= RGMII_CTRL_DLL_TXC; +		break; +	case PHY_INTERFACE_MODE_RGMII: +	default: +		rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); +		break; +	} + +	if (port != dev->imp_port) { +		if (is63268(dev)) +			rgmii_ctrl |= RGMII_CTRL_MII_OVERRIDE; + +		rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII; +	} + +	b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl); + +	dev_dbg(ds->dev, "Configured port %d for %s\n", port, +		phy_modes(interface)); +} +  static void b53_adjust_link(struct dsa_switch *ds, int port,  			    struct phy_device *phydev)  { @@ -1235,6 +1279,9 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,  			      tx_pause, rx_pause);  	b53_force_link(dev, port, phydev->link); +	if (is63xx(dev) && port >= B53_63XX_RGMII0) +		b53_adjust_63xx_rgmii(ds, port, phydev->interface); +  	if (is531x5(dev) && phy_interface_is_rgmii(phydev)) {  		if (port == dev->imp_port)  			off = B53_RGMII_CTRL_IMP; @@ -1402,6 +1449,9 @@ void b53_phylink_mac_link_up(struct dsa_switch *ds, int port,  {  	struct b53_device *dev = ds->priv; +	if (is63xx(dev) && port >= B53_63XX_RGMII0) +		b53_adjust_63xx_rgmii(ds, port, interface); +  	if (mode == MLO_AN_PHY)  		return; @@ -2420,6 +2470,19 @@ static const struct b53_chip_data b53_switch_chips[] = {  		.jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX,  	},  	{ +		.chip_id = BCM63268_DEVICE_ID, +		.dev_name = "BCM63268", +		.vlans = 4096, +		.enabled_ports = 0, /* pdata must provide them */ +		.arl_bins = 4, +		.arl_buckets = 1024, +		.imp_port = 8, +		.vta_regs = B53_VTA_REGS_63XX, +		.duplex_reg = B53_DUPLEX_STAT_63XX, +		.jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX, +		.jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX, +	}, +	{  		.chip_id = BCM53010_DEVICE_ID,  		.dev_name = "BCM53010",  		.vlans = 4096, @@ -2550,6 +2613,20 @@ static const struct b53_chip_data b53_switch_chips[] = {  		.jumbo_pm_reg = B53_JUMBO_PORT_MASK,  		.jumbo_size_reg = B53_JUMBO_MAX_SIZE,  	}, +	{ +		.chip_id = BCM53134_DEVICE_ID, +		.dev_name = "BCM53134", +		.vlans = 4096, +		.enabled_ports = 0x12f, +		.imp_port = 8, +		.cpu_port = B53_CPU_PORT, +		.vta_regs = B53_VTA_REGS, +		.arl_bins = 4, +		.arl_buckets = 1024, +		.duplex_reg = B53_DUPLEX_STAT_GE, +		.jumbo_pm_reg = B53_JUMBO_PORT_MASK, +		.jumbo_size_reg = B53_JUMBO_MAX_SIZE, +	},  };  static int b53_switch_init(struct b53_device *dev) @@ -2727,6 +2804,7 @@ int b53_switch_detect(struct b53_device *dev)  		case BCM53012_DEVICE_ID:  		case BCM53018_DEVICE_ID:  		case BCM53019_DEVICE_ID: +		case BCM53134_DEVICE_ID:  			dev->chip_id = id32;  			break;  		default:  |