diff options
-rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc.h | 1 | ||||
-rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 10 | ||||
-rw-r--r-- | drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 1 | ||||
-rw-r--r-- | drivers/scsi/cxgbi/libcxgbi.c | 29 | ||||
-rw-r--r-- | drivers/scsi/cxgbi/libcxgbi.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_ct.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 7 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nvmet.c | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.c | 9 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 1 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_inline.h | 26 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 13 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 46 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 8 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_tmpl.c | 2 | ||||
-rw-r--r-- | drivers/scsi/scsi_debug.c | 2 |
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 | |||
699 | unlock_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 | ||
1601 | static int init_act_open(struct cxgbi_sock *csk) | 1600 | static 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 | } |
1189 | done: | 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); |
1194 | done: | ||
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 | ||
1571 | static int skb_read_pdu_bhs(struct iscsi_conn *conn, struct sk_buff *skb) | 1574 | static int |
1575 | skb_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 | ||
1614 | static int skb_read_pdu_data(struct iscsi_conn *conn, struct sk_buff *lskb, | 1629 | static 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 | ||
192 | struct cxgbi_skb_rx_cb { | 193 | struct 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 *, | |||
127 | void lpfc_do_scr_ns_plogi(struct lpfc_hba *, struct lpfc_vport *); | 127 | void lpfc_do_scr_ns_plogi(struct lpfc_hba *, struct lpfc_vport *); |
128 | int lpfc_check_sparm(struct lpfc_vport *, struct lpfc_nodelist *, | 128 | int lpfc_check_sparm(struct lpfc_vport *, struct lpfc_nodelist *, |
129 | struct serv_parm *, uint32_t, int); | 129 | struct serv_parm *, uint32_t, int); |
130 | int lpfc_els_abort(struct lpfc_hba *, struct lpfc_nodelist *); | 130 | void lpfc_els_abort(struct lpfc_hba *, struct lpfc_nodelist *); |
131 | void lpfc_more_plogi(struct lpfc_vport *); | 131 | void lpfc_more_plogi(struct lpfc_vport *); |
132 | void lpfc_more_adisc(struct lpfc_vport *); | 132 | void lpfc_more_adisc(struct lpfc_vport *); |
133 | void lpfc_end_rscn(struct lpfc_vport *); | 133 | void 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 | */ |
209 | int | 209 | void |
210 | lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | 210 | lpfc_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 | ||
279 | static int | 282 | static 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 = ®->mailbox0; | 1133 | mbx_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 = ®->mailbox0; | 2092 | mbx_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: | |||
7635 | fail_msix: | 7636 | fail_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); |
7639 | fail_qid_map: | 7641 | fail_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 | ||
131 | static inline void | 131 | static inline void |
132 | qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp, | 132 | qla2x00_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 | ||
660 | end: | ||
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 | 732 | end: | |
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) | |||
1632 | void | 1640 | void |
1633 | qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) | 1641 | qla2x00_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 | ||
3257 | probe_out: | 3269 | disable_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 | ||
2255 | static int qlt_check_reserve_free_req(struct scsi_qla_host *vha, | 2257 | static 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 */ |