aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@steeleye.com>2005-06-13 21:58:56 -0400
committerJames Bottomley <jejb@mulgrave.(none)>2005-06-13 22:37:27 -0400
commit12021fff2bae7fab01c4bf283f3cd9bc6997d8c4 (patch)
tree9c0b0844afa76da7a1c8d7cdfef67f8bf1144453 /drivers
parentd736a27b7efbc835c7b83db5c1bbd41edbadf32e (diff)
[SCSI] aic7xxx: fix the BIOS limits setting routines
Following the go around over the SONY DVD that needs artificial limits, this should be the correct code for all cases (minus the debugging prints). Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_osm.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
index 55e0b2875f99..e3892585d7e6 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
@@ -621,20 +621,35 @@ ahc_linux_target_alloc(struct scsi_target *starget)
621 memset(targ, 0, sizeof(*targ)); 621 memset(targ, 0, sizeof(*targ));
622 622
623 if (sc) { 623 if (sc) {
624 int maxsync = AHC_SYNCRATE_DT;
625 int ultra = 0;
626 int flags = sc->device_flags[target_offset];
627
628 if (ahc->flags & AHC_NEWEEPROM_FMT) {
629 if (flags & CFSYNCHISULTRA)
630 ultra = 1;
631 } else if (flags & CFULTRAEN)
632 ultra = 1;
633 /* AIC nutcase; 10MHz appears as ultra = 1, CFXFER = 0x04
634 * change it to ultra=0, CFXFER = 0 */
635 if(ultra && (flags & CFXFER) == 0x04) {
636 ultra = 0;
637 flags &= ~CFXFER;
638 }
639
624 if ((ahc->features & AHC_ULTRA2) != 0) { 640 if ((ahc->features & AHC_ULTRA2) != 0) {
625 scsirate = sc->device_flags[target_offset] & CFXFER; 641 scsirate = (flags & CFXFER) | (ultra ? 0x8 : 0);
626 } else { 642 } else {
627 scsirate = (sc->device_flags[target_offset] & CFXFER) << 4; 643 scsirate = (flags & CFXFER) << 4;
628 if (sc->device_flags[target_offset] & CFSYNCH) 644 maxsync = ultra ? AHC_SYNCRATE_ULTRA :
629 scsirate |= SOFS; 645 AHC_SYNCRATE_FAST;
630 } 646 }
631 if (sc->device_flags[target_offset] & CFWIDEB) { 647 spi_max_width(starget) = (flags & CFWIDEB) ? 1 : 0;
632 scsirate |= WIDEXFER; 648 if (!(flags & CFSYNCH))
633 spi_max_width(starget) = 1; 649 spi_max_offset(starget) = 0;
634 } else
635 spi_max_width(starget) = 0;
636 spi_min_period(starget) = 650 spi_min_period(starget) =
637 ahc_find_period(ahc, scsirate, AHC_SYNCRATE_DT); 651 ahc_find_period(ahc, scsirate, maxsync);
652
638 tinfo = ahc_fetch_transinfo(ahc, channel, ahc->our_id, 653 tinfo = ahc_fetch_transinfo(ahc, channel, ahc->our_id,
639 starget->id, &tstate); 654 starget->id, &tstate);
640 } 655 }