/** * fc_elsct_send() - Send an ELS or CT frame * @lport: The local port to send the frame on * @did: The destination ID for the frame * @fp: The frame to be sent * @op: The operational code * @resp: The callback routine when the response is received * @arg: The argument to pass to the response callback routine * @timer_msec: The timeout period for the frame (in msecs) */ struct fc_seq *fc_elsct_send(struct fc_lport *lport, u32 did, struct fc_frame *fp, unsigned int op, void (*resp)(struct fc_seq *, struct fc_frame *, void *), void *arg, u32 timer_msec) { enum fc_rctl r_ctl; enum fc_fh_type fh_type; int rc; /* ELS requests */ if ((op >= ELS_LS_RJT) && (op <= ELS_AUTH_ELS)) rc = fc_els_fill(lport, did, fp, op, &r_ctl, &fh_type); else { /* CT requests */ rc = fc_ct_fill(lport, did, fp, op, &r_ctl, &fh_type); did = FC_FID_DIR_SERV; } if (rc) { fc_frame_free(fp); return NULL; } fc_fill_fc_hdr(fp, r_ctl, did, lport->port_id, fh_type, FC_FCTL_REQ, 0); return lport->tt.exch_seq_send(lport, fp, resp, NULL, arg, timer_msec); }
/* * fc_elsct_send - sends ELS/CT frame */ static struct fc_seq *fc_elsct_send(struct fc_lport *lport, struct fc_rport *rport, struct fc_frame *fp, unsigned int op, void (*resp)(struct fc_seq *, struct fc_frame *fp, void *arg), void *arg, u32 timer_msec) { enum fc_rctl r_ctl; u32 did; enum fc_fh_type fh_type; int rc; /* ELS requests */ if ((op >= ELS_LS_RJT) && (op <= ELS_AUTH_ELS)) rc = fc_els_fill(lport, rport, fp, op, &r_ctl, &did, &fh_type); else /* CT requests */ rc = fc_ct_fill(lport, fp, op, &r_ctl, &did, &fh_type); if (rc) return NULL; fc_fill_fc_hdr(fp, r_ctl, did, fc_host_port_id(lport->host), fh_type, FC_FC_FIRST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0); return lport->tt.exch_seq_send(lport, fp, resp, NULL, arg, timer_msec); }