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 | |
| 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>
| -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 6bdd11df4584..7169a0d3379a 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 1bfdcc8d47d6..0e0363af9ab2 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; |
