• Home
  • Raw
  • Download

Lines Matching refs:vha

116 static void qlt_alloc_qfull_cmd(struct scsi_qla_host *vha,
118 static void qlt_disable_vha(struct scsi_qla_host *vha);
124 static void qlt_send_term_imm_notif(struct scsi_qla_host *vha,
126 static struct fc_port *qlt_create_sess(struct scsi_qla_host *vha,
162 void qlt_do_generation_tick(struct scsi_qla_host *vha, int *dest) in qlt_do_generation_tick() argument
164 scsi_qla_host_t *base_vha = pci_get_drvdata(vha->hw->pdev); in qlt_do_generation_tick()
171 static inline int qlt_issue_marker(struct scsi_qla_host *vha, int vha_locked) in qlt_issue_marker() argument
174 if (unlikely(vha->marker_needed != 0)) { in qlt_issue_marker()
175 int rc = qla2x00_issue_marker(vha, vha_locked); in qlt_issue_marker()
178 ql_dbg(ql_dbg_tgt, vha, 0xe03d, in qlt_issue_marker()
180 vha->vp_idx); in qlt_issue_marker()
187 struct scsi_qla_host *qla_find_host_by_d_id(struct scsi_qla_host *vha, in qla_find_host_by_d_id() argument
193 if (vha->d_id.b.area == d_id.area && in qla_find_host_by_d_id()
194 vha->d_id.b.domain == d_id.domain && in qla_find_host_by_d_id()
195 vha->d_id.b.al_pa == d_id.al_pa) in qla_find_host_by_d_id()
196 return vha; in qla_find_host_by_d_id()
200 host = btree_lookup32(&vha->hw->host_map, key); in qla_find_host_by_d_id()
202 ql_dbg(ql_dbg_tgt_mgt + ql_dbg_verbose, vha, 0xf005, in qla_find_host_by_d_id()
209 struct scsi_qla_host *qlt_find_host_by_vp_idx(struct scsi_qla_host *vha, in qlt_find_host_by_vp_idx() argument
212 struct qla_hw_data *ha = vha->hw; in qlt_find_host_by_vp_idx()
214 if (vha->vp_idx == vp_idx) in qlt_find_host_by_vp_idx()
215 return vha; in qlt_find_host_by_vp_idx()
219 return ha->tgt.tgt_vp_map[vp_idx].vha; in qlt_find_host_by_vp_idx()
224 static inline void qlt_incr_num_pend_cmds(struct scsi_qla_host *vha) in qlt_incr_num_pend_cmds() argument
228 spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags); in qlt_incr_num_pend_cmds()
230 vha->hw->tgt.num_pend_cmds++; in qlt_incr_num_pend_cmds()
231 if (vha->hw->tgt.num_pend_cmds > vha->qla_stats.stat_max_pend_cmds) in qlt_incr_num_pend_cmds()
232 vha->qla_stats.stat_max_pend_cmds = in qlt_incr_num_pend_cmds()
233 vha->hw->tgt.num_pend_cmds; in qlt_incr_num_pend_cmds()
234 spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags); in qlt_incr_num_pend_cmds()
236 static inline void qlt_decr_num_pend_cmds(struct scsi_qla_host *vha) in qlt_decr_num_pend_cmds() argument
240 spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags); in qlt_decr_num_pend_cmds()
241 vha->hw->tgt.num_pend_cmds--; in qlt_decr_num_pend_cmds()
242 spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags); in qlt_decr_num_pend_cmds()
246 static void qlt_queue_unknown_atio(scsi_qla_host_t *vha, in qlt_queue_unknown_atio() argument
250 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_queue_unknown_atio()
254 ql_dbg(ql_dbg_async, vha, 0x502c, in qlt_queue_unknown_atio()
256 vha->vp_idx); in qlt_queue_unknown_atio()
264 u->vha = vha; in qlt_queue_unknown_atio()
268 spin_lock_irqsave(&vha->cmd_list_lock, flags); in qlt_queue_unknown_atio()
269 list_add_tail(&u->cmd_list, &vha->unknown_atio_list); in qlt_queue_unknown_atio()
270 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); in qlt_queue_unknown_atio()
272 schedule_delayed_work(&vha->unknown_atio_work, 1); in qlt_queue_unknown_atio()
278 qlt_send_term_exchange(vha->hw->base_qpair, NULL, atio, ha_locked, 0); in qlt_queue_unknown_atio()
282 static void qlt_try_to_dequeue_unknown_atios(struct scsi_qla_host *vha, in qlt_try_to_dequeue_unknown_atios() argument
287 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_try_to_dequeue_unknown_atios()
291 list_for_each_entry_safe(u, t, &vha->unknown_atio_list, cmd_list) { in qlt_try_to_dequeue_unknown_atios()
293 ql_dbg(ql_dbg_async, vha, 0x502e, in qlt_try_to_dequeue_unknown_atios()
296 qlt_send_term_exchange(vha->hw->base_qpair, NULL, in qlt_try_to_dequeue_unknown_atios()
301 host = qla_find_host_by_d_id(vha, u->atio.u.isp24.fcp_hdr.d_id); in qlt_try_to_dequeue_unknown_atios()
303 ql_dbg(ql_dbg_async + ql_dbg_verbose, vha, 0x502f, in qlt_try_to_dequeue_unknown_atios()
307 ql_dbg(ql_dbg_async + ql_dbg_verbose, vha, 0x503a, in qlt_try_to_dequeue_unknown_atios()
310 qlt_send_term_exchange(vha->hw->base_qpair, NULL, in qlt_try_to_dequeue_unknown_atios()
313 ql_dbg(ql_dbg_async + ql_dbg_verbose, vha, 0x503d, in qlt_try_to_dequeue_unknown_atios()
314 "Reschedule u %p, vha %p, host %p\n", u, vha, host); in qlt_try_to_dequeue_unknown_atios()
317 schedule_delayed_work(&vha->unknown_atio_work, in qlt_try_to_dequeue_unknown_atios()
324 spin_lock_irqsave(&vha->cmd_list_lock, flags); in qlt_try_to_dequeue_unknown_atios()
326 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); in qlt_try_to_dequeue_unknown_atios()
333 struct scsi_qla_host *vha = container_of(to_delayed_work(work), in qlt_unknown_atio_work_fn() local
336 qlt_try_to_dequeue_unknown_atios(vha, 0); in qlt_unknown_atio_work_fn()
339 static bool qlt_24xx_atio_pkt_all_vps(struct scsi_qla_host *vha, in qlt_24xx_atio_pkt_all_vps() argument
342 ql_dbg(ql_dbg_tgt, vha, 0xe072, in qlt_24xx_atio_pkt_all_vps()
344 __func__, vha->vp_idx, atio->u.raw.entry_type, in qlt_24xx_atio_pkt_all_vps()
350 struct scsi_qla_host *host = qla_find_host_by_d_id(vha, in qlt_24xx_atio_pkt_all_vps()
353 ql_dbg(ql_dbg_tgt, vha, 0xe03e, in qlt_24xx_atio_pkt_all_vps()
355 "with unknown d_id %x:%x:%x\n", vha->vp_idx, in qlt_24xx_atio_pkt_all_vps()
361 qlt_queue_unknown_atio(vha, atio, ha_locked); in qlt_24xx_atio_pkt_all_vps()
364 if (unlikely(!list_empty(&vha->unknown_atio_list))) in qlt_24xx_atio_pkt_all_vps()
365 qlt_try_to_dequeue_unknown_atios(vha, ha_locked); in qlt_24xx_atio_pkt_all_vps()
373 struct scsi_qla_host *host = vha; in qlt_24xx_atio_pkt_all_vps()
377 qlt_issue_marker(vha, ha_locked); in qlt_24xx_atio_pkt_all_vps()
381 host = qlt_find_host_by_vp_idx(vha, in qlt_24xx_atio_pkt_all_vps()
384 ql_dbg(ql_dbg_tgt, vha, 0xe03f, in qlt_24xx_atio_pkt_all_vps()
388 vha->vp_idx, entry->u.isp24.vp_index); in qlt_24xx_atio_pkt_all_vps()
397 qla24xx_report_id_acquisition(vha, in qlt_24xx_atio_pkt_all_vps()
405 struct scsi_qla_host *host = qlt_find_host_by_vp_idx(vha, in qlt_24xx_atio_pkt_all_vps()
410 ql_dbg(ql_dbg_tgt, vha, 0xe00a, in qlt_24xx_atio_pkt_all_vps()
413 vha->vp_idx, entry->vp_index); in qlt_24xx_atio_pkt_all_vps()
427 ql_dbg(ql_dbg_tgt, vha, 0xe040, in qlt_24xx_atio_pkt_all_vps()
429 "type %x\n", vha->vp_idx, atio->u.raw.entry_type); in qlt_24xx_atio_pkt_all_vps()
436 void qlt_response_pkt_all_vps(struct scsi_qla_host *vha, in qlt_response_pkt_all_vps() argument
441 ql_dbg(ql_dbg_tgt, vha, 0xe073, in qlt_response_pkt_all_vps()
443 vha->vp_idx, __func__); in qlt_response_pkt_all_vps()
448 struct scsi_qla_host *host = qlt_find_host_by_vp_idx(vha, in qlt_response_pkt_all_vps()
451 ql_dbg(ql_dbg_tgt, vha, 0xe041, in qlt_response_pkt_all_vps()
454 vha->vp_idx, entry->vp_index); in qlt_response_pkt_all_vps()
467 host = qlt_find_host_by_vp_idx(vha, entry->u.isp24.vp_index); in qlt_response_pkt_all_vps()
469 ql_dbg(ql_dbg_tgt, vha, 0xe042, in qlt_response_pkt_all_vps()
472 vha->vp_idx, entry->u.isp24.vp_index); in qlt_response_pkt_all_vps()
481 struct scsi_qla_host *host = vha; in qlt_response_pkt_all_vps()
485 host = qlt_find_host_by_vp_idx(vha, in qlt_response_pkt_all_vps()
488 ql_dbg(ql_dbg_tgt, vha, 0xe043, in qlt_response_pkt_all_vps()
492 "vp_index %d\n", vha->vp_idx, in qlt_response_pkt_all_vps()
505 struct scsi_qla_host *host = qlt_find_host_by_vp_idx(vha, in qlt_response_pkt_all_vps()
508 ql_dbg(ql_dbg_tgt, vha, 0xe044, in qlt_response_pkt_all_vps()
511 "vp_index %d\n", vha->vp_idx, entry->vp_index); in qlt_response_pkt_all_vps()
522 struct scsi_qla_host *host = qlt_find_host_by_vp_idx(vha, in qlt_response_pkt_all_vps()
525 ql_dbg(ql_dbg_tgt, vha, 0xe045, in qlt_response_pkt_all_vps()
528 "vp_index %d\n", vha->vp_idx, entry->vp_index); in qlt_response_pkt_all_vps()
535 qlt_response_pkt(vha, rsp, pkt); in qlt_response_pkt_all_vps()
544 static int qla24xx_post_nack_work(struct scsi_qla_host *vha, fc_port_t *fcport, in qla24xx_post_nack_work() argument
549 e = qla2x00_alloc_work(vha, QLA_EVT_NACK); in qla24xx_post_nack_work()
556 return qla2x00_post_work(vha, e); in qla24xx_post_nack_work()
561 struct scsi_qla_host *vha = sp->vha; in qla2x00_async_nack_sp_done() local
564 ql_dbg(ql_dbg_disc, vha, 0x20f2, in qla2x00_async_nack_sp_done()
568 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); in qla2x00_async_nack_sp_done()
570 sp->fcport->chip_reset = vha->hw->base_qpair->chip_reset; in qla2x00_async_nack_sp_done()
581 ql_dbg(ql_dbg_edif, vha, 0x20ef, in qla2x00_async_nack_sp_done()
586 qla2x00_post_aen_work(vha, FCH_EVT_PORT_ONLINE, in qla2x00_async_nack_sp_done()
588 qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_NEEDED, sp->fcport->d_id.b24, in qla2x00_async_nack_sp_done()
602 vha->fcport_count++; in qla2x00_async_nack_sp_done()
603 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qla2x00_async_nack_sp_done()
605 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); in qla2x00_async_nack_sp_done()
621 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qla2x00_async_nack_sp_done()
626 int qla24xx_async_notify_ack(scsi_qla_host_t *vha, fc_port_t *fcport, in qla24xx_async_notify_ack() argument
638 if (vha->hw->flags.edif_enabled && in qla24xx_async_notify_ack()
653 sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC); in qla24xx_async_notify_ack()
659 qla2x00_init_async_sp(sp, qla2x00_get_async_timeout(vha) + 2, in qla24xx_async_notify_ack()
664 ql_dbg(ql_dbg_disc, vha, 0x20f4, in qla24xx_async_notify_ack()
681 void qla24xx_do_nack_work(struct scsi_qla_host *vha, struct qla_work_evt *e) in qla24xx_do_nack_work() argument
690 mutex_lock(&vha->vha_tgt.tgt_mutex); in qla24xx_do_nack_work()
691 t = qlt_create_sess(vha, e->u.nack.fcport, 0); in qla24xx_do_nack_work()
692 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qla24xx_do_nack_work()
694 ql_log(ql_log_info, vha, 0xd034, in qla24xx_do_nack_work()
697 vha->hw->tgt.tgt_ops->put_sess(e->u.nack.fcport); in qla24xx_do_nack_work()
701 qla24xx_async_notify_ack(vha, e->u.nack.fcport, in qla24xx_do_nack_work()
710 if (!fcport || !fcport->vha || !fcport->vha->hw) in qla24xx_delete_sess_fn()
713 ha = fcport->vha->hw; in qla24xx_delete_sess_fn()
726 void qlt_fc_port_added(struct scsi_qla_host *vha, fc_port_t *fcport) in qlt_fc_port_added() argument
728 struct qla_hw_data *ha = vha->hw; in qlt_fc_port_added()
729 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_fc_port_added()
733 if (!vha->hw->tgt.tgt_ops) in qlt_fc_port_added()
750 mutex_lock(&vha->vha_tgt.tgt_mutex); in qlt_fc_port_added()
751 sess = qlt_create_sess(vha, fcport, false); in qlt_fc_port_added()
752 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_fc_port_added()
762 ql_dbg(ql_dbg_disc, vha, 0x2107, in qlt_fc_port_added()
769 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04c, in qlt_fc_port_added()
771 "(loop ID %d) reappeared\n", vha->vp_idx, in qlt_fc_port_added()
774 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf007, in qlt_fc_port_added()
783 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04d, in qlt_fc_port_added()
785 "port %8phC (loop ID %d) became global\n", vha->vp_idx, in qlt_fc_port_added()
800 qlt_plogi_ack_find_add(struct scsi_qla_host *vha, port_id_t *id, in qlt_plogi_ack_find_add() argument
805 lockdep_assert_held(&vha->hw->hardware_lock); in qlt_plogi_ack_find_add()
807 list_for_each_entry(pla, &vha->plogi_ack_list, list) { in qlt_plogi_ack_find_add()
809 ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x210d, in qlt_plogi_ack_find_add()
813 qlt_send_term_imm_notif(vha, &pla->iocb, 1); in qlt_plogi_ack_find_add()
821 ql_dbg(ql_dbg_async, vha, 0x5088, in qlt_plogi_ack_find_add()
823 vha->vp_idx); in qlt_plogi_ack_find_add()
829 list_add_tail(&pla->list, &vha->plogi_ack_list); in qlt_plogi_ack_find_add()
834 void qlt_plogi_ack_unref(struct scsi_qla_host *vha, in qlt_plogi_ack_unref() argument
848 ql_dbg(ql_dbg_disc, vha, 0x5089, in qlt_plogi_ack_unref()
866 qla24xx_post_nack_work(vha, fcport, iocb, SRB_NACK_PLOGI); in qlt_plogi_ack_unref()
868 qla24xx_post_nack_work(vha, fcport, iocb, SRB_NACK_PRLI); in qlt_plogi_ack_unref()
870 list_for_each_entry(fcport, &vha->vp_fcports, list) { in qlt_plogi_ack_unref()
882 qlt_plogi_ack_link(struct scsi_qla_host *vha, struct qlt_plogi_ack_t *pla, in qlt_plogi_ack_link() argument
889 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf097, in qlt_plogi_ack_link()
909 qlt_plogi_ack_unref(vha, sess->plogi_link[link]); in qlt_plogi_ack_link()
932 qlt_send_first_logo(struct scsi_qla_host *vha, qlt_port_logo_t *logo) in qlt_send_first_logo() argument
937 if (test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags)) { in qlt_send_first_logo()
942 mutex_lock(&vha->vha_tgt.tgt_mutex); in qlt_send_first_logo()
944 list_for_each_entry(tmp, &vha->logo_list, list) { in qlt_send_first_logo()
947 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_send_first_logo()
952 list_add_tail(&logo->list, &vha->logo_list); in qlt_send_first_logo()
954 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_send_first_logo()
956 res = qla24xx_els_dcmd_iocb(vha, ELS_DCMD_LOGO, logo->id); in qlt_send_first_logo()
958 mutex_lock(&vha->vha_tgt.tgt_mutex); in qlt_send_first_logo()
960 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_send_first_logo()
963 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf098, in qlt_send_first_logo()
974 struct scsi_qla_host *vha = sess->vha; in qlt_free_session_done() local
975 struct qla_hw_data *ha = vha->hw; in qlt_free_session_done()
982 ql_dbg(ql_dbg_disc, vha, 0xf084, in qlt_free_session_done()
995 ql_dbg(ql_dbg_edif, vha, 0x911e, in qlt_free_session_done()
998 qla2x00_release_all_sadb(vha, sess); in qlt_free_session_done()
1000 ql_dbg(ql_dbg_edif, vha, 0x911e, in qlt_free_session_done()
1004 qla_edif_clear_appdata(vha, sess); in qlt_free_session_done()
1005 qla_edif_sess_down(vha, sess); in qlt_free_session_done()
1007 qla2x00_mark_device_lost(vha, sess, 0); in qlt_free_session_done()
1016 qlt_send_first_logo(vha, &logo); in qlt_free_session_done()
1026 rc = qla2x00_post_async_logout_work(vha, sess, in qlt_free_session_done()
1029 ql_log(ql_log_warn, vha, 0xf085, in qlt_free_session_done()
1036 rc = qla2x00_post_async_prlo_work(vha, sess, in qlt_free_session_done()
1039 ql_log(ql_log_warn, vha, 0xf085, in qlt_free_session_done()
1066 ql_dbg(ql_dbg_disc, vha, 0xf086, in qlt_free_session_done()
1082 ql_dbg(ql_dbg_disc, vha, 0xf087, in qlt_free_session_done()
1088 qla24xx_async_notify_ack(vha, sess, in qlt_free_session_done()
1103 vha->fcport_count--; in qlt_free_session_done()
1112 if (!test_bit(UNLOADING, &vha->dpc_flags)) in qlt_free_session_done()
1113 set_bit(RELOGIN_NEEDED, &vha->dpc_flags); in qlt_free_session_done()
1125 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf099, in qlt_free_session_done()
1132 qlt_plogi_ack_unref(vha, con); in qlt_free_session_done()
1135 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf09a, in qlt_free_session_done()
1145 qlt_plogi_ack_unref(vha, own); in qlt_free_session_done()
1153 qla2x00_dfs_remove_rport(vha, sess); in qlt_free_session_done()
1155 spin_lock_irqsave(&vha->work_lock, flags); in qlt_free_session_done()
1159 spin_unlock_irqrestore(&vha->work_lock, flags); in qlt_free_session_done()
1161 ql_dbg(ql_dbg_disc, vha, 0xf001, in qlt_free_session_done()
1163 sess, sess->port_name, vha->fcport_count); in qlt_free_session_done()
1169 !(vha->vp_idx && test_bit(VPORT_DELETE, &vha->dpc_flags)) && in qlt_free_session_done()
1170 (!tgt || !tgt->tgt_stop) && !LOOP_TRANSITION(vha)) { in qlt_free_session_done()
1171 switch (vha->host->active_mode) { in qlt_free_session_done()
1174 set_bit(RELOGIN_NEEDED, &vha->dpc_flags); in qlt_free_session_done()
1175 qla2xxx_wake_dpc(vha); in qlt_free_session_done()
1184 if (vha->fcport_count == 0) in qlt_free_session_done()
1185 wake_up_all(&vha->fcport_waitQ); in qlt_free_session_done()
1191 struct scsi_qla_host *vha = sess->vha; in qlt_unreg_sess() local
1194 ql_dbg(ql_dbg_disc, sess->vha, 0x210a, in qlt_unreg_sess()
1198 spin_lock_irqsave(&sess->vha->work_lock, flags); in qlt_unreg_sess()
1200 spin_unlock_irqrestore(&sess->vha->work_lock, flags); in qlt_unreg_sess()
1210 spin_unlock_irqrestore(&sess->vha->work_lock, flags); in qlt_unreg_sess()
1213 vha->hw->tgt.tgt_ops->clear_nacl_from_fcport_map(sess); in qlt_unreg_sess()
1219 queue_work(sess->vha->hw->wq, &sess->free_work); in qlt_unreg_sess()
1223 static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd) in qlt_reset() argument
1225 struct qla_hw_data *ha = vha->hw; in qlt_reset()
1235 atomic_inc(&vha->vha_tgt.qla_tgt->tgt_global_resets_count); in qlt_reset()
1237 qlt_clear_tgt_db(vha->vha_tgt.qla_tgt); in qlt_reset()
1241 sess = ha->tgt.tgt_ops->find_sess_by_loop_id(vha, loop_id); in qlt_reset()
1245 ql_dbg(ql_dbg_tgt, vha, 0xe000, in qlt_reset()
1252 ql_dbg(ql_dbg_tgt, vha, 0xe047, in qlt_reset()
1254 "loop_id %d)\n", vha->host_no, sess, sess->port_name, in qlt_reset()
1262 if (sess->chip_reset != sess->vha->hw->base_qpair->chip_reset) { in qla24xx_chk_fcp_state()
1284 if (sess->vha->fcport_count == 0) in qlt_schedule_sess_for_deletion()
1285 wake_up_all(&sess->vha->fcport_waitQ); in qlt_schedule_sess_for_deletion()
1299 ql_dbg(ql_dbg_disc, sess->vha, 0xffff, in qlt_schedule_sess_for_deletion()
1308 spin_lock_irqsave(&sess->vha->work_lock, flags); in qlt_schedule_sess_for_deletion()
1310 spin_unlock_irqrestore(&sess->vha->work_lock, flags); in qlt_schedule_sess_for_deletion()
1314 spin_unlock_irqrestore(&sess->vha->work_lock, flags); in qlt_schedule_sess_for_deletion()
1321 ql_dbg(ql_log_warn, sess->vha, 0xe001, in qlt_schedule_sess_for_deletion()
1325 WARN_ON(!queue_work(sess->vha->hw->wq, &sess->del_work)); in qlt_schedule_sess_for_deletion()
1331 scsi_qla_host_t *vha = tgt->vha; in qlt_clear_tgt_db() local
1333 list_for_each_entry(sess, &vha->vp_fcports, list) { in qlt_clear_tgt_db()
1341 static int qla24xx_get_loop_id(struct scsi_qla_host *vha, be_id_t s_id, in qla24xx_get_loop_id() argument
1344 struct qla_hw_data *ha = vha->hw; in qla24xx_get_loop_id()
1353 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf044, in qla24xx_get_loop_id()
1355 vha->vp_idx, qla2x00_gid_list_size(ha)); in qla24xx_get_loop_id()
1360 rc = qla24xx_gidlist_wait(vha, gid_list, gid_list_dma, &entries); in qla24xx_get_loop_id()
1362 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf045, in qla24xx_get_loop_id()
1364 vha->vp_idx, rc); in qla24xx_get_loop_id()
1393 struct scsi_qla_host *vha, in qlt_create_sess() argument
1397 struct qla_hw_data *ha = vha->hw; in qlt_create_sess()
1401 if (vha->vha_tgt.qla_tgt->tgt_stop) in qlt_create_sess()
1406 ql_dbg(ql_dbg_disc, vha, 0x20f6, in qlt_create_sess()
1413 sess->tgt = vha->vha_tgt.qla_tgt; in qlt_create_sess()
1426 if (ha->tgt.tgt_ops->check_initiator_node_acl(vha, in qlt_create_sess()
1428 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf015, in qlt_create_sess()
1430 vha->vp_idx, fcport->port_name); in qlt_create_sess()
1439 ql_dbg(ql_dbg_disc, vha, 0x20f7, in qlt_create_sess()
1447 vha->vha_tgt.qla_tgt->sess_count++; in qlt_create_sess()
1449 qlt_do_generation_tick(vha, &sess->generation); in qlt_create_sess()
1453 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf006, in qlt_create_sess()
1455 sess, sess->se_sess, vha->vha_tgt.qla_tgt, in qlt_create_sess()
1456 vha->vha_tgt.qla_tgt->sess_count); in qlt_create_sess()
1458 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04b, in qlt_create_sess()
1461 vha->vp_idx, local ? "local " : "", fcport->port_name, in qlt_create_sess()
1473 qlt_fc_port_deleted(struct scsi_qla_host *vha, fc_port_t *fcport, int max_gen) in qlt_fc_port_deleted() argument
1475 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_fc_port_deleted()
1479 if (!vha->hw->tgt.tgt_ops) in qlt_fc_port_deleted()
1485 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); in qlt_fc_port_deleted()
1487 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qlt_fc_port_deleted()
1491 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qlt_fc_port_deleted()
1496 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qlt_fc_port_deleted()
1497 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf092, in qlt_fc_port_deleted()
1505 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf008, "qla_tgt_fc_port_deleted %p", sess); in qlt_fc_port_deleted()
1508 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qlt_fc_port_deleted()
1522 ql_dbg(ql_dbg_tgt, tgt->vha, 0xe002, in test_tgt_sess_count()
1534 struct scsi_qla_host *vha = tgt->vha; in qlt_stop_phase1() local
1542 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04e, in qlt_stop_phase1()
1549 ql_dbg(ql_dbg_tgt_mgt, vha, 0xe003, "Stopping target for host %ld(%p)\n", in qlt_stop_phase1()
1550 vha->host_no, vha); in qlt_stop_phase1()
1555 mutex_lock(&vha->vha_tgt.tgt_mutex); in qlt_stop_phase1()
1558 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_stop_phase1()
1561 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf009, in qlt_stop_phase1()
1571 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00a, in qlt_stop_phase1()
1578 (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha))) in qlt_stop_phase1()
1579 qlt_disable_vha(vha); in qlt_stop_phase1()
1592 scsi_qla_host_t *vha = tgt->vha; in qlt_stop_phase2() local
1595 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04f, in qlt_stop_phase2()
1601 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00b, in qlt_stop_phase2()
1608 mutex_lock(&vha->vha_tgt.tgt_mutex); in qlt_stop_phase2()
1611 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_stop_phase2()
1614 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00c, "Stop of tgt %p finished\n", in qlt_stop_phase2()
1617 switch (vha->qlini_mode) { in qlt_stop_phase2()
1619 vha->flags.online = 1; in qlt_stop_phase2()
1620 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qlt_stop_phase2()
1631 scsi_qla_host_t *vha = tgt->vha; in qlt_release() local
1636 struct qla_hw_data *ha = vha->hw; in qlt_release()
1644 for (i = 0; i < vha->hw->max_qpairs + 1; i++) { in qlt_release()
1657 list_del(&vha->vha_tgt.qla_tgt->tgt_list_entry); in qlt_release()
1665 if (vha->vp_idx) in qlt_release()
1668 vha->vha_tgt.target_lport_ptr) in qlt_release()
1669 ha->tgt.tgt_ops->remove_target(vha); in qlt_release()
1671 vha->vha_tgt.qla_tgt = NULL; in qlt_release()
1673 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00d, in qlt_release()
1688 ql_dbg(ql_dbg_tgt_mgt, tgt->vha, 0xf050, in qlt_sched_sess_work()
1694 ql_dbg(ql_dbg_tgt_mgt, tgt->vha, 0xf00e, in qlt_sched_sess_work()
1719 struct scsi_qla_host *vha = qpair->vha; in qlt_send_notify_ack() local
1720 struct qla_hw_data *ha = vha->hw; in qlt_send_notify_ack()
1727 ql_dbg(ql_dbg_tgt, vha, 0xe004, "Sending NOTIFY_ACK (ha=%p)\n", ha); in qlt_send_notify_ack()
1731 ql_dbg(ql_dbg_tgt, vha, 0xe049, in qlt_send_notify_ack()
1733 "request packet\n", vha->vp_idx, __func__); in qlt_send_notify_ack()
1737 if (vha->vha_tgt.qla_tgt != NULL) in qlt_send_notify_ack()
1738 vha->vha_tgt.qla_tgt->notify_ack_expected++; in qlt_send_notify_ack()
1770 ql_dbg(ql_dbg_tgt, vha, 0xe005, in qlt_send_notify_ack()
1772 vha->vp_idx, nack->u.isp24.status); in qlt_send_notify_ack()
1776 qla2x00_start_iocbs(vha, qpair->req); in qlt_send_notify_ack()
1781 struct scsi_qla_host *vha = mcmd->vha; in qlt_build_abts_resp_iocb() local
1782 struct qla_hw_data *ha = vha->hw; in qlt_build_abts_resp_iocb()
1791 ql_dbg(ql_dbg_tgt, vha, 0xe006, in qlt_build_abts_resp_iocb()
1797 ql_dbg(ql_dbg_tgt, vha, 0xe04a, in qlt_build_abts_resp_iocb()
1799 vha->vp_idx, __func__); in qlt_build_abts_resp_iocb()
1822 resp->vp_index = vha->vp_idx; in qlt_build_abts_resp_iocb()
1852 vha->vha_tgt.qla_tgt->abts_resp_expected++; in qlt_build_abts_resp_iocb()
1859 qla2x00_start_iocbs(vha, qpair->req); in qlt_build_abts_resp_iocb()
1871 struct scsi_qla_host *vha = qpair->vha; in qlt_24xx_send_abts_resp() local
1872 struct qla_hw_data *ha = vha->hw; in qlt_24xx_send_abts_resp()
1877 ql_dbg(ql_dbg_tgt, vha, 0xe006, in qlt_24xx_send_abts_resp()
1884 ql_dbg(ql_dbg_tgt, vha, 0xe04a, in qlt_24xx_send_abts_resp()
1886 "request packet", vha->vp_idx, __func__); in qlt_24xx_send_abts_resp()
1894 resp->vp_index = vha->vp_idx; in qlt_24xx_send_abts_resp()
1927 vha->vha_tgt.qla_tgt->abts_resp_expected++; in qlt_24xx_send_abts_resp()
1934 qla2x00_start_iocbs(vha, qpair->req); in qlt_24xx_send_abts_resp()
1940 static void qlt_24xx_retry_term_exchange(struct scsi_qla_host *vha, in qlt_24xx_retry_term_exchange() argument
1949 ql_dbg(ql_dbg_tgt, vha, 0xe04b, in qlt_24xx_retry_term_exchange()
1951 "request packet\n", vha->vp_idx, __func__); in qlt_24xx_retry_term_exchange()
1972 ctio->vp_index = vha->vp_idx; in qlt_24xx_retry_term_exchange()
1992 ql_dbg(ql_dbg_tgt, vha, 0xe007, in qlt_24xx_retry_term_exchange()
2003 qla2x00_start_iocbs(vha, qpair->req); in qlt_24xx_retry_term_exchange()
2018 static void abort_cmds_for_lun(struct scsi_qla_host *vha, u64 lun, be_id_t s_id) in abort_cmds_for_lun() argument
2026 spin_lock_irqsave(&vha->cmd_list_lock, flags); in abort_cmds_for_lun()
2027 list_for_each_entry(op, &vha->qla_sess_op_cmd_list, cmd_list) { in abort_cmds_for_lun()
2038 list_for_each_entry(op, &vha->unknown_atio_list, cmd_list) { in abort_cmds_for_lun()
2049 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmds_for_lun()
2059 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); in abort_cmds_for_lun()
2062 static struct qla_qpair_hint *qlt_find_qphint(struct scsi_qla_host *vha, in qlt_find_qphint() argument
2065 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_find_qphint()
2068 if (vha->flags.qpairs_available) { in qlt_find_qphint()
2083 struct qla_hw_data *ha = mcmd->vha->hw; in qlt_do_tmr_work()
2125 ql_dbg(ql_dbg_tgt_mgt, mcmd->vha, 0xf052, in qlt_do_tmr_work()
2127 mcmd->vha->vp_idx, rc); in qlt_do_tmr_work()
2133 static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha, in __qlt_24xx_handle_abts() argument
2136 struct qla_hw_data *ha = vha->hw; in __qlt_24xx_handle_abts()
2138 struct qla_qpair_hint *h = &vha->vha_tgt.qla_tgt->qphints[0]; in __qlt_24xx_handle_abts()
2141 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00f, in __qlt_24xx_handle_abts()
2143 vha->vp_idx, abts->exchange_addr_to_abort); in __qlt_24xx_handle_abts()
2147 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf051, in __qlt_24xx_handle_abts()
2149 vha->vp_idx, __func__); in __qlt_24xx_handle_abts()
2159 mcmd->vha = vha; in __qlt_24xx_handle_abts()
2191 static void qlt_24xx_handle_abts(struct scsi_qla_host *vha, in qlt_24xx_handle_abts() argument
2194 struct qla_hw_data *ha = vha->hw; in qlt_24xx_handle_abts()
2202 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf053, in qlt_24xx_handle_abts()
2204 "supported\n", vha->vp_idx); in qlt_24xx_handle_abts()
2211 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf010, in qlt_24xx_handle_abts()
2213 "Address received\n", vha->vp_idx); in qlt_24xx_handle_abts()
2219 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf011, in qlt_24xx_handle_abts()
2221 "tag=%d, param=%x)\n", vha->vp_idx, abts->fcp_hdr_le.s_id.domain, in qlt_24xx_handle_abts()
2228 sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, s_id); in qlt_24xx_handle_abts()
2230 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf012, in qlt_24xx_handle_abts()
2232 vha->vp_idx); in qlt_24xx_handle_abts()
2248 rc = __qlt_24xx_handle_abts(vha, abts, sess); in qlt_24xx_handle_abts()
2250 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf054, in qlt_24xx_handle_abts()
2252 vha->vp_idx, rc); in qlt_24xx_handle_abts()
2265 struct scsi_qla_host *ha = mcmd->vha; in qlt_24xx_send_task_mgmt_ctio()
2325 struct scsi_qla_host *vha = cmd->vha; in qlt_send_resp_ctio() local
2327 ql_dbg(ql_dbg_tgt_dif, vha, 0x3066, in qlt_send_resp_ctio()
2330 vha, atio, scsi_status, sense_key, asc, ascq); in qlt_send_resp_ctio()
2332 ctio = (struct ctio7_to_24xx *)qla2x00_alloc_iocbs(vha, NULL); in qlt_send_resp_ctio()
2334 ql_dbg(ql_dbg_async, vha, 0x3067, in qlt_send_resp_ctio()
2336 vha->host_no, __func__); in qlt_send_resp_ctio()
2345 ctio->vp_index = vha->vp_idx; in qlt_send_resp_ctio()
2377 qla2x00_start_iocbs(vha, qpair->req); in qlt_send_resp_ctio()
2386 struct scsi_qla_host *vha = mcmd->sess->vha; in qlt_xmit_tm_rsp() local
2387 struct qla_hw_data *ha = vha->hw; in qlt_xmit_tm_rsp()
2392 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf013, in qlt_xmit_tm_rsp()
2398 if (!vha->flags.online || mcmd->reset_count != qpair->chip_reset) { in qlt_xmit_tm_rsp()
2403 ql_dbg(ql_dbg_async, vha, 0xe100, in qlt_xmit_tm_rsp()
2405 vha->flags.online, qla2x00_reset_active(vha), in qlt_xmit_tm_rsp()
2417 ql_dbg(ql_dbg_disc, vha, 0x2106, in qlt_xmit_tm_rsp()
2424 qlt_send_notify_ack(vha->hw->base_qpair, in qlt_xmit_tm_rsp()
2512 static void qlt_unmap_sg(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd) in qlt_unmap_sg() argument
2532 ha = vha->hw; in qlt_unmap_sg()
2606 ql_dbg(ql_dbg_io, qpair->vha, 0x305b, in qlt_make_handle()
2608 qpair->vha->vp_idx); in qlt_make_handle()
2755 struct scsi_qla_host *vha; in qlt_print_dif_err() local
2760 vha = cmd->vha; in qlt_print_dif_err()
2764 ql_dbg(ql_dbg_tgt_dif, vha, 0xe00b, in qlt_print_dif_err()
2771 ql_dbg(ql_dbg_tgt_dif, vha, 0xe00c, in qlt_print_dif_err()
2778 ql_dbg(ql_dbg_tgt_dif, vha, 0xe00f, in qlt_print_dif_err()
2785 ql_dbg(ql_dbg_tgt_dif, vha, 0xe010, in qlt_print_dif_err()
2792 ql_dump_buffer(ql_dbg_tgt_dif, vha, 0xe011, cmd->cdb, 16); in qlt_print_dif_err()
2852 (IS_FWI2_CAPABLE(cmd->vha->hw) && in qlt_pre_xmit_response()
2985 scsi_qla_host_t *vha = cmd->tgt->vha; in qla_tgt_set_dif_tags() local
2986 struct qla_hw_data *ha = vha->hw; in qla_tgt_set_dif_tags()
3084 scsi_qla_host_t *vha = cmd->vha; in qlt_build_ctio_crc2_pkt() local
3086 ha = vha->hw; in qlt_build_ctio_crc2_pkt()
3236 tc.vha = vha; in qlt_build_ctio_crc2_pkt()
3280 struct scsi_qla_host *vha = cmd->vha; in qlt_xmit_response() local
3321 vha->flags.online, qla2x00_reset_active(vha), in qlt_xmit_response()
3420 qla2x00_start_iocbs(vha, qpair->req); in qlt_xmit_response()
3426 qlt_unmap_sg(vha, cmd); in qlt_xmit_response()
3436 struct scsi_qla_host *vha = cmd->vha; in qlt_rdy_to_xfer() local
3458 vha->hw->tgt.tgt_ops->handle_data(cmd); in qlt_rdy_to_xfer()
3461 vha->flags.online, qla2x00_reset_active(vha), in qlt_rdy_to_xfer()
3501 qla2x00_start_iocbs(vha, qpair->req); in qlt_rdy_to_xfer()
3507 qlt_unmap_sg(vha, cmd); in qlt_rdy_to_xfer()
3527 struct scsi_qla_host *vha = cmd->vha; in qlt_handle_dif_error() local
3539 ql_dbg(ql_dbg_tgt_dif, vha, 0xf075, in qlt_handle_dif_error()
3546 ql_dbg(ql_dbg_tgt_dif, vha, 0xe00d, in qlt_handle_dif_error()
3562 ql_dbg(ql_dbg_tgt_dif, vha, 0xe00e, in qlt_handle_dif_error()
3579 ql_dbg(ql_dbg_tgt_dif, vha, 0xe012, in qlt_handle_dif_error()
3597 vha->hw->tgt.tgt_ops->handle_data(cmd); in qlt_handle_dif_error()
3603 vha->hw->tgt.tgt_ops->free_cmd(cmd); in qlt_handle_dif_error()
3613 vha->hw->tgt.tgt_ops->free_cmd(cmd); in qlt_handle_dif_error()
3620 static int __qlt_send_term_imm_notif(struct scsi_qla_host *vha, in __qlt_send_term_imm_notif() argument
3624 struct qla_hw_data *ha = vha->hw; in __qlt_send_term_imm_notif()
3628 ql_dbg(ql_dbg_tgt_tmr, vha, 0xe01c, in __qlt_send_term_imm_notif()
3631 pkt = (request_t *)qla2x00_alloc_iocbs(vha, NULL); in __qlt_send_term_imm_notif()
3633 ql_dbg(ql_dbg_tgt, vha, 0xe080, in __qlt_send_term_imm_notif()
3635 "request packet\n", vha->vp_idx, __func__); in __qlt_send_term_imm_notif()
3665 qla2x00_start_iocbs(vha, vha->req); in __qlt_send_term_imm_notif()
3669 static void qlt_send_term_imm_notif(struct scsi_qla_host *vha, in qlt_send_term_imm_notif() argument
3675 rc = __qlt_send_term_imm_notif(vha, imm); in qlt_send_term_imm_notif()
3687 struct scsi_qla_host *vha = qpair->vha; in __qlt_send_term_exchange() local
3689 struct qla_hw_data *ha = vha->hw; in __qlt_send_term_exchange()
3694 ql_dbg(ql_dbg_tgt, vha, 0xe009, "Sending TERM EXCH CTIO (ha=%p)\n", ha); in __qlt_send_term_exchange()
3697 vha = cmd->vha; in __qlt_send_term_exchange()
3701 ql_dbg(ql_dbg_tgt, vha, 0xe050, in __qlt_send_term_exchange()
3703 "request packet\n", vha->vp_idx, __func__); in __qlt_send_term_exchange()
3709 ql_dbg(ql_dbg_tgt, vha, 0xe051, in __qlt_send_term_exchange()
3711 "incorrect state %d\n", vha->vp_idx, cmd, in __qlt_send_term_exchange()
3725 ctio24->vp_index = vha->vp_idx; in __qlt_send_term_exchange()
3739 qla2x00_start_iocbs(vha, qpair->req); in __qlt_send_term_exchange()
3747 struct scsi_qla_host *vha; in qlt_send_term_exchange() local
3753 vha = cmd->vha; in qlt_send_term_exchange()
3755 vha = qpair->vha; in qlt_send_term_exchange()
3760 qlt_alloc_qfull_cmd(vha, atio, 0, 0); in qlt_send_term_exchange()
3766 qlt_alloc_qfull_cmd(vha, atio, 0, 0); in qlt_send_term_exchange()
3771 qlt_unmap_sg(vha, cmd); in qlt_send_term_exchange()
3772 vha->hw->tgt.tgt_ops->free_cmd(cmd); in qlt_send_term_exchange()
3781 static void qlt_init_term_exchange(struct scsi_qla_host *vha) in qlt_init_term_exchange() argument
3786 vha->hw->tgt.leak_exchg_thresh_hold = in qlt_init_term_exchange()
3787 (vha->hw->cur_fw_xcb_count/100) * LEAK_EXCHG_THRESH_HOLD_PERCENT; in qlt_init_term_exchange()
3790 if (!list_empty(&vha->hw->tgt.q_full_list)) { in qlt_init_term_exchange()
3792 list_splice_init(&vha->hw->tgt.q_full_list, &free_list); in qlt_init_term_exchange()
3800 vha->hw->tgt.num_qfull_cmds_alloc--; in qlt_init_term_exchange()
3803 vha->hw->tgt.num_qfull_cmds_dropped = 0; in qlt_init_term_exchange()
3806 static void qlt_chk_exch_leak_thresh_hold(struct scsi_qla_host *vha) in qlt_chk_exch_leak_thresh_hold() argument
3810 total_leaked = vha->hw->tgt.num_qfull_cmds_dropped; in qlt_chk_exch_leak_thresh_hold()
3812 if (vha->hw->tgt.leak_exchg_thresh_hold && in qlt_chk_exch_leak_thresh_hold()
3813 (total_leaked > vha->hw->tgt.leak_exchg_thresh_hold)) { in qlt_chk_exch_leak_thresh_hold()
3815 ql_dbg(ql_dbg_tgt, vha, 0xe079, in qlt_chk_exch_leak_thresh_hold()
3817 total_leaked, vha->hw->cur_fw_xcb_count); in qlt_chk_exch_leak_thresh_hold()
3819 if (IS_P3P_TYPE(vha->hw)) in qlt_chk_exch_leak_thresh_hold()
3820 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qlt_chk_exch_leak_thresh_hold()
3822 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qlt_chk_exch_leak_thresh_hold()
3823 qla2xxx_wake_dpc(vha); in qlt_chk_exch_leak_thresh_hold()
3831 struct scsi_qla_host *vha = tgt->vha; in qlt_abort_cmd() local
3835 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf014, in qlt_abort_cmd()
3837 "(se_cmd=%p, tag=%llu)", vha->vp_idx, cmd, &cmd->se_cmd, in qlt_abort_cmd()
3843 qlt_unmap_sg(vha, cmd); in qlt_abort_cmd()
3851 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf016, in qlt_abort_cmd()
3870 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe074, in qlt_free_cmd()
3878 qlt_decr_num_pend_cmds(cmd->vha); in qlt_free_cmd()
3890 cmd->vha->hw->tgt.tgt_ops->rel_cmd(cmd); in qlt_free_cmd()
3901 struct scsi_qla_host *vha = qpair->vha; in qlt_term_ctio_exchange() local
3904 ql_dbg(ql_dbg_tgt_dif, vha, 0xe013, in qlt_term_ctio_exchange()
3929 static void *qlt_ctio_to_cmd(struct scsi_qla_host *vha, in qlt_ctio_to_cmd() argument
3942 } else if (vha->hw->req_q_map[qid]) { in qlt_ctio_to_cmd()
3943 ql_dbg(ql_dbg_tgt_mgt, vha, 0x1000a, in qlt_ctio_to_cmd()
3945 vha->vp_idx, rsp->id, handle); in qlt_ctio_to_cmd()
3946 req = vha->hw->req_q_map[qid]; in qlt_ctio_to_cmd()
3955 ql_dbg(ql_dbg_tgt, vha, 0xe052, in qlt_ctio_to_cmd()
3957 vha->vp_idx, handle); in qlt_ctio_to_cmd()
3963 ql_dbg(ql_dbg_async, vha, 0xe053, in qlt_ctio_to_cmd()
3965 vha->vp_idx, handle, req->id, rsp->id); in qlt_ctio_to_cmd()
3971 ql_dbg(ql_dbg_tgt, vha, 0xe054, in qlt_ctio_to_cmd()
3973 "support NULL handles\n", vha->vp_idx); in qlt_ctio_to_cmd()
3983 static void qlt_do_ctio_completion(struct scsi_qla_host *vha, in qlt_do_ctio_completion() argument
3986 struct qla_hw_data *ha = vha->hw; in qlt_do_ctio_completion()
3994 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01d, in qlt_do_ctio_completion()
4001 cmd = qlt_ctio_to_cmd(vha, rsp, handle, ctio); in qlt_do_ctio_completion()
4007 qlt_chk_edif_rx_sa_delete_pending(vha, cmd->sess, in qlt_do_ctio_completion()
4014 qlt_unmap_sg(vha, cmd); in qlt_do_ctio_completion()
4020 dev_info(&vha->hw->pdev->dev, in qlt_do_ctio_completion()
4022 vha->vp_idx, cmd->atio.u.isp24.attr, in qlt_do_ctio_completion()
4033 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf058, in qlt_do_ctio_completion()
4037 "TIMEOUT=b, INVALID_RX_ID=8)\n", vha->vp_idx, in qlt_do_ctio_completion()
4047 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf059, in qlt_do_ctio_completion()
4049 "received (state %x, se_cmd %p)\n", vha->vp_idx, in qlt_do_ctio_completion()
4059 ql_dbg(ql_dbg_disc, vha, 0x20f8, in qlt_do_ctio_completion()
4070 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf073, in qlt_do_ctio_completion()
4074 vha->vp_idx, status, cmd->state, se_cmd, in qlt_do_ctio_completion()
4086 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05b, in qlt_do_ctio_completion()
4088 vha->vp_idx, status, cmd->state, se_cmd); in qlt_do_ctio_completion()
4092 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05b, in qlt_do_ctio_completion()
4094 vha->vp_idx, status, cmd->state, se_cmd); in qlt_do_ctio_completion()
4125 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01e, in qlt_do_ctio_completion()
4129 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05c, in qlt_do_ctio_completion()
4131 "not return a CTIO complete\n", vha->vp_idx, cmd->state); in qlt_do_ctio_completion()
4136 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01f, "Finishing failed CTIO\n"); in qlt_do_ctio_completion()
4143 static inline int qlt_get_fcp_task_attr(struct scsi_qla_host *vha, in qlt_get_fcp_task_attr() argument
4165 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05d, in qlt_get_fcp_task_attr()
4180 scsi_qla_host_t *vha = cmd->vha; in __qlt_do_work() local
4181 struct qla_hw_data *ha = vha->hw; in __qlt_do_work()
4194 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf082, in __qlt_do_work()
4215 fcp_task_attr = qlt_get_fcp_task_attr(vha, in __qlt_do_work()
4219 ret = ha->tgt.tgt_ops->handle_cmd(vha, cmd, cdb, data_length, in __qlt_do_work()
4230 ql_dbg(ql_dbg_io, vha, 0x3060, "Terminating work cmd %p", cmd); in __qlt_do_work()
4239 qlt_decr_num_pend_cmds(vha); in __qlt_do_work()
4240 cmd->vha->hw->tgt.tgt_ops->rel_cmd(cmd); in __qlt_do_work()
4249 scsi_qla_host_t *vha = cmd->vha; in qlt_do_work() local
4252 spin_lock_irqsave(&vha->cmd_list_lock, flags); in qlt_do_work()
4254 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); in qlt_do_work()
4259 void qlt_clr_qp_table(struct scsi_qla_host *vha) in qlt_clr_qp_table() argument
4262 struct qla_hw_data *ha = vha->hw; in qlt_clr_qp_table()
4263 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_clr_qp_table()
4267 ql_log(ql_log_info, vha, 0x706c, in qlt_clr_qp_table()
4284 static void qlt_assign_qpair(struct scsi_qla_host *vha, in qlt_assign_qpair() argument
4288 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_assign_qpair()
4291 if (vha->flags.qpairs_available) { in qlt_assign_qpair()
4297 pci_get_drvdata(vha->hw->pdev); in qlt_assign_qpair()
4299 qpair = vha->hw->base_qpair; in qlt_assign_qpair()
4308 ql_log(ql_log_info, vha, 0xd037, in qlt_assign_qpair()
4328 ql_log(ql_log_info, vha, 0xd038, in qlt_assign_qpair()
4350 ql_log(ql_log_info, vha, 0xd039, in qlt_assign_qpair()
4363 static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, in qlt_get_tag() argument
4369 cmd = vha->hw->tgt.tgt_ops->get_cmd(sess); in qlt_get_tag()
4377 cmd->tgt = vha->vha_tgt.qla_tgt; in qlt_get_tag()
4378 qlt_incr_num_pend_cmds(vha); in qlt_get_tag()
4379 cmd->vha = vha; in qlt_get_tag()
4389 qlt_assign_qpair(vha, cmd); in qlt_get_tag()
4390 cmd->reset_count = vha->hw->base_qpair->chip_reset; in qlt_get_tag()
4391 cmd->vp_idx = vha->vp_idx; in qlt_get_tag()
4398 static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha, in qlt_handle_cmd_for_atio() argument
4401 struct qla_hw_data *ha = vha->hw; in qlt_handle_cmd_for_atio()
4402 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_handle_cmd_for_atio()
4409 ql_dbg(ql_dbg_io, vha, 0x3061, in qlt_handle_cmd_for_atio()
4418 sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, atio->u.isp24.fcp_hdr.s_id); in qlt_handle_cmd_for_atio()
4425 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf002, in qlt_handle_cmd_for_atio()
4435 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004, in qlt_handle_cmd_for_atio()
4442 cmd = qlt_get_tag(vha, sess, atio); in qlt_handle_cmd_for_atio()
4444 ql_dbg(ql_dbg_io, vha, 0x3062, in qlt_handle_cmd_for_atio()
4445 "qla_target(%d): Allocation of cmd failed\n", vha->vp_idx); in qlt_handle_cmd_for_atio()
4453 spin_lock_irqsave(&vha->cmd_list_lock, flags); in qlt_handle_cmd_for_atio()
4454 list_add_tail(&cmd->cmd_list, &vha->qla_cmd_list); in qlt_handle_cmd_for_atio()
4455 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); in qlt_handle_cmd_for_atio()
4458 if (vha->flags.qpairs_available) { in qlt_handle_cmd_for_atio()
4477 struct scsi_qla_host *vha = sess->vha; in qlt_issue_task_mgmt() local
4478 struct qla_hw_data *ha = vha->hw; in qlt_issue_task_mgmt()
4481 struct qla_qpair_hint *h = &vha->vha_tgt.qla_tgt->qphints[0]; in qlt_issue_task_mgmt()
4485 ql_dbg(ql_dbg_tgt_tmr, vha, 0x10009, in qlt_issue_task_mgmt()
4488 "leak\n", vha->vp_idx); in qlt_issue_task_mgmt()
4502 mcmd->vha = vha; in qlt_issue_task_mgmt()
4510 abort_cmds_for_lun(vha, lun, a->u.isp24.fcp_hdr.s_id); in qlt_issue_task_mgmt()
4513 h = qlt_find_qphint(vha, mcmd->unpacked_lun); in qlt_issue_task_mgmt()
4535 static int qlt_handle_task_mgmt(struct scsi_qla_host *vha, void *iocb) in qlt_handle_task_mgmt() argument
4538 struct qla_hw_data *ha = vha->hw; in qlt_handle_task_mgmt()
4547 sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, in qlt_handle_task_mgmt()
4561 static int __qlt_abort_task(struct scsi_qla_host *vha, in __qlt_abort_task() argument
4565 struct qla_hw_data *ha = vha->hw; in __qlt_abort_task()
4572 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05f, in __qlt_abort_task()
4574 vha->vp_idx, __func__); in __qlt_abort_task()
4592 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf060, in __qlt_abort_task()
4594 vha->vp_idx, rc); in __qlt_abort_task()
4603 static int qlt_abort_task(struct scsi_qla_host *vha, in qlt_abort_task() argument
4606 struct qla_hw_data *ha = vha->hw; in qlt_abort_task()
4614 sess = ha->tgt.tgt_ops->find_sess_by_loop_id(vha, loop_id); in qlt_abort_task()
4618 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf025, in qlt_abort_task()
4620 "session\n", vha->vp_idx); in qlt_abort_task()
4621 return qlt_sched_sess_work(vha->vha_tgt.qla_tgt, in qlt_abort_task()
4625 return __qlt_abort_task(vha, iocb, sess); in qlt_abort_task()
4631 ql_dbg(ql_dbg_tgt_mgt, fcport->vha, 0xf093, in qlt_logo_completion_handler()
4654 qlt_find_sess_invalidate_other(scsi_qla_host_t *vha, uint64_t wwn, in qlt_find_sess_invalidate_other() argument
4662 list_for_each_entry(other_sess, &vha->vp_fcports, list) { in qlt_find_sess_invalidate_other()
4675 ql_dbg(ql_dbg_disc, vha, 0x1000c, in qlt_find_sess_invalidate_other()
4691 ql_dbg(ql_dbg_disc, vha, 0xf01b, in qlt_find_sess_invalidate_other()
4706 ql_dbg(ql_dbg_disc, vha, 0x1000d, in qlt_find_sess_invalidate_other()
4720 static int abort_cmds_for_s_id(struct scsi_qla_host *vha, port_id_t *s_id) in abort_cmds_for_s_id() argument
4732 spin_lock_irqsave(&vha->cmd_list_lock, flags); in abort_cmds_for_s_id()
4733 list_for_each_entry(op, &vha->qla_sess_op_cmd_list, cmd_list) { in abort_cmds_for_s_id()
4742 list_for_each_entry(op, &vha->unknown_atio_list, cmd_list) { in abort_cmds_for_s_id()
4751 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmds_for_s_id()
4759 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); in abort_cmds_for_s_id()
4764 static int qlt_handle_login(struct scsi_qla_host *vha, in qlt_handle_login() argument
4775 lockdep_assert_held(&vha->hw->hardware_lock); in qlt_handle_login()
4787 abort_cmds_for_s_id(vha, &port_id); in qlt_handle_login()
4790 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); in qlt_handle_login()
4791 sess = qlt_find_sess_invalidate_other(vha, wwn, in qlt_handle_login()
4793 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qlt_handle_login()
4795 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4798 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_handle_login()
4807 if (vha->hw->flags.edif_enabled && in qlt_handle_login()
4808 !(vha->e_dbell.db_flags & EDB_ACTIVE) && in qlt_handle_login()
4811 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4814 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_handle_login()
4818 if (vha->hw->flags.edif_enabled) { in qlt_handle_login()
4819 if (DBELL_INACTIVE(vha)) { in qlt_handle_login()
4820 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4823 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_handle_login()
4827 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4830 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_handle_login()
4835 pla = qlt_plogi_ack_find_add(vha, &port_id, iocb); in qlt_handle_login()
4837 ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0xffff, in qlt_handle_login()
4841 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_handle_login()
4847 qlt_plogi_ack_link(vha, pla, conflict_sess, in qlt_handle_login()
4853 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4857 qla24xx_post_newsess_work(vha, &port_id, in qlt_handle_login()
4862 qla24xx_post_newsess_work(vha, &port_id, in qlt_handle_login()
4883 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4893 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_handle_login()
4897 qlt_plogi_ack_link(vha, pla, sess, QLT_PLOGI_LINK_SAME_WWN); in qlt_handle_login()
4904 if (N2N_TOPO(vha->hw) && fcport_is_bigger(sess)) in qlt_handle_login()
4905 vha->d_id = sess->d_id; in qlt_handle_login()
4907 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_handle_login()
4911 qla2x00_post_aen_work(vha, FCH_EVT_PORT_ONLINE, in qlt_handle_login()
4935 ql_dbg(ql_dbg_disc, vha, 0x20f9, in qlt_handle_login()
4942 qlt_plogi_ack_unref(vha, pla); in qlt_handle_login()
4967 ql_dbg(ql_dbg_disc, vha, 0x20f9, in qlt_handle_login()
4982 static int qlt_24xx_handle_els(struct scsi_qla_host *vha, in qlt_24xx_handle_els() argument
4985 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_24xx_handle_els()
4986 struct qla_hw_data *ha = vha->hw; in qlt_24xx_handle_els()
5006 ql_dbg(ql_dbg_disc, vha, 0xf026, in qlt_24xx_handle_els()
5008 vha->vp_idx, iocb->u.isp24.port_id[2], in qlt_24xx_handle_els()
5018 res = qlt_handle_login(vha, iocb); in qlt_24xx_handle_els()
5023 sess = qla2x00_find_fcport_by_wwpn(vha, in qlt_24xx_handle_els()
5026 if (vha->hw->flags.edif_enabled && sess && in qlt_24xx_handle_els()
5029 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_24xx_handle_els()
5032 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_24xx_handle_els()
5037 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_24xx_handle_els()
5041 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_24xx_handle_els()
5045 res = qlt_handle_login(vha, iocb); in qlt_24xx_handle_els()
5058 sess = qlt_find_sess_invalidate_other(vha, wwn, port_id, in qlt_24xx_handle_els()
5069 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf09b, in qlt_24xx_handle_els()
5074 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_24xx_handle_els()
5084 if (vha->hw->flags.edif_enabled && sess && in qlt_24xx_handle_els()
5087 ql_dbg(ql_dbg_disc, vha, 0xffff, in qlt_24xx_handle_els()
5090 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_24xx_handle_els()
5115 ql_dbg(ql_dbg_disc, sess->vha, 0xffff, in qlt_24xx_handle_els()
5119 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_24xx_handle_els()
5140 ql_log(ql_log_warn, sess->vha, 0xf095, in qlt_24xx_handle_els()
5143 qlt_send_term_imm_notif(vha, iocb, 1); in qlt_24xx_handle_els()
5152 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf096, in qlt_24xx_handle_els()
5176 ql_dbg(ql_dbg_disc, vha, 0x20fa, in qlt_24xx_handle_els()
5179 qla24xx_post_nack_work(vha, sess, iocb, in qlt_24xx_handle_els()
5183 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qlt_24xx_handle_els()
5184 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qlt_24xx_handle_els()
5185 qla2xxx_wake_dpc(vha); in qlt_24xx_handle_els()
5189 ql_dbg(ql_dbg_disc, vha, 0x20fb, in qlt_24xx_handle_els()
5192 qla24xx_post_nack_work(vha, sess, iocb, in qlt_24xx_handle_els()
5203 qlt_reset(vha, iocb, QLA_TGT_NEXUS_LOSS); in qlt_24xx_handle_els()
5211 sess = qla2x00_find_fcport_by_loopid(vha, loop_id); in qlt_24xx_handle_els()
5221 res = qlt_reset(vha, iocb, QLA_TGT_NEXUS_LOSS_SESS); in qlt_24xx_handle_els()
5223 ql_dbg(ql_dbg_disc, vha, 0x20fc, in qlt_24xx_handle_els()
5245 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_24xx_handle_els()
5253 sess = qla2x00_find_fcport_by_wwpn(vha, in qlt_24xx_handle_els()
5256 ql_dbg(ql_dbg_disc, vha, 0x20fd, in qlt_24xx_handle_els()
5268 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf061, in qlt_24xx_handle_els()
5270 "received\n", vha->vp_idx, iocb->u.isp24.status_subcode); in qlt_24xx_handle_els()
5271 res = qlt_reset(vha, iocb, QLA_TGT_NEXUS_LOSS_SESS); in qlt_24xx_handle_els()
5275 ql_dbg(ql_dbg_disc, vha, 0xf026, in qlt_24xx_handle_els()
5277 vha->vp_idx, iocb->u.isp24.status_subcode, res); in qlt_24xx_handle_els()
5286 static void qlt_handle_imm_notify(struct scsi_qla_host *vha, in qlt_handle_imm_notify() argument
5289 struct qla_hw_data *ha = vha->hw; in qlt_handle_imm_notify()
5300 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf032, in qlt_handle_imm_notify()
5302 vha->vp_idx, le16_to_cpu(iocb->u.isp24.nport_handle), in qlt_handle_imm_notify()
5305 if (qlt_reset(vha, iocb, QLA_TGT_ABORT_ALL) == 0) in qlt_handle_imm_notify()
5312 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_handle_imm_notify()
5314 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf033, in qlt_handle_imm_notify()
5316 "subcode %x)\n", vha->vp_idx, in qlt_handle_imm_notify()
5334 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf034, in qlt_handle_imm_notify()
5336 "%#x, subcode %x)\n", vha->vp_idx, in qlt_handle_imm_notify()
5340 if (qlt_reset(vha, iocb, QLA_TGT_NEXUS_LOSS_SESS) == 0) in qlt_handle_imm_notify()
5346 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf035, in qlt_handle_imm_notify()
5347 "qla_target(%d): Global TPRLO (%x)\n", vha->vp_idx, status); in qlt_handle_imm_notify()
5348 if (qlt_reset(vha, iocb, QLA_TGT_NEXUS_LOSS) == 0) in qlt_handle_imm_notify()
5354 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf036, in qlt_handle_imm_notify()
5355 "qla_target(%d): Port config changed (%x)\n", vha->vp_idx, in qlt_handle_imm_notify()
5357 if (qlt_reset(vha, iocb, QLA_TGT_ABORT_ALL) == 0) in qlt_handle_imm_notify()
5363 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06a, in qlt_handle_imm_notify()
5365 vha->vp_idx); in qlt_handle_imm_notify()
5367 if (qlt_reset(vha, iocb, QLA_TGT_NEXUS_LOSS) == 0) in qlt_handle_imm_notify()
5372 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06b, in qlt_handle_imm_notify()
5375 "resource count)\n", vha->vp_idx); in qlt_handle_imm_notify()
5379 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf037, in qlt_handle_imm_notify()
5381 "L %#x)\n", vha->vp_idx, in qlt_handle_imm_notify()
5385 if (qlt_abort_task(vha, iocb) == 0) in qlt_handle_imm_notify()
5390 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06c, in qlt_handle_imm_notify()
5392 vha->vp_idx, vha->host_no); in qlt_handle_imm_notify()
5396 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf038, in qlt_handle_imm_notify()
5398 vha->vp_idx, iocb->u.isp2x.task_flags); in qlt_handle_imm_notify()
5402 if (qlt_24xx_handle_els(vha, iocb) == 0) in qlt_handle_imm_notify()
5406 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06d, in qlt_handle_imm_notify()
5408 "notify status %x\n", vha->vp_idx, status); in qlt_handle_imm_notify()
5424 struct scsi_qla_host *vha = qpair->vha; in __qlt_send_busy() local
5426 struct qla_hw_data *ha = vha->hw; in __qlt_send_busy()
5436 sess = qla2x00_find_fcport_by_nportid(vha, &id, 1); in __qlt_send_busy()
5446 ql_dbg(ql_dbg_io, vha, 0x3063, in __qlt_send_busy()
5448 "request packet", vha->vp_idx, __func__); in __qlt_send_busy()
5460 ctio24->vp_index = vha->vp_idx; in __qlt_send_busy()
5485 qla2x00_start_iocbs(vha, qpair->req); in __qlt_send_busy()
5495 qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, in qlt_alloc_qfull_cmd() argument
5498 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_alloc_qfull_cmd()
5499 struct qla_hw_data *ha = vha->hw; in qlt_alloc_qfull_cmd()
5505 ql_dbg(ql_dbg_io, vha, 0x300a, in qlt_alloc_qfull_cmd()
5510 if ((vha->hw->tgt.num_qfull_cmds_alloc + 1) > MAX_QFULL_CMDS_ALLOC) { in qlt_alloc_qfull_cmd()
5511 vha->hw->tgt.num_qfull_cmds_dropped++; in qlt_alloc_qfull_cmd()
5512 if (vha->hw->tgt.num_qfull_cmds_dropped > in qlt_alloc_qfull_cmd()
5513 vha->qla_stats.stat_max_qfull_cmds_dropped) in qlt_alloc_qfull_cmd()
5514 vha->qla_stats.stat_max_qfull_cmds_dropped = in qlt_alloc_qfull_cmd()
5515 vha->hw->tgt.num_qfull_cmds_dropped; in qlt_alloc_qfull_cmd()
5517 ql_dbg(ql_dbg_io, vha, 0x3068, in qlt_alloc_qfull_cmd()
5519 vha->vp_idx, __func__, in qlt_alloc_qfull_cmd()
5520 vha->hw->tgt.num_qfull_cmds_dropped); in qlt_alloc_qfull_cmd()
5522 qlt_chk_exch_leak_thresh_hold(vha); in qlt_alloc_qfull_cmd()
5527 (vha, atio->u.isp24.fcp_hdr.s_id); in qlt_alloc_qfull_cmd()
5533 ql_dbg(ql_dbg_io, vha, 0x3009, in qlt_alloc_qfull_cmd()
5535 vha->vp_idx, __func__); in qlt_alloc_qfull_cmd()
5537 vha->hw->tgt.num_qfull_cmds_dropped++; in qlt_alloc_qfull_cmd()
5538 if (vha->hw->tgt.num_qfull_cmds_dropped > in qlt_alloc_qfull_cmd()
5539 vha->qla_stats.stat_max_qfull_cmds_dropped) in qlt_alloc_qfull_cmd()
5540 vha->qla_stats.stat_max_qfull_cmds_dropped = in qlt_alloc_qfull_cmd()
5541 vha->hw->tgt.num_qfull_cmds_dropped; in qlt_alloc_qfull_cmd()
5543 qlt_chk_exch_leak_thresh_hold(vha); in qlt_alloc_qfull_cmd()
5547 qlt_incr_num_pend_cmds(vha); in qlt_alloc_qfull_cmd()
5551 cmd->tgt = vha->vha_tgt.qla_tgt; in qlt_alloc_qfull_cmd()
5552 cmd->vha = vha; in qlt_alloc_qfull_cmd()
5564 spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags); in qlt_alloc_qfull_cmd()
5565 list_add_tail(&cmd->cmd_list, &vha->hw->tgt.q_full_list); in qlt_alloc_qfull_cmd()
5567 vha->hw->tgt.num_qfull_cmds_alloc++; in qlt_alloc_qfull_cmd()
5568 if (vha->hw->tgt.num_qfull_cmds_alloc > in qlt_alloc_qfull_cmd()
5569 vha->qla_stats.stat_max_qfull_cmds_alloc) in qlt_alloc_qfull_cmd()
5570 vha->qla_stats.stat_max_qfull_cmds_alloc = in qlt_alloc_qfull_cmd()
5571 vha->hw->tgt.num_qfull_cmds_alloc; in qlt_alloc_qfull_cmd()
5572 spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags); in qlt_alloc_qfull_cmd()
5578 struct scsi_qla_host *vha = qpair->vha; in qlt_free_qfull_cmds() local
5579 struct qla_hw_data *ha = vha->hw; in qlt_free_qfull_cmds()
5591 spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags); in qlt_free_qfull_cmds()
5593 spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags); in qlt_free_qfull_cmds()
5597 list_splice_init(&vha->hw->tgt.q_full_list, &q_full_list); in qlt_free_qfull_cmds()
5598 spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags); in qlt_free_qfull_cmds()
5612 ql_dbg(ql_dbg_io, vha, 0x3006, in qlt_free_qfull_cmds()
5616 ql_dbg(ql_dbg_io, vha, 0x3007, in qlt_free_qfull_cmds()
5620 ql_dbg(ql_dbg_io, vha, 0x3008, in qlt_free_qfull_cmds()
5627 vha->hw->tgt.num_qfull_cmds_alloc--; in qlt_free_qfull_cmds()
5642 spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags); in qlt_free_qfull_cmds()
5643 list_splice(&q_full_list, &vha->hw->tgt.q_full_list); in qlt_free_qfull_cmds()
5644 spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags); in qlt_free_qfull_cmds()
5655 struct scsi_qla_host *vha = qpair->vha; in qlt_send_busy() local
5659 qlt_alloc_qfull_cmd(vha, atio, status, 1); in qlt_send_busy()
5663 qlt_chk_qfull_thresh_hold(struct scsi_qla_host *vha, struct qla_qpair *qpair, in qlt_chk_qfull_thresh_hold() argument
5666 struct qla_hw_data *ha = vha->hw; in qlt_chk_qfull_thresh_hold()
5683 static void qlt_24xx_atio_pkt(struct scsi_qla_host *vha, in qlt_24xx_atio_pkt() argument
5686 struct qla_hw_data *ha = vha->hw; in qlt_24xx_atio_pkt()
5687 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_24xx_atio_pkt()
5692 ql_dbg(ql_dbg_tgt, vha, 0x3064, in qlt_24xx_atio_pkt()
5707 ql_dbg(ql_dbg_io, vha, 0x3065, in qlt_24xx_atio_pkt()
5710 "sending QUEUE_FULL\n", vha->vp_idx); in qlt_24xx_atio_pkt()
5721 rc = qlt_chk_qfull_thresh_hold(vha, ha->base_qpair, in qlt_24xx_atio_pkt()
5727 rc = qlt_handle_cmd_for_atio(vha, atio); in qlt_24xx_atio_pkt()
5729 rc = qlt_handle_task_mgmt(vha, atio); in qlt_24xx_atio_pkt()
5736 ql_dbg(ql_dbg_tgt, vha, 0xe05f, in qlt_24xx_atio_pkt()
5740 ql_dbg(ql_dbg_tgt, vha, 0xe05f, in qlt_24xx_atio_pkt()
5746 ql_dbg(ql_dbg_tgt, vha, 0xe060, in qlt_24xx_atio_pkt()
5748 vha->vp_idx); in qlt_24xx_atio_pkt()
5753 ql_dbg(ql_dbg_tgt, vha, 0xe060, in qlt_24xx_atio_pkt()
5755 vha->vp_idx); in qlt_24xx_atio_pkt()
5769 ql_dbg(ql_dbg_tgt, vha, 0xe05b, in qlt_24xx_atio_pkt()
5771 "with error status %x\n", vha->vp_idx, in qlt_24xx_atio_pkt()
5776 ql_dbg(ql_dbg_tgt, vha, 0xe02e, "%s", "IMMED_NOTIFY ATIO"); in qlt_24xx_atio_pkt()
5780 qlt_handle_imm_notify(vha, (struct imm_ntfy_from_isp *)atio); in qlt_24xx_atio_pkt()
5787 ql_dbg(ql_dbg_tgt, vha, 0xe05c, in qlt_24xx_atio_pkt()
5789 "type %x\n", vha->vp_idx, atio->u.raw.entry_type); in qlt_24xx_atio_pkt()
5801 static int qlt_chk_unresolv_exchg(struct scsi_qla_host *vha, in qlt_chk_unresolv_exchg() argument
5804 struct qla_hw_data *ha = vha->hw; in qlt_chk_unresolv_exchg()
5820 ql_log(ql_log_warn, vha, 0xffff, in qlt_chk_unresolv_exchg()
5823 vha, 0xffff, (uint8_t *)entry, sizeof(*entry)); in qlt_chk_unresolv_exchg()
5826 ha->isp_ops->fw_dump(vha); in qlt_chk_unresolv_exchg()
5828 qla2xxx_dump_fw(vha); in qlt_chk_unresolv_exchg()
5830 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qlt_chk_unresolv_exchg()
5831 qla2xxx_wake_dpc(vha); in qlt_chk_unresolv_exchg()
5843 static void qlt_handle_abts_completion(struct scsi_qla_host *vha, in qlt_handle_abts_completion() argument
5850 struct qla_hw_data *ha = vha->hw; in qlt_handle_abts_completion()
5852 mcmd = qlt_ctio_to_cmd(vha, rsp, pkt->handle, pkt); in qlt_handle_abts_completion()
5854 ql_dbg(ql_dbg_async, vha, 0xe064, in qlt_handle_abts_completion()
5856 vha->vp_idx); in qlt_handle_abts_completion()
5861 vha = mcmd->vha; in qlt_handle_abts_completion()
5862 vha->vha_tgt.qla_tgt->abts_resp_expected--; in qlt_handle_abts_completion()
5864 ql_dbg(ql_dbg_tgt, vha, 0xe038, in qlt_handle_abts_completion()
5871 if (qlt_chk_unresolv_exchg(vha, rsp->qpair, entry)) { in qlt_handle_abts_completion()
5875 qlt_24xx_retry_term_exchange(vha, rsp->qpair, in qlt_handle_abts_completion()
5878 ql_dbg(ql_dbg_tgt, vha, 0xe063, in qlt_handle_abts_completion()
5880 vha->vp_idx, entry->compl_status, in qlt_handle_abts_completion()
5892 static void qlt_response_pkt(struct scsi_qla_host *vha, in qlt_response_pkt() argument
5895 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_response_pkt()
5898 ql_dbg(ql_dbg_tgt, vha, 0xe05d, in qlt_response_pkt()
5900 vha->vp_idx, pkt->entry_type, vha->hw); in qlt_response_pkt()
5915 qlt_do_ctio_completion(vha, rsp, entry->handle, in qlt_response_pkt()
5928 ql_dbg(ql_dbg_tgt, vha, 0xe05e, in qlt_response_pkt()
5930 "status %x received\n", vha->vp_idx, in qlt_response_pkt()
5935 rc = qlt_chk_qfull_thresh_hold(vha, rsp->qpair, atio, 1); in qlt_response_pkt()
5939 rc = qlt_handle_cmd_for_atio(vha, atio); in qlt_response_pkt()
5943 ql_dbg(ql_dbg_tgt, vha, 0xe05f, in qlt_response_pkt()
5947 ql_dbg(ql_dbg_tgt, vha, 0xe05f, in qlt_response_pkt()
5953 ql_dbg(ql_dbg_tgt, vha, 0xe060, in qlt_response_pkt()
5955 vha->vp_idx); in qlt_response_pkt()
5960 ql_dbg(ql_dbg_tgt, vha, 0xe060, in qlt_response_pkt()
5962 vha->vp_idx); in qlt_response_pkt()
5975 qlt_do_ctio_completion(vha, rsp, entry->handle, in qlt_response_pkt()
5985 qlt_do_ctio_completion(vha, rsp, entry->handle, in qlt_response_pkt()
5992 ql_dbg(ql_dbg_tgt, vha, 0xe035, "%s", "IMMED_NOTIFY\n"); in qlt_response_pkt()
5993 qlt_handle_imm_notify(vha, (struct imm_ntfy_from_isp *)pkt); in qlt_response_pkt()
6000 ql_dbg(ql_dbg_tgt, vha, 0xe036, in qlt_response_pkt()
6007 ql_dbg(ql_dbg_tgt, vha, 0xe061, in qlt_response_pkt()
6009 "failed %x\n", vha->vp_idx, in qlt_response_pkt()
6013 ql_dbg(ql_dbg_tgt, vha, 0xe062, in qlt_response_pkt()
6015 vha->vp_idx); in qlt_response_pkt()
6020 ql_dbg(ql_dbg_tgt, vha, 0xe037, in qlt_response_pkt()
6021 "ABTS_RECV_24XX: instance %d\n", vha->vp_idx); in qlt_response_pkt()
6022 qlt_24xx_handle_abts(vha, (struct abts_recv_from_24xx *)pkt); in qlt_response_pkt()
6027 qlt_handle_abts_completion(vha, rsp, pkt); in qlt_response_pkt()
6029 ql_dbg(ql_dbg_tgt, vha, 0xe064, in qlt_response_pkt()
6031 "received\n", vha->vp_idx); in qlt_response_pkt()
6036 ql_dbg(ql_dbg_tgt, vha, 0xe065, in qlt_response_pkt()
6038 "type %x\n", vha->vp_idx, pkt->entry_type); in qlt_response_pkt()
6047 void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, in qlt_async_event() argument
6050 struct qla_hw_data *ha = vha->hw; in qlt_async_event()
6051 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_async_event()
6071 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03a, in qlt_async_event()
6073 "occurred", vha->vp_idx, code); in qlt_async_event()
6076 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qlt_async_event()
6081 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03b, in qlt_async_event()
6083 "(m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, in qlt_async_event()
6098 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03c, in qlt_async_event()
6100 "(m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, code, in qlt_async_event()
6105 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf017, in qlt_async_event()
6107 vha->vp_idx, in qlt_async_event()
6112 vha->hw->exch_starvation++; in qlt_async_event()
6113 if (vha->hw->exch_starvation > 5) { in qlt_async_event()
6114 ql_log(ql_log_warn, vha, 0xd03a, in qlt_async_event()
6117 vha->hw->exch_starvation = 0; in qlt_async_event()
6118 if (IS_P3P_TYPE(vha->hw)) in qlt_async_event()
6120 &vha->dpc_flags); in qlt_async_event()
6123 &vha->dpc_flags); in qlt_async_event()
6124 qla2xxx_wake_dpc(vha); in qlt_async_event()
6130 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03d, in qlt_async_event()
6133 "m[2]=%x, m[3]=%x)", vha->vp_idx, code, in qlt_async_event()
6138 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03e, in qlt_async_event()
6140 vha->hw->exch_starvation = 0; in qlt_async_event()
6142 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03f, in qlt_async_event()
6151 static fc_port_t *qlt_get_port_database(struct scsi_qla_host *vha, in qlt_get_port_database() argument
6159 fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL); in qlt_get_port_database()
6161 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06f, in qlt_get_port_database()
6163 vha->vp_idx); in qlt_get_port_database()
6169 rc = qla24xx_gpdb_wait(vha, fcport, 0); in qlt_get_port_database()
6171 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf070, in qlt_get_port_database()
6174 "(loop_id=0x%04x)", vha->vp_idx, rc, loop_id); in qlt_get_port_database()
6180 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); in qlt_get_port_database()
6181 tfcp = qla2x00_find_fcport_by_wwpn(vha, fcport->port_name, 1); in qlt_get_port_database()
6193 if (vha->hw->current_topology == ISP_CFG_F) in qlt_get_port_database()
6196 list_add_tail(&fcport->list, &vha->vp_fcports); in qlt_get_port_database()
6198 vha->fcport_count++; in qlt_get_port_database()
6206 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); in qlt_get_port_database()
6208 switch (vha->host->active_mode) { in qlt_get_port_database()
6212 if (!IS_IIDMA_CAPABLE(vha->hw) || !vha->hw->flags.gpsc_supported) { in qlt_get_port_database()
6215 ql_dbg(ql_dbg_disc, vha, 0x20ff, in qlt_get_port_database()
6217 __func__, __LINE__, fcport->port_name, vha->fcport_count); in qlt_get_port_database()
6218 qla24xx_post_gpsc_work(vha, fcport); in qlt_get_port_database()
6234 static struct fc_port *qlt_make_local_sess(struct scsi_qla_host *vha, in qlt_make_local_sess() argument
6247 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf042, in qlt_make_local_sess()
6253 mutex_lock(&vha->vha_tgt.tgt_mutex); in qlt_make_local_sess()
6257 atomic_read(&vha->vha_tgt.qla_tgt->tgt_global_resets_count); in qlt_make_local_sess()
6259 rc = qla24xx_get_loop_id(vha, s_id, &loop_id); in qlt_make_local_sess()
6261 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_make_local_sess()
6263 ql_log(ql_log_info, vha, 0xf071, in qlt_make_local_sess()
6266 vha->vp_idx, s_id.domain, s_id.area, s_id.al_pa); in qlt_make_local_sess()
6273 qlt_send_first_logo(vha, &logo); in qlt_make_local_sess()
6279 fcport = qlt_get_port_database(vha, loop_id); in qlt_make_local_sess()
6281 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_make_local_sess()
6286 atomic_read(&vha->vha_tgt.qla_tgt->tgt_global_resets_count)) { in qlt_make_local_sess()
6287 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf043, in qlt_make_local_sess()
6289 "(counter was %d, new %d), retrying", vha->vp_idx, in qlt_make_local_sess()
6291 atomic_read(&vha->vha_tgt. in qlt_make_local_sess()
6296 sess = qlt_create_sess(vha, fcport, true); in qlt_make_local_sess()
6298 mutex_unlock(&vha->vha_tgt.tgt_mutex); in qlt_make_local_sess()
6306 struct scsi_qla_host *vha = tgt->vha; in qlt_abort_work() local
6307 struct qla_hw_data *ha = vha->hw; in qlt_abort_work()
6320 sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, s_id); in qlt_abort_work()
6324 sess = qlt_make_local_sess(vha, s_id); in qlt_abort_work()
6337 ql_dbg(ql_dbg_tgt_tmr, vha, 0xf01c, in qlt_abort_work()
6345 rc = __qlt_24xx_handle_abts(vha, &prm->abts, sess); in qlt_abort_work()
6368 struct scsi_qla_host *vha = tgt->vha; in qlt_tmr_work() local
6369 struct qla_hw_data *ha = vha->hw; in qlt_tmr_work()
6384 sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, s_id); in qlt_tmr_work()
6388 sess = qlt_make_local_sess(vha, s_id); in qlt_tmr_work()
6400 ql_dbg(ql_dbg_tgt_tmr, vha, 0xf020, in qlt_tmr_work()
6430 struct scsi_qla_host *vha = tgt->vha; in qlt_sess_work_fn() local
6433 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf000, "Sess work (tgt %p)", tgt); in qlt_sess_work_fn()
6540 tgt->vha = base_vha; in qlt_add_target()
6567 int qlt_remove_target(struct qla_hw_data *ha, struct scsi_qla_host *vha) in qlt_remove_target() argument
6569 if (!vha->vha_tgt.qla_tgt) in qlt_remove_target()
6572 if (vha->fc_vport) { in qlt_remove_target()
6573 qlt_release(vha->vha_tgt.qla_tgt); in qlt_remove_target()
6578 qlt_init_term_exchange(vha); in qlt_remove_target()
6580 ql_dbg(ql_dbg_tgt, vha, 0xe03c, "Unregistering target for host %ld(%p)", in qlt_remove_target()
6581 vha->host_no, ha); in qlt_remove_target()
6582 qlt_release(vha->vha_tgt.qla_tgt); in qlt_remove_target()
6598 static void qlt_lport_dump(struct scsi_qla_host *vha, u64 wwpn, in qlt_lport_dump() argument
6601 pr_debug("qla2xxx HW vha->node_name: %8phC\n", vha->node_name); in qlt_lport_dump()
6602 pr_debug("qla2xxx HW vha->port_name: %8phC\n", vha->port_name); in qlt_lport_dump()
6621 struct scsi_qla_host *vha; in qlt_lport_register() local
6630 vha = tgt->vha; in qlt_lport_register()
6631 ha = vha->hw; in qlt_lport_register()
6633 host = vha->host; in qlt_lport_register()
6640 if (vha->qlini_mode == QLA2XXX_INI_MODE_ENABLED) in qlt_lport_register()
6659 ql_dbg(ql_dbg_tgt, vha, 0xe068, in qlt_lport_register()
6664 qlt_lport_dump(vha, phys_wwpn, b); in qlt_lport_register()
6666 if (memcmp(vha->port_name, b, WWN_SIZE)) { in qlt_lport_register()
6670 rc = (*callback)(vha, target_lport_ptr, npiv_wwpn, npiv_wwnn); in qlt_lport_register()
6688 void qlt_lport_deregister(struct scsi_qla_host *vha) in qlt_lport_deregister() argument
6690 struct qla_hw_data *ha = vha->hw; in qlt_lport_deregister()
6691 struct Scsi_Host *sh = vha->host; in qlt_lport_deregister()
6695 vha->vha_tgt.target_lport_ptr = NULL; in qlt_lport_deregister()
6705 void qlt_set_mode(struct scsi_qla_host *vha) in qlt_set_mode() argument
6707 switch (vha->qlini_mode) { in qlt_set_mode()
6710 vha->host->active_mode = MODE_TARGET; in qlt_set_mode()
6713 vha->host->active_mode = MODE_INITIATOR; in qlt_set_mode()
6716 vha->host->active_mode = MODE_DUAL; in qlt_set_mode()
6724 static void qlt_clear_mode(struct scsi_qla_host *vha) in qlt_clear_mode() argument
6726 switch (vha->qlini_mode) { in qlt_clear_mode()
6728 vha->host->active_mode = MODE_UNKNOWN; in qlt_clear_mode()
6731 vha->host->active_mode = MODE_INITIATOR; in qlt_clear_mode()
6735 vha->host->active_mode = MODE_INITIATOR; in qlt_clear_mode()
6748 qlt_enable_vha(struct scsi_qla_host *vha) in qlt_enable_vha() argument
6750 struct qla_hw_data *ha = vha->hw; in qlt_enable_vha()
6751 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_enable_vha()
6756 ql_dbg(ql_dbg_tgt, vha, 0xe069, in qlt_enable_vha()
6762 if (vha->qlini_mode == QLA2XXX_INI_MODE_ENABLED) in qlt_enable_vha()
6769 qlt_set_mode(vha); in qlt_enable_vha()
6773 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf021, in qlt_enable_vha()
6775 if (vha->vp_idx) { in qlt_enable_vha()
6776 qla24xx_disable_vp(vha); in qlt_enable_vha()
6777 qla24xx_enable_vp(vha); in qlt_enable_vha()
6793 static void qlt_disable_vha(struct scsi_qla_host *vha) in qlt_disable_vha() argument
6795 struct qla_hw_data *ha = vha->hw; in qlt_disable_vha()
6796 struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; in qlt_disable_vha()
6800 ql_dbg(ql_dbg_tgt, vha, 0xe06a, in qlt_disable_vha()
6808 qlt_clear_mode(vha); in qlt_disable_vha()
6811 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qlt_disable_vha()
6812 qla2xxx_wake_dpc(vha); in qlt_disable_vha()
6818 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) in qlt_disable_vha()
6819 ql_dbg(ql_dbg_tgt, vha, 0xe081, in qlt_disable_vha()
6829 qlt_vport_create(struct scsi_qla_host *vha, struct qla_hw_data *ha) in qlt_vport_create() argument
6831 vha->vha_tgt.qla_tgt = NULL; in qlt_vport_create()
6833 mutex_init(&vha->vha_tgt.tgt_mutex); in qlt_vport_create()
6834 mutex_init(&vha->vha_tgt.tgt_host_action_mutex); in qlt_vport_create()
6836 qlt_clear_mode(vha); in qlt_vport_create()
6846 qlt_add_target(ha, vha); in qlt_vport_create()
6850 qlt_rff_id(struct scsi_qla_host *vha) in qlt_rff_id() argument
6856 if (qla_tgt_mode_enabled(vha)) { in qlt_rff_id()
6858 } else if (qla_ini_mode_enabled(vha)) { in qlt_rff_id()
6860 } else if (qla_dual_mode_enabled(vha)) in qlt_rff_id()
6876 qlt_init_atio_q_entries(struct scsi_qla_host *vha) in qlt_init_atio_q_entries() argument
6878 struct qla_hw_data *ha = vha->hw; in qlt_init_atio_q_entries()
6882 if (qla_ini_mode_enabled(vha)) in qlt_init_atio_q_entries()
6897 qlt_24xx_process_atio_queue(struct scsi_qla_host *vha, uint8_t ha_locked) in qlt_24xx_process_atio_queue() argument
6899 struct qla_hw_data *ha = vha->hw; in qlt_24xx_process_atio_queue()
6917 ql_log(ql_log_warn, vha, 0xd03c, in qlt_24xx_process_atio_queue()
6927 qlt_24xx_atio_pkt_all_vps(vha, in qlt_24xx_process_atio_queue()
6946 wrt_reg_dword(ISP_ATIO_Q_OUT(vha), ha->tgt.atio_ring_index); in qlt_24xx_process_atio_queue()
6950 qlt_24xx_config_rings(struct scsi_qla_host *vha) in qlt_24xx_config_rings() argument
6952 struct qla_hw_data *ha = vha->hw; in qlt_24xx_config_rings()
6959 wrt_reg_dword(ISP_ATIO_Q_IN(vha), 0); in qlt_24xx_config_rings()
6960 wrt_reg_dword(ISP_ATIO_Q_OUT(vha), 0); in qlt_24xx_config_rings()
6961 rd_reg_dword(ISP_ATIO_Q_OUT(vha)); in qlt_24xx_config_rings()
6967 ql_dbg(ql_dbg_init, vha, 0xf072, in qlt_24xx_config_rings()
6976 ql_dbg(ql_dbg_init, vha, 0xf072, in qlt_24xx_config_rings()
6983 qlt_24xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_24xx *nv) in qlt_24xx_config_nvram_stage1() argument
6985 struct qla_hw_data *ha = vha->hw; in qlt_24xx_config_nvram_stage1()
6991 if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) { in qlt_24xx_config_nvram_stage1()
7004 if (qla_tgt_mode_enabled(vha)) in qlt_24xx_config_nvram_stage1()
7007 nv->exchange_count = cpu_to_le16(vha->ql2xexchoffld); in qlt_24xx_config_nvram_stage1()
7013 if (qla_tgt_mode_enabled(vha)) in qlt_24xx_config_nvram_stage1()
7060 if (vha->flags.init_done) in qlt_24xx_config_nvram_stage1()
7061 fc_host_supported_classes(vha->host) = in qlt_24xx_config_nvram_stage1()
7066 if (vha->flags.init_done) in qlt_24xx_config_nvram_stage1()
7067 fc_host_supported_classes(vha->host) = FC_COS_CLASS3; in qlt_24xx_config_nvram_stage1()
7074 qlt_24xx_config_nvram_stage2(struct scsi_qla_host *vha, in qlt_24xx_config_nvram_stage2() argument
7077 struct qla_hw_data *ha = vha->hw; in qlt_24xx_config_nvram_stage2()
7089 qlt_81xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_81xx *nv) in qlt_81xx_config_nvram_stage1() argument
7091 struct qla_hw_data *ha = vha->hw; in qlt_81xx_config_nvram_stage1()
7097 if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) { in qlt_81xx_config_nvram_stage1()
7110 if (qla_tgt_mode_enabled(vha)) in qlt_81xx_config_nvram_stage1()
7113 nv->exchange_count = cpu_to_le16(vha->ql2xexchoffld); in qlt_81xx_config_nvram_stage1()
7119 if (qla_tgt_mode_enabled(vha)) in qlt_81xx_config_nvram_stage1()
7163 if (vha->flags.init_done) in qlt_81xx_config_nvram_stage1()
7164 fc_host_supported_classes(vha->host) = in qlt_81xx_config_nvram_stage1()
7169 if (vha->flags.init_done) in qlt_81xx_config_nvram_stage1()
7170 fc_host_supported_classes(vha->host) = FC_COS_CLASS3; in qlt_81xx_config_nvram_stage1()
7177 qlt_81xx_config_nvram_stage2(struct scsi_qla_host *vha, in qlt_81xx_config_nvram_stage2() argument
7180 struct qla_hw_data *ha = vha->hw; in qlt_81xx_config_nvram_stage2()
7202 qlt_modify_vp_config(struct scsi_qla_host *vha, in qlt_modify_vp_config() argument
7206 if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) in qlt_modify_vp_config()
7210 if (qla_tgt_mode_enabled(vha)) in qlt_modify_vp_config()
7244 scsi_qla_host_t *vha; in qla83xx_msix_atio_q() local
7250 vha = pci_get_drvdata(ha->pdev); in qla83xx_msix_atio_q()
7254 qlt_24xx_process_atio_queue(vha, 0); in qla83xx_msix_atio_q()
7266 scsi_qla_host_t *vha = op->vha; in qlt_handle_abts_recv_work() local
7267 struct qla_hw_data *ha = vha->hw; in qlt_handle_abts_recv_work()
7270 if (qla2x00_reset_active(vha) || in qlt_handle_abts_recv_work()
7275 qlt_24xx_process_atio_queue(vha, 0); in qlt_handle_abts_recv_work()
7279 qlt_response_pkt_all_vps(vha, op->rsp, (response_t *)&op->atio); in qlt_handle_abts_recv_work()
7286 qlt_handle_abts_recv(struct scsi_qla_host *vha, struct rsp_que *rsp, in qlt_handle_abts_recv() argument
7297 qlt_response_pkt_all_vps(vha, rsp, pkt); in qlt_handle_abts_recv()
7302 op->vha = vha; in qlt_handle_abts_recv()
7303 op->chip_reset = vha->hw->base_qpair->chip_reset; in qlt_handle_abts_recv()
7351 qlt_update_vp_map(struct scsi_qla_host *vha, int cmd) in qlt_update_vp_map() argument
7357 key = vha->d_id.b24; in qlt_update_vp_map()
7363 vha->hw->tgt.tgt_vp_map[vha->vp_idx].vha = vha; in qlt_update_vp_map()
7366 slot = btree_lookup32(&vha->hw->host_map, key); in qlt_update_vp_map()
7368 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf018, in qlt_update_vp_map()
7369 "Save vha in host_map %p %06x\n", vha, key); in qlt_update_vp_map()
7370 rc = btree_insert32(&vha->hw->host_map, in qlt_update_vp_map()
7371 key, vha, GFP_ATOMIC); in qlt_update_vp_map()
7373 ql_log(ql_log_info, vha, 0xd03e, in qlt_update_vp_map()
7378 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf019, in qlt_update_vp_map()
7379 "replace existing vha in host_map %p %06x\n", vha, key); in qlt_update_vp_map()
7380 btree_update32(&vha->hw->host_map, key, vha); in qlt_update_vp_map()
7385 vha->hw->tgt.tgt_vp_map[vha->vp_idx].vha = NULL; in qlt_update_vp_map()
7388 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01a, in qlt_update_vp_map()
7389 "clear vha in host_map %p %06x\n", vha, key); in qlt_update_vp_map()
7390 slot = btree_lookup32(&vha->hw->host_map, key); in qlt_update_vp_map()
7392 btree_remove32(&vha->hw->host_map, key); in qlt_update_vp_map()
7393 vha->d_id.b24 = 0; in qlt_update_vp_map()
7398 void qlt_update_host_map(struct scsi_qla_host *vha, port_id_t id) in qlt_update_host_map() argument
7401 if (!vha->d_id.b24) { in qlt_update_host_map()
7402 vha->d_id = id; in qlt_update_host_map()
7403 qlt_update_vp_map(vha, SET_AL_PA); in qlt_update_host_map()
7404 } else if (vha->d_id.b24 != id.b24) { in qlt_update_host_map()
7405 qlt_update_vp_map(vha, RESET_AL_PA); in qlt_update_host_map()
7406 vha->d_id = id; in qlt_update_host_map()
7407 qlt_update_vp_map(vha, SET_AL_PA); in qlt_update_host_map()