aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc.h1
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc_fcoe.c10
-rw-r--r--drivers/scsi/cxgbi/cxgb4i/cxgb4i.c1
-rw-r--r--drivers/scsi/cxgbi/libcxgbi.c29
-rw-r--r--drivers/scsi/cxgbi/libcxgbi.h1
-rw-r--r--drivers/scsi/lpfc/lpfc_crtn.h2
-rw-r--r--drivers/scsi/lpfc/lpfc_ct.c5
-rw-r--r--drivers/scsi/lpfc/lpfc_nportdisc.c7
-rw-r--r--drivers/scsi/lpfc/lpfc_nvmet.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_bsg.c9
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h1
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c5
-rw-r--r--drivers/scsi/qla2xxx/qla_inline.h26
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c13
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c46
-rw-r--r--drivers/scsi/qla2xxx/qla_target.c8
-rw-r--r--drivers/scsi/qla2xxx/qla_tmpl.c2
-rw-r--r--drivers/scsi/scsi_debug.c2
20 files changed, 101 insertions, 77 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h
index 4fc8ed5fe067..1f424e40afdf 100644
--- a/drivers/scsi/bnx2fc/bnx2fc.h
+++ b/drivers/scsi/bnx2fc/bnx2fc.h
@@ -191,6 +191,7 @@ struct bnx2fc_hba {
191 struct bnx2fc_cmd_mgr *cmd_mgr; 191 struct bnx2fc_cmd_mgr *cmd_mgr;
192 spinlock_t hba_lock; 192 spinlock_t hba_lock;
193 struct mutex hba_mutex; 193 struct mutex hba_mutex;
194 struct mutex hba_stats_mutex;
194 unsigned long adapter_state; 195 unsigned long adapter_state;
195 #define ADAPTER_STATE_UP 0 196 #define ADAPTER_STATE_UP 0
196 #define ADAPTER_STATE_GOING_DOWN 1 197 #define ADAPTER_STATE_GOING_DOWN 1
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index 93b5a0012417..902722dc4ce3 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -663,15 +663,17 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
663 if (!fw_stats) 663 if (!fw_stats)
664 return NULL; 664 return NULL;
665 665
666 mutex_lock(&hba->hba_stats_mutex);
667
666 bnx2fc_stats = fc_get_host_stats(shost); 668 bnx2fc_stats = fc_get_host_stats(shost);
667 669
668 init_completion(&hba->stat_req_done); 670 init_completion(&hba->stat_req_done);
669 if (bnx2fc_send_stat_req(hba)) 671 if (bnx2fc_send_stat_req(hba))
670 return bnx2fc_stats; 672 goto unlock_stats_mutex;
671 rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ)); 673 rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ));
672 if (!rc) { 674 if (!rc) {
673 BNX2FC_HBA_DBG(lport, "FW stat req timed out\n"); 675 BNX2FC_HBA_DBG(lport, "FW stat req timed out\n");
674 return bnx2fc_stats; 676 goto unlock_stats_mutex;
675 } 677 }
676 BNX2FC_STATS(hba, rx_stat2, fc_crc_cnt); 678 BNX2FC_STATS(hba, rx_stat2, fc_crc_cnt);
677 bnx2fc_stats->invalid_crc_count += hba->bfw_stats.fc_crc_cnt; 679 bnx2fc_stats->invalid_crc_count += hba->bfw_stats.fc_crc_cnt;
@@ -693,6 +695,9 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
693 695
694 memcpy(&hba->prev_stats, hba->stats_buffer, 696 memcpy(&hba->prev_stats, hba->stats_buffer,
695 sizeof(struct fcoe_statistics_params)); 697 sizeof(struct fcoe_statistics_params));
698
699unlock_stats_mutex:
700 mutex_unlock(&hba->hba_stats_mutex);
696 return bnx2fc_stats; 701 return bnx2fc_stats;
697} 702}
698 703
@@ -1340,6 +1345,7 @@ static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic)
1340 } 1345 }
1341 spin_lock_init(&hba->hba_lock); 1346 spin_lock_init(&hba->hba_lock);
1342 mutex_init(&hba->hba_mutex); 1347 mutex_init(&hba->hba_mutex);
1348 mutex_init(&hba->hba_stats_mutex);
1343 1349
1344 hba->cnic = cnic; 1350 hba->cnic = cnic;
1345 1351
diff --git a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
index 1076c1578322..0aae094ab91c 100644
--- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
@@ -1595,7 +1595,6 @@ static void release_offload_resources(struct cxgbi_sock *csk)
1595 cxgbi_sock_put(csk); 1595 cxgbi_sock_put(csk);
1596 } 1596 }
1597 csk->dst = NULL; 1597 csk->dst = NULL;
1598 csk->cdev = NULL;
1599} 1598}
1600 1599
1601static int init_act_open(struct cxgbi_sock *csk) 1600static int init_act_open(struct cxgbi_sock *csk)
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index fb06974c88c1..e4c83b7c96a8 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -867,7 +867,8 @@ static void need_active_close(struct cxgbi_sock *csk)
867 log_debug(1 << CXGBI_DBG_SOCK, "csk 0x%p,%u,0x%lx,%u.\n", 867 log_debug(1 << CXGBI_DBG_SOCK, "csk 0x%p,%u,0x%lx,%u.\n",
868 csk, (csk)->state, (csk)->flags, (csk)->tid); 868 csk, (csk)->state, (csk)->flags, (csk)->tid);
869 spin_lock_bh(&csk->lock); 869 spin_lock_bh(&csk->lock);
870 dst_confirm(csk->dst); 870 if (csk->dst)
871 dst_confirm(csk->dst);
871 data_lost = skb_queue_len(&csk->receive_queue); 872 data_lost = skb_queue_len(&csk->receive_queue);
872 __skb_queue_purge(&csk->receive_queue); 873 __skb_queue_purge(&csk->receive_queue);
873 874
@@ -882,7 +883,8 @@ static void need_active_close(struct cxgbi_sock *csk)
882 } 883 }
883 884
884 if (close_req) { 885 if (close_req) {
885 if (data_lost) 886 if (!cxgbi_sock_flag(csk, CTPF_LOGOUT_RSP_RCVD) ||
887 data_lost)
886 csk->cdev->csk_send_abort_req(csk); 888 csk->cdev->csk_send_abort_req(csk);
887 else 889 else
888 csk->cdev->csk_send_close_req(csk); 890 csk->cdev->csk_send_close_req(csk);
@@ -1186,9 +1188,10 @@ static int cxgbi_sock_send_pdus(struct cxgbi_sock *csk, struct sk_buff *skb)
1186 cxgbi_ulp_extra_len(cxgbi_skcb_ulp_mode(skb)); 1188 cxgbi_ulp_extra_len(cxgbi_skcb_ulp_mode(skb));
1187 skb = next; 1189 skb = next;
1188 } 1190 }
1189done: 1191
1190 if (likely(skb_queue_len(&csk->write_queue))) 1192 if (likely(skb_queue_len(&csk->write_queue)))
1191 cdev->csk_push_tx_frames(csk, 1); 1193 cdev->csk_push_tx_frames(csk, 1);
1194done:
1192 spin_unlock_bh(&csk->lock); 1195 spin_unlock_bh(&csk->lock);
1193 return copied; 1196 return copied;
1194 1197
@@ -1568,9 +1571,12 @@ static inline int read_pdu_skb(struct iscsi_conn *conn,
1568 } 1571 }
1569} 1572}
1570 1573
1571static int skb_read_pdu_bhs(struct iscsi_conn *conn, struct sk_buff *skb) 1574static int
1575skb_read_pdu_bhs(struct cxgbi_sock *csk, struct iscsi_conn *conn,
1576 struct sk_buff *skb)
1572{ 1577{
1573 struct iscsi_tcp_conn *tcp_conn = conn->dd_data; 1578 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
1579 int err;
1574 1580
1575 log_debug(1 << CXGBI_DBG_PDU_RX, 1581 log_debug(1 << CXGBI_DBG_PDU_RX,
1576 "conn 0x%p, skb 0x%p, len %u, flag 0x%lx.\n", 1582 "conn 0x%p, skb 0x%p, len %u, flag 0x%lx.\n",
@@ -1608,7 +1614,16 @@ static int skb_read_pdu_bhs(struct iscsi_conn *conn, struct sk_buff *skb)
1608 } 1614 }
1609 } 1615 }
1610 1616
1611 return read_pdu_skb(conn, skb, 0, 0); 1617 err = read_pdu_skb(conn, skb, 0, 0);
1618 if (likely(err >= 0)) {
1619 struct iscsi_hdr *hdr = (struct iscsi_hdr *)skb->data;
1620 u8 opcode = hdr->opcode & ISCSI_OPCODE_MASK;
1621
1622 if (unlikely(opcode == ISCSI_OP_LOGOUT_RSP))
1623 cxgbi_sock_set_flag(csk, CTPF_LOGOUT_RSP_RCVD);
1624 }
1625
1626 return err;
1612} 1627}
1613 1628
1614static int skb_read_pdu_data(struct iscsi_conn *conn, struct sk_buff *lskb, 1629static int skb_read_pdu_data(struct iscsi_conn *conn, struct sk_buff *lskb,
@@ -1713,7 +1728,7 @@ void cxgbi_conn_pdu_ready(struct cxgbi_sock *csk)
1713 cxgbi_skcb_rx_pdulen(skb)); 1728 cxgbi_skcb_rx_pdulen(skb));
1714 1729
1715 if (cxgbi_skcb_test_flag(skb, SKCBF_RX_COALESCED)) { 1730 if (cxgbi_skcb_test_flag(skb, SKCBF_RX_COALESCED)) {
1716 err = skb_read_pdu_bhs(conn, skb); 1731 err = skb_read_pdu_bhs(csk, conn, skb);
1717 if (err < 0) { 1732 if (err < 0) {
1718 pr_err("coalesced bhs, csk 0x%p, skb 0x%p,%u, " 1733 pr_err("coalesced bhs, csk 0x%p, skb 0x%p,%u, "
1719 "f 0x%lx, plen %u.\n", 1734 "f 0x%lx, plen %u.\n",
@@ -1731,7 +1746,7 @@ void cxgbi_conn_pdu_ready(struct cxgbi_sock *csk)
1731 cxgbi_skcb_flags(skb), 1746 cxgbi_skcb_flags(skb),
1732 cxgbi_skcb_rx_pdulen(skb)); 1747 cxgbi_skcb_rx_pdulen(skb));
1733 } else { 1748 } else {
1734 err = skb_read_pdu_bhs(conn, skb); 1749 err = skb_read_pdu_bhs(csk, conn, skb);
1735 if (err < 0) { 1750 if (err < 0) {
1736 pr_err("bhs, csk 0x%p, skb 0x%p,%u, " 1751 pr_err("bhs, csk 0x%p, skb 0x%p,%u, "
1737 "f 0x%lx, plen %u.\n", 1752 "f 0x%lx, plen %u.\n",
diff --git a/drivers/scsi/cxgbi/libcxgbi.h b/drivers/scsi/cxgbi/libcxgbi.h
index 239462a75760..37f07aaab1e4 100644
--- a/drivers/scsi/cxgbi/libcxgbi.h
+++ b/drivers/scsi/cxgbi/libcxgbi.h
@@ -187,6 +187,7 @@ enum cxgbi_sock_flags {
187 CTPF_HAS_ATID, /* reserved atid */ 187 CTPF_HAS_ATID, /* reserved atid */
188 CTPF_HAS_TID, /* reserved hw tid */ 188 CTPF_HAS_TID, /* reserved hw tid */
189 CTPF_OFFLOAD_DOWN, /* offload function off */ 189 CTPF_OFFLOAD_DOWN, /* offload function off */
190 CTPF_LOGOUT_RSP_RCVD, /* received logout response */
190}; 191};
191 192
192struct cxgbi_skb_rx_cb { 193struct cxgbi_skb_rx_cb {
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h
index 8912767e7bc8..da669dce12fe 100644
--- a/drivers/scsi/lpfc/lpfc_crtn.h
+++ b/drivers/scsi/lpfc/lpfc_crtn.h
@@ -127,7 +127,7 @@ int lpfc_disc_state_machine(struct lpfc_vport *, struct lpfc_nodelist *, void *,
127void lpfc_do_scr_ns_plogi(struct lpfc_hba *, struct lpfc_vport *); 127void lpfc_do_scr_ns_plogi(struct lpfc_hba *, struct lpfc_vport *);
128int lpfc_check_sparm(struct lpfc_vport *, struct lpfc_nodelist *, 128int lpfc_check_sparm(struct lpfc_vport *, struct lpfc_nodelist *,
129 struct serv_parm *, uint32_t, int); 129 struct serv_parm *, uint32_t, int);
130int lpfc_els_abort(struct lpfc_hba *, struct lpfc_nodelist *); 130void lpfc_els_abort(struct lpfc_hba *, struct lpfc_nodelist *);
131void lpfc_more_plogi(struct lpfc_vport *); 131void lpfc_more_plogi(struct lpfc_vport *);
132void lpfc_more_adisc(struct lpfc_vport *); 132void lpfc_more_adisc(struct lpfc_vport *);
133void lpfc_end_rscn(struct lpfc_vport *); 133void lpfc_end_rscn(struct lpfc_vport *);
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c
index f2cd19c6c2df..24ce96dcc94d 100644
--- a/drivers/scsi/lpfc/lpfc_ct.c
+++ b/drivers/scsi/lpfc/lpfc_ct.c
@@ -978,9 +978,10 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
978 ndlp, did, ndlp->nlp_fc4_type, 978 ndlp, did, ndlp->nlp_fc4_type,
979 FC_TYPE_FCP, FC_TYPE_NVME); 979 FC_TYPE_FCP, FC_TYPE_NVME);
980 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE; 980 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
981
982 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
983 lpfc_issue_els_prli(vport, ndlp, 0);
981 } 984 }
982 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
983 lpfc_issue_els_prli(vport, ndlp, 0);
984 } else 985 } else
985 lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY, 986 lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
986 "3065 GFT_ID failed x%08x\n", irsp->ulpStatus); 987 "3065 GFT_ID failed x%08x\n", irsp->ulpStatus);
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index bff3de053df4..f74cb0142fd4 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -206,7 +206,7 @@ lpfc_check_elscmpl_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
206 * associated with a LPFC_NODELIST entry. This 206 * associated with a LPFC_NODELIST entry. This
207 * routine effectively results in a "software abort". 207 * routine effectively results in a "software abort".
208 */ 208 */
209int 209void
210lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) 210lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
211{ 211{
212 LIST_HEAD(abort_list); 212 LIST_HEAD(abort_list);
@@ -215,6 +215,10 @@ lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
215 215
216 pring = lpfc_phba_elsring(phba); 216 pring = lpfc_phba_elsring(phba);
217 217
218 /* In case of error recovery path, we might have a NULL pring here */
219 if (!pring)
220 return;
221
218 /* Abort outstanding I/O on NPort <nlp_DID> */ 222 /* Abort outstanding I/O on NPort <nlp_DID> */
219 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_DISCOVERY, 223 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_DISCOVERY,
220 "2819 Abort outstanding I/O on NPort x%x " 224 "2819 Abort outstanding I/O on NPort x%x "
@@ -273,7 +277,6 @@ lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
273 IOSTAT_LOCAL_REJECT, IOERR_SLI_ABORTED); 277 IOSTAT_LOCAL_REJECT, IOERR_SLI_ABORTED);
274 278
275 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp); 279 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp);
276 return 0;
277} 280}
278 281
279static int 282static int
diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index 074a6b5e7763..518b15e6f222 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -799,8 +799,8 @@ lpfc_nvmet_xmt_fcp_release(struct nvmet_fc_target_port *tgtport,
799 } 799 }
800 spin_unlock_irqrestore(&ctxp->ctxlock, flags); 800 spin_unlock_irqrestore(&ctxp->ctxlock, flags);
801 801
802 lpfc_nvmeio_data(phba, "NVMET FCP FREE: xri x%x ste %d\n", ctxp->oxid, 802 lpfc_nvmeio_data(phba, "NVMET FCP FREE: xri x%x ste %d abt %d\n", ctxp->oxid,
803 ctxp->state, 0); 803 ctxp->state, aborting);
804 804
805 atomic_inc(&lpfc_nvmep->xmt_fcp_release); 805 atomic_inc(&lpfc_nvmep->xmt_fcp_release);
806 806
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 16d1cd50feed..ca3420de5a01 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -730,6 +730,8 @@ qla2x00_process_loopback(struct bsg_job *bsg_job)
730 return -EIO; 730 return -EIO;
731 } 731 }
732 732
733 memset(&elreq, 0, sizeof(elreq));
734
733 elreq.req_sg_cnt = dma_map_sg(&ha->pdev->dev, 735 elreq.req_sg_cnt = dma_map_sg(&ha->pdev->dev,
734 bsg_job->request_payload.sg_list, bsg_job->request_payload.sg_cnt, 736 bsg_job->request_payload.sg_list, bsg_job->request_payload.sg_cnt,
735 DMA_TO_DEVICE); 737 DMA_TO_DEVICE);
@@ -795,10 +797,9 @@ qla2x00_process_loopback(struct bsg_job *bsg_job)
795 797
796 if (atomic_read(&vha->loop_state) == LOOP_READY && 798 if (atomic_read(&vha->loop_state) == LOOP_READY &&
797 (ha->current_topology == ISP_CFG_F || 799 (ha->current_topology == ISP_CFG_F ||
798 ((IS_QLA81XX(ha) || IS_QLA8031(ha) || IS_QLA8044(ha)) && 800 (le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE &&
799 le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE 801 req_data_len == MAX_ELS_FRAME_PAYLOAD)) &&
800 && req_data_len == MAX_ELS_FRAME_PAYLOAD)) && 802 elreq.options == EXTERNAL_LOOPBACK) {
801 elreq.options == EXTERNAL_LOOPBACK) {
802 type = "FC_BSG_HST_VENDOR_ECHO_DIAG"; 803 type = "FC_BSG_HST_VENDOR_ECHO_DIAG";
803 ql_dbg(ql_dbg_user, vha, 0x701e, 804 ql_dbg(ql_dbg_user, vha, 0x701e,
804 "BSG request type: %s.\n", type); 805 "BSG request type: %s.\n", type);
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 51b4179469d1..88748a6ab73f 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -1131,7 +1131,7 @@ qla24xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
1131 1131
1132 /* Mailbox registers. */ 1132 /* Mailbox registers. */
1133 mbx_reg = &reg->mailbox0; 1133 mbx_reg = &reg->mailbox0;
1134 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++, dmp_reg++) 1134 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++, mbx_reg++)
1135 fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg)); 1135 fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg));
1136 1136
1137 /* Transfer sequence registers. */ 1137 /* Transfer sequence registers. */
@@ -2090,7 +2090,7 @@ qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
2090 2090
2091 /* Mailbox registers. */ 2091 /* Mailbox registers. */
2092 mbx_reg = &reg->mailbox0; 2092 mbx_reg = &reg->mailbox0;
2093 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++, dmp_reg++) 2093 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++, mbx_reg++)
2094 fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg)); 2094 fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg));
2095 2095
2096 /* Transfer sequence registers. */ 2096 /* Transfer sequence registers. */
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index ae119018dfaa..eddbc1218a39 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3425,6 +3425,7 @@ struct qla_hw_data {
3425 uint8_t max_req_queues; 3425 uint8_t max_req_queues;
3426 uint8_t max_rsp_queues; 3426 uint8_t max_rsp_queues;
3427 uint8_t max_qpairs; 3427 uint8_t max_qpairs;
3428 uint8_t num_qpairs;
3428 struct qla_qpair *base_qpair; 3429 struct qla_qpair *base_qpair;
3429 struct qla_npiv_entry *npiv_info; 3430 struct qla_npiv_entry *npiv_info;
3430 uint16_t nvram_npiv_size; 3431 uint16_t nvram_npiv_size;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 034743309ada..0391fc317003 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7543,12 +7543,13 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos, int v
7543 /* Assign available que pair id */ 7543 /* Assign available que pair id */
7544 mutex_lock(&ha->mq_lock); 7544 mutex_lock(&ha->mq_lock);
7545 qpair_id = find_first_zero_bit(ha->qpair_qid_map, ha->max_qpairs); 7545 qpair_id = find_first_zero_bit(ha->qpair_qid_map, ha->max_qpairs);
7546 if (qpair_id >= ha->max_qpairs) { 7546 if (ha->num_qpairs >= ha->max_qpairs) {
7547 mutex_unlock(&ha->mq_lock); 7547 mutex_unlock(&ha->mq_lock);
7548 ql_log(ql_log_warn, vha, 0x0183, 7548 ql_log(ql_log_warn, vha, 0x0183,
7549 "No resources to create additional q pair.\n"); 7549 "No resources to create additional q pair.\n");
7550 goto fail_qid_map; 7550 goto fail_qid_map;
7551 } 7551 }
7552 ha->num_qpairs++;
7552 set_bit(qpair_id, ha->qpair_qid_map); 7553 set_bit(qpair_id, ha->qpair_qid_map);
7553 ha->queue_pair_map[qpair_id] = qpair; 7554 ha->queue_pair_map[qpair_id] = qpair;
7554 qpair->id = qpair_id; 7555 qpair->id = qpair_id;
@@ -7635,6 +7636,7 @@ fail_rsp:
7635fail_msix: 7636fail_msix:
7636 ha->queue_pair_map[qpair_id] = NULL; 7637 ha->queue_pair_map[qpair_id] = NULL;
7637 clear_bit(qpair_id, ha->qpair_qid_map); 7638 clear_bit(qpair_id, ha->qpair_qid_map);
7639 ha->num_qpairs--;
7638 mutex_unlock(&ha->mq_lock); 7640 mutex_unlock(&ha->mq_lock);
7639fail_qid_map: 7641fail_qid_map:
7640 kfree(qpair); 7642 kfree(qpair);
@@ -7660,6 +7662,7 @@ int qla2xxx_delete_qpair(struct scsi_qla_host *vha, struct qla_qpair *qpair)
7660 mutex_lock(&ha->mq_lock); 7662 mutex_lock(&ha->mq_lock);
7661 ha->queue_pair_map[qpair->id] = NULL; 7663 ha->queue_pair_map[qpair->id] = NULL;
7662 clear_bit(qpair->id, ha->qpair_qid_map); 7664 clear_bit(qpair->id, ha->qpair_qid_map);
7665 ha->num_qpairs--;
7663 list_del(&qpair->qp_list_elem); 7666 list_del(&qpair->qp_list_elem);
7664 if (list_empty(&vha->qp_list)) 7667 if (list_empty(&vha->qp_list))
7665 vha->flags.qpairs_available = 0; 7668 vha->flags.qpairs_available = 0;
diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h
index 66df6cec59da..c61a6a871c8e 100644
--- a/drivers/scsi/qla2xxx/qla_inline.h
+++ b/drivers/scsi/qla2xxx/qla_inline.h
@@ -129,28 +129,16 @@ qla2x00_clear_loop_id(fc_port_t *fcport) {
129} 129}
130 130
131static inline void 131static inline void
132qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp, 132qla2x00_clean_dsd_pool(struct qla_hw_data *ha, struct crc_context *ctx)
133 struct qla_tgt_cmd *tc)
134{ 133{
135 struct dsd_dma *dsd_ptr, *tdsd_ptr; 134 struct dsd_dma *dsd, *tdsd;
136 struct crc_context *ctx;
137
138 if (sp)
139 ctx = (struct crc_context *)GET_CMD_CTX_SP(sp);
140 else if (tc)
141 ctx = (struct crc_context *)tc->ctx;
142 else {
143 BUG();
144 return;
145 }
146 135
147 /* clean up allocated prev pool */ 136 /* clean up allocated prev pool */
148 list_for_each_entry_safe(dsd_ptr, tdsd_ptr, 137 list_for_each_entry_safe(dsd, tdsd, &ctx->dsd_list, list) {
149 &ctx->dsd_list, list) { 138 dma_pool_free(ha->dl_dma_pool, dsd->dsd_addr,
150 dma_pool_free(ha->dl_dma_pool, dsd_ptr->dsd_addr, 139 dsd->dsd_list_dma);
151 dsd_ptr->dsd_list_dma); 140 list_del(&dsd->list);
152 list_del(&dsd_ptr->list); 141 kfree(dsd);
153 kfree(dsd_ptr);
154 } 142 }
155 INIT_LIST_HEAD(&ctx->dsd_list); 143 INIT_LIST_HEAD(&ctx->dsd_list);
156} 144}
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index aac03504d9a3..2572121b765b 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -3282,7 +3282,7 @@ msix_register_fail:
3282 } 3282 }
3283 3283
3284 /* Enable MSI-X vector for response queue update for queue 0 */ 3284 /* Enable MSI-X vector for response queue update for queue 0 */
3285 if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { 3285 if (IS_QLA25XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
3286 if (ha->msixbase && ha->mqiobase && 3286 if (ha->msixbase && ha->mqiobase &&
3287 (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 || 3287 (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 ||
3288 ql2xmqsupport)) 3288 ql2xmqsupport))
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index a113ab3592a7..cba1fc5e8be9 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -3676,15 +3676,6 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
3676 qlt_update_host_map(vha, id); 3676 qlt_update_host_map(vha, id);
3677 } 3677 }
3678 3678
3679 fc_host_port_name(vha->host) =
3680 wwn_to_u64(vha->port_name);
3681
3682 if (qla_ini_mode_enabled(vha))
3683 ql_dbg(ql_dbg_mbx, vha, 0x1018,
3684 "FA-WWN portname %016llx (%x)\n",
3685 fc_host_port_name(vha->host),
3686 rptid_entry->vp_status);
3687
3688 set_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags); 3679 set_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags);
3689 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); 3680 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
3690 } else { 3681 } else {
@@ -4821,9 +4812,9 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
4821 4812
4822 memset(mcp->mb, 0 , sizeof(mcp->mb)); 4813 memset(mcp->mb, 0 , sizeof(mcp->mb));
4823 mcp->mb[0] = MBC_DIAGNOSTIC_ECHO; 4814 mcp->mb[0] = MBC_DIAGNOSTIC_ECHO;
4824 mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */ 4815 /* BIT_6 specifies 64bit address */
4816 mcp->mb[1] = mreq->options | BIT_15 | BIT_6;
4825 if (IS_CNA_CAPABLE(ha)) { 4817 if (IS_CNA_CAPABLE(ha)) {
4826 mcp->mb[1] |= BIT_15;
4827 mcp->mb[2] = vha->fcoe_fcf_idx; 4818 mcp->mb[2] = vha->fcoe_fcf_idx;
4828 } 4819 }
4829 mcp->mb[16] = LSW(mreq->rcv_dma); 4820 mcp->mb[16] = LSW(mreq->rcv_dma);
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 1c7957903283..79f050256c55 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -630,29 +630,34 @@ qla2x00_sp_free_dma(void *ptr)
630 sp->flags &= ~SRB_CRC_PROT_DMA_VALID; 630 sp->flags &= ~SRB_CRC_PROT_DMA_VALID;
631 } 631 }
632 632
633 if (!ctx)
634 goto end;
635
633 if (sp->flags & SRB_CRC_CTX_DSD_VALID) { 636 if (sp->flags & SRB_CRC_CTX_DSD_VALID) {
634 /* List assured to be having elements */ 637 /* List assured to be having elements */
635 qla2x00_clean_dsd_pool(ha, sp, NULL); 638 qla2x00_clean_dsd_pool(ha, ctx);
636 sp->flags &= ~SRB_CRC_CTX_DSD_VALID; 639 sp->flags &= ~SRB_CRC_CTX_DSD_VALID;
637 } 640 }
638 641
639 if (sp->flags & SRB_CRC_CTX_DMA_VALID) { 642 if (sp->flags & SRB_CRC_CTX_DMA_VALID) {
640 dma_pool_free(ha->dl_dma_pool, ctx, 643 struct crc_context *ctx0 = ctx;
641 ((struct crc_context *)ctx)->crc_ctx_dma); 644
645 dma_pool_free(ha->dl_dma_pool, ctx0, ctx0->crc_ctx_dma);
642 sp->flags &= ~SRB_CRC_CTX_DMA_VALID; 646 sp->flags &= ~SRB_CRC_CTX_DMA_VALID;
643 } 647 }
644 648
645 if (sp->flags & SRB_FCP_CMND_DMA_VALID) { 649 if (sp->flags & SRB_FCP_CMND_DMA_VALID) {
646 struct ct6_dsd *ctx1 = (struct ct6_dsd *)ctx; 650 struct ct6_dsd *ctx1 = ctx;
647 651
648 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd, 652 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd,
649 ctx1->fcp_cmnd_dma); 653 ctx1->fcp_cmnd_dma);
650 list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list); 654 list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list);
651 ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt; 655 ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt;
652 ha->gbl_dsd_avail += ctx1->dsd_use_cnt; 656 ha->gbl_dsd_avail += ctx1->dsd_use_cnt;
653 mempool_free(ctx1, ha->ctx_mempool); 657 mempool_free(ctx1, ha->ctx_mempool);
654 } 658 }
655 659
660end:
656 CMD_SP(cmd) = NULL; 661 CMD_SP(cmd) = NULL;
657 qla2x00_rel_sp(sp); 662 qla2x00_rel_sp(sp);
658} 663}
@@ -699,21 +704,24 @@ qla2xxx_qpair_sp_free_dma(void *ptr)
699 sp->flags &= ~SRB_CRC_PROT_DMA_VALID; 704 sp->flags &= ~SRB_CRC_PROT_DMA_VALID;
700 } 705 }
701 706
707 if (!ctx)
708 goto end;
709
702 if (sp->flags & SRB_CRC_CTX_DSD_VALID) { 710 if (sp->flags & SRB_CRC_CTX_DSD_VALID) {
703 /* List assured to be having elements */ 711 /* List assured to be having elements */
704 qla2x00_clean_dsd_pool(ha, sp, NULL); 712 qla2x00_clean_dsd_pool(ha, ctx);
705 sp->flags &= ~SRB_CRC_CTX_DSD_VALID; 713 sp->flags &= ~SRB_CRC_CTX_DSD_VALID;
706 } 714 }
707 715
708 if (sp->flags & SRB_CRC_CTX_DMA_VALID) { 716 if (sp->flags & SRB_CRC_CTX_DMA_VALID) {
709 dma_pool_free(ha->dl_dma_pool, ctx, 717 struct crc_context *ctx0 = ctx;
710 ((struct crc_context *)ctx)->crc_ctx_dma); 718
719 dma_pool_free(ha->dl_dma_pool, ctx, ctx0->crc_ctx_dma);
711 sp->flags &= ~SRB_CRC_CTX_DMA_VALID; 720 sp->flags &= ~SRB_CRC_CTX_DMA_VALID;
712 } 721 }
713 722
714 if (sp->flags & SRB_FCP_CMND_DMA_VALID) { 723 if (sp->flags & SRB_FCP_CMND_DMA_VALID) {
715 struct ct6_dsd *ctx1 = (struct ct6_dsd *)ctx; 724 struct ct6_dsd *ctx1 = ctx;
716
717 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd, 725 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd,
718 ctx1->fcp_cmnd_dma); 726 ctx1->fcp_cmnd_dma);
719 list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list); 727 list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list);
@@ -721,7 +729,7 @@ qla2xxx_qpair_sp_free_dma(void *ptr)
721 ha->gbl_dsd_avail += ctx1->dsd_use_cnt; 729 ha->gbl_dsd_avail += ctx1->dsd_use_cnt;
722 mempool_free(ctx1, ha->ctx_mempool); 730 mempool_free(ctx1, ha->ctx_mempool);
723 } 731 }
724 732end:
725 CMD_SP(cmd) = NULL; 733 CMD_SP(cmd) = NULL;
726 qla2xxx_rel_qpair_sp(sp->qpair, sp); 734 qla2xxx_rel_qpair_sp(sp->qpair, sp);
727} 735}
@@ -1632,7 +1640,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
1632void 1640void
1633qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) 1641qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
1634{ 1642{
1635 int que, cnt; 1643 int que, cnt, status;
1636 unsigned long flags; 1644 unsigned long flags;
1637 srb_t *sp; 1645 srb_t *sp;
1638 struct qla_hw_data *ha = vha->hw; 1646 struct qla_hw_data *ha = vha->hw;
@@ -1662,8 +1670,12 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
1662 */ 1670 */
1663 sp_get(sp); 1671 sp_get(sp);
1664 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1672 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1665 qla2xxx_eh_abort(GET_CMD_SP(sp)); 1673 status = qla2xxx_eh_abort(GET_CMD_SP(sp));
1666 spin_lock_irqsave(&ha->hardware_lock, flags); 1674 spin_lock_irqsave(&ha->hardware_lock, flags);
1675 /* Get rid of extra reference if immediate exit
1676 * from ql2xxx_eh_abort */
1677 if (status == FAILED && (qla2x00_isp_reg_stat(ha)))
1678 atomic_dec(&sp->ref_count);
1667 } 1679 }
1668 req->outstanding_cmds[cnt] = NULL; 1680 req->outstanding_cmds[cnt] = NULL;
1669 sp->done(sp, res); 1681 sp->done(sp, res);
@@ -2623,10 +2635,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2623 2635
2624 if (mem_only) { 2636 if (mem_only) {
2625 if (pci_enable_device_mem(pdev)) 2637 if (pci_enable_device_mem(pdev))
2626 goto probe_out; 2638 return ret;
2627 } else { 2639 } else {
2628 if (pci_enable_device(pdev)) 2640 if (pci_enable_device(pdev))
2629 goto probe_out; 2641 return ret;
2630 } 2642 }
2631 2643
2632 /* This may fail but that's ok */ 2644 /* This may fail but that's ok */
@@ -2636,7 +2648,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2636 if (!ha) { 2648 if (!ha) {
2637 ql_log_pci(ql_log_fatal, pdev, 0x0009, 2649 ql_log_pci(ql_log_fatal, pdev, 0x0009,
2638 "Unable to allocate memory for ha.\n"); 2650 "Unable to allocate memory for ha.\n");
2639 goto probe_out; 2651 goto disable_device;
2640 } 2652 }
2641 ql_dbg_pci(ql_dbg_init, pdev, 0x000a, 2653 ql_dbg_pci(ql_dbg_init, pdev, 0x000a,
2642 "Memory allocated for ha=%p.\n", ha); 2654 "Memory allocated for ha=%p.\n", ha);
@@ -3254,7 +3266,7 @@ iospace_config_failed:
3254 pci_release_selected_regions(ha->pdev, ha->bars); 3266 pci_release_selected_regions(ha->pdev, ha->bars);
3255 kfree(ha); 3267 kfree(ha);
3256 3268
3257probe_out: 3269disable_device:
3258 pci_disable_device(pdev); 3270 pci_disable_device(pdev);
3259 return ret; 3271 return ret;
3260} 3272}
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 0e03ca2ab3e5..e766d8412384 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -2245,11 +2245,13 @@ static void qlt_unmap_sg(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd)
2245 pci_unmap_sg(ha->pdev, cmd->prot_sg, cmd->prot_sg_cnt, 2245 pci_unmap_sg(ha->pdev, cmd->prot_sg, cmd->prot_sg_cnt,
2246 cmd->dma_data_direction); 2246 cmd->dma_data_direction);
2247 2247
2248 if (!cmd->ctx)
2249 return;
2250
2248 if (cmd->ctx_dsd_alloced) 2251 if (cmd->ctx_dsd_alloced)
2249 qla2x00_clean_dsd_pool(ha, NULL, cmd); 2252 qla2x00_clean_dsd_pool(ha, cmd->ctx);
2250 2253
2251 if (cmd->ctx) 2254 dma_pool_free(ha->dl_dma_pool, cmd->ctx, cmd->ctx->crc_ctx_dma);
2252 dma_pool_free(ha->dl_dma_pool, cmd->ctx, cmd->ctx->crc_ctx_dma);
2253} 2255}
2254 2256
2255static int qlt_check_reserve_free_req(struct scsi_qla_host *vha, 2257static int qlt_check_reserve_free_req(struct scsi_qla_host *vha,
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 8a58ef3adab4..c197972a3e2d 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -371,7 +371,7 @@ qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
371 goto done; 371 goto done;
372 } 372 }
373 373
374 if (end <= start || start == 0 || end == 0) { 374 if (end < start || start == 0 || end == 0) {
375 ql_dbg(ql_dbg_misc, vha, 0xd023, 375 ql_dbg(ql_dbg_misc, vha, 0xd023,
376 "%s: unusable range (start=%x end=%x)\n", __func__, 376 "%s: unusable range (start=%x end=%x)\n", __func__,
377 ent->t262.end_addr, ent->t262.start_addr); 377 ent->t262.end_addr, ent->t262.start_addr);
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 17249c3650fe..dc095a292c61 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -1404,7 +1404,7 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1404 arr[4] = SDEBUG_LONG_INQ_SZ - 5; 1404 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1405 arr[5] = (int)have_dif_prot; /* PROTECT bit */ 1405 arr[5] = (int)have_dif_prot; /* PROTECT bit */
1406 if (sdebug_vpd_use_hostno == 0) 1406 if (sdebug_vpd_use_hostno == 0)
1407 arr[5] = 0x10; /* claim: implicit TGPS */ 1407 arr[5] |= 0x10; /* claim: implicit TPGS */
1408 arr[6] = 0x10; /* claim: MultiP */ 1408 arr[6] = 0x10; /* claim: MultiP */
1409 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ 1409 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1410 arr[7] = 0xa; /* claim: LINKED + CMDQUE */ 1410 arr[7] = 0xa; /* claim: LINKED + CMDQUE */