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/ide | |
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/ide')
-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 | } |