mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-21 20:51:27 +00:00
qla2x00t-32gbit: Introduce qla2xxx_get_next_handle()
This patch reduces code duplication.
[ commit bcc856574356df2eb5eb2d4491e7205339e55728 upstream ]
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8547 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -278,6 +278,7 @@ extern void qla2x00_build_scsi_iocbs_32(srb_t *, cmd_entry_t *, uint16_t);
|
||||
extern void qla2x00_build_scsi_iocbs_64(srb_t *, cmd_entry_t *, uint16_t);
|
||||
extern void qla24xx_build_scsi_iocbs(srb_t *, struct cmd_type_7 *,
|
||||
uint16_t, struct req_que *);
|
||||
extern uint32_t qla2xxx_get_next_handle(struct req_que *req);
|
||||
extern int qla2x00_start_scsi(srb_t *sp);
|
||||
extern int qla24xx_start_scsi(srb_t *sp);
|
||||
int qla2x00_marker(struct scsi_qla_host *, struct qla_qpair *,
|
||||
|
||||
@@ -292,6 +292,26 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the first handle that is not in use, starting from
|
||||
* req->current_outstanding_cmd + 1. The caller must hold the lock that is
|
||||
* associated with @req.
|
||||
*/
|
||||
uint32_t qla2xxx_get_next_handle(struct req_que *req)
|
||||
{
|
||||
uint32_t index, handle = req->current_outstanding_cmd;
|
||||
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
return handle;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* qla2x00_start_scsi() - Send a SCSI command to the ISP
|
||||
* @sp: command to send to the ISP
|
||||
@@ -306,7 +326,6 @@ qla2x00_start_scsi(srb_t *sp)
|
||||
scsi_qla_host_t *vha;
|
||||
struct scsi_cmnd *cmd;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
cmd_entry_t *cmd_pkt;
|
||||
uint16_t cnt;
|
||||
@@ -339,16 +358,8 @@ qla2x00_start_scsi(srb_t *sp)
|
||||
/* Acquire ring specific lock */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Map the sg table so we have an accurate count of sg entries needed */
|
||||
@@ -1590,7 +1601,6 @@ qla24xx_start_scsi(srb_t *sp)
|
||||
int nseg;
|
||||
unsigned long flags;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
struct cmd_type_7 *cmd_pkt;
|
||||
uint16_t cnt;
|
||||
@@ -1618,16 +1628,8 @@ qla24xx_start_scsi(srb_t *sp)
|
||||
/* Acquire ring specific lock */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Map the sg table so we have an accurate count of sg entries needed */
|
||||
@@ -1730,7 +1732,6 @@ qla24xx_dif_start_scsi(srb_t *sp)
|
||||
int nseg;
|
||||
unsigned long flags;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
uint16_t cnt;
|
||||
uint16_t req_cnt = 0;
|
||||
@@ -1771,17 +1772,8 @@ qla24xx_dif_start_scsi(srb_t *sp)
|
||||
/* Acquire ring specific lock */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Compute number of required data segments */
|
||||
@@ -1926,7 +1918,6 @@ qla2xxx_start_scsi_mq(srb_t *sp)
|
||||
int nseg;
|
||||
unsigned long flags;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
struct cmd_type_7 *cmd_pkt;
|
||||
uint16_t cnt;
|
||||
@@ -1957,16 +1948,8 @@ qla2xxx_start_scsi_mq(srb_t *sp)
|
||||
vha->marker_needed = 0;
|
||||
}
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Map the sg table so we have an accurate count of sg entries needed */
|
||||
@@ -2070,7 +2053,6 @@ qla2xxx_dif_start_scsi_mq(srb_t *sp)
|
||||
int nseg;
|
||||
unsigned long flags;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
uint16_t cnt;
|
||||
uint16_t req_cnt = 0;
|
||||
@@ -2125,17 +2107,8 @@ qla2xxx_dif_start_scsi_mq(srb_t *sp)
|
||||
vha->marker_needed = 0;
|
||||
}
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Compute number of required data segments */
|
||||
@@ -2282,7 +2255,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct req_que *req = qpair->req;
|
||||
device_reg_t *reg = ISP_QUE_REG(ha, req->id);
|
||||
uint32_t index, handle;
|
||||
uint32_t handle;
|
||||
request_t *pkt;
|
||||
uint16_t cnt, req_cnt;
|
||||
|
||||
@@ -2322,16 +2295,8 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
|
||||
goto queuing_error;
|
||||
|
||||
if (sp) {
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
if (index == req->num_outstanding_cmds) {
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0) {
|
||||
ql_log(ql_log_warn, vha, 0x700b,
|
||||
"No room on outstanding cmd array.\n");
|
||||
goto queuing_error;
|
||||
@@ -3124,7 +3089,6 @@ qla82xx_start_scsi(srb_t *sp)
|
||||
unsigned long flags;
|
||||
struct scsi_cmnd *cmd;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
uint16_t cnt;
|
||||
uint16_t req_cnt;
|
||||
@@ -3164,16 +3128,8 @@ qla82xx_start_scsi(srb_t *sp)
|
||||
/* Acquire ring specific lock */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Map the sg table so we have an accurate count of sg entries needed */
|
||||
@@ -3785,7 +3741,6 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds)
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
unsigned long flags;
|
||||
uint32_t handle;
|
||||
uint32_t index;
|
||||
uint16_t req_cnt;
|
||||
uint16_t cnt;
|
||||
uint32_t *clr_ptr;
|
||||
@@ -3810,17 +3765,8 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds)
|
||||
/* Acquire ring specific lock */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
|
||||
if (index == req->num_outstanding_cmds) {
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0) {
|
||||
rval = EXT_STATUS_BUSY;
|
||||
goto queuing_error;
|
||||
}
|
||||
|
||||
@@ -3086,7 +3086,6 @@ qlafx00_start_scsi(srb_t *sp)
|
||||
{
|
||||
int nseg;
|
||||
unsigned long flags;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
uint16_t cnt;
|
||||
uint16_t req_cnt;
|
||||
@@ -3110,16 +3109,8 @@ qlafx00_start_scsi(srb_t *sp)
|
||||
/* Acquire ring specific lock */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
if (index == req->num_outstanding_cmds)
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0)
|
||||
goto queuing_error;
|
||||
|
||||
/* Map the sg table so we have an accurate count of sg entries needed */
|
||||
|
||||
@@ -364,7 +364,6 @@ static inline int qla2x00_start_nvme_mq(srb_t *sp)
|
||||
{
|
||||
unsigned long flags;
|
||||
uint32_t *clr_ptr;
|
||||
uint32_t index;
|
||||
uint32_t handle;
|
||||
struct cmd_nvme *cmd_pkt;
|
||||
uint16_t cnt, i;
|
||||
@@ -388,17 +387,8 @@ static inline int qla2x00_start_nvme_mq(srb_t *sp)
|
||||
/* Acquire qpair specific lock */
|
||||
spin_lock_irqsave(&qpair->qp_lock, flags);
|
||||
|
||||
/* Check for room in outstanding command list. */
|
||||
handle = req->current_outstanding_cmd;
|
||||
for (index = 1; index < req->num_outstanding_cmds; index++) {
|
||||
handle++;
|
||||
if (handle == req->num_outstanding_cmds)
|
||||
handle = 1;
|
||||
if (!req->outstanding_cmds[handle])
|
||||
break;
|
||||
}
|
||||
|
||||
if (index == req->num_outstanding_cmds) {
|
||||
handle = qla2xxx_get_next_handle(req);
|
||||
if (handle == 0) {
|
||||
rval = -EBUSY;
|
||||
goto queuing_error;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user