]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[IPoiB_NDIS6_CM]
authorStan Smith <stan.smith@intel.com>
Mon, 1 Nov 2010 23:09:41 +0000 (23:09 +0000)
committerStan Smith <stan.smith@intel.com>
Mon, 1 Nov 2010 23:09:41 +0000 (23:09 +0000)
1. Main fix: handling a situation when NDIS sends ‘pause’ command before the ‘reset’ command was completed
2. Debug prints improvements
3. Time notification was added to IPOIB_DBG_SHUTTER printouts, because of timestamp importance in this case. These debug prints are not in data path, so it’s safe to use them here.

signed-off-by: Alex Naslednikov [xalex@mellanox.co.il], stan.smith <stan.smith@intel.com>

git-svn-id: svn://openib.tc.cornell.edu/gen1@2977 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

branches/WOF2-3/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
branches/WOF2-3/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
branches/WOF2-3/ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h
branches/WOF2-3/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp
trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h
trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp

index a7f846c325becdd59efc9c405cbb70bbcb22caa2..94e32eb4db316c5b190a3c096a301f2ed8b68de9 100644 (file)
@@ -111,6 +111,40 @@ ipoib_get_adapter_params(
        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
@@ -800,9 +834,7 @@ __ipoib_pnp_cb(
 \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
@@ -978,6 +1010,7 @@ ipoib_reset_adapter(
 {\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
@@ -992,8 +1025,19 @@ ipoib_reset_adapter(
                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
@@ -1007,7 +1051,31 @@ ipoib_reset_adapter(
                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
@@ -1042,7 +1110,9 @@ __ipoib_adapter_reset(
        \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
@@ -1074,19 +1144,15 @@ __ipoib_adapter_reset(
                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
@@ -1261,10 +1327,7 @@ ipoib_set_active(
 \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
@@ -1323,9 +1386,7 @@ ipoib_set_inactive(
 \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
index cbfb7919cdbd19fbc5d125129619de67e7dade81..22a0429605bc3b6dae4473e427aa6b8f0b386795 100644 (file)
@@ -70,13 +70,13 @@ typedef enum
        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
index adb5026cf676660821aa715caf76862b7afaeb00..d45f90541dc5e10c20762e970d193c3d4719980a 100644 (file)
@@ -73,7 +73,8 @@ extern uint32_t               g_ipoib_dbg_flags;
        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
@@ -103,20 +104,21 @@ extern uint32_t           g_ipoib_dbg_flags;
 /*\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
index 8052792bf79be60103568790fcc7c7e632fe18dd..dd5864f57be7ce6f07a5c94d6bf4c3f6558f47b3 100644 (file)
@@ -1877,6 +1877,8 @@ if(cl_get_time_stamp_sec() < 30) {
                        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
@@ -3155,8 +3157,8 @@ ipoib_send_net_buffer_list(
        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
@@ -3275,6 +3277,8 @@ ipoib_shutdown_ex(
        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
@@ -3287,7 +3291,19 @@ ipoib_shutdown_ex(
                        ("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
@@ -3965,6 +3981,7 @@ __ipoib_ats_dereg_cb(
        cl_free( context );\r
 }\r
 \r
+\r
 static NDIS_STATUS \r
 ipoib_pause(\r
        IN      NDIS_HANDLE                                             adapter_context,        \r
@@ -3972,30 +3989,42 @@ ipoib_pause(
 {\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
@@ -4025,18 +4054,20 @@ ipoib_restart(
                // 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
index a7f846c325becdd59efc9c405cbb70bbcb22caa2..94e32eb4db316c5b190a3c096a301f2ed8b68de9 100644 (file)
@@ -111,6 +111,40 @@ ipoib_get_adapter_params(
        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
@@ -800,9 +834,7 @@ __ipoib_pnp_cb(
 \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
@@ -978,6 +1010,7 @@ ipoib_reset_adapter(
 {\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
@@ -992,8 +1025,19 @@ ipoib_reset_adapter(
                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
@@ -1007,7 +1051,31 @@ ipoib_reset_adapter(
                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
@@ -1042,7 +1110,9 @@ __ipoib_adapter_reset(
        \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
@@ -1074,19 +1144,15 @@ __ipoib_adapter_reset(
                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
@@ -1261,10 +1327,7 @@ ipoib_set_active(
 \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
@@ -1323,9 +1386,7 @@ ipoib_set_inactive(
 \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
index cbfb7919cdbd19fbc5d125129619de67e7dade81..22a0429605bc3b6dae4473e427aa6b8f0b386795 100644 (file)
@@ -70,13 +70,13 @@ typedef enum
        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
index adb5026cf676660821aa715caf76862b7afaeb00..d45f90541dc5e10c20762e970d193c3d4719980a 100644 (file)
@@ -73,7 +73,8 @@ extern uint32_t               g_ipoib_dbg_flags;
        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
@@ -103,20 +104,21 @@ extern uint32_t           g_ipoib_dbg_flags;
 /*\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
index 8052792bf79be60103568790fcc7c7e632fe18dd..dd5864f57be7ce6f07a5c94d6bf4c3f6558f47b3 100644 (file)
@@ -1877,6 +1877,8 @@ if(cl_get_time_stamp_sec() < 30) {
                        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
@@ -3155,8 +3157,8 @@ ipoib_send_net_buffer_list(
        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
@@ -3275,6 +3277,8 @@ ipoib_shutdown_ex(
        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
@@ -3287,7 +3291,19 @@ ipoib_shutdown_ex(
                        ("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
@@ -3965,6 +3981,7 @@ __ipoib_ats_dereg_cb(
        cl_free( context );\r
 }\r
 \r
+\r
 static NDIS_STATUS \r
 ipoib_pause(\r
        IN      NDIS_HANDLE                                             adapter_context,        \r
@@ -3972,30 +3989,42 @@ ipoib_pause(
 {\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
@@ -4025,18 +4054,20 @@ ipoib_restart(
                // 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