diff options
Diffstat (limited to 'drivers/ata/pata_serverworks.c')
-rw-r--r-- | drivers/ata/pata_serverworks.c | 114 |
1 files changed, 27 insertions, 87 deletions
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c index a589c0fa0dbb..ffd26d0dc50d 100644 --- a/drivers/ata/pata_serverworks.c +++ b/drivers/ata/pata_serverworks.c | |||
@@ -199,7 +199,7 @@ static unsigned long serverworks_osb4_filter(struct ata_device *adev, unsigned l | |||
199 | { | 199 | { |
200 | if (adev->class == ATA_DEV_ATA) | 200 | if (adev->class == ATA_DEV_ATA) |
201 | mask &= ~ATA_MASK_UDMA; | 201 | mask &= ~ATA_MASK_UDMA; |
202 | return ata_pci_default_filter(adev, mask); | 202 | return ata_bmdma_mode_filter(adev, mask); |
203 | } | 203 | } |
204 | 204 | ||
205 | 205 | ||
@@ -219,7 +219,7 @@ static unsigned long serverworks_csb_filter(struct ata_device *adev, unsigned lo | |||
219 | 219 | ||
220 | /* Disk, UDMA */ | 220 | /* Disk, UDMA */ |
221 | if (adev->class != ATA_DEV_ATA) | 221 | if (adev->class != ATA_DEV_ATA) |
222 | return ata_pci_default_filter(adev, mask); | 222 | return ata_bmdma_mode_filter(adev, mask); |
223 | 223 | ||
224 | /* Actually do need to check */ | 224 | /* Actually do need to check */ |
225 | ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num)); | 225 | ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num)); |
@@ -228,7 +228,7 @@ static unsigned long serverworks_csb_filter(struct ata_device *adev, unsigned lo | |||
228 | if (!strcmp(p, model_num)) | 228 | if (!strcmp(p, model_num)) |
229 | mask &= ~(0xE0 << ATA_SHIFT_UDMA); | 229 | mask &= ~(0xE0 << ATA_SHIFT_UDMA); |
230 | } | 230 | } |
231 | return ata_pci_default_filter(adev, mask); | 231 | return ata_bmdma_mode_filter(adev, mask); |
232 | } | 232 | } |
233 | 233 | ||
234 | /** | 234 | /** |
@@ -298,89 +298,20 @@ static void serverworks_set_dmamode(struct ata_port *ap, struct ata_device *adev | |||
298 | } | 298 | } |
299 | 299 | ||
300 | static struct scsi_host_template serverworks_sht = { | 300 | static struct scsi_host_template serverworks_sht = { |
301 | .module = THIS_MODULE, | 301 | ATA_BMDMA_SHT(DRV_NAME), |
302 | .name = DRV_NAME, | ||
303 | .ioctl = ata_scsi_ioctl, | ||
304 | .queuecommand = ata_scsi_queuecmd, | ||
305 | .can_queue = ATA_DEF_QUEUE, | ||
306 | .this_id = ATA_SHT_THIS_ID, | ||
307 | .sg_tablesize = LIBATA_MAX_PRD, | ||
308 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, | ||
309 | .emulated = ATA_SHT_EMULATED, | ||
310 | .use_clustering = ATA_SHT_USE_CLUSTERING, | ||
311 | .proc_name = DRV_NAME, | ||
312 | .dma_boundary = ATA_DMA_BOUNDARY, | ||
313 | .slave_configure = ata_scsi_slave_config, | ||
314 | .slave_destroy = ata_scsi_slave_destroy, | ||
315 | .bios_param = ata_std_bios_param, | ||
316 | }; | 302 | }; |
317 | 303 | ||
318 | static struct ata_port_operations serverworks_osb4_port_ops = { | 304 | static struct ata_port_operations serverworks_osb4_port_ops = { |
305 | .inherits = &ata_bmdma_port_ops, | ||
306 | .cable_detect = serverworks_cable_detect, | ||
307 | .mode_filter = serverworks_osb4_filter, | ||
319 | .set_piomode = serverworks_set_piomode, | 308 | .set_piomode = serverworks_set_piomode, |
320 | .set_dmamode = serverworks_set_dmamode, | 309 | .set_dmamode = serverworks_set_dmamode, |
321 | .mode_filter = serverworks_osb4_filter, | ||
322 | |||
323 | .tf_load = ata_tf_load, | ||
324 | .tf_read = ata_tf_read, | ||
325 | .check_status = ata_check_status, | ||
326 | .exec_command = ata_exec_command, | ||
327 | .dev_select = ata_std_dev_select, | ||
328 | |||
329 | .freeze = ata_bmdma_freeze, | ||
330 | .thaw = ata_bmdma_thaw, | ||
331 | .error_handler = ata_bmdma_error_handler, | ||
332 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | ||
333 | .cable_detect = serverworks_cable_detect, | ||
334 | |||
335 | .bmdma_setup = ata_bmdma_setup, | ||
336 | .bmdma_start = ata_bmdma_start, | ||
337 | .bmdma_stop = ata_bmdma_stop, | ||
338 | .bmdma_status = ata_bmdma_status, | ||
339 | |||
340 | .qc_prep = ata_qc_prep, | ||
341 | .qc_issue = ata_qc_issue_prot, | ||
342 | |||
343 | .data_xfer = ata_data_xfer, | ||
344 | |||
345 | .irq_handler = ata_interrupt, | ||
346 | .irq_clear = ata_bmdma_irq_clear, | ||
347 | .irq_on = ata_irq_on, | ||
348 | |||
349 | .port_start = ata_sff_port_start, | ||
350 | }; | 310 | }; |
351 | 311 | ||
352 | static struct ata_port_operations serverworks_csb_port_ops = { | 312 | static struct ata_port_operations serverworks_csb_port_ops = { |
353 | .set_piomode = serverworks_set_piomode, | 313 | .inherits = &serverworks_osb4_port_ops, |
354 | .set_dmamode = serverworks_set_dmamode, | ||
355 | .mode_filter = serverworks_csb_filter, | 314 | .mode_filter = serverworks_csb_filter, |
356 | |||
357 | .tf_load = ata_tf_load, | ||
358 | .tf_read = ata_tf_read, | ||
359 | .check_status = ata_check_status, | ||
360 | .exec_command = ata_exec_command, | ||
361 | .dev_select = ata_std_dev_select, | ||
362 | |||
363 | .freeze = ata_bmdma_freeze, | ||
364 | .thaw = ata_bmdma_thaw, | ||
365 | .error_handler = ata_bmdma_error_handler, | ||
366 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | ||
367 | .cable_detect = serverworks_cable_detect, | ||
368 | |||
369 | .bmdma_setup = ata_bmdma_setup, | ||
370 | .bmdma_start = ata_bmdma_start, | ||
371 | .bmdma_stop = ata_bmdma_stop, | ||
372 | .bmdma_status = ata_bmdma_status, | ||
373 | |||
374 | .qc_prep = ata_qc_prep, | ||
375 | .qc_issue = ata_qc_issue_prot, | ||
376 | |||
377 | .data_xfer = ata_data_xfer, | ||
378 | |||
379 | .irq_handler = ata_interrupt, | ||
380 | .irq_clear = ata_bmdma_irq_clear, | ||
381 | .irq_on = ata_irq_on, | ||
382 | |||
383 | .port_start = ata_sff_port_start, | ||
384 | }; | 315 | }; |
385 | 316 | ||
386 | static int serverworks_fixup_osb4(struct pci_dev *pdev) | 317 | static int serverworks_fixup_osb4(struct pci_dev *pdev) |
@@ -468,28 +399,24 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id | |||
468 | { | 399 | { |
469 | static const struct ata_port_info info[4] = { | 400 | static const struct ata_port_info info[4] = { |
470 | { /* OSB4 */ | 401 | { /* OSB4 */ |
471 | .sht = &serverworks_sht, | ||
472 | .flags = ATA_FLAG_SLAVE_POSS, | 402 | .flags = ATA_FLAG_SLAVE_POSS, |
473 | .pio_mask = 0x1f, | 403 | .pio_mask = 0x1f, |
474 | .mwdma_mask = 0x07, | 404 | .mwdma_mask = 0x07, |
475 | .udma_mask = 0x07, | 405 | .udma_mask = 0x07, |
476 | .port_ops = &serverworks_osb4_port_ops | 406 | .port_ops = &serverworks_osb4_port_ops |
477 | }, { /* OSB4 no UDMA */ | 407 | }, { /* OSB4 no UDMA */ |
478 | .sht = &serverworks_sht, | ||
479 | .flags = ATA_FLAG_SLAVE_POSS, | 408 | .flags = ATA_FLAG_SLAVE_POSS, |
480 | .pio_mask = 0x1f, | 409 | .pio_mask = 0x1f, |
481 | .mwdma_mask = 0x07, | 410 | .mwdma_mask = 0x07, |
482 | .udma_mask = 0x00, | 411 | .udma_mask = 0x00, |
483 | .port_ops = &serverworks_osb4_port_ops | 412 | .port_ops = &serverworks_osb4_port_ops |
484 | }, { /* CSB5 */ | 413 | }, { /* CSB5 */ |
485 | .sht = &serverworks_sht, | ||
486 | .flags = ATA_FLAG_SLAVE_POSS, | 414 | .flags = ATA_FLAG_SLAVE_POSS, |
487 | .pio_mask = 0x1f, | 415 | .pio_mask = 0x1f, |
488 | .mwdma_mask = 0x07, | 416 | .mwdma_mask = 0x07, |
489 | .udma_mask = ATA_UDMA4, | 417 | .udma_mask = ATA_UDMA4, |
490 | .port_ops = &serverworks_csb_port_ops | 418 | .port_ops = &serverworks_csb_port_ops |
491 | }, { /* CSB5 - later revisions*/ | 419 | }, { /* CSB5 - later revisions*/ |
492 | .sht = &serverworks_sht, | ||
493 | .flags = ATA_FLAG_SLAVE_POSS, | 420 | .flags = ATA_FLAG_SLAVE_POSS, |
494 | .pio_mask = 0x1f, | 421 | .pio_mask = 0x1f, |
495 | .mwdma_mask = 0x07, | 422 | .mwdma_mask = 0x07, |
@@ -498,6 +425,11 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id | |||
498 | } | 425 | } |
499 | }; | 426 | }; |
500 | const struct ata_port_info *ppi[] = { &info[id->driver_data], NULL }; | 427 | const struct ata_port_info *ppi[] = { &info[id->driver_data], NULL }; |
428 | int rc; | ||
429 | |||
430 | rc = pcim_enable_device(pdev); | ||
431 | if (rc) | ||
432 | return rc; | ||
501 | 433 | ||
502 | /* Force master latency timer to 64 PCI clocks */ | 434 | /* Force master latency timer to 64 PCI clocks */ |
503 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40); | 435 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40); |
@@ -527,24 +459,30 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id | |||
527 | serverworks_fixup_ht1000(pdev); | 459 | serverworks_fixup_ht1000(pdev); |
528 | 460 | ||
529 | if (pdev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) | 461 | if (pdev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) |
530 | ata_pci_clear_simplex(pdev); | 462 | ata_pci_bmdma_clear_simplex(pdev); |
531 | 463 | ||
532 | return ata_pci_init_one(pdev, ppi); | 464 | return ata_pci_sff_init_one(pdev, ppi, &serverworks_sht, NULL); |
533 | } | 465 | } |
534 | 466 | ||
535 | #ifdef CONFIG_PM | 467 | #ifdef CONFIG_PM |
536 | static int serverworks_reinit_one(struct pci_dev *pdev) | 468 | static int serverworks_reinit_one(struct pci_dev *pdev) |
537 | { | 469 | { |
470 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | ||
471 | int rc; | ||
472 | |||
473 | rc = ata_pci_device_do_resume(pdev); | ||
474 | if (rc) | ||
475 | return rc; | ||
476 | |||
538 | /* Force master latency timer to 64 PCI clocks */ | 477 | /* Force master latency timer to 64 PCI clocks */ |
539 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40); | 478 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40); |
540 | 479 | ||
541 | switch (pdev->device) | 480 | switch (pdev->device) { |
542 | { | ||
543 | case PCI_DEVICE_ID_SERVERWORKS_OSB4IDE: | 481 | case PCI_DEVICE_ID_SERVERWORKS_OSB4IDE: |
544 | serverworks_fixup_osb4(pdev); | 482 | serverworks_fixup_osb4(pdev); |
545 | break; | 483 | break; |
546 | case PCI_DEVICE_ID_SERVERWORKS_CSB5IDE: | 484 | case PCI_DEVICE_ID_SERVERWORKS_CSB5IDE: |
547 | ata_pci_clear_simplex(pdev); | 485 | ata_pci_bmdma_clear_simplex(pdev); |
548 | /* fall through */ | 486 | /* fall through */ |
549 | case PCI_DEVICE_ID_SERVERWORKS_CSB6IDE: | 487 | case PCI_DEVICE_ID_SERVERWORKS_CSB6IDE: |
550 | case PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2: | 488 | case PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2: |
@@ -554,7 +492,9 @@ static int serverworks_reinit_one(struct pci_dev *pdev) | |||
554 | serverworks_fixup_ht1000(pdev); | 492 | serverworks_fixup_ht1000(pdev); |
555 | break; | 493 | break; |
556 | } | 494 | } |
557 | return ata_pci_device_resume(pdev); | 495 | |
496 | ata_host_resume(host); | ||
497 | return 0; | ||
558 | } | 498 | } |
559 | #endif | 499 | #endif |
560 | 500 | ||