1 | // SPDX-License-Identifier: GPL-2.0 |
2 | |
3 | #include <linux/module.h> |
4 | #include <linux/pci.h> |
5 | #include "fdomain.h" |
6 | |
7 | static int fdomain_pci_probe(struct pci_dev *pdev, |
8 | const struct pci_device_id *d) |
9 | { |
10 | int err; |
11 | struct Scsi_Host *sh; |
12 | |
13 | err = pci_enable_device(dev: pdev); |
14 | if (err) |
15 | goto fail; |
16 | |
17 | err = pci_request_regions(pdev, "fdomain_pci" ); |
18 | if (err) |
19 | goto disable_device; |
20 | |
21 | err = -ENODEV; |
22 | if (pci_resource_len(pdev, 0) == 0) |
23 | goto release_region; |
24 | |
25 | sh = fdomain_create(pci_resource_start(pdev, 0), irq: pdev->irq, this_id: 7, |
26 | dev: &pdev->dev); |
27 | if (!sh) |
28 | goto release_region; |
29 | |
30 | pci_set_drvdata(pdev, data: sh); |
31 | return 0; |
32 | |
33 | release_region: |
34 | pci_release_regions(pdev); |
35 | disable_device: |
36 | pci_disable_device(dev: pdev); |
37 | fail: |
38 | return err; |
39 | } |
40 | |
41 | static void fdomain_pci_remove(struct pci_dev *pdev) |
42 | { |
43 | struct Scsi_Host *sh = pci_get_drvdata(pdev); |
44 | |
45 | fdomain_destroy(sh); |
46 | pci_release_regions(pdev); |
47 | pci_disable_device(dev: pdev); |
48 | } |
49 | |
50 | static struct pci_device_id fdomain_pci_table[] = { |
51 | { PCI_DEVICE(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70) }, |
52 | {} |
53 | }; |
54 | MODULE_DEVICE_TABLE(pci, fdomain_pci_table); |
55 | |
56 | static struct pci_driver fdomain_pci_driver = { |
57 | .name = "fdomain_pci" , |
58 | .id_table = fdomain_pci_table, |
59 | .probe = fdomain_pci_probe, |
60 | .remove = fdomain_pci_remove, |
61 | .driver.pm = FDOMAIN_PM_OPS, |
62 | }; |
63 | |
64 | module_pci_driver(fdomain_pci_driver); |
65 | |
66 | MODULE_AUTHOR("Ondrej Zary, Rickard E. Faith" ); |
67 | MODULE_DESCRIPTION("Future Domain TMC-3260 PCI SCSI driver" ); |
68 | MODULE_LICENSE("GPL" ); |
69 | |