diff options
author | Ondrej Zary <linux@zary.sk> | 2019-05-27 16:19:47 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2019-06-18 19:46:23 -0400 |
commit | 8674a8aa2c399cb4014052796ba4bd0fbd6f3c03 (patch) | |
tree | ce150a192b61e546d167302128e391ad02690581 | |
parent | 1697c6a64c49df3ed1a7e81845dcf2edf6ea23db (diff) |
scsi: fdomain: Add PCMCIA support
Add PCMCIA card support to Future Domain SCSI driver.
Tested with IBM SCSI PCMCIA Adapter 40G1890.
Signed-off-by: Ondrej Zary <linux@zary.sk>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/fdomain.c | 7 | ||||
-rw-r--r-- | drivers/scsi/pcmcia/Kconfig | 10 | ||||
-rw-r--r-- | drivers/scsi/pcmcia/Makefile | 1 | ||||
-rw-r--r-- | drivers/scsi/pcmcia/fdomain_cs.c | 95 |
4 files changed, 111 insertions, 2 deletions
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 297ccc799436..b5e66971b6d9 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c | |||
@@ -510,6 +510,7 @@ struct Scsi_Host *fdomain_create(int base, int irq, int this_id, | |||
510 | static const char * const chip_names[] = { | 510 | static const char * const chip_names[] = { |
511 | "Unknown", "TMC-1800", "TMC-18C50", "TMC-18C30" | 511 | "Unknown", "TMC-1800", "TMC-18C50", "TMC-18C30" |
512 | }; | 512 | }; |
513 | unsigned long irq_flags = 0; | ||
513 | 514 | ||
514 | chip = fdomain_identify(base); | 515 | chip = fdomain_identify(base); |
515 | if (!chip) | 516 | if (!chip) |
@@ -541,8 +542,10 @@ struct Scsi_Host *fdomain_create(int base, int irq, int this_id, | |||
541 | fd->chip = chip; | 542 | fd->chip = chip; |
542 | INIT_WORK(&fd->work, fdomain_work); | 543 | INIT_WORK(&fd->work, fdomain_work); |
543 | 544 | ||
544 | if (request_irq(irq, fdomain_irq, dev_is_pci(dev) ? IRQF_SHARED : 0, | 545 | if (dev_is_pci(dev) || !strcmp(dev->bus->name, "pcmcia")) |
545 | "fdomain", fd)) | 546 | irq_flags = IRQF_SHARED; |
547 | |||
548 | if (request_irq(irq, fdomain_irq, irq_flags, "fdomain", fd)) | ||
546 | goto fail_put; | 549 | goto fail_put; |
547 | 550 | ||
548 | shost_printk(KERN_INFO, sh, "%s chip at 0x%x irq %d SCSI ID %d\n", | 551 | shost_printk(KERN_INFO, sh, "%s chip at 0x%x irq %d SCSI ID %d\n", |
diff --git a/drivers/scsi/pcmcia/Kconfig b/drivers/scsi/pcmcia/Kconfig index 2d435f105b16..169d93f90a30 100644 --- a/drivers/scsi/pcmcia/Kconfig +++ b/drivers/scsi/pcmcia/Kconfig | |||
@@ -19,6 +19,16 @@ config PCMCIA_AHA152X | |||
19 | To compile this driver as a module, choose M here: the | 19 | To compile this driver as a module, choose M here: the |
20 | module will be called aha152x_cs. | 20 | module will be called aha152x_cs. |
21 | 21 | ||
22 | config PCMCIA_FDOMAIN | ||
23 | tristate "Future Domain PCMCIA support" | ||
24 | select SCSI_FDOMAIN | ||
25 | help | ||
26 | Say Y here if you intend to attach this type of PCMCIA SCSI host | ||
27 | adapter to your computer. | ||
28 | |||
29 | To compile this driver as a module, choose M here: the | ||
30 | module will be called fdomain_cs. | ||
31 | |||
22 | config PCMCIA_NINJA_SCSI | 32 | config PCMCIA_NINJA_SCSI |
23 | tristate "NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support" | 33 | tristate "NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support" |
24 | depends on !64BIT | 34 | depends on !64BIT |
diff --git a/drivers/scsi/pcmcia/Makefile b/drivers/scsi/pcmcia/Makefile index a5a24dd44e7e..02f5b44a2685 100644 --- a/drivers/scsi/pcmcia/Makefile +++ b/drivers/scsi/pcmcia/Makefile | |||
@@ -4,6 +4,7 @@ ccflags-y := -I $(srctree)/drivers/scsi | |||
4 | 4 | ||
5 | # 16-bit client drivers | 5 | # 16-bit client drivers |
6 | obj-$(CONFIG_PCMCIA_QLOGIC) += qlogic_cs.o | 6 | obj-$(CONFIG_PCMCIA_QLOGIC) += qlogic_cs.o |
7 | obj-$(CONFIG_PCMCIA_FDOMAIN) += fdomain_cs.o | ||
7 | obj-$(CONFIG_PCMCIA_AHA152X) += aha152x_cs.o | 8 | obj-$(CONFIG_PCMCIA_AHA152X) += aha152x_cs.o |
8 | obj-$(CONFIG_PCMCIA_NINJA_SCSI) += nsp_cs.o | 9 | obj-$(CONFIG_PCMCIA_NINJA_SCSI) += nsp_cs.o |
9 | obj-$(CONFIG_PCMCIA_SYM53C500) += sym53c500_cs.o | 10 | obj-$(CONFIG_PCMCIA_SYM53C500) += sym53c500_cs.o |
diff --git a/drivers/scsi/pcmcia/fdomain_cs.c b/drivers/scsi/pcmcia/fdomain_cs.c new file mode 100644 index 000000000000..e42acf314d06 --- /dev/null +++ b/drivers/scsi/pcmcia/fdomain_cs.c | |||
@@ -0,0 +1,95 @@ | |||
1 | // SPDX-License-Identifier: (GPL-2.0 OR MPL-1.1) | ||
2 | /* | ||
3 | * Driver for Future Domain-compatible PCMCIA SCSI cards | ||
4 | * Copyright 2019 Ondrej Zary | ||
5 | * | ||
6 | * The initial developer of the original code is David A. Hinds | ||
7 | * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds | ||
8 | * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <scsi/scsi_host.h> | ||
14 | #include <pcmcia/cistpl.h> | ||
15 | #include <pcmcia/ds.h> | ||
16 | #include "fdomain.h" | ||
17 | |||
18 | MODULE_AUTHOR("Ondrej Zary, David Hinds"); | ||
19 | MODULE_DESCRIPTION("Future Domain PCMCIA SCSI driver"); | ||
20 | MODULE_LICENSE("Dual MPL/GPL"); | ||
21 | |||
22 | static int fdomain_config_check(struct pcmcia_device *p_dev, void *priv_data) | ||
23 | { | ||
24 | p_dev->io_lines = 10; | ||
25 | p_dev->resource[0]->end = FDOMAIN_REGION_SIZE; | ||
26 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; | ||
27 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
28 | return pcmcia_request_io(p_dev); | ||
29 | } | ||
30 | |||
31 | static int fdomain_probe(struct pcmcia_device *link) | ||
32 | { | ||
33 | int ret; | ||
34 | struct Scsi_Host *sh; | ||
35 | |||
36 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; | ||
37 | link->config_regs = PRESENT_OPTION; | ||
38 | |||
39 | ret = pcmcia_loop_config(link, fdomain_config_check, NULL); | ||
40 | if (ret) | ||
41 | return ret; | ||
42 | |||
43 | ret = pcmcia_enable_device(link); | ||
44 | if (ret) | ||
45 | goto fail_disable; | ||
46 | |||
47 | if (!request_region(link->resource[0]->start, FDOMAIN_REGION_SIZE, | ||
48 | "fdomain_cs")) | ||
49 | goto fail_disable; | ||
50 | |||
51 | sh = fdomain_create(link->resource[0]->start, link->irq, 7, &link->dev); | ||
52 | if (!sh) { | ||
53 | dev_err(&link->dev, "Controller initialization failed"); | ||
54 | ret = -ENODEV; | ||
55 | goto fail_release; | ||
56 | } | ||
57 | |||
58 | link->priv = sh; | ||
59 | |||
60 | return 0; | ||
61 | |||
62 | fail_release: | ||
63 | release_region(link->resource[0]->start, FDOMAIN_REGION_SIZE); | ||
64 | fail_disable: | ||
65 | pcmcia_disable_device(link); | ||
66 | return ret; | ||
67 | } | ||
68 | |||
69 | static void fdomain_remove(struct pcmcia_device *link) | ||
70 | { | ||
71 | fdomain_destroy(link->priv); | ||
72 | release_region(link->resource[0]->start, FDOMAIN_REGION_SIZE); | ||
73 | pcmcia_disable_device(link); | ||
74 | } | ||
75 | |||
76 | static const struct pcmcia_device_id fdomain_ids[] = { | ||
77 | PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "SCSI PCMCIA Card", 0xe3736c88, | ||
78 | 0x859cad20), | ||
79 | PCMCIA_DEVICE_PROD_ID1("SCSI PCMCIA Adapter Card", 0x8dacb57e), | ||
80 | PCMCIA_DEVICE_PROD_ID12(" SIMPLE TECHNOLOGY Corporation", | ||
81 | "SCSI PCMCIA Credit Card Controller", | ||
82 | 0x182bdafe, 0xc80d106f), | ||
83 | PCMCIA_DEVICE_NULL, | ||
84 | }; | ||
85 | MODULE_DEVICE_TABLE(pcmcia, fdomain_ids); | ||
86 | |||
87 | static struct pcmcia_driver fdomain_cs_driver = { | ||
88 | .owner = THIS_MODULE, | ||
89 | .name = "fdomain_cs", | ||
90 | .probe = fdomain_probe, | ||
91 | .remove = fdomain_remove, | ||
92 | .id_table = fdomain_ids, | ||
93 | }; | ||
94 | |||
95 | module_pcmcia_driver(fdomain_cs_driver); | ||