diff options
author | David Sterba <dsterba@suse.cz> | 2008-07-28 10:53:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-28 11:28:03 -0400 |
commit | 09e491e9a780433f8734eb6efb7293b2da690131 (patch) | |
tree | c8d5d541fa3bf7468265962328c7b1f4c43b0427 /drivers/char | |
parent | ff3e990e61a5a9124687a01a025c43b3564f82ab (diff) |
ipwireless: Explicitly request io and mem regions
ipwireless: Explicitly request io and mem regions
Documentation/pcmcia/driver-changes.txt says, that driver should call request_region
for used memory/io regions since PCMCIA does not do this (since 2.6.8).
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/pcmcia/ipwireless/main.c | 79 | ||||
-rw-r--r-- | drivers/char/pcmcia/ipwireless/main.h | 5 |
2 files changed, 50 insertions, 34 deletions
diff --git a/drivers/char/pcmcia/ipwireless/main.c b/drivers/char/pcmcia/ipwireless/main.c index 6bdd11df458..7169a0d3379 100644 --- a/drivers/char/pcmcia/ipwireless/main.c +++ b/drivers/char/pcmcia/ipwireless/main.c | |||
@@ -88,8 +88,6 @@ static int config_ipwireless(struct ipw_dev *ipw) | |||
88 | unsigned short buf[64]; | 88 | unsigned short buf[64]; |
89 | cisparse_t parse; | 89 | cisparse_t parse; |
90 | unsigned short cor_value; | 90 | unsigned short cor_value; |
91 | win_req_t request_attr_memory; | ||
92 | win_req_t request_common_memory; | ||
93 | memreq_t memreq_attr_memory; | 91 | memreq_t memreq_attr_memory; |
94 | memreq_t memreq_common_memory; | 92 | memreq_t memreq_common_memory; |
95 | 93 | ||
@@ -188,6 +186,9 @@ static int config_ipwireless(struct ipw_dev *ipw) | |||
188 | goto exit0; | 186 | goto exit0; |
189 | } | 187 | } |
190 | 188 | ||
189 | request_region(link->io.BasePort1, link->io.NumPorts1, | ||
190 | IPWIRELESS_PCCARD_NAME); | ||
191 | |||
191 | /* memory settings */ | 192 | /* memory settings */ |
192 | 193 | ||
193 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | 194 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; |
@@ -214,16 +215,16 @@ static int config_ipwireless(struct ipw_dev *ipw) | |||
214 | } | 215 | } |
215 | 216 | ||
216 | if (parse.cftable_entry.mem.nwin > 0) { | 217 | if (parse.cftable_entry.mem.nwin > 0) { |
217 | request_common_memory.Attributes = | 218 | ipw->request_common_memory.Attributes = |
218 | WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE; | 219 | WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE; |
219 | request_common_memory.Base = | 220 | ipw->request_common_memory.Base = |
220 | parse.cftable_entry.mem.win[0].host_addr; | 221 | parse.cftable_entry.mem.win[0].host_addr; |
221 | request_common_memory.Size = parse.cftable_entry.mem.win[0].len; | 222 | ipw->request_common_memory.Size = parse.cftable_entry.mem.win[0].len; |
222 | if (request_common_memory.Size < 0x1000) | 223 | if (ipw->request_common_memory.Size < 0x1000) |
223 | request_common_memory.Size = 0x1000; | 224 | ipw->request_common_memory.Size = 0x1000; |
224 | request_common_memory.AccessSpeed = 0; | 225 | ipw->request_common_memory.AccessSpeed = 0; |
225 | 226 | ||
226 | ret = pcmcia_request_window(&link, &request_common_memory, | 227 | ret = pcmcia_request_window(&link, &ipw->request_common_memory, |
227 | &ipw->handle_common_memory); | 228 | &ipw->handle_common_memory); |
228 | 229 | ||
229 | if (ret != CS_SUCCESS) { | 230 | if (ret != CS_SUCCESS) { |
@@ -246,16 +247,18 @@ static int config_ipwireless(struct ipw_dev *ipw) | |||
246 | ipw->is_v2_card = | 247 | ipw->is_v2_card = |
247 | parse.cftable_entry.mem.win[0].len == 0x100; | 248 | parse.cftable_entry.mem.win[0].len == 0x100; |
248 | 249 | ||
249 | ipw->common_memory = ioremap(request_common_memory.Base, | 250 | ipw->common_memory = ioremap(ipw->request_common_memory.Base, |
250 | request_common_memory.Size); | 251 | ipw->request_common_memory.Size); |
252 | request_mem_region(ipw->request_common_memory.Base, | ||
253 | ipw->request_common_memory.Size, IPWIRELESS_PCCARD_NAME); | ||
251 | 254 | ||
252 | request_attr_memory.Attributes = | 255 | ipw->request_attr_memory.Attributes = |
253 | WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM | WIN_ENABLE; | 256 | WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM | WIN_ENABLE; |
254 | request_attr_memory.Base = 0; | 257 | ipw->request_attr_memory.Base = 0; |
255 | request_attr_memory.Size = 0; /* this used to be 0x1000 */ | 258 | ipw->request_attr_memory.Size = 0; /* this used to be 0x1000 */ |
256 | request_attr_memory.AccessSpeed = 0; | 259 | ipw->request_attr_memory.AccessSpeed = 0; |
257 | 260 | ||
258 | ret = pcmcia_request_window(&link, &request_attr_memory, | 261 | ret = pcmcia_request_window(&link, &ipw->request_attr_memory, |
259 | &ipw->handle_attr_memory); | 262 | &ipw->handle_attr_memory); |
260 | 263 | ||
261 | if (ret != CS_SUCCESS) { | 264 | if (ret != CS_SUCCESS) { |
@@ -274,8 +277,10 @@ static int config_ipwireless(struct ipw_dev *ipw) | |||
274 | goto exit2; | 277 | goto exit2; |
275 | } | 278 | } |
276 | 279 | ||
277 | ipw->attr_memory = ioremap(request_attr_memory.Base, | 280 | ipw->attr_memory = ioremap(ipw->request_attr_memory.Base, |
278 | request_attr_memory.Size); | 281 | ipw->request_attr_memory.Size); |
282 | request_mem_region(ipw->request_attr_memory.Base, ipw->request_attr_memory.Size, | ||
283 | IPWIRELESS_PCCARD_NAME); | ||
279 | } | 284 | } |
280 | 285 | ||
281 | INIT_WORK(&ipw->work_reboot, signalled_reboot_work); | 286 | INIT_WORK(&ipw->work_reboot, signalled_reboot_work); |
@@ -312,12 +317,12 @@ static int config_ipwireless(struct ipw_dev *ipw) | |||
312 | if (ipw->attr_memory && ipw->common_memory) | 317 | if (ipw->attr_memory && ipw->common_memory) |
313 | printk(KERN_INFO IPWIRELESS_PCCARD_NAME | 318 | printk(KERN_INFO IPWIRELESS_PCCARD_NAME |
314 | ": attr memory 0x%08lx-0x%08lx, common memory 0x%08lx-0x%08lx\n", | 319 | ": attr memory 0x%08lx-0x%08lx, common memory 0x%08lx-0x%08lx\n", |
315 | request_attr_memory.Base, | 320 | ipw->request_attr_memory.Base, |
316 | request_attr_memory.Base | 321 | ipw->request_attr_memory.Base |
317 | + request_attr_memory.Size - 1, | 322 | + ipw->request_attr_memory.Size - 1, |
318 | request_common_memory.Base, | 323 | ipw->request_common_memory.Base, |
319 | request_common_memory.Base | 324 | ipw->request_common_memory.Base |
320 | + request_common_memory.Size - 1); | 325 | + ipw->request_common_memory.Size - 1); |
321 | 326 | ||
322 | ipw->network = ipwireless_network_create(ipw->hardware); | 327 | ipw->network = ipwireless_network_create(ipw->hardware); |
323 | if (!ipw->network) | 328 | if (!ipw->network) |
@@ -349,12 +354,16 @@ exit4: | |||
349 | pcmcia_disable_device(link); | 354 | pcmcia_disable_device(link); |
350 | exit3: | 355 | exit3: |
351 | if (ipw->attr_memory) { | 356 | if (ipw->attr_memory) { |
357 | release_mem_region(ipw->request_attr_memory.Base, | ||
358 | ipw->request_attr_memory.Size); | ||
352 | iounmap(ipw->attr_memory); | 359 | iounmap(ipw->attr_memory); |
353 | pcmcia_release_window(ipw->handle_attr_memory); | 360 | pcmcia_release_window(ipw->handle_attr_memory); |
354 | pcmcia_disable_device(link); | 361 | pcmcia_disable_device(link); |
355 | } | 362 | } |
356 | exit2: | 363 | exit2: |
357 | if (ipw->common_memory) { | 364 | if (ipw->common_memory) { |
365 | release_mem_region(ipw->request_common_memory.Base, | ||
366 | ipw->request_common_memory.Size); | ||
358 | iounmap(ipw->common_memory); | 367 | iounmap(ipw->common_memory); |
359 | pcmcia_release_window(ipw->handle_common_memory); | 368 | pcmcia_release_window(ipw->handle_common_memory); |
360 | } | 369 | } |
@@ -366,19 +375,25 @@ exit0: | |||
366 | 375 | ||
367 | static void release_ipwireless(struct ipw_dev *ipw) | 376 | static void release_ipwireless(struct ipw_dev *ipw) |
368 | { | 377 | { |
369 | struct pcmcia_device *link = ipw->link; | 378 | pcmcia_disable_device(ipw->link); |
370 | |||
371 | pcmcia_disable_device(link); | ||
372 | 379 | ||
373 | if (ipw->common_memory) | 380 | if (ipw->common_memory) { |
381 | release_mem_region(ipw->request_common_memory.Base, | ||
382 | ipw->request_common_memory.Size); | ||
374 | iounmap(ipw->common_memory); | 383 | iounmap(ipw->common_memory); |
375 | if (ipw->attr_memory) | 384 | } |
385 | if (ipw->attr_memory) { | ||
386 | release_mem_region(ipw->request_attr_memory.Base, | ||
387 | ipw->request_attr_memory.Size); | ||
376 | iounmap(ipw->attr_memory); | 388 | iounmap(ipw->attr_memory); |
389 | } | ||
377 | if (ipw->common_memory) | 390 | if (ipw->common_memory) |
378 | pcmcia_release_window(ipw->handle_common_memory); | 391 | pcmcia_release_window(ipw->handle_common_memory); |
379 | if (ipw->attr_memory) | 392 | if (ipw->attr_memory) |
380 | pcmcia_release_window(ipw->handle_attr_memory); | 393 | pcmcia_release_window(ipw->handle_attr_memory); |
381 | pcmcia_disable_device(link); | 394 | |
395 | /* Break the link with Card Services */ | ||
396 | pcmcia_disable_device(ipw->link); | ||
382 | } | 397 | } |
383 | 398 | ||
384 | /* | 399 | /* |
@@ -436,10 +451,6 @@ static void ipwireless_detach(struct pcmcia_device *link) | |||
436 | 451 | ||
437 | release_ipwireless(ipw); | 452 | release_ipwireless(ipw); |
438 | 453 | ||
439 | /* Break the link with Card Services */ | ||
440 | if (link) | ||
441 | pcmcia_disable_device(link); | ||
442 | |||
443 | if (ipw->tty != NULL) | 454 | if (ipw->tty != NULL) |
444 | ipwireless_tty_free(ipw->tty); | 455 | ipwireless_tty_free(ipw->tty); |
445 | if (ipw->network != NULL) | 456 | if (ipw->network != NULL) |
diff --git a/drivers/char/pcmcia/ipwireless/main.h b/drivers/char/pcmcia/ipwireless/main.h index 1bfdcc8d47d..0e0363af9ab 100644 --- a/drivers/char/pcmcia/ipwireless/main.h +++ b/drivers/char/pcmcia/ipwireless/main.h | |||
@@ -45,10 +45,15 @@ struct ipw_tty; | |||
45 | struct ipw_dev { | 45 | struct ipw_dev { |
46 | struct pcmcia_device *link; | 46 | struct pcmcia_device *link; |
47 | int is_v2_card; | 47 | int is_v2_card; |
48 | |||
48 | window_handle_t handle_attr_memory; | 49 | window_handle_t handle_attr_memory; |
49 | void __iomem *attr_memory; | 50 | void __iomem *attr_memory; |
51 | win_req_t request_attr_memory; | ||
52 | |||
50 | window_handle_t handle_common_memory; | 53 | window_handle_t handle_common_memory; |
51 | void __iomem *common_memory; | 54 | void __iomem *common_memory; |
55 | win_req_t request_common_memory; | ||
56 | |||
52 | dev_node_t nodes[2]; | 57 | dev_node_t nodes[2]; |
53 | /* Reference to attribute memory, containing CIS data */ | 58 | /* Reference to attribute memory, containing CIS data */ |
54 | void *attribute_memory; | 59 | void *attribute_memory; |