diff options
Diffstat (limited to 'drivers/scsi/aic7xxx/aic79xx_osm.c')
| -rw-r--r-- | drivers/scsi/aic7xxx/aic79xx_osm.c | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index f8e60486167d..9bfcca5ede08 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c | |||
| @@ -293,7 +293,7 @@ static uint32_t aic79xx_seltime; | |||
| 293 | * force all outstanding transactions to be serviced prior to a new | 293 | * force all outstanding transactions to be serviced prior to a new |
| 294 | * transaction. | 294 | * transaction. |
| 295 | */ | 295 | */ |
| 296 | uint32_t aic79xx_periodic_otag; | 296 | static uint32_t aic79xx_periodic_otag; |
| 297 | 297 | ||
| 298 | /* Some storage boxes are using an LSI chip which has a bug making it | 298 | /* Some storage boxes are using an LSI chip which has a bug making it |
| 299 | * impossible to use aic79xx Rev B chip in 320 speeds. The following | 299 | * impossible to use aic79xx Rev B chip in 320 speeds. The following |
| @@ -773,6 +773,7 @@ struct scsi_host_template aic79xx_driver_template = { | |||
| 773 | #endif | 773 | #endif |
| 774 | .can_queue = AHD_MAX_QUEUE, | 774 | .can_queue = AHD_MAX_QUEUE, |
| 775 | .this_id = -1, | 775 | .this_id = -1, |
| 776 | .max_sectors = 8192, | ||
| 776 | .cmd_per_lun = 2, | 777 | .cmd_per_lun = 2, |
| 777 | .use_clustering = ENABLE_CLUSTERING, | 778 | .use_clustering = ENABLE_CLUSTERING, |
| 778 | .slave_alloc = ahd_linux_slave_alloc, | 779 | .slave_alloc = ahd_linux_slave_alloc, |
| @@ -1813,9 +1814,9 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, | |||
| 1813 | u_int sense_offset; | 1814 | u_int sense_offset; |
| 1814 | 1815 | ||
| 1815 | if (scb->flags & SCB_SENSE) { | 1816 | if (scb->flags & SCB_SENSE) { |
| 1816 | sense_size = MIN(sizeof(struct scsi_sense_data) | 1817 | sense_size = min(sizeof(struct scsi_sense_data) |
| 1817 | - ahd_get_sense_residual(scb), | 1818 | - ahd_get_sense_residual(scb), |
| 1818 | sizeof(cmd->sense_buffer)); | 1819 | (u_long)sizeof(cmd->sense_buffer)); |
| 1819 | sense_offset = 0; | 1820 | sense_offset = 0; |
| 1820 | } else { | 1821 | } else { |
| 1821 | /* | 1822 | /* |
| @@ -1824,7 +1825,8 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, | |||
| 1824 | */ | 1825 | */ |
| 1825 | siu = (struct scsi_status_iu_header *) | 1826 | siu = (struct scsi_status_iu_header *) |
| 1826 | scb->sense_data; | 1827 | scb->sense_data; |
| 1827 | sense_size = MIN(scsi_4btoul(siu->sense_length), | 1828 | sense_size = min_t(size_t, |
| 1829 | scsi_4btoul(siu->sense_length), | ||
| 1828 | sizeof(cmd->sense_buffer)); | 1830 | sizeof(cmd->sense_buffer)); |
| 1829 | sense_offset = SIU_SENSE_OFFSET(siu); | 1831 | sense_offset = SIU_SENSE_OFFSET(siu); |
| 1830 | } | 1832 | } |
| @@ -2634,8 +2636,22 @@ static void ahd_linux_set_pcomp_en(struct scsi_target *starget, int pcomp) | |||
| 2634 | pcomp ? "Enable" : "Disable"); | 2636 | pcomp ? "Enable" : "Disable"); |
| 2635 | #endif | 2637 | #endif |
| 2636 | 2638 | ||
| 2637 | if (pcomp) | 2639 | if (pcomp) { |
| 2640 | uint8_t precomp; | ||
| 2641 | |||
| 2642 | if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) { | ||
| 2643 | struct ahd_linux_iocell_opts *iocell_opts; | ||
| 2644 | |||
| 2645 | iocell_opts = &aic79xx_iocell_info[ahd->unit]; | ||
| 2646 | precomp = iocell_opts->precomp; | ||
| 2647 | } else { | ||
| 2648 | precomp = AIC79XX_DEFAULT_PRECOMP; | ||
| 2649 | } | ||
| 2638 | ppr_options |= MSG_EXT_PPR_PCOMP_EN; | 2650 | ppr_options |= MSG_EXT_PPR_PCOMP_EN; |
| 2651 | AHD_SET_PRECOMP(ahd, precomp); | ||
| 2652 | } else { | ||
| 2653 | AHD_SET_PRECOMP(ahd, 0); | ||
| 2654 | } | ||
| 2639 | 2655 | ||
| 2640 | ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, | 2656 | ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, |
| 2641 | starget->channel + 'A', ROLE_INITIATOR); | 2657 | starget->channel + 'A', ROLE_INITIATOR); |
| @@ -2678,7 +2694,25 @@ static void ahd_linux_set_hold_mcs(struct scsi_target *starget, int hold) | |||
| 2678 | ahd_unlock(ahd, &flags); | 2694 | ahd_unlock(ahd, &flags); |
| 2679 | } | 2695 | } |
| 2680 | 2696 | ||
| 2697 | static void ahd_linux_get_signalling(struct Scsi_Host *shost) | ||
| 2698 | { | ||
| 2699 | struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata; | ||
| 2700 | unsigned long flags; | ||
| 2701 | u8 mode; | ||
| 2702 | |||
| 2703 | ahd_lock(ahd, &flags); | ||
| 2704 | ahd_pause(ahd); | ||
| 2705 | mode = ahd_inb(ahd, SBLKCTL); | ||
| 2706 | ahd_unpause(ahd); | ||
| 2707 | ahd_unlock(ahd, &flags); | ||
| 2681 | 2708 | ||
| 2709 | if (mode & ENAB40) | ||
| 2710 | spi_signalling(shost) = SPI_SIGNAL_LVD; | ||
| 2711 | else if (mode & ENAB20) | ||
| 2712 | spi_signalling(shost) = SPI_SIGNAL_SE; | ||
| 2713 | else | ||
| 2714 | spi_signalling(shost) = SPI_SIGNAL_UNKNOWN; | ||
| 2715 | } | ||
| 2682 | 2716 | ||
| 2683 | static struct spi_function_template ahd_linux_transport_functions = { | 2717 | static struct spi_function_template ahd_linux_transport_functions = { |
| 2684 | .set_offset = ahd_linux_set_offset, | 2718 | .set_offset = ahd_linux_set_offset, |
| @@ -2703,6 +2737,7 @@ static struct spi_function_template ahd_linux_transport_functions = { | |||
| 2703 | .show_pcomp_en = 1, | 2737 | .show_pcomp_en = 1, |
| 2704 | .set_hold_mcs = ahd_linux_set_hold_mcs, | 2738 | .set_hold_mcs = ahd_linux_set_hold_mcs, |
| 2705 | .show_hold_mcs = 1, | 2739 | .show_hold_mcs = 1, |
| 2740 | .get_signalling = ahd_linux_get_signalling, | ||
| 2706 | }; | 2741 | }; |
| 2707 | 2742 | ||
| 2708 | static int __init | 2743 | static int __init |
