diff options
Diffstat (limited to 'drivers/net/dsa/qca8k.c')
| -rw-r--r-- | drivers/net/dsa/qca8k.c | 22 | 
1 files changed, 21 insertions, 1 deletions
| diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index 2727d3169c25..1cbb05b0323f 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -2334,6 +2334,7 @@ static int  qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu)  {  	struct qca8k_priv *priv = ds->priv; +	int ret;  	/* We have only have a general MTU setting.  	 * DSA always set the CPU port's MTU to the largest MTU of the slave @@ -2344,8 +2345,27 @@ qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu)  	if (!dsa_is_cpu_port(ds, port))  		return 0; +	/* To change the MAX_FRAME_SIZE the cpu ports must be off or +	 * the switch panics. +	 * Turn off both cpu ports before applying the new value to prevent +	 * this. +	 */ +	if (priv->port_enabled_map & BIT(0)) +		qca8k_port_set_status(priv, 0, 0); + +	if (priv->port_enabled_map & BIT(6)) +		qca8k_port_set_status(priv, 6, 0); +  	/* Include L2 header / FCS length */ -	return qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); +	ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); + +	if (priv->port_enabled_map & BIT(0)) +		qca8k_port_set_status(priv, 0, 1); + +	if (priv->port_enabled_map & BIT(6)) +		qca8k_port_set_status(priv, 6, 1); + +	return ret;  }  static int | 
