diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/aic94xx/aic94xx_task.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/bnx2i/bnx2i.h | 1 | ||||
| -rw-r--r-- | drivers/scsi/bnx2i/bnx2i_hwi.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/bnx2i/bnx2i_iscsi.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_ata.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 46 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_target.h | 1 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.c | 152 | ||||
| -rw-r--r-- | drivers/scsi/scsi.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/scsi_wait_scan.c | 5 | ||||
| -rw-r--r-- | drivers/scsi/sd.c | 2 |
12 files changed, 99 insertions, 141 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c index 532d212b6b2c..393e7ce8e95a 100644 --- a/drivers/scsi/aic94xx/aic94xx_task.c +++ b/drivers/scsi/aic94xx/aic94xx_task.c | |||
| @@ -201,7 +201,7 @@ static void asd_get_response_tasklet(struct asd_ascb *ascb, | |||
| 201 | 201 | ||
| 202 | if (SAS_STATUS_BUF_SIZE >= sizeof(*resp)) { | 202 | if (SAS_STATUS_BUF_SIZE >= sizeof(*resp)) { |
| 203 | resp->frame_len = le16_to_cpu(*(__le16 *)(r+6)); | 203 | resp->frame_len = le16_to_cpu(*(__le16 *)(r+6)); |
| 204 | memcpy(&resp->ending_fis[0], r+16, 24); | 204 | memcpy(&resp->ending_fis[0], r+16, ATA_RESP_FIS_SIZE); |
| 205 | ts->buf_valid_size = sizeof(*resp); | 205 | ts->buf_valid_size = sizeof(*resp); |
| 206 | } | 206 | } |
| 207 | } | 207 | } |
diff --git a/drivers/scsi/bnx2i/bnx2i.h b/drivers/scsi/bnx2i/bnx2i.h index 0c53c28dc3d3..7e77cf620291 100644 --- a/drivers/scsi/bnx2i/bnx2i.h +++ b/drivers/scsi/bnx2i/bnx2i.h | |||
| @@ -350,6 +350,7 @@ struct bnx2i_hba { | |||
| 350 | struct pci_dev *pcidev; | 350 | struct pci_dev *pcidev; |
| 351 | struct net_device *netdev; | 351 | struct net_device *netdev; |
| 352 | void __iomem *regview; | 352 | void __iomem *regview; |
| 353 | resource_size_t reg_base; | ||
| 353 | 354 | ||
| 354 | u32 age; | 355 | u32 age; |
| 355 | unsigned long cnic_dev_type; | 356 | unsigned long cnic_dev_type; |
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index ece47e502282..86a12b48e477 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c | |||
| @@ -2724,7 +2724,6 @@ int bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep) | |||
| 2724 | goto arm_cq; | 2724 | goto arm_cq; |
| 2725 | } | 2725 | } |
| 2726 | 2726 | ||
| 2727 | reg_base = ep->hba->netdev->base_addr; | ||
| 2728 | if ((test_bit(BNX2I_NX2_DEV_5709, &ep->hba->cnic_dev_type)) && | 2727 | if ((test_bit(BNX2I_NX2_DEV_5709, &ep->hba->cnic_dev_type)) && |
| 2729 | (ep->hba->mail_queue_access == BNX2I_MQ_BIN_MODE)) { | 2728 | (ep->hba->mail_queue_access == BNX2I_MQ_BIN_MODE)) { |
| 2730 | config2 = REG_RD(ep->hba, BNX2_MQ_CONFIG2); | 2729 | config2 = REG_RD(ep->hba, BNX2_MQ_CONFIG2); |
| @@ -2740,7 +2739,7 @@ int bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep) | |||
| 2740 | /* 5709 device in normal node and 5706/5708 devices */ | 2739 | /* 5709 device in normal node and 5706/5708 devices */ |
| 2741 | reg_off = CTX_OFFSET + (MB_KERNEL_CTX_SIZE * cid_num); | 2740 | reg_off = CTX_OFFSET + (MB_KERNEL_CTX_SIZE * cid_num); |
| 2742 | 2741 | ||
| 2743 | ep->qp.ctx_base = ioremap_nocache(reg_base + reg_off, | 2742 | ep->qp.ctx_base = ioremap_nocache(ep->hba->reg_base + reg_off, |
| 2744 | MB_KERNEL_CTX_SIZE); | 2743 | MB_KERNEL_CTX_SIZE); |
| 2745 | if (!ep->qp.ctx_base) | 2744 | if (!ep->qp.ctx_base) |
| 2746 | return -ENOMEM; | 2745 | return -ENOMEM; |
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c index f8d516b53161..621538b8b544 100644 --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c | |||
| @@ -811,13 +811,13 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic) | |||
| 811 | bnx2i_identify_device(hba); | 811 | bnx2i_identify_device(hba); |
| 812 | bnx2i_setup_host_queue_size(hba, shost); | 812 | bnx2i_setup_host_queue_size(hba, shost); |
| 813 | 813 | ||
| 814 | hba->reg_base = pci_resource_start(hba->pcidev, 0); | ||
| 814 | if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) { | 815 | if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) { |
| 815 | hba->regview = ioremap_nocache(hba->netdev->base_addr, | 816 | hba->regview = pci_iomap(hba->pcidev, 0, BNX2_MQ_CONFIG2); |
| 816 | BNX2_MQ_CONFIG2); | ||
| 817 | if (!hba->regview) | 817 | if (!hba->regview) |
| 818 | goto ioreg_map_err; | 818 | goto ioreg_map_err; |
| 819 | } else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) { | 819 | } else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) { |
| 820 | hba->regview = ioremap_nocache(hba->netdev->base_addr, 4096); | 820 | hba->regview = pci_iomap(hba->pcidev, 0, 4096); |
| 821 | if (!hba->regview) | 821 | if (!hba->regview) |
| 822 | goto ioreg_map_err; | 822 | goto ioreg_map_err; |
| 823 | } | 823 | } |
| @@ -884,7 +884,7 @@ cid_que_err: | |||
| 884 | bnx2i_free_mp_bdt(hba); | 884 | bnx2i_free_mp_bdt(hba); |
| 885 | mp_bdt_mem_err: | 885 | mp_bdt_mem_err: |
| 886 | if (hba->regview) { | 886 | if (hba->regview) { |
| 887 | iounmap(hba->regview); | 887 | pci_iounmap(hba->pcidev, hba->regview); |
| 888 | hba->regview = NULL; | 888 | hba->regview = NULL; |
| 889 | } | 889 | } |
| 890 | ioreg_map_err: | 890 | ioreg_map_err: |
| @@ -910,7 +910,7 @@ void bnx2i_free_hba(struct bnx2i_hba *hba) | |||
| 910 | pci_dev_put(hba->pcidev); | 910 | pci_dev_put(hba->pcidev); |
| 911 | 911 | ||
| 912 | if (hba->regview) { | 912 | if (hba->regview) { |
| 913 | iounmap(hba->regview); | 913 | pci_iounmap(hba->pcidev, hba->regview); |
| 914 | hba->regview = NULL; | 914 | hba->regview = NULL; |
| 915 | } | 915 | } |
| 916 | bnx2i_free_mp_bdt(hba); | 916 | bnx2i_free_mp_bdt(hba); |
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index 441d88ad99a7..d109cc3a17b6 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c | |||
| @@ -139,12 +139,12 @@ static void sas_ata_task_done(struct sas_task *task) | |||
| 139 | if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD || | 139 | if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD || |
| 140 | ((stat->stat == SAM_STAT_CHECK_CONDITION && | 140 | ((stat->stat == SAM_STAT_CHECK_CONDITION && |
| 141 | dev->sata_dev.command_set == ATAPI_COMMAND_SET))) { | 141 | dev->sata_dev.command_set == ATAPI_COMMAND_SET))) { |
| 142 | ata_tf_from_fis(resp->ending_fis, &dev->sata_dev.tf); | 142 | memcpy(dev->sata_dev.fis, resp->ending_fis, ATA_RESP_FIS_SIZE); |
| 143 | 143 | ||
| 144 | if (!link->sactive) { | 144 | if (!link->sactive) { |
| 145 | qc->err_mask |= ac_err_mask(dev->sata_dev.tf.command); | 145 | qc->err_mask |= ac_err_mask(dev->sata_dev.fis[2]); |
| 146 | } else { | 146 | } else { |
| 147 | link->eh_info.err_mask |= ac_err_mask(dev->sata_dev.tf.command); | 147 | link->eh_info.err_mask |= ac_err_mask(dev->sata_dev.fis[2]); |
| 148 | if (unlikely(link->eh_info.err_mask)) | 148 | if (unlikely(link->eh_info.err_mask)) |
| 149 | qc->flags |= ATA_QCFLAG_FAILED; | 149 | qc->flags |= ATA_QCFLAG_FAILED; |
| 150 | } | 150 | } |
| @@ -161,8 +161,8 @@ static void sas_ata_task_done(struct sas_task *task) | |||
| 161 | qc->flags |= ATA_QCFLAG_FAILED; | 161 | qc->flags |= ATA_QCFLAG_FAILED; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | dev->sata_dev.tf.feature = 0x04; /* status err */ | 164 | dev->sata_dev.fis[3] = 0x04; /* status err */ |
| 165 | dev->sata_dev.tf.command = ATA_ERR; | 165 | dev->sata_dev.fis[2] = ATA_ERR; |
| 166 | } | 166 | } |
| 167 | } | 167 | } |
| 168 | 168 | ||
| @@ -269,7 +269,7 @@ static bool sas_ata_qc_fill_rtf(struct ata_queued_cmd *qc) | |||
| 269 | { | 269 | { |
| 270 | struct domain_device *dev = qc->ap->private_data; | 270 | struct domain_device *dev = qc->ap->private_data; |
| 271 | 271 | ||
| 272 | memcpy(&qc->result_tf, &dev->sata_dev.tf, sizeof(qc->result_tf)); | 272 | ata_tf_from_fis(dev->sata_dev.fis, &qc->result_tf); |
| 273 | return true; | 273 | return true; |
| 274 | } | 274 | } |
| 275 | 275 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 6102ef2cb2d8..9d46fcbe7755 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
| @@ -1792,7 +1792,7 @@ static inline void _base_writeq(__u64 b, volatile void __iomem *addr, | |||
| 1792 | static inline u8 | 1792 | static inline u8 |
| 1793 | _base_get_msix_index(struct MPT2SAS_ADAPTER *ioc) | 1793 | _base_get_msix_index(struct MPT2SAS_ADAPTER *ioc) |
| 1794 | { | 1794 | { |
| 1795 | return ioc->cpu_msix_table[smp_processor_id()]; | 1795 | return ioc->cpu_msix_table[raw_smp_processor_id()]; |
| 1796 | } | 1796 | } |
| 1797 | 1797 | ||
| 1798 | /** | 1798 | /** |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 04f80ebf09eb..77759c78cc21 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | #include <linux/version.h> | ||
| 30 | #include <linux/blkdev.h> | 29 | #include <linux/blkdev.h> |
| 31 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
| 32 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
| @@ -2477,11 +2476,9 @@ static void qlt_do_ctio_completion(struct scsi_qla_host *vha, uint32_t handle, | |||
| 2477 | } | 2476 | } |
| 2478 | 2477 | ||
| 2479 | cmd = qlt_ctio_to_cmd(vha, handle, ctio); | 2478 | cmd = qlt_ctio_to_cmd(vha, handle, ctio); |
| 2480 | if (cmd == NULL) { | 2479 | if (cmd == NULL) |
| 2481 | if (status != CTIO_SUCCESS) | ||
| 2482 | qlt_term_ctio_exchange(vha, ctio, NULL, status); | ||
| 2483 | return; | 2480 | return; |
| 2484 | } | 2481 | |
| 2485 | se_cmd = &cmd->se_cmd; | 2482 | se_cmd = &cmd->se_cmd; |
| 2486 | tfo = se_cmd->se_tfo; | 2483 | tfo = se_cmd->se_tfo; |
| 2487 | 2484 | ||
| @@ -2727,10 +2724,12 @@ static void qlt_do_work(struct work_struct *work) | |||
| 2727 | out_term: | 2724 | out_term: |
| 2728 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf020, "Terminating work cmd %p", cmd); | 2725 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf020, "Terminating work cmd %p", cmd); |
| 2729 | /* | 2726 | /* |
| 2730 | * cmd has not sent to target yet, so pass NULL as the second argument | 2727 | * cmd has not sent to target yet, so pass NULL as the second |
| 2728 | * argument to qlt_send_term_exchange() and free the memory here. | ||
| 2731 | */ | 2729 | */ |
| 2732 | spin_lock_irqsave(&ha->hardware_lock, flags); | 2730 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 2733 | qlt_send_term_exchange(vha, NULL, &cmd->atio, 1); | 2731 | qlt_send_term_exchange(vha, NULL, &cmd->atio, 1); |
| 2732 | kmem_cache_free(qla_tgt_cmd_cachep, cmd); | ||
| 2734 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 2733 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 2735 | if (sess) | 2734 | if (sess) |
| 2736 | ha->tgt.tgt_ops->put_sess(sess); | 2735 | ha->tgt.tgt_ops->put_sess(sess); |
| @@ -3961,7 +3960,7 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, | |||
| 3961 | { | 3960 | { |
| 3962 | struct qla_hw_data *ha = vha->hw; | 3961 | struct qla_hw_data *ha = vha->hw; |
| 3963 | struct qla_tgt *tgt = ha->tgt.qla_tgt; | 3962 | struct qla_tgt *tgt = ha->tgt.qla_tgt; |
| 3964 | int reason_code; | 3963 | int login_code; |
| 3965 | 3964 | ||
| 3966 | ql_dbg(ql_dbg_tgt, vha, 0xe039, | 3965 | ql_dbg(ql_dbg_tgt, vha, 0xe039, |
| 3967 | "scsi(%ld): ha state %d init_done %d oper_mode %d topo %d\n", | 3966 | "scsi(%ld): ha state %d init_done %d oper_mode %d topo %d\n", |
| @@ -4004,9 +4003,9 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, | |||
| 4004 | { | 4003 | { |
| 4005 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03b, | 4004 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03b, |
| 4006 | "qla_target(%d): Async LOOP_UP occured " | 4005 | "qla_target(%d): Async LOOP_UP occured " |
| 4007 | "(m[1]=%x, m[2]=%x, m[3]=%x, m[4]=%x)", vha->vp_idx, | 4006 | "(m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, |
| 4008 | le16_to_cpu(mailbox[1]), le16_to_cpu(mailbox[2]), | 4007 | le16_to_cpu(mailbox[0]), le16_to_cpu(mailbox[1]), |
| 4009 | le16_to_cpu(mailbox[3]), le16_to_cpu(mailbox[4])); | 4008 | le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); |
| 4010 | if (tgt->link_reinit_iocb_pending) { | 4009 | if (tgt->link_reinit_iocb_pending) { |
| 4011 | qlt_send_notify_ack(vha, (void *)&tgt->link_reinit_iocb, | 4010 | qlt_send_notify_ack(vha, (void *)&tgt->link_reinit_iocb, |
| 4012 | 0, 0, 0, 0, 0, 0); | 4011 | 0, 0, 0, 0, 0, 0); |
| @@ -4021,23 +4020,24 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, | |||
| 4021 | case MBA_RSCN_UPDATE: | 4020 | case MBA_RSCN_UPDATE: |
| 4022 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03c, | 4021 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03c, |
| 4023 | "qla_target(%d): Async event %#x occured " | 4022 | "qla_target(%d): Async event %#x occured " |
| 4024 | "(m[1]=%x, m[2]=%x, m[3]=%x, m[4]=%x)", vha->vp_idx, code, | 4023 | "(m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, code, |
| 4025 | le16_to_cpu(mailbox[1]), le16_to_cpu(mailbox[2]), | 4024 | le16_to_cpu(mailbox[0]), le16_to_cpu(mailbox[1]), |
| 4026 | le16_to_cpu(mailbox[3]), le16_to_cpu(mailbox[4])); | 4025 | le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); |
| 4027 | break; | 4026 | break; |
| 4028 | 4027 | ||
| 4029 | case MBA_PORT_UPDATE: | 4028 | case MBA_PORT_UPDATE: |
| 4030 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03d, | 4029 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03d, |
| 4031 | "qla_target(%d): Port update async event %#x " | 4030 | "qla_target(%d): Port update async event %#x " |
| 4032 | "occured: updating the ports database (m[1]=%x, m[2]=%x, " | 4031 | "occured: updating the ports database (m[0]=%x, m[1]=%x, " |
| 4033 | "m[3]=%x, m[4]=%x)", vha->vp_idx, code, | 4032 | "m[2]=%x, m[3]=%x)", vha->vp_idx, code, |
| 4034 | le16_to_cpu(mailbox[1]), le16_to_cpu(mailbox[2]), | 4033 | le16_to_cpu(mailbox[0]), le16_to_cpu(mailbox[1]), |
| 4035 | le16_to_cpu(mailbox[3]), le16_to_cpu(mailbox[4])); | 4034 | le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); |
| 4036 | reason_code = le16_to_cpu(mailbox[2]); | 4035 | |
| 4037 | if (reason_code == 0x4) | 4036 | login_code = le16_to_cpu(mailbox[2]); |
| 4037 | if (login_code == 0x4) | ||
| 4038 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03e, | 4038 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03e, |
| 4039 | "Async MB 2: Got PLOGI Complete\n"); | 4039 | "Async MB 2: Got PLOGI Complete\n"); |
| 4040 | else if (reason_code == 0x7) | 4040 | else if (login_code == 0x7) |
| 4041 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03f, | 4041 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03f, |
| 4042 | "Async MB 2: Port Logged Out\n"); | 4042 | "Async MB 2: Port Logged Out\n"); |
| 4043 | break; | 4043 | break; |
| @@ -4045,9 +4045,9 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, | |||
| 4045 | default: | 4045 | default: |
| 4046 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf040, | 4046 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf040, |
| 4047 | "qla_target(%d): Async event %#x occured: " | 4047 | "qla_target(%d): Async event %#x occured: " |
| 4048 | "ignore (m[1]=%x, m[2]=%x, m[3]=%x, m[4]=%x)", vha->vp_idx, | 4048 | "ignore (m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, |
| 4049 | code, le16_to_cpu(mailbox[1]), le16_to_cpu(mailbox[2]), | 4049 | code, le16_to_cpu(mailbox[0]), le16_to_cpu(mailbox[1]), |
| 4050 | le16_to_cpu(mailbox[3]), le16_to_cpu(mailbox[4])); | 4050 | le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); |
| 4051 | break; | 4051 | break; |
| 4052 | } | 4052 | } |
| 4053 | 4053 | ||
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 9ec19bc2f0fe..9f9ef1644fd9 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h | |||
| @@ -919,7 +919,6 @@ struct qla_tgt_srr_ctio { | |||
| 919 | #define QLA_TGT_XMIT_STATUS 2 | 919 | #define QLA_TGT_XMIT_STATUS 2 |
| 920 | #define QLA_TGT_XMIT_ALL (QLA_TGT_XMIT_STATUS|QLA_TGT_XMIT_DATA) | 920 | #define QLA_TGT_XMIT_ALL (QLA_TGT_XMIT_STATUS|QLA_TGT_XMIT_DATA) |
| 921 | 921 | ||
| 922 | #include <linux/version.h> | ||
| 923 | 922 | ||
| 924 | extern struct qla_tgt_data qla_target; | 923 | extern struct qla_tgt_data qla_target; |
| 925 | /* | 924 | /* |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index 436598f57404..6e64314dbbb3 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -137,13 +137,15 @@ static char *tcm_qla2xxx_get_fabric_name(void) | |||
| 137 | */ | 137 | */ |
| 138 | static int tcm_qla2xxx_npiv_extract_wwn(const char *ns, u64 *nm) | 138 | static int tcm_qla2xxx_npiv_extract_wwn(const char *ns, u64 *nm) |
| 139 | { | 139 | { |
| 140 | unsigned int i, j, value; | 140 | unsigned int i, j; |
| 141 | u8 wwn[8]; | 141 | u8 wwn[8]; |
| 142 | 142 | ||
| 143 | memset(wwn, 0, sizeof(wwn)); | 143 | memset(wwn, 0, sizeof(wwn)); |
| 144 | 144 | ||
| 145 | /* Validate and store the new name */ | 145 | /* Validate and store the new name */ |
| 146 | for (i = 0, j = 0; i < 16; i++) { | 146 | for (i = 0, j = 0; i < 16; i++) { |
| 147 | int value; | ||
| 148 | |||
| 147 | value = hex_to_bin(*ns++); | 149 | value = hex_to_bin(*ns++); |
| 148 | if (value >= 0) | 150 | if (value >= 0) |
| 149 | j = (j << 4) | value; | 151 | j = (j << 4) | value; |
| @@ -652,8 +654,8 @@ static int tcm_qla2xxx_handle_data(struct qla_tgt_cmd *cmd) | |||
| 652 | /* | 654 | /* |
| 653 | * Called from qla_target.c:qlt_issue_task_mgmt() | 655 | * Called from qla_target.c:qlt_issue_task_mgmt() |
| 654 | */ | 656 | */ |
| 655 | int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, uint32_t lun, | 657 | static int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, uint32_t lun, |
| 656 | uint8_t tmr_func, uint32_t tag) | 658 | uint8_t tmr_func, uint32_t tag) |
| 657 | { | 659 | { |
| 658 | struct qla_tgt_sess *sess = mcmd->sess; | 660 | struct qla_tgt_sess *sess = mcmd->sess; |
| 659 | struct se_cmd *se_cmd = &mcmd->se_cmd; | 661 | struct se_cmd *se_cmd = &mcmd->se_cmd; |
| @@ -762,65 +764,8 @@ static u16 tcm_qla2xxx_set_fabric_sense_len(struct se_cmd *se_cmd, | |||
| 762 | struct target_fabric_configfs *tcm_qla2xxx_fabric_configfs; | 764 | struct target_fabric_configfs *tcm_qla2xxx_fabric_configfs; |
| 763 | struct target_fabric_configfs *tcm_qla2xxx_npiv_fabric_configfs; | 765 | struct target_fabric_configfs *tcm_qla2xxx_npiv_fabric_configfs; |
| 764 | 766 | ||
| 765 | static int tcm_qla2xxx_setup_nacl_from_rport( | 767 | static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *, |
| 766 | struct se_portal_group *se_tpg, | 768 | struct tcm_qla2xxx_nacl *, struct qla_tgt_sess *); |
| 767 | struct se_node_acl *se_nacl, | ||
| 768 | struct tcm_qla2xxx_lport *lport, | ||
| 769 | struct tcm_qla2xxx_nacl *nacl, | ||
| 770 | u64 rport_wwnn) | ||
| 771 | { | ||
| 772 | struct scsi_qla_host *vha = lport->qla_vha; | ||
| 773 | struct Scsi_Host *sh = vha->host; | ||
| 774 | struct fc_host_attrs *fc_host = shost_to_fc_host(sh); | ||
| 775 | struct fc_rport *rport; | ||
| 776 | unsigned long flags; | ||
| 777 | void *node; | ||
| 778 | int rc; | ||
| 779 | |||
| 780 | /* | ||
| 781 | * Scan the existing rports, and create a session for the | ||
| 782 | * explict NodeACL is an matching rport->node_name already | ||
| 783 | * exists. | ||
| 784 | */ | ||
| 785 | spin_lock_irqsave(sh->host_lock, flags); | ||
| 786 | list_for_each_entry(rport, &fc_host->rports, peers) { | ||
| 787 | if (rport_wwnn != rport->node_name) | ||
| 788 | continue; | ||
| 789 | |||
| 790 | pr_debug("Located existing rport_wwpn and rport->node_name: 0x%016LX, port_id: 0x%04x\n", | ||
| 791 | rport->node_name, rport->port_id); | ||
| 792 | nacl->nport_id = rport->port_id; | ||
| 793 | |||
| 794 | spin_unlock_irqrestore(sh->host_lock, flags); | ||
| 795 | |||
| 796 | spin_lock_irqsave(&vha->hw->hardware_lock, flags); | ||
| 797 | node = btree_lookup32(&lport->lport_fcport_map, rport->port_id); | ||
| 798 | if (node) { | ||
| 799 | rc = btree_update32(&lport->lport_fcport_map, | ||
| 800 | rport->port_id, se_nacl); | ||
| 801 | } else { | ||
| 802 | rc = btree_insert32(&lport->lport_fcport_map, | ||
| 803 | rport->port_id, se_nacl, | ||
| 804 | GFP_ATOMIC); | ||
| 805 | } | ||
| 806 | spin_unlock_irqrestore(&vha->hw->hardware_lock, flags); | ||
| 807 | |||
| 808 | if (rc) { | ||
| 809 | pr_err("Unable to insert se_nacl into fcport_map"); | ||
| 810 | WARN_ON(rc > 0); | ||
| 811 | return rc; | ||
| 812 | } | ||
| 813 | |||
| 814 | pr_debug("Inserted into fcport_map: %p for WWNN: 0x%016LX, port_id: 0x%08x\n", | ||
| 815 | se_nacl, rport_wwnn, nacl->nport_id); | ||
| 816 | |||
| 817 | return 1; | ||
| 818 | } | ||
| 819 | spin_unlock_irqrestore(sh->host_lock, flags); | ||
| 820 | |||
| 821 | return 0; | ||
| 822 | } | ||
| 823 | |||
| 824 | /* | 769 | /* |
| 825 | * Expected to be called with struct qla_hw_data->hardware_lock held | 770 | * Expected to be called with struct qla_hw_data->hardware_lock held |
| 826 | */ | 771 | */ |
| @@ -842,11 +787,40 @@ static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct qla_tgt_sess *sess) | |||
| 842 | 787 | ||
| 843 | pr_debug("Removed from fcport_map: %p for WWNN: 0x%016LX, port_id: 0x%06x\n", | 788 | pr_debug("Removed from fcport_map: %p for WWNN: 0x%016LX, port_id: 0x%06x\n", |
| 844 | se_nacl, nacl->nport_wwnn, nacl->nport_id); | 789 | se_nacl, nacl->nport_wwnn, nacl->nport_id); |
| 790 | /* | ||
| 791 | * Now clear the se_nacl and session pointers from our HW lport lookup | ||
| 792 | * table mapping for this initiator's fabric S_ID and LOOP_ID entries. | ||
| 793 | * | ||
| 794 | * This is done ahead of callbacks into tcm_qla2xxx_free_session() -> | ||
| 795 | * target_wait_for_sess_cmds() before the session waits for outstanding | ||
| 796 | * I/O to complete, to avoid a race between session shutdown execution | ||
| 797 | * and incoming ATIOs or TMRs picking up a stale se_node_act reference. | ||
| 798 | */ | ||
| 799 | tcm_qla2xxx_clear_sess_lookup(lport, nacl, sess); | ||
| 800 | } | ||
| 801 | |||
| 802 | static void tcm_qla2xxx_release_session(struct kref *kref) | ||
| 803 | { | ||
| 804 | struct se_session *se_sess = container_of(kref, | ||
| 805 | struct se_session, sess_kref); | ||
| 806 | |||
| 807 | qlt_unreg_sess(se_sess->fabric_sess_ptr); | ||
| 808 | } | ||
| 809 | |||
| 810 | static void tcm_qla2xxx_put_session(struct se_session *se_sess) | ||
| 811 | { | ||
| 812 | struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr; | ||
| 813 | struct qla_hw_data *ha = sess->vha->hw; | ||
| 814 | unsigned long flags; | ||
| 815 | |||
| 816 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
| 817 | kref_put(&se_sess->sess_kref, tcm_qla2xxx_release_session); | ||
| 818 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 845 | } | 819 | } |
| 846 | 820 | ||
| 847 | static void tcm_qla2xxx_put_sess(struct qla_tgt_sess *sess) | 821 | static void tcm_qla2xxx_put_sess(struct qla_tgt_sess *sess) |
| 848 | { | 822 | { |
| 849 | target_put_session(sess->se_sess); | 823 | tcm_qla2xxx_put_session(sess->se_sess); |
| 850 | } | 824 | } |
| 851 | 825 | ||
| 852 | static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess) | 826 | static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess) |
| @@ -859,14 +833,10 @@ static struct se_node_acl *tcm_qla2xxx_make_nodeacl( | |||
| 859 | struct config_group *group, | 833 | struct config_group *group, |
| 860 | const char *name) | 834 | const char *name) |
| 861 | { | 835 | { |
| 862 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; | ||
| 863 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, | ||
| 864 | struct tcm_qla2xxx_lport, lport_wwn); | ||
| 865 | struct se_node_acl *se_nacl, *se_nacl_new; | 836 | struct se_node_acl *se_nacl, *se_nacl_new; |
| 866 | struct tcm_qla2xxx_nacl *nacl; | 837 | struct tcm_qla2xxx_nacl *nacl; |
| 867 | u64 wwnn; | 838 | u64 wwnn; |
| 868 | u32 qla2xxx_nexus_depth; | 839 | u32 qla2xxx_nexus_depth; |
| 869 | int rc; | ||
| 870 | 840 | ||
| 871 | if (tcm_qla2xxx_parse_wwn(name, &wwnn, 1) < 0) | 841 | if (tcm_qla2xxx_parse_wwn(name, &wwnn, 1) < 0) |
| 872 | return ERR_PTR(-EINVAL); | 842 | return ERR_PTR(-EINVAL); |
| @@ -893,16 +863,6 @@ static struct se_node_acl *tcm_qla2xxx_make_nodeacl( | |||
| 893 | nacl = container_of(se_nacl, struct tcm_qla2xxx_nacl, se_node_acl); | 863 | nacl = container_of(se_nacl, struct tcm_qla2xxx_nacl, se_node_acl); |
| 894 | nacl->nport_wwnn = wwnn; | 864 | nacl->nport_wwnn = wwnn; |
| 895 | tcm_qla2xxx_format_wwn(&nacl->nport_name[0], TCM_QLA2XXX_NAMELEN, wwnn); | 865 | tcm_qla2xxx_format_wwn(&nacl->nport_name[0], TCM_QLA2XXX_NAMELEN, wwnn); |
| 896 | /* | ||
| 897 | * Setup a se_nacl handle based on an a matching struct fc_rport setup | ||
| 898 | * via drivers/scsi/qla2xxx/qla_init.c:qla2x00_reg_remote_port() | ||
| 899 | */ | ||
| 900 | rc = tcm_qla2xxx_setup_nacl_from_rport(se_tpg, se_nacl, lport, | ||
| 901 | nacl, wwnn); | ||
| 902 | if (rc < 0) { | ||
| 903 | tcm_qla2xxx_release_fabric_acl(se_tpg, se_nacl_new); | ||
| 904 | return ERR_PTR(rc); | ||
| 905 | } | ||
| 906 | 866 | ||
| 907 | return se_nacl; | 867 | return se_nacl; |
| 908 | } | 868 | } |
| @@ -1390,6 +1350,25 @@ static void tcm_qla2xxx_set_sess_by_loop_id( | |||
| 1390 | nacl->qla_tgt_sess, new_se_nacl, new_se_nacl->initiatorname); | 1350 | nacl->qla_tgt_sess, new_se_nacl, new_se_nacl->initiatorname); |
| 1391 | } | 1351 | } |
| 1392 | 1352 | ||
| 1353 | /* | ||
| 1354 | * Should always be called with qla_hw_data->hardware_lock held. | ||
| 1355 | */ | ||
| 1356 | static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *lport, | ||
| 1357 | struct tcm_qla2xxx_nacl *nacl, struct qla_tgt_sess *sess) | ||
| 1358 | { | ||
| 1359 | struct se_session *se_sess = sess->se_sess; | ||
| 1360 | unsigned char be_sid[3]; | ||
| 1361 | |||
| 1362 | be_sid[0] = sess->s_id.b.domain; | ||
| 1363 | be_sid[1] = sess->s_id.b.area; | ||
| 1364 | be_sid[2] = sess->s_id.b.al_pa; | ||
| 1365 | |||
| 1366 | tcm_qla2xxx_set_sess_by_s_id(lport, NULL, nacl, se_sess, | ||
| 1367 | sess, be_sid); | ||
| 1368 | tcm_qla2xxx_set_sess_by_loop_id(lport, NULL, nacl, se_sess, | ||
| 1369 | sess, sess->loop_id); | ||
| 1370 | } | ||
| 1371 | |||
| 1393 | static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess) | 1372 | static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess) |
| 1394 | { | 1373 | { |
| 1395 | struct qla_tgt *tgt = sess->tgt; | 1374 | struct qla_tgt *tgt = sess->tgt; |
| @@ -1398,8 +1377,6 @@ static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess) | |||
| 1398 | struct se_node_acl *se_nacl; | 1377 | struct se_node_acl *se_nacl; |
| 1399 | struct tcm_qla2xxx_lport *lport; | 1378 | struct tcm_qla2xxx_lport *lport; |
| 1400 | struct tcm_qla2xxx_nacl *nacl; | 1379 | struct tcm_qla2xxx_nacl *nacl; |
| 1401 | unsigned char be_sid[3]; | ||
| 1402 | unsigned long flags; | ||
| 1403 | 1380 | ||
| 1404 | BUG_ON(in_interrupt()); | 1381 | BUG_ON(in_interrupt()); |
| 1405 | 1382 | ||
| @@ -1419,21 +1396,6 @@ static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess) | |||
| 1419 | return; | 1396 | return; |
| 1420 | } | 1397 | } |
| 1421 | target_wait_for_sess_cmds(se_sess, 0); | 1398 | target_wait_for_sess_cmds(se_sess, 0); |
| 1422 | /* | ||
| 1423 | * And now clear the se_nacl and session pointers from our HW lport | ||
| 1424 | * mappings for fabric S_ID and LOOP_ID. | ||
| 1425 | */ | ||
| 1426 | memset(&be_sid, 0, 3); | ||
| 1427 | be_sid[0] = sess->s_id.b.domain; | ||
| 1428 | be_sid[1] = sess->s_id.b.area; | ||
| 1429 | be_sid[2] = sess->s_id.b.al_pa; | ||
| 1430 | |||
| 1431 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
| 1432 | tcm_qla2xxx_set_sess_by_s_id(lport, NULL, nacl, se_sess, | ||
| 1433 | sess, be_sid); | ||
| 1434 | tcm_qla2xxx_set_sess_by_loop_id(lport, NULL, nacl, se_sess, | ||
| 1435 | sess, sess->loop_id); | ||
| 1436 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 1437 | 1399 | ||
| 1438 | transport_deregister_session_configfs(sess->se_sess); | 1400 | transport_deregister_session_configfs(sess->se_sess); |
| 1439 | transport_deregister_session(sess->se_sess); | 1401 | transport_deregister_session(sess->se_sess); |
| @@ -1731,6 +1693,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_ops = { | |||
| 1731 | .new_cmd_map = NULL, | 1693 | .new_cmd_map = NULL, |
| 1732 | .check_stop_free = tcm_qla2xxx_check_stop_free, | 1694 | .check_stop_free = tcm_qla2xxx_check_stop_free, |
| 1733 | .release_cmd = tcm_qla2xxx_release_cmd, | 1695 | .release_cmd = tcm_qla2xxx_release_cmd, |
| 1696 | .put_session = tcm_qla2xxx_put_session, | ||
| 1734 | .shutdown_session = tcm_qla2xxx_shutdown_session, | 1697 | .shutdown_session = tcm_qla2xxx_shutdown_session, |
| 1735 | .close_session = tcm_qla2xxx_close_session, | 1698 | .close_session = tcm_qla2xxx_close_session, |
| 1736 | .sess_get_index = tcm_qla2xxx_sess_get_index, | 1699 | .sess_get_index = tcm_qla2xxx_sess_get_index, |
| @@ -1779,6 +1742,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { | |||
| 1779 | .tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl, | 1742 | .tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl, |
| 1780 | .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index, | 1743 | .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index, |
| 1781 | .release_cmd = tcm_qla2xxx_release_cmd, | 1744 | .release_cmd = tcm_qla2xxx_release_cmd, |
| 1745 | .put_session = tcm_qla2xxx_put_session, | ||
| 1782 | .shutdown_session = tcm_qla2xxx_shutdown_session, | 1746 | .shutdown_session = tcm_qla2xxx_shutdown_session, |
| 1783 | .close_session = tcm_qla2xxx_close_session, | 1747 | .close_session = tcm_qla2xxx_close_session, |
| 1784 | .sess_get_index = tcm_qla2xxx_sess_get_index, | 1748 | .sess_get_index = tcm_qla2xxx_sess_get_index, |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 61c82a345f82..bbbc9c918d4c 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
| @@ -90,11 +90,9 @@ unsigned int scsi_logging_level; | |||
| 90 | EXPORT_SYMBOL(scsi_logging_level); | 90 | EXPORT_SYMBOL(scsi_logging_level); |
| 91 | #endif | 91 | #endif |
| 92 | 92 | ||
| 93 | #if IS_ENABLED(CONFIG_PM) || IS_ENABLED(CONFIG_BLK_DEV_SD) | 93 | /* sd, scsi core and power management need to coordinate flushing async actions */ |
| 94 | /* sd and scsi_pm need to coordinate flushing async actions */ | ||
| 95 | LIST_HEAD(scsi_sd_probe_domain); | 94 | LIST_HEAD(scsi_sd_probe_domain); |
| 96 | EXPORT_SYMBOL(scsi_sd_probe_domain); | 95 | EXPORT_SYMBOL(scsi_sd_probe_domain); |
| 97 | #endif | ||
| 98 | 96 | ||
| 99 | /* NB: These are exposed through /proc/scsi/scsi and form part of the ABI. | 97 | /* NB: These are exposed through /proc/scsi/scsi and form part of the ABI. |
| 100 | * You may not alter any existing entry (although adding new ones is | 98 | * You may not alter any existing entry (although adding new ones is |
diff --git a/drivers/scsi/scsi_wait_scan.c b/drivers/scsi/scsi_wait_scan.c index ae7814874618..072734538876 100644 --- a/drivers/scsi/scsi_wait_scan.c +++ b/drivers/scsi/scsi_wait_scan.c | |||
| @@ -22,11 +22,6 @@ static int __init wait_scan_init(void) | |||
| 22 | * and might not yet have reached the scsi async scanning | 22 | * and might not yet have reached the scsi async scanning |
| 23 | */ | 23 | */ |
| 24 | wait_for_device_probe(); | 24 | wait_for_device_probe(); |
| 25 | /* | ||
| 26 | * and then we wait for the actual asynchronous scsi scan | ||
| 27 | * to finish. | ||
| 28 | */ | ||
| 29 | scsi_complete_async_scans(); | ||
| 30 | return 0; | 25 | return 0; |
| 31 | } | 26 | } |
| 32 | 27 | ||
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 6f0a4c612b3b..6f72b80121a0 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -1899,6 +1899,8 @@ static int sd_try_rc16_first(struct scsi_device *sdp) | |||
| 1899 | { | 1899 | { |
| 1900 | if (sdp->host->max_cmd_len < 16) | 1900 | if (sdp->host->max_cmd_len < 16) |
| 1901 | return 0; | 1901 | return 0; |
| 1902 | if (sdp->try_rc_10_first) | ||
| 1903 | return 0; | ||
| 1902 | if (sdp->scsi_level > SCSI_SPC_2) | 1904 | if (sdp->scsi_level > SCSI_SPC_2) |
| 1903 | return 1; | 1905 | return 1; |
| 1904 | if (scsi_device_protection(sdp)) | 1906 | if (scsi_device_protection(sdp)) |
