2727#include <linux/of_irq.h>
2828#include <linux/of_mdio.h>
2929#include <linux/of_net.h>
30+ #include <linux/phy/phy.h>
3031#include <linux/phy.h>
3132#include <linux/phylink.h>
3233#include <linux/platform_device.h>
@@ -436,6 +437,7 @@ struct mvneta_port {
436437 struct device_node * dn ;
437438 unsigned int tx_csum_limit ;
438439 struct phylink * phylink ;
440+ struct phy * comphy ;
439441
440442 struct mvneta_bm * bm_priv ;
441443 struct mvneta_bm_pool * pool_long ;
@@ -3151,6 +3153,8 @@ static void mvneta_start_dev(struct mvneta_port *pp)
31513153{
31523154 int cpu ;
31533155
3156+ WARN_ON (phy_power_on (pp -> comphy ));
3157+
31543158 mvneta_max_rx_size_set (pp , pp -> pkt_size );
31553159 mvneta_txq_max_tx_size_set (pp , pp -> pkt_size );
31563160
@@ -3213,6 +3217,8 @@ static void mvneta_stop_dev(struct mvneta_port *pp)
32133217
32143218 mvneta_tx_reset (pp );
32153219 mvneta_rx_reset (pp );
3220+
3221+ WARN_ON (phy_power_off (pp -> comphy ));
32163222}
32173223
32183224static void mvneta_percpu_enable (void * arg )
@@ -3338,6 +3344,7 @@ static int mvneta_set_mac_addr(struct net_device *dev, void *addr)
33383344static void mvneta_validate (struct net_device * ndev , unsigned long * supported ,
33393345 struct phylink_link_state * state )
33403346{
3347+ struct mvneta_port * pp = netdev_priv (ndev );
33413348 __ETHTOOL_DECLARE_LINK_MODE_MASK (mask ) = { 0 , };
33423349
33433350 /* We only support QSGMII, SGMII, 802.3z and RGMII modes */
@@ -3358,8 +3365,13 @@ static void mvneta_validate(struct net_device *ndev, unsigned long *supported,
33583365 phylink_set (mask , Pause );
33593366
33603367 /* Half-duplex at speeds higher than 100Mbit is unsupported */
3361- phylink_set (mask , 1000b aseT_Full );
3362- phylink_set (mask , 1000b aseX_Full );
3368+ if (pp -> comphy || state -> interface != PHY_INTERFACE_MODE_2500BASEX ) {
3369+ phylink_set (mask , 1000b aseT_Full );
3370+ phylink_set (mask , 1000b aseX_Full );
3371+ }
3372+ if (pp -> comphy || state -> interface == PHY_INTERFACE_MODE_2500BASEX ) {
3373+ phylink_set (mask , 2500b aseX_Full );
3374+ }
33633375
33643376 if (!phy_interface_mode_is_8023z (state -> interface )) {
33653377 /* 10M and 100M are only supported in non-802.3z mode */
@@ -3373,6 +3385,11 @@ static void mvneta_validate(struct net_device *ndev, unsigned long *supported,
33733385 __ETHTOOL_LINK_MODE_MASK_NBITS );
33743386 bitmap_and (state -> advertising , state -> advertising , mask ,
33753387 __ETHTOOL_LINK_MODE_MASK_NBITS );
3388+
3389+ /* We can only operate at 2500BaseX or 1000BaseX. If requested
3390+ * to advertise both, only report advertising at 2500BaseX.
3391+ */
3392+ phylink_helper_basex_speed (state );
33763393}
33773394
33783395static int mvneta_mac_link_state (struct net_device * ndev ,
@@ -3384,7 +3401,9 @@ static int mvneta_mac_link_state(struct net_device *ndev,
33843401 gmac_stat = mvreg_read (pp , MVNETA_GMAC_STATUS );
33853402
33863403 if (gmac_stat & MVNETA_GMAC_SPEED_1000 )
3387- state -> speed = SPEED_1000 ;
3404+ state -> speed =
3405+ state -> interface == PHY_INTERFACE_MODE_2500BASEX ?
3406+ SPEED_2500 : SPEED_1000 ;
33883407 else if (gmac_stat & MVNETA_GMAC_SPEED_100 )
33893408 state -> speed = SPEED_100 ;
33903409 else
@@ -3499,12 +3518,20 @@ static void mvneta_mac_config(struct net_device *ndev, unsigned int mode,
34993518 MVNETA_GMAC_FORCE_LINK_DOWN );
35003519 }
35013520
3521+
35023522 /* When at 2.5G, the link partner can send frames with shortened
35033523 * preambles.
35043524 */
35053525 if (state -> speed == SPEED_2500 )
35063526 new_ctrl4 |= MVNETA_GMAC4_SHORT_PREAMBLE_ENABLE ;
35073527
3528+ if (pp -> comphy &&
3529+ (state -> interface == PHY_INTERFACE_MODE_SGMII ||
3530+ state -> interface == PHY_INTERFACE_MODE_1000BASEX ||
3531+ state -> interface == PHY_INTERFACE_MODE_2500BASEX ))
3532+ WARN_ON (phy_set_mode_ext (pp -> comphy , PHY_MODE_ETHERNET ,
3533+ state -> interface ));
3534+
35083535 if (new_ctrl0 != gmac_ctrl0 )
35093536 mvreg_write (pp , MVNETA_GMAC_CTRL_0 , new_ctrl0 );
35103537 if (new_ctrl2 != gmac_ctrl2 )
@@ -4404,7 +4431,7 @@ static int mvneta_port_power_up(struct mvneta_port *pp, int phy_mode)
44044431 if (phy_mode == PHY_INTERFACE_MODE_QSGMII )
44054432 mvreg_write (pp , MVNETA_SERDES_CFG , MVNETA_QSGMII_SERDES_PROTO );
44064433 else if (phy_mode == PHY_INTERFACE_MODE_SGMII ||
4407- phy_mode == PHY_INTERFACE_MODE_1000BASEX )
4434+ phy_interface_mode_is_8023z ( phy_mode ) )
44084435 mvreg_write (pp , MVNETA_SERDES_CFG , MVNETA_SGMII_SERDES_PROTO );
44094436 else if (!phy_interface_mode_is_rgmii (phy_mode ))
44104437 return - EINVAL ;
@@ -4421,6 +4448,7 @@ static int mvneta_probe(struct platform_device *pdev)
44214448 struct mvneta_port * pp ;
44224449 struct net_device * dev ;
44234450 struct phylink * phylink ;
4451+ struct phy * comphy ;
44244452 const char * dt_mac_addr ;
44254453 char hw_mac_addr [ETH_ALEN ];
44264454 const char * mac_from ;
@@ -4446,6 +4474,14 @@ static int mvneta_probe(struct platform_device *pdev)
44464474 goto err_free_irq ;
44474475 }
44484476
4477+ comphy = devm_of_phy_get (& pdev -> dev , dn , NULL );
4478+ if (comphy == ERR_PTR (- EPROBE_DEFER )) {
4479+ err = - EPROBE_DEFER ;
4480+ goto err_free_irq ;
4481+ } else if (IS_ERR (comphy )) {
4482+ comphy = NULL ;
4483+ }
4484+
44494485 phylink = phylink_create (dev , pdev -> dev .fwnode , phy_mode ,
44504486 & mvneta_phylink_ops );
44514487 if (IS_ERR (phylink )) {
@@ -4462,6 +4498,7 @@ static int mvneta_probe(struct platform_device *pdev)
44624498 pp = netdev_priv (dev );
44634499 spin_lock_init (& pp -> lock );
44644500 pp -> phylink = phylink ;
4501+ pp -> comphy = comphy ;
44654502 pp -> phy_interface = phy_mode ;
44664503 pp -> dn = dn ;
44674504
0 commit comments