[SCSI] correct the sym2 period setting routines
authorJames Bottomley <James.Bottomley@steeleye.com>
Fri, 6 May 2005 18:14:48 +0000 (13:14 -0500)
committerJames Bottomley <jejb@mulgrave.(none)>
Fri, 6 May 2005 20:12:02 +0000 (15:12 -0500)
There's a slight bug in the routines in that if the period requires dt,
then the routine will unconditionally set it.  DT may only be set if
Wide is also set, so this turns back on the wide bit.

For domain validation to work correctly, we need to observe the wide bit
absolutely.

Acked by: Matthew Wilcox <willy@debian.org>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/sym53c8xx_2/sym_glue.c

index 5ff83d214f128eed2ca780cf50fbc8f12a6fa07e..5b07c6ec3eccbc2845216d1fa1c1dce63039739d 100644 (file)
@@ -2038,8 +2038,9 @@ static void sym2_set_period(struct scsi_target *starget, int period)
        struct sym_hcb *np = sym_get_hcb(shost);
        struct sym_tcb *tp = &np->target[starget->id];
 
        struct sym_hcb *np = sym_get_hcb(shost);
        struct sym_tcb *tp = &np->target[starget->id];
 
-       /* have to have DT for these transfers */
-       if (period <= np->minsync)
+       /* have to have DT for these transfers, but DT will also
+        * set width, so check that this is allowed */
+       if (period <= np->minsync && spi_width(starget))
                tp->tgoal.dt = 1;
 
        tp->tgoal.period = period;
                tp->tgoal.dt = 1;
 
        tp->tgoal.period = period;