]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/scsi/pcmcia/aha152x_stub.c
UBUNTU: Ubuntu-4.13.0-45.50
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / pcmcia / aha152x_stub.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A driver for Adaptec AHA152X-compatible PCMCIA SCSI cards.
4
5 This driver supports the Adaptec AHA-1460, the New Media Bus
6 Toaster, and the New Media Toast & Jam.
7
8 aha152x_cs.c 1.54 2000/06/12 21:27:25
9
10 The contents of this file are subject to the Mozilla Public
11 License Version 1.1 (the "License"); you may not use this file
12 except in compliance with the License. You may obtain a copy of
13 the License at http://www.mozilla.org/MPL/
14
15 Software distributed under the License is distributed on an "AS
16 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17 implied. See the License for the specific language governing
18 rights and limitations under the License.
19
20 The initial developer of the original code is David A. Hinds
21 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
22 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
23
24 Alternatively, the contents of this file may be used under the
25 terms of the GNU General Public License version 2 (the "GPL"), in which
26 case the provisions of the GPL are applicable instead of the
27 above. If you wish to allow the use of your version of this file
28 only under the terms of the GPL and not to allow others to use
29 your version of this file under the MPL, indicate your decision
30 by deleting the provisions above and replace them with the notice
31 and other provisions required by the GPL. If you do not delete
32 the provisions above, a recipient may use your version of this
33 file under either the MPL or the GPL.
34
35======================================================================*/
36
37#include <linux/module.h>
38#include <linux/init.h>
39#include <linux/kernel.h>
1da177e4
LT
40#include <linux/slab.h>
41#include <linux/string.h>
42#include <linux/ioport.h>
43#include <scsi/scsi.h>
44#include <linux/major.h>
45#include <linux/blkdev.h>
46#include <scsi/scsi_ioctl.h>
47
48#include "scsi.h"
49#include <scsi/scsi_host.h>
50#include "aha152x.h"
51
1da177e4
LT
52#include <pcmcia/cistpl.h>
53#include <pcmcia/ds.h>
54
1da177e4
LT
55
56/*====================================================================*/
57
58/* Parameters that can be set with 'insmod' */
59
60/* SCSI bus setup options */
61static int host_id = 7;
62static int reconnect = 1;
63static int parity = 1;
64static int synchronous = 1;
65static int reset_delay = 100;
66static int ext_trans = 0;
67
68module_param(host_id, int, 0);
69module_param(reconnect, int, 0);
70module_param(parity, int, 0);
71module_param(synchronous, int, 0);
72module_param(reset_delay, int, 0);
73module_param(ext_trans, int, 0);
74
75MODULE_LICENSE("Dual MPL/GPL");
76
77/*====================================================================*/
78
79typedef struct scsi_info_t {
fd238232 80 struct pcmcia_device *p_dev;
1da177e4
LT
81 struct Scsi_Host *host;
82} scsi_info_t;
83
fba395ee 84static void aha152x_release_cs(struct pcmcia_device *link);
cc3b4866 85static void aha152x_detach(struct pcmcia_device *p_dev);
15b99ac1 86static int aha152x_config_cs(struct pcmcia_device *link);
1da177e4 87
15b99ac1 88static int aha152x_probe(struct pcmcia_device *link)
1da177e4
LT
89{
90 scsi_info_t *info;
fba395ee 91
3e716617 92 dev_dbg(&link->dev, "aha152x_attach()\n");
1da177e4
LT
93
94 /* Create new SCSI device */
dd00cc48 95 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618 96 if (!info) return -ENOMEM;
fba395ee 97 info->p_dev = link;
fd238232 98 link->priv = info;
1da177e4 99
00990e7c 100 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
7feabb64 101 link->config_regs = PRESENT_OPTION;
1da177e4 102
15b99ac1 103 return aha152x_config_cs(link);
1da177e4
LT
104} /* aha152x_attach */
105
106/*====================================================================*/
107
fba395ee 108static void aha152x_detach(struct pcmcia_device *link)
1da177e4 109{
3e716617 110 dev_dbg(&link->dev, "aha152x_detach\n");
1da177e4 111
e2d40963 112 aha152x_release_cs(link);
1da177e4 113
1da177e4 114 /* Unlink device structure, free bits */
1da177e4 115 kfree(link->priv);
1da177e4
LT
116} /* aha152x_detach */
117
118/*====================================================================*/
119
00990e7c 120static int aha152x_config_check(struct pcmcia_device *p_dev, void *priv_data)
0e6f9d27 121{
90abdc3b 122 p_dev->io_lines = 10;
00990e7c 123
0e6f9d27 124 /* For New Media T&J, look for a SCSI window */
00990e7c
DB
125 if ((p_dev->resource[0]->end < 0x20) &&
126 (p_dev->resource[1]->end >= 0x20))
127 p_dev->resource[0]->start = p_dev->resource[1]->start;
128
129 if (p_dev->resource[0]->start >= 0xffff)
130 return -EINVAL;
131
132 p_dev->resource[1]->start = p_dev->resource[1]->end = 0;
133 p_dev->resource[0]->end = 0x20;
134 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
135 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
136
137 return pcmcia_request_io(p_dev);
0e6f9d27
DB
138}
139
15b99ac1 140static int aha152x_config_cs(struct pcmcia_device *link)
1da177e4 141{
1da177e4
LT
142 scsi_info_t *info = link->priv;
143 struct aha152x_setup s;
3e716617 144 int ret;
1da177e4 145 struct Scsi_Host *host;
0e6f9d27 146
3e716617 147 dev_dbg(&link->dev, "aha152x_config\n");
1da177e4 148
3e716617
DB
149 ret = pcmcia_loop_config(link, aha152x_config_check, NULL);
150 if (ret)
151 goto failed;
0e6f9d27 152
eb14120f 153 if (!link->irq)
3e716617
DB
154 goto failed;
155
1ac71e5a 156 ret = pcmcia_enable_device(link);
3e716617
DB
157 if (ret)
158 goto failed;
1da177e4
LT
159
160 /* Set configuration options for the aha152x driver */
161 memset(&s, 0, sizeof(s));
162 s.conf = "PCMCIA setup";
9a017a91 163 s.io_port = link->resource[0]->start;
eb14120f 164 s.irq = link->irq;
1da177e4
LT
165 s.scsiid = host_id;
166 s.reconnect = reconnect;
167 s.parity = parity;
168 s.synchronous = synchronous;
169 s.delay = reset_delay;
170 if (ext_trans)
171 s.ext_trans = ext_trans;
172
173 host = aha152x_probe_one(&s);
174 if (host == NULL) {
175 printk(KERN_INFO "aha152x_cs: no SCSI devices found\n");
3e716617 176 goto failed;
1da177e4
LT
177 }
178
1da177e4
LT
179 info->host = host;
180
15b99ac1
DB
181 return 0;
182
0e6f9d27 183failed:
1da177e4 184 aha152x_release_cs(link);
15b99ac1 185 return -ENODEV;
1da177e4
LT
186}
187
fba395ee 188static void aha152x_release_cs(struct pcmcia_device *link)
1da177e4
LT
189{
190 scsi_info_t *info = link->priv;
191
192 aha152x_release(info->host);
fba395ee 193 pcmcia_disable_device(link);
1da177e4
LT
194}
195
fba395ee 196static int aha152x_resume(struct pcmcia_device *link)
98e4c28b 197{
98e4c28b
DB
198 scsi_info_t *info = link->priv;
199
8661bb5b 200 aha152x_host_reset_host(info->host);
98e4c28b
DB
201
202 return 0;
203}
204
25f8f54f 205static const struct pcmcia_device_id aha152x_ids[] = {
2dc27daa
DB
206 PCMCIA_DEVICE_PROD_ID123("New Media", "SCSI", "Bus Toaster", 0xcdf7e4cc, 0x35f26476, 0xa8851d6e),
207 PCMCIA_DEVICE_PROD_ID123("NOTEWORTHY", "SCSI", "Bus Toaster", 0xad89c6e8, 0x35f26476, 0xa8851d6e),
208 PCMCIA_DEVICE_PROD_ID12("Adaptec, Inc.", "APA-1460 SCSI Host Adapter", 0x24ba9738, 0x3a3c3d20),
209 PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Multimedia Sound/SCSI", 0x085a850b, 0x80a6535c),
210 PCMCIA_DEVICE_PROD_ID12("NOTEWORTHY", "NWCOMB02 SCSI/AUDIO COMBO CARD", 0xad89c6e8, 0x5f9a615b),
211 PCMCIA_DEVICE_NULL,
212};
213MODULE_DEVICE_TABLE(pcmcia, aha152x_ids);
214
1da177e4
LT
215static struct pcmcia_driver aha152x_cs_driver = {
216 .owner = THIS_MODULE,
2e9b981a 217 .name = "aha152x_cs",
15b99ac1 218 .probe = aha152x_probe,
cc3b4866 219 .remove = aha152x_detach,
2dc27daa 220 .id_table = aha152x_ids,
98e4c28b 221 .resume = aha152x_resume,
1da177e4
LT
222};
223
224static int __init init_aha152x_cs(void)
225{
226 return pcmcia_register_driver(&aha152x_cs_driver);
227}
228
229static void __exit exit_aha152x_cs(void)
230{
231 pcmcia_unregister_driver(&aha152x_cs_driver);
1da177e4
LT
232}
233
234module_init(init_aha152x_cs);
235module_exit(exit_aha152x_cs);