Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25ff6af1 authored by Joe Carnuccio's avatar Joe Carnuccio Committed by Nicholas Bellinger
Browse files

qla2xxx: Simplify usage of SRB structure in driver



This patch simplifies SRB structure usage in driver.

- Simplify sp->done() and sp->free() interfaces.
- Remove sp->fcport->vha to use vha pointer from sp.
- Use sp->vha context in qla2x00_rel_sp().

Signed-off-by: default avatarJoe Carnuccio <joe.carnuccio@cavium.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 41dc529a
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -13,28 +13,25 @@

/* BSG support for ELS/CT pass through */
void
qla2x00_bsg_job_done(void *data, void *ptr, int res)
qla2x00_bsg_job_done(void *ptr, int res)
{
	srb_t *sp = (srb_t *)ptr;
	struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
	srb_t *sp = ptr;
	struct bsg_job *bsg_job = sp->u.bsg_job;
	struct fc_bsg_reply *bsg_reply = bsg_job->reply;

	bsg_reply->result = res;
	bsg_job_done(bsg_job, bsg_reply->result,
		       bsg_reply->reply_payload_rcv_len);
	sp->free(vha, sp);
	sp->free(sp);
}

void
qla2x00_bsg_sp_free(void *data, void *ptr)
qla2x00_bsg_sp_free(void *ptr)
{
	srb_t *sp = (srb_t *)ptr;
	struct scsi_qla_host *vha = sp->fcport->vha;
	srb_t *sp = ptr;
	struct qla_hw_data *ha = sp->vha->hw;
	struct bsg_job *bsg_job = sp->u.bsg_job;
	struct fc_bsg_request *bsg_request = bsg_job->request;

	struct qla_hw_data *ha = vha->hw;
	struct qla_mt_iocb_rqst_fx00 *piocb_rqst;

	if (sp->type == SRB_FXIOCB_BCMD) {
@@ -62,7 +59,7 @@ qla2x00_bsg_sp_free(void *data, void *ptr)
	    sp->type == SRB_FXIOCB_BCMD ||
	    sp->type == SRB_ELS_CMD_HST)
		kfree(sp->fcport);
	qla2x00_rel_sp(vha, sp);
	qla2x00_rel_sp(sp);
}

int
@@ -394,7 +391,7 @@ qla2x00_process_els(struct bsg_job *bsg_job)
	if (rval != QLA_SUCCESS) {
		ql_log(ql_log_warn, vha, 0x700e,
		    "qla2x00_start_sp failed = %d\n", rval);
		qla2x00_rel_sp(vha, sp);
		qla2x00_rel_sp(sp);
		rval = -EIO;
		goto done_unmap_sg;
	}
@@ -542,7 +539,7 @@ qla2x00_process_ct(struct bsg_job *bsg_job)
	if (rval != QLA_SUCCESS) {
		ql_log(ql_log_warn, vha, 0x7017,
		    "qla2x00_start_sp failed=%d.\n", rval);
		qla2x00_rel_sp(vha, sp);
		qla2x00_rel_sp(sp);
		rval = -EIO;
		goto done_free_fcport;
	}
@@ -2578,6 +2575,6 @@ qla24xx_bsg_timeout(struct bsg_job *bsg_job)

done:
	spin_unlock_irqrestore(&ha->hardware_lock, flags);
	sp->free(vha, sp);
	sp->free(sp);
	return 0;
}
+4 −3
Original line number Diff line number Diff line
@@ -433,7 +433,7 @@ struct srb_iocb {
typedef struct srb {
	atomic_t ref_count;
	struct fc_port *fcport;
	void *vha;
	struct scsi_qla_host *vha;
	uint32_t handle;
	uint16_t flags;
	uint16_t type;
@@ -447,8 +447,8 @@ typedef struct srb {
		struct bsg_job *bsg_job;
		struct srb_cmd scmd;
	} u;
	void (*done)(void *, void *, int);
	void (*free)(void *, void *);
	void (*done)(void *, int);
	void (*free)(void *);
} srb_t;

#define GET_CMD_SP(sp) (sp->u.scmd.cmd)
@@ -3224,6 +3224,7 @@ struct qla_qpair {
	struct qla_hw_data *hw;
	struct work_struct q_work;
	struct list_head qp_list_elem; /* vha->qp_list */
	struct scsi_qla_host *vha;
};

/* Place holder for FW buffer parameters */
+7 −7
Original line number Diff line number Diff line
@@ -186,9 +186,9 @@ extern int qla2x00_post_uevent_work(struct scsi_qla_host *, u32);

extern int qla2x00_post_uevent_work(struct scsi_qla_host *, u32);
extern void qla2x00_disable_board_on_pci_error(struct work_struct *);
extern void qla2x00_sp_compl(void *, void *, int);
extern void qla2xxx_qpair_sp_free_dma(void *, void *);
extern void qla2xxx_qpair_sp_compl(void *, void *, int);
extern void qla2x00_sp_compl(void *, int);
extern void qla2xxx_qpair_sp_free_dma(void *);
extern void qla2xxx_qpair_sp_compl(void *, int);
extern int qla24xx_post_upd_fcport_work(struct scsi_qla_host *, fc_port_t *);
void qla2x00_handle_login_done_event(struct scsi_qla_host *, fc_port_t *,
	uint16_t *);
@@ -215,7 +215,7 @@ extern void qla2x00_do_dpc_all_vps(scsi_qla_host_t *);
extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *);
extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *);

extern void qla2x00_sp_free_dma(void *, void *);
extern void qla2x00_sp_free_dma(void *);
extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);

extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int);
@@ -733,10 +733,10 @@ extern int qla82xx_restart_isp(scsi_qla_host_t *);

/* IOCB related functions */
extern int qla82xx_start_scsi(srb_t *);
extern void qla2x00_sp_free(void *, void *);
extern void qla2x00_sp_free(void *);
extern void qla2x00_sp_timeout(unsigned long);
extern void qla2x00_bsg_job_done(void *, void *, int);
extern void qla2x00_bsg_sp_free(void *, void *);
extern void qla2x00_bsg_job_done(void *, int);
extern void qla2x00_bsg_sp_free(void *);
extern void qla2x00_start_iocbs(struct scsi_qla_host *, struct req_que *);

/* Interrupt related */
+16 −16
Original line number Diff line number Diff line
@@ -2822,10 +2822,10 @@ void qla24xx_handle_gidpn_event(scsi_qla_host_t *vha, struct event_arg *ea)
	}
} /* gidpn_event */

static void qla2x00_async_gidpn_sp_done(void *v, void *s, int res)
static void qla2x00_async_gidpn_sp_done(void *s, int res)
{
	struct scsi_qla_host *vha = (struct scsi_qla_host *)v;
	struct srb *sp = (struct srb *)s;
	struct srb *sp = s;
	struct scsi_qla_host *vha = sp->vha;
	fc_port_t *fcport = sp->fcport;
	u8 *id = fcport->ct_desc.ct_sns->p.rsp.rsp.gid_pn.port_id;
	struct event_arg ea;
@@ -2847,7 +2847,7 @@ static void qla2x00_async_gidpn_sp_done(void *v, void *s, int res)

	qla2x00_fcport_event_handler(vha, &ea);

	sp->free(vha, sp);
	sp->free(sp);
}

int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
@@ -2905,7 +2905,7 @@ int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
	return rval;

done_free_sp:
	sp->free(vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	return rval;
@@ -2941,11 +2941,11 @@ int qla24xx_post_gpsc_work(struct scsi_qla_host *vha, fc_port_t *fcport)
	return qla2x00_post_work(vha, e);
}

static void qla24xx_async_gpsc_sp_done(void *v, void *s, int res)
static void qla24xx_async_gpsc_sp_done(void *s, int res)
{
	struct scsi_qla_host *vha = (struct scsi_qla_host *)v;
	struct srb *sp = s;
	struct scsi_qla_host *vha = sp->vha;
	struct qla_hw_data *ha = vha->hw;
	struct srb *sp = (struct srb *)s;
	fc_port_t *fcport = sp->fcport;
	struct ct_sns_rsp       *ct_rsp;
	struct event_arg ea;
@@ -3011,7 +3011,7 @@ static void qla24xx_async_gpsc_sp_done(void *v, void *s, int res)
	ea.fcport = fcport;
	qla2x00_fcport_event_handler(vha, &ea);

	sp->free(vha, sp);
	sp->free(sp);
}

int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
@@ -3066,7 +3066,7 @@ int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
	return rval;

done_free_sp:
	sp->free(vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	return rval;
@@ -3104,7 +3104,7 @@ void qla24xx_async_gpnid_done(scsi_qla_host_t *vha, srb_t *sp)
		sp->u.iocb_cmd.u.ctarg.rsp = NULL;
	}

	sp->free(vha, sp);
	sp->free(sp);
}

void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
@@ -3138,10 +3138,10 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
	}
}

static void qla2x00_async_gpnid_sp_done(void *v, void *s, int res)
static void qla2x00_async_gpnid_sp_done(void *s, int res)
{
	struct scsi_qla_host *vha = (struct scsi_qla_host *)v;
	struct srb *sp = (struct srb *)s;
	struct srb *sp = s;
	struct scsi_qla_host *vha = sp->vha;
	struct ct_sns_req *ct_req =
	    (struct ct_sns_req *)sp->u.iocb_cmd.u.ctarg.req;
	struct ct_sns_rsp *ct_rsp =
@@ -3183,7 +3183,7 @@ static void qla2x00_async_gpnid_sp_done(void *v, void *s, int res)
			sp->u.iocb_cmd.u.ctarg.rsp = NULL;
		}

		sp->free(vha, sp);
		sp->free(sp);
		return;
	}

@@ -3272,7 +3272,7 @@ int qla24xx_async_gpnid(scsi_qla_host_t *vha, port_id_t *id)
		sp->u.iocb_cmd.u.ctarg.rsp = NULL;
	}

	sp->free(vha, sp);
	sp->free(sp);
done:
	return rval;
}
+49 −51
Original line number Diff line number Diff line
@@ -47,29 +47,27 @@ qla2x00_sp_timeout(unsigned long __data)
{
	srb_t *sp = (srb_t *)__data;
	struct srb_iocb *iocb;
	scsi_qla_host_t *vha = (scsi_qla_host_t *)sp->vha;
	struct qla_hw_data *ha = vha->hw;
	scsi_qla_host_t *vha = sp->vha;
	struct req_que *req;
	unsigned long flags;

	spin_lock_irqsave(&ha->hardware_lock, flags);
	req = ha->req_q_map[0];
	spin_lock_irqsave(&vha->hw->hardware_lock, flags);
	req = vha->hw->req_q_map[0];
	req->outstanding_cmds[sp->handle] = NULL;
	iocb = &sp->u.iocb_cmd;
	iocb->timeout(sp);
	sp->free(vha, sp);
	spin_unlock_irqrestore(&ha->hardware_lock, flags);
	sp->free(sp);
	spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
}

void
qla2x00_sp_free(void *data, void *ptr)
qla2x00_sp_free(void *ptr)
{
	srb_t *sp = (srb_t *)ptr;
	srb_t *sp = ptr;
	struct srb_iocb *iocb = &sp->u.iocb_cmd;
	struct scsi_qla_host *vha = (scsi_qla_host_t *)data;

	del_timer(&iocb->timer);
	qla2x00_rel_sp(vha, sp);
	qla2x00_rel_sp(sp);
}

/* Asynchronous Login/Logout Routines -------------------------------------- */
@@ -97,7 +95,7 @@ qla2x00_get_async_timeout(struct scsi_qla_host *vha)
void
qla2x00_async_iocb_timeout(void *data)
{
	srb_t *sp = (srb_t *)data;
	srb_t *sp = data;
	fc_port_t *fcport = sp->fcport;
	struct srb_iocb *lio = &sp->u.iocb_cmd;
	struct event_arg ea;
@@ -130,22 +128,21 @@ qla2x00_async_iocb_timeout(void *data)
	case SRB_NACK_PLOGI:
	case SRB_NACK_PRLI:
	case SRB_NACK_LOGO:
		sp->done(sp->vha, sp, QLA_FUNCTION_TIMEOUT);
		sp->done(sp, QLA_FUNCTION_TIMEOUT);
		break;
	}
}

static void
qla2x00_async_login_sp_done(void *data, void *ptr, int res)
qla2x00_async_login_sp_done(void *ptr, int res)
{
	srb_t *sp = (srb_t *)ptr;
	srb_t *sp = ptr;
	struct scsi_qla_host *vha = sp->vha;
	struct srb_iocb *lio = &sp->u.iocb_cmd;
	struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
	struct event_arg ea;

	ql_dbg(ql_dbg_disc, vha, 0xffff,
		"%s %8phC res %d \n",
		   __func__, sp->fcport->port_name, res);
	    "%s %8phC res %d \n", __func__, sp->fcport->port_name, res);

	sp->fcport->flags &= ~FCF_ASYNC_SENT;
	if (!test_bit(UNLOADING, &vha->dpc_flags)) {
@@ -160,7 +157,7 @@ qla2x00_async_login_sp_done(void *data, void *ptr, int res)
		qla2x00_fcport_event_handler(vha, &ea);
	}

	sp->free(sp->fcport->vha, sp);
	sp->free(sp);
}

int
@@ -212,24 +209,23 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
	return rval;

done_free_sp:
	sp->free(fcport->vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	return rval;
}

static void
qla2x00_async_logout_sp_done(void *data, void *ptr, int res)
qla2x00_async_logout_sp_done(void *ptr, int res)
{
	srb_t *sp = (srb_t *)ptr;
	srb_t *sp = ptr;
	struct srb_iocb *lio = &sp->u.iocb_cmd;
	struct scsi_qla_host *vha = (scsi_qla_host_t *)data;

	sp->fcport->flags &= ~FCF_ASYNC_SENT;
	if (!test_bit(UNLOADING, &vha->dpc_flags))
		qla2x00_post_async_logout_done_work(sp->fcport->vha, sp->fcport,
	if (!test_bit(UNLOADING, &sp->vha->dpc_flags))
		qla2x00_post_async_logout_done_work(sp->vha, sp->fcport,
		    lio->u.logio.data);
	sp->free(sp->fcport->vha, sp);
	sp->free(sp);
}

int
@@ -264,23 +260,23 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
	return rval;

done_free_sp:
	sp->free(fcport->vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	return rval;
}

static void
qla2x00_async_adisc_sp_done(void *data, void *ptr, int res)
qla2x00_async_adisc_sp_done(void *ptr, int res)
{
	srb_t *sp = (srb_t *)ptr;
	srb_t *sp = ptr;
	struct scsi_qla_host *vha = sp->vha;
	struct srb_iocb *lio = &sp->u.iocb_cmd;
	struct scsi_qla_host *vha = (scsi_qla_host_t *)data;

	if (!test_bit(UNLOADING, &vha->dpc_flags))
		qla2x00_post_async_adisc_done_work(sp->fcport->vha, sp->fcport,
		qla2x00_post_async_adisc_done_work(sp->vha, sp->fcport,
		    lio->u.logio.data);
	sp->free(sp->fcport->vha, sp);
	sp->free(sp);
}

int
@@ -317,7 +313,7 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
	return rval;

done_free_sp:
	sp->free(fcport->vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	return rval;
@@ -479,10 +475,10 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
} /* gnl_event */

static void
qla24xx_async_gnl_sp_done(void *v, void *s, int res)
qla24xx_async_gnl_sp_done(void *s, int res)
{
	struct scsi_qla_host *vha = (struct scsi_qla_host *)v;
	struct srb *sp = (struct srb *)s;
	struct srb *sp = s;
	struct scsi_qla_host *vha = sp->vha;
	unsigned long flags;
	struct fc_port *fcport = NULL, *tf;
	u16 i, n = 0, loop_id;
@@ -541,7 +537,7 @@ qla24xx_async_gnl_sp_done(void *v, void *s, int res)

	spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);

	sp->free(vha, sp);
	sp->free(sp);
}

int qla24xx_async_gnl(struct scsi_qla_host *vha, fc_port_t *fcport)
@@ -609,7 +605,7 @@ int qla24xx_async_gnl(struct scsi_qla_host *vha, fc_port_t *fcport)
	return rval;

done_free_sp:
	sp->free(fcport->vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	return rval;
@@ -628,10 +624,10 @@ int qla24xx_post_gnl_work(struct scsi_qla_host *vha, fc_port_t *fcport)
}

static
void qla24xx_async_gpdb_sp_done(void *v, void *s, int res)
void qla24xx_async_gpdb_sp_done(void *s, int res)
{
	struct scsi_qla_host *vha = (struct scsi_qla_host *)v;
	struct srb *sp = (struct srb *)s;
	struct srb *sp = s;
	struct scsi_qla_host *vha = sp->vha;
	struct qla_hw_data *ha = vha->hw;
	uint64_t zero = 0;
	struct port_database_24xx *pd;
@@ -708,7 +704,7 @@ void qla24xx_async_gpdb_sp_done(void *v, void *s, int res)
	dma_pool_free(ha->s_dma_pool, sp->u.iocb_cmd.u.mbx.in,
		sp->u.iocb_cmd.u.mbx.in_dma);

	sp->free(vha, sp);
	sp->free(sp);
}

static int qla24xx_post_gpdb_work(struct scsi_qla_host *vha, fc_port_t *fcport,
@@ -790,7 +786,7 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt)
	if (pd)
		dma_pool_free(ha->s_dma_pool, pd, pd_dma);

	sp->free(vha, sp);
	sp->free(sp);
done:
	fcport->flags &= ~FCF_ASYNC_SENT;
	qla24xx_post_gpdb_work(vha, fcport, opt);
@@ -1168,7 +1164,7 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, struct event_arg *ea)
static void
qla2x00_tmf_iocb_timeout(void *data)
{
	srb_t *sp = (srb_t *)data;
	srb_t *sp = data;
	struct srb_iocb *tmf = &sp->u.iocb_cmd;

	tmf->u.tmf.comp_status = CS_TIMEOUT;
@@ -1176,10 +1172,11 @@ qla2x00_tmf_iocb_timeout(void *data)
}

static void
qla2x00_tmf_sp_done(void *data, void *ptr, int res)
qla2x00_tmf_sp_done(void *ptr, int res)
{
	srb_t *sp = (srb_t *)ptr;
	srb_t *sp = ptr;
	struct srb_iocb *tmf = &sp->u.iocb_cmd;

	complete(&tmf->u.tmf.comp);
}

@@ -1237,7 +1234,7 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
	}

done_free_sp:
	sp->free(vha, sp);
	sp->free(sp);
done:
	return rval;
}
@@ -1245,7 +1242,7 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
static void
qla24xx_abort_iocb_timeout(void *data)
{
	srb_t *sp = (srb_t *)data;
	srb_t *sp = data;
	struct srb_iocb *abt = &sp->u.iocb_cmd;

	abt->u.abt.comp_status = CS_TIMEOUT;
@@ -1253,9 +1250,9 @@ qla24xx_abort_iocb_timeout(void *data)
}

static void
qla24xx_abort_sp_done(void *data, void *ptr, int res)
qla24xx_abort_sp_done(void *ptr, int res)
{
	srb_t *sp = (srb_t *)ptr;
	srb_t *sp = ptr;
	struct srb_iocb *abt = &sp->u.iocb_cmd;

	complete(&abt->u.abt.comp);
@@ -1264,7 +1261,7 @@ qla24xx_abort_sp_done(void *data, void *ptr, int res)
static int
qla24xx_async_abort_cmd(srb_t *cmd_sp)
{
	scsi_qla_host_t *vha = cmd_sp->fcport->vha;
	scsi_qla_host_t *vha = cmd_sp->vha;
	fc_port_t *fcport = cmd_sp->fcport;
	struct srb_iocb *abt_iocb;
	srb_t *sp;
@@ -1297,7 +1294,7 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp)
	    QLA_SUCCESS : QLA_FUNCTION_FAILED;

done_free_sp:
	sp->free(vha, sp);
	sp->free(sp);
done:
	return rval;
}
@@ -7564,6 +7561,7 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos, int v
		memset(qpair, 0, sizeof(struct qla_qpair));

		qpair->hw = vha->hw;
		qpair->vha = vha;

		/* Assign available que pair id */
		mutex_lock(&ha->mq_lock);
Loading