• Bartlomiej Zolnierkiewicz's avatar
    ide: mode limiting fixes for user requested speed changes · 7670df73
    Bartlomiej Zolnierkiewicz authored
    * Add an extra argument to ide_max_dma_mode() for passing requested transfer
      mode.  Use it as an upper limit when finding the best DMA for device/host.
    
    * Rename ide_max_dma_mode() to ide_find_dma_mode() and at the same time add
      ide_max_dma_mode() wrapper which passes XFER_UDMA_6 as a requested mode to
      ide_find_dma_mode().  Also add inline ide_find_dma_mode() version for
      CONFIG_BLK_DEV_IDEDMA=n case.
    
    * Pass requested transfer mode from ide_find_dma_mode() to ide_get_mode_mask()
      to avoid false warning from eighty_ninty_three().
    
    * Use ide_find_dma_mode() to limit the user requested transfer mode in
      ide_rate_filter().  Also limit the requested mode by host max PIO mode.
    
    
    Above changes make ide_rate_filter() to:
    
    * Clip desired transfer mode down if it is invalid (values 0x0F, 0x13-0x19
      and 0x25-0x39, values > 0x46 were already clipped down, same for values
      0x25-0x39 but iff UDMA was not supported by the host).
    
    * Clip desired transfer mode down if it is currently unsupported by IDE core
      (PIO6 and MWDMA3-4, the latter were already clipped down but iff UDMA was
      not supported by the host).
    
    * Clip desired transfer mode down according to the host capabilities
      (UDMA modes were already clipped down but MWDMA/SWDMA/PIO weren't,
      also ->atapi_dma flag was not respected).
    
    * Clip desired transfer mode down according to the device capabilities
      (except PIO modes for now which require mode work) - shouldn't be a
      problem since ide_set_xfer_rate() is called _after_ device has accepted
      given transfer mode.
    
    and also result in a number of host driver specific bugfixes:
    
    * icside
      - clip unsupported PIO5 mode down
      - fix unsupported/invalid modes being set in drive->current_speed
    
    * ide-cris
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - clip DMA modes down for ATAPI devices
      - fix BUG() on unsupported/invalid modes
    
    * au1xxx-ide
      - clip unsupported PIO5, SWDMA0-2 and MWDMA0-2
        (if BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=n) modes down
    
    * aec62xx
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - clip DMA modes down for ATAPI devices
      - fix 0x00 being programmed as PIO timing for unsupported/invalid modes
      - fix unsupported/invalid modes being set on the device
    
    * alim15x3
      - clip DMA modes down for ATAPI devices (chipset revision == 0x20 only)
      - fix theoretical OOPS for 0x0F mode
      - fix unsupported/invalid modes being set on the device
    
    * amd74xx
      - clip unsupported SWDMA0-2 (on COBRA_7401 revs <= 7) modes down
      - fix random PIO timings being set for unsupported/invalid modes
      - fix unsupported/invalid modes being set on the device
    
    * atiixp
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix cached MWDMA mode being cleared for unsupported/invalid modes
      - fix PIO{0,2} timings being programmed for unsupported/invalid modes
      - fix theoretical OOPS for PIO5-6 and 0x0F modes
      - fix unsupported/invalid modes being set on the device
    
    * cmd64x
      - clip unsupported SWDMA0-2 modes down
    
    * cs5530
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix unsupported/invalid modes being set on the device
      - fix BUG() on unsupported/invalid modes
        (which happened if the device accepted the setting)
    
    * cs5535
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix unsupported/invalid modes being set on the device
      - fix theoretical OOPS for PIO5-6 and 0x0F modes
    
    * hpt34x
      - clip DMA modes down for ATAPI devices
      - fix invalid timings being programmed for unsupported/invalid modes
      - fix unsupported/invalid modes being set on the device
    
    * hpt366
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix PIO0 timings being programmed for unsupported/invalid modes
      - fix DMA timings being cleared for MWDMA3-4 and 0x25-0x39 modes
      - fix unsupported/invalid modes being set on the device
    
    * it8213
      - clip unsupported PIO5, SWDMA0-1 and MWDMA0 modes down
    
    * it821x
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - clip DMA modes down for ATAPI devices
        (chipset in smart mode and revision 0x10 in pass-through mode)
    
    * jmicron
      - clip unsupported SWDMA0-2 modes down
      - fix unsupported/invalid modes being set on the device
    
    * pdc202xx_new
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix unsupported/invalid modes being set on the device
    
    * pdc202xx_old
      - clip unsupported PIO5 mode down
      - fix incorrect timings being set for unsupported/invalid modes
      - fix unsupported/invalid modes being set on the device
    
    * piix
      - clip unsupported PIO5, SWDMA0-1 and MWDMA0 modes down
    
    * sc1200
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix unsupported/invalid modes being set on the device
      - fix BUG() on unsupported/invalid modes
        (which happened if the device accepted the setting)
    
    * scc_pata
      - clip unsupported PIO5, SWDMA0-2 and MWDMA0-2 modes down
    
    * serverworks
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix DMA/UDMA timings/settings being cleared for unsupported/invalid modes
      - fix unsupported/invalid modes being set on the device
    
    * siimage
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - clip DMA modes down for ATAPI devices (SATA chipsets)
    
    * sis5513
      - clip unsupported PIO5 mode down
      - fix BUG() on unsupported/invalid modes
    
    * sl82c105
      - clip unsupported SWDMA0-2 modes down
    
    * slc90e66
      - clip unsupported PIO5, SWDMA0-1 and MWDMA0 modes down
    
    * tc86c001
      - clip unsupported PIO5 and SWDMA0-2 modes down
      - fix PIO0 timings being programmed for PIO5/0x0F/SWDMA0-2/0x13-0x19 modes
      - fix invalid 0x00 DMA timing being programmed for MWDMA3-4/0x25-0x39 modes
      - fix unsupported/invalid modes being set on the device
    
    * triflex
      - clip unsupported PIO5 mode down
    
    * via82cxxx
      - fix random PIO timings being set for unsupported/invalid modes
      - fix unsupported/invalid modes being set on the device
    
    * pmac
      - clip unsupported PIO5 and SWDMA0-2 modes down
    
    * cmd640/ht6560b
      - clip DMA modes down (if CONFIG_BLK_DEV_IDEDMA=y)
      - fix PIO5 being clipped to PIO4 (if CONFIG_BLK_DEV_IDEDMA=n)
    
    * opti621
      - clip DMA modes down (if CONFIG_BLK_DEV_IDEDMA=y)
      - clip unsupported PIO4 to PIO3 (if CONFIG_BLK_DEV_IDEDMA=n)
    
    
    While at it:
    
    * Use ide_rate_filter() in cs5520.c::cs5520_tune_chipset().
    
    * Remove no longer needed checks from hpt366.c::hpt3{6,7}x_tune_chipset().
    Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
    Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    7670df73
cs5520.c 7.2 KB