Commit 3afd2d15 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen

scsi: libfc: Replace ->exch_seq_send callback with function call

The ->exch_seq_send callback only ever had one implementation,
so we can call the function directly and drop the callback.
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Acked-by: default avatarJohannes Thumshirn <jth@kernel.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent c5cb444c
...@@ -67,7 +67,7 @@ struct fc_seq *fc_elsct_send(struct fc_lport *lport, u32 did, ...@@ -67,7 +67,7 @@ struct fc_seq *fc_elsct_send(struct fc_lport *lport, u32 did,
fc_fill_fc_hdr(fp, r_ctl, did, lport->port_id, fh_type, fc_fill_fc_hdr(fp, r_ctl, did, lport->port_id, fh_type,
FC_FCTL_REQ, 0); FC_FCTL_REQ, 0);
return lport->tt.exch_seq_send(lport, fp, resp, NULL, arg, timer_msec); return fc_exch_seq_send(lport, fp, resp, NULL, arg, timer_msec);
} }
EXPORT_SYMBOL(fc_elsct_send); EXPORT_SYMBOL(fc_elsct_send);
......
...@@ -2127,6 +2127,24 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg) ...@@ -2127,6 +2127,24 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg)
* @arg: The argument to be passed to the response handler * @arg: The argument to be passed to the response handler
* @timer_msec: The timeout period for the exchange * @timer_msec: The timeout period for the exchange
* *
* The exchange response handler is set in this routine to resp()
* function pointer. It can be called in two scenarios: if a timeout
* occurs or if a response frame is received for the exchange. The
* fc_frame pointer in response handler will also indicate timeout
* as error using IS_ERR related macros.
*
* The exchange destructor handler is also set in this routine.
* The destructor handler is invoked by EM layer when exchange
* is about to free, this can be used by caller to free its
* resources along with exchange free.
*
* The arg is passed back to resp and destructor handler.
*
* The timeout value (in msec) for an exchange is set if non zero
* timer_msec argument is specified. The timer is canceled when
* it fires or when the exchange is done. The exchange timeout handler
* is registered by EM layer.
*
* The frame pointer with some of the header's fields must be * The frame pointer with some of the header's fields must be
* filled before calling this routine, those fields are: * filled before calling this routine, those fields are:
* *
...@@ -2137,14 +2155,13 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg) ...@@ -2137,14 +2155,13 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg)
* - frame control * - frame control
* - parameter or relative offset * - parameter or relative offset
*/ */
static struct fc_seq *fc_exch_seq_send(struct fc_lport *lport, struct fc_seq *fc_exch_seq_send(struct fc_lport *lport,
struct fc_frame *fp, struct fc_frame *fp,
void (*resp)(struct fc_seq *, void (*resp)(struct fc_seq *,
struct fc_frame *fp, struct fc_frame *fp,
void *arg), void *arg),
void (*destructor)(struct fc_seq *, void (*destructor)(struct fc_seq *, void *),
void *), void *arg, u32 timer_msec)
void *arg, u32 timer_msec)
{ {
struct fc_exch *ep; struct fc_exch *ep;
struct fc_seq *sp = NULL; struct fc_seq *sp = NULL;
...@@ -2197,6 +2214,7 @@ static struct fc_seq *fc_exch_seq_send(struct fc_lport *lport, ...@@ -2197,6 +2214,7 @@ static struct fc_seq *fc_exch_seq_send(struct fc_lport *lport,
fc_exch_delete(ep); fc_exch_delete(ep);
return NULL; return NULL;
} }
EXPORT_SYMBOL(fc_exch_seq_send);
/** /**
* fc_exch_rrq() - Send an ELS RRQ (Reinstate Recovery Qualifier) command * fc_exch_rrq() - Send an ELS RRQ (Reinstate Recovery Qualifier) command
...@@ -2630,9 +2648,6 @@ int fc_exch_init(struct fc_lport *lport) ...@@ -2630,9 +2648,6 @@ int fc_exch_init(struct fc_lport *lport)
if (!lport->tt.seq_set_resp) if (!lport->tt.seq_set_resp)
lport->tt.seq_set_resp = fc_seq_set_resp; lport->tt.seq_set_resp = fc_seq_set_resp;
if (!lport->tt.exch_seq_send)
lport->tt.exch_seq_send = fc_exch_seq_send;
if (!lport->tt.seq_send) if (!lport->tt.seq_send)
lport->tt.seq_send = fc_seq_send; lport->tt.seq_send = fc_seq_send;
......
...@@ -196,7 +196,7 @@ static void fc_fcp_pkt_hold(struct fc_fcp_pkt *fsp) ...@@ -196,7 +196,7 @@ static void fc_fcp_pkt_hold(struct fc_fcp_pkt *fsp)
* @seq: The sequence that the FCP packet is on (required by destructor API) * @seq: The sequence that the FCP packet is on (required by destructor API)
* @fsp: The FCP packet to be released * @fsp: The FCP packet to be released
* *
* This routine is called by a destructor callback in the exch_seq_send() * This routine is called by a destructor callback in the fc_exch_seq_send()
* routine of the libfc Transport Template. The 'struct fc_seq' is a required * routine of the libfc Transport Template. The 'struct fc_seq' is a required
* argument even though it is not used by this routine. * argument even though it is not used by this routine.
* *
...@@ -1206,8 +1206,7 @@ static int fc_fcp_cmd_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp, ...@@ -1206,8 +1206,7 @@ static int fc_fcp_cmd_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp,
rpriv->local_port->port_id, FC_TYPE_FCP, rpriv->local_port->port_id, FC_TYPE_FCP,
FC_FCTL_REQ, 0); FC_FCTL_REQ, 0);
seq = lport->tt.exch_seq_send(lport, fp, resp, fc_fcp_pkt_destroy, seq = fc_exch_seq_send(lport, fp, resp, fc_fcp_pkt_destroy, fsp, 0);
fsp, 0);
if (!seq) { if (!seq) {
rc = -1; rc = -1;
goto unlock; goto unlock;
...@@ -1757,9 +1756,9 @@ static void fc_fcp_srr(struct fc_fcp_pkt *fsp, enum fc_rctl r_ctl, u32 offset) ...@@ -1757,9 +1756,9 @@ static void fc_fcp_srr(struct fc_fcp_pkt *fsp, enum fc_rctl r_ctl, u32 offset)
rpriv->local_port->port_id, FC_TYPE_FCP, rpriv->local_port->port_id, FC_TYPE_FCP,
FC_FCTL_REQ, 0); FC_FCTL_REQ, 0);
seq = lport->tt.exch_seq_send(lport, fp, fc_fcp_srr_resp, seq = fc_exch_seq_send(lport, fp, fc_fcp_srr_resp,
fc_fcp_pkt_destroy, fc_fcp_pkt_destroy,
fsp, get_fsp_rec_tov(fsp)); fsp, get_fsp_rec_tov(fsp));
if (!seq) if (!seq)
goto retry; goto retry;
......
...@@ -2006,8 +2006,8 @@ static int fc_lport_els_request(struct fc_bsg_job *job, ...@@ -2006,8 +2006,8 @@ static int fc_lport_els_request(struct fc_bsg_job *job,
info->nents = job->reply_payload.sg_cnt; info->nents = job->reply_payload.sg_cnt;
info->sg = job->reply_payload.sg_list; info->sg = job->reply_payload.sg_list;
if (!lport->tt.exch_seq_send(lport, fp, fc_lport_bsg_resp, if (!fc_exch_seq_send(lport, fp, fc_lport_bsg_resp,
NULL, info, tov)) { NULL, info, tov)) {
kfree(info); kfree(info);
return -ECOMM; return -ECOMM;
} }
...@@ -2067,8 +2067,8 @@ static int fc_lport_ct_request(struct fc_bsg_job *job, ...@@ -2067,8 +2067,8 @@ static int fc_lport_ct_request(struct fc_bsg_job *job,
info->nents = job->reply_payload.sg_cnt; info->nents = job->reply_payload.sg_cnt;
info->sg = job->reply_payload.sg_list; info->sg = job->reply_payload.sg_list;
if (!lport->tt.exch_seq_send(lport, fp, fc_lport_bsg_resp, if (!fc_exch_seq_send(lport, fp, fc_lport_bsg_resp,
NULL, info, tov)) { NULL, info, tov)) {
kfree(info); kfree(info);
return -ECOMM; return -ECOMM;
} }
......
...@@ -1282,8 +1282,8 @@ static void fc_rport_enter_prli(struct fc_rport_priv *rdata) ...@@ -1282,8 +1282,8 @@ static void fc_rport_enter_prli(struct fc_rport_priv *rdata)
FC_FC_FIRST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0); FC_FC_FIRST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0);
kref_get(&rdata->kref); kref_get(&rdata->kref);
if (!lport->tt.exch_seq_send(lport, fp, fc_rport_prli_resp, if (!fc_exch_seq_send(lport, fp, fc_rport_prli_resp,
NULL, rdata, 2 * lport->r_a_tov)) { NULL, rdata, 2 * lport->r_a_tov)) {
fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR); fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR);
kref_put(&rdata->kref, lport->tt.rport_destroy); kref_put(&rdata->kref, lport->tt.rport_destroy);
} }
......
...@@ -484,37 +484,6 @@ struct libfc_function_template { ...@@ -484,37 +484,6 @@ struct libfc_function_template {
struct fc_frame *, void *arg), struct fc_frame *, void *arg),
void *arg, u32 timer_msec); void *arg, u32 timer_msec);
/*
* Send the FC frame payload using a new exchange and sequence.
*
* The exchange response handler is set in this routine to resp()
* function pointer. It can be called in two scenarios: if a timeout
* occurs or if a response frame is received for the exchange. The
* fc_frame pointer in response handler will also indicate timeout
* as error using IS_ERR related macros.
*
* The exchange destructor handler is also set in this routine.
* The destructor handler is invoked by EM layer when exchange
* is about to free, this can be used by caller to free its
* resources along with exchange free.
*
* The arg is passed back to resp and destructor handler.
*
* The timeout value (in msec) for an exchange is set if non zero
* timer_msec argument is specified. The timer is canceled when
* it fires or when the exchange is done. The exchange timeout handler
* is registered by EM layer.
*
* STATUS: OPTIONAL
*/
struct fc_seq *(*exch_seq_send)(struct fc_lport *, struct fc_frame *,
void (*resp)(struct fc_seq *,
struct fc_frame *,
void *),
void (*destructor)(struct fc_seq *,
void *),
void *, unsigned int timer_msec);
/* /*
* Sets up the DDP context for a given exchange id on the given * Sets up the DDP context for a given exchange id on the given
* scatterlist if LLD supports DDP for large receive. * scatterlist if LLD supports DDP for large receive.
...@@ -1117,6 +1086,13 @@ void fc_fill_hdr(struct fc_frame *, const struct fc_frame *, ...@@ -1117,6 +1086,13 @@ void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,
*****************************/ *****************************/
int fc_exch_init(struct fc_lport *); int fc_exch_init(struct fc_lport *);
void fc_exch_update_stats(struct fc_lport *lport); void fc_exch_update_stats(struct fc_lport *lport);
struct fc_seq *fc_exch_seq_send(struct fc_lport *lport,
struct fc_frame *fp,
void (*resp)(struct fc_seq *,
struct fc_frame *fp,
void *arg),
void (*destructor)(struct fc_seq *, void *),
void *arg, u32 timer_msec);
void fc_seq_els_rsp_send(struct fc_frame *, enum fc_els_cmd, void fc_seq_els_rsp_send(struct fc_frame *, enum fc_els_cmd,
struct fc_seq_els_data *); struct fc_seq_els_data *);
struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *, struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *,
......
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