|
@@ -1198,14 +1198,16 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
|
|
* alloc_wrb_handle - To allocate a wrb handle
|
|
|
* @phba: The hba pointer
|
|
|
* @cid: The cid to use for allocation
|
|
|
+ * @pwrb_context: ptr to ptr to wrb context
|
|
|
*
|
|
|
* 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,
|
|
|
+ struct hwi_wrb_context **pcontext)
|
|
|
{
|
|
|
struct hwi_wrb_context *pwrb_context;
|
|
|
struct hwi_controller *phwi_ctrlr;
|
|
|
- struct wrb_handle *pwrb_handle, *pwrb_handle_tmp;
|
|
|
+ struct wrb_handle *pwrb_handle;
|
|
|
uint16_t cri_index = BE_GET_CRI_FROM_CID(cid);
|
|
|
|
|
|
phwi_ctrlr = phba->phwi_ctrlr;
|
|
@@ -1219,9 +1221,9 @@ struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid)
|
|
|
pwrb_context->alloc_index = 0;
|
|
|
else
|
|
|
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;
|
|
|
+
|
|
|
+ /* Return the context address */
|
|
|
+ *pcontext = pwrb_context;
|
|
|
} else
|
|
|
pwrb_handle = NULL;
|
|
|
return pwrb_handle;
|
|
@@ -4678,6 +4680,7 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
|
|
|
struct beiscsi_offload_params *params)
|
|
|
{
|
|
|
struct wrb_handle *pwrb_handle;
|
|
|
+ struct hwi_wrb_context *pwrb_context = NULL;
|
|
|
struct beiscsi_hba *phba = beiscsi_conn->phba;
|
|
|
struct iscsi_task *task = beiscsi_conn->task;
|
|
|
struct iscsi_session *session = task->conn->session;
|
|
@@ -4692,14 +4695,17 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
|
|
|
beiscsi_cleanup_task(task);
|
|
|
spin_unlock_bh(&session->back_lock);
|
|
|
|
|
|
- pwrb_handle = alloc_wrb_handle(phba, beiscsi_conn->beiscsi_conn_cid);
|
|
|
+ pwrb_handle = alloc_wrb_handle(phba, beiscsi_conn->beiscsi_conn_cid,
|
|
|
+ &pwrb_context);
|
|
|
|
|
|
/* Check for the adapter family */
|
|
|
if (is_chip_be2_be3r(phba))
|
|
|
beiscsi_offload_cxn_v0(params, pwrb_handle,
|
|
|
- phba->init_mem);
|
|
|
+ phba->init_mem,
|
|
|
+ pwrb_context);
|
|
|
else
|
|
|
- beiscsi_offload_cxn_v2(params, pwrb_handle);
|
|
|
+ beiscsi_offload_cxn_v2(params, pwrb_handle,
|
|
|
+ pwrb_context);
|
|
|
|
|
|
be_dws_le_to_cpu(pwrb_handle->pwrb,
|
|
|
sizeof(struct iscsi_target_context_update_wrb));
|
|
@@ -4769,7 +4775,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
|
|
|
goto free_hndls;
|
|
|
}
|
|
|
io_task->pwrb_handle = alloc_wrb_handle(phba,
|
|
|
- beiscsi_conn->beiscsi_conn_cid);
|
|
|
+ beiscsi_conn->beiscsi_conn_cid,
|
|
|
+ &io_task->pwrb_context);
|
|
|
if (!io_task->pwrb_handle) {
|
|
|
beiscsi_log(phba, KERN_ERR,
|
|
|
BEISCSI_LOG_IO | BEISCSI_LOG_CONFIG,
|
|
@@ -4803,7 +4810,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
|
|
|
io_task->psgl_handle;
|
|
|
io_task->pwrb_handle =
|
|
|
alloc_wrb_handle(phba,
|
|
|
- beiscsi_conn->beiscsi_conn_cid);
|
|
|
+ beiscsi_conn->beiscsi_conn_cid,
|
|
|
+ &io_task->pwrb_context);
|
|
|
if (!io_task->pwrb_handle) {
|
|
|
beiscsi_log(phba, KERN_ERR,
|
|
|
BEISCSI_LOG_IO |
|
|
@@ -4839,7 +4847,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
|
|
|
}
|
|
|
io_task->pwrb_handle =
|
|
|
alloc_wrb_handle(phba,
|
|
|
- beiscsi_conn->beiscsi_conn_cid);
|
|
|
+ beiscsi_conn->beiscsi_conn_cid,
|
|
|
+ &io_task->pwrb_context);
|
|
|
if (!io_task->pwrb_handle) {
|
|
|
beiscsi_log(phba, KERN_ERR,
|
|
|
BEISCSI_LOG_IO | BEISCSI_LOG_CONFIG,
|
|
@@ -4925,7 +4934,12 @@ int beiscsi_iotask_v2(struct iscsi_task *task, struct scatterlist *sg,
|
|
|
|
|
|
hwi_write_sgl_v2(pwrb, sg, num_sg, io_task);
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb_v2, ptr2nextwrb, pwrb,
|
|
|
- io_task->pwrb_handle->nxt_wrb_index);
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ if (io_task->pwrb_context->plast_wrb)
|
|
|
+ AMAP_SET_BITS(struct amap_iscsi_wrb_v2, ptr2nextwrb,
|
|
|
+ io_task->pwrb_context->plast_wrb,
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ io_task->pwrb_context->plast_wrb = pwrb;
|
|
|
|
|
|
be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_wrb));
|
|
|
|
|
@@ -4982,7 +4996,13 @@ static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg,
|
|
|
hwi_write_sgl(pwrb, sg, num_sg, io_task);
|
|
|
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb, pwrb,
|
|
|
- io_task->pwrb_handle->nxt_wrb_index);
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ if (io_task->pwrb_context->plast_wrb)
|
|
|
+ AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb,
|
|
|
+ io_task->pwrb_context->plast_wrb,
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ io_task->pwrb_context->plast_wrb = pwrb;
|
|
|
+
|
|
|
be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_wrb));
|
|
|
|
|
|
doorbell |= beiscsi_conn->beiscsi_conn_cid & DB_WRB_POST_CID_MASK;
|
|
@@ -5020,7 +5040,13 @@ static int beiscsi_mtask(struct iscsi_task *task)
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb, r2t_exp_dtl, pwrb,
|
|
|
task->data_count);
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb, pwrb,
|
|
|
- io_task->pwrb_handle->nxt_wrb_index);
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ if (io_task->pwrb_context->plast_wrb)
|
|
|
+ AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb,
|
|
|
+ io_task->pwrb_context->plast_wrb,
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ io_task->pwrb_context->plast_wrb = pwrb;
|
|
|
+
|
|
|
pwrb_typeoffset = BE_WRB_TYPE_OFFSET;
|
|
|
} else {
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb_v2, cmdsn_itt, pwrb,
|
|
@@ -5032,7 +5058,13 @@ static int beiscsi_mtask(struct iscsi_task *task)
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb_v2, r2t_exp_dtl, pwrb,
|
|
|
task->data_count);
|
|
|
AMAP_SET_BITS(struct amap_iscsi_wrb_v2, ptr2nextwrb, pwrb,
|
|
|
- io_task->pwrb_handle->nxt_wrb_index);
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ if (io_task->pwrb_context->plast_wrb)
|
|
|
+ AMAP_SET_BITS(struct amap_iscsi_wrb_v2, ptr2nextwrb,
|
|
|
+ io_task->pwrb_context->plast_wrb,
|
|
|
+ io_task->pwrb_handle->wrb_index);
|
|
|
+ io_task->pwrb_context->plast_wrb = pwrb;
|
|
|
+
|
|
|
pwrb_typeoffset = SKH_WRB_TYPE_OFFSET;
|
|
|
}
|
|
|
|