diff options
Diffstat (limited to 'drivers/scsi/pcmcia/aha152x_stub.c')
-rw-r--r-- | drivers/scsi/pcmcia/aha152x_stub.c | 99 |
1 files changed, 36 insertions, 63 deletions
diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c index 7c5306499832..0c9edb7051f4 100644 --- a/drivers/scsi/pcmcia/aha152x_stub.c +++ b/drivers/scsi/pcmcia/aha152x_stub.c | |||
@@ -95,27 +95,21 @@ typedef struct scsi_info_t { | |||
95 | } scsi_info_t; | 95 | } scsi_info_t; |
96 | 96 | ||
97 | static void aha152x_release_cs(dev_link_t *link); | 97 | static void aha152x_release_cs(dev_link_t *link); |
98 | static int aha152x_event(event_t event, int priority, | 98 | static void aha152x_detach(struct pcmcia_device *p_dev); |
99 | event_callback_args_t *args); | 99 | static void aha152x_config_cs(dev_link_t *link); |
100 | |||
101 | static dev_link_t *aha152x_attach(void); | ||
102 | static void aha152x_detach(dev_link_t *); | ||
103 | 100 | ||
104 | static dev_link_t *dev_list; | 101 | static dev_link_t *dev_list; |
105 | static dev_info_t dev_info = "aha152x_cs"; | ||
106 | 102 | ||
107 | static dev_link_t *aha152x_attach(void) | 103 | static int aha152x_attach(struct pcmcia_device *p_dev) |
108 | { | 104 | { |
109 | scsi_info_t *info; | 105 | scsi_info_t *info; |
110 | client_reg_t client_reg; | ||
111 | dev_link_t *link; | 106 | dev_link_t *link; |
112 | int ret; | ||
113 | 107 | ||
114 | DEBUG(0, "aha152x_attach()\n"); | 108 | DEBUG(0, "aha152x_attach()\n"); |
115 | 109 | ||
116 | /* Create new SCSI device */ | 110 | /* Create new SCSI device */ |
117 | info = kmalloc(sizeof(*info), GFP_KERNEL); | 111 | info = kmalloc(sizeof(*info), GFP_KERNEL); |
118 | if (!info) return NULL; | 112 | if (!info) return -ENOMEM; |
119 | memset(info, 0, sizeof(*info)); | 113 | memset(info, 0, sizeof(*info)); |
120 | link = &info->link; link->priv = info; | 114 | link = &info->link; link->priv = info; |
121 | 115 | ||
@@ -129,26 +123,20 @@ static dev_link_t *aha152x_attach(void) | |||
129 | link->conf.IntType = INT_MEMORY_AND_IO; | 123 | link->conf.IntType = INT_MEMORY_AND_IO; |
130 | link->conf.Present = PRESENT_OPTION; | 124 | link->conf.Present = PRESENT_OPTION; |
131 | 125 | ||
132 | /* Register with Card Services */ | 126 | link->handle = p_dev; |
133 | link->next = dev_list; | 127 | p_dev->instance = link; |
134 | dev_list = link; | 128 | |
135 | client_reg.dev_info = &dev_info; | 129 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; |
136 | client_reg.Version = 0x0210; | 130 | aha152x_config_cs(link); |
137 | client_reg.event_callback_args.client_data = link; | 131 | |
138 | ret = pcmcia_register_client(&link->handle, &client_reg); | 132 | return 0; |
139 | if (ret != 0) { | ||
140 | cs_error(link->handle, RegisterClient, ret); | ||
141 | aha152x_detach(link); | ||
142 | return NULL; | ||
143 | } | ||
144 | |||
145 | return link; | ||
146 | } /* aha152x_attach */ | 133 | } /* aha152x_attach */ |
147 | 134 | ||
148 | /*====================================================================*/ | 135 | /*====================================================================*/ |
149 | 136 | ||
150 | static void aha152x_detach(dev_link_t *link) | 137 | static void aha152x_detach(struct pcmcia_device *p_dev) |
151 | { | 138 | { |
139 | dev_link_t *link = dev_to_instance(p_dev); | ||
152 | dev_link_t **linkp; | 140 | dev_link_t **linkp; |
153 | 141 | ||
154 | DEBUG(0, "aha152x_detach(0x%p)\n", link); | 142 | DEBUG(0, "aha152x_detach(0x%p)\n", link); |
@@ -162,9 +150,6 @@ static void aha152x_detach(dev_link_t *link) | |||
162 | if (link->state & DEV_CONFIG) | 150 | if (link->state & DEV_CONFIG) |
163 | aha152x_release_cs(link); | 151 | aha152x_release_cs(link); |
164 | 152 | ||
165 | if (link->handle) | ||
166 | pcmcia_deregister_client(link->handle); | ||
167 | |||
168 | /* Unlink device structure, free bits */ | 153 | /* Unlink device structure, free bits */ |
169 | *linkp = link->next; | 154 | *linkp = link->next; |
170 | kfree(link->priv); | 155 | kfree(link->priv); |
@@ -272,44 +257,31 @@ static void aha152x_release_cs(dev_link_t *link) | |||
272 | link->state &= ~DEV_CONFIG; | 257 | link->state &= ~DEV_CONFIG; |
273 | } | 258 | } |
274 | 259 | ||
275 | static int aha152x_event(event_t event, int priority, | 260 | static int aha152x_suspend(struct pcmcia_device *dev) |
276 | event_callback_args_t *args) | ||
277 | { | 261 | { |
278 | dev_link_t *link = args->client_data; | 262 | dev_link_t *link = dev_to_instance(dev); |
279 | scsi_info_t *info = link->priv; | 263 | |
280 | |||
281 | DEBUG(0, "aha152x_event(0x%06x)\n", event); | ||
282 | |||
283 | switch (event) { | ||
284 | case CS_EVENT_CARD_REMOVAL: | ||
285 | link->state &= ~DEV_PRESENT; | ||
286 | if (link->state & DEV_CONFIG) | ||
287 | aha152x_release_cs(link); | ||
288 | break; | ||
289 | case CS_EVENT_CARD_INSERTION: | ||
290 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | ||
291 | aha152x_config_cs(link); | ||
292 | break; | ||
293 | case CS_EVENT_PM_SUSPEND: | ||
294 | link->state |= DEV_SUSPEND; | 264 | link->state |= DEV_SUSPEND; |
295 | /* Fall through... */ | ||
296 | case CS_EVENT_RESET_PHYSICAL: | ||
297 | if (link->state & DEV_CONFIG) | 265 | if (link->state & DEV_CONFIG) |
298 | pcmcia_release_configuration(link->handle); | 266 | pcmcia_release_configuration(link->handle); |
299 | break; | 267 | |
300 | case CS_EVENT_PM_RESUME: | 268 | return 0; |
269 | } | ||
270 | |||
271 | static int aha152x_resume(struct pcmcia_device *dev) | ||
272 | { | ||
273 | dev_link_t *link = dev_to_instance(dev); | ||
274 | scsi_info_t *info = link->priv; | ||
275 | |||
301 | link->state &= ~DEV_SUSPEND; | 276 | link->state &= ~DEV_SUSPEND; |
302 | /* Fall through... */ | ||
303 | case CS_EVENT_CARD_RESET: | ||
304 | if (link->state & DEV_CONFIG) { | 277 | if (link->state & DEV_CONFIG) { |
305 | Scsi_Cmnd tmp; | 278 | Scsi_Cmnd tmp; |
306 | pcmcia_request_configuration(link->handle, &link->conf); | 279 | pcmcia_request_configuration(link->handle, &link->conf); |
307 | tmp.device->host = info->host; | 280 | tmp.device->host = info->host; |
308 | aha152x_host_reset(&tmp); | 281 | aha152x_host_reset(&tmp); |
309 | } | 282 | } |
310 | break; | 283 | |
311 | } | 284 | return 0; |
312 | return 0; | ||
313 | } | 285 | } |
314 | 286 | ||
315 | static struct pcmcia_device_id aha152x_ids[] = { | 287 | static struct pcmcia_device_id aha152x_ids[] = { |
@@ -327,10 +299,11 @@ static struct pcmcia_driver aha152x_cs_driver = { | |||
327 | .drv = { | 299 | .drv = { |
328 | .name = "aha152x_cs", | 300 | .name = "aha152x_cs", |
329 | }, | 301 | }, |
330 | .attach = aha152x_attach, | 302 | .probe = aha152x_attach, |
331 | .event = aha152x_event, | 303 | .remove = aha152x_detach, |
332 | .detach = aha152x_detach, | ||
333 | .id_table = aha152x_ids, | 304 | .id_table = aha152x_ids, |
305 | .suspend = aha152x_suspend, | ||
306 | .resume = aha152x_resume, | ||
334 | }; | 307 | }; |
335 | 308 | ||
336 | static int __init init_aha152x_cs(void) | 309 | static int __init init_aha152x_cs(void) |