| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 | 
							- From 859df5cf6ff07a9c930be4681284346aa73dd1fb Mon Sep 17 00:00:00 2001
 
- From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <[email protected]>
 
- Date: Fri, 1 Mar 2024 12:43:01 +0200
 
- Subject: [PATCH 23/30] net: dsa: mt7530: get rid of
 
-  priv->info->cpu_port_config()
 
- MIME-Version: 1.0
 
- Content-Type: text/plain; charset=UTF-8
 
- Content-Transfer-Encoding: 8bit
 
- priv->info->cpu_port_config() is used for MT7531 and the switch on the
 
- MT7988 SoC. It sets up the ports described as a CPU port earlier than the
 
- phylink code path would do.
 
- This function is useless as:
 
- - Configuring the MACs can be done from the phylink_mac_config code path
 
-   instead.
 
- - All the link configuration it does on the CPU ports are later undone with
 
-   the port_enable, phylink_mac_config, and then phylink_mac_link_up code
 
-   path [1].
 
- priv->p5_interface and priv->p6_interface were being used to prevent
 
- configuring the MACs from the phylink_mac_config code path. Remove them now
 
- that they hold no purpose.
 
- Remove priv->info->cpu_port_config(). On mt753x_phylink_mac_config, switch
 
- to if statements to simplify the code.
 
- Remove the overwriting of the speed and duplex interfaces for certain
 
- interface modes. Phylink already provides the speed and duplex variables
 
- with proper values. Phylink already sets the max speed of TRGMII to
 
- SPEED_1000. Add SPEED_2500 for PHY_INTERFACE_MODE_2500BASEX to where the
 
- speed and EEE bits are set instead.
 
- On the switch on the MT7988 SoC, PHY_INTERFACE_MODE_INTERNAL is being used
 
- to describe the interface mode of the 10G MAC, which is of port 6. On
 
- mt7988_cpu_port_config() PMCR_FORCE_SPEED_1000 was set via the
 
- PMCR_CPU_PORT_SETTING() mask. Add SPEED_10000 case to where the speed bits
 
- are set to cover this. No need to add it to where the EEE bits are set as
 
- the "MT7988A Wi-Fi 7 Generation Router Platform: Datasheet (Open Version)
 
- v0.1" document shows that these bits don't exist on the MT7530_PMCR_P(6)
 
- register.
 
- Remove the definition of PMCR_CPU_PORT_SETTING() now that it holds no
 
- purpose.
 
- Change mt753x_cpu_port_enable() to void now that there're no error cases
 
- left.
 
- Link: https://lore.kernel.org/netdev/[email protected]/ [1]
 
- Suggested-by: Russell King (Oracle) <[email protected]>
 
- Signed-off-by: Arınç ÜNAL <[email protected]>
 
- Signed-off-by: Paolo Abeni <[email protected]>
 
- ---
 
-  drivers/net/dsa/mt7530.c | 114 +++------------------------------------
 
-  drivers/net/dsa/mt7530.h |  11 ----
 
-  2 files changed, 7 insertions(+), 118 deletions(-)
 
- --- a/drivers/net/dsa/mt7530.c
 
- +++ b/drivers/net/dsa/mt7530.c
 
- @@ -1163,18 +1163,10 @@ mt753x_trap_frames(struct mt7530_priv *p
 
-  			   MT753X_BPDU_CPU_ONLY);
 
-  }
 
-  
 
- -static int
 
- +static void
 
-  mt753x_cpu_port_enable(struct dsa_switch *ds, int port)
 
-  {
 
-  	struct mt7530_priv *priv = ds->priv;
 
- -	int ret;
 
- -
 
- -	/* Setup max capability of CPU port at first */
 
- -	if (priv->info->cpu_port_config) {
 
- -		ret = priv->info->cpu_port_config(ds, port);
 
- -		if (ret)
 
- -			return ret;
 
- -	}
 
-  
 
-  	/* Enable Mediatek header mode on the cpu port */
 
-  	mt7530_write(priv, MT7530_PVC_P(port),
 
- @@ -1200,8 +1192,6 @@ mt753x_cpu_port_enable(struct dsa_switch
 
-  	/* Set to fallback mode for independent VLAN learning */
 
-  	mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK,
 
-  		   MT7530_PORT_FALLBACK_MODE);
 
- -
 
- -	return 0;
 
-  }
 
-  
 
-  static int
 
- @@ -2458,8 +2448,6 @@ mt7530_setup(struct dsa_switch *ds)
 
-  	val |= MHWTRAP_MANUAL;
 
-  	mt7530_write(priv, MT7530_MHWTRAP, val);
 
-  
 
- -	priv->p6_interface = PHY_INTERFACE_MODE_NA;
 
- -
 
-  	mt753x_trap_frames(priv);
 
-  
 
-  	/* Enable and reset MIB counters */
 
- @@ -2474,9 +2462,7 @@ mt7530_setup(struct dsa_switch *ds)
 
-  		mt7530_set(priv, MT7530_PSC_P(i), SA_DIS);
 
-  
 
-  		if (dsa_is_cpu_port(ds, i)) {
 
- -			ret = mt753x_cpu_port_enable(ds, i);
 
- -			if (ret)
 
- -				return ret;
 
- +			mt753x_cpu_port_enable(ds, i);
 
-  		} else {
 
-  			mt7530_port_disable(ds, i);
 
-  
 
- @@ -2580,9 +2566,7 @@ mt7531_setup_common(struct dsa_switch *d
 
-  		mt7530_set(priv, MT7531_DBG_CNT(i), MT7531_DIS_CLR);
 
-  
 
-  		if (dsa_is_cpu_port(ds, i)) {
 
- -			ret = mt753x_cpu_port_enable(ds, i);
 
- -			if (ret)
 
- -				return ret;
 
- +			mt753x_cpu_port_enable(ds, i);
 
-  		} else {
 
-  			mt7530_port_disable(ds, i);
 
-  
 
- @@ -2671,10 +2655,6 @@ mt7531_setup(struct dsa_switch *ds)
 
-  	mt7530_rmw(priv, MT7531_GPIO_MODE0, MT7531_GPIO0_MASK,
 
-  		   MT7531_GPIO0_INTERRUPT);
 
-  
 
- -	/* Let phylink decide the interface later. */
 
- -	priv->p5_interface = PHY_INTERFACE_MODE_NA;
 
- -	priv->p6_interface = PHY_INTERFACE_MODE_NA;
 
- -
 
-  	/* Enable PHY core PLL, since phy_device has not yet been created
 
-  	 * provided for phy_[read,write]_mmd_indirect is called, we provide
 
-  	 * our own mt7531_ind_mmd_phy_[read,write] to complete this
 
- @@ -2886,26 +2866,9 @@ mt753x_phylink_mac_config(struct dsa_swi
 
-  	struct mt7530_priv *priv = ds->priv;
 
-  	u32 mcr_cur, mcr_new;
 
-  
 
- -	switch (port) {
 
- -	case 5:
 
- -		if (priv->p5_interface == state->interface)
 
- -			break;
 
- -
 
- +	if (port == 5 || port == 6)
 
-  		mt753x_mac_config(ds, port, mode, state);
 
-  
 
- -		if (priv->p5_intf_sel != P5_DISABLED)
 
- -			priv->p5_interface = state->interface;
 
- -		break;
 
- -	case 6:
 
- -		if (priv->p6_interface == state->interface)
 
- -			break;
 
- -
 
- -		mt753x_mac_config(ds, port, mode, state);
 
- -
 
- -		priv->p6_interface = state->interface;
 
- -		break;
 
- -	}
 
- -
 
-  	mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port));
 
-  	mcr_new = mcr_cur;
 
-  	mcr_new &= ~PMCR_LINK_SETTINGS_MASK;
 
- @@ -2941,17 +2904,10 @@ static void mt753x_phylink_mac_link_up(s
 
-  
 
-  	mcr = PMCR_RX_EN | PMCR_TX_EN | PMCR_FORCE_LNK;
 
-  
 
- -	/* MT753x MAC works in 1G full duplex mode for all up-clocked
 
- -	 * variants.
 
- -	 */
 
- -	if (interface == PHY_INTERFACE_MODE_TRGMII ||
 
- -	    (phy_interface_mode_is_8023z(interface))) {
 
- -		speed = SPEED_1000;
 
- -		duplex = DUPLEX_FULL;
 
- -	}
 
- -
 
-  	switch (speed) {
 
-  	case SPEED_1000:
 
- +	case SPEED_2500:
 
- +	case SPEED_10000:
 
-  		mcr |= PMCR_FORCE_SPEED_1000;
 
-  		break;
 
-  	case SPEED_100:
 
- @@ -2969,6 +2925,7 @@ static void mt753x_phylink_mac_link_up(s
 
-  	if (mode == MLO_AN_PHY && phydev && phy_init_eee(phydev, false) >= 0) {
 
-  		switch (speed) {
 
-  		case SPEED_1000:
 
- +		case SPEED_2500:
 
-  			mcr |= PMCR_FORCE_EEE1G;
 
-  			break;
 
-  		case SPEED_100:
 
- @@ -2980,61 +2937,6 @@ static void mt753x_phylink_mac_link_up(s
 
-  	mt7530_set(priv, MT7530_PMCR_P(port), mcr);
 
-  }
 
-  
 
- -static int
 
- -mt7531_cpu_port_config(struct dsa_switch *ds, int port)
 
- -{
 
- -	struct mt7530_priv *priv = ds->priv;
 
- -	phy_interface_t interface;
 
- -	int speed;
 
- -
 
- -	switch (port) {
 
- -	case 5:
 
- -		if (!priv->p5_sgmii)
 
- -			interface = PHY_INTERFACE_MODE_RGMII;
 
- -		else
 
- -			interface = PHY_INTERFACE_MODE_2500BASEX;
 
- -
 
- -		priv->p5_interface = interface;
 
- -		break;
 
- -	case 6:
 
- -		interface = PHY_INTERFACE_MODE_2500BASEX;
 
- -
 
- -		priv->p6_interface = interface;
 
- -		break;
 
- -	default:
 
- -		return -EINVAL;
 
- -	}
 
- -
 
- -	if (interface == PHY_INTERFACE_MODE_2500BASEX)
 
- -		speed = SPEED_2500;
 
- -	else
 
- -		speed = SPEED_1000;
 
- -
 
- -	mt7531_mac_config(ds, port, MLO_AN_FIXED, interface);
 
- -
 
- -	mt7530_write(priv, MT7530_PMCR_P(port),
 
- -		     PMCR_CPU_PORT_SETTING(priv->id));
 
- -	mt753x_phylink_mac_link_up(ds, port, MLO_AN_FIXED, interface, NULL,
 
- -				   speed, DUPLEX_FULL, true, true);
 
- -
 
- -	return 0;
 
- -}
 
- -
 
- -static int
 
- -mt7988_cpu_port_config(struct dsa_switch *ds, int port)
 
- -{
 
- -	struct mt7530_priv *priv = ds->priv;
 
- -
 
- -	mt7530_write(priv, MT7530_PMCR_P(port),
 
- -		     PMCR_CPU_PORT_SETTING(priv->id));
 
- -
 
- -	mt753x_phylink_mac_link_up(ds, port, MLO_AN_FIXED,
 
- -				   PHY_INTERFACE_MODE_INTERNAL, NULL,
 
- -				   SPEED_10000, DUPLEX_FULL, true, true);
 
- -
 
- -	return 0;
 
- -}
 
- -
 
-  static void mt753x_phylink_get_caps(struct dsa_switch *ds, int port,
 
-  				    struct phylink_config *config)
 
-  {
 
- @@ -3293,7 +3195,6 @@ const struct mt753x_info mt753x_table[]
 
-  		.phy_write_c22 = mt7531_ind_c22_phy_write,
 
-  		.phy_read_c45 = mt7531_ind_c45_phy_read,
 
-  		.phy_write_c45 = mt7531_ind_c45_phy_write,
 
- -		.cpu_port_config = mt7531_cpu_port_config,
 
-  		.mac_port_get_caps = mt7531_mac_port_get_caps,
 
-  		.mac_port_config = mt7531_mac_config,
 
-  	},
 
- @@ -3305,7 +3206,6 @@ const struct mt753x_info mt753x_table[]
 
-  		.phy_write_c22 = mt7531_ind_c22_phy_write,
 
-  		.phy_read_c45 = mt7531_ind_c45_phy_read,
 
-  		.phy_write_c45 = mt7531_ind_c45_phy_write,
 
- -		.cpu_port_config = mt7988_cpu_port_config,
 
-  		.mac_port_get_caps = mt7988_mac_port_get_caps,
 
-  	},
 
-  };
 
- --- a/drivers/net/dsa/mt7530.h
 
- +++ b/drivers/net/dsa/mt7530.h
 
- @@ -336,13 +336,6 @@ enum mt7530_vlan_port_acc_frm {
 
-  					 PMCR_TX_FC_EN | PMCR_RX_FC_EN | \
 
-  					 PMCR_FORCE_FDX | PMCR_FORCE_LNK | \
 
-  					 PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100)
 
- -#define  PMCR_CPU_PORT_SETTING(id)	(PMCR_FORCE_MODE_ID((id)) | \
 
- -					 PMCR_IFG_XMIT(1) | PMCR_MAC_MODE | \
 
- -					 PMCR_BACKOFF_EN | PMCR_BACKPR_EN | \
 
- -					 PMCR_TX_EN | PMCR_RX_EN | \
 
- -					 PMCR_TX_FC_EN | PMCR_RX_FC_EN | \
 
- -					 PMCR_FORCE_SPEED_1000 | \
 
- -					 PMCR_FORCE_FDX | PMCR_FORCE_LNK)
 
-  
 
-  #define MT7530_PMEEECR_P(x)		(0x3004 + (x) * 0x100)
 
-  #define  WAKEUP_TIME_1000(x)		(((x) & 0xFF) << 24)
 
- @@ -749,7 +742,6 @@ struct mt753x_info {
 
-  			    int regnum);
 
-  	int (*phy_write_c45)(struct mt7530_priv *priv, int port, int devad,
 
-  			     int regnum, u16 val);
 
- -	int (*cpu_port_config)(struct dsa_switch *ds, int port);
 
-  	void (*mac_port_get_caps)(struct dsa_switch *ds, int port,
 
-  				  struct phylink_config *config);
 
-  	void (*mac_port_validate)(struct dsa_switch *ds, int port,
 
- @@ -775,7 +767,6 @@ struct mt753x_info {
 
-   * @ports:		Holding the state among ports
 
-   * @reg_mutex:		The lock for protecting among process accessing
 
-   *			registers
 
- - * @p6_interface	Holding the current port 6 interface
 
-   * @p5_intf_sel:	Holding the current port 5 interface select
 
-   * @p5_sgmii:		Flag for distinguishing if port 5 of the MT7531 switch
 
-   *			has got SGMII
 
- @@ -797,8 +788,6 @@ struct mt7530_priv {
 
-  	const struct mt753x_info *info;
 
-  	unsigned int		id;
 
-  	bool			mcm;
 
- -	phy_interface_t		p6_interface;
 
- -	phy_interface_t		p5_interface;
 
-  	enum p5_interface_select p5_intf_sel;
 
-  	bool			p5_sgmii;
 
-  	u8			mirror_rx;
 
 
  |