diff options
| author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-08-01 17:46:46 -0400 |
|---|---|---|
| committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-08-01 17:46:46 -0400 |
| commit | 68aaf8150308dbf9d0e5ccd5bc05491ba575f966 (patch) | |
| tree | 8aa823c1f27b51b5c683b677182fcefe97bdb0dd /drivers | |
| parent | bc0b0b5c4bab02790937c9070a7701ee70feaac9 (diff) | |
it8213: PIO fixes (take 2)
* Rename it8213_tuneproc() to it8213_tune_pio() and add it8213_tuneproc()
wrapper. Move finding of the best PIO mode to the new wrapper.
* Add setting of transfer mode on the device to it8213_tuneproc().
* Don't call it8213_dma_2_pio() for PIO modes in it8213_tune_chipset().
* Use it8213_tuneproc() in it8213_config_drive_for_dma().
v2:
* Remove PIO modes from it8213_dma_2_pio(), they are no longer needed there
(Noticed by Sergei)
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/ide/pci/it8213.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c index 95dbed7e6022..70b3245dbf62 100644 --- a/drivers/ide/pci/it8213.c +++ b/drivers/ide/pci/it8213.c | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | * it8213_dma_2_pio - return the PIO mode matching DMA | 21 | * it8213_dma_2_pio - return the PIO mode matching DMA |
| 22 | * @xfer_rate: transfer speed | 22 | * @xfer_rate: transfer speed |
| 23 | * | 23 | * |
| 24 | * Returns the nearest equivalent PIO timing for the PIO or DMA | 24 | * Returns the nearest equivalent PIO timing for the DMA |
| 25 | * mode requested by the controller. | 25 | * mode requested by the controller. |
| 26 | */ | 26 | */ |
| 27 | 27 | ||
| @@ -35,34 +35,28 @@ static u8 it8213_dma_2_pio (u8 xfer_rate) { | |||
| 35 | case XFER_UDMA_1: | 35 | case XFER_UDMA_1: |
| 36 | case XFER_UDMA_0: | 36 | case XFER_UDMA_0: |
| 37 | case XFER_MW_DMA_2: | 37 | case XFER_MW_DMA_2: |
| 38 | case XFER_PIO_4: | ||
| 39 | return 4; | 38 | return 4; |
| 40 | case XFER_MW_DMA_1: | 39 | case XFER_MW_DMA_1: |
| 41 | case XFER_PIO_3: | ||
| 42 | return 3; | 40 | return 3; |
| 43 | case XFER_SW_DMA_2: | 41 | case XFER_SW_DMA_2: |
| 44 | case XFER_PIO_2: | ||
| 45 | return 2; | 42 | return 2; |
| 46 | case XFER_MW_DMA_0: | 43 | case XFER_MW_DMA_0: |
| 47 | case XFER_SW_DMA_1: | 44 | case XFER_SW_DMA_1: |
| 48 | case XFER_SW_DMA_0: | 45 | case XFER_SW_DMA_0: |
| 49 | case XFER_PIO_1: | ||
| 50 | case XFER_PIO_0: | ||
| 51 | case XFER_PIO_SLOW: | ||
| 52 | default: | 46 | default: |
| 53 | return 0; | 47 | return 0; |
| 54 | } | 48 | } |
| 55 | } | 49 | } |
| 56 | 50 | ||
| 57 | /* | 51 | /* |
| 58 | * it8213_tuneproc - tune a drive | 52 | * it8213_tune_pio - tune a drive |
| 59 | * @drive: drive to tune | 53 | * @drive: drive to tune |
| 60 | * @pio: desired PIO mode | 54 | * @pio: desired PIO mode |
| 61 | * | 55 | * |
| 62 | * Set the interface PIO mode. | 56 | * Set the interface PIO mode. |
| 63 | */ | 57 | */ |
| 64 | 58 | ||
| 65 | static void it8213_tuneproc (ide_drive_t *drive, u8 pio) | 59 | static void it8213_tune_pio(ide_drive_t *drive, const u8 pio) |
| 66 | { | 60 | { |
| 67 | ide_hwif_t *hwif = HWIF(drive); | 61 | ide_hwif_t *hwif = HWIF(drive); |
| 68 | struct pci_dev *dev = hwif->pci_dev; | 62 | struct pci_dev *dev = hwif->pci_dev; |
| @@ -82,8 +76,6 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio) | |||
| 82 | { 2, 1 }, | 76 | { 2, 1 }, |
| 83 | { 2, 3 }, }; | 77 | { 2, 3 }, }; |
| 84 | 78 | ||
| 85 | pio = ide_get_best_pio_mode(drive, pio, 4); | ||
| 86 | |||
| 87 | spin_lock_irqsave(&tune_lock, flags); | 79 | spin_lock_irqsave(&tune_lock, flags); |
| 88 | pci_read_config_word(dev, master_port, &master_data); | 80 | pci_read_config_word(dev, master_port, &master_data); |
| 89 | 81 | ||
| @@ -113,6 +105,13 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio) | |||
| 113 | spin_unlock_irqrestore(&tune_lock, flags); | 105 | spin_unlock_irqrestore(&tune_lock, flags); |
| 114 | } | 106 | } |
| 115 | 107 | ||
| 108 | static void it8213_tuneproc(ide_drive_t *drive, u8 pio) | ||
| 109 | { | ||
| 110 | pio = ide_get_best_pio_mode(drive, pio, 4); | ||
| 111 | it8213_tune_pio(drive, pio); | ||
| 112 | ide_config_drive_speed(drive, XFER_PIO_0 + pio); | ||
| 113 | } | ||
| 114 | |||
| 116 | /** | 115 | /** |
| 117 | * it8213_tune_chipset - set controller timings | 116 | * it8213_tune_chipset - set controller timings |
| 118 | * @drive: Drive to set up | 117 | * @drive: Drive to set up |
| @@ -193,7 +192,12 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 193 | if (reg55 & w_flag) | 192 | if (reg55 & w_flag) |
| 194 | pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag); | 193 | pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag); |
| 195 | } | 194 | } |
| 196 | it8213_tuneproc(drive, it8213_dma_2_pio(speed)); | 195 | |
| 196 | if (speed > XFER_PIO_4) | ||
| 197 | it8213_tune_pio(drive, it8213_dma_2_pio(speed)); | ||
| 198 | else | ||
| 199 | it8213_tune_pio(drive, speed - XFER_PIO_0); | ||
| 200 | |||
| 197 | return ide_config_drive_speed(drive, speed); | 201 | return ide_config_drive_speed(drive, speed); |
| 198 | } | 202 | } |
| 199 | 203 | ||
| @@ -209,13 +213,10 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 209 | 213 | ||
| 210 | static int it8213_config_drive_for_dma (ide_drive_t *drive) | 214 | static int it8213_config_drive_for_dma (ide_drive_t *drive) |
| 211 | { | 215 | { |
| 212 | u8 pio; | ||
| 213 | |||
| 214 | if (ide_tune_dma(drive)) | 216 | if (ide_tune_dma(drive)) |
| 215 | return 0; | 217 | return 0; |
| 216 | 218 | ||
| 217 | pio = ide_get_best_pio_mode(drive, 255, 4); | 219 | it8213_tuneproc(drive, 255); |
| 218 | it8213_tune_chipset(drive, XFER_PIO_0 + pio); | ||
| 219 | 220 | ||
| 220 | return -1; | 221 | return -1; |
| 221 | } | 222 | } |
