diff options
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_initiator.c')
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_initiator.c | 30 |
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 | ||
173 | static int iser_alloc_rx_descriptors(struct iser_conn *ib_conn) | 173 | int 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 | /** | 233 | static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req) |
234 | * iser_conn_set_full_featured_mode - (iSER API) | ||
235 | */ | ||
236 | int 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); |