Commit 41cec84c authored by hayeswang's avatar hayeswang Committed by David S. Miller

r8152: don't enable napi before rx ready

Adjust napi_disable() and napi_enable() to avoid r8152_poll() start
working before rx ready. Otherwise, it may have race condition for
rx_agg.
Signed-off-by: default avatarHayes Wang <hayeswang@realtek.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7daed8dc
...@@ -2075,7 +2075,6 @@ static int rtl_start_rx(struct r8152 *tp) ...@@ -2075,7 +2075,6 @@ static int rtl_start_rx(struct r8152 *tp)
{ {
int i, ret = 0; int i, ret = 0;
napi_disable(&tp->napi);
INIT_LIST_HEAD(&tp->rx_done); INIT_LIST_HEAD(&tp->rx_done);
for (i = 0; i < RTL8152_MAX_RX; i++) { for (i = 0; i < RTL8152_MAX_RX; i++) {
INIT_LIST_HEAD(&tp->rx_info[i].list); INIT_LIST_HEAD(&tp->rx_info[i].list);
...@@ -2083,7 +2082,6 @@ static int rtl_start_rx(struct r8152 *tp) ...@@ -2083,7 +2082,6 @@ static int rtl_start_rx(struct r8152 *tp)
if (ret) if (ret)
break; break;
} }
napi_enable(&tp->napi);
if (ret && ++i < RTL8152_MAX_RX) { if (ret && ++i < RTL8152_MAX_RX) {
struct list_head rx_queue; struct list_head rx_queue;
...@@ -2951,8 +2949,10 @@ static void set_carrier(struct r8152 *tp) ...@@ -2951,8 +2949,10 @@ static void set_carrier(struct r8152 *tp)
if (!netif_carrier_ok(netdev)) { if (!netif_carrier_ok(netdev)) {
tp->rtl_ops.enable(tp); tp->rtl_ops.enable(tp);
set_bit(RTL8152_SET_RX_MODE, &tp->flags); set_bit(RTL8152_SET_RX_MODE, &tp->flags);
napi_disable(&tp->napi);
netif_carrier_on(netdev); netif_carrier_on(netdev);
rtl_start_rx(tp); rtl_start_rx(tp);
napi_enable(&tp->napi);
} }
} else { } else {
if (netif_carrier_ok(netdev)) { if (netif_carrier_ok(netdev)) {
...@@ -3395,9 +3395,11 @@ static int rtl8152_resume(struct usb_interface *intf) ...@@ -3395,9 +3395,11 @@ static int rtl8152_resume(struct usb_interface *intf)
if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
rtl_runtime_suspend_enable(tp, false); rtl_runtime_suspend_enable(tp, false);
clear_bit(SELECTIVE_SUSPEND, &tp->flags); clear_bit(SELECTIVE_SUSPEND, &tp->flags);
napi_disable(&tp->napi);
set_bit(WORK_ENABLE, &tp->flags); set_bit(WORK_ENABLE, &tp->flags);
if (netif_carrier_ok(tp->netdev)) if (netif_carrier_ok(tp->netdev))
rtl_start_rx(tp); rtl_start_rx(tp);
napi_enable(&tp->napi);
} else { } else {
tp->rtl_ops.up(tp); tp->rtl_ops.up(tp);
rtl8152_set_speed(tp, AUTONEG_ENABLE, rtl8152_set_speed(tp, AUTONEG_ENABLE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment