On Mon, 2007-02-12 at 08:14 -0800, Mark Haverkamp wrote: > This patch fixed my looping DV problem. As far as I can tell, this is identical to Eric's patch, but is done using the existing dv_in_progress flag ... can you test it out and see if it actually works? Thanks, James Index: linux-2.6/drivers/scsi/scsi_transport_spi.c =================================================================== --- linux-2.6.orig/drivers/scsi/scsi_transport_spi.c 2007-02-11 14:16:51.000000000 -0600 +++ linux-2.6/drivers/scsi/scsi_transport_spi.c 2007-02-12 15:20:59.000000000 -0600 @@ -787,6 +787,7 @@ spi_dv_device_internal(struct scsi_devic struct scsi_target *starget = sdev->sdev_target; struct Scsi_Host *shost = sdev->host; int len = sdev->inquiry_len; + /* first set us up for narrow async */ DV_SET(offset, 0); DV_SET(width, 0); @@ -917,8 +918,25 @@ spi_dv_device(struct scsi_device *sdev) if (unlikely(scsi_device_get(sdev))) return; - if (unlikely(spi_dv_in_progress(starget))) + if (unlikely(spi_dv_in_progress(starget))) { + /* + * If DV is already pending, just make sure the device + * has all the parameters set (in case this is the + * result of a reset during the in progress DV) + */ + DV_SET(dt, spi_dt(starget)); + DV_SET(iu, spi_iu(starget)); + DV_SET(width, spi_width(starget)); + DV_SET(offset, spi_offset(starget)); + DV_SET(period, spi_period(starget)); + DV_SET(qas, spi_qas(starget)); + DV_SET(rd_strm, spi_rd_strm(starget)); + DV_SET(wr_flow, spi_wr_flow(starget)); + DV_SET(rti, spi_rti(starget)); + DV_SET(pcomp_en, spi_pcomp_en(starget)); + scsi_device_put(sdev); return; + } spi_dv_in_progress(starget) = 1; buffer = kzalloc(len, GFP_KERNEL); - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html