Commit 1868379b authored by Jitendra Bhivare's avatar Jitendra Bhivare Committed by Martin K. Petersen

be2iscsi: Fix ExpStatSn in management tasks

Connection resets observed from some targets when NOP-Out with wrong
ExpStatSn is sent.

FW keeps track of StatSn and fills up ExpStatSn accordingly.  The header
filled up by the stack needs to be modified by driver to clear
ExpStatSn. If the field is not cleared, FW recalculates ExpStatSn and
wrong offset'ed ExpStatSn is seen in the wire trace.
Signed-off-by: default avatarJitendra Bhivare <jitendra.bhivare@broadcom.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 090e2184
...@@ -4926,7 +4926,6 @@ int beiscsi_iotask_v2(struct iscsi_task *task, struct scatterlist *sg, ...@@ -4926,7 +4926,6 @@ int beiscsi_iotask_v2(struct iscsi_task *task, struct scatterlist *sg,
pwrb = io_task->pwrb_handle->pwrb; pwrb = io_task->pwrb_handle->pwrb;
io_task->cmd_bhs->iscsi_hdr.exp_statsn = 0;
io_task->bhs_len = sizeof(struct be_cmd_bhs); io_task->bhs_len = sizeof(struct be_cmd_bhs);
if (writedir) { if (writedir) {
...@@ -4987,7 +4986,6 @@ static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg, ...@@ -4987,7 +4986,6 @@ static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg,
unsigned int doorbell = 0; unsigned int doorbell = 0;
pwrb = io_task->pwrb_handle->pwrb; pwrb = io_task->pwrb_handle->pwrb;
io_task->cmd_bhs->iscsi_hdr.exp_statsn = 0;
io_task->bhs_len = sizeof(struct be_cmd_bhs); io_task->bhs_len = sizeof(struct be_cmd_bhs);
if (writedir) { if (writedir) {
...@@ -5159,23 +5157,21 @@ static int beiscsi_task_xmit(struct iscsi_task *task) ...@@ -5159,23 +5157,21 @@ static int beiscsi_task_xmit(struct iscsi_task *task)
{ {
struct beiscsi_io_task *io_task = task->dd_data; struct beiscsi_io_task *io_task = task->dd_data;
struct scsi_cmnd *sc = task->sc; struct scsi_cmnd *sc = task->sc;
struct beiscsi_hba *phba = NULL; struct beiscsi_hba *phba;
struct scatterlist *sg; struct scatterlist *sg;
int num_sg; int num_sg;
unsigned int writedir = 0, xferlen = 0; unsigned int writedir = 0, xferlen = 0;
phba = ((struct beiscsi_conn *)task->conn->dd_data)->phba; if (!io_task->conn->login_in_progress)
task->hdr->exp_statsn = 0;
if (!sc) if (!sc)
return beiscsi_mtask(task); return beiscsi_mtask(task);
io_task->scsi_cmnd = sc; io_task->scsi_cmnd = sc;
num_sg = scsi_dma_map(sc); num_sg = scsi_dma_map(sc);
phba = io_task->conn->phba;
if (num_sg < 0) { if (num_sg < 0) {
struct iscsi_conn *conn = task->conn;
struct beiscsi_hba *phba = NULL;
phba = ((struct beiscsi_conn *)conn->dd_data)->phba;
beiscsi_log(phba, KERN_ERR, beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_IO | BEISCSI_LOG_ISCSI, BEISCSI_LOG_IO | BEISCSI_LOG_ISCSI,
"BM_%d : scsi_dma_map Failed " "BM_%d : scsi_dma_map Failed "
......
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