diff options
Diffstat (limited to 'drivers/net/wireless/ray_cs.c')
-rw-r--r-- | drivers/net/wireless/ray_cs.c | 279 |
1 files changed, 109 insertions, 170 deletions
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 7880d8c31aad..879eb427607c 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c | |||
@@ -90,8 +90,8 @@ module_param(pc_debug, int, 0); | |||
90 | #define DEBUG(n, args...) | 90 | #define DEBUG(n, args...) |
91 | #endif | 91 | #endif |
92 | /** Prototypes based on PCMCIA skeleton driver *******************************/ | 92 | /** Prototypes based on PCMCIA skeleton driver *******************************/ |
93 | static void ray_config(dev_link_t *link); | 93 | static int ray_config(struct pcmcia_device *link); |
94 | static void ray_release(dev_link_t *link); | 94 | static void ray_release(struct pcmcia_device *link); |
95 | static void ray_detach(struct pcmcia_device *p_dev); | 95 | static void ray_detach(struct pcmcia_device *p_dev); |
96 | 96 | ||
97 | /***** Prototypes indicated by device structure ******************************/ | 97 | /***** Prototypes indicated by device structure ******************************/ |
@@ -190,20 +190,17 @@ static int bc; | |||
190 | static char *phy_addr = NULL; | 190 | static char *phy_addr = NULL; |
191 | 191 | ||
192 | 192 | ||
193 | /* A linked list of "instances" of the ray device. Each actual | 193 | /* A struct pcmcia_device structure has fields for most things that are needed |
194 | PCMCIA card corresponds to one device instance, and is described | ||
195 | by one dev_link_t structure (defined in ds.h). | ||
196 | */ | ||
197 | static dev_link_t *dev_list = NULL; | ||
198 | |||
199 | /* A dev_link_t structure has fields for most things that are needed | ||
200 | to keep track of a socket, but there will usually be some device | 194 | to keep track of a socket, but there will usually be some device |
201 | specific information that also needs to be kept track of. The | 195 | specific information that also needs to be kept track of. The |
202 | 'priv' pointer in a dev_link_t structure can be used to point to | 196 | 'priv' pointer in a struct pcmcia_device structure can be used to point to |
203 | a device-specific private data structure, like this. | 197 | a device-specific private data structure, like this. |
204 | */ | 198 | */ |
205 | static unsigned int ray_mem_speed = 500; | 199 | static unsigned int ray_mem_speed = 500; |
206 | 200 | ||
201 | /* WARNING: THIS DRIVER IS NOT CAPABLE OF HANDLING MULTIPLE DEVICES! */ | ||
202 | static struct pcmcia_device *this_device = NULL; | ||
203 | |||
207 | MODULE_AUTHOR("Corey Thomas <corey@world.std.com>"); | 204 | MODULE_AUTHOR("Corey Thomas <corey@world.std.com>"); |
208 | MODULE_DESCRIPTION("Raylink/WebGear wireless LAN driver"); | 205 | MODULE_DESCRIPTION("Raylink/WebGear wireless LAN driver"); |
209 | MODULE_LICENSE("GPL"); | 206 | MODULE_LICENSE("GPL"); |
@@ -306,56 +303,46 @@ static char rcsid[] = "Raylink/WebGear wireless LAN - Corey <Thomas corey@world. | |||
306 | configure the card at this point -- we wait until we receive a | 303 | configure the card at this point -- we wait until we receive a |
307 | card insertion event. | 304 | card insertion event. |
308 | =============================================================================*/ | 305 | =============================================================================*/ |
309 | static int ray_attach(struct pcmcia_device *p_dev) | 306 | static int ray_probe(struct pcmcia_device *p_dev) |
310 | { | 307 | { |
311 | dev_link_t *link; | ||
312 | ray_dev_t *local; | 308 | ray_dev_t *local; |
313 | struct net_device *dev; | 309 | struct net_device *dev; |
314 | |||
315 | DEBUG(1, "ray_attach()\n"); | ||
316 | 310 | ||
317 | /* Initialize the dev_link_t structure */ | 311 | DEBUG(1, "ray_attach()\n"); |
318 | link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); | ||
319 | |||
320 | if (!link) | ||
321 | return -ENOMEM; | ||
322 | 312 | ||
323 | /* Allocate space for private device-specific data */ | 313 | /* Allocate space for private device-specific data */ |
324 | dev = alloc_etherdev(sizeof(ray_dev_t)); | 314 | dev = alloc_etherdev(sizeof(ray_dev_t)); |
325 | |||
326 | if (!dev) | 315 | if (!dev) |
327 | goto fail_alloc_dev; | 316 | goto fail_alloc_dev; |
328 | 317 | ||
329 | local = dev->priv; | 318 | local = dev->priv; |
330 | 319 | local->finder = p_dev; | |
331 | memset(link, 0, sizeof(struct dev_link_t)); | ||
332 | 320 | ||
333 | /* The io structure describes IO port mapping. None used here */ | 321 | /* The io structure describes IO port mapping. None used here */ |
334 | link->io.NumPorts1 = 0; | 322 | p_dev->io.NumPorts1 = 0; |
335 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 323 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
336 | link->io.IOAddrLines = 5; | 324 | p_dev->io.IOAddrLines = 5; |
337 | 325 | ||
338 | /* Interrupt setup. For PCMCIA, driver takes what's given */ | 326 | /* Interrupt setup. For PCMCIA, driver takes what's given */ |
339 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; | 327 | p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; |
340 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 328 | p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; |
341 | link->irq.Handler = &ray_interrupt; | 329 | p_dev->irq.Handler = &ray_interrupt; |
342 | 330 | ||
343 | /* General socket configuration */ | 331 | /* General socket configuration */ |
344 | link->conf.Attributes = CONF_ENABLE_IRQ; | 332 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
345 | link->conf.Vcc = 50; | 333 | p_dev->conf.IntType = INT_MEMORY_AND_IO; |
346 | link->conf.IntType = INT_MEMORY_AND_IO; | 334 | p_dev->conf.ConfigIndex = 1; |
347 | link->conf.ConfigIndex = 1; | 335 | p_dev->conf.Present = PRESENT_OPTION; |
348 | link->conf.Present = PRESENT_OPTION; | 336 | |
349 | 337 | p_dev->priv = dev; | |
350 | link->priv = dev; | 338 | p_dev->irq.Instance = dev; |
351 | link->irq.Instance = dev; | ||
352 | 339 | ||
353 | local->finder = link; | 340 | local->finder = p_dev; |
354 | local->card_status = CARD_INSERTED; | 341 | local->card_status = CARD_INSERTED; |
355 | local->authentication_state = UNAUTHENTICATED; | 342 | local->authentication_state = UNAUTHENTICATED; |
356 | local->num_multi = 0; | 343 | local->num_multi = 0; |
357 | DEBUG(2,"ray_attach link = %p, dev = %p, local = %p, intr = %p\n", | 344 | DEBUG(2,"ray_attach p_dev = %p, dev = %p, local = %p, intr = %p\n", |
358 | link,dev,local,&ray_interrupt); | 345 | p_dev,dev,local,&ray_interrupt); |
359 | 346 | ||
360 | /* Raylink entries in the device structure */ | 347 | /* Raylink entries in the device structure */ |
361 | dev->hard_start_xmit = &ray_dev_start_xmit; | 348 | dev->hard_start_xmit = &ray_dev_start_xmit; |
@@ -379,16 +366,10 @@ static int ray_attach(struct pcmcia_device *p_dev) | |||
379 | 366 | ||
380 | init_timer(&local->timer); | 367 | init_timer(&local->timer); |
381 | 368 | ||
382 | link->handle = p_dev; | 369 | this_device = p_dev; |
383 | p_dev->instance = link; | 370 | return ray_config(p_dev); |
384 | |||
385 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | ||
386 | ray_config(link); | ||
387 | |||
388 | return 0; | ||
389 | 371 | ||
390 | fail_alloc_dev: | 372 | fail_alloc_dev: |
391 | kfree(link); | ||
392 | return -ENOMEM; | 373 | return -ENOMEM; |
393 | } /* ray_attach */ | 374 | } /* ray_attach */ |
394 | /*============================================================================= | 375 | /*============================================================================= |
@@ -397,37 +378,25 @@ fail_alloc_dev: | |||
397 | structures are freed. Otherwise, the structures will be freed | 378 | structures are freed. Otherwise, the structures will be freed |
398 | when the device is released. | 379 | when the device is released. |
399 | =============================================================================*/ | 380 | =============================================================================*/ |
400 | static void ray_detach(struct pcmcia_device *p_dev) | 381 | static void ray_detach(struct pcmcia_device *link) |
401 | { | 382 | { |
402 | dev_link_t *link = dev_to_instance(p_dev); | ||
403 | dev_link_t **linkp; | ||
404 | struct net_device *dev; | 383 | struct net_device *dev; |
405 | ray_dev_t *local; | 384 | ray_dev_t *local; |
406 | 385 | ||
407 | DEBUG(1, "ray_detach(0x%p)\n", link); | 386 | DEBUG(1, "ray_detach(0x%p)\n", link); |
408 | |||
409 | /* Locate device structure */ | ||
410 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
411 | if (*linkp == link) break; | ||
412 | if (*linkp == NULL) | ||
413 | return; | ||
414 | 387 | ||
388 | this_device = NULL; | ||
415 | dev = link->priv; | 389 | dev = link->priv; |
416 | 390 | ||
417 | if (link->state & DEV_CONFIG) { | 391 | ray_release(link); |
418 | ray_release(link); | ||
419 | 392 | ||
420 | local = (ray_dev_t *)dev->priv; | 393 | local = (ray_dev_t *)dev->priv; |
421 | del_timer(&local->timer); | 394 | del_timer(&local->timer); |
422 | } | ||
423 | 395 | ||
424 | /* Unlink device structure, free pieces */ | ||
425 | *linkp = link->next; | ||
426 | if (link->priv) { | 396 | if (link->priv) { |
427 | if (link->dev) unregister_netdev(dev); | 397 | if (link->dev_node) unregister_netdev(dev); |
428 | free_netdev(dev); | 398 | free_netdev(dev); |
429 | } | 399 | } |
430 | kfree(link); | ||
431 | DEBUG(2,"ray_cs ray_detach ending\n"); | 400 | DEBUG(2,"ray_cs ray_detach ending\n"); |
432 | } /* ray_detach */ | 401 | } /* ray_detach */ |
433 | /*============================================================================= | 402 | /*============================================================================= |
@@ -438,9 +407,8 @@ static void ray_detach(struct pcmcia_device *p_dev) | |||
438 | #define CS_CHECK(fn, ret) \ | 407 | #define CS_CHECK(fn, ret) \ |
439 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 408 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
440 | #define MAX_TUPLE_SIZE 128 | 409 | #define MAX_TUPLE_SIZE 128 |
441 | static void ray_config(dev_link_t *link) | 410 | static int ray_config(struct pcmcia_device *link) |
442 | { | 411 | { |
443 | client_handle_t handle = link->handle; | ||
444 | tuple_t tuple; | 412 | tuple_t tuple; |
445 | cisparse_t parse; | 413 | cisparse_t parse; |
446 | int last_fn = 0, last_ret = 0; | 414 | int last_fn = 0, last_ret = 0; |
@@ -455,48 +423,45 @@ static void ray_config(dev_link_t *link) | |||
455 | 423 | ||
456 | /* This reads the card's CONFIG tuple to find its configuration regs */ | 424 | /* This reads the card's CONFIG tuple to find its configuration regs */ |
457 | tuple.DesiredTuple = CISTPL_CONFIG; | 425 | tuple.DesiredTuple = CISTPL_CONFIG; |
458 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | 426 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
459 | tuple.TupleData = buf; | 427 | tuple.TupleData = buf; |
460 | tuple.TupleDataMax = MAX_TUPLE_SIZE; | 428 | tuple.TupleDataMax = MAX_TUPLE_SIZE; |
461 | tuple.TupleOffset = 0; | 429 | tuple.TupleOffset = 0; |
462 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 430 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
463 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); | 431 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); |
464 | link->conf.ConfigBase = parse.config.base; | 432 | link->conf.ConfigBase = parse.config.base; |
465 | link->conf.Present = parse.config.rmask[0]; | 433 | link->conf.Present = parse.config.rmask[0]; |
466 | 434 | ||
467 | /* Determine card type and firmware version */ | 435 | /* Determine card type and firmware version */ |
468 | buf[0] = buf[MAX_TUPLE_SIZE - 1] = 0; | 436 | buf[0] = buf[MAX_TUPLE_SIZE - 1] = 0; |
469 | tuple.DesiredTuple = CISTPL_VERS_1; | 437 | tuple.DesiredTuple = CISTPL_VERS_1; |
470 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | 438 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
471 | tuple.TupleData = buf; | 439 | tuple.TupleData = buf; |
472 | tuple.TupleDataMax = MAX_TUPLE_SIZE; | 440 | tuple.TupleDataMax = MAX_TUPLE_SIZE; |
473 | tuple.TupleOffset = 2; | 441 | tuple.TupleOffset = 2; |
474 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 442 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
475 | 443 | ||
476 | for (i=0; i<tuple.TupleDataLen - 4; i++) | 444 | for (i=0; i<tuple.TupleDataLen - 4; i++) |
477 | if (buf[i] == 0) buf[i] = ' '; | 445 | if (buf[i] == 0) buf[i] = ' '; |
478 | printk(KERN_INFO "ray_cs Detected: %s\n",buf); | 446 | printk(KERN_INFO "ray_cs Detected: %s\n",buf); |
479 | 447 | ||
480 | /* Configure card */ | ||
481 | link->state |= DEV_CONFIG; | ||
482 | |||
483 | /* Now allocate an interrupt line. Note that this does not | 448 | /* Now allocate an interrupt line. Note that this does not |
484 | actually assign a handler to the interrupt. | 449 | actually assign a handler to the interrupt. |
485 | */ | 450 | */ |
486 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); | 451 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); |
487 | dev->irq = link->irq.AssignedIRQ; | 452 | dev->irq = link->irq.AssignedIRQ; |
488 | 453 | ||
489 | /* This actually configures the PCMCIA socket -- setting up | 454 | /* This actually configures the PCMCIA socket -- setting up |
490 | the I/O windows and the interrupt mapping. | 455 | the I/O windows and the interrupt mapping. |
491 | */ | 456 | */ |
492 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); | 457 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); |
493 | 458 | ||
494 | /*** Set up 32k window for shared memory (transmit and control) ************/ | 459 | /*** Set up 32k window for shared memory (transmit and control) ************/ |
495 | req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; | 460 | req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; |
496 | req.Base = 0; | 461 | req.Base = 0; |
497 | req.Size = 0x8000; | 462 | req.Size = 0x8000; |
498 | req.AccessSpeed = ray_mem_speed; | 463 | req.AccessSpeed = ray_mem_speed; |
499 | CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win)); | 464 | CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); |
500 | mem.CardOffset = 0x0000; mem.Page = 0; | 465 | mem.CardOffset = 0x0000; mem.Page = 0; |
501 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem)); | 466 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem)); |
502 | local->sram = ioremap(req.Base,req.Size); | 467 | local->sram = ioremap(req.Base,req.Size); |
@@ -506,7 +471,7 @@ static void ray_config(dev_link_t *link) | |||
506 | req.Base = 0; | 471 | req.Base = 0; |
507 | req.Size = 0x4000; | 472 | req.Size = 0x4000; |
508 | req.AccessSpeed = ray_mem_speed; | 473 | req.AccessSpeed = ray_mem_speed; |
509 | CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &local->rmem_handle)); | 474 | CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &local->rmem_handle)); |
510 | mem.CardOffset = 0x8000; mem.Page = 0; | 475 | mem.CardOffset = 0x8000; mem.Page = 0; |
511 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->rmem_handle, &mem)); | 476 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->rmem_handle, &mem)); |
512 | local->rmem = ioremap(req.Base,req.Size); | 477 | local->rmem = ioremap(req.Base,req.Size); |
@@ -516,7 +481,7 @@ static void ray_config(dev_link_t *link) | |||
516 | req.Base = 0; | 481 | req.Base = 0; |
517 | req.Size = 0x1000; | 482 | req.Size = 0x1000; |
518 | req.AccessSpeed = ray_mem_speed; | 483 | req.AccessSpeed = ray_mem_speed; |
519 | CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &local->amem_handle)); | 484 | CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &local->amem_handle)); |
520 | mem.CardOffset = 0x0000; mem.Page = 0; | 485 | mem.CardOffset = 0x0000; mem.Page = 0; |
521 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->amem_handle, &mem)); | 486 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->amem_handle, &mem)); |
522 | local->amem = ioremap(req.Base,req.Size); | 487 | local->amem = ioremap(req.Base,req.Size); |
@@ -526,32 +491,32 @@ static void ray_config(dev_link_t *link) | |||
526 | DEBUG(3,"ray_config amem=%p\n",local->amem); | 491 | DEBUG(3,"ray_config amem=%p\n",local->amem); |
527 | if (ray_init(dev) < 0) { | 492 | if (ray_init(dev) < 0) { |
528 | ray_release(link); | 493 | ray_release(link); |
529 | return; | 494 | return -ENODEV; |
530 | } | 495 | } |
531 | 496 | ||
532 | SET_NETDEV_DEV(dev, &handle_to_dev(handle)); | 497 | SET_NETDEV_DEV(dev, &handle_to_dev(link)); |
533 | i = register_netdev(dev); | 498 | i = register_netdev(dev); |
534 | if (i != 0) { | 499 | if (i != 0) { |
535 | printk("ray_config register_netdev() failed\n"); | 500 | printk("ray_config register_netdev() failed\n"); |
536 | ray_release(link); | 501 | ray_release(link); |
537 | return; | 502 | return i; |
538 | } | 503 | } |
539 | 504 | ||
540 | strcpy(local->node.dev_name, dev->name); | 505 | strcpy(local->node.dev_name, dev->name); |
541 | link->dev = &local->node; | 506 | link->dev_node = &local->node; |
542 | 507 | ||
543 | link->state &= ~DEV_CONFIG_PENDING; | ||
544 | printk(KERN_INFO "%s: RayLink, irq %d, hw_addr ", | 508 | printk(KERN_INFO "%s: RayLink, irq %d, hw_addr ", |
545 | dev->name, dev->irq); | 509 | dev->name, dev->irq); |
546 | for (i = 0; i < 6; i++) | 510 | for (i = 0; i < 6; i++) |
547 | printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); | 511 | printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); |
548 | 512 | ||
549 | return; | 513 | return 0; |
550 | 514 | ||
551 | cs_failed: | 515 | cs_failed: |
552 | cs_error(link->handle, last_fn, last_ret); | 516 | cs_error(link, last_fn, last_ret); |
553 | 517 | ||
554 | ray_release(link); | 518 | ray_release(link); |
519 | return -ENODEV; | ||
555 | } /* ray_config */ | 520 | } /* ray_config */ |
556 | 521 | ||
557 | static inline struct ccs __iomem *ccs_base(ray_dev_t *dev) | 522 | static inline struct ccs __iomem *ccs_base(ray_dev_t *dev) |
@@ -578,9 +543,9 @@ static int ray_init(struct net_device *dev) | |||
578 | UCHAR *p; | 543 | UCHAR *p; |
579 | struct ccs __iomem *pccs; | 544 | struct ccs __iomem *pccs; |
580 | ray_dev_t *local = (ray_dev_t *)dev->priv; | 545 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
581 | dev_link_t *link = local->finder; | 546 | struct pcmcia_device *link = local->finder; |
582 | DEBUG(1, "ray_init(0x%p)\n", dev); | 547 | DEBUG(1, "ray_init(0x%p)\n", dev); |
583 | if (!(link->state & DEV_PRESENT)) { | 548 | if (!(pcmcia_dev_present(link))) { |
584 | DEBUG(0,"ray_init - device not present\n"); | 549 | DEBUG(0,"ray_init - device not present\n"); |
585 | return -1; | 550 | return -1; |
586 | } | 551 | } |
@@ -640,10 +605,10 @@ static int dl_startup_params(struct net_device *dev) | |||
640 | int ccsindex; | 605 | int ccsindex; |
641 | ray_dev_t *local = (ray_dev_t *)dev->priv; | 606 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
642 | struct ccs __iomem *pccs; | 607 | struct ccs __iomem *pccs; |
643 | dev_link_t *link = local->finder; | 608 | struct pcmcia_device *link = local->finder; |
644 | 609 | ||
645 | DEBUG(1,"dl_startup_params entered\n"); | 610 | DEBUG(1,"dl_startup_params entered\n"); |
646 | if (!(link->state & DEV_PRESENT)) { | 611 | if (!(pcmcia_dev_present(link))) { |
647 | DEBUG(2,"ray_cs dl_startup_params - device not present\n"); | 612 | DEBUG(2,"ray_cs dl_startup_params - device not present\n"); |
648 | return -1; | 613 | return -1; |
649 | } | 614 | } |
@@ -747,9 +712,9 @@ static void verify_dl_startup(u_long data) | |||
747 | ray_dev_t *local = (ray_dev_t *)data; | 712 | ray_dev_t *local = (ray_dev_t *)data; |
748 | struct ccs __iomem *pccs = ccs_base(local) + local->dl_param_ccs; | 713 | struct ccs __iomem *pccs = ccs_base(local) + local->dl_param_ccs; |
749 | UCHAR status; | 714 | UCHAR status; |
750 | dev_link_t *link = local->finder; | 715 | struct pcmcia_device *link = local->finder; |
751 | 716 | ||
752 | if (!(link->state & DEV_PRESENT)) { | 717 | if (!(pcmcia_dev_present(link))) { |
753 | DEBUG(2,"ray_cs verify_dl_startup - device not present\n"); | 718 | DEBUG(2,"ray_cs verify_dl_startup - device not present\n"); |
754 | return; | 719 | return; |
755 | } | 720 | } |
@@ -787,8 +752,8 @@ static void start_net(u_long data) | |||
787 | ray_dev_t *local = (ray_dev_t *)data; | 752 | ray_dev_t *local = (ray_dev_t *)data; |
788 | struct ccs __iomem *pccs; | 753 | struct ccs __iomem *pccs; |
789 | int ccsindex; | 754 | int ccsindex; |
790 | dev_link_t *link = local->finder; | 755 | struct pcmcia_device *link = local->finder; |
791 | if (!(link->state & DEV_PRESENT)) { | 756 | if (!(pcmcia_dev_present(link))) { |
792 | DEBUG(2,"ray_cs start_net - device not present\n"); | 757 | DEBUG(2,"ray_cs start_net - device not present\n"); |
793 | return; | 758 | return; |
794 | } | 759 | } |
@@ -814,9 +779,9 @@ static void join_net(u_long data) | |||
814 | 779 | ||
815 | struct ccs __iomem *pccs; | 780 | struct ccs __iomem *pccs; |
816 | int ccsindex; | 781 | int ccsindex; |
817 | dev_link_t *link = local->finder; | 782 | struct pcmcia_device *link = local->finder; |
818 | 783 | ||
819 | if (!(link->state & DEV_PRESENT)) { | 784 | if (!(pcmcia_dev_present(link))) { |
820 | DEBUG(2,"ray_cs join_net - device not present\n"); | 785 | DEBUG(2,"ray_cs join_net - device not present\n"); |
821 | return; | 786 | return; |
822 | } | 787 | } |
@@ -840,7 +805,7 @@ static void join_net(u_long data) | |||
840 | device, and release the PCMCIA configuration. If the device is | 805 | device, and release the PCMCIA configuration. If the device is |
841 | still open, this will be postponed until it is closed. | 806 | still open, this will be postponed until it is closed. |
842 | =============================================================================*/ | 807 | =============================================================================*/ |
843 | static void ray_release(dev_link_t *link) | 808 | static void ray_release(struct pcmcia_device *link) |
844 | { | 809 | { |
845 | struct net_device *dev = link->priv; | 810 | struct net_device *dev = link->priv; |
846 | ray_dev_t *local = dev->priv; | 811 | ray_dev_t *local = dev->priv; |
@@ -849,56 +814,38 @@ static void ray_release(dev_link_t *link) | |||
849 | DEBUG(1, "ray_release(0x%p)\n", link); | 814 | DEBUG(1, "ray_release(0x%p)\n", link); |
850 | 815 | ||
851 | del_timer(&local->timer); | 816 | del_timer(&local->timer); |
852 | link->state &= ~DEV_CONFIG; | ||
853 | 817 | ||
854 | iounmap(local->sram); | 818 | iounmap(local->sram); |
855 | iounmap(local->rmem); | 819 | iounmap(local->rmem); |
856 | iounmap(local->amem); | 820 | iounmap(local->amem); |
857 | /* Do bother checking to see if these succeed or not */ | 821 | /* Do bother checking to see if these succeed or not */ |
858 | i = pcmcia_release_window(link->win); | ||
859 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(link->win) ret = %x\n",i); | ||
860 | i = pcmcia_release_window(local->amem_handle); | 822 | i = pcmcia_release_window(local->amem_handle); |
861 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i); | 823 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i); |
862 | i = pcmcia_release_window(local->rmem_handle); | 824 | i = pcmcia_release_window(local->rmem_handle); |
863 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i); | 825 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i); |
864 | i = pcmcia_release_configuration(link->handle); | 826 | pcmcia_disable_device(link); |
865 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseConfiguration ret = %x\n",i); | ||
866 | i = pcmcia_release_irq(link->handle, &link->irq); | ||
867 | if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseIRQ ret = %x\n",i); | ||
868 | 827 | ||
869 | DEBUG(2,"ray_release ending\n"); | 828 | DEBUG(2,"ray_release ending\n"); |
870 | } | 829 | } |
871 | 830 | ||
872 | static int ray_suspend(struct pcmcia_device *p_dev) | 831 | static int ray_suspend(struct pcmcia_device *link) |
873 | { | 832 | { |
874 | dev_link_t *link = dev_to_instance(p_dev); | ||
875 | struct net_device *dev = link->priv; | 833 | struct net_device *dev = link->priv; |
876 | 834 | ||
877 | link->state |= DEV_SUSPEND; | 835 | if (link->open) |
878 | if (link->state & DEV_CONFIG) { | 836 | netif_device_detach(dev); |
879 | if (link->open) | ||
880 | netif_device_detach(dev); | ||
881 | |||
882 | pcmcia_release_configuration(link->handle); | ||
883 | } | ||
884 | |||
885 | 837 | ||
886 | return 0; | 838 | return 0; |
887 | } | 839 | } |
888 | 840 | ||
889 | static int ray_resume(struct pcmcia_device *p_dev) | 841 | static int ray_resume(struct pcmcia_device *link) |
890 | { | 842 | { |
891 | dev_link_t *link = dev_to_instance(p_dev); | ||
892 | struct net_device *dev = link->priv; | 843 | struct net_device *dev = link->priv; |
893 | 844 | ||
894 | link->state &= ~DEV_SUSPEND; | 845 | if (link->open) { |
895 | if (link->state & DEV_CONFIG) { | 846 | ray_reset(dev); |
896 | pcmcia_request_configuration(link->handle, &link->conf); | 847 | netif_device_attach(dev); |
897 | if (link->open) { | 848 | } |
898 | ray_reset(dev); | ||
899 | netif_device_attach(dev); | ||
900 | } | ||
901 | } | ||
902 | 849 | ||
903 | return 0; | 850 | return 0; |
904 | } | 851 | } |
@@ -910,10 +857,10 @@ int ray_dev_init(struct net_device *dev) | |||
910 | int i; | 857 | int i; |
911 | #endif /* RAY_IMMEDIATE_INIT */ | 858 | #endif /* RAY_IMMEDIATE_INIT */ |
912 | ray_dev_t *local = dev->priv; | 859 | ray_dev_t *local = dev->priv; |
913 | dev_link_t *link = local->finder; | 860 | struct pcmcia_device *link = local->finder; |
914 | 861 | ||
915 | DEBUG(1,"ray_dev_init(dev=%p)\n",dev); | 862 | DEBUG(1,"ray_dev_init(dev=%p)\n",dev); |
916 | if (!(link->state & DEV_PRESENT)) { | 863 | if (!(pcmcia_dev_present(link))) { |
917 | DEBUG(2,"ray_dev_init - device not present\n"); | 864 | DEBUG(2,"ray_dev_init - device not present\n"); |
918 | return -1; | 865 | return -1; |
919 | } | 866 | } |
@@ -944,10 +891,10 @@ int ray_dev_init(struct net_device *dev) | |||
944 | static int ray_dev_config(struct net_device *dev, struct ifmap *map) | 891 | static int ray_dev_config(struct net_device *dev, struct ifmap *map) |
945 | { | 892 | { |
946 | ray_dev_t *local = dev->priv; | 893 | ray_dev_t *local = dev->priv; |
947 | dev_link_t *link = local->finder; | 894 | struct pcmcia_device *link = local->finder; |
948 | /* Dummy routine to satisfy device structure */ | 895 | /* Dummy routine to satisfy device structure */ |
949 | DEBUG(1,"ray_dev_config(dev=%p,ifmap=%p)\n",dev,map); | 896 | DEBUG(1,"ray_dev_config(dev=%p,ifmap=%p)\n",dev,map); |
950 | if (!(link->state & DEV_PRESENT)) { | 897 | if (!(pcmcia_dev_present(link))) { |
951 | DEBUG(2,"ray_dev_config - device not present\n"); | 898 | DEBUG(2,"ray_dev_config - device not present\n"); |
952 | return -1; | 899 | return -1; |
953 | } | 900 | } |
@@ -958,10 +905,10 @@ static int ray_dev_config(struct net_device *dev, struct ifmap *map) | |||
958 | static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) | 905 | static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) |
959 | { | 906 | { |
960 | ray_dev_t *local = dev->priv; | 907 | ray_dev_t *local = dev->priv; |
961 | dev_link_t *link = local->finder; | 908 | struct pcmcia_device *link = local->finder; |
962 | short length = skb->len; | 909 | short length = skb->len; |
963 | 910 | ||
964 | if (!(link->state & DEV_PRESENT)) { | 911 | if (!(pcmcia_dev_present(link))) { |
965 | DEBUG(2,"ray_dev_start_xmit - device not present\n"); | 912 | DEBUG(2,"ray_dev_start_xmit - device not present\n"); |
966 | return -1; | 913 | return -1; |
967 | } | 914 | } |
@@ -1570,7 +1517,7 @@ static int ray_commit(struct net_device *dev, | |||
1570 | static iw_stats * ray_get_wireless_stats(struct net_device * dev) | 1517 | static iw_stats * ray_get_wireless_stats(struct net_device * dev) |
1571 | { | 1518 | { |
1572 | ray_dev_t * local = (ray_dev_t *) dev->priv; | 1519 | ray_dev_t * local = (ray_dev_t *) dev->priv; |
1573 | dev_link_t *link = local->finder; | 1520 | struct pcmcia_device *link = local->finder; |
1574 | struct status __iomem *p = local->sram + STATUS_BASE; | 1521 | struct status __iomem *p = local->sram + STATUS_BASE; |
1575 | 1522 | ||
1576 | if(local == (ray_dev_t *) NULL) | 1523 | if(local == (ray_dev_t *) NULL) |
@@ -1588,7 +1535,7 @@ static iw_stats * ray_get_wireless_stats(struct net_device * dev) | |||
1588 | } | 1535 | } |
1589 | #endif /* WIRELESS_SPY */ | 1536 | #endif /* WIRELESS_SPY */ |
1590 | 1537 | ||
1591 | if((link->state & DEV_PRESENT)) { | 1538 | if(pcmcia_dev_present(link)) { |
1592 | local->wstats.qual.noise = readb(&p->rxnoise); | 1539 | local->wstats.qual.noise = readb(&p->rxnoise); |
1593 | local->wstats.qual.updated |= 4; | 1540 | local->wstats.qual.updated |= 4; |
1594 | } | 1541 | } |
@@ -1657,18 +1604,14 @@ static const struct iw_handler_def ray_handler_def = | |||
1657 | /*===========================================================================*/ | 1604 | /*===========================================================================*/ |
1658 | static int ray_open(struct net_device *dev) | 1605 | static int ray_open(struct net_device *dev) |
1659 | { | 1606 | { |
1660 | dev_link_t *link; | ||
1661 | ray_dev_t *local = (ray_dev_t *)dev->priv; | 1607 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
1608 | struct pcmcia_device *link; | ||
1609 | link = local->finder; | ||
1662 | 1610 | ||
1663 | DEBUG(1, "ray_open('%s')\n", dev->name); | 1611 | DEBUG(1, "ray_open('%s')\n", dev->name); |
1664 | 1612 | ||
1665 | for (link = dev_list; link; link = link->next) | 1613 | if (link->open == 0) |
1666 | if (link->priv == dev) break; | 1614 | local->num_multi = 0; |
1667 | if (!DEV_OK(link)) { | ||
1668 | return -ENODEV; | ||
1669 | } | ||
1670 | |||
1671 | if (link->open == 0) local->num_multi = 0; | ||
1672 | link->open++; | 1615 | link->open++; |
1673 | 1616 | ||
1674 | /* If the card is not started, time to start it ! - Jean II */ | 1617 | /* If the card is not started, time to start it ! - Jean II */ |
@@ -1695,15 +1638,12 @@ static int ray_open(struct net_device *dev) | |||
1695 | /*===========================================================================*/ | 1638 | /*===========================================================================*/ |
1696 | static int ray_dev_close(struct net_device *dev) | 1639 | static int ray_dev_close(struct net_device *dev) |
1697 | { | 1640 | { |
1698 | dev_link_t *link; | 1641 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
1642 | struct pcmcia_device *link; | ||
1643 | link = local->finder; | ||
1699 | 1644 | ||
1700 | DEBUG(1, "ray_dev_close('%s')\n", dev->name); | 1645 | DEBUG(1, "ray_dev_close('%s')\n", dev->name); |
1701 | 1646 | ||
1702 | for (link = dev_list; link; link = link->next) | ||
1703 | if (link->priv == dev) break; | ||
1704 | if (link == NULL) | ||
1705 | return -ENODEV; | ||
1706 | |||
1707 | link->open--; | 1647 | link->open--; |
1708 | netif_stop_queue(dev); | 1648 | netif_stop_queue(dev); |
1709 | 1649 | ||
@@ -1725,9 +1665,9 @@ static void ray_reset(struct net_device *dev) { | |||
1725 | static int interrupt_ecf(ray_dev_t *local, int ccs) | 1665 | static int interrupt_ecf(ray_dev_t *local, int ccs) |
1726 | { | 1666 | { |
1727 | int i = 50; | 1667 | int i = 50; |
1728 | dev_link_t *link = local->finder; | 1668 | struct pcmcia_device *link = local->finder; |
1729 | 1669 | ||
1730 | if (!(link->state & DEV_PRESENT)) { | 1670 | if (!(pcmcia_dev_present(link))) { |
1731 | DEBUG(2,"ray_cs interrupt_ecf - device not present\n"); | 1671 | DEBUG(2,"ray_cs interrupt_ecf - device not present\n"); |
1732 | return -1; | 1672 | return -1; |
1733 | } | 1673 | } |
@@ -1752,9 +1692,9 @@ static int get_free_tx_ccs(ray_dev_t *local) | |||
1752 | { | 1692 | { |
1753 | int i; | 1693 | int i; |
1754 | struct ccs __iomem *pccs = ccs_base(local); | 1694 | struct ccs __iomem *pccs = ccs_base(local); |
1755 | dev_link_t *link = local->finder; | 1695 | struct pcmcia_device *link = local->finder; |
1756 | 1696 | ||
1757 | if (!(link->state & DEV_PRESENT)) { | 1697 | if (!(pcmcia_dev_present(link))) { |
1758 | DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n"); | 1698 | DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n"); |
1759 | return ECARDGONE; | 1699 | return ECARDGONE; |
1760 | } | 1700 | } |
@@ -1783,9 +1723,9 @@ static int get_free_ccs(ray_dev_t *local) | |||
1783 | { | 1723 | { |
1784 | int i; | 1724 | int i; |
1785 | struct ccs __iomem *pccs = ccs_base(local); | 1725 | struct ccs __iomem *pccs = ccs_base(local); |
1786 | dev_link_t *link = local->finder; | 1726 | struct pcmcia_device *link = local->finder; |
1787 | 1727 | ||
1788 | if (!(link->state & DEV_PRESENT)) { | 1728 | if (!(pcmcia_dev_present(link))) { |
1789 | DEBUG(2,"ray_cs get_free_ccs - device not present\n"); | 1729 | DEBUG(2,"ray_cs get_free_ccs - device not present\n"); |
1790 | return ECARDGONE; | 1730 | return ECARDGONE; |
1791 | } | 1731 | } |
@@ -1858,9 +1798,9 @@ static int parse_addr(char *in_str, UCHAR *out) | |||
1858 | static struct net_device_stats *ray_get_stats(struct net_device *dev) | 1798 | static struct net_device_stats *ray_get_stats(struct net_device *dev) |
1859 | { | 1799 | { |
1860 | ray_dev_t *local = (ray_dev_t *)dev->priv; | 1800 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
1861 | dev_link_t *link = local->finder; | 1801 | struct pcmcia_device *link = local->finder; |
1862 | struct status __iomem *p = local->sram + STATUS_BASE; | 1802 | struct status __iomem *p = local->sram + STATUS_BASE; |
1863 | if (!(link->state & DEV_PRESENT)) { | 1803 | if (!(pcmcia_dev_present(link))) { |
1864 | DEBUG(2,"ray_cs net_device_stats - device not present\n"); | 1804 | DEBUG(2,"ray_cs net_device_stats - device not present\n"); |
1865 | return &local->stats; | 1805 | return &local->stats; |
1866 | } | 1806 | } |
@@ -1888,12 +1828,12 @@ static struct net_device_stats *ray_get_stats(struct net_device *dev) | |||
1888 | static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len) | 1828 | static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len) |
1889 | { | 1829 | { |
1890 | ray_dev_t *local = (ray_dev_t *)dev->priv; | 1830 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
1891 | dev_link_t *link = local->finder; | 1831 | struct pcmcia_device *link = local->finder; |
1892 | int ccsindex; | 1832 | int ccsindex; |
1893 | int i; | 1833 | int i; |
1894 | struct ccs __iomem *pccs; | 1834 | struct ccs __iomem *pccs; |
1895 | 1835 | ||
1896 | if (!(link->state & DEV_PRESENT)) { | 1836 | if (!(pcmcia_dev_present(link))) { |
1897 | DEBUG(2,"ray_update_parm - device not present\n"); | 1837 | DEBUG(2,"ray_update_parm - device not present\n"); |
1898 | return; | 1838 | return; |
1899 | } | 1839 | } |
@@ -1925,10 +1865,10 @@ static void ray_update_multi_list(struct net_device *dev, int all) | |||
1925 | struct ccs __iomem *pccs; | 1865 | struct ccs __iomem *pccs; |
1926 | int i = 0; | 1866 | int i = 0; |
1927 | ray_dev_t *local = (ray_dev_t *)dev->priv; | 1867 | ray_dev_t *local = (ray_dev_t *)dev->priv; |
1928 | dev_link_t *link = local->finder; | 1868 | struct pcmcia_device *link = local->finder; |
1929 | void __iomem *p = local->sram + HOST_TO_ECF_BASE; | 1869 | void __iomem *p = local->sram + HOST_TO_ECF_BASE; |
1930 | 1870 | ||
1931 | if (!(link->state & DEV_PRESENT)) { | 1871 | if (!(pcmcia_dev_present(link))) { |
1932 | DEBUG(2,"ray_update_multi_list - device not present\n"); | 1872 | DEBUG(2,"ray_update_multi_list - device not present\n"); |
1933 | return; | 1873 | return; |
1934 | } | 1874 | } |
@@ -2005,7 +1945,7 @@ static void set_multicast_list(struct net_device *dev) | |||
2005 | static irqreturn_t ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) | 1945 | static irqreturn_t ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) |
2006 | { | 1946 | { |
2007 | struct net_device *dev = (struct net_device *)dev_id; | 1947 | struct net_device *dev = (struct net_device *)dev_id; |
2008 | dev_link_t *link; | 1948 | struct pcmcia_device *link; |
2009 | ray_dev_t *local; | 1949 | ray_dev_t *local; |
2010 | struct ccs __iomem *pccs; | 1950 | struct ccs __iomem *pccs; |
2011 | struct rcs __iomem *prcs; | 1951 | struct rcs __iomem *prcs; |
@@ -2020,8 +1960,8 @@ static irqreturn_t ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) | |||
2020 | DEBUG(4,"ray_cs: interrupt for *dev=%p\n",dev); | 1960 | DEBUG(4,"ray_cs: interrupt for *dev=%p\n",dev); |
2021 | 1961 | ||
2022 | local = (ray_dev_t *)dev->priv; | 1962 | local = (ray_dev_t *)dev->priv; |
2023 | link = (dev_link_t *)local->finder; | 1963 | link = (struct pcmcia_device *)local->finder; |
2024 | if ( ! (link->state & DEV_PRESENT) || link->state & DEV_SUSPEND ) { | 1964 | if (!pcmcia_dev_present(link)) { |
2025 | DEBUG(2,"ray_cs interrupt from device not present or suspended.\n"); | 1965 | DEBUG(2,"ray_cs interrupt from device not present or suspended.\n"); |
2026 | return IRQ_NONE; | 1966 | return IRQ_NONE; |
2027 | } | 1967 | } |
@@ -2540,9 +2480,9 @@ static void release_frag_chain(ray_dev_t *local, struct rcs __iomem * prcs) | |||
2540 | /*===========================================================================*/ | 2480 | /*===========================================================================*/ |
2541 | static void authenticate(ray_dev_t *local) | 2481 | static void authenticate(ray_dev_t *local) |
2542 | { | 2482 | { |
2543 | dev_link_t *link = local->finder; | 2483 | struct pcmcia_device *link = local->finder; |
2544 | DEBUG(0,"ray_cs Starting authentication.\n"); | 2484 | DEBUG(0,"ray_cs Starting authentication.\n"); |
2545 | if (!(link->state & DEV_PRESENT)) { | 2485 | if (!(pcmcia_dev_present(link))) { |
2546 | DEBUG(2,"ray_cs authenticate - device not present\n"); | 2486 | DEBUG(2,"ray_cs authenticate - device not present\n"); |
2547 | return; | 2487 | return; |
2548 | } | 2488 | } |
@@ -2606,10 +2546,10 @@ static void rx_authenticate(ray_dev_t *local, struct rcs __iomem *prcs, | |||
2606 | static void associate(ray_dev_t *local) | 2546 | static void associate(ray_dev_t *local) |
2607 | { | 2547 | { |
2608 | struct ccs __iomem *pccs; | 2548 | struct ccs __iomem *pccs; |
2609 | dev_link_t *link = local->finder; | 2549 | struct pcmcia_device *link = local->finder; |
2610 | struct net_device *dev = link->priv; | 2550 | struct net_device *dev = link->priv; |
2611 | int ccsindex; | 2551 | int ccsindex; |
2612 | if (!(link->state & DEV_PRESENT)) { | 2552 | if (!(pcmcia_dev_present(link))) { |
2613 | DEBUG(2,"ray_cs associate - device not present\n"); | 2553 | DEBUG(2,"ray_cs associate - device not present\n"); |
2614 | return; | 2554 | return; |
2615 | } | 2555 | } |
@@ -2689,14 +2629,14 @@ static int ray_cs_proc_read(char *buf, char **start, off_t offset, int len) | |||
2689 | * eg ifconfig | 2629 | * eg ifconfig |
2690 | */ | 2630 | */ |
2691 | int i; | 2631 | int i; |
2692 | dev_link_t *link; | 2632 | struct pcmcia_device *link; |
2693 | struct net_device *dev; | 2633 | struct net_device *dev; |
2694 | ray_dev_t *local; | 2634 | ray_dev_t *local; |
2695 | UCHAR *p; | 2635 | UCHAR *p; |
2696 | struct freq_hop_element *pfh; | 2636 | struct freq_hop_element *pfh; |
2697 | UCHAR c[33]; | 2637 | UCHAR c[33]; |
2698 | 2638 | ||
2699 | link = dev_list; | 2639 | link = this_device; |
2700 | if (!link) | 2640 | if (!link) |
2701 | return 0; | 2641 | return 0; |
2702 | dev = (struct net_device *)link->priv; | 2642 | dev = (struct net_device *)link->priv; |
@@ -2898,7 +2838,7 @@ static struct pcmcia_driver ray_driver = { | |||
2898 | .drv = { | 2838 | .drv = { |
2899 | .name = "ray_cs", | 2839 | .name = "ray_cs", |
2900 | }, | 2840 | }, |
2901 | .probe = ray_attach, | 2841 | .probe = ray_probe, |
2902 | .remove = ray_detach, | 2842 | .remove = ray_detach, |
2903 | .id_table = ray_ids, | 2843 | .id_table = ray_ids, |
2904 | .suspend = ray_suspend, | 2844 | .suspend = ray_suspend, |
@@ -2940,7 +2880,6 @@ static void __exit exit_ray_cs(void) | |||
2940 | #endif | 2880 | #endif |
2941 | 2881 | ||
2942 | pcmcia_unregister_driver(&ray_driver); | 2882 | pcmcia_unregister_driver(&ray_driver); |
2943 | BUG_ON(dev_list != NULL); | ||
2944 | } /* exit_ray_cs */ | 2883 | } /* exit_ray_cs */ |
2945 | 2884 | ||
2946 | module_init(init_ray_cs); | 2885 | module_init(init_ray_cs); |