|
@@ -1322,6 +1322,10 @@ int netvsc_device_add(struct hv_device *device,
|
|
|
nvchan->channel = device->channel;
|
|
|
}
|
|
|
|
|
|
+ /* Enable NAPI handler before init callbacks */
|
|
|
+ netif_napi_add(ndev, &net_device->chan_table[0].napi,
|
|
|
+ netvsc_poll, NAPI_POLL_WEIGHT);
|
|
|
+
|
|
|
/* Open the channel */
|
|
|
ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
|
|
|
ring_size * PAGE_SIZE, NULL, 0,
|
|
@@ -1329,6 +1333,7 @@ int netvsc_device_add(struct hv_device *device,
|
|
|
net_device->chan_table);
|
|
|
|
|
|
if (ret != 0) {
|
|
|
+ netif_napi_del(&net_device->chan_table[0].napi);
|
|
|
netdev_err(ndev, "unable to open channel: %d\n", ret);
|
|
|
goto cleanup;
|
|
|
}
|
|
@@ -1336,9 +1341,6 @@ int netvsc_device_add(struct hv_device *device,
|
|
|
/* Channel is opened */
|
|
|
netdev_dbg(ndev, "hv_netvsc channel opened successfully\n");
|
|
|
|
|
|
- /* Enable NAPI handler for init callbacks */
|
|
|
- netif_napi_add(ndev, &net_device->chan_table[0].napi,
|
|
|
- netvsc_poll, NAPI_POLL_WEIGHT);
|
|
|
napi_enable(&net_device->chan_table[0].napi);
|
|
|
|
|
|
/* Writing nvdev pointer unlocks netvsc_send(), make sure chn_table is
|