Skip to content

Commit a028a9e

Browse files
hayesorzdavem330
authored andcommitted
r8152: move the settings of PHY to a work queue
Move the settings of PHY to a work queue and schedule it after rtl_ops.init(). There are some reasons for this. First, the settings are only needed for the first time initialization or after the power down occurs. Second, the settings are independent with the others. Last, the settings may take more time than the others. Leave they in probe() or open() may delay the following flows. Signed-off-by: Hayes Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e8eb36c commit a028a9e

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

drivers/net/usb/r8152.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ struct r8152 {
602602
struct list_head rx_done, tx_free;
603603
struct sk_buff_head tx_queue, rx_queue;
604604
spinlock_t rx_lock, tx_lock;
605-
struct delayed_work schedule;
605+
struct delayed_work schedule, hw_phy_work;
606606
struct mii_if_info mii;
607607
struct mutex control; /* use for hw setting */
608608
#ifdef CONFIG_PM_SLEEP
@@ -619,6 +619,7 @@ struct r8152 {
619619
int (*eee_get)(struct r8152 *, struct ethtool_eee *);
620620
int (*eee_set)(struct r8152 *, struct ethtool_eee *);
621621
bool (*in_nway)(struct r8152 *);
622+
void (*hw_phy_cfg)(struct r8152 *);
622623
} rtl_ops;
623624

624625
int intr_interval;
@@ -2499,8 +2500,6 @@ static void r8152b_exit_oob(struct r8152 *tp)
24992500

25002501
rxdy_gated_en(tp, true);
25012502
r8153_teredo_off(tp);
2502-
r8152b_hw_phy_cfg(tp);
2503-
25042503
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
25052504
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00);
25062505

@@ -2678,8 +2677,6 @@ static void r8153_first_init(struct r8152 *tp)
26782677
ocp_data &= ~RCR_ACPT_ALL;
26792678
ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
26802679

2681-
r8153_hw_phy_cfg(tp);
2682-
26832680
rtl8152_nic_reset(tp);
26842681

26852682
ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
@@ -3040,6 +3037,25 @@ static void rtl_work_func_t(struct work_struct *work)
30403037
usb_autopm_put_interface(tp->intf);
30413038
}
30423039

3040+
static void rtl_hw_phy_work_func_t(struct work_struct *work)
3041+
{
3042+
struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work);
3043+
3044+
if (test_bit(RTL8152_UNPLUG, &tp->flags))
3045+
return;
3046+
3047+
if (usb_autopm_get_interface(tp->intf) < 0)
3048+
return;
3049+
3050+
mutex_lock(&tp->control);
3051+
3052+
tp->rtl_ops.hw_phy_cfg(tp);
3053+
3054+
mutex_unlock(&tp->control);
3055+
3056+
usb_autopm_put_interface(tp->intf);
3057+
}
3058+
30433059
#ifdef CONFIG_PM_SLEEP
30443060
static int rtl_notifier(struct notifier_block *nb, unsigned long action,
30453061
void *data)
@@ -3518,6 +3534,7 @@ static int rtl8152_resume(struct usb_interface *intf)
35183534

35193535
if (!test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
35203536
tp->rtl_ops.init(tp);
3537+
queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0);
35213538
netif_device_attach(tp->netdev);
35223539
}
35233540

@@ -4122,6 +4139,7 @@ static int rtl_ops_init(struct r8152 *tp)
41224139
ops->eee_get = r8152_get_eee;
41234140
ops->eee_set = r8152_set_eee;
41244141
ops->in_nway = rtl8152_in_nway;
4142+
ops->hw_phy_cfg = r8152b_hw_phy_cfg;
41254143
break;
41264144

41274145
case RTL_VER_03:
@@ -4137,6 +4155,7 @@ static int rtl_ops_init(struct r8152 *tp)
41374155
ops->eee_get = r8153_get_eee;
41384156
ops->eee_set = r8153_set_eee;
41394157
ops->in_nway = rtl8153_in_nway;
4158+
ops->hw_phy_cfg = r8153_hw_phy_cfg;
41404159
break;
41414160

41424161
default:
@@ -4183,6 +4202,7 @@ static int rtl8152_probe(struct usb_interface *intf,
41834202

41844203
mutex_init(&tp->control);
41854204
INIT_DELAYED_WORK(&tp->schedule, rtl_work_func_t);
4205+
INIT_DELAYED_WORK(&tp->hw_phy_work, rtl_hw_phy_work_func_t);
41864206

41874207
netdev->netdev_ops = &rtl8152_netdev_ops;
41884208
netdev->watchdog_timeo = RTL8152_TX_TIMEOUT;
@@ -4225,6 +4245,7 @@ static int rtl8152_probe(struct usb_interface *intf,
42254245
intf->needs_remote_wakeup = 1;
42264246

42274247
tp->rtl_ops.init(tp);
4248+
queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0);
42284249
set_ethernet_addr(tp);
42294250

42304251
usb_set_intfdata(intf, tp);
@@ -4270,6 +4291,7 @@ static void rtl8152_disconnect(struct usb_interface *intf)
42704291

42714292
netif_napi_del(&tp->napi);
42724293
unregister_netdev(tp->netdev);
4294+
cancel_delayed_work_sync(&tp->hw_phy_work);
42734295
tp->rtl_ops.unload(tp);
42744296
free_netdev(tp->netdev);
42754297
}

0 commit comments

Comments
 (0)