@@ -372,22 +372,6 @@ static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
372
372
return mv88e6xxx_write (chip , addr , reg , val );
373
373
}
374
374
375
- static int mv88e6xxx_mdio_read_direct (struct mv88e6xxx_chip * chip ,
376
- int addr , int regnum )
377
- {
378
- if (addr >= 0 )
379
- return _mv88e6xxx_reg_read (chip , addr , regnum );
380
- return 0xffff ;
381
- }
382
-
383
- static int mv88e6xxx_mdio_write_direct (struct mv88e6xxx_chip * chip ,
384
- int addr , int regnum , u16 val )
385
- {
386
- if (addr >= 0 )
387
- return _mv88e6xxx_reg_write (chip , addr , regnum , val );
388
- return 0 ;
389
- }
390
-
391
375
static int mv88e6xxx_ppu_disable (struct mv88e6xxx_chip * chip )
392
376
{
393
377
int ret ;
@@ -942,87 +926,63 @@ static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
942
926
GLOBAL_ATU_OP_BUSY );
943
927
}
944
928
945
- static int mv88e6xxx_g2_smi_phy_read (struct mv88e6xxx_chip * chip , int addr ,
946
- int reg , u16 * val );
947
- static int mv88e6xxx_g2_smi_phy_write (struct mv88e6xxx_chip * chip , int addr ,
948
- int reg , u16 val );
949
-
950
- static int mv88e6xxx_mdio_read_indirect (struct mv88e6xxx_chip * chip ,
951
- int addr , int regnum )
952
- {
953
- u16 val ;
954
- int err ;
955
-
956
- err = mv88e6xxx_g2_smi_phy_read (chip , addr , regnum , & val );
957
- if (err )
958
- return err ;
959
-
960
- return val ;
961
- }
962
-
963
- static int mv88e6xxx_mdio_write_indirect (struct mv88e6xxx_chip * chip ,
964
- int addr , int regnum , u16 val )
965
- {
966
- return mv88e6xxx_g2_smi_phy_write (chip , addr , regnum , val );
967
- }
968
-
969
929
static int mv88e6xxx_get_eee (struct dsa_switch * ds , int port ,
970
930
struct ethtool_eee * e )
971
931
{
972
932
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
973
- int reg ;
933
+ u16 reg ;
934
+ int err ;
974
935
975
936
if (!mv88e6xxx_has (chip , MV88E6XXX_FLAG_EEE ))
976
937
return - EOPNOTSUPP ;
977
938
978
939
mutex_lock (& chip -> reg_lock );
979
940
980
- reg = mv88e6xxx_mdio_read_indirect (chip , port , 16 );
981
- if (reg < 0 )
941
+ err = mv88e6xxx_phy_read (chip , port , 16 , & reg );
942
+ if (err )
982
943
goto out ;
983
944
984
945
e -> eee_enabled = !!(reg & 0x0200 );
985
946
e -> tx_lpi_enabled = !!(reg & 0x0100 );
986
947
987
- reg = _mv88e6xxx_reg_read (chip , REG_PORT (port ), PORT_STATUS );
988
- if (reg < 0 )
948
+ err = mv88e6xxx_read (chip , REG_PORT (port ), PORT_STATUS , & reg );
949
+ if (err )
989
950
goto out ;
990
951
991
952
e -> eee_active = !!(reg & PORT_STATUS_EEE );
992
- reg = 0 ;
993
-
994
953
out :
995
954
mutex_unlock (& chip -> reg_lock );
996
- return reg ;
955
+
956
+ return err ;
997
957
}
998
958
999
959
static int mv88e6xxx_set_eee (struct dsa_switch * ds , int port ,
1000
960
struct phy_device * phydev , struct ethtool_eee * e )
1001
961
{
1002
962
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
1003
- int reg ;
1004
- int ret ;
963
+ u16 reg ;
964
+ int err ;
1005
965
1006
966
if (!mv88e6xxx_has (chip , MV88E6XXX_FLAG_EEE ))
1007
967
return - EOPNOTSUPP ;
1008
968
1009
969
mutex_lock (& chip -> reg_lock );
1010
970
1011
- ret = mv88e6xxx_mdio_read_indirect (chip , port , 16 );
1012
- if (ret < 0 )
971
+ err = mv88e6xxx_phy_read (chip , port , 16 , & reg );
972
+ if (err )
1013
973
goto out ;
1014
974
1015
- reg = ret & ~0x0300 ;
975
+ reg &= ~0x0300 ;
1016
976
if (e -> eee_enabled )
1017
977
reg |= 0x0200 ;
1018
978
if (e -> tx_lpi_enabled )
1019
979
reg |= 0x0100 ;
1020
980
1021
- ret = mv88e6xxx_mdio_write_indirect (chip , port , 16 , reg );
981
+ err = mv88e6xxx_phy_write (chip , port , 16 , reg );
1022
982
out :
1023
983
mutex_unlock (& chip -> reg_lock );
1024
984
1025
- return ret ;
985
+ return err ;
1026
986
}
1027
987
1028
988
static int _mv88e6xxx_atu_cmd (struct mv88e6xxx_chip * chip , u16 fid , u16 cmd )
@@ -2382,38 +2342,6 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2382
2342
mutex_unlock (& chip -> reg_lock );
2383
2343
}
2384
2344
2385
- static int _mv88e6xxx_mdio_page_write (struct mv88e6xxx_chip * chip ,
2386
- int port , int page , int reg , int val )
2387
- {
2388
- int ret ;
2389
-
2390
- ret = mv88e6xxx_mdio_write_indirect (chip , port , 0x16 , page );
2391
- if (ret < 0 )
2392
- goto restore_page_0 ;
2393
-
2394
- ret = mv88e6xxx_mdio_write_indirect (chip , port , reg , val );
2395
- restore_page_0 :
2396
- mv88e6xxx_mdio_write_indirect (chip , port , 0x16 , 0x0 );
2397
-
2398
- return ret ;
2399
- }
2400
-
2401
- static int _mv88e6xxx_mdio_page_read (struct mv88e6xxx_chip * chip ,
2402
- int port , int page , int reg )
2403
- {
2404
- int ret ;
2405
-
2406
- ret = mv88e6xxx_mdio_write_indirect (chip , port , 0x16 , page );
2407
- if (ret < 0 )
2408
- goto restore_page_0 ;
2409
-
2410
- ret = mv88e6xxx_mdio_read_indirect (chip , port , reg );
2411
- restore_page_0 :
2412
- mv88e6xxx_mdio_write_indirect (chip , port , 0x16 , 0x0 );
2413
-
2414
- return ret ;
2415
- }
2416
-
2417
2345
static int mv88e6xxx_switch_reset (struct mv88e6xxx_chip * chip )
2418
2346
{
2419
2347
bool ppu_active = mv88e6xxx_has (chip , MV88E6XXX_FLAG_PPU_ACTIVE );
@@ -3322,32 +3250,6 @@ static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
3322
3250
return err ;
3323
3251
}
3324
3252
3325
- static int mv88e6xxx_mdio_page_read (struct dsa_switch * ds , int port , int page ,
3326
- int reg )
3327
- {
3328
- struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3329
- int ret ;
3330
-
3331
- mutex_lock (& chip -> reg_lock );
3332
- ret = _mv88e6xxx_mdio_page_read (chip , port , page , reg );
3333
- mutex_unlock (& chip -> reg_lock );
3334
-
3335
- return ret ;
3336
- }
3337
-
3338
- static int mv88e6xxx_mdio_page_write (struct dsa_switch * ds , int port , int page ,
3339
- int reg , int val )
3340
- {
3341
- struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3342
- int ret ;
3343
-
3344
- mutex_lock (& chip -> reg_lock );
3345
- ret = _mv88e6xxx_mdio_page_write (chip , port , page , reg , val );
3346
- mutex_unlock (& chip -> reg_lock );
3347
-
3348
- return ret ;
3349
- }
3350
-
3351
3253
static int mv88e6xxx_mdio_read (struct mii_bus * bus , int phy , int reg )
3352
3254
{
3353
3255
struct mv88e6xxx_chip * chip = bus -> priv ;
@@ -3441,44 +3343,42 @@ static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3441
3343
static int mv88e61xx_get_temp (struct dsa_switch * ds , int * temp )
3442
3344
{
3443
3345
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3346
+ u16 val ;
3444
3347
int ret ;
3445
- int val ;
3446
3348
3447
3349
* temp = 0 ;
3448
3350
3449
3351
mutex_lock (& chip -> reg_lock );
3450
3352
3451
- ret = mv88e6xxx_mdio_write_direct (chip , 0x0 , 0x16 , 0x6 );
3353
+ ret = mv88e6xxx_phy_write (chip , 0x0 , 0x16 , 0x6 );
3452
3354
if (ret < 0 )
3453
3355
goto error ;
3454
3356
3455
3357
/* Enable temperature sensor */
3456
- ret = mv88e6xxx_mdio_read_direct (chip , 0x0 , 0x1a );
3358
+ ret = mv88e6xxx_phy_read (chip , 0x0 , 0x1a , & val );
3457
3359
if (ret < 0 )
3458
3360
goto error ;
3459
3361
3460
- ret = mv88e6xxx_mdio_write_direct (chip , 0x0 , 0x1a , ret | (1 << 5 ));
3362
+ ret = mv88e6xxx_phy_write (chip , 0x0 , 0x1a , val | (1 << 5 ));
3461
3363
if (ret < 0 )
3462
3364
goto error ;
3463
3365
3464
3366
/* Wait for temperature to stabilize */
3465
3367
usleep_range (10000 , 12000 );
3466
3368
3467
- val = mv88e6xxx_mdio_read_direct (chip , 0x0 , 0x1a );
3468
- if (val < 0 ) {
3469
- ret = val ;
3369
+ ret = mv88e6xxx_phy_read (chip , 0x0 , 0x1a , & val );
3370
+ if (ret < 0 )
3470
3371
goto error ;
3471
- }
3472
3372
3473
3373
/* Disable temperature sensor */
3474
- ret = mv88e6xxx_mdio_write_direct (chip , 0x0 , 0x1a , ret & ~(1 << 5 ));
3374
+ ret = mv88e6xxx_phy_write (chip , 0x0 , 0x1a , val & ~(1 << 5 ));
3475
3375
if (ret < 0 )
3476
3376
goto error ;
3477
3377
3478
3378
* temp = ((val & 0x1f ) - 5 ) * 5 ;
3479
3379
3480
3380
error :
3481
- mv88e6xxx_mdio_write_direct (chip , 0x0 , 0x16 , 0x0 );
3381
+ mv88e6xxx_phy_write (chip , 0x0 , 0x16 , 0x0 );
3482
3382
mutex_unlock (& chip -> reg_lock );
3483
3383
return ret ;
3484
3384
}
@@ -3487,15 +3387,18 @@ static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
3487
3387
{
3488
3388
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3489
3389
int phy = mv88e6xxx_6320_family (chip ) ? 3 : 0 ;
3390
+ u16 val ;
3490
3391
int ret ;
3491
3392
3492
3393
* temp = 0 ;
3493
3394
3494
- ret = mv88e6xxx_mdio_page_read (ds , phy , 6 , 27 );
3395
+ mutex_lock (& chip -> reg_lock );
3396
+ ret = mv88e6xxx_phy_page_read (chip , phy , 6 , 27 , & val );
3397
+ mutex_unlock (& chip -> reg_lock );
3495
3398
if (ret < 0 )
3496
3399
return ret ;
3497
3400
3498
- * temp = (ret & 0xff ) - 25 ;
3401
+ * temp = (val & 0xff ) - 25 ;
3499
3402
3500
3403
return 0 ;
3501
3404
}
@@ -3517,18 +3420,21 @@ static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3517
3420
{
3518
3421
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3519
3422
int phy = mv88e6xxx_6320_family (chip ) ? 3 : 0 ;
3423
+ u16 val ;
3520
3424
int ret ;
3521
3425
3522
3426
if (!mv88e6xxx_has (chip , MV88E6XXX_FLAG_TEMP_LIMIT ))
3523
3427
return - EOPNOTSUPP ;
3524
3428
3525
3429
* temp = 0 ;
3526
3430
3527
- ret = mv88e6xxx_mdio_page_read (ds , phy , 6 , 26 );
3431
+ mutex_lock (& chip -> reg_lock );
3432
+ ret = mv88e6xxx_phy_page_read (chip , phy , 6 , 26 , & val );
3433
+ mutex_unlock (& chip -> reg_lock );
3528
3434
if (ret < 0 )
3529
3435
return ret ;
3530
3436
3531
- * temp = (((ret >> 8 ) & 0x1f ) * 5 ) - 25 ;
3437
+ * temp = (((val >> 8 ) & 0x1f ) * 5 ) - 25 ;
3532
3438
3533
3439
return 0 ;
3534
3440
}
@@ -3537,35 +3443,44 @@ static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3537
3443
{
3538
3444
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3539
3445
int phy = mv88e6xxx_6320_family (chip ) ? 3 : 0 ;
3540
- int ret ;
3446
+ u16 val ;
3447
+ int err ;
3541
3448
3542
3449
if (!mv88e6xxx_has (chip , MV88E6XXX_FLAG_TEMP_LIMIT ))
3543
3450
return - EOPNOTSUPP ;
3544
3451
3545
- ret = mv88e6xxx_mdio_page_read (ds , phy , 6 , 26 );
3546
- if (ret < 0 )
3547
- return ret ;
3452
+ mutex_lock (& chip -> reg_lock );
3453
+ err = mv88e6xxx_phy_page_read (chip , phy , 6 , 26 , & val );
3454
+ if (err )
3455
+ goto unlock ;
3548
3456
temp = clamp_val (DIV_ROUND_CLOSEST (temp , 5 ) + 5 , 0 , 0x1f );
3549
- return mv88e6xxx_mdio_page_write (ds , phy , 6 , 26 ,
3550
- (ret & 0xe0ff ) | (temp << 8 ));
3457
+ err = mv88e6xxx_phy_page_write (chip , phy , 6 , 26 ,
3458
+ (val & 0xe0ff ) | (temp << 8 ));
3459
+ unlock :
3460
+ mutex_unlock (& chip -> reg_lock );
3461
+
3462
+ return err ;
3551
3463
}
3552
3464
3553
3465
static int mv88e6xxx_get_temp_alarm (struct dsa_switch * ds , bool * alarm )
3554
3466
{
3555
3467
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
3556
3468
int phy = mv88e6xxx_6320_family (chip ) ? 3 : 0 ;
3469
+ u16 val ;
3557
3470
int ret ;
3558
3471
3559
3472
if (!mv88e6xxx_has (chip , MV88E6XXX_FLAG_TEMP_LIMIT ))
3560
3473
return - EOPNOTSUPP ;
3561
3474
3562
3475
* alarm = false;
3563
3476
3564
- ret = mv88e6xxx_mdio_page_read (ds , phy , 6 , 26 );
3477
+ mutex_lock (& chip -> reg_lock );
3478
+ ret = mv88e6xxx_phy_page_read (chip , phy , 6 , 26 , & val );
3479
+ mutex_unlock (& chip -> reg_lock );
3565
3480
if (ret < 0 )
3566
3481
return ret ;
3567
3482
3568
- * alarm = !!(ret & 0x40 );
3483
+ * alarm = !!(val & 0x40 );
3569
3484
3570
3485
return 0 ;
3571
3486
}
0 commit comments