Lines Matching refs:vha

38 static void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha,
78 qla2x00_get_async_timeout(struct scsi_qla_host *vha)
81 struct qla_hw_data *ha = vha->hw;
106 ql_dbg(ql_dbg_async, sp->vha, 0x507c,
111 ql_dbg(ql_dbg_async, sp->vha, 0x507c,
149 scsi_qla_host_t *vha = cmd_sp->vha;
154 sp = qla2xxx_get_qpair_sp(cmd_sp->vha, cmd_sp->qpair, cmd_sp->fcport,
177 ql_dbg(ql_dbg_async, vha, 0x507c,
207 ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
269 struct scsi_qla_host *vha = sp->vha;
273 ql_dbg(ql_dbg_disc, vha, 0x20dd,
278 if (!test_bit(UNLOADING, &vha->dpc_flags)) {
286 qla24xx_handle_plogi_done_event(vha, &ea);
296 wwn_to_u64(fcport->vha->port_name))
309 qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
316 if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) ||
318 ql_log(ql_log_warn, vha, 0xffff,
324 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
339 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
342 if (N2N_TOPO(fcport->vha->hw) && fcport_is_bigger(fcport))
347 if (NVME_TARGET(vha->hw, fcport))
350 ql_dbg(ql_dbg_disc, vha, 0x2072,
359 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
382 qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
389 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
398 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
402 ql_dbg(ql_dbg_disc, vha, 0x2070,
421 qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
427 qla2x00_mark_device_lost(vha, fcport, 1);
434 struct scsi_qla_host *vha = sp->vha;
437 if (!test_bit(UNLOADING, &vha->dpc_flags))
438 qla2x00_post_async_prlo_done_work(sp->fcport->vha, sp->fcport,
444 qla2x00_async_prlo(struct scsi_qla_host *vha, fc_port_t *fcport)
451 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
460 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
464 ql_dbg(ql_dbg_disc, vha, 0x2070,
483 void qla24xx_handle_adisc_event(scsi_qla_host_t *vha, struct event_arg *ea)
488 ql_dbg(ql_dbg_disc, vha, 0x20d2,
498 ql_dbg(ql_dbg_disc, vha, 0x2066,
502 spin_lock_irqsave(&vha->work_lock, flags);
508 spin_unlock_irqrestore(&vha->work_lock, flags);
519 ql_dbg(ql_dbg_disc, vha, 0x20d3,
529 __qla24xx_handle_gpdb_event(vha, ea);
532 static int qla_post_els_plogi_work(struct scsi_qla_host *vha, fc_port_t *fcport)
536 e = qla2x00_alloc_work(vha, QLA_EVT_ELS_PLOGI);
543 return qla2x00_post_work(vha, e);
548 struct scsi_qla_host *vha = sp->vha;
552 ql_dbg(ql_dbg_disc, vha, 0x2066,
567 qla24xx_handle_adisc_event(vha, &ea);
573 qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
581 ql_log(ql_log_warn, vha, 0xffff,
588 if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
592 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
603 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
609 ql_dbg(ql_dbg_disc, vha, 0x206f,
623 qla2x00_post_async_adisc_work(vha, fcport, data);
627 static bool qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id)
629 struct qla_hw_data *ha = vha->hw;
640 * @vha: adapter state pointer.
649 static int qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)
652 struct qla_hw_data *ha = vha->hw;
661 qla2x00_is_reserved_id(vha, dev->loop_id)) {
670 ql_dbg(ql_dbg_disc, dev->vha, 0x2086,
674 ql_log(ql_log_warn, dev->vha, 0x2087,
683 struct qla_hw_data *ha = fcport->vha->hw;
686 qla2x00_is_reserved_id(fcport->vha, fcport->loop_id))
693 static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
705 ql_dbg(ql_dbg_disc, vha, 0xffff,
710 fcport->rscn_gen, fcport->last_rscn_gen, vha->loop_id);
717 ql_dbg(ql_dbg_disc, vha, 0x20de,
729 ql_dbg(ql_dbg_disc, vha, 0x20e0,
737 ql_dbg(ql_dbg_disc, vha, 0x20e1,
744 e = &vha->gnl.l[i];
773 ql_dbg(ql_dbg_disc, vha, 0x20e2,
790 ql_dbg(ql_dbg_disc, vha, 0x20e3,
806 qlt_find_sess_invalidate_other(vha, wwn,
819 switch (vha->hw->current_topology) {
824 vha, 0x20e4, "%s %d %8phC post gpdb\n",
832 qla2x00_post_async_adisc_work(vha, fcport,
838 qla2x00_find_new_loop_id(vha, fcport);
842 ql_dbg(ql_dbg_disc, vha, 0x20e5,
845 qla24xx_fcport_handle_login(vha, fcport);
870 qla2x00_post_async_adisc_work(vha, fcport,
880 qla24xx_fcport_handle_login(vha,
892 qla24xx_fcport_handle_login(vha,
902 switch (vha->hw->current_topology) {
906 e = &vha->gnl.l[i];
915 qla2x00_find_fcport_by_wwpn(vha,
919 vha, 0x20e5,
934 qla24xx_fcport_handle_login(vha, fcport);
947 &vha->dpc_flags);
950 ql_log(ql_log_info, vha, 0x705d,
953 &vha->dpc_flags);
956 ql_log(ql_log_info, vha, 0x705d,
962 qla2xxx_wake_dpc(vha);
968 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
972 qla24xx_fcport_handle_login(vha, fcport);
982 struct scsi_qla_host *vha = sp->vha;
992 ql_dbg(ql_dbg_disc, vha, 0x20e7,
1011 e = &vha->gnl.l[i];
1015 set_bit(loop_id, vha->hw->loop_id_map);
1018 ql_dbg(ql_dbg_disc, vha, 0x20e8,
1025 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
1029 if (!list_empty(&vha->gnl.fcports))
1030 list_splice_init(&vha->gnl.fcports, &h);
1031 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1034 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
1037 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1040 qla24xx_handle_gnl_done_event(vha, &ea);
1048 e = &vha->gnl.l[i];
1052 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
1066 ql_dbg(ql_dbg_disc, vha, 0x2065,
1070 qla24xx_post_newsess_work(vha, &id, (u8 *)&wwn,
1075 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
1076 vha->gnl.sent = 0;
1077 if (!list_empty(&vha->gnl.fcports)) {
1079 list_for_each_entry_safe(fcport, tf, &vha->gnl.fcports,
1083 if (qla24xx_post_gnl_work(vha, fcport) == QLA_SUCCESS)
1087 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1092 int qla24xx_async_gnl(struct scsi_qla_host *vha, fc_port_t *fcport)
1100 if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
1103 ql_dbg(ql_dbg_disc, vha, 0x20d9,
1106 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
1112 list_add_tail(&fcport->gnl_entry, &vha->gnl.fcports);
1113 if (vha->gnl.sent) {
1114 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1117 vha->gnl.sent = 1;
1118 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1120 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
1131 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha)+2);
1136 mb[2] = MSW(vha->gnl.ldma);
1137 mb[3] = LSW(vha->gnl.ldma);
1138 mb[6] = MSW(MSD(vha->gnl.ldma));
1139 mb[7] = LSW(MSD(vha->gnl.ldma));
1140 mb[8] = vha->gnl.size;
1141 mb[9] = vha->vp_idx;
1145 ql_dbg(ql_dbg_disc, vha, 0x20da,
1162 int qla24xx_post_gnl_work(struct scsi_qla_host *vha, fc_port_t *fcport)
1166 e = qla2x00_alloc_work(vha, QLA_EVT_GNL);
1172 return qla2x00_post_work(vha, e);
1177 struct scsi_qla_host *vha = sp->vha;
1178 struct qla_hw_data *ha = vha->hw;
1183 ql_dbg(ql_dbg_disc, vha, 0x20db,
1196 qla24xx_handle_gpdb_event(vha, &ea);
1205 static int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport)
1209 if (vha->host->active_mode == MODE_TARGET)
1212 e = qla2x00_alloc_work(vha, QLA_EVT_PRLI);
1218 return qla2x00_post_work(vha, e);
1223 struct scsi_qla_host *vha = sp->vha;
1227 ql_dbg(ql_dbg_disc, vha, 0x2129,
1233 if (!test_bit(UNLOADING, &vha->dpc_flags)) {
1242 qla24xx_handle_prli_done_event(vha, &ea);
1249 qla24xx_async_prli(struct scsi_qla_host *vha, fc_port_t *fcport)
1255 if (!vha->flags.online) {
1256 ql_dbg(ql_dbg_disc, vha, 0xffff, "%s %d %8phC exit\n",
1263 qla_dual_mode_enabled(vha)) {
1264 ql_dbg(ql_dbg_disc, vha, 0xffff, "%s %d %8phC exit\n",
1269 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
1281 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
1286 if (NVME_TARGET(vha->hw, fcport))
1289 ql_dbg(ql_dbg_disc, vha, 0x211b,
1292 fcport->login_retry, fcport->fc4_type, vha->hw->fc4_type_priority,
1293 NVME_TARGET(vha->hw, fcport) ? "nvme" : "fcp");
1298 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1310 int qla24xx_post_gpdb_work(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt)
1314 e = qla2x00_alloc_work(vha, QLA_EVT_GPDB);
1321 return qla2x00_post_work(vha, e);
1324 int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt)
1332 struct qla_hw_data *ha = vha->hw;
1335 ql_log(ql_log_warn, vha, 0xffff,
1342 if (!vha->flags.online || fcport->flags & FCF_ASYNC_SENT) {
1343 ql_log(ql_log_warn, vha, 0xffff,
1345 __func__, fcport->port_name, vha->flags.online, fcport->flags);
1349 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
1363 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
1367 ql_log(ql_log_warn, vha, 0xd043,
1379 mb[9] = vha->vp_idx;
1387 ql_dbg(ql_dbg_disc, vha, 0x20dc,
1404 qla24xx_post_gpdb_work(vha, fcport, opt);
1409 void __qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
1413 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
1418 vha->fcport_count++;
1421 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1423 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
1430 ql_dbg(ql_dbg_disc, vha, 0x20d6,
1435 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
1439 void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
1450 ql_dbg(ql_dbg_disc, vha, 0x20d2,
1458 if (NVME_TARGET(vha->hw, fcport))
1466 ql_dbg(ql_dbg_disc, vha, 0x20d3,
1478 __qla24xx_parse_gpdb(vha, fcport, pd);
1485 if (qla_dual_mode_enabled(vha) ||
1486 qla_ini_mode_enabled(vha)) {
1488 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1494 ql_dbg(ql_dbg_disc, vha, 0x20d5, "%s %d %8phC post del sess\n",
1499 __qla24xx_handle_gpdb_event(vha, ea);
1502 static void qla_chk_n2n_b4_login(struct scsi_qla_host *vha, fc_port_t *fcport)
1507 ql_dbg(ql_dbg_disc, vha, 0x307b,
1512 if (qla_tgt_mode_enabled(vha))
1515 if (qla_dual_mode_enabled(vha)) {
1516 if (N2N_TOPO(vha->hw)) {
1519 mywwn = wwn_to_u64(vha->port_name);
1539 rc = qla2x00_find_new_loop_id(vha, fcport);
1541 ql_dbg(ql_dbg_disc, vha, 0x20e6,
1549 ql_dbg(ql_dbg_disc, vha, 0x20bf,
1552 qla2x00_post_async_login_work(vha, fcport, NULL);
1556 int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
1562 ql_dbg(ql_dbg_disc, vha, 0x20d8,
1574 qla_dual_mode_enabled(vha) &&
1580 !N2N_TOPO(vha->hw)) {
1582 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1588 if (vha->host->active_mode == MODE_TARGET && !N2N_TOPO(vha->hw))
1592 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1599 switch (vha->hw->current_topology) {
1605 qla2x00_find_new_loop_id(vha,
1611 qla_post_els_plogi_work(vha, fcport);
1613 ql_log(ql_log_info, vha, 0x705d,
1618 qla24xx_post_gnl_work(vha, fcport);
1623 ql_dbg(ql_dbg_disc, vha, 0xffff,
1626 qla24xx_post_gnnid_work(vha, fcport);
1628 ql_dbg(ql_dbg_disc, vha, 0x20bd,
1631 qla24xx_post_gnl_work(vha, fcport);
1633 qla_chk_n2n_b4_login(vha, fcport);
1640 switch (vha->hw->current_topology) {
1643 ql_dbg(ql_dbg_disc, vha, 0x2118,
1647 vha->hw->base_qpair->chip_reset;
1648 qla24xx_post_gpdb_work(vha, fcport, 0);
1650 ql_dbg(ql_dbg_disc, vha, 0x2118,
1653 NVME_TARGET(vha->hw, fcport) ? "NVME" :
1655 qla24xx_post_prli_work(vha, fcport);
1660 ql_dbg(ql_dbg_disc, vha, 0x20d8,
1666 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1669 qla_chk_n2n_b4_login(vha, fcport);
1675 if (N2N_TOPO(vha->hw))
1676 qla_chk_n2n_b4_login(vha, fcport);
1684 qla2x00_post_async_adisc_work(vha, fcport, data);
1689 qla24xx_post_prli_work(vha, fcport);
1698 ql_dbg(ql_dbg_disc, fcport->vha, 0xffff,
1705 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1715 int qla24xx_post_newsess_work(struct scsi_qla_host *vha, port_id_t *id,
1720 e = qla2x00_alloc_work(vha, QLA_EVT_NEW_SESS);
1731 return qla2x00_post_work(vha, e);
1734 void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
1741 fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1);
1745 ql_dbg(ql_dbg_disc, vha, 0x2115,
1755 list_for_each_entry(fcport, &vha->vp_fcports, list) {
1767 list_for_each_entry(fcport, &vha->vp_fcports, list) {
1780 list_for_each_entry(fcport, &vha->vp_fcports, list) {
1791 spin_lock_irqsave(&vha->work_lock, flags);
1792 if (vha->scan.scan_flags == 0) {
1793 ql_dbg(ql_dbg_disc, vha, 0xffff, "%s: schedule\n", __func__);
1794 vha->scan.scan_flags |= SF_QUEUED;
1795 schedule_delayed_work(&vha->scan.scan_work, 5);
1797 spin_unlock_irqrestore(&vha->work_lock, flags);
1800 void qla24xx_handle_relogin_event(scsi_qla_host_t *vha,
1805 if (test_bit(UNLOADING, &vha->dpc_flags))
1808 ql_dbg(ql_dbg_disc, vha, 0x2102,
1818 ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gnl\n",
1820 qla24xx_post_gnl_work(vha, fcport);
1824 qla24xx_fcport_handle_login(vha, fcport);
1827 void qla_handle_els_plogi_done(scsi_qla_host_t *vha,
1831 if (vha->host->active_mode == MODE_TARGET)
1834 ql_dbg(ql_dbg_disc, vha, 0x2118,
1837 qla24xx_post_prli_work(vha, ea->fcport);
1859 qla2x00_handle_rscn(fcport->vha, &ea);
1898 struct scsi_qla_host *vha = fcport->vha;
1903 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
1913 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha));
1920 ql_dbg(ql_dbg_taskm, vha, 0x802f,
1933 ql_log(ql_log_warn, vha, 0x8030,
1937 if (!test_bit(UNLOADING, &vha->dpc_flags) && !IS_QLAFX00(vha->hw)) {
1942 qla2x00_marker(vha, vha->hw->base_qpair,
1962 struct scsi_qla_host *vha = fcport->vha;
1977 return qlafx00_fx_disc(vha, &vha->hw->mr.fcport,
1984 qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
1991 ql_dbg(ql_dbg_disc, vha, 0x2118,
1995 ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
2003 qla24xx_post_gpdb_work(vha, ea->fcport, 0);
2008 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
2013 ql_dbg(ql_dbg_disc, vha, 0x2118,
2016 vha->hw->fc4_type_priority == FC4_PRIORITY_FCP ?
2019 if (N2N_TOPO(vha->hw)) {
2020 if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME) {
2030 vha->relogin_jif = jiffies + 2 * HZ;
2035 set_bit(N2N_LINK_RESET, &vha->dpc_flags);
2037 ql_log(ql_log_warn, vha, 0x2119,
2048 ql_dbg(ql_dbg_disc, vha, 0x2118,
2054 if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME)
2070 qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
2078 ql_dbg(ql_dbg_disc, vha, 0xffff,
2087 ql_dbg(ql_dbg_disc, vha, 0x20ea,
2095 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
2101 ql_dbg(ql_dbg_disc, vha, 0x20d3,
2104 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
2107 ql_dbg(ql_dbg_disc, vha, 0x20d3,
2125 if (NVME_TARGET(vha->hw, ea->fcport)) {
2126 ql_dbg(ql_dbg_disc, vha, 0x2117,
2129 qla24xx_post_prli_work(vha, ea->fcport);
2131 ql_dbg(ql_dbg_disc, vha, 0x20ea,
2136 set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
2137 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
2138 ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
2142 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
2144 qla24xx_post_gpdb_work(vha, ea->fcport, 0);
2148 ql_dbg(ql_dbg_disc, vha, 0x20eb, "%s %d %8phC cmd error %x\n",
2160 ql_dbg(ql_dbg_disc, vha, 0x20ec,
2165 set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
2167 qla24xx_post_gnl_work(vha, ea->fcport);
2171 qlt_find_sess_invalidate_other(vha,
2184 ql_dbg(ql_dbg_disc, vha, 0x20ed,
2189 ql_dbg(ql_dbg_disc, vha, 0x20ed,
2195 set_bit(lid, vha->hw->loop_id_map);
2211 qla83xx_nic_core_fw_load(scsi_qla_host_t *vha)
2214 struct qla_hw_data *ha = vha->hw;
2218 qla83xx_idc_lock(vha, 0);
2227 if (__qla83xx_set_drv_presence(vha) != QLA_SUCCESS) {
2228 ql_dbg(ql_dbg_p3p, vha, 0xb077,
2235 qla83xx_reset_ownership(vha);
2243 qla83xx_rd_reg(vha, QLA83XX_IDC_MAJOR_VERSION, &idc_major_ver);
2247 qla83xx_wr_reg(vha, QLA83XX_IDC_MAJOR_VERSION, idc_major_ver);
2250 qla83xx_wr_reg(vha, QLA83XX_IDC_LOCK_RECOVERY, 0);
2256 ql_log(ql_log_warn, vha, 0xb07d,
2259 __qla83xx_clear_drv_presence(vha);
2264 qla83xx_rd_reg(vha, QLA83XX_IDC_MINOR_VERSION, &idc_minor_ver);
2266 qla83xx_wr_reg(vha, QLA83XX_IDC_MINOR_VERSION, idc_minor_ver);
2270 if (!qla81xx_get_port_config(vha, config))
2271 qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE,
2275 rval = qla83xx_idc_state_handler(vha);
2278 qla83xx_idc_unlock(vha, 0);
2294 qla2x00_initialize_adapter(scsi_qla_host_t *vha)
2297 struct qla_hw_data *ha = vha->hw;
2301 memset(&vha->qla_stats, 0, sizeof(vha->qla_stats));
2302 memset(&vha->fc_host_stat, 0, sizeof(vha->fc_host_stat));
2305 vha->flags.online = 0;
2307 vha->flags.reset_active = 0;
2310 vha->qla_stats.jiffies_at_last_reset = get_jiffies_64();
2311 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
2312 atomic_set(&vha->loop_state, LOOP_DOWN);
2313 vha->device_flags = DFLG_NO_CABLE;
2314 vha->dpc_flags = 0;
2315 vha->flags.management_server_logged_in = 0;
2316 vha->marker_needed = 0;
2323 ql_dbg(ql_dbg_init, vha, 0x0040,
2325 rval = ha->isp_ops->pci_config(vha);
2327 ql_log(ql_log_warn, vha, 0x0044,
2332 ha->isp_ops->reset_chip(vha);
2338 ql_log(ql_log_info, vha, 0xffff, "Secure Adapter: %s\n",
2343 rval = qla2xxx_get_flash_info(vha);
2345 ql_log(ql_log_fatal, vha, 0x004f,
2351 qla8044_read_reset_template(vha);
2358 qla8044_set_idc_dontreset(vha);
2361 ha->isp_ops->get_flash_version(vha, req->ring);
2362 ql_dbg(ql_dbg_init, vha, 0x0061,
2368 ha->isp_ops->nvram_config(vha);
2374 ql_log(ql_log_info, vha, 0xffff, "FC4 priority set to %s\n",
2379 ql_log(ql_log_info, vha, 0x0077,
2380 "Masking HBA WWPN %8phN (via NVRAM).\n", vha->port_name);
2384 ql_dbg(ql_dbg_init, vha, 0x0078,
2393 if (qla2x00_isp_firmware(vha) != QLA_SUCCESS) {
2394 rval = ha->isp_ops->chip_diag(vha);
2397 rval = qla2x00_setup_chip(vha);
2403 ha->cs84xx = qla84xx_get_chip(vha);
2405 ql_log(ql_log_warn, vha, 0x00d0,
2411 if (qla_ini_mode_enabled(vha) || qla_dual_mode_enabled(vha))
2412 rval = qla2x00_init_rings(vha);
2422 rval = qla84xx_init_chip(vha);
2424 ql_log(ql_log_warn, vha, 0x00d4,
2426 qla84xx_put_chip(vha);
2432 rval = qla83xx_nic_core_fw_load(vha);
2434 ql_log(ql_log_warn, vha, 0x0124,
2439 qla24xx_read_fcp_prio_cfg(vha);
2442 qla82xx_set_driver_version(vha, QLA2XXX_VERSION);
2444 qla25xx_set_driver_version(vha, QLA2XXX_VERSION);
2451 * @vha: HA context
2456 qla2100_pci_config(scsi_qla_host_t *vha)
2460 struct qla_hw_data *ha = vha->hw;
2482 * @vha: HA context
2487 qla2300_pci_config(scsi_qla_host_t *vha)
2492 struct qla_hw_data *ha = vha->hw;
2564 * @vha: HA context
2569 qla24xx_pci_config(scsi_qla_host_t *vha)
2573 struct qla_hw_data *ha = vha->hw;
2608 * @vha: HA context
2613 qla25xx_pci_config(scsi_qla_host_t *vha)
2616 struct qla_hw_data *ha = vha->hw;
2639 * @vha: HA context
2644 qla2x00_isp_firmware(scsi_qla_host_t *vha)
2649 struct qla_hw_data *ha = vha->hw;
2655 ql_log(ql_log_info, vha, 0x0079, "RISC CODE NOT loaded.\n");
2658 rval = qla2x00_verify_checksum(vha, ha->fw_srisc_address);
2661 rval = qla2x00_get_adapter_id(vha, &loop_id, &al_pa,
2667 ql_dbg(ql_dbg_init, vha, 0x007a,
2675 * @vha: HA context
2680 qla2x00_reset_chip(scsi_qla_host_t *vha)
2683 struct qla_hw_data *ha = vha->hw;
2822 * @vha: HA context
2827 qla81xx_reset_mpi(scsi_qla_host_t *vha)
2831 if (!IS_QLA81XX(vha->hw))
2834 return qla81xx_write_mpi_register(vha, mb);
2839 * @vha: HA context
2844 qla24xx_reset_risc(scsi_qla_host_t *vha)
2847 struct qla_hw_data *ha = vha->hw;
2868 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x017e,
2894 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x017f,
2912 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x015d,
2918 if (test_and_clear_bit(MPI_RESET_NEEDED, &vha->dpc_flags)) {
2919 if (qla81xx_reset_mpi(vha) != QLA_SUCCESS) {
2921 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
2922 set_bit(MPI_RESET_NEEDED, &vha->dpc_flags);
2929 vha->flags.online = 0;
2955 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x015e,
2962 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x015f,
2973 qla25xx_read_risc_sema_reg(scsi_qla_host_t *vha, uint32_t *data)
2975 struct device_reg_24xx __iomem *reg = &vha->hw->iobase->isp24;
2982 qla25xx_write_risc_sema_reg(scsi_qla_host_t *vha, uint32_t data)
2984 struct device_reg_24xx __iomem *reg = &vha->hw->iobase->isp24;
2991 qla25xx_manipulate_risc_semaphore(scsi_qla_host_t *vha)
2999 if (vha->hw->pdev->subsystem_device != 0x0175 &&
3000 vha->hw->pdev->subsystem_device != 0x0240)
3003 wrt_reg_dword(&vha->hw->iobase->isp24.hccr, HCCRX_SET_RISC_PAUSE);
3010 qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_SET);
3011 qla25xx_read_risc_sema_reg(vha, &wd32);
3026 qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_CLR);
3030 qla25xx_read_risc_sema_reg(vha, &wd32);
3040 qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_FORCE_CLR);
3045 qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_FORCE_SET);
3053 * @vha: HA context
3058 qla24xx_reset_chip(scsi_qla_host_t *vha)
3060 struct qla_hw_data *ha = vha->hw;
3070 qla25xx_manipulate_risc_semaphore(vha);
3073 rval = qla24xx_reset_risc(vha);
3080 * @vha: HA context
3085 qla2x00_chip_diag(scsi_qla_host_t *vha)
3088 struct qla_hw_data *ha = vha->hw;
3099 ql_dbg(ql_dbg_init, vha, 0x007b, "Testing device at %p.\n",
3122 ql_dbg(ql_dbg_init, vha, 0x007c,
3144 ql_dbg(ql_dbg_init, vha, 0x007d, "Checking product ID of chip.\n");
3152 ql_log(ql_log_warn, vha, 0x0062,
3173 ql_dbg(ql_dbg_init, vha, 0x007e, "Found QLA2200A Chip.\n");
3182 ql_dbg(ql_dbg_init, vha, 0x007f, "Checking mailboxes.\n");
3183 rval = qla2x00_mbx_reg_test(vha);
3185 ql_log(ql_log_warn, vha, 0x0080,
3194 ql_log(ql_log_info, vha, 0x0081,
3204 * @vha: HA context
3209 qla24xx_chip_diag(scsi_qla_host_t *vha)
3212 struct qla_hw_data *ha = vha->hw;
3220 rval = qla2x00_mbx_reg_test(vha);
3222 ql_log(ql_log_warn, vha, 0x0082,
3233 qla2x00_init_fce_trace(scsi_qla_host_t *vha)
3238 struct qla_hw_data *ha = vha->hw;
3248 ql_dbg(ql_dbg_init, vha, 0x00bd,
3258 ql_log(ql_log_warn, vha, 0x00be,
3264 rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS,
3267 ql_log(ql_log_warn, vha, 0x00bf,
3273 ql_dbg(ql_dbg_init, vha, 0x00c0,
3282 qla2x00_init_eft_trace(scsi_qla_host_t *vha)
3287 struct qla_hw_data *ha = vha->hw;
3293 ql_dbg(ql_dbg_init, vha, 0x00bd,
3303 ql_log(ql_log_warn, vha, 0x00c1,
3309 rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
3311 ql_log(ql_log_warn, vha, 0x00c2,
3317 ql_dbg(ql_dbg_init, vha, 0x00c3,
3325 qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
3327 qla2x00_init_fce_trace(vha);
3328 qla2x00_init_eft_trace(vha);
3332 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
3336 struct qla_hw_data *ha = vha->hw;
3342 ql_dbg(ql_dbg_init, vha, 0x00bd,
3385 qla2x00_init_fce_trace(vha);
3388 qla2x00_init_eft_trace(vha);
3399 ql_dbg(ql_dbg_init, vha, 0x00ba,
3403 ql_dbg(ql_dbg_init, vha, 0x00fa,
3406 vha, fwdt->template);
3407 ql_dbg(ql_dbg_init, vha, 0x00fa,
3432 ql_dbg(ql_dbg_init, vha, 0x00c5,
3439 ql_log(ql_log_warn, vha, 0x00c4,
3449 ql_dbg(ql_dbg_init, vha, 0x00c5,
3459 ql_dbg(ql_dbg_init, vha, 0x00c5,
3497 qla81xx_mpi_sync(scsi_qla_host_t *vha)
3504 if (!IS_QLA81XX(vha->hw))
3507 rval = qla2x00_write_ram_word(vha, 0x7c00, 1);
3509 ql_log(ql_log_warn, vha, 0x0105,
3514 pci_read_config_word(vha->hw->pdev, 0x54, &dc);
3515 rval = qla2x00_read_ram_word(vha, 0x7a15, &dw);
3517 ql_log(ql_log_warn, vha, 0x0067, "Unable to read sync.\n");
3527 rval = qla2x00_write_ram_word(vha, 0x7a15, dw);
3529 ql_log(ql_log_warn, vha, 0x0114, "Unable to gain sync.\n");
3533 rval = qla2x00_write_ram_word(vha, 0x7c00, 0);
3535 ql_log(ql_log_warn, vha, 0x006d,
3599 static void qla2xxx_print_sfp_info(struct scsi_qla_host *vha)
3602 struct sff_8247_a0 *a0 = (struct sff_8247_a0 *)vha->hw->sfp_data;
3608 ql_dbg(ql_dbg_init, vha, 0x015a,
3613 ql_dbg(ql_dbg_init, vha, 0x015c,
3628 ql_dbg(ql_dbg_init, vha, 0x0160,
3641 ql_dbg(ql_dbg_init, vha, 0x0196,
3653 ql_dbg(ql_dbg_init, vha, 0x016e,
3657 ql_dbg(ql_dbg_init, vha, 0x016f,
3660 ql_dbg(ql_dbg_init, vha, 0x0170,
3663 ql_dbg(ql_dbg_init, vha, 0x0189,
3666 ql_dbg(ql_dbg_init, vha, 0x018a,
3669 ql_dbg(ql_dbg_init, vha, 0x0194,
3672 ql_dbg(ql_dbg_init, vha, 0x0195,
3680 * @vha: adapter state pointer.
3692 qla24xx_detect_sfp(scsi_qla_host_t *vha)
3696 struct qla_hw_data *ha = vha->hw;
3715 if (!IS_BPM_ENABLED(vha))
3718 rc = qla2x00_read_sfp_dev(vha, NULL, 0);
3723 a = (struct sff_8247_a0 *)vha->hw->sfp_data;
3724 qla2xxx_print_sfp_info(vha);
3739 ql_dbg(ql_dbg_async, vha, 0x507b,
3748 void qla_init_iocb_limit(scsi_qla_host_t *vha)
3752 struct qla_hw_data *ha = vha->hw;
3775 * @vha: HA context
3780 qla2x00_setup_chip(scsi_qla_host_t *vha)
3784 struct qla_hw_data *ha = vha->hw;
3791 rval = ha->isp_ops->load_risc(vha, &srisc_address);
3793 qla2x00_stop_firmware(vha);
3807 qla81xx_mpi_sync(vha);
3811 rval = ha->isp_ops->load_risc(vha, &srisc_address);
3813 ql_dbg(ql_dbg_init, vha, 0x00c9,
3816 rval = qla2x00_verify_checksum(vha, srisc_address);
3819 ql_dbg(ql_dbg_init, vha, 0x00ca,
3825 if (qla_is_exch_offld_enabled(vha))
3828 rval = qla2x00_execute_fw(vha, srisc_address);
3832 if (!done_once++ && qla24xx_detect_sfp(vha)) {
3833 ql_dbg(ql_dbg_init, vha, 0x00ca,
3836 ha->isp_ops->reset_chip(vha);
3837 ha->isp_ops->chip_diag(vha);
3842 qla27xx_set_zio_threshold(vha,
3845 rval = qla2x00_set_exlogins_buffer(vha);
3849 rval = qla2x00_set_exchoffld_buffer(vha);
3856 qla82xx_check_md_needed(vha);
3858 rval = qla2x00_get_fw_version(vha);
3871 qla2x00_get_resource_cnts(vha);
3872 qla_init_iocb_limit(vha);
3879 vha->req);
3884 qla2x00_alloc_offload_mem(vha);
3887 qla2x00_alloc_fw_dump(vha);
3893 ql_log(ql_log_fatal, vha, 0x00cd,
3900 qla25xx_set_els_cmds_supported(vha);
3922 rval = qla81xx_fac_get_sector_size(vha, &size);
3927 ql_log(ql_log_warn, vha, 0x00ce,
3940 ql_log(ql_log_fatal, vha, 0x00cf,
3974 * @vha: HA context
3979 qla2x00_update_fw_options(scsi_qla_host_t *vha)
3982 struct qla_hw_data *ha = vha->hw;
3985 qla2x00_get_fw_options(vha, ha->fw_options);
3991 ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x0115,
3993 ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0109,
4052 ql_dbg(ql_dbg_disc, vha, 0x2100,
4058 qla2x00_set_fw_options(vha, ha->fw_options);
4062 qla24xx_update_fw_options(scsi_qla_host_t *vha)
4065 struct qla_hw_data *ha = vha->hw;
4077 ql_dbg(ql_dbg_disc, vha, 0x2101,
4085 if (qla_tgt_mode_enabled(vha) ||
4086 qla_dual_mode_enabled(vha))
4098 if (qla_tgt_mode_enabled(vha) ||
4099 qla_dual_mode_enabled(vha))
4118 ql_dbg(ql_dbg_init, vha, 0x00e8,
4121 ha->fw_options[3], vha->host->active_mode);
4124 qla2x00_set_fw_options(vha, ha->fw_options);
4130 rval = qla2x00_set_serdes_params(vha,
4135 ql_log(ql_log_warn, vha, 0x0104,
4141 qla2x00_config_rings(struct scsi_qla_host *vha)
4143 struct qla_hw_data *ha = vha->hw;
4164 qla24xx_config_rings(struct scsi_qla_host *vha)
4166 struct qla_hw_data *ha = vha->hw;
4198 ql_dbg(ql_dbg_init, vha, 0x0019,
4215 ql_dbg(ql_dbg_init, vha, 0x00fe,
4233 qlt_24xx_config_rings(vha);
4237 ql_dbg(ql_dbg_init, vha, 0x00fd,
4249 * @vha: HA context
4257 qla2x00_init_rings(scsi_qla_host_t *vha)
4262 struct qla_hw_data *ha = vha->hw;
4304 qlt_init_atio_q_entries(vha);
4306 ha->isp_ops->config_rings(vha);
4310 ql_dbg(ql_dbg_init, vha, 0x00d1, "Issue init firmware.\n");
4313 rval = qlafx00_init_firmware(vha, ha->init_cb_size);
4318 ha->isp_ops->update_fw_options(vha);
4333 ql_dbg(ql_dbg_init, vha, 0x0191, "DPORT Support: %s.\n",
4339 ql_dbg(ql_dbg_init, vha, 0x00bc, "FA-WWPN Support: %s.\n",
4346 rval = qla2x00_init_firmware(vha, ha->init_cb_size);
4350 ql_log(ql_log_fatal, vha, 0x00d2,
4353 ql_dbg(ql_dbg_init, vha, 0x00d3,
4355 vha->u_ql2xexchoffld = vha->u_ql2xiniexchg = 0;
4363 * @vha: HA context
4368 qla2x00_fw_ready(scsi_qla_host_t *vha)
4375 struct qla_hw_data *ha = vha->hw;
4377 if (IS_QLAFX00(vha->hw))
4378 return qlafx00_fw_ready(vha);
4403 if (!vha->flags.init_done)
4404 ql_log(ql_log_info, vha, 0x801e,
4409 rval = qla2x00_get_firmware_state(vha, state);
4412 vha->device_flags &= ~DFLG_NO_CABLE;
4415 ql_dbg(ql_dbg_taskm, vha, 0x801f,
4420 ql_dbg(ql_dbg_taskm, vha, 0x8028,
4424 rval = qla84xx_init_chip(vha);
4427 vha, 0x8007,
4436 ql_dbg(ql_dbg_taskm, vha, 0x8008,
4442 ql_dbg(ql_dbg_taskm, vha, 0x8037,
4445 qla2x00_get_retry_cnt(vha, &ha->retry_count,
4454 if (atomic_read(&vha->loop_down_timer) &&
4460 ql_log(ql_log_info, vha, 0x8038,
4463 vha->device_flags |= DFLG_NO_CABLE;
4481 ql_dbg(ql_dbg_taskm, vha, 0x803a,
4485 if (rval && !(vha->device_flags & DFLG_NO_CABLE)) {
4486 ql_log(ql_log_warn, vha, 0x803b,
4507 qla2x00_configure_hba(scsi_qla_host_t *vha)
4517 struct qla_hw_data *ha = vha->hw;
4523 rval = qla2x00_get_adapter_id(vha,
4526 if (LOOP_TRANSITION(vha) || atomic_read(&ha->loop_down_timer) ||
4529 ql_dbg(ql_dbg_disc, vha, 0x2008,
4532 ql_log(ql_log_warn, vha, 0x2009,
4534 if (IS_FWI2_CAPABLE(ha) && (vha == base_vha) &&
4536 ql_log(ql_log_warn, vha, 0x1151,
4538 if (qla24xx_link_initialize(vha) == QLA_SUCCESS)
4541 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
4547 ql_log(ql_log_info, vha, 0x200a,
4552 vha->loop_id = loop_id;
4561 ql_dbg(ql_dbg_disc, vha, 0x200b, "HBA in NL topology.\n");
4567 ql_dbg(ql_dbg_disc, vha, 0x200c, "HBA in FL topology.\n");
4574 ql_dbg(ql_dbg_disc, vha, 0x200d, "HBA in N P2P topology.\n");
4581 ql_dbg(ql_dbg_disc, vha, 0x200e, "HBA in F P2P topology.\n");
4589 ql_dbg(ql_dbg_disc, vha, 0x200f,
4604 qlt_update_host_map(vha, id);
4607 if (!vha->flags.init_done)
4608 ql_log(ql_log_info, vha, 0x2010,
4610 connect_type, vha->loop_id);
4616 qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
4622 struct qla_hw_data *ha = vha->hw;
4662 qla2xxx_get_vpd_field(vha, "\x82", ha->model_desc,
4669 static void qla2xxx_nvram_wwn_from_ofw(scsi_qla_host_t *vha, nvram_t *nv)
4672 struct qla_hw_data *ha = vha->hw;
4702 qla2x00_nvram_config(scsi_qla_host_t *vha)
4708 struct qla_hw_data *ha = vha->hw;
4724 ha->isp_ops->read_nvram(vha, ptr, ha->nvram_base, ha->nvram_size);
4728 ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x010f,
4730 ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0110,
4737 ql_log(ql_log_warn, vha, 0x0064,
4740 ql_log(ql_log_warn, vha, 0x0065,
4778 qla2xxx_nvram_wwn_from_ofw(vha, nv);
4818 qla2x00_set_model_info(vha, nv->model_number,
4899 memcpy(vha->node_name, icb->node_name, WWN_SIZE);
4900 memcpy(vha->port_name, icb->port_name, WWN_SIZE);
4967 vha->flags.process_response_queue = 1;
4970 if (!vha->flags.init_done) {
4978 vha->flags.process_response_queue = 0;
4982 ql_log(ql_log_info, vha, 0x0068,
4988 vha->flags.process_response_queue = 1;
4993 ql_log(ql_log_warn, vha, 0x0069,
5006 spin_lock_irqsave(fcport->vha->host->host_lock, flags);
5009 spin_unlock_irqrestore(fcport->vha->host->host_lock, flags);
5011 ql_dbg(ql_dbg_disc, fcport->vha, 0x210b,
5029 ql_dbg(ql_dbg_disc, fcport->vha, 0x207d,
5039 * @vha: HA context
5045 qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
5053 fcport->ct_desc.ct_sns = dma_alloc_coherent(&vha->hw->pdev->dev,
5057 ql_log(ql_log_warn, vha, 0xd049,
5064 fcport->vha = vha;
5074 fcport->login_retry = vha->hw->login_retry_count;
5075 fcport->chip_reset = vha->hw->base_qpair->chip_reset;
5079 ql_log(ql_log_warn, vha, 0xd049,
5098 dma_free_coherent(&fcport->vha->hw->pdev->dev,
5109 static void qla_get_login_template(scsi_qla_host_t *vha)
5111 struct qla_hw_data *ha = vha->hw;
5118 rval = qla24xx_get_port_login_templ(vha, ha->init_cb_dma,
5121 ql_dbg(ql_dbg_init, vha, 0x00d1,
5145 qla2x00_configure_loop(scsi_qla_host_t *vha)
5149 struct qla_hw_data *ha = vha->hw;
5154 if (test_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags)) {
5155 rval = qla2x00_configure_hba(vha);
5157 ql_dbg(ql_dbg_disc, vha, 0x2013,
5163 save_flags = flags = vha->dpc_flags;
5164 ql_dbg(ql_dbg_disc, vha, 0x2014,
5171 clear_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
5172 clear_bit(RSCN_UPDATE, &vha->dpc_flags);
5174 qla2x00_get_data_rate(vha);
5175 qla_get_login_template(vha);
5189 } else if (!vha->flags.online ||
5196 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) {
5197 ql_dbg(ql_dbg_disc, vha, 0x2015,
5201 rval = qla2x00_configure_local_loop(vha);
5205 if (LOOP_TRANSITION(vha)) {
5206 ql_dbg(ql_dbg_disc, vha, 0x2099,
5211 rval = qla2x00_configure_fabric(vha);
5215 if (atomic_read(&vha->loop_down_timer) ||
5216 test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) {
5219 atomic_set(&vha->loop_state, LOOP_READY);
5220 ql_dbg(ql_dbg_disc, vha, 0x2069,
5228 if (qla_tgt_mode_enabled(vha) ||
5229 qla_dual_mode_enabled(vha)) {
5231 qlt_24xx_process_atio_queue(vha, 0);
5239 ql_dbg(ql_dbg_disc, vha, 0x206a,
5242 ql_dbg(ql_dbg_disc, vha, 0x206b,
5247 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) {
5249 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
5251 set_bit(RSCN_UPDATE, &vha->dpc_flags);
5258 static int qla2x00_configure_n2n_loop(scsi_qla_host_t *vha)
5263 if (test_and_clear_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags))
5264 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
5266 list_for_each_entry(fcport, &vha->vp_fcports, list) {
5268 qla24xx_fcport_handle_login(vha, fcport);
5273 spin_lock_irqsave(&vha->work_lock, flags);
5274 vha->scan.scan_retry++;
5275 spin_unlock_irqrestore(&vha->work_lock, flags);
5277 if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
5278 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
5279 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5285 qla_reinitialize_link(scsi_qla_host_t *vha)
5289 atomic_set(&vha->loop_state, LOOP_DOWN);
5290 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
5291 rval = qla2x00_full_login_lip(vha);
5293 ql_dbg(ql_dbg_disc, vha, 0xd050, "Link reinitialized\n");
5295 ql_dbg(ql_dbg_disc, vha, 0xd051,
5311 qla2x00_configure_local_loop(scsi_qla_host_t *vha)
5322 struct qla_hw_data *ha = vha->hw;
5327 return qla2x00_configure_n2n_loop(vha);
5335 rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma,
5340 ql_dbg(ql_dbg_disc, vha, 0x2011,
5342 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075,
5346 spin_lock_irqsave(&vha->work_lock, flags);
5347 vha->scan.scan_retry++;
5348 spin_unlock_irqrestore(&vha->work_lock, flags);
5350 if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
5354 rc = qla2x00_get_fcal_position_map(vha, NULL,
5361 qla_reinitialize_link(vha);
5364 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
5365 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5368 vha->scan.scan_retry = 0;
5371 list_for_each_entry(fcport, &vha->vp_fcports, list) {
5376 new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
5378 ql_log(ql_log_warn, vha, 0x2012,
5402 if (area && domain && ((area != vha->d_id.b.area) ||
5403 (domain != vha->d_id.b.domain)) &&
5421 rval2 = qla2x00_get_port_database(vha, new_fcport, 0);
5423 ql_dbg(ql_dbg_disc, vha, 0x2097,
5429 ql_dbg(ql_dbg_disc, vha, 0x2105,
5431 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5436 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
5440 list_for_each_entry(fcport, &vha->vp_fcports, list) {
5453 fcport->login_retry = vha->hw->login_retry_count;
5454 ql_dbg(ql_dbg_disc, vha, 0x2135,
5465 list_add_tail(&new_fcport->list, &vha->vp_fcports);
5470 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
5472 new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
5475 ql_log(ql_log_warn, vha, 0xd031,
5480 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
5484 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
5492 list_for_each_entry(fcport, &vha->vp_fcports, list) {
5493 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5497 if ((qla_dual_mode_enabled(vha) ||
5498 qla_ini_mode_enabled(vha)) &&
5500 qla2x00_mark_device_lost(vha, fcport,
5506 ql_dbg(ql_dbg_disc, vha, 0x20f0,
5518 qla24xx_fcport_handle_login(vha, fcport);
5526 ql_dbg(ql_dbg_disc, vha, 0x2098,
5532 qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
5536 struct qla_hw_data *ha = vha->hw;
5549 rval = qla2x00_set_idma_speed(vha, fcport->loop_id, fcport->fp_speed,
5552 ql_dbg(ql_dbg_disc, vha, 0x2004,
5556 ql_dbg(ql_dbg_disc, vha, 0x2005,
5563 void qla_do_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport)
5565 qla2x00_iidma_fcport(vha, fcport);
5566 qla24xx_update_fcport_fcp_prio(vha, fcport);
5569 int qla_post_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport)
5573 e = qla2x00_alloc_work(vha, QLA_EVT_IIDMA);
5578 return qla2x00_post_work(vha, e);
5583 qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
5597 fcport->rport = rport = fc_remote_port_add(vha->host, 0, &rport_ids);
5599 ql_log(ql_log_warn, vha, 0x2006,
5604 spin_lock_irqsave(fcport->vha->host->host_lock, flags);
5606 spin_unlock_irqrestore(fcport->vha->host->host_lock, flags);
5622 ql_dbg(ql_dbg_disc, vha, 0x20ee,
5647 qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
5654 ql_dbg(ql_dbg_disc, vha, 0x20ef, "%s %8phC\n",
5658 fcport->login_retry = vha->hw->login_retry_count;
5661 spin_lock_irqsave(&vha->work_lock, flags);
5663 spin_unlock_irqrestore(&vha->work_lock, flags);
5665 if (vha->hw->current_topology == ISP_CFG_NL)
5671 switch (vha->hw->current_topology) {
5680 qla2x00_iidma_fcport(vha, fcport);
5682 qla2x00_dfs_create_rport(vha, fcport);
5684 if (NVME_TARGET(vha->hw, fcport)) {
5685 qla_nvme_register_remote(vha, fcport);
5691 qla24xx_update_fcport_fcp_prio(vha, fcport);
5693 switch (vha->host->active_mode) {
5695 qla2x00_reg_remote_port(vha, fcport);
5698 if (!vha->vha_tgt.qla_tgt->tgt_stop &&
5699 !vha->vha_tgt.qla_tgt->tgt_stopped)
5700 qlt_fc_port_added(vha, fcport);
5703 qla2x00_reg_remote_port(vha, fcport);
5704 if (!vha->vha_tgt.qla_tgt->tgt_stop &&
5705 !vha->vha_tgt.qla_tgt->tgt_stopped)
5706 qlt_fc_port_added(vha, fcport);
5714 if (IS_IIDMA_CAPABLE(vha->hw) && vha->hw->flags.gpsc_supported) {
5717 ql_dbg(ql_dbg_disc, vha, 0x20d7,
5720 vha->fcport_count);
5721 qla24xx_post_gfpnid_work(vha, fcport);
5723 ql_dbg(ql_dbg_disc, vha, 0x20d7,
5726 vha->fcport_count);
5727 qla24xx_post_gpsc_work(vha, fcport);
5743 qla2x00_update_fcport(fcport->vha, fcport);
5753 qla2x00_post_async_adisc_work(fcport->vha, fcport,
5774 qla2x00_configure_fabric(scsi_qla_host_t *vha)
5781 struct qla_hw_data *ha = vha->hw;
5789 rval = qla2x00_get_port_name(vha, loop_id, vha->fabric_node_name, 1);
5791 ql_dbg(ql_dbg_disc, vha, 0x20a0,
5794 vha->device_flags &= ~SWITCH_FOUND;
5797 vha->device_flags |= SWITCH_FOUND;
5799 rval = qla2x00_get_port_name(vha, loop_id, vha->fabric_port_name, 0);
5801 ql_dbg(ql_dbg_disc, vha, 0x20ff,
5804 if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) {
5805 rval = qla2x00_send_change_request(vha, 0x3, 0);
5807 ql_log(ql_log_warn, vha, 0x121,
5813 qla2x00_mgmt_svr_login(vha);
5817 rval = ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff,
5820 ql_dbg(ql_dbg_disc, vha, 0x20a1,
5823 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5829 test_and_clear_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags))
5830 qla2x00_fdmi_register(vha);
5832 if (test_and_clear_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags)) {
5833 if (qla2x00_rft_id(vha)) {
5835 ql_dbg(ql_dbg_disc, vha, 0x20a2,
5838 &vha->dpc_flags))
5841 if (qla2x00_rff_id(vha, FC4_TYPE_FCP_SCSI)) {
5843 ql_dbg(ql_dbg_disc, vha, 0x209a,
5846 &vha->dpc_flags))
5849 if (vha->flags.nvme_enabled) {
5850 if (qla2x00_rff_id(vha, FC_TYPE_NVME)) {
5851 ql_dbg(ql_dbg_disc, vha, 0x2049,
5855 if (qla2x00_rnn_id(vha)) {
5857 ql_dbg(ql_dbg_disc, vha, 0x2104,
5860 &vha->dpc_flags))
5862 } else if (qla2x00_rsnn_nn(vha)) {
5864 ql_dbg(ql_dbg_disc, vha, 0x209b,
5866 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5878 qlt_do_generation_tick(vha, &discovery_gen);
5881 rval = qla24xx_async_gpnft(vha, FC4_TYPE_FCP_SCSI,
5884 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5886 list_for_each_entry(fcport, &vha->vp_fcports, list)
5889 rval = qla2x00_find_all_fabric_devs(vha);
5895 if (!vha->nvme_local_port && vha->flags.nvme_enabled)
5896 qla_nvme_register_hba(vha);
5899 ql_dbg(ql_dbg_disc, vha, 0x2068,
5919 qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha)
5930 struct qla_hw_data *ha = vha->hw;
5943 ql_dbg(ql_dbg_disc, vha, 0x209c,
5947 if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
5949 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5951 } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
5953 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5955 } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) {
5957 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5959 } else if (qla2x00_gfpn_id(vha, swl) != QLA_SUCCESS) {
5961 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5967 qla2x00_gff_id(vha, swl);
5968 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
5975 new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
5977 ql_log(ql_log_warn, vha, 0x209d,
5989 if (qla2x00_is_reserved_id(vha, loop_id))
5993 (atomic_read(&vha->loop_down_timer) ||
5994 LOOP_TRANSITION(vha))) {
5995 atomic_set(&vha->loop_down_timer, 0);
5996 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5997 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
6016 if (vha->flags.nvme_enabled &&
6018 ql_log(ql_log_info, vha, 0x2131,
6030 rval = qla2x00_ga_nxt(vha, new_fcport);
6032 ql_log(ql_log_warn, vha, 0x209e,
6045 ql_dbg(ql_dbg_disc, vha, 0x209f,
6058 if (qla2x00_is_a_vp_did(vha, new_fcport->d_id.b24))
6063 (vha->d_id.b24 & 0xffff00)) && ha->current_topology ==
6077 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
6081 list_for_each_entry(fcport, &vha->vp_fcports, list) {
6101 (vha->host->active_mode == MODE_TARGET))) {
6122 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf080,
6142 if (found && NVME_TARGET(vha->hw, fcport)) {
6145 vha->fcport_count--;
6151 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
6156 list_add_tail(&new_fcport->list, &vha->vp_fcports);
6158 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
6163 new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
6165 ql_log(ql_log_warn, vha, 0xd032,
6178 list_for_each_entry(fcport, &vha->vp_fcports, list) {
6179 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
6186 if ((qla_dual_mode_enabled(vha) ||
6187 qla_ini_mode_enabled(vha)) &&
6189 qla2x00_mark_device_lost(vha, fcport,
6195 ql_dbg(ql_dbg_disc, vha, 0x20f0,
6207 qla24xx_fcport_handle_login(vha, fcport);
6214 qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *vha)
6217 int lid = NPH_MGMT_SERVER - vha->vp_idx;
6219 struct qla_hw_data *ha = vha->hw;
6221 if (vha->vp_idx == 0) {
6229 if (!test_bit(lid, vha->hw->loop_id_map)) {
6230 set_bit(lid, vha->hw->loop_id_map);
6255 qla2x00_fabric_login(scsi_qla_host_t *vha, fc_port_t *fcport,
6262 struct qla_hw_data *ha = vha->hw;
6268 ql_dbg(ql_dbg_disc, vha, 0x2000,
6275 rval = ha->isp_ops->fabric_login(vha, fcport->loop_id,
6293 ql_dbg(ql_dbg_disc, vha, 0x2001,
6341 rval = qla2x00_find_new_loop_id(vha, fcport);
6353 ha->isp_ops->fabric_logout(vha, fcport->loop_id,
6356 qla2x00_mark_device_lost(vha, fcport, 1);
6364 ql_dbg(ql_dbg_disc, vha, 0x2002,
6371 ha->isp_ops->fabric_logout(vha, fcport->loop_id,
6399 qla2x00_local_device_login(scsi_qla_host_t *vha, fc_port_t *fcport)
6405 rval = qla2x00_login_local_device(vha, fcport, mb, BIT_0);
6429 qla2x00_loop_resync(scsi_qla_host_t *vha)
6434 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
6435 if (vha->flags.online) {
6436 if (!(rval = qla2x00_fw_ready(vha))) {
6440 if (!IS_QLAFX00(vha->hw)) {
6445 qla2x00_marker(vha, vha->hw->base_qpair,
6447 vha->marker_needed = 0;
6451 clear_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
6453 if (IS_QLAFX00(vha->hw))
6454 qlafx00_configure_devices(vha);
6456 qla2x00_configure_loop(vha);
6459 } while (!atomic_read(&vha->loop_down_timer) &&
6460 !(test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
6462 &vha->dpc_flags)));
6466 if (test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
6470 ql_dbg(ql_dbg_disc, vha, 0x206c,
6511 struct scsi_qla_host *vha;
6517 list_for_each_entry(vha, &base_vha->hw->vp_list, list) {
6518 atomic_inc(&vha->vref_count);
6519 list_for_each_entry(fcport, &vha->vp_fcports, list) {
6528 atomic_dec(&vha->vref_count);
6529 wake_up(&vha->vref_waitq);
6536 qla83xx_reset_ownership(scsi_qla_host_t *vha)
6538 struct qla_hw_data *ha = vha->hw;
6545 drv_presence = qla8044_rd_direct(vha,
6547 dev_part_info1 = qla8044_rd_direct(vha,
6549 dev_part_info2 = qla8044_rd_direct(vha,
6552 qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence);
6553 qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO1, &dev_part_info1);
6554 qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO2, &dev_part_info2);
6588 ql_dbg(ql_dbg_p3p, vha, 0xb07f,
6595 __qla83xx_set_drv_ack(scsi_qla_host_t *vha)
6598 struct qla_hw_data *ha = vha->hw;
6601 rval = qla83xx_rd_reg(vha, QLA83XX_IDC_DRIVER_ACK, &drv_ack);
6604 rval = qla83xx_wr_reg(vha, QLA83XX_IDC_DRIVER_ACK, drv_ack);
6611 __qla83xx_clear_drv_ack(scsi_qla_host_t *vha)
6614 struct qla_hw_data *ha = vha->hw;
6617 rval = qla83xx_rd_reg(vha, QLA83XX_IDC_DRIVER_ACK, &drv_ack);
6620 rval = qla83xx_wr_reg(vha, QLA83XX_IDC_DRIVER_ACK, drv_ack);
6651 qla83xx_idc_audit(scsi_qla_host_t *vha, int audit_type)
6653 struct qla_hw_data *ha = vha->hw;
6661 qla83xx_wr_reg(vha, QLA83XX_IDC_AUDIT, idc_audit_reg);
6669 qla83xx_wr_reg(vha, QLA83XX_IDC_AUDIT, idc_audit_reg);
6673 ql_log(ql_log_warn, vha, 0xb078,
6681 qla83xx_initiating_reset(scsi_qla_host_t *vha)
6683 struct qla_hw_data *ha = vha->hw;
6686 __qla83xx_get_idc_control(vha, &idc_control);
6688 ql_log(ql_log_info, vha, 0xb080,
6695 qla83xx_rd_reg(vha, QLA83XX_IDC_DEV_STATE, &dev_state);
6697 qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE,
6699 ql_log(ql_log_info, vha, 0xb056, "HW State: NEED RESET.\n");
6700 qla83xx_idc_audit(vha, IDC_AUDIT_TIMESTAMP);
6704 ql_log(ql_log_info, vha, 0xb057, "HW State: %s.\n", state);
6709 qla83xx_idc_unlock(vha, 0);
6711 qla83xx_idc_lock(vha, 0);
6712 qla83xx_rd_reg(vha, QLA83XX_IDC_DEV_STATE, &dev_state);
6717 __qla83xx_set_drv_ack(vha);
6723 __qla83xx_set_idc_control(scsi_qla_host_t *vha, uint32_t idc_control)
6725 return qla83xx_wr_reg(vha, QLA83XX_IDC_CONTROL, idc_control);
6729 __qla83xx_get_idc_control(scsi_qla_host_t *vha, uint32_t *idc_control)
6731 return qla83xx_rd_reg(vha, QLA83XX_IDC_CONTROL, idc_control);
6735 qla83xx_check_driver_presence(scsi_qla_host_t *vha)
6738 struct qla_hw_data *ha = vha->hw;
6740 qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence);
6748 qla83xx_nic_core_reset(scsi_qla_host_t *vha)
6751 struct qla_hw_data *ha = vha->hw;
6753 ql_dbg(ql_dbg_p3p, vha, 0xb058,
6756 if (vha->device_flags & DFLG_DEV_FAILED) {
6757 ql_log(ql_log_warn, vha, 0xb059,
6762 qla83xx_idc_lock(vha, 0);
6764 if (qla83xx_check_driver_presence(vha) != QLA_SUCCESS) {
6765 ql_log(ql_log_warn, vha, 0xb05a,
6772 qla83xx_reset_ownership(vha);
6774 rval = qla83xx_initiating_reset(vha);
6781 rval = qla83xx_idc_state_handler(vha);
6785 __qla83xx_clear_drv_ack(vha);
6789 qla83xx_idc_unlock(vha, 0);
6791 ql_dbg(ql_dbg_p3p, vha, 0xb05b, "Exiting %s.\n", __func__);
6797 qla2xxx_mctp_dump(scsi_qla_host_t *vha)
6799 struct qla_hw_data *ha = vha->hw;
6804 ql_log(ql_log_info, vha, 0x506d,
6814 ql_log(ql_log_warn, vha, 0x506e,
6821 rval = qla2x00_dump_mctp_data(vha, ha->mctp_dump_dma,
6824 ql_log(ql_log_warn, vha, 0x506f,
6827 ql_log(ql_log_info, vha, 0x5070,
6829 vha->host_no, ha->mctp_dump);
6835 rval = qla83xx_restart_nic_firmware(vha);
6838 ql_log(ql_log_warn, vha, 0x5071,
6841 ql_dbg(ql_dbg_p3p, vha, 0xb084,
6859 qla2x00_quiesce_io(scsi_qla_host_t *vha)
6861 struct qla_hw_data *ha = vha->hw;
6864 ql_dbg(ql_dbg_dpc, vha, 0x401d,
6868 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
6869 atomic_set(&vha->loop_state, LOOP_DOWN);
6870 qla2x00_mark_all_devices_lost(vha);
6874 if (!atomic_read(&vha->loop_down_timer))
6875 atomic_set(&vha->loop_down_timer,
6879 WARN_ON_ONCE(qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST)
6884 qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
6886 struct qla_hw_data *ha = vha->hw;
6896 vha->flags.online = 0;
6898 clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
6899 vha->qla_stats.total_isp_aborts++;
6901 ql_log(ql_log_info, vha, 0x00af,
6910 ha->isp_ops->reset_chip(vha);
6946 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
6947 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
6948 atomic_set(&vha->loop_state, LOOP_DOWN);
6949 qla2x00_mark_all_devices_lost(vha);
6963 if (!atomic_read(&vha->loop_down_timer))
6964 atomic_set(&vha->loop_down_timer,
6969 list_for_each_entry(fcport, &vha->vp_fcports, list) {
6988 qla82xx_chip_reset_cleanup(vha);
6989 ql_log(ql_log_info, vha, 0x00b4,
6993 vha->flags.online = 0;
6997 qla2x00_abort_all_cmds(vha, DID_RESET << 16);
7013 qla2x00_abort_isp(scsi_qla_host_t *vha)
7017 struct qla_hw_data *ha = vha->hw;
7022 if (vha->flags.online) {
7023 qla2x00_abort_isp_cleanup(vha);
7026 ql_log(ql_log_info, vha, 0x803f,
7031 if (test_and_clear_bit(ISP_ABORT_TO_ROM, &vha->dpc_flags)) {
7033 vha->flags.online = 1;
7035 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
7040 ql_dbg(ql_dbg_p3p, vha, 0xb05c,
7042 if (qla83xx_clear_drv_presence(vha) != QLA_SUCCESS)
7043 ql_dbg(ql_dbg_p3p, vha, 0xb073,
7049 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
7054 switch (vha->qlini_mode) {
7056 if (!qla_tgt_mode_enabled(vha))
7060 if (!qla_dual_mode_enabled(vha) &&
7061 !qla_ini_mode_enabled(vha))
7069 ha->isp_ops->get_flash_version(vha, req->ring);
7072 ql_log(ql_log_info, vha, 0x803f,
7076 ha->isp_ops->nvram_config(vha);
7079 ql_log(ql_log_info, vha, 0x803f,
7083 if (!qla2x00_restart_isp(vha)) {
7084 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
7086 if (!atomic_read(&vha->loop_down_timer)) {
7091 vha->marker_needed = 1;
7094 vha->flags.online = 1;
7099 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
7102 qla2x00_get_fw_version(vha);
7107 rval = qla2x00_enable_fce_trace(vha,
7111 ql_log(ql_log_warn, vha, 0x8033,
7120 rval = qla2x00_enable_eft_trace(vha,
7123 ql_log(ql_log_warn, vha, 0x8034,
7129 vha->flags.online = 1;
7130 if (test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
7132 ql_log(ql_log_fatal, vha, 0x8035,
7139 qla2x00_abort_isp_cleanup(vha);
7140 vha->flags.online = 0;
7142 &vha->dpc_flags);
7146 ql_dbg(ql_dbg_taskm, vha, 0x8020,
7153 ql_dbg(ql_dbg_taskm, vha, 0x8021,
7156 set_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
7164 ql_dbg(ql_dbg_taskm, vha, 0x8022, "%s succeeded.\n", __func__);
7165 qla2x00_configure_hba(vha);
7181 ql_dbg(ql_dbg_p3p, vha, 0xb05d,
7183 if (qla83xx_set_drv_presence(vha) != QLA_SUCCESS)
7184 ql_dbg(ql_dbg_p3p, vha, 0xb074,
7188 ql_log(ql_log_warn, vha, 0x8023, "%s **** FAILED ****.\n",
7206 qla2x00_restart_isp(scsi_qla_host_t *vha)
7209 struct qla_hw_data *ha = vha->hw;
7212 if (qla2x00_isp_firmware(vha)) {
7213 vha->flags.online = 0;
7214 status = ha->isp_ops->chip_diag(vha);
7217 status = qla2x00_setup_chip(vha);
7222 status = qla2x00_init_rings(vha);
7226 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
7232 status = qla2x00_fw_ready(vha);
7235 return vha->device_flags & DFLG_NO_CABLE ? 0 : status;
7239 qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
7240 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
7296 qla2x00_reset_adapter(scsi_qla_host_t *vha)
7299 struct qla_hw_data *ha = vha->hw;
7302 vha->flags.online = 0;
7316 qla24xx_reset_adapter(scsi_qla_host_t *vha)
7319 struct qla_hw_data *ha = vha->hw;
7325 vha->flags.online = 0;
7344 static void qla24xx_nvram_wwn_from_ofw(scsi_qla_host_t *vha,
7348 struct qla_hw_data *ha = vha->hw;
7365 qla24xx_nvram_config(scsi_qla_host_t *vha)
7374 struct qla_hw_data *ha = vha->hw;
7394 ha->isp_ops->read_nvram(vha, ha->vpd,
7399 ha->isp_ops->read_nvram(vha, dptr, ha->nvram_base, ha->nvram_size);
7403 ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x006a,
7405 ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x010d,
7412 ql_log(ql_log_warn, vha, 0x006b,
7415 ql_dump_buffer(ql_dbg_init, vha, 0x006b, nv, sizeof(*nv));
7416 ql_log(ql_log_warn, vha, 0x006c,
7446 qla24xx_nvram_wwn_from_ofw(vha, nv);
7465 if (qla_tgt_mode_enabled(vha)) {
7472 qlt_24xx_config_nvram_stage1(vha, nv);
7498 qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name),
7501 qlt_24xx_config_nvram_stage2(vha, icb);
7539 memcpy(vha->node_name, icb->node_name, WWN_SIZE);
7540 memcpy(vha->port_name, icb->port_name, WWN_SIZE);
7597 if (!vha->flags.init_done) {
7608 ql_log(ql_log_info, vha, 0x006f,
7618 ql_log(ql_log_warn, vha, 0x0070,
7625 qla27xx_print_image(struct scsi_qla_host *vha, char *name,
7628 ql_dbg(ql_dbg_init, vha, 0x018b,
7713 struct scsi_qla_host *vha, struct active_regions *active_regions)
7715 struct qla_hw_data *ha = vha->hw;
7721 ql_dbg(ql_dbg_init, vha, 0x018a, "Primary aux image not addressed\n");
7725 qla24xx_read_flash_data(vha, (uint32_t *)&pri_aux_image_status,
7728 qla27xx_print_image(vha, "Primary aux image", &pri_aux_image_status);
7731 ql_dbg(ql_dbg_init, vha, 0x018b,
7738 ql_dbg(ql_dbg_init, vha, 0x018c,
7746 ql_dbg(ql_dbg_init, vha, 0x018d,
7753 ql_dbg(ql_dbg_init, vha, 0x018a,
7758 qla24xx_read_flash_data(vha, (uint32_t *)&sec_aux_image_status,
7761 qla27xx_print_image(vha, "Secondary aux image", &sec_aux_image_status);
7764 ql_dbg(ql_dbg_init, vha, 0x018b,
7771 ql_dbg(ql_dbg_init, vha, 0x018c,
7779 ql_dbg(ql_dbg_init, vha, 0x018d,
7801 ql_dbg(ql_dbg_init, vha, 0x018f,
7810 qla27xx_get_active_image(struct scsi_qla_host *vha,
7813 struct qla_hw_data *ha = vha->hw;
7819 ql_dbg(ql_dbg_init, vha, 0x018a, "Primary image not addressed\n");
7823 if (qla24xx_read_flash_data(vha, (uint32_t *)&pri_image_status,
7829 qla27xx_print_image(vha, "Primary image", &pri_image_status);
7832 ql_dbg(ql_dbg_init, vha, 0x018b,
7839 ql_dbg(ql_dbg_init, vha, 0x018c,
7847 ql_dbg(ql_dbg_init, vha, 0x018d,
7854 ql_dbg(ql_dbg_init, vha, 0x018a, "Secondary image not addressed\n");
7858 qla24xx_read_flash_data(vha, (uint32_t *)(&sec_image_status),
7860 qla27xx_print_image(vha, "Secondary image", &sec_image_status);
7863 ql_dbg(ql_dbg_init, vha, 0x018b,
7870 ql_dbg(ql_dbg_init, vha, 0x018c,
7878 ql_dbg(ql_dbg_init, vha, 0x018d,
7895 ql_dbg(ql_dbg_init, vha, 0x018f, "active image %s (%u)\n",
7913 qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr,
7923 struct qla_hw_data *ha = vha->hw;
7927 ql_dbg(ql_dbg_init, vha, 0x008b,
7931 qla24xx_read_flash_data(vha, dcode, faddr, 8);
7933 ql_log(ql_log_fatal, vha, 0x008c,
7936 ql_log(ql_log_fatal, vha, 0x008d,
7947 ql_dbg(ql_dbg_init, vha, 0x008d,
7949 qla24xx_read_flash_data(vha, dcode, faddr, 10);
7962 ql_dbg(ql_dbg_init, vha, 0x008e,
7965 qla24xx_read_flash_data(vha, dcode, faddr, dlen);
7969 rval = qla2x00_load_ram(vha, req->dma, risc_addr, dlen);
7971 ql_log(ql_log_fatal, vha, 0x008f,
7987 ql_dbg(ql_dbg_init, vha, 0x0160, "-> templates = %u\n", templates);
7995 qla24xx_read_flash_data(vha, dcode, faddr, 7);
7997 ql_dbg(ql_dbg_init, vha, 0x0161,
8001 ql_dbg(ql_dbg_init, vha, 0x0162,
8010 ql_dbg(ql_dbg_init, vha, 0x0163,
8015 ql_log(ql_log_warn, vha, 0x0164,
8021 qla24xx_read_flash_data(vha, dcode, faddr, risc_size);
8024 ql_log(ql_log_warn, vha, 0x0165,
8030 ql_dbg(ql_dbg_init, vha, 0x0166,
8034 ql_log(ql_log_warn, vha, 0x0167,
8041 ql_dbg(ql_dbg_init, vha, 0x0168,
8061 qla2x00_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
8069 struct qla_hw_data *ha = vha->hw;
8073 blob = qla2x00_request_firmware(vha);
8075 ql_log(ql_log_info, vha, 0x0083,
8077 ql_log(ql_log_info, vha, 0x0084,
8091 ql_log(ql_log_fatal, vha, 0x0085,
8101 ql_log(ql_log_fatal, vha, 0x0086,
8103 ql_log(ql_log_fatal, vha, 0x0087,
8118 ql_log(ql_log_fatal, vha, 0x0088,
8129 ql_dbg(ql_dbg_init, vha, 0x0089,
8136 rval = qla2x00_load_ram(vha, req->dma, risc_addr,
8139 ql_log(ql_log_fatal, vha, 0x008a,
8161 qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr)
8172 struct qla_hw_data *ha = vha->hw;
8176 ql_dbg(ql_dbg_init, vha, 0x0090,
8179 blob = qla2x00_request_firmware(vha);
8181 ql_log(ql_log_warn, vha, 0x0092,
8190 ql_log(ql_log_fatal, vha, 0x0093,
8193 ql_log(ql_log_fatal, vha, 0x0095,
8203 ql_dbg(ql_dbg_init, vha, 0x0096,
8218 ql_dbg(ql_dbg_init, vha, 0x0097,
8227 rval = qla2x00_load_ram(vha, req->dma, risc_addr, dlen);
8229 ql_log(ql_log_fatal, vha, 0x0098,
8245 ql_dbg(ql_dbg_init, vha, 0x0170, "-> templates = %u\n", templates);
8253 ql_dbg(ql_dbg_init, vha, 0x0171,
8258 ql_dbg(ql_dbg_init, vha, 0x0172,
8267 ql_dbg(ql_dbg_init, vha, 0x0173,
8272 ql_log(ql_log_warn, vha, 0x0174,
8282 ql_log(ql_log_warn, vha, 0x0175,
8288 ql_dbg(ql_dbg_init, vha, 0x0176,
8292 ql_log(ql_log_warn, vha, 0x0177,
8299 ql_dbg(ql_dbg_init, vha, 0x0178,
8317 qla24xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
8322 return qla81xx_load_risc(vha, srisc_addr);
8329 rval = qla24xx_load_risc_blob(vha, srisc_addr);
8333 return qla24xx_load_risc_flash(vha, srisc_addr,
8334 vha->hw->flt_region_fw);
8338 qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
8341 struct qla_hw_data *ha = vha->hw;
8356 qla27xx_get_active_image(vha, &active_regions);
8361 ql_dbg(ql_dbg_init, vha, 0x008b,
8363 rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_fw_sec);
8368 ql_dbg(ql_dbg_init, vha, 0x008b,
8370 rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_fw);
8375 rval = qla24xx_load_risc_blob(vha, srisc_addr);
8379 ql_log(ql_log_info, vha, 0x0099,
8381 rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_gold_fw);
8385 ql_log(ql_log_info, vha, 0x009a, "Need firmware flash update.\n");
8391 qla2x00_try_to_stop_firmware(scsi_qla_host_t *vha)
8394 struct qla_hw_data *ha = vha->hw;
8405 ret = qla2x00_stop_firmware(vha);
8408 ha->isp_ops->reset_chip(vha);
8409 if (ha->isp_ops->chip_diag(vha) != QLA_SUCCESS)
8411 if (qla2x00_setup_chip(vha) != QLA_SUCCESS)
8413 ql_log(ql_log_info, vha, 0x8015,
8415 ret = qla2x00_stop_firmware(vha);
8423 qla24xx_configure_vhba(scsi_qla_host_t *vha)
8428 struct qla_hw_data *ha = vha->hw;
8431 if (!vha->vp_idx)
8437 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
8438 qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
8441 vha->flags.management_server_logged_in = 0;
8444 rval2 = ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb,
8448 ql_dbg(ql_dbg_init, vha, 0x0120,
8452 ql_dbg(ql_dbg_init, vha, 0x0103,
8459 atomic_set(&vha->loop_down_timer, 0);
8460 atomic_set(&vha->loop_state, LOOP_UP);
8461 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
8462 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
8474 qla84xx_get_chip(struct scsi_qla_host *vha)
8477 struct qla_hw_data *ha = vha->hw;
8517 qla84xx_put_chip(struct scsi_qla_host *vha)
8519 struct qla_hw_data *ha = vha->hw;
8526 qla84xx_init_chip(scsi_qla_host_t *vha)
8530 struct qla_hw_data *ha = vha->hw;
8534 rval = qla84xx_verify_chip(vha, status);
8545 qla81xx_nvram_config(scsi_qla_host_t *vha)
8554 struct qla_hw_data *ha = vha->hw;
8569 qla28xx_get_aux_images(vha, &active_regions);
8578 ql_dbg(ql_dbg_init, vha, 0x0110,
8583 ha->isp_ops->read_optrom(vha, ha->vpd, faddr << 2, ha->vpd_size);
8591 ql_dbg(ql_dbg_init, vha, 0x0110,
8595 ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
8601 ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x0111,
8603 ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0112,
8610 ql_log(ql_log_info, vha, 0x0073,
8613 ql_dump_buffer(ql_dbg_init, vha, 0x0073, nv, sizeof(*nv));
8614 ql_log(ql_log_info, vha, 0x0074,
8670 qlt_81xx_config_nvram_stage1(vha, nv);
8709 qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name),
8712 qlt_81xx_config_nvram_stage2(vha, icb);
8752 memcpy(vha->node_name, icb->node_name, WWN_SIZE);
8753 memcpy(vha->port_name, icb->port_name, WWN_SIZE);
8807 if (!vha->hw->flags.msix_enabled &&
8812 if (!vha->flags.init_done) {
8820 vha->flags.process_response_queue = 0;
8824 ql_log(ql_log_info, vha, 0x0075,
8832 vha->flags.process_response_queue = 1;
8842 ha->fc4_type_priority = qla2xxx_get_fc4_priority(vha);
8845 ql_log(ql_log_warn, vha, 0x0076,
8852 qla82xx_restart_isp(scsi_qla_host_t *vha)
8855 struct qla_hw_data *ha = vha->hw;
8859 status = qla2x00_init_rings(vha);
8861 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
8864 status = qla2x00_fw_ready(vha);
8867 qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
8868 vha->flags.online = 1;
8869 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
8873 if ((vha->device_flags & DFLG_NO_CABLE))
8878 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
8880 if (!atomic_read(&vha->loop_down_timer)) {
8885 vha->marker_needed = 1;
8891 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
8894 status = qla82xx_check_md_needed(vha);
8900 rval = qla2x00_enable_fce_trace(vha,
8904 ql_log(ql_log_warn, vha, 0x8001,
8913 rval = qla2x00_enable_eft_trace(vha,
8916 ql_log(ql_log_warn, vha, 0x8010,
8924 ql_dbg(ql_dbg_taskm, vha, 0x8011,
8942 ql_log(ql_log_warn, vha, 0x8016,
8957 * vha = scsi host structure pointer.
8968 qla24xx_get_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
8976 struct qla_hw_data *ha = vha->hw;
8996 pid2 = vha->d_id.b24 & INVALID_PORT_ID;
9015 wwn1 = wwn_to_u64(vha->port_name);
9051 * vha = scsi host structure pointer.
9061 qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
9071 priority = qla24xx_get_fcp_prio(vha, fcport);
9075 if (IS_P3P_TYPE(vha->hw)) {
9080 ret = qla24xx_set_fcp_prio(vha, fcport->loop_id, priority, mb);
9083 ql_dbg(ql_dbg_user, vha, 0x709e,
9090 ql_dbg(ql_dbg_user, vha, 0x704f,
9112 qla24xx_update_all_fcp_prio(scsi_qla_host_t *vha)
9119 list_for_each_entry(fcport, &vha->vp_fcports, list)
9120 ret = qla24xx_update_fcport_fcp_prio(vha, fcport);
9125 struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos,
9131 struct qla_hw_data *ha = vha->hw;
9137 ql_log(ql_log_warn, vha, 0x00181,
9145 ql_log(ql_log_warn, vha, 0x0182,
9150 qpair->hw = vha->hw;
9151 qpair->vha = vha;
9161 ql_log(ql_log_warn, vha, 0x0183,
9182 ql_dbg(ql_dbg_multiq, vha, 0xc00f,
9187 ql_log(ql_log_warn, vha, 0x0184,
9193 list_add_tail(&qpair->qp_list_elem, &vha->qp_list);
9203 ql_log(ql_log_warn, vha, 0x0185,
9214 ql_log(ql_log_warn, vha, 0x0186,
9232 ql_log(ql_log_warn, vha, 0xd036,
9241 if (!vha->flags.qpairs_available)
9242 vha->flags.qpairs_available = 1;
9244 ql_dbg(ql_dbg_multiq, vha, 0xc00d,
9247 ql_dbg(ql_dbg_init, vha, 0x0187,
9255 qla25xx_delete_rsp_que(vha, qpair->rsp);
9260 if (list_empty(&vha->qp_list))
9261 vha->flags.qpairs_available = 0;
9272 int qla2xxx_delete_qpair(struct scsi_qla_host *vha, struct qla_qpair *qpair)
9279 ret = qla25xx_delete_req_que(vha, qpair->req);
9283 ret = qla25xx_delete_rsp_que(vha, qpair->rsp);
9292 if (list_empty(&vha->qp_list)) {
9293 vha->flags.qpairs_available = 0;
9294 vha->flags.qpairs_req_created = 0;
9295 vha->flags.qpairs_rsp_created = 0;