Re: What breaks aic7xxx in post 2.6.12-rc2 ?

James Bottomley
2005-05-17T21:06:57Z

On Tue, 2005-05-17 at 21:56 +0200, Grégoire Favre wrote:
> On Tue, May 17, 2005 at 02:50:31PM -0500, James Bottomley wrote:
>
> > Right, but the problem I think it will fix is the initial inquiry being
> > sent with the wrong transport parameters.
> >
> > You have a different problem, I think ... it looks like your Toshiba DVD
> > does somthing strange during Domain Validation ... the question I don't
> > have an answer to yet, is what.
>
> Oh, sorry, thank you for the patch :-)

Well, the attached is what I'd like you to try, capturing the
information from the initial inquiry on ... it will be quite a bit.

Hopefully it will give me a clearer idea of what's going on.

Thanks,

James

--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -669,14 +669,23 @@ spi_dv_retrain(struct scsi_request *sreq
{
struct spi_internal *i = to_spi_internal(sreq->sr_host->transportt);
struct scsi_device *sdev = sreq->sr_device;
+ struct scsi_target *starget = sdev->sdev_target;
int period = 0, prevperiod = 0;
enum spi_compare_returns retval;

for (;;) {
int newperiod;
+
retval = compare_fn(sreq, buffer, ptr, DV_LOOPS);

+ if(i->f->get_period)
+ i->f->get_period(starget);
+ if (i->f->get_offset)
+ i->f->get_offset(starget);
+
+ spi_display_xfer_agreement(starget);
+
if (retval == SPI_COMPARE_SUCCESS
|| retval == SPI_COMPARE_SKIP_TEST)
break;
@@ -765,6 +774,8 @@ spi_dv_device_internal(struct scsi_reque
/* first set us up for narrow async */
DV_SET(offset, 0);
DV_SET(width, 0);
+
+ printk("BEGINNING ASYNC, inq len = %d\n", sdev->inquiry_len);

if (spi_dv_device_compare_inquiry(sreq, buffer, buffer, DV_LOOPS)
!= SPI_COMPARE_SUCCESS) {
@@ -773,11 +784,13 @@ spi_dv_device_internal(struct scsi_reque
return;
}

+ printk("ASYNC INQUIRY SUCCEEDED\n");
+
/* test width */
if (i->f->set_width && spi_max_width(starget) && sdev->wdtr) {
i->f->set_width(sdev->sdev_target, 1);

- printk("WIDTH IS %d\n", spi_max_width(starget));
+ printk("TRYING WIDE ASYNC INQUIRY\n");

if (spi_dv_device_compare_inquiry(sreq, buffer,
buffer + len,
@@ -802,12 +815,17 @@ spi_dv_device_internal(struct scsi_reque
if (sdev->ppr)
len = spi_dv_device_get_echo_buffer(sreq, buffer);

+ printk("ECHO BUFFER HAS LEN %d\n", len);
+
retry:

/* now set up to the maximum */
DV_SET(offset, spi_max_offset(starget));
DV_SET(period, spi_min_period(starget));

+ printk("DV SETTING TO period %d, offset %d\n", spi_min_period(starget),
+ spi_max_offset(starget));
+
if (len == 0) {
SPI_PRINTK(sdev->sdev_target, KERN_INFO, "Domain Validation skipping write tests\n");
spi_dv_retrain(sreq, buffer, buffer + len,