Skip to content

Commit

Permalink
scsi: bnx2fc: Handle scope bits when array returns BUSY or TSF
Browse files Browse the repository at this point in the history
The qla2xxx driver had this issue as well when the newer array firmware
returned the retry_delay_timer in the fcp_rsp.  The bnx2fc is not handling
the masking of the scope bits either so the retry_delay_timestamp value
lands up being a large value added to the timer timestamp delaying I/O for
up to 27 Minutes.  This patch adds similar code to handle this to the
bnx2fc driver to avoid the huge delay.

Link: https://lore.kernel.org/r/1568210202-12794-1-git-send-email-loberman@redhat.com
Signed-off-by: Laurence Oberman <loberman@redhat.com>
Reported-by: David Jeffery <djeffery@redhat.com>
Reported-by: kbuild test robot <lkp@intel.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Laurence Oberman authored and Martin K. Petersen committed Sep 24, 2019
1 parent e74006e commit c9c5374
Showing 1 changed file with 24 additions and 5 deletions.
29 changes: 24 additions & 5 deletions drivers/scsi/bnx2fc/bnx2fc_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1923,6 +1923,7 @@ void bnx2fc_process_scsi_cmd_compl(struct bnx2fc_cmd *io_req,
struct fcoe_fcp_rsp_payload *fcp_rsp;
struct bnx2fc_rport *tgt = io_req->tgt;
struct scsi_cmnd *sc_cmd;
u16 scope = 0, qualifier = 0;

/* scsi_cmd_cmpl is called with tgt lock held */

Expand Down Expand Up @@ -1990,12 +1991,30 @@ void bnx2fc_process_scsi_cmd_compl(struct bnx2fc_cmd *io_req,

if (io_req->cdb_status == SAM_STAT_TASK_SET_FULL ||
io_req->cdb_status == SAM_STAT_BUSY) {
/* Set the jiffies + retry_delay_timer * 100ms
for the rport/tgt */
tgt->retry_delay_timestamp = jiffies +
fcp_rsp->retry_delay_timer * HZ / 10;
/* Newer array firmware with BUSY or
* TASK_SET_FULL may return a status that needs
* the scope bits masked.
* Or a huge delay timestamp up to 27 minutes
* can result.
*/
if (fcp_rsp->retry_delay_timer) {
/* Upper 2 bits */
scope = fcp_rsp->retry_delay_timer
& 0xC000;
/* Lower 14 bits */
qualifier = fcp_rsp->retry_delay_timer
& 0x3FFF;
}
if (scope > 0 && qualifier > 0 &&
qualifier <= 0x3FEF) {
/* Set the jiffies +
* retry_delay_timer * 100ms
* for the rport/tgt
*/
tgt->retry_delay_timestamp = jiffies +
(qualifier * HZ / 10);
}
}

}
if (io_req->fcp_resid)
scsi_set_resid(sc_cmd, io_req->fcp_resid);
Expand Down

0 comments on commit c9c5374

Please sign in to comment.