pcmcia: convert pcmcia_request_configuration to pcmcia_enable_device
[deliverable/linux.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
fba395ee 88static struct pcmcia_device *dev_list;
1da177e4 89
15b99ac1 90static int aha152x_probe(struct pcmcia_device *link)
1da177e4
LT
91{
92 scsi_info_t *info;
fba395ee 93
3e716617 94 dev_dbg(&link->dev, "aha152x_attach()\n");
1da177e4
LT
95
96 /* Create new SCSI device */
dd00cc48 97 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618 98 if (!info) return -ENOMEM;
fba395ee 99 info->p_dev = link;
fd238232 100 link->priv = info;
1da177e4 101
90abdc3b
DB
102 link->resource[0]->end = 0x20;
103 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
1ac71e5a 104 link->config_flags |= CONF_ENABLE_IRQ;
7feabb64 105 link->config_regs = PRESENT_OPTION;
1da177e4 106
15b99ac1 107 return aha152x_config_cs(link);
1da177e4
LT
108} /* aha152x_attach */
109
110/*====================================================================*/
111
fba395ee 112static void aha152x_detach(struct pcmcia_device *link)
1da177e4 113{
3e716617 114 dev_dbg(&link->dev, "aha152x_detach\n");
1da177e4 115
e2d40963 116 aha152x_release_cs(link);
1da177e4 117
1da177e4 118 /* Unlink device structure, free bits */
1da177e4 119 kfree(link->priv);
1da177e4
LT
120} /* aha152x_detach */
121
122/*====================================================================*/
123
0e6f9d27 124static int aha152x_config_check(struct pcmcia_device *p_dev,
8e2fc39d
DB
125 cistpl_cftable_entry_t *cfg,
126 cistpl_cftable_entry_t *dflt,
ad913c11 127 unsigned int vcc,
8e2fc39d 128 void *priv_data)
0e6f9d27 129{
90abdc3b 130 p_dev->io_lines = 10;
0e6f9d27
DB
131 /* For New Media T&J, look for a SCSI window */
132 if (cfg->io.win[0].len >= 0x20)
90abdc3b 133 p_dev->resource[0]->start = cfg->io.win[0].base;
0e6f9d27
DB
134 else if ((cfg->io.nwin > 1) &&
135 (cfg->io.win[1].len >= 0x20))
90abdc3b 136 p_dev->resource[0]->start = cfg->io.win[1].base;
0e6f9d27 137 if ((cfg->io.nwin > 0) &&
90abdc3b
DB
138 (p_dev->resource[0]->start < 0xffff)) {
139 if (!pcmcia_request_io(p_dev))
0e6f9d27
DB
140 return 0;
141 }
142 return -EINVAL;
143}
144
15b99ac1 145static int aha152x_config_cs(struct pcmcia_device *link)
1da177e4 146{
1da177e4
LT
147 scsi_info_t *info = link->priv;
148 struct aha152x_setup s;
3e716617 149 int ret;
1da177e4 150 struct Scsi_Host *host;
0e6f9d27 151
3e716617 152 dev_dbg(&link->dev, "aha152x_config\n");
1da177e4 153
3e716617
DB
154 ret = pcmcia_loop_config(link, aha152x_config_check, NULL);
155 if (ret)
156 goto failed;
0e6f9d27 157
eb14120f 158 if (!link->irq)
3e716617
DB
159 goto failed;
160
1ac71e5a 161 ret = pcmcia_enable_device(link);
3e716617
DB
162 if (ret)
163 goto failed;
1da177e4
LT
164
165 /* Set configuration options for the aha152x driver */
166 memset(&s, 0, sizeof(s));
167 s.conf = "PCMCIA setup";
9a017a91 168 s.io_port = link->resource[0]->start;
eb14120f 169 s.irq = link->irq;
1da177e4
LT
170 s.scsiid = host_id;
171 s.reconnect = reconnect;
172 s.parity = parity;
173 s.synchronous = synchronous;
174 s.delay = reset_delay;
175 if (ext_trans)
176 s.ext_trans = ext_trans;
177
178 host = aha152x_probe_one(&s);
179 if (host == NULL) {
180 printk(KERN_INFO "aha152x_cs: no SCSI devices found\n");
3e716617 181 goto failed;
1da177e4
LT
182 }
183
1da177e4
LT
184 info->host = host;
185
15b99ac1
DB
186 return 0;
187
0e6f9d27 188failed:
1da177e4 189 aha152x_release_cs(link);
15b99ac1 190 return -ENODEV;
1da177e4
LT
191}
192
fba395ee 193static void aha152x_release_cs(struct pcmcia_device *link)
1da177e4
LT
194{
195 scsi_info_t *info = link->priv;
196
197 aha152x_release(info->host);
fba395ee 198 pcmcia_disable_device(link);
1da177e4
LT
199}
200
fba395ee 201static int aha152x_resume(struct pcmcia_device *link)
98e4c28b 202{
98e4c28b
DB
203 scsi_info_t *info = link->priv;
204
8661bb5b 205 aha152x_host_reset_host(info->host);
98e4c28b
DB
206
207 return 0;
208}
209
2dc27daa
DB
210static struct pcmcia_device_id aha152x_ids[] = {
211 PCMCIA_DEVICE_PROD_ID123("New Media", "SCSI", "Bus Toaster", 0xcdf7e4cc, 0x35f26476, 0xa8851d6e),
212 PCMCIA_DEVICE_PROD_ID123("NOTEWORTHY", "SCSI", "Bus Toaster", 0xad89c6e8, 0x35f26476, 0xa8851d6e),
213 PCMCIA_DEVICE_PROD_ID12("Adaptec, Inc.", "APA-1460 SCSI Host Adapter", 0x24ba9738, 0x3a3c3d20),
214 PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Multimedia Sound/SCSI", 0x085a850b, 0x80a6535c),
215 PCMCIA_DEVICE_PROD_ID12("NOTEWORTHY", "NWCOMB02 SCSI/AUDIO COMBO CARD", 0xad89c6e8, 0x5f9a615b),
216 PCMCIA_DEVICE_NULL,
217};
218MODULE_DEVICE_TABLE(pcmcia, aha152x_ids);
219
1da177e4
LT
220static struct pcmcia_driver aha152x_cs_driver = {
221 .owner = THIS_MODULE,
222 .drv = {
223 .name = "aha152x_cs",
224 },
15b99ac1 225 .probe = aha152x_probe,
cc3b4866 226 .remove = aha152x_detach,
2dc27daa 227 .id_table = aha152x_ids,
98e4c28b 228 .resume = aha152x_resume,
1da177e4
LT
229};
230
231static int __init init_aha152x_cs(void)
232{
233 return pcmcia_register_driver(&aha152x_cs_driver);
234}
235
236static void __exit exit_aha152x_cs(void)
237{
238 pcmcia_unregister_driver(&aha152x_cs_driver);
239 BUG_ON(dev_list != NULL);
240}
241
242module_init(init_aha152x_cs);
243module_exit(exit_aha152x_cs);
This page took 0.661021 seconds and 5 git commands to generate.