]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/scsi/pcmcia/fdomain_stub.c
pcmcia: do not use io_req_t after call to pcmcia_request_io()
[net-next-2.6.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>
1da177e4
LT
37#include <linux/slab.h>
38#include <linux/string.h>
39#include <linux/ioport.h>
40#include <scsi/scsi.h>
41#include <linux/major.h>
42#include <linux/blkdev.h>
43#include <scsi/scsi_ioctl.h>
44
45#include "scsi.h"
46#include <scsi/scsi_host.h>
47#include "fdomain.h"
48
1da177e4
LT
49#include <pcmcia/cs.h>
50#include <pcmcia/cistpl.h>
51#include <pcmcia/ds.h>
52
53/*====================================================================*/
54
55/* Module parameters */
56
57MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
58MODULE_DESCRIPTION("Future Domain PCMCIA SCSI driver");
59MODULE_LICENSE("Dual MPL/GPL");
60
1da177e4
LT
61/*====================================================================*/
62
63typedef struct scsi_info_t {
fd238232 64 struct pcmcia_device *p_dev;
1da177e4
LT
65 struct Scsi_Host *host;
66} scsi_info_t;
67
68
fba395ee 69static void fdomain_release(struct pcmcia_device *link);
cc3b4866 70static void fdomain_detach(struct pcmcia_device *p_dev);
15b99ac1 71static int fdomain_config(struct pcmcia_device *link);
1da177e4 72
15b99ac1 73static int fdomain_probe(struct pcmcia_device *link)
1da177e4 74{
15b99ac1
DB
75 scsi_info_t *info;
76
3e716617 77 dev_dbg(&link->dev, "fdomain_attach()\n");
15b99ac1
DB
78
79 /* Create new SCSI device */
80 info = kzalloc(sizeof(*info), GFP_KERNEL);
81 if (!info)
82 return -ENOMEM;
83
84 info->p_dev = link;
85 link->priv = info;
86 link->io.NumPorts1 = 0x10;
87 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
88 link->io.IOAddrLines = 10;
15b99ac1
DB
89 link->conf.Attributes = CONF_ENABLE_IRQ;
90 link->conf.IntType = INT_MEMORY_AND_IO;
91 link->conf.Present = PRESENT_OPTION;
92
15b99ac1 93 return fdomain_config(link);
1da177e4
LT
94} /* fdomain_attach */
95
96/*====================================================================*/
97
fba395ee 98static void fdomain_detach(struct pcmcia_device *link)
1da177e4 99{
3e716617 100 dev_dbg(&link->dev, "fdomain_detach\n");
b4635811 101
e2d40963 102 fdomain_release(link);
b4635811
DB
103
104 kfree(link->priv);
1da177e4
LT
105} /* fdomain_detach */
106
107/*====================================================================*/
108
0e6f9d27 109static int fdomain_config_check(struct pcmcia_device *p_dev,
8e2fc39d
DB
110 cistpl_cftable_entry_t *cfg,
111 cistpl_cftable_entry_t *dflt,
ad913c11 112 unsigned int vcc,
8e2fc39d 113 void *priv_data)
0e6f9d27 114{
0e6f9d27
DB
115 p_dev->io.BasePort1 = cfg->io.win[0].base;
116 return pcmcia_request_io(p_dev, &p_dev->io);
117}
118
119
15b99ac1 120static int fdomain_config(struct pcmcia_device *link)
1da177e4 121{
1da177e4 122 scsi_info_t *info = link->priv;
3e716617 123 int ret;
ecb8a847 124 char str[22];
1da177e4
LT
125 struct Scsi_Host *host;
126
3e716617 127 dev_dbg(&link->dev, "fdomain_config\n");
1da177e4 128
3e716617
DB
129 ret = pcmcia_loop_config(link, fdomain_config_check, NULL);
130 if (ret)
0e6f9d27 131 goto failed;
1da177e4 132
eb14120f 133 if (!link->irq)
3e716617
DB
134 goto failed;
135 ret = pcmcia_request_configuration(link, &link->conf);
136 if (ret)
137 goto failed;
15b99ac1 138
1da177e4 139 /* A bad hack... */
9a017a91 140 release_region(link->resource[0]->start, resource_size(link->resource[0]));
1da177e4
LT
141
142 /* Set configuration options for the fdomain driver */
9a017a91 143 sprintf(str, "%d,%d", (unsigned int) link->resource[0]->start, link->irq);
1da177e4 144 fdomain_setup(str);
15b99ac1 145
1da177e4
LT
146 host = __fdomain_16x0_detect(&fdomain_driver_template);
147 if (!host) {
148 printk(KERN_INFO "fdomain_cs: no SCSI devices found\n");
3e716617 149 goto failed;
1da177e4 150 }
15b99ac1
DB
151
152 if (scsi_add_host(host, NULL))
3e716617 153 goto failed;
1da177e4
LT
154 scsi_scan_host(host);
155
1da177e4 156 info->host = host;
15b99ac1 157
15b99ac1
DB
158 return 0;
159
0e6f9d27 160failed:
1da177e4 161 fdomain_release(link);
15b99ac1 162 return -ENODEV;
1da177e4
LT
163} /* fdomain_config */
164
165/*====================================================================*/
166
fba395ee 167static void fdomain_release(struct pcmcia_device *link)
1da177e4 168{
5f2a71fc 169 scsi_info_t *info = link->priv;
1da177e4 170
3e716617 171 dev_dbg(&link->dev, "fdomain_release\n");
1da177e4 172
5f2a71fc 173 scsi_remove_host(info->host);
fba395ee 174 pcmcia_disable_device(link);
5f2a71fc 175 scsi_unregister(info->host);
1da177e4
LT
176}
177
178/*====================================================================*/
179
fba395ee 180static int fdomain_resume(struct pcmcia_device *link)
98e4c28b 181{
e2d40963 182 fdomain_16x0_bus_reset(NULL);
98e4c28b
DB
183
184 return 0;
185}
186
2d1fb376
DB
187static struct pcmcia_device_id fdomain_ids[] = {
188 PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "SCSI PCMCIA Card", 0xe3736c88, 0x859cad20),
189 PCMCIA_DEVICE_PROD_ID1("SCSI PCMCIA Adapter Card", 0x8dacb57e),
190 PCMCIA_DEVICE_PROD_ID12(" SIMPLE TECHNOLOGY Corporation", "SCSI PCMCIA Credit Card Controller", 0x182bdafe, 0xc80d106f),
191 PCMCIA_DEVICE_NULL,
192};
193MODULE_DEVICE_TABLE(pcmcia, fdomain_ids);
194
1da177e4
LT
195static struct pcmcia_driver fdomain_cs_driver = {
196 .owner = THIS_MODULE,
197 .drv = {
198 .name = "fdomain_cs",
199 },
15b99ac1 200 .probe = fdomain_probe,
cc3b4866 201 .remove = fdomain_detach,
2d1fb376 202 .id_table = fdomain_ids,
98e4c28b 203 .resume = fdomain_resume,
1da177e4
LT
204};
205
206static int __init init_fdomain_cs(void)
207{
208 return pcmcia_register_driver(&fdomain_cs_driver);
209}
210
211static void __exit exit_fdomain_cs(void)
212{
213 pcmcia_unregister_driver(&fdomain_cs_driver);
1da177e4
LT
214}
215
216module_init(init_fdomain_cs);
217module_exit(exit_fdomain_cs);