scsi: fdomain: Resurrect driver - PCI support
authorOndrej Zary <linux@zary.sk>
Tue, 14 May 2019 17:23:08 +0000 (19:23 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 18 Jun 2019 23:46:18 +0000 (19:46 -0400)
Future Domain TMC-3260/AHA-2920A PCI card support.

Tested on Adaptec AHA-2920A PCI card.

Signed-off-by: Ondrej Zary <linux@zary.sk>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/fdomain_pci.c [new file with mode: 0644]

index 213c5df4d591cdf2471610a69a8acd4252dbe9f0..b66c624affb05cc781604f3da6b38da847bf0dd9 100644 (file)
@@ -645,6 +645,23 @@ config SCSI_FDOMAIN
        tristate
        depends on SCSI
 
+config SCSI_FDOMAIN_PCI
+       tristate "Future Domain TMC-3260/AHA-2920A PCI SCSI support"
+       depends on PCI && SCSI
+       select SCSI_FDOMAIN
+       help
+         This is support for Future Domain's PCI SCSI host adapters (TMC-3260)
+         and other adapters with PCI bus based on the Future Domain chipsets
+         (Adaptec AHA-2920A).
+
+         NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip
+         and should use the aic7xxx driver ("Adaptec AIC7xxx chipset SCSI
+         controller support"). This Future Domain driver works with the older
+         Adaptec AHA-2920A boards with a Future Domain chip on them.
+
+         To compile this driver as a module, choose M here: the
+         module will be called fdomain_pci.
+
 config SCSI_GDTH
        tristate "Intel/ICP (former GDT SCSI Disk Array) RAID Controller support"
        depends on PCI && SCSI
index 9fecb50fd213565e91856db4453d11826e639c03..f2cea70324190bf0080e04a168a386c010dc337a 100644 (file)
@@ -77,6 +77,7 @@ obj-$(CONFIG_SCSI_PM8001)     += pm8001/
 obj-$(CONFIG_SCSI_ISCI)                += isci/
 obj-$(CONFIG_SCSI_IPS)         += ips.o
 obj-$(CONFIG_SCSI_FDOMAIN)     += fdomain.o
+obj-$(CONFIG_SCSI_FDOMAIN_PCI) += fdomain_pci.o
 obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o
 obj-$(CONFIG_SCSI_QLOGIC_FAS)  += qlogicfas408.o       qlogicfas.o
 obj-$(CONFIG_PCMCIA_QLOGIC)    += qlogicfas408.o
diff --git a/drivers/scsi/fdomain_pci.c b/drivers/scsi/fdomain_pci.c
new file mode 100644 (file)
index 0000000..3e05ce7
--- /dev/null
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include "fdomain.h"
+
+static int fdomain_pci_probe(struct pci_dev *pdev,
+                            const struct pci_device_id *d)
+{
+       int err;
+       struct Scsi_Host *sh;
+
+       err = pci_enable_device(pdev);
+       if (err)
+               goto fail;
+
+       err = pci_request_regions(pdev, "fdomain_pci");
+       if (err)
+               goto disable_device;
+
+       err = -ENODEV;
+       if (pci_resource_len(pdev, 0) == 0)
+               goto release_region;
+
+       sh = fdomain_create(pci_resource_start(pdev, 0), pdev->irq, 7,
+                           &pdev->dev);
+       if (!sh)
+               goto release_region;
+
+       pci_set_drvdata(pdev, sh);
+       return 0;
+
+release_region:
+       pci_release_regions(pdev);
+disable_device:
+       pci_disable_device(pdev);
+fail:
+       return err;
+}
+
+static void fdomain_pci_remove(struct pci_dev *pdev)
+{
+       struct Scsi_Host *sh = pci_get_drvdata(pdev);
+
+       fdomain_destroy(sh);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+}
+
+static struct pci_device_id fdomain_pci_table[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70) },
+       {}
+};
+MODULE_DEVICE_TABLE(pci, fdomain_pci_table);
+
+static struct pci_driver fdomain_pci_driver = {
+       .name           = "fdomain_pci",
+       .id_table       = fdomain_pci_table,
+       .probe          = fdomain_pci_probe,
+       .remove         = fdomain_pci_remove,
+       .driver.pm      = FDOMAIN_PM_OPS,
+};
+
+module_pci_driver(fdomain_pci_driver);
+
+MODULE_AUTHOR("Ondrej Zary, Rickard E. Faith");
+MODULE_DESCRIPTION("Future Domain TMC-3260 PCI SCSI driver");
+MODULE_LICENSE("GPL");