Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 
0003 #include <linux/module.h>
0004 #include <linux/pci.h>
0005 #include "fdomain.h"
0006 
0007 static int fdomain_pci_probe(struct pci_dev *pdev,
0008                  const struct pci_device_id *d)
0009 {
0010     int err;
0011     struct Scsi_Host *sh;
0012 
0013     err = pci_enable_device(pdev);
0014     if (err)
0015         goto fail;
0016 
0017     err = pci_request_regions(pdev, "fdomain_pci");
0018     if (err)
0019         goto disable_device;
0020 
0021     err = -ENODEV;
0022     if (pci_resource_len(pdev, 0) == 0)
0023         goto release_region;
0024 
0025     sh = fdomain_create(pci_resource_start(pdev, 0), pdev->irq, 7,
0026                 &pdev->dev);
0027     if (!sh)
0028         goto release_region;
0029 
0030     pci_set_drvdata(pdev, sh);
0031     return 0;
0032 
0033 release_region:
0034     pci_release_regions(pdev);
0035 disable_device:
0036     pci_disable_device(pdev);
0037 fail:
0038     return err;
0039 }
0040 
0041 static void fdomain_pci_remove(struct pci_dev *pdev)
0042 {
0043     struct Scsi_Host *sh = pci_get_drvdata(pdev);
0044 
0045     fdomain_destroy(sh);
0046     pci_release_regions(pdev);
0047     pci_disable_device(pdev);
0048 }
0049 
0050 static struct pci_device_id fdomain_pci_table[] = {
0051     { PCI_DEVICE(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70) },
0052     {}
0053 };
0054 MODULE_DEVICE_TABLE(pci, fdomain_pci_table);
0055 
0056 static struct pci_driver fdomain_pci_driver = {
0057     .name       = "fdomain_pci",
0058     .id_table   = fdomain_pci_table,
0059     .probe      = fdomain_pci_probe,
0060     .remove     = fdomain_pci_remove,
0061     .driver.pm  = FDOMAIN_PM_OPS,
0062 };
0063 
0064 module_pci_driver(fdomain_pci_driver);
0065 
0066 MODULE_AUTHOR("Ondrej Zary, Rickard E. Faith");
0067 MODULE_DESCRIPTION("Future Domain TMC-3260 PCI SCSI driver");
0068 MODULE_LICENSE("GPL");