aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aic7xxx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aic7xxx')
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
index 00d48a0fb7e1..0fbd1ec58340 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
@@ -481,6 +481,7 @@ ahd_linux_target_alloc(struct scsi_target *starget)
481{ 481{
482 struct ahd_softc *ahd = 482 struct ahd_softc *ahd =
483 *((struct ahd_softc **)dev_to_shost(&starget->dev)->hostdata); 483 *((struct ahd_softc **)dev_to_shost(&starget->dev)->hostdata);
484 struct seeprom_config *sc = ahd->seep_config;
484 unsigned long flags; 485 unsigned long flags;
485 struct scsi_target **ahd_targp = ahd_linux_target_in_softc(starget); 486 struct scsi_target **ahd_targp = ahd_linux_target_in_softc(starget);
486 struct ahd_linux_target *targ = scsi_transport_target_data(starget); 487 struct ahd_linux_target *targ = scsi_transport_target_data(starget);
@@ -496,18 +497,38 @@ ahd_linux_target_alloc(struct scsi_target *starget)
496 *ahd_targp = starget; 497 *ahd_targp = starget;
497 memset(targ, 0, sizeof(*targ)); 498 memset(targ, 0, sizeof(*targ));
498 499
500 if (sc) {
501 int flags = sc->device_flags[starget->id];
502
503 tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id,
504 starget->id, &tstate);
505
506 if ((flags & CFPACKETIZED) == 0) {
507 /* Do not negotiate packetized transfers */
508 spi_rd_strm(starget) = 0;
509 spi_pcomp_en(starget) = 0;
510 spi_rti(starget) = 0;
511 spi_wr_flow(starget) = 0;
512 spi_hold_mcs(starget) = 0;
513 } else {
514 if ((ahd->features & AHD_RTI) == 0)
515 spi_rti(starget) = 0;
516 }
517
518 if ((flags & CFQAS) == 0)
519 spi_qas(starget) = 0;
520
521 /* Transinfo values have been set to BIOS settings */
522 spi_max_width(starget) = (flags & CFWIDEB) ? 1 : 0;
523 spi_min_period(starget) = tinfo->user.period;
524 spi_max_offset(starget) = tinfo->user.offset;
525 }
526
499 tinfo = ahd_fetch_transinfo(ahd, channel, ahd->our_id, 527 tinfo = ahd_fetch_transinfo(ahd, channel, ahd->our_id,
500 starget->id, &tstate); 528 starget->id, &tstate);
501 ahd_compile_devinfo(&devinfo, ahd->our_id, starget->id, 529 ahd_compile_devinfo(&devinfo, ahd->our_id, starget->id,
502 CAM_LUN_WILDCARD, channel, 530 CAM_LUN_WILDCARD, channel,
503 ROLE_INITIATOR); 531 ROLE_INITIATOR);
504 spi_min_period(starget) = AHD_SYNCRATE_MAX; /* We can do U320 */
505 if ((ahd->bugs & AHD_PACED_NEGTABLE_BUG) != 0)
506 spi_max_offset(starget) = MAX_OFFSET_PACED_BUG;
507 else
508 spi_max_offset(starget) = MAX_OFFSET_PACED;
509 spi_max_width(starget) = ahd->features & AHD_WIDE;
510
511 ahd_set_syncrate(ahd, &devinfo, 0, 0, 0, 532 ahd_set_syncrate(ahd, &devinfo, 0, 0, 0,
512 AHD_TRANS_GOAL, /*paused*/FALSE); 533 AHD_TRANS_GOAL, /*paused*/FALSE);
513 ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT, 534 ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,