diff options
Diffstat (limited to 'drivers/ide/pci/siimage.c')
| -rw-r--r-- | drivers/ide/pci/siimage.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 79cec50a242f..d09e74c2996e 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
| @@ -122,45 +122,41 @@ static inline unsigned long siimage_seldev(ide_drive_t *drive, int r) | |||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | /** | 124 | /** |
| 125 | * siimage_ratemask - Compute available modes | 125 | * sil_udma_filter - compute UDMA mask |
| 126 | * @drive: IDE drive | 126 | * @drive: IDE device |
| 127 | * | ||
| 128 | * Compute the available UDMA speeds for the device on the interface. | ||
| 127 | * | 129 | * |
| 128 | * Compute the available speeds for the devices on the interface. | ||
| 129 | * For the CMD680 this depends on the clocking mode (scsc), for the | 130 | * For the CMD680 this depends on the clocking mode (scsc), for the |
| 130 | * SI3312 SATA controller life is a bit simpler. Enforce UDMA33 | 131 | * SI3112 SATA controller life is a bit simpler. |
| 131 | * as a limit if there is no 80pin cable present. | ||
| 132 | */ | 132 | */ |
| 133 | 133 | ||
| 134 | static byte siimage_ratemask (ide_drive_t *drive) | 134 | static u8 sil_udma_filter(ide_drive_t *drive) |
| 135 | { | 135 | { |
| 136 | ide_hwif_t *hwif = HWIF(drive); | 136 | ide_hwif_t *hwif = drive->hwif; |
| 137 | u8 mode = 0, scsc = 0; | ||
| 138 | unsigned long base = (unsigned long) hwif->hwif_data; | 137 | unsigned long base = (unsigned long) hwif->hwif_data; |
| 138 | u8 mask = 0, scsc = 0; | ||
| 139 | 139 | ||
| 140 | if (hwif->mmio) | 140 | if (hwif->mmio) |
| 141 | scsc = hwif->INB(base + 0x4A); | 141 | scsc = hwif->INB(base + 0x4A); |
| 142 | else | 142 | else |
| 143 | pci_read_config_byte(hwif->pci_dev, 0x8A, &scsc); | 143 | pci_read_config_byte(hwif->pci_dev, 0x8A, &scsc); |
| 144 | 144 | ||
| 145 | if(is_sata(hwif)) | 145 | if (is_sata(hwif)) { |
| 146 | { | 146 | mask = strstr(drive->id->model, "Maxtor") ? 0x3f : 0x7f; |
| 147 | if(strstr(drive->id->model, "Maxtor")) | 147 | goto out; |
| 148 | return 3; | ||
| 149 | return 4; | ||
| 150 | } | 148 | } |
| 151 | 149 | ||
| 152 | if ((scsc & 0x30) == 0x10) /* 133 */ | 150 | if ((scsc & 0x30) == 0x10) /* 133 */ |
| 153 | mode = 4; | 151 | mask = 0x7f; |
| 154 | else if ((scsc & 0x30) == 0x20) /* 2xPCI */ | 152 | else if ((scsc & 0x30) == 0x20) /* 2xPCI */ |
| 155 | mode = 4; | 153 | mask = 0x7f; |
| 156 | else if ((scsc & 0x30) == 0x00) /* 100 */ | 154 | else if ((scsc & 0x30) == 0x00) /* 100 */ |
| 157 | mode = 3; | 155 | mask = 0x3f; |
| 158 | else /* Disabled ? */ | 156 | else /* Disabled ? */ |
| 159 | BUG(); | 157 | BUG(); |
| 160 | 158 | out: | |
| 161 | if (!eighty_ninty_three(drive)) | 159 | return mask; |
| 162 | mode = min(mode, (u8)1); | ||
| 163 | return mode; | ||
| 164 | } | 160 | } |
| 165 | 161 | ||
| 166 | /** | 162 | /** |
| @@ -306,7 +302,7 @@ static int siimage_tune_chipset (ide_drive_t *drive, byte xferspeed) | |||
| 306 | ide_hwif_t *hwif = HWIF(drive); | 302 | ide_hwif_t *hwif = HWIF(drive); |
| 307 | u16 ultra = 0, multi = 0; | 303 | u16 ultra = 0, multi = 0; |
| 308 | u8 mode = 0, unit = drive->select.b.unit; | 304 | u8 mode = 0, unit = drive->select.b.unit; |
| 309 | u8 speed = ide_rate_filter(siimage_ratemask(drive), xferspeed); | 305 | u8 speed = ide_rate_filter(drive, xferspeed); |
| 310 | unsigned long base = (unsigned long)hwif->hwif_data; | 306 | unsigned long base = (unsigned long)hwif->hwif_data; |
| 311 | u8 scsc = 0, addr_mask = ((hwif->channel) ? | 307 | u8 scsc = 0, addr_mask = ((hwif->channel) ? |
| 312 | ((hwif->mmio) ? 0xF4 : 0x84) : | 308 | ((hwif->mmio) ? 0xF4 : 0x84) : |
| @@ -389,7 +385,7 @@ static int siimage_tune_chipset (ide_drive_t *drive, byte xferspeed) | |||
| 389 | 385 | ||
| 390 | static int config_chipset_for_dma (ide_drive_t *drive) | 386 | static int config_chipset_for_dma (ide_drive_t *drive) |
| 391 | { | 387 | { |
| 392 | u8 speed = ide_dma_speed(drive, siimage_ratemask(drive)); | 388 | u8 speed = ide_max_dma_mode(drive); |
| 393 | 389 | ||
| 394 | if (!speed) | 390 | if (!speed) |
| 395 | return 0; | 391 | return 0; |
| @@ -989,6 +985,7 @@ static void __devinit init_hwif_siimage(ide_hwif_t *hwif) | |||
| 989 | hwif->tuneproc = &siimage_tuneproc; | 985 | hwif->tuneproc = &siimage_tuneproc; |
| 990 | hwif->reset_poll = &siimage_reset_poll; | 986 | hwif->reset_poll = &siimage_reset_poll; |
| 991 | hwif->pre_reset = &siimage_pre_reset; | 987 | hwif->pre_reset = &siimage_pre_reset; |
| 988 | hwif->udma_filter = &sil_udma_filter; | ||
| 992 | 989 | ||
| 993 | if(is_sata(hwif)) { | 990 | if(is_sata(hwif)) { |
| 994 | static int first = 1; | 991 | static int first = 1; |
