diff options
Diffstat (limited to 'drivers/ata/sata_qstor.c')
-rw-r--r-- | drivers/ata/sata_qstor.c | 90 |
1 files changed, 22 insertions, 68 deletions
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index 0292a79f9747..339f61648af6 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <linux/sched.h> | 37 | #include <linux/sched.h> |
38 | #include <linux/device.h> | 38 | #include <linux/device.h> |
39 | #include <scsi/scsi_host.h> | 39 | #include <scsi/scsi_host.h> |
40 | #include <asm/io.h> | ||
41 | #include <linux/libata.h> | 40 | #include <linux/libata.h> |
42 | 41 | ||
43 | #define DRV_NAME "sata_qstor" | 42 | #define DRV_NAME "sata_qstor" |
@@ -117,7 +116,6 @@ static int qs_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *en | |||
117 | static irqreturn_t qs_intr (int irq, void *dev_instance); | 116 | static irqreturn_t qs_intr (int irq, void *dev_instance); |
118 | static int qs_port_start(struct ata_port *ap); | 117 | static int qs_port_start(struct ata_port *ap); |
119 | static void qs_host_stop(struct ata_host *host); | 118 | static void qs_host_stop(struct ata_host *host); |
120 | static void qs_port_stop(struct ata_port *ap); | ||
121 | static void qs_phy_reset(struct ata_port *ap); | 119 | static void qs_phy_reset(struct ata_port *ap); |
122 | static void qs_qc_prep(struct ata_queued_cmd *qc); | 120 | static void qs_qc_prep(struct ata_queued_cmd *qc); |
123 | static unsigned int qs_qc_issue(struct ata_queued_cmd *qc); | 121 | static unsigned int qs_qc_issue(struct ata_queued_cmd *qc); |
@@ -164,7 +162,6 @@ static const struct ata_port_operations qs_ata_ops = { | |||
164 | .scr_read = qs_scr_read, | 162 | .scr_read = qs_scr_read, |
165 | .scr_write = qs_scr_write, | 163 | .scr_write = qs_scr_write, |
166 | .port_start = qs_port_start, | 164 | .port_start = qs_port_start, |
167 | .port_stop = qs_port_stop, | ||
168 | .host_stop = qs_host_stop, | 165 | .host_stop = qs_host_stop, |
169 | .bmdma_stop = qs_bmdma_stop, | 166 | .bmdma_stop = qs_bmdma_stop, |
170 | .bmdma_status = qs_bmdma_status, | 167 | .bmdma_status = qs_bmdma_status, |
@@ -501,17 +498,13 @@ static int qs_port_start(struct ata_port *ap) | |||
501 | if (rc) | 498 | if (rc) |
502 | return rc; | 499 | return rc; |
503 | qs_enter_reg_mode(ap); | 500 | qs_enter_reg_mode(ap); |
504 | pp = kzalloc(sizeof(*pp), GFP_KERNEL); | 501 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
505 | if (!pp) { | 502 | if (!pp) |
506 | rc = -ENOMEM; | 503 | return -ENOMEM; |
507 | goto err_out; | 504 | pp->pkt = dmam_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma, |
508 | } | 505 | GFP_KERNEL); |
509 | pp->pkt = dma_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma, | 506 | if (!pp->pkt) |
510 | GFP_KERNEL); | 507 | return -ENOMEM; |
511 | if (!pp->pkt) { | ||
512 | rc = -ENOMEM; | ||
513 | goto err_out_kfree; | ||
514 | } | ||
515 | memset(pp->pkt, 0, QS_PKT_BYTES); | 508 | memset(pp->pkt, 0, QS_PKT_BYTES); |
516 | ap->private_data = pp; | 509 | ap->private_data = pp; |
517 | 510 | ||
@@ -519,38 +512,14 @@ static int qs_port_start(struct ata_port *ap) | |||
519 | writel((u32) addr, chan + QS_CCF_CPBA); | 512 | writel((u32) addr, chan + QS_CCF_CPBA); |
520 | writel((u32)(addr >> 32), chan + QS_CCF_CPBA + 4); | 513 | writel((u32)(addr >> 32), chan + QS_CCF_CPBA + 4); |
521 | return 0; | 514 | return 0; |
522 | |||
523 | err_out_kfree: | ||
524 | kfree(pp); | ||
525 | err_out: | ||
526 | ata_port_stop(ap); | ||
527 | return rc; | ||
528 | } | ||
529 | |||
530 | static void qs_port_stop(struct ata_port *ap) | ||
531 | { | ||
532 | struct device *dev = ap->host->dev; | ||
533 | struct qs_port_priv *pp = ap->private_data; | ||
534 | |||
535 | if (pp != NULL) { | ||
536 | ap->private_data = NULL; | ||
537 | if (pp->pkt != NULL) | ||
538 | dma_free_coherent(dev, QS_PKT_BYTES, pp->pkt, | ||
539 | pp->pkt_dma); | ||
540 | kfree(pp); | ||
541 | } | ||
542 | ata_port_stop(ap); | ||
543 | } | 515 | } |
544 | 516 | ||
545 | static void qs_host_stop(struct ata_host *host) | 517 | static void qs_host_stop(struct ata_host *host) |
546 | { | 518 | { |
547 | void __iomem *mmio_base = host->mmio_base; | 519 | void __iomem *mmio_base = host->mmio_base; |
548 | struct pci_dev *pdev = to_pci_dev(host->dev); | ||
549 | 520 | ||
550 | writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */ | 521 | writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */ |
551 | writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */ | 522 | writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */ |
552 | |||
553 | pci_iounmap(pdev, mmio_base); | ||
554 | } | 523 | } |
555 | 524 | ||
556 | static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe) | 525 | static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe) |
@@ -638,36 +607,29 @@ static int qs_ata_init_one(struct pci_dev *pdev, | |||
638 | if (!printed_version++) | 607 | if (!printed_version++) |
639 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 608 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
640 | 609 | ||
641 | rc = pci_enable_device(pdev); | 610 | rc = pcim_enable_device(pdev); |
642 | if (rc) | 611 | if (rc) |
643 | return rc; | 612 | return rc; |
644 | 613 | ||
645 | rc = pci_request_regions(pdev, DRV_NAME); | 614 | rc = pci_request_regions(pdev, DRV_NAME); |
646 | if (rc) | 615 | if (rc) |
647 | goto err_out; | 616 | return rc; |
648 | 617 | ||
649 | if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) { | 618 | if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) |
650 | rc = -ENODEV; | 619 | return -ENODEV; |
651 | goto err_out_regions; | ||
652 | } | ||
653 | 620 | ||
654 | mmio_base = pci_iomap(pdev, 4, 0); | 621 | mmio_base = pcim_iomap(pdev, 4, 0); |
655 | if (mmio_base == NULL) { | 622 | if (mmio_base == NULL) |
656 | rc = -ENOMEM; | 623 | return -ENOMEM; |
657 | goto err_out_regions; | ||
658 | } | ||
659 | 624 | ||
660 | rc = qs_set_dma_masks(pdev, mmio_base); | 625 | rc = qs_set_dma_masks(pdev, mmio_base); |
661 | if (rc) | 626 | if (rc) |
662 | goto err_out_iounmap; | 627 | return rc; |
663 | 628 | ||
664 | probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); | 629 | probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL); |
665 | if (probe_ent == NULL) { | 630 | if (probe_ent == NULL) |
666 | rc = -ENOMEM; | 631 | return -ENOMEM; |
667 | goto err_out_iounmap; | ||
668 | } | ||
669 | 632 | ||
670 | memset(probe_ent, 0, sizeof(*probe_ent)); | ||
671 | probe_ent->dev = pci_dev_to_dev(pdev); | 633 | probe_ent->dev = pci_dev_to_dev(pdev); |
672 | INIT_LIST_HEAD(&probe_ent->node); | 634 | INIT_LIST_HEAD(&probe_ent->node); |
673 | 635 | ||
@@ -694,19 +656,11 @@ static int qs_ata_init_one(struct pci_dev *pdev, | |||
694 | /* initialize adapter */ | 656 | /* initialize adapter */ |
695 | qs_host_init(board_idx, probe_ent); | 657 | qs_host_init(board_idx, probe_ent); |
696 | 658 | ||
697 | rc = ata_device_add(probe_ent); | 659 | if (ata_device_add(probe_ent) != QS_PORTS) |
698 | kfree(probe_ent); | 660 | return -EIO; |
699 | if (rc != QS_PORTS) | ||
700 | goto err_out_iounmap; | ||
701 | return 0; | ||
702 | 661 | ||
703 | err_out_iounmap: | 662 | devm_kfree(&pdev->dev, probe_ent); |
704 | pci_iounmap(pdev, mmio_base); | 663 | return 0; |
705 | err_out_regions: | ||
706 | pci_release_regions(pdev); | ||
707 | err_out: | ||
708 | pci_disable_device(pdev); | ||
709 | return rc; | ||
710 | } | 664 | } |
711 | 665 | ||
712 | static int __init qs_ata_init(void) | 666 | static int __init qs_ata_init(void) |