26 static void bfa_itnim_update_del_itn_stats(
struct bfa_itnim_s *itnim);
27 static void bfa_ioim_lm_init(
struct bfa_s *bfa);
29 #define BFA_ITNIM_FROM_TAG(_fcpim, _tag) \
30 (((_fcpim)->itnim_arr + ((_tag) & ((_fcpim)->num_itnims - 1))))
32 #define bfa_fcpim_additn(__itnim) \
33 list_add_tail(&(__itnim)->qe, &(__itnim)->fcpim->itnim_q)
34 #define bfa_fcpim_delitn(__itnim) do { \
35 WARN_ON(!bfa_q_is_on_q(&(__itnim)->fcpim->itnim_q, __itnim)); \
36 bfa_itnim_update_del_itn_stats(__itnim); \
37 list_del(&(__itnim)->qe); \
38 WARN_ON(!list_empty(&(__itnim)->io_q)); \
39 WARN_ON(!list_empty(&(__itnim)->io_cleanup_q)); \
40 WARN_ON(!list_empty(&(__itnim)->pending_q)); \
43 #define bfa_itnim_online_cb(__itnim) do { \
44 if ((__itnim)->bfa->fcs) \
45 bfa_cb_itnim_online((__itnim)->ditn); \
47 bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe, \
48 __bfa_cb_itnim_online, (__itnim)); \
52 #define bfa_itnim_offline_cb(__itnim) do { \
53 if ((__itnim)->bfa->fcs) \
54 bfa_cb_itnim_offline((__itnim)->ditn); \
56 bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe, \
57 __bfa_cb_itnim_offline, (__itnim)); \
61 #define bfa_itnim_sler_cb(__itnim) do { \
62 if ((__itnim)->bfa->fcs) \
63 bfa_cb_itnim_sler((__itnim)->ditn); \
65 bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe, \
66 __bfa_cb_itnim_sler, (__itnim)); \
93 #define bfa_ioim_move_to_comp_q(__ioim) do { \
94 list_del(&(__ioim)->qe); \
95 list_add_tail(&(__ioim)->qe, &(__ioim)->fcpim->ioim_comp_q); \
99 #define bfa_ioim_cb_profile_comp(__fcpim, __ioim) do { \
100 if ((__fcpim)->profile_comp) \
101 (__fcpim)->profile_comp(__ioim); \
104 #define bfa_ioim_cb_profile_start(__fcpim, __ioim) do { \
105 if ((__fcpim)->profile_start) \
106 (__fcpim)->profile_start(__ioim); \
141 #define bfa_tskim_qcomp(__tskim, __cbfn) do { \
142 bfa_cb_queue((__tskim)->bfa, &(__tskim)->hcb_qe, __cbfn, (__tskim));\
143 bfa_tskim_notify_comp(__tskim); \
146 #define bfa_tskim_notify_comp(__tskim) do { \
147 if ((__tskim)->notify) \
148 bfa_itnim_tskdone((__tskim)->itnim); \
167 static void bfa_itnim_iocdisable_cleanup(
struct bfa_itnim_s *itnim);
170 static void bfa_itnim_cleanp_comp(
void *itnim_cbarg);
171 static void bfa_itnim_cleanup(
struct bfa_itnim_s *itnim);
175 static void bfa_itnim_iotov_online(
struct bfa_itnim_s *itnim);
176 static void bfa_itnim_iotov_cleanup(
struct bfa_itnim_s *itnim);
177 static void bfa_itnim_iotov(
void *itnim_arg);
178 static void bfa_itnim_iotov_start(
struct bfa_itnim_s *itnim);
179 static void bfa_itnim_iotov_stop(
struct bfa_itnim_s *itnim);
180 static void bfa_itnim_iotov_delete(
struct bfa_itnim_s *itnim);
185 static void bfa_itnim_sm_uninit(
struct bfa_itnim_s *itnim,
187 static void bfa_itnim_sm_created(
struct bfa_itnim_s *itnim,
189 static void bfa_itnim_sm_fwcreate(
struct bfa_itnim_s *itnim,
191 static void bfa_itnim_sm_delete_pending(
struct bfa_itnim_s *itnim,
193 static void bfa_itnim_sm_online(
struct bfa_itnim_s *itnim,
195 static void bfa_itnim_sm_sler(
struct bfa_itnim_s *itnim,
197 static void bfa_itnim_sm_cleanup_offline(
struct bfa_itnim_s *itnim,
199 static void bfa_itnim_sm_cleanup_delete(
struct bfa_itnim_s *itnim,
201 static void bfa_itnim_sm_fwdelete(
struct bfa_itnim_s *itnim,
203 static void bfa_itnim_sm_offline(
struct bfa_itnim_s *itnim,
205 static void bfa_itnim_sm_iocdisable(
struct bfa_itnim_s *itnim,
207 static void bfa_itnim_sm_deleting(
struct bfa_itnim_s *itnim,
209 static void bfa_itnim_sm_fwcreate_qfull(
struct bfa_itnim_s *itnim,
211 static void bfa_itnim_sm_fwdelete_qfull(
struct bfa_itnim_s *itnim,
213 static void bfa_itnim_sm_deleting_qfull(
struct bfa_itnim_s *itnim,
222 static void bfa_ioim_notify_cleanup(
struct bfa_ioim_s *ioim);
233 static void bfa_ioim_sm_uninit(
struct bfa_ioim_s *ioim,
235 static void bfa_ioim_sm_sgalloc(
struct bfa_ioim_s *ioim,
237 static void bfa_ioim_sm_active(
struct bfa_ioim_s *ioim,
239 static void bfa_ioim_sm_abort(
struct bfa_ioim_s *ioim,
241 static void bfa_ioim_sm_cleanup(
struct bfa_ioim_s *ioim,
243 static void bfa_ioim_sm_qfull(
struct bfa_ioim_s *ioim,
245 static void bfa_ioim_sm_abort_qfull(
struct bfa_ioim_s *ioim,
247 static void bfa_ioim_sm_cleanup_qfull(
struct bfa_ioim_s *ioim,
249 static void bfa_ioim_sm_hcb(
struct bfa_ioim_s *ioim,
251 static void bfa_ioim_sm_hcb_free(
struct bfa_ioim_s *ioim,
253 static void bfa_ioim_sm_resfree(
struct bfa_ioim_s *ioim,
255 static void bfa_ioim_sm_cmnd_retry(
struct bfa_ioim_s *ioim,
264 static void bfa_tskim_gather_ios(
struct bfa_tskim_s *tskim);
265 static void bfa_tskim_cleanp_comp(
void *tskim_cbarg);
266 static void bfa_tskim_cleanup_ios(
struct bfa_tskim_s *tskim);
269 static void bfa_tskim_iocdisable_ios(
struct bfa_tskim_s *tskim);
274 static void bfa_tskim_sm_uninit(
struct bfa_tskim_s *tskim,
276 static void bfa_tskim_sm_active(
struct bfa_tskim_s *tskim,
278 static void bfa_tskim_sm_cleanup(
struct bfa_tskim_s *tskim,
280 static void bfa_tskim_sm_iocleanup(
struct bfa_tskim_s *tskim,
282 static void bfa_tskim_sm_qfull(
struct bfa_tskim_s *tskim,
284 static void bfa_tskim_sm_cleanup_qfull(
struct bfa_tskim_s *tskim,
286 static void bfa_tskim_sm_hcb(
struct bfa_tskim_s *tskim,
303 *km_len += cfg->
fwcfg.num_ioim_reqs *
375 #define bfa_fcpim_add_iostats(__l, __r, __stats) \
376 (__l->__stats += __r->__stats)
440 if (itnim->
rport->rport_info.lp_tag != lp_tag)
451 &(ioim->
itnim->ioprofile.io_latency);
455 idx = bfa_ioim_get_index(scsi_bufflen((
struct scsi_cmnd *)ioim->
dio));
544 if (bfa_itnim_send_fwcreate(itnim))
577 bfa_itnim_iotov_online(itnim);
586 if (bfa_itnim_send_fwdelete(itnim))
602 bfa_itnim_sm_fwcreate_qfull(
struct bfa_itnim_s *itnim,
611 bfa_itnim_send_fwcreate(itnim);
640 bfa_itnim_sm_delete_pending(
struct bfa_itnim_s *itnim,
648 if (bfa_itnim_send_fwdelete(itnim))
677 bfa_itnim_iotov_start(itnim);
678 bfa_itnim_cleanup(itnim);
684 bfa_itnim_cleanup(itnim);
690 bfa_itnim_iotov_start(itnim);
697 bfa_itnim_iotov_start(itnim);
698 bfa_itnim_iocdisable_cleanup(itnim);
718 bfa_itnim_cleanup(itnim);
723 bfa_itnim_cleanup(itnim);
724 bfa_itnim_iotov_delete(itnim);
729 bfa_itnim_iocdisable_cleanup(itnim);
741 bfa_itnim_sm_cleanup_offline(
struct bfa_itnim_s *itnim,
749 if (bfa_itnim_send_fwdelete(itnim))
757 bfa_itnim_iotov_delete(itnim);
762 bfa_itnim_iocdisable_cleanup(itnim);
778 bfa_itnim_sm_cleanup_delete(
struct bfa_itnim_s *itnim,
786 if (bfa_itnim_send_fwdelete(itnim))
794 bfa_itnim_iocdisable_cleanup(itnim);
832 bfa_itnim_sm_fwdelete_qfull(
struct bfa_itnim_s *itnim,
841 bfa_itnim_send_fwdelete(itnim);
871 bfa_itnim_iotov_delete(itnim);
876 if (bfa_itnim_send_fwcreate(itnim))
901 bfa_itnim_iotov_delete(itnim);
910 if (bfa_itnim_send_fwcreate(itnim))
946 bfa_itnim_sm_deleting_qfull(
struct bfa_itnim_s *itnim,
955 bfa_itnim_send_fwdelete(itnim);
973 bfa_itnim_iocdisable_cleanup(
struct bfa_itnim_s *itnim)
1007 bfa_itnim_cleanp_comp(
void *itnim_cbarg)
1025 bfa_wc_init(&itnim->
wc, bfa_itnim_cleanp_comp, itnim);
1037 bfa_wc_up(&itnim->
wc);
1043 bfa_wc_up(&itnim->
wc);
1047 bfa_wc_wait(&itnim->
wc);
1081 bfa_itnim_qresume(
void *cbarg)
1095 bfa_wc_down(&itnim->
wc);
1101 bfa_wc_down(&itnim->
wc);
1121 INIT_LIST_HEAD(&fcpim->
itnim_q);
1126 for (i = 0; i < fcpim->
num_itnims; i++, itnim++) {
1133 bfa_reqq_winit(&itnim->
reqq_wait, bfa_itnim_qresume, itnim);
1135 INIT_LIST_HEAD(&itnim->
io_q);
1138 INIT_LIST_HEAD(&itnim->
tsk_q);
1141 itnim->
ioprofile.io_latency.min[j] = ~0;
1156 bfa_itnim_send_fwcreate(
struct bfa_itnim_s *itnim)
1187 bfa_itnim_send_fwdelete(
struct bfa_itnim_s *itnim)
1235 bfa_itnim_iotov_stop(itnim);
1240 bfa_itnim_delayed_comp(itnim,
BFA_FALSE);
1245 while (!list_empty(&itnim->
pending_q)) {
1256 bfa_itnim_iotov_cleanup(
struct bfa_itnim_s *itnim)
1263 bfa_itnim_delayed_comp(itnim,
BFA_TRUE);
1268 while (!list_empty(&itnim->
pending_q)) {
1279 bfa_itnim_iotov(
void *itnim_arg)
1286 bfa_itnim_iotov_cleanup(itnim);
1296 if (itnim->
fcpim->path_tov > 0) {
1301 bfa_itnim_iotov, itnim, itnim->
fcpim->path_tov);
1328 bfa_itnim_iotov_stop(itnim);
1331 bfa_itnim_iotov_cleanup(itnim);
1337 bfa_itnim_update_del_itn_stats(
struct bfa_itnim_s *itnim)
1341 itnim->
stats.iocomp_aborted;
1343 itnim->
stats.iocomp_timedout;
1345 itnim->
stats.iocom_sqer_needed;
1347 itnim->
stats.iocom_res_free;
1349 itnim->
stats.iocom_hostabrts;
1373 switch (m->
mhdr.msg_id) {
1464 #define bfa_io_lat_clock_res_div HZ
1465 #define bfa_io_lat_clock_res_mul 1000
1481 itnim->
ioprofile.io_profile_start_time =
1501 itnim->
ioprofile.io_latency.min[j] = ~0;
1521 &ioim->
fcpim->ioim_comp_q);
1523 __bfa_cb_ioim_pathtov, ioim);
1527 &ioim->
itnim->pending_q);
1533 if (!bfa_ioim_sgpg_alloc(ioim)) {
1539 if (!bfa_ioim_send_ioreq(ioim)) {
1551 __bfa_cb_ioim_pathtov, ioim);
1562 __bfa_cb_ioim_abort, ioim);
1581 if (!bfa_ioim_send_ioreq(ioim)) {
1593 bfa_ioim_notify_cleanup(ioim);
1628 __bfa_cb_ioim_good_comp, ioim);
1647 ioim->
io_cbfn = __bfa_cb_ioim_abort;
1649 if (bfa_ioim_send_abort(ioim))
1655 &ioim->
iosp->reqq_wait);
1661 ioim->
io_cbfn = __bfa_cb_ioim_failed;
1663 if (bfa_ioim_send_abort(ioim))
1669 &ioim->
iosp->reqq_wait);
1681 if (bfa_ioim_maxretry_reached(ioim)) {
1686 __bfa_cb_ioim_failed, ioim);
1708 if (!bfa_ioim_send_ioreq(ioim)) {
1717 ioim->
io_cbfn = __bfa_cb_ioim_failed;
1719 if (bfa_ioim_send_abort(ioim))
1725 &ioim->
iosp->reqq_wait);
1733 __bfa_cb_ioim_failed, ioim);
1790 if (bfa_ioim_send_abort(ioim))
1796 &ioim->
iosp->reqq_wait);
1833 ioim->
io_cbfn = __bfa_cb_ioim_abort;
1839 bfa_ioim_notify_cleanup(ioim);
1845 bfa_ioim_notify_cleanup(ioim);
1851 bfa_ioim_notify_cleanup(ioim);
1885 bfa_ioim_send_ioreq(ioim);
1901 bfa_ioim_notify_cleanup(ioim);
1929 bfa_ioim_send_abort(ioim);
1980 bfa_ioim_send_abort(ioim);
1987 ioim->
io_cbfn = __bfa_cb_ioim_abort;
1995 bfa_ioim_notify_cleanup(ioim);
2002 bfa_ioim_notify_cleanup(ioim);
2031 bfa_ioim_notify_cleanup(ioim);
2063 bfa_ioim_notify_cleanup(ioim);
2091 bfa_ioim_notify_cleanup(ioim);
2108 bfa_ioim_lm_init(
struct bfa_s *
bfa)
2125 __bfa_cb_ioim_good_comp(
void *cbarg,
bfa_boolean_t complete)
2183 u16 rp_tag,
u8 lp_tag)
2194 if ((lun_list[i].lp_wwn == lp_wwn) &&
2195 (lun_list[i].rp_wwn == rp_wwn)) {
2207 bfa_ioim_lm_set_ua(
struct bfa_s *bfa)
2236 bfa_ioim_lm_set_ua(bfa);
2284 int i, free_index = MAX_LUN_MASK_CFG + 1;
2306 if ((lunm_list[i].lp_wwn == *pwwn) &&
2307 (lunm_list[i].rp_wwn == rpwwn) &&
2313 if (free_index > MAX_LUN_MASK_CFG)
2326 lunm_list[free_index].
rp_wwn = rpwwn;
2327 lunm_list[free_index].
lun =
lun;
2332 if ((lunm_list[i].lp_wwn == *pwwn) &&
2333 (lunm_list[i].rp_wwn == rpwwn))
2373 if ((lunm_list[i].lp_wwn == *pwwn) &&
2374 (lunm_list[i].rp_wwn == rpwwn) &&
2391 if ((lunm_list[i].lp_wwn == *pwwn) &&
2392 (lunm_list[i].rp_wwn == rpwwn))
2442 bfa_ioim_sgpg_alloced(
void *cbarg)
2447 list_splice_tail_init(&ioim->
iosp->sgpg_wqe.sgpg_q, &ioim->
sgpg_q);
2460 static struct fcp_cmnd_s cmnd_z0 = { { { 0 } } };
2468 u32 i, sge_id, pgcumsz;
2478 &ioim->
iosp->reqq_wait);
2507 sgpge = sgpg->
sgpg->sges;
2512 pgcumsz += sgpge->
sg_len;
2515 if (i < (ioim->
nsges - 1) &&
2518 else if (i < (ioim->
nsges - 1))
2526 if (i == (ioim->
nsges - 1)) {
2528 sgpge->
sga.
a32.addr_lo = 0;
2529 sgpge->
sga.
a32.addr_hi = 0;
2545 sge->
sga = ioim->
sgpg->sgpg_pa;
2547 sge->
sga.
a32.addr_lo = 0;
2548 sge->
sga.
a32.addr_hi = 0;
2568 fcp_dl = scsi_bufflen(cmnd);
2574 switch (m->
cmnd.iodir) {
2578 ioim->
itnim->stats.rd_throughput += fcp_dl;
2583 ioim->
itnim->stats.wr_throughput += fcp_dl;
2592 (scsi_bufflen(cmnd) & (
sizeof(
u32) - 1)))
2651 if (ioim->
iosp->abort_explicit)
2671 bfa_ioim_qresume(
void *cbarg)
2681 bfa_ioim_notify_cleanup(
struct bfa_ioim_s *ioim)
2690 if (!ioim->
iosp->tskim) {
2691 if (ioim->
fcpim->delay_comp && ioim->
itnim->iotov_active) {
2698 bfa_wc_down(&ioim->
iosp->tskim->wc);
2702 bfa_ioim_is_abortable(
struct bfa_ioim_s *ioim)
2727 ioim->
io_cbfn = __bfa_cb_ioim_pathtov;
2729 ioim->
io_cbfn = __bfa_cb_ioim_failed;
2771 for (i = 0; i < fcpim->
fcp->num_ioim_reqs;
2772 i++, ioim++, iosp++) {
2778 ioim->bfa = fcpim->
bfa;
2779 ioim->fcpim = fcpim;
2781 INIT_LIST_HEAD(&ioim->sgpg_q);
2782 bfa_reqq_winit(&ioim->iosp->reqq_wait,
2783 bfa_ioim_qresume, ioim);
2785 bfa_ioim_sgpg_alloced, ioim);
2809 ioim->
iosp->comp_rspmsg = *
m;
2911 ioim->
iosp->tskim = tskim;
2960 ioim->
itnim = itnim;
2961 ioim->
nsges = nsges;
2987 (fcpim->
fcp->num_ioim_reqs + fcpim->
fcp->num_fwtio_reqs)));
2990 if (ioim->
iotag < fcpim->
fcp->num_ioim_reqs)
3021 if (!bfa_ioim_is_abortable(ioim))
3045 bfa_tskim_gather_ios(tskim);
3054 bfa_tskim_cleanup_ios(tskim);
3058 if (!bfa_tskim_send(tskim)) {
3083 bfa_tskim_cleanup_ios(tskim);
3088 if (!bfa_tskim_send_abort(tskim)) {
3098 bfa_tskim_iocdisable_ios(tskim);
3126 bfa_tskim_cleanup_ios(tskim);
3131 bfa_tskim_iocdisable_ios(tskim);
3160 bfa_tskim_iocdisable_ios(tskim);
3180 bfa_tskim_send(tskim);
3189 bfa_tskim_cleanup_ios(tskim);
3195 bfa_tskim_iocdisable_ios(tskim);
3209 bfa_tskim_sm_cleanup_qfull(
struct bfa_tskim_s *tskim,
3222 bfa_tskim_send_abort(tskim);
3228 bfa_tskim_iocdisable_ios(tskim);
3303 return !
memcmp(&tskim->
lun, &lun,
sizeof(lun));
3324 INIT_LIST_HEAD(&tskim->
io_q);
3333 if (bfa_tskim_match_scope(tskim, scsilun)) {
3346 if (bfa_tskim_match_scope(tskim, scsilun)) {
3358 bfa_tskim_cleanp_comp(
void *tskim_cbarg)
3375 bfa_wc_init(&tskim->
wc, bfa_tskim_cleanp_comp, tskim);
3379 bfa_wc_up(&tskim->
wc);
3383 bfa_wc_wait(&tskim->
wc);
3456 bfa_tskim_qresume(
void *cbarg)
3468 bfa_tskim_iocdisable_ios(
struct bfa_tskim_s *tskim)
3485 bfa_wc_down(&tskim->
wc);
3535 bfa_reqq_winit(&tskim->
reqq_wait, bfa_tskim_qresume,
3647 u16 nsegs,
idx, per_seg_ios, num_io_req;
3654 if (cfg->
fwcfg.num_ioim_reqs &&
3663 num_io_req = (cfg->
fwcfg.num_ioim_reqs + cfg->
fwcfg.num_fwtio_reqs);
3665 if (cfg->
fwcfg.num_ioim_reqs && cfg->
fwcfg.num_fwtio_reqs) {
3668 }
else if (cfg->
fwcfg.num_fwtio_reqs)
3674 bfa_fcpim_meminfo(cfg, &km_len);
3676 num_io_req = (cfg->
fwcfg.num_ioim_reqs + cfg->
fwcfg.num_fwtio_reqs);
3677 km_len += num_io_req *
sizeof(
struct bfa_iotag_s);
3685 if (num_io_req >= per_seg_ios) {
3686 num_io_req -= per_seg_ios;
3704 u16 idx, nsegs, num_io_req;
3716 num_io_req = (cfg->
fwcfg.num_ioim_reqs + cfg->
fwcfg.num_fwtio_reqs);
3730 bfa_fcpim_attach(fcp, bfad, cfg, pcidev);
3742 bfa_fcp_detach(
struct bfa_s *bfa)
3747 bfa_fcp_start(
struct bfa_s *bfa)
3755 bfa_ioim_lm_init(fcp->
bfa);
3759 bfa_fcp_stop(
struct bfa_s *bfa)
3764 bfa_fcp_iocdisable(
struct bfa_s *bfa)
3768 bfa_fcpim_iocdisable(fcp);
3841 for (i = 0; i < num_io_req; i++, iotag++) {
3844 if (i < fcp->num_ioim_reqs)
3875 if (!tmp || (tmp > drv_cfg_param))
3876 tmp = drv_cfg_param;
3900 ((throttle_cfg->
is_valid == 1) ? (throttle_cfg->
value) : 0) : 0);