aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_serverworks.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/pata_serverworks.c')
-rw-r--r--drivers/ata/pata_serverworks.c114
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
300static struct scsi_host_template serverworks_sht = { 300static 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
318static struct ata_port_operations serverworks_osb4_port_ops = { 304static 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
352static struct ata_port_operations serverworks_csb_port_ops = { 312static 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
386static int serverworks_fixup_osb4(struct pci_dev *pdev) 317static 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
536static int serverworks_reinit_one(struct pci_dev *pdev) 468static 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