248
248
#define VSC73XX_MII_MPRES_PRESCALEVAL GENMASK(5, 0)
249
249
#define VSC73XX_MII_PRESCALEVAL_MIN 3 /* min allowed mdio clock prescaler */
250
250
251
+ #define VSC73XX_MII_STAT_BUSY BIT(3)
252
+
251
253
/* Arbiter block 5 registers */
252
254
#define VSC73XX_ARBEMPTY 0x0c
253
255
#define VSC73XX_ARBDISC 0x0e
322
324
#define IS_739X (a ) (IS_7395(a) || IS_7398(a))
323
325
324
326
#define VSC73XX_POLL_SLEEP_US 1000
327
+ #define VSC73XX_MDIO_POLL_SLEEP_US 5
325
328
#define VSC73XX_POLL_TIMEOUT_US 10000
326
329
327
330
struct vsc73xx_counter {
@@ -550,13 +553,33 @@ static int vsc73xx_detect(struct vsc73xx *vsc)
550
553
return 0 ;
551
554
}
552
555
556
+ static int vsc73xx_mdio_busy_check (struct vsc73xx * vsc )
557
+ {
558
+ int ret , err ;
559
+ u32 val ;
560
+
561
+ ret = read_poll_timeout (vsc73xx_read , err ,
562
+ err < 0 || !(val & VSC73XX_MII_STAT_BUSY ),
563
+ VSC73XX_MDIO_POLL_SLEEP_US ,
564
+ VSC73XX_POLL_TIMEOUT_US , false, vsc ,
565
+ VSC73XX_BLOCK_MII , VSC73XX_BLOCK_MII_INTERNAL ,
566
+ VSC73XX_MII_STAT , & val );
567
+ if (ret )
568
+ return ret ;
569
+ return err ;
570
+ }
571
+
553
572
static int vsc73xx_phy_read (struct dsa_switch * ds , int phy , int regnum )
554
573
{
555
574
struct vsc73xx * vsc = ds -> priv ;
556
575
u32 cmd ;
557
576
u32 val ;
558
577
int ret ;
559
578
579
+ ret = vsc73xx_mdio_busy_check (vsc );
580
+ if (ret )
581
+ return ret ;
582
+
560
583
/* Setting bit 26 means "read" */
561
584
cmd = VSC73XX_MII_CMD_OPERATION |
562
585
FIELD_PREP (VSC73XX_MII_CMD_PHY_ADDR , phy ) |
@@ -565,7 +588,11 @@ static int vsc73xx_phy_read(struct dsa_switch *ds, int phy, int regnum)
565
588
VSC73XX_MII_CMD , cmd );
566
589
if (ret )
567
590
return ret ;
568
- msleep (2 );
591
+
592
+ ret = vsc73xx_mdio_busy_check (vsc );
593
+ if (ret )
594
+ return ret ;
595
+
569
596
ret = vsc73xx_read (vsc , VSC73XX_BLOCK_MII , VSC73XX_BLOCK_MII_INTERNAL ,
570
597
VSC73XX_MII_DATA , & val );
571
598
if (ret )
@@ -590,19 +617,12 @@ static int vsc73xx_phy_write(struct dsa_switch *ds, int phy, int regnum,
590
617
u32 cmd ;
591
618
int ret ;
592
619
593
- /* It was found through tedious experiments that this router
594
- * chip really hates to have it's PHYs reset. They
595
- * never recover if that happens: autonegotiation stops
596
- * working after a reset. Just filter out this command.
597
- * (Resetting the whole chip is OK.)
598
- */
599
- if (regnum == 0 && (val & BIT (15 ))) {
600
- dev_info (vsc -> dev , "reset PHY - disallowed\n" );
601
- return 0 ;
602
- }
620
+ ret = vsc73xx_mdio_busy_check (vsc );
621
+ if (ret )
622
+ return ret ;
603
623
604
624
cmd = FIELD_PREP (VSC73XX_MII_CMD_PHY_ADDR , phy ) |
605
- FIELD_PREP (VSC73XX_MII_CMD_PHY_REG , regnum );
625
+ FIELD_PREP (VSC73XX_MII_CMD_PHY_REG , regnum ) | val ;
606
626
ret = vsc73xx_write (vsc , VSC73XX_BLOCK_MII , VSC73XX_BLOCK_MII_INTERNAL ,
607
627
VSC73XX_MII_CMD , cmd );
608
628
if (ret )
@@ -1057,6 +1077,11 @@ static void vsc73xx_mac_link_up(struct phylink_config *config,
1057
1077
1058
1078
if (duplex == DUPLEX_FULL )
1059
1079
val |= VSC73XX_MAC_CFG_FDX ;
1080
+ else
1081
+ /* In datasheet description ("Port Mode Procedure" in 5.6.2)
1082
+ * this bit is configured only for half duplex.
1083
+ */
1084
+ val |= VSC73XX_MAC_CFG_WEXC_DIS ;
1060
1085
1061
1086
/* This routine is described in the datasheet (below ARBDISC register
1062
1087
* description)
@@ -1067,7 +1092,6 @@ static void vsc73xx_mac_link_up(struct phylink_config *config,
1067
1092
get_random_bytes (& seed , 1 );
1068
1093
val |= seed << VSC73XX_MAC_CFG_SEED_OFFSET ;
1069
1094
val |= VSC73XX_MAC_CFG_SEED_LOAD ;
1070
- val |= VSC73XX_MAC_CFG_WEXC_DIS ;
1071
1095
1072
1096
/* Those bits are responsible for MTU only. Kernel takes care about MTU,
1073
1097
* let's enable +8 bytes frame length unconditionally.
0 commit comments