diff options
Diffstat (limited to 'drivers/scsi/ata_piix.c')
-rw-r--r-- | drivers/scsi/ata_piix.c | 392 |
1 files changed, 270 insertions, 122 deletions
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index fc3ca051ceed..9327b62f97de 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
@@ -101,36 +101,54 @@ enum { | |||
101 | ICH5_PCS = 0x92, /* port control and status */ | 101 | ICH5_PCS = 0x92, /* port control and status */ |
102 | PIIX_SCC = 0x0A, /* sub-class code register */ | 102 | PIIX_SCC = 0x0A, /* sub-class code register */ |
103 | 103 | ||
104 | PIIX_FLAG_AHCI = (1 << 28), /* AHCI possible */ | 104 | PIIX_FLAG_IGNORE_PCS = (1 << 25), /* ignore PCS present bits */ |
105 | PIIX_FLAG_CHECKINTR = (1 << 29), /* make sure PCI INTx enabled */ | 105 | PIIX_FLAG_SCR = (1 << 26), /* SCR available */ |
106 | PIIX_FLAG_COMBINED = (1 << 30), /* combined mode possible */ | 106 | PIIX_FLAG_AHCI = (1 << 27), /* AHCI possible */ |
107 | PIIX_FLAG_CHECKINTR = (1 << 28), /* make sure PCI INTx enabled */ | ||
108 | PIIX_FLAG_COMBINED = (1 << 29), /* combined mode possible */ | ||
109 | /* ICH6/7 use different scheme for map value */ | ||
110 | PIIX_FLAG_COMBINED_ICH6 = PIIX_FLAG_COMBINED | (1 << 30), | ||
107 | 111 | ||
108 | /* combined mode. if set, PATA is channel 0. | 112 | /* combined mode. if set, PATA is channel 0. |
109 | * if clear, PATA is channel 1. | 113 | * if clear, PATA is channel 1. |
110 | */ | 114 | */ |
111 | PIIX_COMB_PATA_P0 = (1 << 1), | ||
112 | PIIX_COMB = (1 << 2), /* combined mode enabled? */ | ||
113 | |||
114 | PIIX_PORT_ENABLED = (1 << 0), | 115 | PIIX_PORT_ENABLED = (1 << 0), |
115 | PIIX_PORT_PRESENT = (1 << 4), | 116 | PIIX_PORT_PRESENT = (1 << 4), |
116 | 117 | ||
117 | PIIX_80C_PRI = (1 << 5) | (1 << 4), | 118 | PIIX_80C_PRI = (1 << 5) | (1 << 4), |
118 | PIIX_80C_SEC = (1 << 7) | (1 << 6), | 119 | PIIX_80C_SEC = (1 << 7) | (1 << 6), |
119 | 120 | ||
120 | ich5_pata = 0, | 121 | /* controller IDs */ |
121 | ich5_sata = 1, | 122 | piix4_pata = 0, |
122 | piix4_pata = 2, | 123 | ich5_pata = 1, |
123 | ich6_sata = 3, | 124 | ich5_sata = 2, |
124 | ich6_sata_ahci = 4, | 125 | esb_sata = 3, |
126 | ich6_sata = 4, | ||
127 | ich6_sata_ahci = 5, | ||
128 | ich6m_sata_ahci = 6, | ||
129 | |||
130 | /* constants for mapping table */ | ||
131 | P0 = 0, /* port 0 */ | ||
132 | P1 = 1, /* port 1 */ | ||
133 | P2 = 2, /* port 2 */ | ||
134 | P3 = 3, /* port 3 */ | ||
135 | IDE = -1, /* IDE */ | ||
136 | NA = -2, /* not avaliable */ | ||
137 | RV = -3, /* reserved */ | ||
125 | 138 | ||
126 | PIIX_AHCI_DEVICE = 6, | 139 | PIIX_AHCI_DEVICE = 6, |
127 | }; | 140 | }; |
128 | 141 | ||
142 | struct piix_map_db { | ||
143 | const u32 mask; | ||
144 | const int map[][4]; | ||
145 | }; | ||
146 | |||
129 | static int piix_init_one (struct pci_dev *pdev, | 147 | static int piix_init_one (struct pci_dev *pdev, |
130 | const struct pci_device_id *ent); | 148 | const struct pci_device_id *ent); |
131 | 149 | ||
132 | static void piix_pata_phy_reset(struct ata_port *ap); | 150 | static int piix_pata_probe_reset(struct ata_port *ap, unsigned int *classes); |
133 | static void piix_sata_phy_reset(struct ata_port *ap); | 151 | static int piix_sata_probe_reset(struct ata_port *ap, unsigned int *classes); |
134 | static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev); | 152 | static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev); |
135 | static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev); | 153 | static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev); |
136 | 154 | ||
@@ -147,19 +165,32 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
147 | * list in drivers/pci/quirks.c. | 165 | * list in drivers/pci/quirks.c. |
148 | */ | 166 | */ |
149 | 167 | ||
168 | /* 82801EB (ICH5) */ | ||
150 | { 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, | 169 | { 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, |
170 | /* 82801EB (ICH5) */ | ||
151 | { 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, | 171 | { 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, |
152 | { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, | 172 | /* 6300ESB (ICH5 variant with broken PCS present bits) */ |
153 | { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, | 173 | { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb_sata }, |
174 | /* 6300ESB pretending RAID */ | ||
175 | { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb_sata }, | ||
176 | /* 82801FB/FW (ICH6/ICH6W) */ | ||
154 | { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, | 177 | { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, |
178 | /* 82801FR/FRW (ICH6R/ICH6RW) */ | ||
155 | { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 179 | { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
156 | { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 180 | /* 82801FBM ICH6M (ICH6R with only port 0 and 2 implemented) */ |
181 | { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, | ||
182 | /* 82801GB/GR/GH (ICH7, identical to ICH6) */ | ||
157 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 183 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
158 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 184 | /* 2801GBM/GHM (ICH7M, identical to ICH6M) */ |
185 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, | ||
186 | /* Enterprise Southbridge 2 (where's the datasheet?) */ | ||
159 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 187 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
188 | /* SATA Controller 1 IDE (ICH8, no datasheet yet) */ | ||
160 | { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 189 | { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
190 | /* SATA Controller 2 IDE (ICH8, ditto) */ | ||
161 | { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 191 | { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
162 | { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 192 | /* Mobile SATA Controller IDE (ICH8M, ditto) */ |
193 | { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, | ||
163 | 194 | ||
164 | { } /* terminate list */ | 195 | { } /* terminate list */ |
165 | }; | 196 | }; |
@@ -178,11 +209,11 @@ static struct scsi_host_template piix_sht = { | |||
178 | .name = DRV_NAME, | 209 | .name = DRV_NAME, |
179 | .ioctl = ata_scsi_ioctl, | 210 | .ioctl = ata_scsi_ioctl, |
180 | .queuecommand = ata_scsi_queuecmd, | 211 | .queuecommand = ata_scsi_queuecmd, |
212 | .eh_timed_out = ata_scsi_timed_out, | ||
181 | .eh_strategy_handler = ata_scsi_error, | 213 | .eh_strategy_handler = ata_scsi_error, |
182 | .can_queue = ATA_DEF_QUEUE, | 214 | .can_queue = ATA_DEF_QUEUE, |
183 | .this_id = ATA_SHT_THIS_ID, | 215 | .this_id = ATA_SHT_THIS_ID, |
184 | .sg_tablesize = LIBATA_MAX_PRD, | 216 | .sg_tablesize = LIBATA_MAX_PRD, |
185 | .max_sectors = ATA_MAX_SECTORS, | ||
186 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, | 217 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, |
187 | .emulated = ATA_SHT_EMULATED, | 218 | .emulated = ATA_SHT_EMULATED, |
188 | .use_clustering = ATA_SHT_USE_CLUSTERING, | 219 | .use_clustering = ATA_SHT_USE_CLUSTERING, |
@@ -205,7 +236,7 @@ static const struct ata_port_operations piix_pata_ops = { | |||
205 | .exec_command = ata_exec_command, | 236 | .exec_command = ata_exec_command, |
206 | .dev_select = ata_std_dev_select, | 237 | .dev_select = ata_std_dev_select, |
207 | 238 | ||
208 | .phy_reset = piix_pata_phy_reset, | 239 | .probe_reset = piix_pata_probe_reset, |
209 | 240 | ||
210 | .bmdma_setup = ata_bmdma_setup, | 241 | .bmdma_setup = ata_bmdma_setup, |
211 | .bmdma_start = ata_bmdma_start, | 242 | .bmdma_start = ata_bmdma_start, |
@@ -233,7 +264,7 @@ static const struct ata_port_operations piix_sata_ops = { | |||
233 | .exec_command = ata_exec_command, | 264 | .exec_command = ata_exec_command, |
234 | .dev_select = ata_std_dev_select, | 265 | .dev_select = ata_std_dev_select, |
235 | 266 | ||
236 | .phy_reset = piix_sata_phy_reset, | 267 | .probe_reset = piix_sata_probe_reset, |
237 | 268 | ||
238 | .bmdma_setup = ata_bmdma_setup, | 269 | .bmdma_setup = ata_bmdma_setup, |
239 | .bmdma_start = ata_bmdma_start, | 270 | .bmdma_start = ata_bmdma_start, |
@@ -252,12 +283,62 @@ static const struct ata_port_operations piix_sata_ops = { | |||
252 | .host_stop = ata_host_stop, | 283 | .host_stop = ata_host_stop, |
253 | }; | 284 | }; |
254 | 285 | ||
286 | static struct piix_map_db ich5_map_db = { | ||
287 | .mask = 0x7, | ||
288 | .map = { | ||
289 | /* PM PS SM SS MAP */ | ||
290 | { P0, NA, P1, NA }, /* 000b */ | ||
291 | { P1, NA, P0, NA }, /* 001b */ | ||
292 | { RV, RV, RV, RV }, | ||
293 | { RV, RV, RV, RV }, | ||
294 | { P0, P1, IDE, IDE }, /* 100b */ | ||
295 | { P1, P0, IDE, IDE }, /* 101b */ | ||
296 | { IDE, IDE, P0, P1 }, /* 110b */ | ||
297 | { IDE, IDE, P1, P0 }, /* 111b */ | ||
298 | }, | ||
299 | }; | ||
300 | |||
301 | static struct piix_map_db ich6_map_db = { | ||
302 | .mask = 0x3, | ||
303 | .map = { | ||
304 | /* PM PS SM SS MAP */ | ||
305 | { P0, P1, P2, P3 }, /* 00b */ | ||
306 | { IDE, IDE, P1, P3 }, /* 01b */ | ||
307 | { P0, P2, IDE, IDE }, /* 10b */ | ||
308 | { RV, RV, RV, RV }, | ||
309 | }, | ||
310 | }; | ||
311 | |||
312 | static struct piix_map_db ich6m_map_db = { | ||
313 | .mask = 0x3, | ||
314 | .map = { | ||
315 | /* PM PS SM SS MAP */ | ||
316 | { P0, P1, P2, P3 }, /* 00b */ | ||
317 | { RV, RV, RV, RV }, | ||
318 | { P0, P2, IDE, IDE }, /* 10b */ | ||
319 | { RV, RV, RV, RV }, | ||
320 | }, | ||
321 | }; | ||
322 | |||
255 | static struct ata_port_info piix_port_info[] = { | 323 | static struct ata_port_info piix_port_info[] = { |
324 | /* piix4_pata */ | ||
325 | { | ||
326 | .sht = &piix_sht, | ||
327 | .host_flags = ATA_FLAG_SLAVE_POSS, | ||
328 | .pio_mask = 0x1f, /* pio0-4 */ | ||
329 | #if 0 | ||
330 | .mwdma_mask = 0x06, /* mwdma1-2 */ | ||
331 | #else | ||
332 | .mwdma_mask = 0x00, /* mwdma broken */ | ||
333 | #endif | ||
334 | .udma_mask = ATA_UDMA_MASK_40C, | ||
335 | .port_ops = &piix_pata_ops, | ||
336 | }, | ||
337 | |||
256 | /* ich5_pata */ | 338 | /* ich5_pata */ |
257 | { | 339 | { |
258 | .sht = &piix_sht, | 340 | .sht = &piix_sht, |
259 | .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | | 341 | .host_flags = ATA_FLAG_SLAVE_POSS | PIIX_FLAG_CHECKINTR, |
260 | PIIX_FLAG_CHECKINTR, | ||
261 | .pio_mask = 0x1f, /* pio0-4 */ | 342 | .pio_mask = 0x1f, /* pio0-4 */ |
262 | #if 0 | 343 | #if 0 |
263 | .mwdma_mask = 0x06, /* mwdma1-2 */ | 344 | .mwdma_mask = 0x06, /* mwdma1-2 */ |
@@ -271,50 +352,63 @@ static struct ata_port_info piix_port_info[] = { | |||
271 | /* ich5_sata */ | 352 | /* ich5_sata */ |
272 | { | 353 | { |
273 | .sht = &piix_sht, | 354 | .sht = &piix_sht, |
274 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | | 355 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED | |
275 | PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR, | 356 | PIIX_FLAG_CHECKINTR, |
276 | .pio_mask = 0x1f, /* pio0-4 */ | 357 | .pio_mask = 0x1f, /* pio0-4 */ |
277 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 358 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
278 | .udma_mask = 0x7f, /* udma0-6 */ | 359 | .udma_mask = 0x7f, /* udma0-6 */ |
279 | .port_ops = &piix_sata_ops, | 360 | .port_ops = &piix_sata_ops, |
361 | .private_data = &ich5_map_db, | ||
280 | }, | 362 | }, |
281 | 363 | ||
282 | /* piix4_pata */ | 364 | /* i6300esb_sata */ |
283 | { | 365 | { |
284 | .sht = &piix_sht, | 366 | .sht = &piix_sht, |
285 | .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, | 367 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED | |
368 | PIIX_FLAG_CHECKINTR | PIIX_FLAG_IGNORE_PCS, | ||
286 | .pio_mask = 0x1f, /* pio0-4 */ | 369 | .pio_mask = 0x1f, /* pio0-4 */ |
287 | #if 0 | 370 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
288 | .mwdma_mask = 0x06, /* mwdma1-2 */ | 371 | .udma_mask = 0x7f, /* udma0-6 */ |
289 | #else | 372 | .port_ops = &piix_sata_ops, |
290 | .mwdma_mask = 0x00, /* mwdma broken */ | 373 | .private_data = &ich5_map_db, |
291 | #endif | ||
292 | .udma_mask = ATA_UDMA_MASK_40C, | ||
293 | .port_ops = &piix_pata_ops, | ||
294 | }, | 374 | }, |
295 | 375 | ||
296 | /* ich6_sata */ | 376 | /* ich6_sata */ |
297 | { | 377 | { |
298 | .sht = &piix_sht, | 378 | .sht = &piix_sht, |
299 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | | 379 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | |
300 | PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | | 380 | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR, |
301 | ATA_FLAG_SLAVE_POSS, | ||
302 | .pio_mask = 0x1f, /* pio0-4 */ | 381 | .pio_mask = 0x1f, /* pio0-4 */ |
303 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 382 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
304 | .udma_mask = 0x7f, /* udma0-6 */ | 383 | .udma_mask = 0x7f, /* udma0-6 */ |
305 | .port_ops = &piix_sata_ops, | 384 | .port_ops = &piix_sata_ops, |
385 | .private_data = &ich6_map_db, | ||
306 | }, | 386 | }, |
307 | 387 | ||
308 | /* ich6_sata_ahci */ | 388 | /* ich6_sata_ahci */ |
309 | { | 389 | { |
310 | .sht = &piix_sht, | 390 | .sht = &piix_sht, |
311 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | | 391 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | |
312 | PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | | 392 | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | |
313 | ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI, | 393 | PIIX_FLAG_AHCI, |
394 | .pio_mask = 0x1f, /* pio0-4 */ | ||
395 | .mwdma_mask = 0x07, /* mwdma0-2 */ | ||
396 | .udma_mask = 0x7f, /* udma0-6 */ | ||
397 | .port_ops = &piix_sata_ops, | ||
398 | .private_data = &ich6_map_db, | ||
399 | }, | ||
400 | |||
401 | /* ich6m_sata_ahci */ | ||
402 | { | ||
403 | .sht = &piix_sht, | ||
404 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | | ||
405 | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | | ||
406 | PIIX_FLAG_AHCI, | ||
314 | .pio_mask = 0x1f, /* pio0-4 */ | 407 | .pio_mask = 0x1f, /* pio0-4 */ |
315 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 408 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
316 | .udma_mask = 0x7f, /* udma0-6 */ | 409 | .udma_mask = 0x7f, /* udma0-6 */ |
317 | .port_ops = &piix_sata_ops, | 410 | .port_ops = &piix_sata_ops, |
411 | .private_data = &ich6m_map_db, | ||
318 | }, | 412 | }, |
319 | }; | 413 | }; |
320 | 414 | ||
@@ -363,102 +457,123 @@ cbl40: | |||
363 | } | 457 | } |
364 | 458 | ||
365 | /** | 459 | /** |
366 | * piix_pata_phy_reset - Probe specified port on PATA host controller | 460 | * piix_pata_probeinit - probeinit for PATA host controller |
367 | * @ap: Port to probe | 461 | * @ap: Target port |
368 | * | 462 | * |
369 | * Probe PATA phy. | 463 | * Probeinit including cable detection. |
370 | * | 464 | * |
371 | * LOCKING: | 465 | * LOCKING: |
372 | * None (inherited from caller). | 466 | * None (inherited from caller). |
373 | */ | 467 | */ |
468 | static void piix_pata_probeinit(struct ata_port *ap) | ||
469 | { | ||
470 | piix_pata_cbl_detect(ap); | ||
471 | ata_std_probeinit(ap); | ||
472 | } | ||
374 | 473 | ||
375 | static void piix_pata_phy_reset(struct ata_port *ap) | 474 | /** |
475 | * piix_pata_probe_reset - Perform reset on PATA port and classify | ||
476 | * @ap: Port to reset | ||
477 | * @classes: Resulting classes of attached devices | ||
478 | * | ||
479 | * Reset PATA phy and classify attached devices. | ||
480 | * | ||
481 | * LOCKING: | ||
482 | * None (inherited from caller). | ||
483 | */ | ||
484 | static int piix_pata_probe_reset(struct ata_port *ap, unsigned int *classes) | ||
376 | { | 485 | { |
377 | struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); | 486 | struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); |
378 | 487 | ||
379 | if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->hard_port_no])) { | 488 | if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->hard_port_no])) { |
380 | ata_port_disable(ap); | ||
381 | printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id); | 489 | printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id); |
382 | return; | 490 | return 0; |
383 | } | 491 | } |
384 | 492 | ||
385 | piix_pata_cbl_detect(ap); | 493 | return ata_drive_probe_reset(ap, piix_pata_probeinit, |
386 | 494 | ata_std_softreset, NULL, | |
387 | ata_port_probe(ap); | 495 | ata_std_postreset, classes); |
388 | |||
389 | ata_bus_reset(ap); | ||
390 | } | 496 | } |
391 | 497 | ||
392 | /** | 498 | /** |
393 | * piix_sata_probe - Probe PCI device for present SATA devices | 499 | * piix_sata_probe - Probe PCI device for present SATA devices |
394 | * @ap: Port associated with the PCI device we wish to probe | 500 | * @ap: Port associated with the PCI device we wish to probe |
395 | * | 501 | * |
396 | * Reads SATA PCI device's PCI config register Port Configuration | 502 | * Reads and configures SATA PCI device's PCI config register |
397 | * and Status (PCS) to determine port and device availability. | 503 | * Port Configuration and Status (PCS) to determine port and |
504 | * device availability. | ||
398 | * | 505 | * |
399 | * LOCKING: | 506 | * LOCKING: |
400 | * None (inherited from caller). | 507 | * None (inherited from caller). |
401 | * | 508 | * |
402 | * RETURNS: | 509 | * RETURNS: |
403 | * Non-zero if port is enabled, it may or may not have a device | 510 | * Mask of avaliable devices on the port. |
404 | * attached in that case (PRESENT bit would only be set if BIOS probe | ||
405 | * was done). Zero is returned if port is disabled. | ||
406 | */ | 511 | */ |
407 | static int piix_sata_probe (struct ata_port *ap) | 512 | static unsigned int piix_sata_probe (struct ata_port *ap) |
408 | { | 513 | { |
409 | struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); | 514 | struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); |
410 | int combined = (ap->flags & ATA_FLAG_SLAVE_POSS); | 515 | const unsigned int *map = ap->host_set->private_data; |
411 | int orig_mask, mask, i; | 516 | int base = 2 * ap->hard_port_no; |
517 | unsigned int present_mask = 0; | ||
518 | int port, i; | ||
412 | u8 pcs; | 519 | u8 pcs; |
413 | 520 | ||
414 | mask = (PIIX_PORT_PRESENT << ap->hard_port_no) | | ||
415 | (PIIX_PORT_ENABLED << ap->hard_port_no); | ||
416 | |||
417 | pci_read_config_byte(pdev, ICH5_PCS, &pcs); | 521 | pci_read_config_byte(pdev, ICH5_PCS, &pcs); |
418 | orig_mask = (int) pcs & 0xff; | 522 | DPRINTK("ata%u: ENTER, pcs=0x%x base=%d\n", ap->id, pcs, base); |
419 | |||
420 | /* TODO: this is vaguely wrong for ICH6 combined mode, | ||
421 | * where only two of the four SATA ports are mapped | ||
422 | * onto a single ATA channel. It is also vaguely inaccurate | ||
423 | * for ICH5, which has only two ports. However, this is ok, | ||
424 | * as further device presence detection code will handle | ||
425 | * any false positives produced here. | ||
426 | */ | ||
427 | 523 | ||
428 | for (i = 0; i < 4; i++) { | 524 | /* enable all ports on this ap and wait for them to settle */ |
429 | mask = (PIIX_PORT_ENABLED << i); | 525 | for (i = 0; i < 2; i++) { |
526 | port = map[base + i]; | ||
527 | if (port >= 0) | ||
528 | pcs |= 1 << port; | ||
529 | } | ||
530 | |||
531 | pci_write_config_byte(pdev, ICH5_PCS, pcs); | ||
532 | msleep(100); | ||
430 | 533 | ||
431 | if ((orig_mask & mask) == mask) | 534 | /* let's see which devices are present */ |
432 | if (combined || (i == ap->hard_port_no)) | 535 | pci_read_config_byte(pdev, ICH5_PCS, &pcs); |
433 | return 1; | 536 | |
537 | for (i = 0; i < 2; i++) { | ||
538 | port = map[base + i]; | ||
539 | if (port < 0) | ||
540 | continue; | ||
541 | if (ap->flags & PIIX_FLAG_IGNORE_PCS || pcs & 1 << (4 + port)) | ||
542 | present_mask |= 1 << i; | ||
543 | else | ||
544 | pcs &= ~(1 << port); | ||
434 | } | 545 | } |
435 | 546 | ||
436 | return 0; | 547 | /* disable offline ports on non-AHCI controllers */ |
548 | if (!(ap->flags & PIIX_FLAG_AHCI)) | ||
549 | pci_write_config_byte(pdev, ICH5_PCS, pcs); | ||
550 | |||
551 | DPRINTK("ata%u: LEAVE, pcs=0x%x present_mask=0x%x\n", | ||
552 | ap->id, pcs, present_mask); | ||
553 | |||
554 | return present_mask; | ||
437 | } | 555 | } |
438 | 556 | ||
439 | /** | 557 | /** |
440 | * piix_sata_phy_reset - Probe specified port on SATA host controller | 558 | * piix_sata_probe_reset - Perform reset on SATA port and classify |
441 | * @ap: Port to probe | 559 | * @ap: Port to reset |
560 | * @classes: Resulting classes of attached devices | ||
442 | * | 561 | * |
443 | * Probe SATA phy. | 562 | * Reset SATA phy and classify attached devices. |
444 | * | 563 | * |
445 | * LOCKING: | 564 | * LOCKING: |
446 | * None (inherited from caller). | 565 | * None (inherited from caller). |
447 | */ | 566 | */ |
448 | 567 | static int piix_sata_probe_reset(struct ata_port *ap, unsigned int *classes) | |
449 | static void piix_sata_phy_reset(struct ata_port *ap) | ||
450 | { | 568 | { |
451 | if (!piix_sata_probe(ap)) { | 569 | if (!piix_sata_probe(ap)) { |
452 | ata_port_disable(ap); | ||
453 | printk(KERN_INFO "ata%u: SATA port has no device.\n", ap->id); | 570 | printk(KERN_INFO "ata%u: SATA port has no device.\n", ap->id); |
454 | return; | 571 | return 0; |
455 | } | 572 | } |
456 | 573 | ||
457 | ap->cbl = ATA_CBL_SATA; | 574 | return ata_drive_probe_reset(ap, ata_std_probeinit, |
458 | 575 | ata_std_softreset, NULL, | |
459 | ata_port_probe(ap); | 576 | ata_std_postreset, classes); |
460 | |||
461 | ata_bus_reset(ap); | ||
462 | } | 577 | } |
463 | 578 | ||
464 | /** | 579 | /** |
@@ -627,6 +742,7 @@ static int piix_disable_ahci(struct pci_dev *pdev) | |||
627 | 742 | ||
628 | /** | 743 | /** |
629 | * piix_check_450nx_errata - Check for problem 450NX setup | 744 | * piix_check_450nx_errata - Check for problem 450NX setup |
745 | * @ata_dev: the PCI device to check | ||
630 | * | 746 | * |
631 | * Check for the present of 450NX errata #19 and errata #25. If | 747 | * Check for the present of 450NX errata #19 and errata #25. If |
632 | * they are found return an error code so we can turn off DMA | 748 | * they are found return an error code so we can turn off DMA |
@@ -659,6 +775,54 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) | |||
659 | return no_piix_dma; | 775 | return no_piix_dma; |
660 | } | 776 | } |
661 | 777 | ||
778 | static void __devinit piix_init_sata_map(struct pci_dev *pdev, | ||
779 | struct ata_port_info *pinfo) | ||
780 | { | ||
781 | struct piix_map_db *map_db = pinfo[0].private_data; | ||
782 | const unsigned int *map; | ||
783 | int i, invalid_map = 0; | ||
784 | u8 map_value; | ||
785 | |||
786 | pci_read_config_byte(pdev, ICH5_PMR, &map_value); | ||
787 | |||
788 | map = map_db->map[map_value & map_db->mask]; | ||
789 | |||
790 | dev_printk(KERN_INFO, &pdev->dev, "MAP ["); | ||
791 | for (i = 0; i < 4; i++) { | ||
792 | switch (map[i]) { | ||
793 | case RV: | ||
794 | invalid_map = 1; | ||
795 | printk(" XX"); | ||
796 | break; | ||
797 | |||
798 | case NA: | ||
799 | printk(" --"); | ||
800 | break; | ||
801 | |||
802 | case IDE: | ||
803 | WARN_ON((i & 1) || map[i + 1] != IDE); | ||
804 | pinfo[i / 2] = piix_port_info[ich5_pata]; | ||
805 | i++; | ||
806 | printk(" IDE IDE"); | ||
807 | break; | ||
808 | |||
809 | default: | ||
810 | printk(" P%d", map[i]); | ||
811 | if (i & 1) | ||
812 | pinfo[i / 2].host_flags |= ATA_FLAG_SLAVE_POSS; | ||
813 | break; | ||
814 | } | ||
815 | } | ||
816 | printk(" ]\n"); | ||
817 | |||
818 | if (invalid_map) | ||
819 | dev_printk(KERN_ERR, &pdev->dev, | ||
820 | "invalid MAP value %u\n", map_value); | ||
821 | |||
822 | pinfo[0].private_data = (void *)map; | ||
823 | pinfo[1].private_data = (void *)map; | ||
824 | } | ||
825 | |||
662 | /** | 826 | /** |
663 | * piix_init_one - Register PIIX ATA PCI device with kernel services | 827 | * piix_init_one - Register PIIX ATA PCI device with kernel services |
664 | * @pdev: PCI device to register | 828 | * @pdev: PCI device to register |
@@ -677,9 +841,9 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) | |||
677 | static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | 841 | static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) |
678 | { | 842 | { |
679 | static int printed_version; | 843 | static int printed_version; |
680 | struct ata_port_info *port_info[2]; | 844 | struct ata_port_info port_info[2]; |
681 | unsigned int combined = 0; | 845 | struct ata_port_info *ppinfo[2] = { &port_info[0], &port_info[1] }; |
682 | unsigned int pata_chan = 0, sata_chan = 0; | 846 | unsigned long host_flags; |
683 | 847 | ||
684 | if (!printed_version++) | 848 | if (!printed_version++) |
685 | dev_printk(KERN_DEBUG, &pdev->dev, | 849 | dev_printk(KERN_DEBUG, &pdev->dev, |
@@ -689,10 +853,12 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
689 | if (!in_module_init) | 853 | if (!in_module_init) |
690 | return -ENODEV; | 854 | return -ENODEV; |
691 | 855 | ||
692 | port_info[0] = &piix_port_info[ent->driver_data]; | 856 | port_info[0] = piix_port_info[ent->driver_data]; |
693 | port_info[1] = &piix_port_info[ent->driver_data]; | 857 | port_info[1] = piix_port_info[ent->driver_data]; |
858 | |||
859 | host_flags = port_info[0].host_flags; | ||
694 | 860 | ||
695 | if (port_info[0]->host_flags & PIIX_FLAG_AHCI) { | 861 | if (host_flags & PIIX_FLAG_AHCI) { |
696 | u8 tmp; | 862 | u8 tmp; |
697 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); | 863 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); |
698 | if (tmp == PIIX_AHCI_DEVICE) { | 864 | if (tmp == PIIX_AHCI_DEVICE) { |
@@ -702,18 +868,9 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
702 | } | 868 | } |
703 | } | 869 | } |
704 | 870 | ||
705 | if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) { | 871 | /* Initialize SATA map */ |
706 | u8 tmp; | 872 | if (host_flags & ATA_FLAG_SATA) |
707 | pci_read_config_byte(pdev, ICH5_PMR, &tmp); | 873 | piix_init_sata_map(pdev, port_info); |
708 | |||
709 | if (tmp & PIIX_COMB) { | ||
710 | combined = 1; | ||
711 | if (tmp & PIIX_COMB_PATA_P0) | ||
712 | sata_chan = 1; | ||
713 | else | ||
714 | pata_chan = 1; | ||
715 | } | ||
716 | } | ||
717 | 874 | ||
718 | /* On ICH5, some BIOSen disable the interrupt using the | 875 | /* On ICH5, some BIOSen disable the interrupt using the |
719 | * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3. | 876 | * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3. |
@@ -721,28 +878,19 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
721 | * MSI is disabled (and it is disabled, as we don't use | 878 | * MSI is disabled (and it is disabled, as we don't use |
722 | * message-signalled interrupts currently). | 879 | * message-signalled interrupts currently). |
723 | */ | 880 | */ |
724 | if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR) | 881 | if (host_flags & PIIX_FLAG_CHECKINTR) |
725 | pci_intx(pdev, 1); | 882 | pci_intx(pdev, 1); |
726 | 883 | ||
727 | if (combined) { | ||
728 | port_info[sata_chan] = &piix_port_info[ent->driver_data]; | ||
729 | port_info[sata_chan]->host_flags |= ATA_FLAG_SLAVE_POSS; | ||
730 | port_info[pata_chan] = &piix_port_info[ich5_pata]; | ||
731 | |||
732 | dev_printk(KERN_WARNING, &pdev->dev, | ||
733 | "combined mode detected (p=%u, s=%u)\n", | ||
734 | pata_chan, sata_chan); | ||
735 | } | ||
736 | if (piix_check_450nx_errata(pdev)) { | 884 | if (piix_check_450nx_errata(pdev)) { |
737 | /* This writes into the master table but it does not | 885 | /* This writes into the master table but it does not |
738 | really matter for this errata as we will apply it to | 886 | really matter for this errata as we will apply it to |
739 | all the PIIX devices on the board */ | 887 | all the PIIX devices on the board */ |
740 | port_info[0]->mwdma_mask = 0; | 888 | port_info[0].mwdma_mask = 0; |
741 | port_info[0]->udma_mask = 0; | 889 | port_info[0].udma_mask = 0; |
742 | port_info[1]->mwdma_mask = 0; | 890 | port_info[1].mwdma_mask = 0; |
743 | port_info[1]->udma_mask = 0; | 891 | port_info[1].udma_mask = 0; |
744 | } | 892 | } |
745 | return ata_pci_init_one(pdev, port_info, 2); | 893 | return ata_pci_init_one(pdev, ppinfo, 2); |
746 | } | 894 | } |
747 | 895 | ||
748 | static int __init piix_init(void) | 896 | static int __init piix_init(void) |