@@ -1371,6 +1371,10 @@ void write_mii_word(struct net_device *netdev, int phy_id, int reg, int val)
1371
1371
static int
1372
1372
r8152_submit_rx (struct r8152 * tp , struct rx_agg * agg , gfp_t mem_flags );
1373
1373
1374
+ static int
1375
+ rtl8152_set_speed (struct r8152 * tp , u8 autoneg , u32 speed , u8 duplex ,
1376
+ u32 advertising );
1377
+
1374
1378
static int rtl8152_set_mac_address (struct net_device * netdev , void * p )
1375
1379
{
1376
1380
struct r8152 * tp = netdev_priv (netdev );
@@ -3205,40 +3209,27 @@ static void r8153b_ups_en(struct r8152 *tp, bool enable)
3205
3209
ocp_data |= BIT (0 );
3206
3210
ocp_write_byte (tp , MCU_TYPE_USB , 0xcfff , ocp_data );
3207
3211
} else {
3208
- u16 data ;
3209
-
3210
3212
ocp_data &= ~(UPS_EN | USP_PREWAKE );
3211
3213
ocp_write_byte (tp , MCU_TYPE_USB , USB_POWER_CUT , ocp_data );
3212
3214
3213
3215
ocp_data = ocp_read_byte (tp , MCU_TYPE_USB , 0xcfff );
3214
3216
ocp_data &= ~BIT (0 );
3215
3217
ocp_write_byte (tp , MCU_TYPE_USB , 0xcfff , ocp_data );
3216
3218
3217
- ocp_data = ocp_read_word (tp , MCU_TYPE_USB , USB_MISC_0 );
3218
- ocp_data &= ~PCUT_STATUS ;
3219
- ocp_write_word (tp , MCU_TYPE_USB , USB_MISC_0 , ocp_data );
3220
-
3221
- data = r8153_phy_status (tp , 0 );
3222
-
3223
- switch (data ) {
3224
- case PHY_STAT_PWRDN :
3225
- case PHY_STAT_EXT_INIT :
3226
- r8153b_green_en (tp ,
3227
- test_bit (GREEN_ETHERNET , & tp -> flags ));
3219
+ if (ocp_read_word (tp , MCU_TYPE_USB , USB_MISC_0 ) & PCUT_STATUS ) {
3220
+ int i ;
3228
3221
3229
- data = r8152_mdio_read (tp , MII_BMCR );
3230
- data &= ~BMCR_PDOWN ;
3231
- data |= BMCR_RESET ;
3232
- r8152_mdio_write (tp , MII_BMCR , data );
3222
+ for (i = 0 ; i < 500 ; i ++ ) {
3223
+ if (ocp_read_word (tp , MCU_TYPE_PLA , PLA_BOOT_CTRL ) &
3224
+ AUTOLOAD_DONE )
3225
+ break ;
3226
+ msleep (20 );
3227
+ }
3233
3228
3234
- data = r8153_phy_status (tp , PHY_STAT_LAN_ON );
3235
- fallthrough ;
3229
+ tp -> rtl_ops .hw_phy_cfg (tp );
3236
3230
3237
- default :
3238
- if (data != PHY_STAT_LAN_ON )
3239
- netif_warn (tp , link , tp -> netdev ,
3240
- "PHY not ready" );
3241
- break ;
3231
+ rtl8152_set_speed (tp , tp -> autoneg , tp -> speed ,
3232
+ tp -> duplex , tp -> advertising );
3242
3233
}
3243
3234
}
3244
3235
}
@@ -3468,59 +3459,76 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type)
3468
3459
ocp_write_word (tp , type , PLA_BP_BA , 0 );
3469
3460
}
3470
3461
3471
- static int r8153_patch_request (struct r8152 * tp , bool request )
3462
+ static int rtl_phy_patch_request (struct r8152 * tp , bool request , bool wait )
3472
3463
{
3473
- u16 data ;
3464
+ u16 data , check ;
3474
3465
int i ;
3475
3466
3476
3467
data = ocp_reg_read (tp , OCP_PHY_PATCH_CMD );
3477
- if (request )
3468
+ if (request ) {
3478
3469
data |= PATCH_REQUEST ;
3479
- else
3470
+ check = 0 ;
3471
+ } else {
3480
3472
data &= ~PATCH_REQUEST ;
3473
+ check = PATCH_READY ;
3474
+ }
3481
3475
ocp_reg_write (tp , OCP_PHY_PATCH_CMD , data );
3482
3476
3483
- for (i = 0 ; request && i < 5000 ; i ++ ) {
3477
+ for (i = 0 ; wait && i < 5000 ; i ++ ) {
3478
+ u32 ocp_data ;
3479
+
3484
3480
usleep_range (1000 , 2000 );
3485
- if (ocp_reg_read (tp , OCP_PHY_PATCH_STAT ) & PATCH_READY )
3481
+ ocp_data = ocp_reg_read (tp , OCP_PHY_PATCH_STAT );
3482
+ if ((ocp_data & PATCH_READY ) ^ check )
3486
3483
break ;
3487
3484
}
3488
3485
3489
- if (request && !(ocp_reg_read (tp , OCP_PHY_PATCH_STAT ) & PATCH_READY )) {
3490
- netif_err (tp , drv , tp -> netdev , "patch request fail\n" );
3491
- r8153_patch_request (tp , false);
3486
+ if (request && wait &&
3487
+ !(ocp_reg_read (tp , OCP_PHY_PATCH_STAT ) & PATCH_READY )) {
3488
+ dev_err (& tp -> intf -> dev , "PHY patch request fail\n" );
3489
+ rtl_phy_patch_request (tp , false, false);
3492
3490
return - ETIME ;
3493
3491
} else {
3494
3492
return 0 ;
3495
3493
}
3496
3494
}
3497
3495
3498
- static int r8153_pre_ram_code (struct r8152 * tp , u16 key_addr , u16 patch_key )
3496
+ static void rtl_patch_key_set (struct r8152 * tp , u16 key_addr , u16 patch_key )
3499
3497
{
3500
- if (r8153_patch_request (tp , true)) {
3501
- dev_err (& tp -> intf -> dev , "patch request fail\n" );
3502
- return - ETIME ;
3503
- }
3498
+ if (patch_key && key_addr ) {
3499
+ sram_write (tp , key_addr , patch_key );
3500
+ sram_write (tp , SRAM_PHY_LOCK , PHY_PATCH_LOCK );
3501
+ } else if (key_addr ) {
3502
+ u16 data ;
3504
3503
3505
- sram_write (tp , key_addr , patch_key );
3506
- sram_write (tp , SRAM_PHY_LOCK , PHY_PATCH_LOCK );
3504
+ sram_write (tp , 0x0000 , 0x0000 );
3507
3505
3508
- return 0 ;
3506
+ data = ocp_reg_read (tp , OCP_PHY_LOCK );
3507
+ data &= ~PATCH_LOCK ;
3508
+ ocp_reg_write (tp , OCP_PHY_LOCK , data );
3509
+
3510
+ sram_write (tp , key_addr , 0x0000 );
3511
+ } else {
3512
+ WARN_ON_ONCE (1 );
3513
+ }
3509
3514
}
3510
3515
3511
- static int r8153_post_ram_code (struct r8152 * tp , u16 key_addr )
3516
+ static int
3517
+ rtl_pre_ram_code (struct r8152 * tp , u16 key_addr , u16 patch_key , bool wait )
3512
3518
{
3513
- u16 data ;
3519
+ if (rtl_phy_patch_request (tp , true, wait ))
3520
+ return - ETIME ;
3514
3521
3515
- sram_write (tp , 0x0000 , 0x0000 );
3522
+ rtl_patch_key_set (tp , key_addr , patch_key );
3516
3523
3517
- data = ocp_reg_read (tp , OCP_PHY_LOCK );
3518
- data &= ~PATCH_LOCK ;
3519
- ocp_reg_write (tp , OCP_PHY_LOCK , data );
3524
+ return 0 ;
3525
+ }
3520
3526
3521
- sram_write (tp , key_addr , 0x0000 );
3527
+ static int rtl_post_ram_code (struct r8152 * tp , u16 key_addr , bool wait )
3528
+ {
3529
+ rtl_patch_key_set (tp , key_addr , 0 );
3522
3530
3523
- r8153_patch_request (tp , false);
3531
+ rtl_phy_patch_request (tp , false, wait );
3524
3532
3525
3533
ocp_write_word (tp , MCU_TYPE_PLA , PLA_OCP_GPHY_BASE , tp -> ocp_base );
3526
3534
@@ -4005,7 +4013,7 @@ static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac)
4005
4013
dev_dbg (& tp -> intf -> dev , "successfully applied %s\n" , mac -> info );
4006
4014
}
4007
4015
4008
- static void rtl8152_apply_firmware (struct r8152 * tp )
4016
+ static void rtl8152_apply_firmware (struct r8152 * tp , bool power_cut )
4009
4017
{
4010
4018
struct rtl_fw * rtl_fw = & tp -> rtl_fw ;
4011
4019
const struct firmware * fw ;
@@ -4036,12 +4044,11 @@ static void rtl8152_apply_firmware(struct r8152 *tp)
4036
4044
case RTL_FW_PHY_START :
4037
4045
key = (struct fw_phy_patch_key * )block ;
4038
4046
key_addr = __le16_to_cpu (key -> key_reg );
4039
- r8153_pre_ram_code (tp , key_addr ,
4040
- __le16_to_cpu (key -> key_data ));
4047
+ rtl_pre_ram_code (tp , key_addr , __le16_to_cpu (key -> key_data ), !power_cut );
4041
4048
break ;
4042
4049
case RTL_FW_PHY_STOP :
4043
4050
WARN_ON (!key_addr );
4044
- r8153_post_ram_code (tp , key_addr );
4051
+ rtl_post_ram_code (tp , key_addr , ! power_cut );
4045
4052
break ;
4046
4053
case RTL_FW_PHY_NC :
4047
4054
rtl8152_fw_phy_nc_apply (tp , (struct fw_phy_nc * )block );
@@ -4246,7 +4253,7 @@ static void rtl8152_disable(struct r8152 *tp)
4246
4253
4247
4254
static void r8152b_hw_phy_cfg (struct r8152 * tp )
4248
4255
{
4249
- rtl8152_apply_firmware (tp );
4256
+ rtl8152_apply_firmware (tp , false );
4250
4257
rtl_eee_enable (tp , tp -> eee_en );
4251
4258
r8152_aldps_en (tp , true);
4252
4259
r8152b_enable_fc (tp );
@@ -4528,7 +4535,7 @@ static void r8153_hw_phy_cfg(struct r8152 *tp)
4528
4535
/* disable EEE before updating the PHY parameters */
4529
4536
rtl_eee_enable (tp , false);
4530
4537
4531
- rtl8152_apply_firmware (tp );
4538
+ rtl8152_apply_firmware (tp , false );
4532
4539
4533
4540
if (tp -> version == RTL_VER_03 ) {
4534
4541
data = ocp_reg_read (tp , OCP_EEE_CFG );
@@ -4596,13 +4603,37 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp)
4596
4603
u32 ocp_data ;
4597
4604
u16 data ;
4598
4605
4606
+ ocp_data = ocp_read_word (tp , MCU_TYPE_USB , USB_MISC_0 );
4607
+ if (ocp_data & PCUT_STATUS ) {
4608
+ ocp_data &= ~PCUT_STATUS ;
4609
+ ocp_write_word (tp , MCU_TYPE_USB , USB_MISC_0 , ocp_data );
4610
+ }
4611
+
4599
4612
/* disable ALDPS before updating the PHY parameters */
4600
4613
r8153_aldps_en (tp , false);
4601
4614
4602
4615
/* disable EEE before updating the PHY parameters */
4603
4616
rtl_eee_enable (tp , false);
4604
4617
4605
- rtl8152_apply_firmware (tp );
4618
+ /* U1/U2/L1 idle timer. 500 us */
4619
+ ocp_write_word (tp , MCU_TYPE_USB , USB_U1U2_TIMER , 500 );
4620
+
4621
+ data = r8153_phy_status (tp , 0 );
4622
+
4623
+ switch (data ) {
4624
+ case PHY_STAT_PWRDN :
4625
+ case PHY_STAT_EXT_INIT :
4626
+ rtl8152_apply_firmware (tp , true);
4627
+
4628
+ data = r8152_mdio_read (tp , MII_BMCR );
4629
+ data &= ~BMCR_PDOWN ;
4630
+ r8152_mdio_write (tp , MII_BMCR , data );
4631
+ break ;
4632
+ case PHY_STAT_LAN_ON :
4633
+ default :
4634
+ rtl8152_apply_firmware (tp , false);
4635
+ break ;
4636
+ }
4606
4637
4607
4638
r8153b_green_en (tp , test_bit (GREEN_ETHERNET , & tp -> flags ));
4608
4639
@@ -4643,7 +4674,7 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp)
4643
4674
ocp_write_word (tp , MCU_TYPE_PLA , PLA_PHY_PWR , ocp_data );
4644
4675
4645
4676
/* Advnace EEE */
4646
- if (!r8153_patch_request (tp , true)) {
4677
+ if (!rtl_phy_patch_request (tp , true , true)) {
4647
4678
data = ocp_reg_read (tp , OCP_POWER_CFG );
4648
4679
data |= EEE_CLKDIV_EN ;
4649
4680
ocp_reg_write (tp , OCP_POWER_CFG , data );
@@ -4660,7 +4691,7 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp)
4660
4691
ocp_reg_write (tp , OCP_SYSCLK_CFG , clk_div_expo (5 ));
4661
4692
tp -> ups_info ._250m_ckdiv = true;
4662
4693
4663
- r8153_patch_request (tp , false);
4694
+ rtl_phy_patch_request (tp , false, true );
4664
4695
}
4665
4696
4666
4697
if (tp -> eee_en )
@@ -5528,9 +5559,6 @@ static void r8153b_init(struct r8152 *tp)
5528
5559
/* MSC timer = 0xfff * 8ms = 32760 ms */
5529
5560
ocp_write_word (tp , MCU_TYPE_USB , USB_MSC_TIMER , 0x0fff );
5530
5561
5531
- /* U1/U2/L1 idle timer. 500 us */
5532
- ocp_write_word (tp , MCU_TYPE_USB , USB_U1U2_TIMER , 500 );
5533
-
5534
5562
r8153b_power_cut_en (tp , false);
5535
5563
r8153b_ups_en (tp , false);
5536
5564
r8153_queue_wake (tp , false);
0 commit comments