diff options
Diffstat (limited to 'drivers/net/dsa/lantiq_gswip.c')
| -rw-r--r-- | drivers/net/dsa/lantiq_gswip.c | 42 | 
1 files changed, 29 insertions, 13 deletions
| diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c index dbd4486a173f..7056d98d8177 100644 --- a/drivers/net/dsa/lantiq_gswip.c +++ b/drivers/net/dsa/lantiq_gswip.c @@ -276,6 +276,7 @@ struct gswip_priv {  	int num_gphy_fw;  	struct gswip_gphy_fw *gphy_fw;  	u32 port_vlan_filter; +	struct mutex pce_table_lock;  };  struct gswip_pce_table_entry { @@ -523,10 +524,14 @@ static int gswip_pce_table_entry_read(struct gswip_priv *priv,  	u16 addr_mode = tbl->key_mode ? GSWIP_PCE_TBL_CTRL_OPMOD_KSRD :  					GSWIP_PCE_TBL_CTRL_OPMOD_ADRD; +	mutex_lock(&priv->pce_table_lock); +  	err = gswip_switch_r_timeout(priv, GSWIP_PCE_TBL_CTRL,  				     GSWIP_PCE_TBL_CTRL_BAS); -	if (err) +	if (err) { +		mutex_unlock(&priv->pce_table_lock);  		return err; +	}  	gswip_switch_w(priv, tbl->index, GSWIP_PCE_TBL_ADDR);  	gswip_switch_mask(priv, GSWIP_PCE_TBL_CTRL_ADDR_MASK | @@ -536,8 +541,10 @@ static int gswip_pce_table_entry_read(struct gswip_priv *priv,  	err = gswip_switch_r_timeout(priv, GSWIP_PCE_TBL_CTRL,  				     GSWIP_PCE_TBL_CTRL_BAS); -	if (err) +	if (err) { +		mutex_unlock(&priv->pce_table_lock);  		return err; +	}  	for (i = 0; i < ARRAY_SIZE(tbl->key); i++)  		tbl->key[i] = gswip_switch_r(priv, GSWIP_PCE_TBL_KEY(i)); @@ -553,6 +560,8 @@ static int gswip_pce_table_entry_read(struct gswip_priv *priv,  	tbl->valid = !!(crtl & GSWIP_PCE_TBL_CTRL_VLD);  	tbl->gmap = (crtl & GSWIP_PCE_TBL_CTRL_GMAP_MASK) >> 7; +	mutex_unlock(&priv->pce_table_lock); +  	return 0;  } @@ -565,10 +574,14 @@ static int gswip_pce_table_entry_write(struct gswip_priv *priv,  	u16 addr_mode = tbl->key_mode ? GSWIP_PCE_TBL_CTRL_OPMOD_KSWR :  					GSWIP_PCE_TBL_CTRL_OPMOD_ADWR; +	mutex_lock(&priv->pce_table_lock); +  	err = gswip_switch_r_timeout(priv, GSWIP_PCE_TBL_CTRL,  				     GSWIP_PCE_TBL_CTRL_BAS); -	if (err) +	if (err) { +		mutex_unlock(&priv->pce_table_lock);  		return err; +	}  	gswip_switch_w(priv, tbl->index, GSWIP_PCE_TBL_ADDR);  	gswip_switch_mask(priv, GSWIP_PCE_TBL_CTRL_ADDR_MASK | @@ -600,8 +613,12 @@ static int gswip_pce_table_entry_write(struct gswip_priv *priv,  	crtl |= GSWIP_PCE_TBL_CTRL_BAS;  	gswip_switch_w(priv, crtl, GSWIP_PCE_TBL_CTRL); -	return gswip_switch_r_timeout(priv, GSWIP_PCE_TBL_CTRL, -				      GSWIP_PCE_TBL_CTRL_BAS); +	err = gswip_switch_r_timeout(priv, GSWIP_PCE_TBL_CTRL, +				     GSWIP_PCE_TBL_CTRL_BAS); + +	mutex_unlock(&priv->pce_table_lock); + +	return err;  }  /* Add the LAN port into a bridge with the CPU port by @@ -1447,10 +1464,8 @@ static void gswip_phylink_set_capab(unsigned long *supported,  	phylink_set(mask, 100baseT_Half);  	phylink_set(mask, 100baseT_Full); -	bitmap_and(supported, supported, mask, -		   __ETHTOOL_LINK_MODE_MASK_NBITS); -	bitmap_and(state->advertising, state->advertising, mask, -		   __ETHTOOL_LINK_MODE_MASK_NBITS); +	linkmode_and(supported, supported, mask); +	linkmode_and(state->advertising, state->advertising, mask);  }  static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port, @@ -1478,7 +1493,7 @@ static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port,  			goto unsupported;  		break;  	default: -		bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); +		linkmode_zero(supported);  		dev_err(ds->dev, "Unsupported port: %i\n", port);  		return;  	} @@ -1488,7 +1503,7 @@ static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port,  	return;  unsupported: -	bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); +	linkmode_zero(supported);  	dev_err(ds->dev, "Unsupported interface '%s' for port %d\n",  		phy_modes(state->interface), port);  } @@ -1518,7 +1533,7 @@ static void gswip_xrx300_phylink_validate(struct dsa_switch *ds, int port,  			goto unsupported;  		break;  	default: -		bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); +		linkmode_zero(supported);  		dev_err(ds->dev, "Unsupported port: %i\n", port);  		return;  	} @@ -1528,7 +1543,7 @@ static void gswip_xrx300_phylink_validate(struct dsa_switch *ds, int port,  	return;  unsupported: -	bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); +	linkmode_zero(supported);  	dev_err(ds->dev, "Unsupported interface '%s' for port %d\n",  		phy_modes(state->interface), port);  } @@ -2106,6 +2121,7 @@ static int gswip_probe(struct platform_device *pdev)  	priv->ds->priv = priv;  	priv->ds->ops = priv->hw_info->ops;  	priv->dev = dev; +	mutex_init(&priv->pce_table_lock);  	version = gswip_switch_r(priv, GSWIP_VERSION);  	np = dev->of_node; |