aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/fcoe/fcoe_ctlr.c6
-rw-r--r--drivers/scsi/libfc/fc_rport.c1
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.c16
-rw-r--r--drivers/scsi/qedi/qedi_main.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_iocb.c53
-rw-r--r--drivers/scsi/sr.c29
-rw-r--r--drivers/scsi/vmw_pvscsi.c11
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;
801drop: 801drop:
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}
807EXPORT_SYMBOL(fcoe_ctlr_els_send); 807EXPORT_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,
3367static inline void 3366static 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
3373static inline void 3373static 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
2160skip_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
2198queuing_error: 2199queuing_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)
523static int sr_block_open(struct block_device *bdev, fmode_t mode) 523static 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
545out:
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
592put:
593 scsi_autopm_put_device(sdev);
594
582out: 595out:
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: