[PATCH] pcmcia: use bitfield instead of p_state and state
[deliverable/linux.git] / drivers / scsi / pcmcia / fdomain_stub.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A driver for Future Domain-compatible PCMCIA SCSI cards
4
5 fdomain_cs.c 1.47 2001/10/13 00:08:52
6
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
11
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
16
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
20
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in
23 which case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
31
32======================================================================*/
33
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/kernel.h>
37#include <linux/sched.h>
38#include <linux/slab.h>
39#include <linux/string.h>
40#include <linux/ioport.h>
41#include <scsi/scsi.h>
42#include <linux/major.h>
43#include <linux/blkdev.h>
44#include <scsi/scsi_ioctl.h>
45
46#include "scsi.h"
47#include <scsi/scsi_host.h>
48#include "fdomain.h"
49
1da177e4
LT
50#include <pcmcia/cs_types.h>
51#include <pcmcia/cs.h>
52#include <pcmcia/cistpl.h>
53#include <pcmcia/ds.h>
54
55/*====================================================================*/
56
57/* Module parameters */
58
59MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
60MODULE_DESCRIPTION("Future Domain PCMCIA SCSI driver");
61MODULE_LICENSE("Dual MPL/GPL");
62
63#ifdef PCMCIA_DEBUG
64static int pc_debug = PCMCIA_DEBUG;
65module_param(pc_debug, int, 0);
66#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
67static char *version =
68"fdomain_cs.c 1.47 2001/10/13 00:08:52 (David Hinds)";
69#else
70#define DEBUG(n, args...)
71#endif
72
73/*====================================================================*/
74
75typedef struct scsi_info_t {
fd238232 76 struct pcmcia_device *p_dev;
1da177e4
LT
77 dev_node_t node;
78 struct Scsi_Host *host;
79} scsi_info_t;
80
81
fba395ee 82static void fdomain_release(struct pcmcia_device *link);
cc3b4866 83static void fdomain_detach(struct pcmcia_device *p_dev);
15b99ac1 84static int fdomain_config(struct pcmcia_device *link);
1da177e4 85
15b99ac1 86static int fdomain_probe(struct pcmcia_device *link)
1da177e4 87{
15b99ac1
DB
88 scsi_info_t *info;
89
90 DEBUG(0, "fdomain_attach()\n");
91
92 /* Create new SCSI device */
93 info = kzalloc(sizeof(*info), GFP_KERNEL);
94 if (!info)
95 return -ENOMEM;
96
97 info->p_dev = link;
98 link->priv = info;
99 link->io.NumPorts1 = 0x10;
100 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
101 link->io.IOAddrLines = 10;
102 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
103 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
104 link->conf.Attributes = CONF_ENABLE_IRQ;
105 link->conf.IntType = INT_MEMORY_AND_IO;
106 link->conf.Present = PRESENT_OPTION;
107
15b99ac1 108 return fdomain_config(link);
1da177e4
LT
109} /* fdomain_attach */
110
111/*====================================================================*/
112
fba395ee 113static void fdomain_detach(struct pcmcia_device *link)
1da177e4 114{
b4635811
DB
115 DEBUG(0, "fdomain_detach(0x%p)\n", link);
116
e2d40963 117 fdomain_release(link);
b4635811
DB
118
119 kfree(link->priv);
1da177e4
LT
120} /* fdomain_detach */
121
122/*====================================================================*/
123
124#define CS_CHECK(fn, ret) \
125do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
126
15b99ac1 127static int fdomain_config(struct pcmcia_device *link)
1da177e4 128{
1da177e4
LT
129 scsi_info_t *info = link->priv;
130 tuple_t tuple;
131 cisparse_t parse;
132 int i, last_ret, last_fn;
133 u_char tuple_data[64];
134 char str[16];
135 struct Scsi_Host *host;
136
137 DEBUG(0, "fdomain_config(0x%p)\n", link);
138
139 tuple.DesiredTuple = CISTPL_CONFIG;
140 tuple.TupleData = tuple_data;
141 tuple.TupleDataMax = 64;
142 tuple.TupleOffset = 0;
fba395ee
DB
143 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
144 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
145 CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));
1da177e4
LT
146 link->conf.ConfigBase = parse.config.base;
147
1da177e4 148 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
fba395ee 149 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
1da177e4 150 while (1) {
fba395ee
DB
151 if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
152 pcmcia_parse_tuple(link, &tuple, &parse) != 0)
1da177e4
LT
153 goto next_entry;
154 link->conf.ConfigIndex = parse.cftable_entry.index;
155 link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
fba395ee 156 i = pcmcia_request_io(link, &link->io);
1da177e4
LT
157 if (i == CS_SUCCESS) break;
158 next_entry:
fba395ee 159 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
1da177e4
LT
160 }
161
fba395ee
DB
162 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
163 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
15b99ac1 164
1da177e4
LT
165 /* A bad hack... */
166 release_region(link->io.BasePort1, link->io.NumPorts1);
167
168 /* Set configuration options for the fdomain driver */
169 sprintf(str, "%d,%d", link->io.BasePort1, link->irq.AssignedIRQ);
170 fdomain_setup(str);
15b99ac1 171
1da177e4
LT
172 host = __fdomain_16x0_detect(&fdomain_driver_template);
173 if (!host) {
174 printk(KERN_INFO "fdomain_cs: no SCSI devices found\n");
175 goto cs_failed;
176 }
15b99ac1
DB
177
178 if (scsi_add_host(host, NULL))
179 goto cs_failed;
1da177e4
LT
180 scsi_scan_host(host);
181
182 sprintf(info->node.dev_name, "scsi%d", host->host_no);
fd238232 183 link->dev_node = &info->node;
1da177e4 184 info->host = host;
15b99ac1 185
15b99ac1
DB
186 return 0;
187
1da177e4 188cs_failed:
fba395ee 189 cs_error(link, last_fn, last_ret);
1da177e4 190 fdomain_release(link);
15b99ac1 191 return -ENODEV;
1da177e4
LT
192} /* fdomain_config */
193
194/*====================================================================*/
195
fba395ee 196static void fdomain_release(struct pcmcia_device *link)
1da177e4 197{
5f2a71fc 198 scsi_info_t *info = link->priv;
1da177e4 199
5f2a71fc 200 DEBUG(0, "fdomain_release(0x%p)\n", link);
1da177e4 201
5f2a71fc 202 scsi_remove_host(info->host);
fba395ee 203 pcmcia_disable_device(link);
5f2a71fc 204 scsi_unregister(info->host);
1da177e4
LT
205}
206
207/*====================================================================*/
208
fba395ee 209static int fdomain_resume(struct pcmcia_device *link)
98e4c28b 210{
e2d40963 211 fdomain_16x0_bus_reset(NULL);
98e4c28b
DB
212
213 return 0;
214}
215
2d1fb376
DB
216static struct pcmcia_device_id fdomain_ids[] = {
217 PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "SCSI PCMCIA Card", 0xe3736c88, 0x859cad20),
218 PCMCIA_DEVICE_PROD_ID1("SCSI PCMCIA Adapter Card", 0x8dacb57e),
219 PCMCIA_DEVICE_PROD_ID12(" SIMPLE TECHNOLOGY Corporation", "SCSI PCMCIA Credit Card Controller", 0x182bdafe, 0xc80d106f),
220 PCMCIA_DEVICE_NULL,
221};
222MODULE_DEVICE_TABLE(pcmcia, fdomain_ids);
223
1da177e4
LT
224static struct pcmcia_driver fdomain_cs_driver = {
225 .owner = THIS_MODULE,
226 .drv = {
227 .name = "fdomain_cs",
228 },
15b99ac1 229 .probe = fdomain_probe,
cc3b4866 230 .remove = fdomain_detach,
2d1fb376 231 .id_table = fdomain_ids,
98e4c28b 232 .resume = fdomain_resume,
1da177e4
LT
233};
234
235static int __init init_fdomain_cs(void)
236{
237 return pcmcia_register_driver(&fdomain_cs_driver);
238}
239
240static void __exit exit_fdomain_cs(void)
241{
242 pcmcia_unregister_driver(&fdomain_cs_driver);
1da177e4
LT
243}
244
245module_init(init_fdomain_cs);
246module_exit(exit_fdomain_cs);
This page took 0.136568 seconds and 5 git commands to generate.