0001
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");