Commit d5431488 authored by Jayamohan Kallickal's avatar Jayamohan Kallickal Committed by James Bottomley

[SCSI] be2iscsi: Link Wrb with next Wrb

This patch will link the current allocated wrb with the next
 wrb that will be allocated. This is a requirement from the chip.
Signed-off-by: default avatarJayamohan Kallickal <jayamohank@serverengines.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent c2462288
...@@ -629,29 +629,30 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) ...@@ -629,29 +629,30 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
* alloc_wrb_handle - To allocate a wrb handle * alloc_wrb_handle - To allocate a wrb handle
* @phba: The hba pointer * @phba: The hba pointer
* @cid: The cid to use for allocation * @cid: The cid to use for allocation
* @index: index allocation and wrb index
* *
* This happens under session_lock until submission to chip * This happens under session_lock until submission to chip
*/ */
struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid, struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid)
int index)
{ {
struct hwi_wrb_context *pwrb_context; struct hwi_wrb_context *pwrb_context;
struct hwi_controller *phwi_ctrlr; struct hwi_controller *phwi_ctrlr;
struct wrb_handle *pwrb_handle; struct wrb_handle *pwrb_handle, *pwrb_handle_tmp;
phwi_ctrlr = phba->phwi_ctrlr; phwi_ctrlr = phba->phwi_ctrlr;
pwrb_context = &phwi_ctrlr->wrb_context[cid]; pwrb_context = &phwi_ctrlr->wrb_context[cid];
if (pwrb_context->wrb_handles_available) { if (pwrb_context->wrb_handles_available >= 2) {
pwrb_handle = pwrb_context->pwrb_handle_base[ pwrb_handle = pwrb_context->pwrb_handle_base[
pwrb_context->alloc_index]; pwrb_context->alloc_index];
pwrb_context->wrb_handles_available--; pwrb_context->wrb_handles_available--;
pwrb_handle->nxt_wrb_index = pwrb_handle->wrb_index;
if (pwrb_context->alloc_index == if (pwrb_context->alloc_index ==
(phba->params.wrbs_per_cxn - 1)) (phba->params.wrbs_per_cxn - 1))
pwrb_context->alloc_index = 0; pwrb_context->alloc_index = 0;
else else
pwrb_context->alloc_index++; pwrb_context->alloc_index++;
pwrb_handle_tmp = pwrb_context->pwrb_handle_base[
pwrb_context->alloc_index];
pwrb_handle->nxt_wrb_index = pwrb_handle_tmp->wrb_index;
} else } else
pwrb_handle = NULL; pwrb_handle = NULL;
return pwrb_handle; return pwrb_handle;
...@@ -3206,7 +3207,7 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn, ...@@ -3206,7 +3207,7 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
* login/startup related tasks. * login/startup related tasks.
*/ */
pwrb_handle = alloc_wrb_handle(phba, (beiscsi_conn->beiscsi_conn_cid - pwrb_handle = alloc_wrb_handle(phba, (beiscsi_conn->beiscsi_conn_cid -
phba->fw_config.iscsi_cid_start), 0); phba->fw_config.iscsi_cid_start));
pwrb = (struct iscsi_target_context_update_wrb *)pwrb_handle->pwrb; pwrb = (struct iscsi_target_context_update_wrb *)pwrb_handle->pwrb;
memset(pwrb, 0, sizeof(*pwrb)); memset(pwrb, 0, sizeof(*pwrb));
AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
...@@ -3316,8 +3317,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode) ...@@ -3316,8 +3317,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
io_task->libiscsi_itt = (itt_t)task->itt; io_task->libiscsi_itt = (itt_t)task->itt;
io_task->pwrb_handle = alloc_wrb_handle(phba, io_task->pwrb_handle = alloc_wrb_handle(phba,
beiscsi_conn->beiscsi_conn_cid - beiscsi_conn->beiscsi_conn_cid -
phba->fw_config.iscsi_cid_start, phba->fw_config.iscsi_cid_start
task->itt); );
io_task->conn = beiscsi_conn; io_task->conn = beiscsi_conn;
task->hdr = (struct iscsi_hdr *)&io_task->cmd_bhs->iscsi_hdr; task->hdr = (struct iscsi_hdr *)&io_task->cmd_bhs->iscsi_hdr;
......
...@@ -651,8 +651,7 @@ struct amap_iscsi_wrb { ...@@ -651,8 +651,7 @@ struct amap_iscsi_wrb {
} __packed; } __packed;
struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid, struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid);
int index);
void void
free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle); free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment