diff options
Diffstat (limited to 'drivers/net/pcmcia/fmvj18x_cs.c')
-rw-r--r-- | drivers/net/pcmcia/fmvj18x_cs.c | 166 |
1 files changed, 63 insertions, 103 deletions
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index b7ac14ba8877..09b11761cdfa 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c | |||
@@ -84,10 +84,10 @@ static char *version = DRV_NAME ".c " DRV_VERSION " 2002/03/23"; | |||
84 | /* | 84 | /* |
85 | PCMCIA event handlers | 85 | PCMCIA event handlers |
86 | */ | 86 | */ |
87 | static void fmvj18x_config(dev_link_t *link); | 87 | static int fmvj18x_config(struct pcmcia_device *link); |
88 | static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id); | 88 | static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id); |
89 | static int fmvj18x_setup_mfc(dev_link_t *link); | 89 | static int fmvj18x_setup_mfc(struct pcmcia_device *link); |
90 | static void fmvj18x_release(dev_link_t *link); | 90 | static void fmvj18x_release(struct pcmcia_device *link); |
91 | static void fmvj18x_detach(struct pcmcia_device *p_dev); | 91 | static void fmvj18x_detach(struct pcmcia_device *p_dev); |
92 | 92 | ||
93 | /* | 93 | /* |
@@ -116,7 +116,7 @@ typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN, | |||
116 | driver specific data structure | 116 | driver specific data structure |
117 | */ | 117 | */ |
118 | typedef struct local_info_t { | 118 | typedef struct local_info_t { |
119 | dev_link_t link; | 119 | struct pcmcia_device *p_dev; |
120 | dev_node_t node; | 120 | dev_node_t node; |
121 | struct net_device_stats stats; | 121 | struct net_device_stats stats; |
122 | long open_time; | 122 | long open_time; |
@@ -228,10 +228,9 @@ typedef struct local_info_t { | |||
228 | #define BANK_1U 0x24 /* bank 1 (CONFIG_1) */ | 228 | #define BANK_1U 0x24 /* bank 1 (CONFIG_1) */ |
229 | #define BANK_2U 0x28 /* bank 2 (CONFIG_1) */ | 229 | #define BANK_2U 0x28 /* bank 2 (CONFIG_1) */ |
230 | 230 | ||
231 | static int fmvj18x_attach(struct pcmcia_device *p_dev) | 231 | static int fmvj18x_probe(struct pcmcia_device *link) |
232 | { | 232 | { |
233 | local_info_t *lp; | 233 | local_info_t *lp; |
234 | dev_link_t *link; | ||
235 | struct net_device *dev; | 234 | struct net_device *dev; |
236 | 235 | ||
237 | DEBUG(0, "fmvj18x_attach()\n"); | 236 | DEBUG(0, "fmvj18x_attach()\n"); |
@@ -241,8 +240,8 @@ static int fmvj18x_attach(struct pcmcia_device *p_dev) | |||
241 | if (!dev) | 240 | if (!dev) |
242 | return -ENOMEM; | 241 | return -ENOMEM; |
243 | lp = netdev_priv(dev); | 242 | lp = netdev_priv(dev); |
244 | link = &lp->link; | ||
245 | link->priv = dev; | 243 | link->priv = dev; |
244 | lp->p_dev = link; | ||
246 | 245 | ||
247 | /* The io structure describes IO port mapping */ | 246 | /* The io structure describes IO port mapping */ |
248 | link->io.NumPorts1 = 32; | 247 | link->io.NumPorts1 = 32; |
@@ -257,7 +256,6 @@ static int fmvj18x_attach(struct pcmcia_device *p_dev) | |||
257 | 256 | ||
258 | /* General socket configuration */ | 257 | /* General socket configuration */ |
259 | link->conf.Attributes = CONF_ENABLE_IRQ; | 258 | link->conf.Attributes = CONF_ENABLE_IRQ; |
260 | link->conf.Vcc = 50; | ||
261 | link->conf.IntType = INT_MEMORY_AND_IO; | 259 | link->conf.IntType = INT_MEMORY_AND_IO; |
262 | 260 | ||
263 | /* The FMVJ18x specific entries in the device structure. */ | 261 | /* The FMVJ18x specific entries in the device structure. */ |
@@ -274,29 +272,21 @@ static int fmvj18x_attach(struct pcmcia_device *p_dev) | |||
274 | #endif | 272 | #endif |
275 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 273 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
276 | 274 | ||
277 | link->handle = p_dev; | 275 | return fmvj18x_config(link); |
278 | p_dev->instance = link; | ||
279 | |||
280 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | ||
281 | fmvj18x_config(link); | ||
282 | |||
283 | return 0; | ||
284 | } /* fmvj18x_attach */ | 276 | } /* fmvj18x_attach */ |
285 | 277 | ||
286 | /*====================================================================*/ | 278 | /*====================================================================*/ |
287 | 279 | ||
288 | static void fmvj18x_detach(struct pcmcia_device *p_dev) | 280 | static void fmvj18x_detach(struct pcmcia_device *link) |
289 | { | 281 | { |
290 | dev_link_t *link = dev_to_instance(p_dev); | ||
291 | struct net_device *dev = link->priv; | 282 | struct net_device *dev = link->priv; |
292 | 283 | ||
293 | DEBUG(0, "fmvj18x_detach(0x%p)\n", link); | 284 | DEBUG(0, "fmvj18x_detach(0x%p)\n", link); |
294 | 285 | ||
295 | if (link->dev) | 286 | if (link->dev_node) |
296 | unregister_netdev(dev); | 287 | unregister_netdev(dev); |
297 | 288 | ||
298 | if (link->state & DEV_CONFIG) | 289 | fmvj18x_release(link); |
299 | fmvj18x_release(link); | ||
300 | 290 | ||
301 | free_netdev(dev); | 291 | free_netdev(dev); |
302 | } /* fmvj18x_detach */ | 292 | } /* fmvj18x_detach */ |
@@ -306,7 +296,7 @@ static void fmvj18x_detach(struct pcmcia_device *p_dev) | |||
306 | #define CS_CHECK(fn, ret) \ | 296 | #define CS_CHECK(fn, ret) \ |
307 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 297 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
308 | 298 | ||
309 | static int mfc_try_io_port(dev_link_t *link) | 299 | static int mfc_try_io_port(struct pcmcia_device *link) |
310 | { | 300 | { |
311 | int i, ret; | 301 | int i, ret; |
312 | static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; | 302 | static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; |
@@ -318,13 +308,13 @@ static int mfc_try_io_port(dev_link_t *link) | |||
318 | link->io.NumPorts2 = 0; | 308 | link->io.NumPorts2 = 0; |
319 | printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n"); | 309 | printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n"); |
320 | } | 310 | } |
321 | ret = pcmcia_request_io(link->handle, &link->io); | 311 | ret = pcmcia_request_io(link, &link->io); |
322 | if (ret == CS_SUCCESS) return ret; | 312 | if (ret == CS_SUCCESS) return ret; |
323 | } | 313 | } |
324 | return ret; | 314 | return ret; |
325 | } | 315 | } |
326 | 316 | ||
327 | static int ungermann_try_io_port(dev_link_t *link) | 317 | static int ungermann_try_io_port(struct pcmcia_device *link) |
328 | { | 318 | { |
329 | int ret; | 319 | int ret; |
330 | kio_addr_t ioaddr; | 320 | kio_addr_t ioaddr; |
@@ -334,7 +324,7 @@ static int ungermann_try_io_port(dev_link_t *link) | |||
334 | */ | 324 | */ |
335 | for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) { | 325 | for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) { |
336 | link->io.BasePort1 = ioaddr; | 326 | link->io.BasePort1 = ioaddr; |
337 | ret = pcmcia_request_io(link->handle, &link->io); | 327 | ret = pcmcia_request_io(link, &link->io); |
338 | if (ret == CS_SUCCESS) { | 328 | if (ret == CS_SUCCESS) { |
339 | /* calculate ConfigIndex value */ | 329 | /* calculate ConfigIndex value */ |
340 | link->conf.ConfigIndex = | 330 | link->conf.ConfigIndex = |
@@ -345,9 +335,8 @@ static int ungermann_try_io_port(dev_link_t *link) | |||
345 | return ret; /* RequestIO failed */ | 335 | return ret; /* RequestIO failed */ |
346 | } | 336 | } |
347 | 337 | ||
348 | static void fmvj18x_config(dev_link_t *link) | 338 | static int fmvj18x_config(struct pcmcia_device *link) |
349 | { | 339 | { |
350 | client_handle_t handle = link->handle; | ||
351 | struct net_device *dev = link->priv; | 340 | struct net_device *dev = link->priv; |
352 | local_info_t *lp = netdev_priv(dev); | 341 | local_info_t *lp = netdev_priv(dev); |
353 | tuple_t tuple; | 342 | tuple_t tuple; |
@@ -366,42 +355,34 @@ static void fmvj18x_config(dev_link_t *link) | |||
366 | registers. | 355 | registers. |
367 | */ | 356 | */ |
368 | tuple.DesiredTuple = CISTPL_CONFIG; | 357 | tuple.DesiredTuple = CISTPL_CONFIG; |
369 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | 358 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
370 | tuple.TupleData = (u_char *)buf; | 359 | tuple.TupleData = (u_char *)buf; |
371 | tuple.TupleDataMax = 64; | 360 | tuple.TupleDataMax = 64; |
372 | tuple.TupleOffset = 0; | 361 | tuple.TupleOffset = 0; |
373 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 362 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
374 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); | 363 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); |
375 | |||
376 | /* Configure card */ | ||
377 | link->state |= DEV_CONFIG; | ||
378 | 364 | ||
379 | link->conf.ConfigBase = parse.config.base; | 365 | link->conf.ConfigBase = parse.config.base; |
380 | link->conf.Present = parse.config.rmask[0]; | 366 | link->conf.Present = parse.config.rmask[0]; |
381 | 367 | ||
382 | tuple.DesiredTuple = CISTPL_FUNCE; | 368 | tuple.DesiredTuple = CISTPL_FUNCE; |
383 | tuple.TupleOffset = 0; | 369 | tuple.TupleOffset = 0; |
384 | if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) { | 370 | if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) { |
385 | /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */ | 371 | /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */ |
386 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | 372 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; |
387 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | 373 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
388 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 374 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
389 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); | 375 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); |
390 | link->conf.ConfigIndex = parse.cftable_entry.index; | 376 | link->conf.ConfigIndex = parse.cftable_entry.index; |
391 | tuple.DesiredTuple = CISTPL_MANFID; | 377 | tuple.DesiredTuple = CISTPL_MANFID; |
392 | if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) | 378 | if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) |
393 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 379 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
394 | else | 380 | else |
395 | buf[0] = 0xffff; | 381 | buf[0] = 0xffff; |
396 | switch (le16_to_cpu(buf[0])) { | 382 | switch (le16_to_cpu(buf[0])) { |
397 | case MANFID_TDK: | 383 | case MANFID_TDK: |
398 | cardtype = TDK; | 384 | cardtype = TDK; |
399 | if (le16_to_cpu(buf[1]) == PRODID_TDK_CF010) { | 385 | if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410 |
400 | cs_status_t status; | ||
401 | pcmcia_get_status(handle, &status); | ||
402 | if (status.CardState & CS_EVENT_3VCARD) | ||
403 | link->conf.Vcc = 33; /* inserted in 3.3V slot */ | ||
404 | } else if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410 | ||
405 | || le16_to_cpu(buf[1]) == PRODID_TDK_NP9610 | 386 | || le16_to_cpu(buf[1]) == PRODID_TDK_NP9610 |
406 | || le16_to_cpu(buf[1]) == PRODID_TDK_MN3200) { | 387 | || le16_to_cpu(buf[1]) == PRODID_TDK_MN3200) { |
407 | /* MultiFunction Card */ | 388 | /* MultiFunction Card */ |
@@ -429,8 +410,8 @@ static void fmvj18x_config(dev_link_t *link) | |||
429 | } else { | 410 | } else { |
430 | /* old type card */ | 411 | /* old type card */ |
431 | tuple.DesiredTuple = CISTPL_MANFID; | 412 | tuple.DesiredTuple = CISTPL_MANFID; |
432 | if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) | 413 | if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) |
433 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 414 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
434 | else | 415 | else |
435 | buf[0] = 0xffff; | 416 | buf[0] = 0xffff; |
436 | switch (le16_to_cpu(buf[0])) { | 417 | switch (le16_to_cpu(buf[0])) { |
@@ -461,10 +442,10 @@ static void fmvj18x_config(dev_link_t *link) | |||
461 | ret = ungermann_try_io_port(link); | 442 | ret = ungermann_try_io_port(link); |
462 | if (ret != CS_SUCCESS) goto cs_failed; | 443 | if (ret != CS_SUCCESS) goto cs_failed; |
463 | } else { | 444 | } else { |
464 | CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io)); | 445 | CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); |
465 | } | 446 | } |
466 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); | 447 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); |
467 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); | 448 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); |
468 | dev->irq = link->irq.AssignedIRQ; | 449 | dev->irq = link->irq.AssignedIRQ; |
469 | dev->base_addr = link->io.BasePort1; | 450 | dev->base_addr = link->io.BasePort1; |
470 | 451 | ||
@@ -493,17 +474,17 @@ static void fmvj18x_config(dev_link_t *link) | |||
493 | case CONTEC: | 474 | case CONTEC: |
494 | tuple.DesiredTuple = CISTPL_FUNCE; | 475 | tuple.DesiredTuple = CISTPL_FUNCE; |
495 | tuple.TupleOffset = 0; | 476 | tuple.TupleOffset = 0; |
496 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | 477 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
497 | tuple.TupleOffset = 0; | 478 | tuple.TupleOffset = 0; |
498 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 479 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
499 | if (cardtype == MBH10304) { | 480 | if (cardtype == MBH10304) { |
500 | /* MBH10304's CIS_FUNCE is corrupted */ | 481 | /* MBH10304's CIS_FUNCE is corrupted */ |
501 | node_id = &(tuple.TupleData[5]); | 482 | node_id = &(tuple.TupleData[5]); |
502 | card_name = "FMV-J182"; | 483 | card_name = "FMV-J182"; |
503 | } else { | 484 | } else { |
504 | while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) { | 485 | while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) { |
505 | CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); | 486 | CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); |
506 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 487 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
507 | } | 488 | } |
508 | node_id = &(tuple.TupleData[2]); | 489 | node_id = &(tuple.TupleData[2]); |
509 | if( cardtype == TDK ) { | 490 | if( cardtype == TDK ) { |
@@ -545,13 +526,12 @@ static void fmvj18x_config(dev_link_t *link) | |||
545 | } | 526 | } |
546 | 527 | ||
547 | lp->cardtype = cardtype; | 528 | lp->cardtype = cardtype; |
548 | link->dev = &lp->node; | 529 | link->dev_node = &lp->node; |
549 | link->state &= ~DEV_CONFIG_PENDING; | 530 | SET_NETDEV_DEV(dev, &handle_to_dev(link)); |
550 | SET_NETDEV_DEV(dev, &handle_to_dev(handle)); | ||
551 | 531 | ||
552 | if (register_netdev(dev) != 0) { | 532 | if (register_netdev(dev) != 0) { |
553 | printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n"); | 533 | printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n"); |
554 | link->dev = NULL; | 534 | link->dev_node = NULL; |
555 | goto failed; | 535 | goto failed; |
556 | } | 536 | } |
557 | 537 | ||
@@ -564,19 +544,18 @@ static void fmvj18x_config(dev_link_t *link) | |||
564 | for (i = 0; i < 6; i++) | 544 | for (i = 0; i < 6; i++) |
565 | printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); | 545 | printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); |
566 | 546 | ||
567 | return; | 547 | return 0; |
568 | 548 | ||
569 | cs_failed: | 549 | cs_failed: |
570 | /* All Card Services errors end up here */ | 550 | /* All Card Services errors end up here */ |
571 | cs_error(link->handle, last_fn, last_ret); | 551 | cs_error(link, last_fn, last_ret); |
572 | failed: | 552 | failed: |
573 | fmvj18x_release(link); | 553 | fmvj18x_release(link); |
574 | link->state &= ~DEV_CONFIG_PENDING; | 554 | return -ENODEV; |
575 | |||
576 | } /* fmvj18x_config */ | 555 | } /* fmvj18x_config */ |
577 | /*====================================================================*/ | 556 | /*====================================================================*/ |
578 | 557 | ||
579 | static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id) | 558 | static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id) |
580 | { | 559 | { |
581 | win_req_t req; | 560 | win_req_t req; |
582 | memreq_t mem; | 561 | memreq_t mem; |
@@ -587,9 +566,9 @@ static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id) | |||
587 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; | 566 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; |
588 | req.Base = 0; req.Size = 0; | 567 | req.Base = 0; req.Size = 0; |
589 | req.AccessSpeed = 0; | 568 | req.AccessSpeed = 0; |
590 | i = pcmcia_request_window(&link->handle, &req, &link->win); | 569 | i = pcmcia_request_window(&link, &req, &link->win); |
591 | if (i != CS_SUCCESS) { | 570 | if (i != CS_SUCCESS) { |
592 | cs_error(link->handle, RequestWindow, i); | 571 | cs_error(link, RequestWindow, i); |
593 | return -1; | 572 | return -1; |
594 | } | 573 | } |
595 | 574 | ||
@@ -623,13 +602,13 @@ static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id) | |||
623 | iounmap(base); | 602 | iounmap(base); |
624 | j = pcmcia_release_window(link->win); | 603 | j = pcmcia_release_window(link->win); |
625 | if (j != CS_SUCCESS) | 604 | if (j != CS_SUCCESS) |
626 | cs_error(link->handle, ReleaseWindow, j); | 605 | cs_error(link, ReleaseWindow, j); |
627 | return (i != 0x200) ? 0 : -1; | 606 | return (i != 0x200) ? 0 : -1; |
628 | 607 | ||
629 | } /* fmvj18x_get_hwinfo */ | 608 | } /* fmvj18x_get_hwinfo */ |
630 | /*====================================================================*/ | 609 | /*====================================================================*/ |
631 | 610 | ||
632 | static int fmvj18x_setup_mfc(dev_link_t *link) | 611 | static int fmvj18x_setup_mfc(struct pcmcia_device *link) |
633 | { | 612 | { |
634 | win_req_t req; | 613 | win_req_t req; |
635 | memreq_t mem; | 614 | memreq_t mem; |
@@ -642,9 +621,9 @@ static int fmvj18x_setup_mfc(dev_link_t *link) | |||
642 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; | 621 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; |
643 | req.Base = 0; req.Size = 0; | 622 | req.Base = 0; req.Size = 0; |
644 | req.AccessSpeed = 0; | 623 | req.AccessSpeed = 0; |
645 | i = pcmcia_request_window(&link->handle, &req, &link->win); | 624 | i = pcmcia_request_window(&link, &req, &link->win); |
646 | if (i != CS_SUCCESS) { | 625 | if (i != CS_SUCCESS) { |
647 | cs_error(link->handle, RequestWindow, i); | 626 | cs_error(link, RequestWindow, i); |
648 | return -1; | 627 | return -1; |
649 | } | 628 | } |
650 | 629 | ||
@@ -666,54 +645,35 @@ static int fmvj18x_setup_mfc(dev_link_t *link) | |||
666 | iounmap(base); | 645 | iounmap(base); |
667 | j = pcmcia_release_window(link->win); | 646 | j = pcmcia_release_window(link->win); |
668 | if (j != CS_SUCCESS) | 647 | if (j != CS_SUCCESS) |
669 | cs_error(link->handle, ReleaseWindow, j); | 648 | cs_error(link, ReleaseWindow, j); |
670 | return 0; | 649 | return 0; |
671 | 650 | ||
672 | } | 651 | } |
673 | /*====================================================================*/ | 652 | /*====================================================================*/ |
674 | 653 | ||
675 | static void fmvj18x_release(dev_link_t *link) | 654 | static void fmvj18x_release(struct pcmcia_device *link) |
676 | { | 655 | { |
677 | 656 | DEBUG(0, "fmvj18x_release(0x%p)\n", link); | |
678 | DEBUG(0, "fmvj18x_release(0x%p)\n", link); | 657 | pcmcia_disable_device(link); |
679 | |||
680 | /* Don't bother checking to see if these succeed or not */ | ||
681 | pcmcia_release_window(link->win); | ||
682 | pcmcia_release_configuration(link->handle); | ||
683 | pcmcia_release_io(link->handle, &link->io); | ||
684 | pcmcia_release_irq(link->handle, &link->irq); | ||
685 | |||
686 | link->state &= ~DEV_CONFIG; | ||
687 | } | 658 | } |
688 | 659 | ||
689 | static int fmvj18x_suspend(struct pcmcia_device *p_dev) | 660 | static int fmvj18x_suspend(struct pcmcia_device *link) |
690 | { | 661 | { |
691 | dev_link_t *link = dev_to_instance(p_dev); | ||
692 | struct net_device *dev = link->priv; | 662 | struct net_device *dev = link->priv; |
693 | 663 | ||
694 | link->state |= DEV_SUSPEND; | 664 | if (link->open) |
695 | if (link->state & DEV_CONFIG) { | 665 | netif_device_detach(dev); |
696 | if (link->open) | ||
697 | netif_device_detach(dev); | ||
698 | pcmcia_release_configuration(link->handle); | ||
699 | } | ||
700 | |||
701 | 666 | ||
702 | return 0; | 667 | return 0; |
703 | } | 668 | } |
704 | 669 | ||
705 | static int fmvj18x_resume(struct pcmcia_device *p_dev) | 670 | static int fmvj18x_resume(struct pcmcia_device *link) |
706 | { | 671 | { |
707 | dev_link_t *link = dev_to_instance(p_dev); | ||
708 | struct net_device *dev = link->priv; | 672 | struct net_device *dev = link->priv; |
709 | 673 | ||
710 | link->state &= ~DEV_SUSPEND; | 674 | if (link->open) { |
711 | if (link->state & DEV_CONFIG) { | 675 | fjn_reset(dev); |
712 | pcmcia_request_configuration(link->handle, &link->conf); | 676 | netif_device_attach(dev); |
713 | if (link->open) { | ||
714 | fjn_reset(dev); | ||
715 | netif_device_attach(dev); | ||
716 | } | ||
717 | } | 677 | } |
718 | 678 | ||
719 | return 0; | 679 | return 0; |
@@ -751,7 +711,7 @@ static struct pcmcia_driver fmvj18x_cs_driver = { | |||
751 | .drv = { | 711 | .drv = { |
752 | .name = "fmvj18x_cs", | 712 | .name = "fmvj18x_cs", |
753 | }, | 713 | }, |
754 | .probe = fmvj18x_attach, | 714 | .probe = fmvj18x_probe, |
755 | .remove = fmvj18x_detach, | 715 | .remove = fmvj18x_detach, |
756 | .id_table = fmvj18x_ids, | 716 | .id_table = fmvj18x_ids, |
757 | .suspend = fmvj18x_suspend, | 717 | .suspend = fmvj18x_suspend, |
@@ -1148,11 +1108,11 @@ static int fjn_config(struct net_device *dev, struct ifmap *map){ | |||
1148 | static int fjn_open(struct net_device *dev) | 1108 | static int fjn_open(struct net_device *dev) |
1149 | { | 1109 | { |
1150 | struct local_info_t *lp = netdev_priv(dev); | 1110 | struct local_info_t *lp = netdev_priv(dev); |
1151 | dev_link_t *link = &lp->link; | 1111 | struct pcmcia_device *link = lp->p_dev; |
1152 | 1112 | ||
1153 | DEBUG(4, "fjn_open('%s').\n", dev->name); | 1113 | DEBUG(4, "fjn_open('%s').\n", dev->name); |
1154 | 1114 | ||
1155 | if (!DEV_OK(link)) | 1115 | if (!pcmcia_dev_present(link)) |
1156 | return -ENODEV; | 1116 | return -ENODEV; |
1157 | 1117 | ||
1158 | link->open++; | 1118 | link->open++; |
@@ -1173,7 +1133,7 @@ static int fjn_open(struct net_device *dev) | |||
1173 | static int fjn_close(struct net_device *dev) | 1133 | static int fjn_close(struct net_device *dev) |
1174 | { | 1134 | { |
1175 | struct local_info_t *lp = netdev_priv(dev); | 1135 | struct local_info_t *lp = netdev_priv(dev); |
1176 | dev_link_t *link = &lp->link; | 1136 | struct pcmcia_device *link = lp->p_dev; |
1177 | kio_addr_t ioaddr = dev->base_addr; | 1137 | kio_addr_t ioaddr = dev->base_addr; |
1178 | 1138 | ||
1179 | DEBUG(4, "fjn_close('%s').\n", dev->name); | 1139 | DEBUG(4, "fjn_close('%s').\n", dev->name); |