OUT UINT *p_len);\r
\r
\r
+static void\r
+ __ipoib_complete_reset(\r
+ IN ipoib_adapter_t* const p_adapter,\r
+ IN NDIS_STATUS Status ) \r
+{\r
+ KLOCK_QUEUE_HANDLE hdl;\r
+ \r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ // Check if Reset flag is set or if adapter is in Paused state\r
+ p_adapter->ipoib_state = p_adapter->ipoib_state & ~IPOIB_RESET_OR_DOWN; \r
+ \r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING )\r
+ {\r
+ shutter_alive( &p_adapter->recv_shutter );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state changed to IPOIB_RUNNING after the IPOIB_RESET_OR_DOWN flag was cleared\n") );\r
+\r
+ }\r
+ else \r
+ {\r
+ // This sittuation happened in real life: \r
+ // NDIS called to reset and right after to pause, before the reset was completed\r
+ // Thus, when ipoib will try to complete reset, state may be already changed to IPOIB_PAUSE\r
+ ASSERT( p_adapter->ipoib_state == IPOIB_PAUSED );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state remained IPOIB_PAUSED and will be changed at ipoib_restart()\n") );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
+ \r
+ p_adapter->reset = FALSE;\r
+ NdisMResetComplete(\r
+ p_adapter->h_adapter, Status, TRUE );\r
+}\r
+\r
/* Implementation */\r
ib_api_status_t\r
ipoib_create_adapter(\r
\r
if( p_adapter->reset && p_adapter->state != IB_PNP_PORT_INIT )\r
{\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
}\r
status = IB_SUCCESS;\r
break;\r
{\r
ib_api_status_t status;\r
ib_pnp_handle_t h_pnp;\r
+ KLOCK_QUEUE_HANDLE hdl;\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
h_pnp = p_adapter->h_pnp;\r
p_adapter->h_pnp = NULL;\r
status = p_adapter->p_ifc->dereg_pnp( h_pnp, __ipoib_pnp_dereg );\r
+ \r
// Wait until NDIS will return all indicated NBLs that were received\r
- shutter_shut( &p_adapter->recv_shutter );\r
+ // Avoid shutting the shutter twice\r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING ) {\r
+ shutter_shut( &p_adapter->recv_shutter );\r
+ // Notify that reset started and disable other shutter_shut\r
+ p_adapter->ipoib_state |= IPOIB_RESET_OR_DOWN; \r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u] ipoib_state was IPOIB_RUNNING and IPOIB_RESET_OR_DOWN flag was set \n", cl_get_time_stamp()) );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
+ \r
if( status == IB_SUCCESS )\r
status = IB_NOT_DONE;\r
}\r
p_adapter->reset = TRUE;\r
}\r
else {\r
- p_adapter->reset = FALSE;\r
+ //do not call to __ipoib_complete_reset, because we return completion status directly from here\r
+ p_adapter->reset = FALSE; \r
+ \r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ // Check if Reset flag is set or if adapter is in Paused state\r
+ p_adapter->ipoib_state = p_adapter->ipoib_state & ~IPOIB_RESET_OR_DOWN; \r
+ \r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING )\r
+ {\r
+ shutter_alive( &p_adapter->recv_shutter );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state changed to IPOIB_RUNNING after the IPOIB_RESET_OR_DOWN flag was cleared\n") );\r
+\r
+ }\r
+ else \r
+ {\r
+ // This sittuation happened in real life: \r
+ // NDIS called to reset and right after to pause, before the reset was completed\r
+ // Thus, when ipoib will try to complete reset, state may be already changed to IPOIB_PAUSE\r
+ ASSERT( p_adapter->ipoib_state == IPOIB_PAUSED );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state remained IPOIB_PAUSED and will be changed at ipoib_restart()\n") );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
+ \r
}\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return status;\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("Got RESET\n") );\r
+ ("[%I64u] Got RESET\n", cl_get_time_stamp()) );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u] Got RESET\n", cl_get_time_stamp()) );\r
\r
p_adapter = (ipoib_adapter_t*)context;\r
\r
status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
if( status != IB_SUCCESS )\r
{\r
- p_adapter->reset = FALSE;\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("__ipoib_pnp_reg returned %s\n",\r
p_adapter->p_ifc->get_err_str( status )) );\r
- NdisMResetComplete( \r
- p_adapter->h_adapter, NDIS_STATUS_HARD_ERRORS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_HARD_ERRORS );\r
}\r
}\r
else\r
{\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
status = IB_SUCCESS;\r
}\r
\r
\r
if( p_adapter->reset )\r
{\r
- //ASSERT(FALSE);\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
\r
if( p_adapter->reset )\r
{\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
CSUM_BYPASS\r
} csum_flag_t;\r
\r
-typedef enum _ipoib_state\r
-{\r
- IPOIB_INIT = -1,\r
- IPOIB_PAUSED,\r
- IPOIB_PAUSING,\r
- IPOIB_RUNNING\r
-} ipoib_state_t;\r
+typedef uint32_t ipoib_state_t;\r
+#define IPOIB_INIT 1\r
+#define IPOIB_PAUSED 2\r
+#define IPOIB_PAUSING 4\r
+#define IPOIB_RUNNING 8\r
+#define IPOIB_RESET_OR_DOWN 16\r
+\r
\r
typedef struct _ipoib_offloads_cap_ {\r
boolean_t lso;\r
WPP_DEFINE_BIT(IPOIB_DBG_OID) \\r
WPP_DEFINE_BIT(IPOIB_DBG_IOCTL) \\r
WPP_DEFINE_BIT(IPOIB_DBG_STAT) \\r
- WPP_DEFINE_BIT(IPOIB_DBG_OBJ))\r
+ WPP_DEFINE_BIT(IPOIB_DBG_OBJ) \\r
+ WPP_DEFINE_BIT(IPOIB_DBG_SHUTTER))\r
\r
\r
\r
/*\r
* Debug macros\r
*/\r
-#define IPOIB_DBG_ERR (1 << 0)\r
-#define IPOIB_DBG_INIT (1 << 1)\r
-#define IPOIB_DBG_PNP (1 << 2)\r
-#define IPOIB_DBG_SEND (1 << 3)\r
-#define IPOIB_DBG_RECV (1 << 4)\r
-#define IPOIB_DBG_ENDPT (1 << 5)\r
-#define IPOIB_DBG_IB (1 << 6)\r
-#define IPOIB_DBG_BUF (1 << 7)\r
-#define IPOIB_DBG_MCAST (1 << 8)\r
-#define IPOIB_DBG_ALLOC (1 << 9)\r
-#define IPOIB_DBG_OID (1 << 10)\r
-#define IPOIB_DBG_IOCTL (1 << 11)\r
-#define IPOIB_DBG_STAT (1 << 12)\r
-#define IPOIB_DBG_OBJ (1 << 13)\r
+#define IPOIB_DBG_ERR (1 << 0)\r
+#define IPOIB_DBG_INIT (1 << 1)\r
+#define IPOIB_DBG_PNP (1 << 2)\r
+#define IPOIB_DBG_SEND (1 << 3)\r
+#define IPOIB_DBG_RECV (1 << 4)\r
+#define IPOIB_DBG_ENDPT (1 << 5)\r
+#define IPOIB_DBG_IB (1 << 6)\r
+#define IPOIB_DBG_BUF (1 << 7)\r
+#define IPOIB_DBG_MCAST (1 << 8)\r
+#define IPOIB_DBG_ALLOC (1 << 9)\r
+#define IPOIB_DBG_OID (1 << 10)\r
+#define IPOIB_DBG_IOCTL (1 << 11)\r
+#define IPOIB_DBG_STAT (1 << 12)\r
+#define IPOIB_DBG_OBJ (1 << 13)\r
+#define IPOIB_DBG_SHUTTER (1 << 14)\r
\r
#define IPOIB_DBG_ERROR (CL_DBG_ERROR | IPOIB_DBG_ERR)\r
#define IPOIB_DBG_ALL CL_DBG_ALL\r
return NDIS_STATUS_FAILURE;\r
}\r
p_adapter->ipoib_state = IPOIB_INIT;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state changed to IPOIB_INIT\n") );\r
\r
status = SetAttributes(p_adapter, h_adapter);\r
if (status != NDIS_STATUS_SUCCESS) {\r
p_adapter = (ipoib_adapter_t*)adapter_context;\r
\r
cl_obj_lock( &p_adapter->obj );\r
- if( p_adapter->ipoib_state == IPOIB_PAUSING ||\r
- p_adapter->ipoib_state == IPOIB_PAUSED)\r
+ if( p_adapter->ipoib_state & IPOIB_PAUSING ||\r
+ p_adapter->ipoib_state & IPOIB_PAUSED)\r
{\r
status = NDIS_STATUS_PAUSED; \r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
IN NDIS_HANDLE adapter_context,\r
IN NDIS_SHUTDOWN_ACTION shutdown_action)\r
{\r
+ KLOCK_QUEUE_HANDLE hdl;\r
+ \r
IPOIB_ENTER( IPOIB_DBG_INIT ) ;\r
UNUSED_PARAM( shutdown_action );\r
\r
("Shutter shut, state = %d\n", p_adapter->ipoib_state));\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
("Shutter shut, state = %d\n", p_adapter->ipoib_state));\r
- shutter_shut ( &p_adapter->recv_shutter );\r
+ // Wait until NDIS will return all indicated NBLs that were received\r
+ // Avoid shutting the shutter twice\r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ ASSERT ( !(p_adapter->ipoib_state & IPOIB_RESET_OR_DOWN) );\r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING ) { //ensure that there was no active reset\r
+ shutter_shut( &p_adapter->recv_shutter );\r
+ // Notify that shutter was already shut\r
+ p_adapter->ipoib_state |= IPOIB_RESET_OR_DOWN;\r
+ ASSERT( p_adapter->ipoib_state == IPOIB_RUNNING ); \r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state was IPOIB_RUNNING and IPOIB_RESET_OR_DOWN flag was set\n") );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
cl_free( context );\r
}\r
\r
+\r
static NDIS_STATUS \r
ipoib_pause(\r
IN NDIS_HANDLE adapter_context, \r
{\r
ipoib_adapter_t *p_adapter;\r
KLOCK_QUEUE_HANDLE hdl;\r
+ ipoib_state_t prev_state;\r
\r
- UNREFERENCED_PARAMETER(pause_parameters);\r
+ UNREFERENCED_PARAMETER( pause_parameters );\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
- CL_ASSERT(adapter_context);\r
+ CL_ASSERT( adapter_context );\r
p_adapter = (ipoib_adapter_t*)adapter_context;\r
- CL_ASSERT(p_adapter->ipoib_state == IPOIB_RUNNING);\r
-\r
+ \r
KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ prev_state = p_adapter->ipoib_state;\r
+ CL_ASSERT ( prev_state & IPOIB_RUNNING );\r
p_adapter->ipoib_state = IPOIB_PAUSING;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u]ipoib_state changed to IPOIB_PAUSING\n", cl_get_time_stamp()) );\r
KeReleaseInStackQueuedSpinLock( &hdl );\r
\r
- if (p_adapter->p_port) {\r
+ if ( p_adapter->p_port ) {\r
cl_spinlock_acquire( &p_adapter->p_port->send_lock );\r
- ipoib_port_resume(p_adapter->p_port,FALSE);\r
+ ipoib_port_resume( p_adapter->p_port,FALSE );\r
cl_spinlock_release( &p_adapter->p_port->send_lock );\r
}\r
- \r
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
- ("Shutter shut, state = %d\n", p_adapter->ipoib_state));\r
- shutter_shut ( &p_adapter->recv_shutter );\r
+ if ( prev_state == IPOIB_RUNNING ) { //i.e there was no active reset\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+ ("Shutter shut, state = %d\n", p_adapter->ipoib_state) );\r
+ shutter_shut ( &p_adapter->recv_shutter );\r
+ }\r
+ else {\r
+ ASSERT ( prev_state & IPOIB_RESET_OR_DOWN);\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("[%I64u]Got pause during reset or got reset when IPoIB port wasn't active\n", cl_get_time_stamp()) );\r
+ }\r
\r
KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
p_adapter->ipoib_state = IPOIB_PAUSED;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u]ipoib_state changed to IPOIB_PAUSED\n", cl_get_time_stamp()) );\r
KeReleaseInStackQueuedSpinLock( &hdl );\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
// Check to see if we need to change any attributes\r
}\r
\r
- if ( (p_adapter->ipoib_state == IPOIB_PAUSED) || (p_adapter->ipoib_state == IPOIB_INIT) ) {\r
+ if ( p_adapter->ipoib_state & (IPOIB_PAUSED | IPOIB_INIT) ) {\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
- ("Shutter Alive, ipoib_state = %d\n", p_adapter->ipoib_state));\r
+ ("[%I64u]Shutter Alive, ipoib_state = %d\n", cl_get_time_stamp(), p_adapter->ipoib_state));\r
shutter_alive( &p_adapter->recv_shutter );\r
}\r
else {\r
- IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,\r
+ IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SHUTTER,\r
("*****Shutter Was not \"Alived\", state = %d*****\n", p_adapter->ipoib_state));\r
}\r
\r
KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
p_adapter->ipoib_state = IPOIB_RUNNING;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u]ipoib_state changed to IPOIB_RUNNING\n",cl_get_time_stamp()) );\r
KeReleaseInStackQueuedSpinLock( &hdl );\r
\r
\r
OUT UINT *p_len);\r
\r
\r
+static void\r
+ __ipoib_complete_reset(\r
+ IN ipoib_adapter_t* const p_adapter,\r
+ IN NDIS_STATUS Status ) \r
+{\r
+ KLOCK_QUEUE_HANDLE hdl;\r
+ \r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ // Check if Reset flag is set or if adapter is in Paused state\r
+ p_adapter->ipoib_state = p_adapter->ipoib_state & ~IPOIB_RESET_OR_DOWN; \r
+ \r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING )\r
+ {\r
+ shutter_alive( &p_adapter->recv_shutter );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state changed to IPOIB_RUNNING after the IPOIB_RESET_OR_DOWN flag was cleared\n") );\r
+\r
+ }\r
+ else \r
+ {\r
+ // This sittuation happened in real life: \r
+ // NDIS called to reset and right after to pause, before the reset was completed\r
+ // Thus, when ipoib will try to complete reset, state may be already changed to IPOIB_PAUSE\r
+ ASSERT( p_adapter->ipoib_state == IPOIB_PAUSED );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state remained IPOIB_PAUSED and will be changed at ipoib_restart()\n") );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
+ \r
+ p_adapter->reset = FALSE;\r
+ NdisMResetComplete(\r
+ p_adapter->h_adapter, Status, TRUE );\r
+}\r
+\r
/* Implementation */\r
ib_api_status_t\r
ipoib_create_adapter(\r
\r
if( p_adapter->reset && p_adapter->state != IB_PNP_PORT_INIT )\r
{\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
}\r
status = IB_SUCCESS;\r
break;\r
{\r
ib_api_status_t status;\r
ib_pnp_handle_t h_pnp;\r
+ KLOCK_QUEUE_HANDLE hdl;\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
h_pnp = p_adapter->h_pnp;\r
p_adapter->h_pnp = NULL;\r
status = p_adapter->p_ifc->dereg_pnp( h_pnp, __ipoib_pnp_dereg );\r
+ \r
// Wait until NDIS will return all indicated NBLs that were received\r
- shutter_shut( &p_adapter->recv_shutter );\r
+ // Avoid shutting the shutter twice\r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING ) {\r
+ shutter_shut( &p_adapter->recv_shutter );\r
+ // Notify that reset started and disable other shutter_shut\r
+ p_adapter->ipoib_state |= IPOIB_RESET_OR_DOWN; \r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u] ipoib_state was IPOIB_RUNNING and IPOIB_RESET_OR_DOWN flag was set \n", cl_get_time_stamp()) );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
+ \r
if( status == IB_SUCCESS )\r
status = IB_NOT_DONE;\r
}\r
p_adapter->reset = TRUE;\r
}\r
else {\r
- p_adapter->reset = FALSE;\r
+ //do not call to __ipoib_complete_reset, because we return completion status directly from here\r
+ p_adapter->reset = FALSE; \r
+ \r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ // Check if Reset flag is set or if adapter is in Paused state\r
+ p_adapter->ipoib_state = p_adapter->ipoib_state & ~IPOIB_RESET_OR_DOWN; \r
+ \r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING )\r
+ {\r
+ shutter_alive( &p_adapter->recv_shutter );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state changed to IPOIB_RUNNING after the IPOIB_RESET_OR_DOWN flag was cleared\n") );\r
+\r
+ }\r
+ else \r
+ {\r
+ // This sittuation happened in real life: \r
+ // NDIS called to reset and right after to pause, before the reset was completed\r
+ // Thus, when ipoib will try to complete reset, state may be already changed to IPOIB_PAUSE\r
+ ASSERT( p_adapter->ipoib_state == IPOIB_PAUSED );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state remained IPOIB_PAUSED and will be changed at ipoib_restart()\n") );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
+ \r
}\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return status;\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("Got RESET\n") );\r
+ ("[%I64u] Got RESET\n", cl_get_time_stamp()) );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u] Got RESET\n", cl_get_time_stamp()) );\r
\r
p_adapter = (ipoib_adapter_t*)context;\r
\r
status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
if( status != IB_SUCCESS )\r
{\r
- p_adapter->reset = FALSE;\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("__ipoib_pnp_reg returned %s\n",\r
p_adapter->p_ifc->get_err_str( status )) );\r
- NdisMResetComplete( \r
- p_adapter->h_adapter, NDIS_STATUS_HARD_ERRORS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_HARD_ERRORS );\r
}\r
}\r
else\r
{\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
status = IB_SUCCESS;\r
}\r
\r
\r
if( p_adapter->reset )\r
{\r
- //ASSERT(FALSE);\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
\r
if( p_adapter->reset )\r
{\r
- p_adapter->reset = FALSE;\r
- NdisMResetComplete(\r
- p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ __ipoib_complete_reset( p_adapter, NDIS_STATUS_SUCCESS );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
CSUM_BYPASS\r
} csum_flag_t;\r
\r
-typedef enum _ipoib_state\r
-{\r
- IPOIB_INIT = -1,\r
- IPOIB_PAUSED,\r
- IPOIB_PAUSING,\r
- IPOIB_RUNNING\r
-} ipoib_state_t;\r
+typedef uint32_t ipoib_state_t;\r
+#define IPOIB_INIT 1\r
+#define IPOIB_PAUSED 2\r
+#define IPOIB_PAUSING 4\r
+#define IPOIB_RUNNING 8\r
+#define IPOIB_RESET_OR_DOWN 16\r
+\r
\r
typedef struct _ipoib_offloads_cap_ {\r
boolean_t lso;\r
WPP_DEFINE_BIT(IPOIB_DBG_OID) \\r
WPP_DEFINE_BIT(IPOIB_DBG_IOCTL) \\r
WPP_DEFINE_BIT(IPOIB_DBG_STAT) \\r
- WPP_DEFINE_BIT(IPOIB_DBG_OBJ))\r
+ WPP_DEFINE_BIT(IPOIB_DBG_OBJ) \\r
+ WPP_DEFINE_BIT(IPOIB_DBG_SHUTTER))\r
\r
\r
\r
/*\r
* Debug macros\r
*/\r
-#define IPOIB_DBG_ERR (1 << 0)\r
-#define IPOIB_DBG_INIT (1 << 1)\r
-#define IPOIB_DBG_PNP (1 << 2)\r
-#define IPOIB_DBG_SEND (1 << 3)\r
-#define IPOIB_DBG_RECV (1 << 4)\r
-#define IPOIB_DBG_ENDPT (1 << 5)\r
-#define IPOIB_DBG_IB (1 << 6)\r
-#define IPOIB_DBG_BUF (1 << 7)\r
-#define IPOIB_DBG_MCAST (1 << 8)\r
-#define IPOIB_DBG_ALLOC (1 << 9)\r
-#define IPOIB_DBG_OID (1 << 10)\r
-#define IPOIB_DBG_IOCTL (1 << 11)\r
-#define IPOIB_DBG_STAT (1 << 12)\r
-#define IPOIB_DBG_OBJ (1 << 13)\r
+#define IPOIB_DBG_ERR (1 << 0)\r
+#define IPOIB_DBG_INIT (1 << 1)\r
+#define IPOIB_DBG_PNP (1 << 2)\r
+#define IPOIB_DBG_SEND (1 << 3)\r
+#define IPOIB_DBG_RECV (1 << 4)\r
+#define IPOIB_DBG_ENDPT (1 << 5)\r
+#define IPOIB_DBG_IB (1 << 6)\r
+#define IPOIB_DBG_BUF (1 << 7)\r
+#define IPOIB_DBG_MCAST (1 << 8)\r
+#define IPOIB_DBG_ALLOC (1 << 9)\r
+#define IPOIB_DBG_OID (1 << 10)\r
+#define IPOIB_DBG_IOCTL (1 << 11)\r
+#define IPOIB_DBG_STAT (1 << 12)\r
+#define IPOIB_DBG_OBJ (1 << 13)\r
+#define IPOIB_DBG_SHUTTER (1 << 14)\r
\r
#define IPOIB_DBG_ERROR (CL_DBG_ERROR | IPOIB_DBG_ERR)\r
#define IPOIB_DBG_ALL CL_DBG_ALL\r
return NDIS_STATUS_FAILURE;\r
}\r
p_adapter->ipoib_state = IPOIB_INIT;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state changed to IPOIB_INIT\n") );\r
\r
status = SetAttributes(p_adapter, h_adapter);\r
if (status != NDIS_STATUS_SUCCESS) {\r
p_adapter = (ipoib_adapter_t*)adapter_context;\r
\r
cl_obj_lock( &p_adapter->obj );\r
- if( p_adapter->ipoib_state == IPOIB_PAUSING ||\r
- p_adapter->ipoib_state == IPOIB_PAUSED)\r
+ if( p_adapter->ipoib_state & IPOIB_PAUSING ||\r
+ p_adapter->ipoib_state & IPOIB_PAUSED)\r
{\r
status = NDIS_STATUS_PAUSED; \r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
IN NDIS_HANDLE adapter_context,\r
IN NDIS_SHUTDOWN_ACTION shutdown_action)\r
{\r
+ KLOCK_QUEUE_HANDLE hdl;\r
+ \r
IPOIB_ENTER( IPOIB_DBG_INIT ) ;\r
UNUSED_PARAM( shutdown_action );\r
\r
("Shutter shut, state = %d\n", p_adapter->ipoib_state));\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
("Shutter shut, state = %d\n", p_adapter->ipoib_state));\r
- shutter_shut ( &p_adapter->recv_shutter );\r
+ // Wait until NDIS will return all indicated NBLs that were received\r
+ // Avoid shutting the shutter twice\r
+ KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ ASSERT ( !(p_adapter->ipoib_state & IPOIB_RESET_OR_DOWN) );\r
+ if ( p_adapter->ipoib_state == IPOIB_RUNNING ) { //ensure that there was no active reset\r
+ shutter_shut( &p_adapter->recv_shutter );\r
+ // Notify that shutter was already shut\r
+ p_adapter->ipoib_state |= IPOIB_RESET_OR_DOWN;\r
+ ASSERT( p_adapter->ipoib_state == IPOIB_RUNNING ); \r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("ipoib_state was IPOIB_RUNNING and IPOIB_RESET_OR_DOWN flag was set\n") );\r
+ }\r
+ KeReleaseInStackQueuedSpinLock( &hdl );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
cl_free( context );\r
}\r
\r
+\r
static NDIS_STATUS \r
ipoib_pause(\r
IN NDIS_HANDLE adapter_context, \r
{\r
ipoib_adapter_t *p_adapter;\r
KLOCK_QUEUE_HANDLE hdl;\r
+ ipoib_state_t prev_state;\r
\r
- UNREFERENCED_PARAMETER(pause_parameters);\r
+ UNREFERENCED_PARAMETER( pause_parameters );\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
- CL_ASSERT(adapter_context);\r
+ CL_ASSERT( adapter_context );\r
p_adapter = (ipoib_adapter_t*)adapter_context;\r
- CL_ASSERT(p_adapter->ipoib_state == IPOIB_RUNNING);\r
-\r
+ \r
KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+ prev_state = p_adapter->ipoib_state;\r
+ CL_ASSERT ( prev_state & IPOIB_RUNNING );\r
p_adapter->ipoib_state = IPOIB_PAUSING;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u]ipoib_state changed to IPOIB_PAUSING\n", cl_get_time_stamp()) );\r
KeReleaseInStackQueuedSpinLock( &hdl );\r
\r
- if (p_adapter->p_port) {\r
+ if ( p_adapter->p_port ) {\r
cl_spinlock_acquire( &p_adapter->p_port->send_lock );\r
- ipoib_port_resume(p_adapter->p_port,FALSE);\r
+ ipoib_port_resume( p_adapter->p_port,FALSE );\r
cl_spinlock_release( &p_adapter->p_port->send_lock );\r
}\r
- \r
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
- ("Shutter shut, state = %d\n", p_adapter->ipoib_state));\r
- shutter_shut ( &p_adapter->recv_shutter );\r
+ if ( prev_state == IPOIB_RUNNING ) { //i.e there was no active reset\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+ ("Shutter shut, state = %d\n", p_adapter->ipoib_state) );\r
+ shutter_shut ( &p_adapter->recv_shutter );\r
+ }\r
+ else {\r
+ ASSERT ( prev_state & IPOIB_RESET_OR_DOWN);\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("[%I64u]Got pause during reset or got reset when IPoIB port wasn't active\n", cl_get_time_stamp()) );\r
+ }\r
\r
KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
p_adapter->ipoib_state = IPOIB_PAUSED;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u]ipoib_state changed to IPOIB_PAUSED\n", cl_get_time_stamp()) );\r
KeReleaseInStackQueuedSpinLock( &hdl );\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
// Check to see if we need to change any attributes\r
}\r
\r
- if ( (p_adapter->ipoib_state == IPOIB_PAUSED) || (p_adapter->ipoib_state == IPOIB_INIT) ) {\r
+ if ( p_adapter->ipoib_state & (IPOIB_PAUSED | IPOIB_INIT) ) {\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
- ("Shutter Alive, ipoib_state = %d\n", p_adapter->ipoib_state));\r
+ ("[%I64u]Shutter Alive, ipoib_state = %d\n", cl_get_time_stamp(), p_adapter->ipoib_state));\r
shutter_alive( &p_adapter->recv_shutter );\r
}\r
else {\r
- IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,\r
+ IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SHUTTER,\r
("*****Shutter Was not \"Alived\", state = %d*****\n", p_adapter->ipoib_state));\r
}\r
\r
KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
p_adapter->ipoib_state = IPOIB_RUNNING;\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,\r
+ ("[%I64u]ipoib_state changed to IPOIB_RUNNING\n",cl_get_time_stamp()) );\r
KeReleaseInStackQueuedSpinLock( &hdl );\r
\r
\r