···542542 * that the device is no longer present */543543 cmd->result = DID_NO_CONNECT << 16;544544 atomic_inc(&cmd->device->iorequest_cnt);545545- scsi_done(cmd);545545+ __scsi_done(cmd);546546 /* return 0 (because the command has been processed) */547547 goto out;548548 }
+34-15
drivers/scsi/scsi_transport_spi.c
···2222#include <linux/init.h>2323#include <linux/module.h>2424#include <linux/workqueue.h>2525+#include <linux/blkdev.h>2526#include <asm/semaphore.h>2627#include <scsi/scsi.h>2728#include "scsi_priv.h"···4140#define SPI_HOST_ATTRS 142414342#define SPI_MAX_ECHO_BUFFER_SIZE 40964343+4444+#define DV_LOOPS 34545+#define DV_TIMEOUT (10*HZ)4646+#define DV_RETRIES 3 /* should only need at most 4747+ * two cc/ua clears */44484549/* Private data accessors (keep these out of the header file) */4650#define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending)···1049810599 dest[result++] = '\0';106100 return result;101101+}102102+103103+/* Modification of scsi_wait_req that will clear UNIT ATTENTION conditions104104+ * resulting from (likely) bus and device resets */105105+static void spi_wait_req(struct scsi_request *sreq, const void *cmd,106106+ void *buffer, unsigned bufflen)107107+{108108+ int i;109109+110110+ for(i = 0; i < DV_RETRIES; i++) {111111+ sreq->sr_request->flags |= REQ_FAILFAST;112112+113113+ scsi_wait_req(sreq, cmd, buffer, bufflen,114114+ DV_TIMEOUT, /* retries */ 1);115115+ if (sreq->sr_result & DRIVER_SENSE) {116116+ struct scsi_sense_hdr sshdr;117117+118118+ if (scsi_request_normalize_sense(sreq, &sshdr)119119+ && sshdr.sense_key == UNIT_ATTENTION)120120+ continue;121121+ }122122+ break;123123+ }107124}108125109126static struct {···407378 if(i->f->set_##x) \408379 i->f->set_##x(sdev->sdev_target, y)409380410410-#define DV_LOOPS 3411411-#define DV_TIMEOUT (10*HZ)412412-#define DV_RETRIES 3 /* should only need at most 413413- * two cc/ua clears */414414-415381enum spi_compare_returns {416382 SPI_COMPARE_SUCCESS,417383 SPI_COMPARE_FAILURE,···470446 for (r = 0; r < retries; r++) {471447 sreq->sr_cmd_len = 0; /* wait_req to fill in */472448 sreq->sr_data_direction = DMA_TO_DEVICE;473473- scsi_wait_req(sreq, spi_write_buffer, buffer, len,474474- DV_TIMEOUT, DV_RETRIES);449449+ spi_wait_req(sreq, spi_write_buffer, buffer, len);475450 if(sreq->sr_result || !scsi_device_online(sdev)) {476451 struct scsi_sense_hdr sshdr;477452···494471 memset(ptr, 0, len);495472 sreq->sr_cmd_len = 0; /* wait_req to fill in */496473 sreq->sr_data_direction = DMA_FROM_DEVICE;497497- scsi_wait_req(sreq, spi_read_buffer, ptr, len,498498- DV_TIMEOUT, DV_RETRIES);474474+ spi_wait_req(sreq, spi_read_buffer, ptr, len);499475 scsi_device_set_state(sdev, SDEV_QUIESCE);500476501477 if (memcmp(buffer, ptr, len) != 0)···522500523501 memset(ptr, 0, len);524502525525- scsi_wait_req(sreq, spi_inquiry, ptr, len,526526- DV_TIMEOUT, DV_RETRIES);503503+ spi_wait_req(sreq, spi_inquiry, ptr, len);527504528505 if(sreq->sr_result || !scsi_device_online(sdev)) {529506 scsi_device_set_state(sdev, SDEV_QUIESCE);···614593 * (reservation conflict, device not ready, etc) just615594 * skip the write tests */616595 for (l = 0; ; l++) {617617- scsi_wait_req(sreq, spi_test_unit_ready, NULL, 0,618618- DV_TIMEOUT, DV_RETRIES);596596+ spi_wait_req(sreq, spi_test_unit_ready, NULL, 0);619597620598 if(sreq->sr_result) {621599 if(l >= 3)···628608 sreq->sr_cmd_len = 0;629609 sreq->sr_data_direction = DMA_FROM_DEVICE;630610631631- scsi_wait_req(sreq, spi_read_buffer_descriptor, buffer, 4,632632- DV_TIMEOUT, DV_RETRIES);611611+ spi_wait_req(sreq, spi_read_buffer_descriptor, buffer, 4);633612634613 if (sreq->sr_result)635614 /* Device has no echo buffer */
+3
drivers/scsi/sr_ioctl.c
···281281 char *buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd));282282 int result;283283284284+ if (!buffer)285285+ return -ENOMEM;286286+284287 memset(&cgc, 0, sizeof(struct packet_command));285288 cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;286289 cgc.cmd[2] = 0x40; /* I do want the subchannel info */
+3-2
drivers/scsi/sym53c8xx_2/sym_glue.c
···20382038 struct sym_hcb *np = sym_get_hcb(shost);20392039 struct sym_tcb *tp = &np->target[starget->id];2040204020412041- /* have to have DT for these transfers */20422042- if (period <= np->minsync)20412041+ /* have to have DT for these transfers, but DT will also20422042+ * set width, so check that this is allowed */20432043+ if (period <= np->minsync && spi_width(starget))20432044 tp->tgoal.dt = 1;2044204520452046 tp->tgoal.period = period;