diff options
author | James Bottomley <James.Bottomley@steeleye.com> | 2007-07-26 17:13:10 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-07-27 09:20:20 -0400 |
commit | 0f82cb9211f800f77636af11f0670e5fc6de6256 (patch) | |
tree | abda8332877503a5a16f5138ab4298c6072a574b /drivers/scsi/aic7xxx/aic7xxx_osm.c | |
parent | 281afe1947d855661754850de29d7530b2ff18dc (diff) |
[SCSI] aic79xx, aic7xxx: Fix incorrect width setting
Wide transfers are required for every setting of PPR apart from QAS.
It seems the DV code starts at the minimum, which turns on DT and Wide
regardless of the setting of max_width. Redo the PPR and period
setting routines to respect max_width (i.e. start at period = 10 if it
is zero).
This fixes bugzilla 8366
Acked-by: "Freels, James D." <freelsjd@ornl.gov>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aic7xxx/aic7xxx_osm.c')
-rw-r--r-- | drivers/scsi/aic7xxx/aic7xxx_osm.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 1803ab6fc21c..2e9c38f2e8a6 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c | |||
@@ -2317,8 +2317,13 @@ static void ahc_linux_set_period(struct scsi_target *starget, int period) | |||
2317 | 2317 | ||
2318 | if (period < 9) | 2318 | if (period < 9) |
2319 | period = 9; /* 12.5ns is our minimum */ | 2319 | period = 9; /* 12.5ns is our minimum */ |
2320 | if (period == 9) | 2320 | if (period == 9) { |
2321 | ppr_options |= MSG_EXT_PPR_DT_REQ; | 2321 | if (spi_max_width(starget)) |
2322 | ppr_options |= MSG_EXT_PPR_DT_REQ; | ||
2323 | else | ||
2324 | /* need wide for DT and need DT for 12.5 ns */ | ||
2325 | period = 10; | ||
2326 | } | ||
2322 | 2327 | ||
2323 | ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, | 2328 | ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, |
2324 | starget->channel + 'A', ROLE_INITIATOR); | 2329 | starget->channel + 'A', ROLE_INITIATOR); |
@@ -2381,7 +2386,7 @@ static void ahc_linux_set_dt(struct scsi_target *starget, int dt) | |||
2381 | unsigned long flags; | 2386 | unsigned long flags; |
2382 | struct ahc_syncrate *syncrate; | 2387 | struct ahc_syncrate *syncrate; |
2383 | 2388 | ||
2384 | if (dt) { | 2389 | if (dt && spi_max_width(starget)) { |
2385 | ppr_options |= MSG_EXT_PPR_DT_REQ; | 2390 | ppr_options |= MSG_EXT_PPR_DT_REQ; |
2386 | if (!width) | 2391 | if (!width) |
2387 | ahc_linux_set_width(starget, 1); | 2392 | ahc_linux_set_width(starget, 1); |