/* Posts receive buffers to the receive queue. */\r
static ib_api_status_t\r
__recv_mgr_repost(\r
- IN ipoib_port_t* const p_port,\r
- IN uint32_t num_wrs );\r
+ IN ipoib_port_t* const p_port );\r
\r
static void\r
__recv_cb(\r
/* Posts receive buffers to the receive queue. */\r
static ib_api_status_t\r
__recv_mgr_repost(\r
- IN ipoib_port_t* const p_port,\r
- IN uint32_t num_wrs )\r
+ IN ipoib_port_t* const p_port )\r
{\r
ipoib_recv_desc_t *p_head = NULL, *p_tail = NULL, *p_next;\r
ib_api_status_t status;\r
IPOIB_ENTER( IPOIB_DBG_RECV );\r
\r
CL_ASSERT( p_port );\r
- CL_ASSERT( num_wrs );\r
cl_obj_lock( &p_port->obj );\r
- if( p_port->state == IB_QPS_ERROR )\r
+ if( p_port->state != IB_QPS_RTS )\r
{\r
cl_obj_unlock( &p_port->obj );\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
cl_obj_ref( &p_port->obj );\r
cl_obj_unlock( &p_port->obj );\r
\r
- while( num_wrs-- )\r
+ while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth )\r
{\r
- if( p_port->recv_mgr.depth == p_port->p_adapter->params.rq_depth )\r
- {\r
- IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
- ("Receive queue already full\n") );\r
- break;\r
- }\r
-\r
/* Pull receives out of the pool and chain them up. */\r
cl_perf_start( GetRecv );\r
p_next = __buf_mgr_get_recv( p_port );\r
\r
/* Repost buffers. */\r
cl_perf_start( ReturnRepostRecv );\r
- __recv_mgr_repost( p_port, 0xFFFF );\r
+ __recv_mgr_repost( p_port );\r
cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );\r
\r
/* Complete any additional receives waiting for a packet. */\r
\r
/* Repost receives. */\r
cl_perf_start( RepostRecv );\r
- __recv_mgr_repost( p_port, recv_cnt );\r
+ __recv_mgr_repost( p_port );\r
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );\r
\r
cl_spinlock_release( &p_port->recv_lock );\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
- /* Mark our state. This causes all callbacks to abort. */\r
+ /*\r
+ * Mark our state. This causes all callbacks to abort.\r
+ * Note that we hold the receive lock so that we synchronize\r
+ * with reposting. We must take the receive lock before the\r
+ * object lock since that is the order taken when reposting.\r
+ */\r
+ cl_spinlock_acquire( &p_port->recv_lock );\r
cl_obj_lock( &p_port->obj );\r
p_port->state = IB_QPS_ERROR;\r
\r
p_port->ib_mgr.h_query = NULL;\r
}\r
cl_obj_unlock( &p_port->obj );\r
+ cl_spinlock_release( &p_port->recv_lock );\r
\r
KeWaitForSingleObject(\r
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );\r
p_port->state = IB_QPS_RTS;\r
cl_obj_unlock( &p_port->obj );\r
\r
+ /* Prepost receives. */\r
+ cl_spinlock_acquire( &p_port->recv_lock );\r
+ __recv_mgr_repost( p_port );\r
+ cl_spinlock_release( &p_port->recv_lock );\r
+\r
/* Notify the adapter that we now have an active connection. */\r
ipoib_set_active( p_port->p_adapter );\r
\r
return status;\r
}\r
\r
- /* Prepost receives. */\r
- cl_spinlock_acquire( &p_port->recv_lock );\r
- __recv_mgr_repost( p_port, p_port->p_adapter->params.rq_depth );\r
- cl_spinlock_release( &p_port->recv_lock );\r
-\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return IB_SUCCESS;\r
}\r