diff options
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_verbs.c')
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_verbs.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index ede1475bee0..e28877c4ce1 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
@@ -155,20 +155,39 @@ static int iser_create_ib_conn_res(struct iser_conn *ib_conn) | |||
155 | { | 155 | { |
156 | struct iser_device *device; | 156 | struct iser_device *device; |
157 | struct ib_qp_init_attr init_attr; | 157 | struct ib_qp_init_attr init_attr; |
158 | int ret = -ENOMEM; | 158 | int req_err, resp_err, ret = -ENOMEM; |
159 | struct ib_fmr_pool_param params; | 159 | struct ib_fmr_pool_param params; |
160 | 160 | ||
161 | BUG_ON(ib_conn->device == NULL); | 161 | BUG_ON(ib_conn->device == NULL); |
162 | 162 | ||
163 | device = ib_conn->device; | 163 | device = ib_conn->device; |
164 | 164 | ||
165 | ib_conn->login_buf = kmalloc(ISER_RX_LOGIN_SIZE, GFP_KERNEL); | 165 | ib_conn->login_buf = kmalloc(ISCSI_DEF_MAX_RECV_SEG_LEN + |
166 | ISER_RX_LOGIN_SIZE, GFP_KERNEL); | ||
166 | if (!ib_conn->login_buf) | 167 | if (!ib_conn->login_buf) |
167 | goto out_err; | 168 | goto out_err; |
168 | 169 | ||
169 | ib_conn->login_dma = ib_dma_map_single(ib_conn->device->ib_device, | 170 | ib_conn->login_req_buf = ib_conn->login_buf; |
170 | (void *)ib_conn->login_buf, ISER_RX_LOGIN_SIZE, | 171 | ib_conn->login_resp_buf = ib_conn->login_buf + ISCSI_DEF_MAX_RECV_SEG_LEN; |
171 | DMA_FROM_DEVICE); | 172 | |
173 | ib_conn->login_req_dma = ib_dma_map_single(ib_conn->device->ib_device, | ||
174 | (void *)ib_conn->login_req_buf, | ||
175 | ISCSI_DEF_MAX_RECV_SEG_LEN, DMA_TO_DEVICE); | ||
176 | |||
177 | ib_conn->login_resp_dma = ib_dma_map_single(ib_conn->device->ib_device, | ||
178 | (void *)ib_conn->login_resp_buf, | ||
179 | ISER_RX_LOGIN_SIZE, DMA_FROM_DEVICE); | ||
180 | |||
181 | req_err = ib_dma_mapping_error(device->ib_device, ib_conn->login_req_dma); | ||
182 | resp_err = ib_dma_mapping_error(device->ib_device, ib_conn->login_resp_dma); | ||
183 | |||
184 | if (req_err || resp_err) { | ||
185 | if (req_err) | ||
186 | ib_conn->login_req_dma = 0; | ||
187 | if (resp_err) | ||
188 | ib_conn->login_resp_dma = 0; | ||
189 | goto out_err; | ||
190 | } | ||
172 | 191 | ||
173 | ib_conn->page_vec = kmalloc(sizeof(struct iser_page_vec) + | 192 | ib_conn->page_vec = kmalloc(sizeof(struct iser_page_vec) + |
174 | (sizeof(u64) * (ISCSI_ISER_SG_TABLESIZE +1)), | 193 | (sizeof(u64) * (ISCSI_ISER_SG_TABLESIZE +1)), |
@@ -658,11 +677,11 @@ int iser_post_recvl(struct iser_conn *ib_conn) | |||
658 | struct ib_sge sge; | 677 | struct ib_sge sge; |
659 | int ib_ret; | 678 | int ib_ret; |
660 | 679 | ||
661 | sge.addr = ib_conn->login_dma; | 680 | sge.addr = ib_conn->login_resp_dma; |
662 | sge.length = ISER_RX_LOGIN_SIZE; | 681 | sge.length = ISER_RX_LOGIN_SIZE; |
663 | sge.lkey = ib_conn->device->mr->lkey; | 682 | sge.lkey = ib_conn->device->mr->lkey; |
664 | 683 | ||
665 | rx_wr.wr_id = (unsigned long)ib_conn->login_buf; | 684 | rx_wr.wr_id = (unsigned long)ib_conn->login_resp_buf; |
666 | rx_wr.sg_list = &sge; | 685 | rx_wr.sg_list = &sge; |
667 | rx_wr.num_sge = 1; | 686 | rx_wr.num_sge = 1; |
668 | rx_wr.next = NULL; | 687 | rx_wr.next = NULL; |