diff options
author | Hannes Reinecke <hare@suse.de> | 2006-01-24 04:44:38 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2006-01-31 15:39:48 -0500 |
commit | 3fb086126462c2de06dddaec58981d8827be100d (patch) | |
tree | eaa3e79ef84f8a68246e0ba68a1d048b03e9acd4 /drivers/scsi/aic7xxx/aic79xx_core.c | |
parent | 53467e636b7beb350c307cc88323aae4676577f2 (diff) |
[SCSI] aic79xx: SLOWCRC fix
This patch introduces the SLOWCRC handling for certain buggy chipsets.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aic7xxx/aic79xx_core.c')
-rw-r--r-- | drivers/scsi/aic7xxx/aic79xx_core.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index dfd4cc93c05..6114b3e72ca 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
@@ -3332,6 +3332,15 @@ ahd_update_neg_table(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, | |||
3332 | con_opts |= WIDEXFER; | 3332 | con_opts |= WIDEXFER; |
3333 | 3333 | ||
3334 | /* | 3334 | /* |
3335 | * Slow down our CRC interval to be | ||
3336 | * compatible with packetized U320 devices | ||
3337 | * that can't handle a CRC at full speed | ||
3338 | */ | ||
3339 | if (ahd->features & AHD_AIC79XXB_SLOWCRC) { | ||
3340 | con_opts |= ENSLOWCRC; | ||
3341 | } | ||
3342 | |||
3343 | /* | ||
3335 | * During packetized transfers, the target will | 3344 | * During packetized transfers, the target will |
3336 | * give us the oportunity to send command packets | 3345 | * give us the oportunity to send command packets |
3337 | * without us asserting attention. | 3346 | * without us asserting attention. |
@@ -6740,6 +6749,18 @@ ahd_chip_init(struct ahd_softc *ahd) | |||
6740 | 6749 | ||
6741 | ahd_loadseq(ahd); | 6750 | ahd_loadseq(ahd); |
6742 | ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); | 6751 | ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); |
6752 | |||
6753 | if (ahd->features & AHD_AIC79XXB_SLOWCRC) { | ||
6754 | u_int negodat3 = ahd_inb(ahd, NEGCONOPTS); | ||
6755 | |||
6756 | negodat3 |= ENSLOWCRC; | ||
6757 | ahd_outb(ahd, NEGCONOPTS, negodat3); | ||
6758 | negodat3 = ahd_inb(ahd, NEGCONOPTS); | ||
6759 | if (!(negodat3 & ENSLOWCRC)) | ||
6760 | printf("aic79xx: failed to set the SLOWCRC bit\n"); | ||
6761 | else | ||
6762 | printf("aic79xx: SLOWCRC bit set\n"); | ||
6763 | } | ||
6743 | } | 6764 | } |
6744 | 6765 | ||
6745 | /* | 6766 | /* |