aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/iser/iser_initiator.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_initiator.c')
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index 622e9857c869..a00ccd1ca333 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -170,7 +170,7 @@ static void iser_create_send_desc(struct iser_conn *ib_conn,
170} 170}
171 171
172 172
173static int iser_alloc_rx_descriptors(struct iser_conn *ib_conn) 173int iser_alloc_rx_descriptors(struct iser_conn *ib_conn)
174{ 174{
175 int i, j; 175 int i, j;
176 u64 dma_addr; 176 u64 dma_addr;
@@ -230,23 +230,24 @@ void iser_free_rx_descriptors(struct iser_conn *ib_conn)
230 kfree(ib_conn->rx_descs); 230 kfree(ib_conn->rx_descs);
231} 231}
232 232
233/** 233static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req)
234 * iser_conn_set_full_featured_mode - (iSER API)
235 */
236int iser_conn_set_full_featured_mode(struct iscsi_conn *conn)
237{ 234{
238 struct iscsi_iser_conn *iser_conn = conn->dd_data; 235 struct iscsi_iser_conn *iser_conn = conn->dd_data;
239 236
240 iser_dbg("Initially post: %d\n", ISER_MIN_POSTED_RX); 237 iser_dbg("req op %x flags %x\n", req->opcode, req->flags);
241 238 /* check if this is the last login - going to full feature phase */
242 /* Check that there is no posted recv or send buffers left - */ 239 if ((req->flags & ISCSI_FULL_FEATURE_PHASE) != ISCSI_FULL_FEATURE_PHASE)
243 /* they must be consumed during the login phase */ 240 return 0;
244 BUG_ON(iser_conn->ib_conn->post_recv_buf_count != 0);
245 BUG_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0);
246 241
247 if (iser_alloc_rx_descriptors(iser_conn->ib_conn)) 242 /*
248 return -ENOMEM; 243 * Check that there is one posted recv buffer (for the last login
244 * response) and no posted send buffers left - they must have been
245 * consumed during previous login phases.
246 */
247 WARN_ON(iser_conn->ib_conn->post_recv_buf_count != 1);
248 WARN_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0);
249 249
250 iser_dbg("Initially post: %d\n", ISER_MIN_POSTED_RX);
250 /* Initial post receive buffers */ 251 /* Initial post receive buffers */
251 if (iser_post_recvm(iser_conn->ib_conn, ISER_MIN_POSTED_RX)) 252 if (iser_post_recvm(iser_conn->ib_conn, ISER_MIN_POSTED_RX))
252 return -ENOMEM; 253 return -ENOMEM;
@@ -426,6 +427,9 @@ int iser_send_control(struct iscsi_conn *conn,
426 err = iser_post_recvl(iser_conn->ib_conn); 427 err = iser_post_recvl(iser_conn->ib_conn);
427 if (err) 428 if (err)
428 goto send_control_error; 429 goto send_control_error;
430 err = iser_post_rx_bufs(conn, task->hdr);
431 if (err)
432 goto send_control_error;
429 } 433 }
430 434
431 err = iser_post_send(iser_conn->ib_conn, mdesc); 435 err = iser_post_send(iser_conn->ib_conn, mdesc);