Commit 5f490c96 authored by Sreenivasa Honnur's avatar Sreenivasa Honnur Committed by Jeff Garzik

S2io: Fixed synchronization between scheduling of napi with card reset and close

- Fixed synchronization between scheduling of napi with card reset and close
  by moving the enabling and disabling of napi to card up and card down
  functions respectively instead of open and close.
Signed-off-by: default avatarSurjit Reang <surjit.reang@neterion.com>
Signed-off-by: default avatarRamkrishna Vepa <ram.vepa@neterion.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 2a49128f
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
#include "s2io.h" #include "s2io.h"
#include "s2io-regs.h" #include "s2io-regs.h"
#define DRV_VERSION "2.0.26.10" #define DRV_VERSION "2.0.26.17"
/* S2io Driver name & version. */ /* S2io Driver name & version. */
static char s2io_driver_name[] = "Neterion"; static char s2io_driver_name[] = "Neterion";
...@@ -3848,8 +3848,6 @@ static int s2io_open(struct net_device *dev) ...@@ -3848,8 +3848,6 @@ static int s2io_open(struct net_device *dev)
netif_carrier_off(dev); netif_carrier_off(dev);
sp->last_link_state = 0; sp->last_link_state = 0;
napi_enable(&sp->napi);
if (sp->config.intr_type == MSI_X) { if (sp->config.intr_type == MSI_X) {
int ret = s2io_enable_msi_x(sp); int ret = s2io_enable_msi_x(sp);
...@@ -3892,7 +3890,6 @@ static int s2io_open(struct net_device *dev) ...@@ -3892,7 +3890,6 @@ static int s2io_open(struct net_device *dev)
return 0; return 0;
hw_init_failed: hw_init_failed:
napi_disable(&sp->napi);
if (sp->config.intr_type == MSI_X) { if (sp->config.intr_type == MSI_X) {
if (sp->entries) { if (sp->entries) {
kfree(sp->entries); kfree(sp->entries);
...@@ -3932,7 +3929,6 @@ static int s2io_close(struct net_device *dev) ...@@ -3932,7 +3929,6 @@ static int s2io_close(struct net_device *dev)
return 0; return 0;
netif_stop_queue(dev); netif_stop_queue(dev);
napi_disable(&sp->napi);
/* Reset card, kill tasklet and free Tx and Rx buffers. */ /* Reset card, kill tasklet and free Tx and Rx buffers. */
s2io_card_down(sp); s2io_card_down(sp);
...@@ -6796,6 +6792,8 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io) ...@@ -6796,6 +6792,8 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io)
struct XENA_dev_config __iomem *bar0 = sp->bar0; struct XENA_dev_config __iomem *bar0 = sp->bar0;
unsigned long flags; unsigned long flags;
register u64 val64 = 0; register u64 val64 = 0;
struct config_param *config;
config = &sp->config;
if (!is_s2io_card_up(sp)) if (!is_s2io_card_up(sp))
return; return;
...@@ -6807,6 +6805,10 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io) ...@@ -6807,6 +6805,10 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io)
} }
clear_bit(__S2IO_STATE_CARD_UP, &sp->state); clear_bit(__S2IO_STATE_CARD_UP, &sp->state);
/* Disable napi */
if (config->napi)
napi_disable(&sp->napi);
/* disable Tx and Rx traffic on the NIC */ /* disable Tx and Rx traffic on the NIC */
if (do_io) if (do_io)
stop_nic(sp); stop_nic(sp);
...@@ -6900,6 +6902,11 @@ static int s2io_card_up(struct s2io_nic * sp) ...@@ -6900,6 +6902,11 @@ static int s2io_card_up(struct s2io_nic * sp)
DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i, DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i,
atomic_read(&sp->rx_bufs_left[i])); atomic_read(&sp->rx_bufs_left[i]));
} }
/* Initialise napi */
if (config->napi)
napi_enable(&sp->napi);
/* Maintain the state prior to the open */ /* Maintain the state prior to the open */
if (sp->promisc_flg) if (sp->promisc_flg)
sp->promisc_flg = 0; sp->promisc_flg = 0;
......
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