diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/scsi/fcoe/fcoe_ctlr.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_rport.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_base.c | 16 | ||||
| -rw-r--r-- | drivers/scsi/qedi/qedi_main.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 53 | ||||
| -rw-r--r-- | drivers/scsi/sr.c | 29 | ||||
| -rw-r--r-- | drivers/scsi/vmw_pvscsi.c | 11 |
7 files changed, 69 insertions, 49 deletions
diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c index ea23c8dffc25..ffec695e0bfb 100644 --- a/drivers/scsi/fcoe/fcoe_ctlr.c +++ b/drivers/scsi/fcoe/fcoe_ctlr.c | |||
| @@ -754,9 +754,9 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, | |||
| 754 | case ELS_LOGO: | 754 | case ELS_LOGO: |
| 755 | if (fip->mode == FIP_MODE_VN2VN) { | 755 | if (fip->mode == FIP_MODE_VN2VN) { |
| 756 | if (fip->state != FIP_ST_VNMP_UP) | 756 | if (fip->state != FIP_ST_VNMP_UP) |
| 757 | return -EINVAL; | 757 | goto drop; |
| 758 | if (ntoh24(fh->fh_d_id) == FC_FID_FLOGI) | 758 | if (ntoh24(fh->fh_d_id) == FC_FID_FLOGI) |
| 759 | return -EINVAL; | 759 | goto drop; |
| 760 | } else { | 760 | } else { |
| 761 | if (fip->state != FIP_ST_ENABLED) | 761 | if (fip->state != FIP_ST_ENABLED) |
| 762 | return 0; | 762 | return 0; |
| @@ -799,9 +799,9 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, | |||
| 799 | fip->send(fip, skb); | 799 | fip->send(fip, skb); |
| 800 | return -EINPROGRESS; | 800 | return -EINPROGRESS; |
| 801 | drop: | 801 | drop: |
| 802 | kfree_skb(skb); | ||
| 803 | LIBFCOE_FIP_DBG(fip, "drop els_send op %u d_id %x\n", | 802 | LIBFCOE_FIP_DBG(fip, "drop els_send op %u d_id %x\n", |
| 804 | op, ntoh24(fh->fh_d_id)); | 803 | op, ntoh24(fh->fh_d_id)); |
| 804 | kfree_skb(skb); | ||
| 805 | return -EINVAL; | 805 | return -EINVAL; |
| 806 | } | 806 | } |
| 807 | EXPORT_SYMBOL(fcoe_ctlr_els_send); | 807 | EXPORT_SYMBOL(fcoe_ctlr_els_send); |
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c index 31d31aad3de1..89b1f1af2fd4 100644 --- a/drivers/scsi/libfc/fc_rport.c +++ b/drivers/scsi/libfc/fc_rport.c | |||
| @@ -2164,6 +2164,7 @@ static void fc_rport_recv_logo_req(struct fc_lport *lport, struct fc_frame *fp) | |||
| 2164 | FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n", | 2164 | FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n", |
| 2165 | fc_rport_state(rdata)); | 2165 | fc_rport_state(rdata)); |
| 2166 | 2166 | ||
| 2167 | rdata->flags &= ~FC_RP_STARTED; | ||
| 2167 | fc_rport_enter_delete(rdata, RPORT_EV_STOP); | 2168 | fc_rport_enter_delete(rdata, RPORT_EV_STOP); |
| 2168 | mutex_unlock(&rdata->rp_mutex); | 2169 | mutex_unlock(&rdata->rp_mutex); |
| 2169 | kref_put(&rdata->kref, fc_rport_destroy); | 2170 | kref_put(&rdata->kref, fc_rport_destroy); |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c index 569392d0d4c9..e44c91edf92d 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.c +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c | |||
| @@ -3343,11 +3343,10 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr, | |||
| 3343 | spinlock_t *writeq_lock) | 3343 | spinlock_t *writeq_lock) |
| 3344 | { | 3344 | { |
| 3345 | unsigned long flags; | 3345 | unsigned long flags; |
| 3346 | __u64 data_out = b; | ||
| 3347 | 3346 | ||
| 3348 | spin_lock_irqsave(writeq_lock, flags); | 3347 | spin_lock_irqsave(writeq_lock, flags); |
| 3349 | writel((u32)(data_out), addr); | 3348 | __raw_writel((u32)(b), addr); |
| 3350 | writel((u32)(data_out >> 32), (addr + 4)); | 3349 | __raw_writel((u32)(b >> 32), (addr + 4)); |
| 3351 | mmiowb(); | 3350 | mmiowb(); |
| 3352 | spin_unlock_irqrestore(writeq_lock, flags); | 3351 | spin_unlock_irqrestore(writeq_lock, flags); |
| 3353 | } | 3352 | } |
| @@ -3367,7 +3366,8 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr, | |||
| 3367 | static inline void | 3366 | static inline void |
| 3368 | _base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) | 3367 | _base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) |
| 3369 | { | 3368 | { |
| 3370 | writeq(b, addr); | 3369 | __raw_writeq(b, addr); |
| 3370 | mmiowb(); | ||
| 3371 | } | 3371 | } |
| 3372 | #else | 3372 | #else |
| 3373 | static inline void | 3373 | static inline void |
| @@ -5268,7 +5268,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, | |||
| 5268 | 5268 | ||
| 5269 | /* send message 32-bits at a time */ | 5269 | /* send message 32-bits at a time */ |
| 5270 | for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) { | 5270 | for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) { |
| 5271 | writel((u32)(request[i]), &ioc->chip->Doorbell); | 5271 | writel(cpu_to_le32(request[i]), &ioc->chip->Doorbell); |
| 5272 | if ((_base_wait_for_doorbell_ack(ioc, 5))) | 5272 | if ((_base_wait_for_doorbell_ack(ioc, 5))) |
| 5273 | failed = 1; | 5273 | failed = 1; |
| 5274 | } | 5274 | } |
| @@ -5289,7 +5289,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, | |||
| 5289 | } | 5289 | } |
| 5290 | 5290 | ||
| 5291 | /* read the first two 16-bits, it gives the total length of the reply */ | 5291 | /* read the first two 16-bits, it gives the total length of the reply */ |
| 5292 | reply[0] = (u16)(readl(&ioc->chip->Doorbell) | 5292 | reply[0] = le16_to_cpu(readl(&ioc->chip->Doorbell) |
| 5293 | & MPI2_DOORBELL_DATA_MASK); | 5293 | & MPI2_DOORBELL_DATA_MASK); |
| 5294 | writel(0, &ioc->chip->HostInterruptStatus); | 5294 | writel(0, &ioc->chip->HostInterruptStatus); |
| 5295 | if ((_base_wait_for_doorbell_int(ioc, 5))) { | 5295 | if ((_base_wait_for_doorbell_int(ioc, 5))) { |
| @@ -5298,7 +5298,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, | |||
| 5298 | ioc->name, __LINE__); | 5298 | ioc->name, __LINE__); |
| 5299 | return -EFAULT; | 5299 | return -EFAULT; |
| 5300 | } | 5300 | } |
| 5301 | reply[1] = (u16)(readl(&ioc->chip->Doorbell) | 5301 | reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell) |
| 5302 | & MPI2_DOORBELL_DATA_MASK); | 5302 | & MPI2_DOORBELL_DATA_MASK); |
| 5303 | writel(0, &ioc->chip->HostInterruptStatus); | 5303 | writel(0, &ioc->chip->HostInterruptStatus); |
| 5304 | 5304 | ||
| @@ -5312,7 +5312,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, | |||
| 5312 | if (i >= reply_bytes/2) /* overflow case */ | 5312 | if (i >= reply_bytes/2) /* overflow case */ |
| 5313 | readl(&ioc->chip->Doorbell); | 5313 | readl(&ioc->chip->Doorbell); |
| 5314 | else | 5314 | else |
| 5315 | reply[i] = (u16)(readl(&ioc->chip->Doorbell) | 5315 | reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell) |
| 5316 | & MPI2_DOORBELL_DATA_MASK); | 5316 | & MPI2_DOORBELL_DATA_MASK); |
| 5317 | writel(0, &ioc->chip->HostInterruptStatus); | 5317 | writel(0, &ioc->chip->HostInterruptStatus); |
| 5318 | } | 5318 | } |
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c index 091ec1207bea..cff83b9457f7 100644 --- a/drivers/scsi/qedi/qedi_main.c +++ b/drivers/scsi/qedi/qedi_main.c | |||
| @@ -888,7 +888,7 @@ static void qedi_get_boot_tgt_info(struct nvm_iscsi_block *block, | |||
| 888 | ipv6_en = !!(block->generic.ctrl_flags & | 888 | ipv6_en = !!(block->generic.ctrl_flags & |
| 889 | NVM_ISCSI_CFG_GEN_IPV6_ENABLED); | 889 | NVM_ISCSI_CFG_GEN_IPV6_ENABLED); |
| 890 | 890 | ||
| 891 | snprintf(tgt->iscsi_name, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n", | 891 | snprintf(tgt->iscsi_name, sizeof(tgt->iscsi_name), "%s\n", |
| 892 | block->target[index].target_name.byte); | 892 | block->target[index].target_name.byte); |
| 893 | 893 | ||
| 894 | tgt->ipv6_en = ipv6_en; | 894 | tgt->ipv6_en = ipv6_en; |
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index a91cca52b5d5..dd93a22fe843 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
| @@ -2130,34 +2130,11 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp) | |||
| 2130 | req_cnt = 1; | 2130 | req_cnt = 1; |
| 2131 | handle = 0; | 2131 | handle = 0; |
| 2132 | 2132 | ||
| 2133 | if (!sp) | 2133 | if (sp && (sp->type != SRB_SCSI_CMD)) { |
| 2134 | goto skip_cmd_array; | 2134 | /* Adjust entry-counts as needed. */ |
| 2135 | |||
| 2136 | /* Check for room in outstanding command list. */ | ||
| 2137 | handle = req->current_outstanding_cmd; | ||
| 2138 | for (index = 1; index < req->num_outstanding_cmds; index++) { | ||
| 2139 | handle++; | ||
| 2140 | if (handle == req->num_outstanding_cmds) | ||
| 2141 | handle = 1; | ||
| 2142 | if (!req->outstanding_cmds[handle]) | ||
| 2143 | break; | ||
| 2144 | } | ||
| 2145 | if (index == req->num_outstanding_cmds) { | ||
| 2146 | ql_log(ql_log_warn, vha, 0x700b, | ||
| 2147 | "No room on outstanding cmd array.\n"); | ||
| 2148 | goto queuing_error; | ||
| 2149 | } | ||
| 2150 | |||
| 2151 | /* Prep command array. */ | ||
| 2152 | req->current_outstanding_cmd = handle; | ||
| 2153 | req->outstanding_cmds[handle] = sp; | ||
| 2154 | sp->handle = handle; | ||
| 2155 | |||
| 2156 | /* Adjust entry-counts as needed. */ | ||
| 2157 | if (sp->type != SRB_SCSI_CMD) | ||
| 2158 | req_cnt = sp->iocbs; | 2135 | req_cnt = sp->iocbs; |
| 2136 | } | ||
| 2159 | 2137 | ||
| 2160 | skip_cmd_array: | ||
| 2161 | /* Check for room on request queue. */ | 2138 | /* Check for room on request queue. */ |
| 2162 | if (req->cnt < req_cnt + 2) { | 2139 | if (req->cnt < req_cnt + 2) { |
| 2163 | if (qpair->use_shadow_reg) | 2140 | if (qpair->use_shadow_reg) |
| @@ -2183,6 +2160,28 @@ skip_cmd_array: | |||
| 2183 | if (req->cnt < req_cnt + 2) | 2160 | if (req->cnt < req_cnt + 2) |
| 2184 | goto queuing_error; | 2161 | goto queuing_error; |
| 2185 | 2162 | ||
| 2163 | if (sp) { | ||
| 2164 | /* Check for room in outstanding command list. */ | ||
| 2165 | handle = req->current_outstanding_cmd; | ||
| 2166 | for (index = 1; index < req->num_outstanding_cmds; index++) { | ||
| 2167 | handle++; | ||
| 2168 | if (handle == req->num_outstanding_cmds) | ||
| 2169 | handle = 1; | ||
| 2170 | if (!req->outstanding_cmds[handle]) | ||
| 2171 | break; | ||
| 2172 | } | ||
| 2173 | if (index == req->num_outstanding_cmds) { | ||
| 2174 | ql_log(ql_log_warn, vha, 0x700b, | ||
| 2175 | "No room on outstanding cmd array.\n"); | ||
| 2176 | goto queuing_error; | ||
| 2177 | } | ||
| 2178 | |||
| 2179 | /* Prep command array. */ | ||
| 2180 | req->current_outstanding_cmd = handle; | ||
| 2181 | req->outstanding_cmds[handle] = sp; | ||
| 2182 | sp->handle = handle; | ||
| 2183 | } | ||
| 2184 | |||
| 2186 | /* Prep packet */ | 2185 | /* Prep packet */ |
| 2187 | req->cnt -= req_cnt; | 2186 | req->cnt -= req_cnt; |
| 2188 | pkt = req->ring_ptr; | 2187 | pkt = req->ring_ptr; |
| @@ -2195,6 +2194,8 @@ skip_cmd_array: | |||
| 2195 | pkt->handle = handle; | 2194 | pkt->handle = handle; |
| 2196 | } | 2195 | } |
| 2197 | 2196 | ||
| 2197 | return pkt; | ||
| 2198 | |||
| 2198 | queuing_error: | 2199 | queuing_error: |
| 2199 | qpair->tgt_counters.num_alloc_iocb_failed++; | 2200 | qpair->tgt_counters.num_alloc_iocb_failed++; |
| 2200 | return pkt; | 2201 | return pkt; |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 3f3cb72e0c0c..d0389b20574d 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
| @@ -523,18 +523,26 @@ static int sr_init_command(struct scsi_cmnd *SCpnt) | |||
| 523 | static int sr_block_open(struct block_device *bdev, fmode_t mode) | 523 | static int sr_block_open(struct block_device *bdev, fmode_t mode) |
| 524 | { | 524 | { |
| 525 | struct scsi_cd *cd; | 525 | struct scsi_cd *cd; |
| 526 | struct scsi_device *sdev; | ||
| 526 | int ret = -ENXIO; | 527 | int ret = -ENXIO; |
| 527 | 528 | ||
| 529 | cd = scsi_cd_get(bdev->bd_disk); | ||
| 530 | if (!cd) | ||
| 531 | goto out; | ||
| 532 | |||
| 533 | sdev = cd->device; | ||
| 534 | scsi_autopm_get_device(sdev); | ||
| 528 | check_disk_change(bdev); | 535 | check_disk_change(bdev); |
| 529 | 536 | ||
| 530 | mutex_lock(&sr_mutex); | 537 | mutex_lock(&sr_mutex); |
| 531 | cd = scsi_cd_get(bdev->bd_disk); | 538 | ret = cdrom_open(&cd->cdi, bdev, mode); |
| 532 | if (cd) { | ||
| 533 | ret = cdrom_open(&cd->cdi, bdev, mode); | ||
| 534 | if (ret) | ||
| 535 | scsi_cd_put(cd); | ||
| 536 | } | ||
| 537 | mutex_unlock(&sr_mutex); | 539 | mutex_unlock(&sr_mutex); |
| 540 | |||
| 541 | scsi_autopm_put_device(sdev); | ||
| 542 | if (ret) | ||
| 543 | scsi_cd_put(cd); | ||
| 544 | |||
| 545 | out: | ||
| 538 | return ret; | 546 | return ret; |
| 539 | } | 547 | } |
| 540 | 548 | ||
| @@ -562,6 +570,8 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | |||
| 562 | if (ret) | 570 | if (ret) |
| 563 | goto out; | 571 | goto out; |
| 564 | 572 | ||
| 573 | scsi_autopm_get_device(sdev); | ||
| 574 | |||
| 565 | /* | 575 | /* |
| 566 | * Send SCSI addressing ioctls directly to mid level, send other | 576 | * Send SCSI addressing ioctls directly to mid level, send other |
| 567 | * ioctls to cdrom/block level. | 577 | * ioctls to cdrom/block level. |
| @@ -570,15 +580,18 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | |||
| 570 | case SCSI_IOCTL_GET_IDLUN: | 580 | case SCSI_IOCTL_GET_IDLUN: |
| 571 | case SCSI_IOCTL_GET_BUS_NUMBER: | 581 | case SCSI_IOCTL_GET_BUS_NUMBER: |
| 572 | ret = scsi_ioctl(sdev, cmd, argp); | 582 | ret = scsi_ioctl(sdev, cmd, argp); |
| 573 | goto out; | 583 | goto put; |
| 574 | } | 584 | } |
| 575 | 585 | ||
| 576 | ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); | 586 | ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); |
| 577 | if (ret != -ENOSYS) | 587 | if (ret != -ENOSYS) |
| 578 | goto out; | 588 | goto put; |
| 579 | 589 | ||
| 580 | ret = scsi_ioctl(sdev, cmd, argp); | 590 | ret = scsi_ioctl(sdev, cmd, argp); |
| 581 | 591 | ||
| 592 | put: | ||
| 593 | scsi_autopm_put_device(sdev); | ||
| 594 | |||
| 582 | out: | 595 | out: |
| 583 | mutex_unlock(&sr_mutex); | 596 | mutex_unlock(&sr_mutex); |
| 584 | return ret; | 597 | return ret; |
diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c index 777e5f1e52d1..0cd947f78b5b 100644 --- a/drivers/scsi/vmw_pvscsi.c +++ b/drivers/scsi/vmw_pvscsi.c | |||
| @@ -561,9 +561,14 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter, | |||
| 561 | (btstat == BTSTAT_SUCCESS || | 561 | (btstat == BTSTAT_SUCCESS || |
| 562 | btstat == BTSTAT_LINKED_COMMAND_COMPLETED || | 562 | btstat == BTSTAT_LINKED_COMMAND_COMPLETED || |
| 563 | btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) { | 563 | btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) { |
| 564 | cmd->result = (DID_OK << 16) | sdstat; | 564 | if (sdstat == SAM_STAT_COMMAND_TERMINATED) { |
| 565 | if (sdstat == SAM_STAT_CHECK_CONDITION && cmd->sense_buffer) | 565 | cmd->result = (DID_RESET << 16); |
| 566 | cmd->result |= (DRIVER_SENSE << 24); | 566 | } else { |
| 567 | cmd->result = (DID_OK << 16) | sdstat; | ||
| 568 | if (sdstat == SAM_STAT_CHECK_CONDITION && | ||
| 569 | cmd->sense_buffer) | ||
| 570 | cmd->result |= (DRIVER_SENSE << 24); | ||
| 571 | } | ||
| 567 | } else | 572 | } else |
| 568 | switch (btstat) { | 573 | switch (btstat) { |
| 569 | case BTSTAT_SUCCESS: | 574 | case BTSTAT_SUCCESS: |
