diff options
author | Ben Dooks <ben-linux@fluff.org> | 2008-06-24 17:16:02 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-06-24 22:57:51 -0400 |
commit | f8d79e79a1700fdcf26a1dfcaefad905b1279600 (patch) | |
tree | c864c88840548336575f3ed56277e7419b80479f /drivers/net | |
parent | 59eae1fa3ba19be35f09b37e73d90ac5028996fe (diff) |
DM9000: Cleanup source code - remove forward declerations
Cleanup the source code by moving the code around to avoid
having to declare the functions before they are used.
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/dm9000.c | 1016 |
1 files changed, 498 insertions, 518 deletions
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 79538ab4ee60..679c291107f5 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c | |||
@@ -152,23 +152,6 @@ static inline board_info_t *to_dm9000_board(struct net_device *dev) | |||
152 | return dev->priv; | 152 | return dev->priv; |
153 | } | 153 | } |
154 | 154 | ||
155 | /* function declaration ------------------------------------- */ | ||
156 | static int dm9000_open(struct net_device *); | ||
157 | static int dm9000_start_xmit(struct sk_buff *, struct net_device *); | ||
158 | static int dm9000_stop(struct net_device *); | ||
159 | |||
160 | static void dm9000_init_dm9000(struct net_device *); | ||
161 | |||
162 | static irqreturn_t dm9000_interrupt(int, void *); | ||
163 | |||
164 | static int dm9000_phy_read(struct net_device *dev, int phy, int reg); | ||
165 | static void dm9000_phy_write(struct net_device *dev, int phy, int reg, int v); | ||
166 | |||
167 | static void dm9000_read_eeprom(board_info_t *, int addr, u8 *to); | ||
168 | static void dm9000_write_eeprom(board_info_t *, int addr, u8 *dp); | ||
169 | static void dm9000_rx(struct net_device *); | ||
170 | static void dm9000_hash_table(struct net_device *); | ||
171 | |||
172 | /* DM9000 network board routine ---------------------------- */ | 155 | /* DM9000 network board routine ---------------------------- */ |
173 | 156 | ||
174 | static void | 157 | static void |
@@ -315,49 +298,129 @@ static void dm9000_schedule_poll(board_info_t *db) | |||
315 | schedule_delayed_work(&db->phy_poll, HZ * 2); | 298 | schedule_delayed_work(&db->phy_poll, HZ * 2); |
316 | } | 299 | } |
317 | 300 | ||
318 | /* Our watchdog timed out. Called by the networking layer */ | 301 | static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd) |
319 | static void dm9000_timeout(struct net_device *dev) | 302 | { |
303 | board_info_t *dm = to_dm9000_board(dev); | ||
304 | |||
305 | if (!netif_running(dev)) | ||
306 | return -EINVAL; | ||
307 | |||
308 | return generic_mii_ioctl(&dm->mii, if_mii(req), cmd, NULL); | ||
309 | } | ||
310 | |||
311 | static unsigned int | ||
312 | dm9000_read_locked(board_info_t *db, int reg) | ||
320 | { | 313 | { |
321 | board_info_t *db = (board_info_t *) dev->priv; | ||
322 | u8 reg_save; | ||
323 | unsigned long flags; | 314 | unsigned long flags; |
315 | unsigned int ret; | ||
324 | 316 | ||
325 | /* Save previous register address */ | 317 | spin_lock_irqsave(&db->lock, flags); |
326 | reg_save = readb(db->io_addr); | 318 | ret = ior(db, reg); |
327 | spin_lock_irqsave(&db->lock,flags); | 319 | spin_unlock_irqrestore(&db->lock, flags); |
328 | 320 | ||
329 | netif_stop_queue(dev); | 321 | return ret; |
330 | dm9000_reset(db); | 322 | } |
331 | dm9000_init_dm9000(dev); | ||
332 | /* We can accept TX packets again */ | ||
333 | dev->trans_start = jiffies; | ||
334 | netif_wake_queue(dev); | ||
335 | 323 | ||
336 | /* Restore previous register address */ | 324 | static int dm9000_wait_eeprom(board_info_t *db) |
337 | writeb(reg_save, db->io_addr); | 325 | { |
338 | spin_unlock_irqrestore(&db->lock,flags); | 326 | unsigned int status; |
327 | int timeout = 8; /* wait max 8msec */ | ||
328 | |||
329 | /* The DM9000 data sheets say we should be able to | ||
330 | * poll the ERRE bit in EPCR to wait for the EEPROM | ||
331 | * operation. From testing several chips, this bit | ||
332 | * does not seem to work. | ||
333 | * | ||
334 | * We attempt to use the bit, but fall back to the | ||
335 | * timeout (which is why we do not return an error | ||
336 | * on expiry) to say that the EEPROM operation has | ||
337 | * completed. | ||
338 | */ | ||
339 | |||
340 | while (1) { | ||
341 | status = dm9000_read_locked(db, DM9000_EPCR); | ||
342 | |||
343 | if ((status & EPCR_ERRE) == 0) | ||
344 | break; | ||
345 | |||
346 | if (timeout-- < 0) { | ||
347 | dev_dbg(db->dev, "timeout waiting EEPROM\n"); | ||
348 | break; | ||
349 | } | ||
350 | } | ||
351 | |||
352 | return 0; | ||
339 | } | 353 | } |
340 | 354 | ||
341 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
342 | /* | 355 | /* |
343 | *Used by netconsole | 356 | * Read a word data from EEPROM |
344 | */ | 357 | */ |
345 | static void dm9000_poll_controller(struct net_device *dev) | 358 | static void |
359 | dm9000_read_eeprom(board_info_t *db, int offset, u8 *to) | ||
346 | { | 360 | { |
347 | disable_irq(dev->irq); | 361 | unsigned long flags; |
348 | dm9000_interrupt(dev->irq,dev); | 362 | |
349 | enable_irq(dev->irq); | 363 | if (db->flags & DM9000_PLATF_NO_EEPROM) { |
364 | to[0] = 0xff; | ||
365 | to[1] = 0xff; | ||
366 | return; | ||
367 | } | ||
368 | |||
369 | mutex_lock(&db->addr_lock); | ||
370 | |||
371 | spin_lock_irqsave(&db->lock, flags); | ||
372 | |||
373 | iow(db, DM9000_EPAR, offset); | ||
374 | iow(db, DM9000_EPCR, EPCR_ERPRR); | ||
375 | |||
376 | spin_unlock_irqrestore(&db->lock, flags); | ||
377 | |||
378 | dm9000_wait_eeprom(db); | ||
379 | |||
380 | /* delay for at-least 150uS */ | ||
381 | msleep(1); | ||
382 | |||
383 | spin_lock_irqsave(&db->lock, flags); | ||
384 | |||
385 | iow(db, DM9000_EPCR, 0x0); | ||
386 | |||
387 | to[0] = ior(db, DM9000_EPDRL); | ||
388 | to[1] = ior(db, DM9000_EPDRH); | ||
389 | |||
390 | spin_unlock_irqrestore(&db->lock, flags); | ||
391 | |||
392 | mutex_unlock(&db->addr_lock); | ||
350 | } | 393 | } |
351 | #endif | ||
352 | 394 | ||
353 | static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd) | 395 | /* |
396 | * Write a word data to SROM | ||
397 | */ | ||
398 | static void | ||
399 | dm9000_write_eeprom(board_info_t *db, int offset, u8 *data) | ||
354 | { | 400 | { |
355 | board_info_t *dm = to_dm9000_board(dev); | 401 | unsigned long flags; |
356 | 402 | ||
357 | if (!netif_running(dev)) | 403 | if (db->flags & DM9000_PLATF_NO_EEPROM) |
358 | return -EINVAL; | 404 | return; |
359 | 405 | ||
360 | return generic_mii_ioctl(&dm->mii, if_mii(req), cmd, NULL); | 406 | mutex_lock(&db->addr_lock); |
407 | |||
408 | spin_lock_irqsave(&db->lock, flags); | ||
409 | iow(db, DM9000_EPAR, offset); | ||
410 | iow(db, DM9000_EPDRH, data[1]); | ||
411 | iow(db, DM9000_EPDRL, data[0]); | ||
412 | iow(db, DM9000_EPCR, EPCR_WEP | EPCR_ERPRW); | ||
413 | spin_unlock_irqrestore(&db->lock, flags); | ||
414 | |||
415 | dm9000_wait_eeprom(db); | ||
416 | |||
417 | mdelay(1); /* wait at least 150uS to clear */ | ||
418 | |||
419 | spin_lock_irqsave(&db->lock, flags); | ||
420 | iow(db, DM9000_EPCR, 0); | ||
421 | spin_unlock_irqrestore(&db->lock, flags); | ||
422 | |||
423 | mutex_unlock(&db->addr_lock); | ||
361 | } | 424 | } |
362 | 425 | ||
363 | /* ethtool ops */ | 426 | /* ethtool ops */ |
@@ -527,271 +590,55 @@ static unsigned char dm9000_type_to_char(enum dm9000_type type) | |||
527 | return '?'; | 590 | return '?'; |
528 | } | 591 | } |
529 | 592 | ||
530 | #define res_size(_r) (((_r)->end - (_r)->start) + 1) | ||
531 | |||
532 | /* | 593 | /* |
533 | * Search DM9000 board, allocate space and register it | 594 | * Set DM9000 multicast address |
534 | */ | 595 | */ |
535 | static int __devinit | 596 | static void |
536 | dm9000_probe(struct platform_device *pdev) | 597 | dm9000_hash_table(struct net_device *dev) |
537 | { | 598 | { |
538 | struct dm9000_plat_data *pdata = pdev->dev.platform_data; | 599 | board_info_t *db = (board_info_t *) dev->priv; |
539 | struct board_info *db; /* Point a board information structure */ | 600 | struct dev_mc_list *mcptr = dev->mc_list; |
540 | struct net_device *ndev; | 601 | int mc_cnt = dev->mc_count; |
541 | const unsigned char *mac_src; | 602 | int i, oft; |
542 | int ret = 0; | 603 | u32 hash_val; |
543 | int iosize; | 604 | u16 hash_table[4]; |
544 | int i; | 605 | u8 rcr = RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN; |
545 | u32 id_val; | 606 | unsigned long flags; |
546 | |||
547 | /* Init network device */ | ||
548 | ndev = alloc_etherdev(sizeof (struct board_info)); | ||
549 | if (!ndev) { | ||
550 | dev_err(&pdev->dev, "could not allocate device.\n"); | ||
551 | return -ENOMEM; | ||
552 | } | ||
553 | |||
554 | SET_NETDEV_DEV(ndev, &pdev->dev); | ||
555 | |||
556 | dev_dbg(&pdev->dev, "dm9000_probe()\n"); | ||
557 | |||
558 | /* setup board info structure */ | ||
559 | db = (struct board_info *) ndev->priv; | ||
560 | memset(db, 0, sizeof (*db)); | ||
561 | |||
562 | db->dev = &pdev->dev; | ||
563 | db->ndev = ndev; | ||
564 | |||
565 | spin_lock_init(&db->lock); | ||
566 | mutex_init(&db->addr_lock); | ||
567 | |||
568 | INIT_DELAYED_WORK(&db->phy_poll, dm9000_poll_work); | ||
569 | |||
570 | db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
571 | db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
572 | db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
573 | |||
574 | if (db->addr_res == NULL || db->data_res == NULL || | ||
575 | db->irq_res == NULL) { | ||
576 | dev_err(db->dev, "insufficient resources\n"); | ||
577 | ret = -ENOENT; | ||
578 | goto out; | ||
579 | } | ||
580 | |||
581 | iosize = res_size(db->addr_res); | ||
582 | db->addr_req = request_mem_region(db->addr_res->start, iosize, | ||
583 | pdev->name); | ||
584 | |||
585 | if (db->addr_req == NULL) { | ||
586 | dev_err(db->dev, "cannot claim address reg area\n"); | ||
587 | ret = -EIO; | ||
588 | goto out; | ||
589 | } | ||
590 | |||
591 | db->io_addr = ioremap(db->addr_res->start, iosize); | ||
592 | |||
593 | if (db->io_addr == NULL) { | ||
594 | dev_err(db->dev, "failed to ioremap address reg\n"); | ||
595 | ret = -EINVAL; | ||
596 | goto out; | ||
597 | } | ||
598 | |||
599 | iosize = res_size(db->data_res); | ||
600 | db->data_req = request_mem_region(db->data_res->start, iosize, | ||
601 | pdev->name); | ||
602 | |||
603 | if (db->data_req == NULL) { | ||
604 | dev_err(db->dev, "cannot claim data reg area\n"); | ||
605 | ret = -EIO; | ||
606 | goto out; | ||
607 | } | ||
608 | |||
609 | db->io_data = ioremap(db->data_res->start, iosize); | ||
610 | |||
611 | if (db->io_data == NULL) { | ||
612 | dev_err(db->dev, "failed to ioremap data reg\n"); | ||
613 | ret = -EINVAL; | ||
614 | goto out; | ||
615 | } | ||
616 | |||
617 | /* fill in parameters for net-dev structure */ | ||
618 | ndev->base_addr = (unsigned long)db->io_addr; | ||
619 | ndev->irq = db->irq_res->start; | ||
620 | |||
621 | /* ensure at least we have a default set of IO routines */ | ||
622 | dm9000_set_io(db, iosize); | ||
623 | |||
624 | /* check to see if anything is being over-ridden */ | ||
625 | if (pdata != NULL) { | ||
626 | /* check to see if the driver wants to over-ride the | ||
627 | * default IO width */ | ||
628 | |||
629 | if (pdata->flags & DM9000_PLATF_8BITONLY) | ||
630 | dm9000_set_io(db, 1); | ||
631 | |||
632 | if (pdata->flags & DM9000_PLATF_16BITONLY) | ||
633 | dm9000_set_io(db, 2); | ||
634 | |||
635 | if (pdata->flags & DM9000_PLATF_32BITONLY) | ||
636 | dm9000_set_io(db, 4); | ||
637 | |||
638 | /* check to see if there are any IO routine | ||
639 | * over-rides */ | ||
640 | |||
641 | if (pdata->inblk != NULL) | ||
642 | db->inblk = pdata->inblk; | ||
643 | |||
644 | if (pdata->outblk != NULL) | ||
645 | db->outblk = pdata->outblk; | ||
646 | |||
647 | if (pdata->dumpblk != NULL) | ||
648 | db->dumpblk = pdata->dumpblk; | ||
649 | |||
650 | db->flags = pdata->flags; | ||
651 | } | ||
652 | |||
653 | dm9000_reset(db); | ||
654 | |||
655 | /* try multiple times, DM9000 sometimes gets the read wrong */ | ||
656 | for (i = 0; i < 8; i++) { | ||
657 | id_val = ior(db, DM9000_VIDL); | ||
658 | id_val |= (u32)ior(db, DM9000_VIDH) << 8; | ||
659 | id_val |= (u32)ior(db, DM9000_PIDL) << 16; | ||
660 | id_val |= (u32)ior(db, DM9000_PIDH) << 24; | ||
661 | |||
662 | if (id_val == DM9000_ID) | ||
663 | break; | ||
664 | dev_err(db->dev, "read wrong id 0x%08x\n", id_val); | ||
665 | } | ||
666 | |||
667 | if (id_val != DM9000_ID) { | ||
668 | dev_err(db->dev, "wrong id: 0x%08x\n", id_val); | ||
669 | ret = -ENODEV; | ||
670 | goto out; | ||
671 | } | ||
672 | |||
673 | /* Identify what type of DM9000 we are working on */ | ||
674 | |||
675 | id_val = ior(db, DM9000_CHIPR); | ||
676 | dev_dbg(db->dev, "dm9000 revision 0x%02x\n", id_val); | ||
677 | |||
678 | switch (id_val) { | ||
679 | case CHIPR_DM9000A: | ||
680 | db->type = TYPE_DM9000A; | ||
681 | break; | ||
682 | case CHIPR_DM9000B: | ||
683 | db->type = TYPE_DM9000B; | ||
684 | break; | ||
685 | default: | ||
686 | dev_dbg(db->dev, "ID %02x => defaulting to DM9000E\n", id_val); | ||
687 | db->type = TYPE_DM9000E; | ||
688 | } | ||
689 | |||
690 | /* from this point we assume that we have found a DM9000 */ | ||
691 | |||
692 | /* driver system function */ | ||
693 | ether_setup(ndev); | ||
694 | |||
695 | ndev->open = &dm9000_open; | ||
696 | ndev->hard_start_xmit = &dm9000_start_xmit; | ||
697 | ndev->tx_timeout = &dm9000_timeout; | ||
698 | ndev->watchdog_timeo = msecs_to_jiffies(watchdog); | ||
699 | ndev->stop = &dm9000_stop; | ||
700 | ndev->set_multicast_list = &dm9000_hash_table; | ||
701 | ndev->ethtool_ops = &dm9000_ethtool_ops; | ||
702 | ndev->do_ioctl = &dm9000_ioctl; | ||
703 | |||
704 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
705 | ndev->poll_controller = &dm9000_poll_controller; | ||
706 | #endif | ||
707 | 607 | ||
708 | db->msg_enable = NETIF_MSG_LINK; | 608 | dm9000_dbg(db, 1, "entering %s\n", __func__); |
709 | db->mii.phy_id_mask = 0x1f; | ||
710 | db->mii.reg_num_mask = 0x1f; | ||
711 | db->mii.force_media = 0; | ||
712 | db->mii.full_duplex = 0; | ||
713 | db->mii.dev = ndev; | ||
714 | db->mii.mdio_read = dm9000_phy_read; | ||
715 | db->mii.mdio_write = dm9000_phy_write; | ||
716 | 609 | ||
717 | mac_src = "eeprom"; | 610 | spin_lock_irqsave(&db->lock, flags); |
718 | 611 | ||
719 | /* try reading the node address from the attached EEPROM */ | 612 | for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++) |
720 | for (i = 0; i < 6; i += 2) | 613 | iow(db, oft, dev->dev_addr[i]); |
721 | dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i); | ||
722 | 614 | ||
723 | if (!is_valid_ether_addr(ndev->dev_addr)) { | 615 | /* Clear Hash Table */ |
724 | /* try reading from mac */ | 616 | for (i = 0; i < 4; i++) |
617 | hash_table[i] = 0x0; | ||
725 | 618 | ||
726 | mac_src = "chip"; | 619 | /* broadcast address */ |
727 | for (i = 0; i < 6; i++) | 620 | hash_table[3] = 0x8000; |
728 | ndev->dev_addr[i] = ior(db, i+DM9000_PAR); | ||
729 | } | ||
730 | 621 | ||
731 | if (!is_valid_ether_addr(ndev->dev_addr)) | 622 | if (dev->flags & IFF_PROMISC) |
732 | dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please " | 623 | rcr |= RCR_PRMSC; |
733 | "set using ifconfig\n", ndev->name); | ||
734 | 624 | ||
735 | platform_set_drvdata(pdev, ndev); | 625 | if (dev->flags & IFF_ALLMULTI) |
736 | ret = register_netdev(ndev); | 626 | rcr |= RCR_ALL; |
737 | 627 | ||
738 | if (ret == 0) { | 628 | /* the multicast address in Hash Table : 64 bits */ |
739 | DECLARE_MAC_BUF(mac); | 629 | for (i = 0; i < mc_cnt; i++, mcptr = mcptr->next) { |
740 | printk(KERN_INFO "%s: dm9000%c at %p,%p IRQ %d MAC: %s (%s)\n", | 630 | hash_val = ether_crc_le(6, mcptr->dmi_addr) & 0x3f; |
741 | ndev->name, dm9000_type_to_char(db->type), | 631 | hash_table[hash_val / 16] |= (u16) 1 << (hash_val % 16); |
742 | db->io_addr, db->io_data, ndev->irq, | ||
743 | print_mac(mac, ndev->dev_addr), mac_src); | ||
744 | } | 632 | } |
745 | return 0; | ||
746 | |||
747 | out: | ||
748 | dev_err(db->dev, "not found (%d).\n", ret); | ||
749 | 633 | ||
750 | dm9000_release_board(pdev, db); | 634 | /* Write the hash table to MAC MD table */ |
751 | free_netdev(ndev); | 635 | for (i = 0, oft = DM9000_MAR; i < 4; i++) { |
752 | 636 | iow(db, oft++, hash_table[i]); | |
753 | return ret; | 637 | iow(db, oft++, hash_table[i] >> 8); |
754 | } | ||
755 | |||
756 | /* | ||
757 | * Open the interface. | ||
758 | * The interface is opened whenever "ifconfig" actives it. | ||
759 | */ | ||
760 | static int | ||
761 | dm9000_open(struct net_device *dev) | ||
762 | { | ||
763 | board_info_t *db = dev->priv; | ||
764 | unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK; | ||
765 | |||
766 | if (netif_msg_ifup(db)) | ||
767 | dev_dbg(db->dev, "enabling %s\n", dev->name); | ||
768 | |||
769 | /* If there is no IRQ type specified, default to something that | ||
770 | * may work, and tell the user that this is a problem */ | ||
771 | |||
772 | if (irqflags == IRQF_TRIGGER_NONE) { | ||
773 | dev_warn(db->dev, "WARNING: no IRQ resource flags set.\n"); | ||
774 | irqflags = DEFAULT_TRIGGER; | ||
775 | } | 638 | } |
776 | 639 | ||
777 | irqflags |= IRQF_SHARED; | 640 | iow(db, DM9000_RCR, rcr); |
778 | 641 | spin_unlock_irqrestore(&db->lock, flags); | |
779 | if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev)) | ||
780 | return -EAGAIN; | ||
781 | |||
782 | /* Initialize DM9000 board */ | ||
783 | dm9000_reset(db); | ||
784 | dm9000_init_dm9000(dev); | ||
785 | |||
786 | /* Init driver variable */ | ||
787 | db->dbug_cnt = 0; | ||
788 | |||
789 | mii_check_media(&db->mii, netif_msg_link(db), 1); | ||
790 | netif_start_queue(dev); | ||
791 | |||
792 | dm9000_schedule_poll(db); | ||
793 | |||
794 | return 0; | ||
795 | } | 642 | } |
796 | 643 | ||
797 | /* | 644 | /* |
@@ -843,6 +690,29 @@ dm9000_init_dm9000(struct net_device *dev) | |||
843 | dev->trans_start = 0; | 690 | dev->trans_start = 0; |
844 | } | 691 | } |
845 | 692 | ||
693 | /* Our watchdog timed out. Called by the networking layer */ | ||
694 | static void dm9000_timeout(struct net_device *dev) | ||
695 | { | ||
696 | board_info_t *db = (board_info_t *) dev->priv; | ||
697 | u8 reg_save; | ||
698 | unsigned long flags; | ||
699 | |||
700 | /* Save previous register address */ | ||
701 | reg_save = readb(db->io_addr); | ||
702 | spin_lock_irqsave(&db->lock, flags); | ||
703 | |||
704 | netif_stop_queue(dev); | ||
705 | dm9000_reset(db); | ||
706 | dm9000_init_dm9000(dev); | ||
707 | /* We can accept TX packets again */ | ||
708 | dev->trans_start = jiffies; | ||
709 | netif_wake_queue(dev); | ||
710 | |||
711 | /* Restore previous register address */ | ||
712 | writeb(reg_save, db->io_addr); | ||
713 | spin_unlock_irqrestore(&db->lock, flags); | ||
714 | } | ||
715 | |||
846 | /* | 716 | /* |
847 | * Hardware start transmission. | 717 | * Hardware start transmission. |
848 | * Send a packet to media from the upper layer. | 718 | * Send a packet to media from the upper layer. |
@@ -891,50 +761,12 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
891 | return 0; | 761 | return 0; |
892 | } | 762 | } |
893 | 763 | ||
894 | static void | ||
895 | dm9000_shutdown(struct net_device *dev) | ||
896 | { | ||
897 | board_info_t *db = dev->priv; | ||
898 | |||
899 | /* RESET device */ | ||
900 | dm9000_phy_write(dev, 0, MII_BMCR, BMCR_RESET); /* PHY RESET */ | ||
901 | iow(db, DM9000_GPR, 0x01); /* Power-Down PHY */ | ||
902 | iow(db, DM9000_IMR, IMR_PAR); /* Disable all interrupt */ | ||
903 | iow(db, DM9000_RCR, 0x00); /* Disable RX */ | ||
904 | } | ||
905 | |||
906 | /* | ||
907 | * Stop the interface. | ||
908 | * The interface is stopped when it is brought. | ||
909 | */ | ||
910 | static int | ||
911 | dm9000_stop(struct net_device *ndev) | ||
912 | { | ||
913 | board_info_t *db = ndev->priv; | ||
914 | |||
915 | if (netif_msg_ifdown(db)) | ||
916 | dev_dbg(db->dev, "shutting down %s\n", ndev->name); | ||
917 | |||
918 | cancel_delayed_work_sync(&db->phy_poll); | ||
919 | |||
920 | netif_stop_queue(ndev); | ||
921 | netif_carrier_off(ndev); | ||
922 | |||
923 | /* free interrupt */ | ||
924 | free_irq(ndev->irq, ndev); | ||
925 | |||
926 | dm9000_shutdown(ndev); | ||
927 | |||
928 | return 0; | ||
929 | } | ||
930 | |||
931 | /* | 764 | /* |
932 | * DM9000 interrupt handler | 765 | * DM9000 interrupt handler |
933 | * receive the packet to upper layer, free the transmitted packet | 766 | * receive the packet to upper layer, free the transmitted packet |
934 | */ | 767 | */ |
935 | 768 | ||
936 | static void | 769 | static void dm9000_tx_done(struct net_device *dev, board_info_t *db) |
937 | dm9000_tx_done(struct net_device *dev, board_info_t * db) | ||
938 | { | 770 | { |
939 | int tx_status = ior(db, DM9000_NSR); /* Got TX status */ | 771 | int tx_status = ior(db, DM9000_NSR); /* Got TX status */ |
940 | 772 | ||
@@ -957,59 +789,6 @@ dm9000_tx_done(struct net_device *dev, board_info_t * db) | |||
957 | } | 789 | } |
958 | } | 790 | } |
959 | 791 | ||
960 | static irqreturn_t | ||
961 | dm9000_interrupt(int irq, void *dev_id) | ||
962 | { | ||
963 | struct net_device *dev = dev_id; | ||
964 | board_info_t *db = dev->priv; | ||
965 | int int_status; | ||
966 | u8 reg_save; | ||
967 | |||
968 | dm9000_dbg(db, 3, "entering %s\n", __func__); | ||
969 | |||
970 | /* A real interrupt coming */ | ||
971 | |||
972 | spin_lock(&db->lock); | ||
973 | |||
974 | /* Save previous register address */ | ||
975 | reg_save = readb(db->io_addr); | ||
976 | |||
977 | /* Disable all interrupts */ | ||
978 | iow(db, DM9000_IMR, IMR_PAR); | ||
979 | |||
980 | /* Got DM9000 interrupt status */ | ||
981 | int_status = ior(db, DM9000_ISR); /* Got ISR */ | ||
982 | iow(db, DM9000_ISR, int_status); /* Clear ISR status */ | ||
983 | |||
984 | if (netif_msg_intr(db)) | ||
985 | dev_dbg(db->dev, "interrupt status %02x\n", int_status); | ||
986 | |||
987 | /* Received the coming packet */ | ||
988 | if (int_status & ISR_PRS) | ||
989 | dm9000_rx(dev); | ||
990 | |||
991 | /* Trnasmit Interrupt check */ | ||
992 | if (int_status & ISR_PTS) | ||
993 | dm9000_tx_done(dev, db); | ||
994 | |||
995 | if (db->type != TYPE_DM9000E) { | ||
996 | if (int_status & ISR_LNKCHNG) { | ||
997 | /* fire a link-change request */ | ||
998 | schedule_delayed_work(&db->phy_poll, 1); | ||
999 | } | ||
1000 | } | ||
1001 | |||
1002 | /* Re-enable interrupt mask */ | ||
1003 | iow(db, DM9000_IMR, db->imr_all); | ||
1004 | |||
1005 | /* Restore previous register address */ | ||
1006 | writeb(reg_save, db->io_addr); | ||
1007 | |||
1008 | spin_unlock(&db->lock); | ||
1009 | |||
1010 | return IRQ_HANDLED; | ||
1011 | } | ||
1012 | |||
1013 | struct dm9000_rxhdr { | 792 | struct dm9000_rxhdr { |
1014 | u8 RxPktReady; | 793 | u8 RxPktReady; |
1015 | u8 RxStatus; | 794 | u8 RxStatus; |
@@ -1113,173 +892,111 @@ dm9000_rx(struct net_device *dev) | |||
1113 | } while (rxbyte == DM9000_PKT_RDY); | 892 | } while (rxbyte == DM9000_PKT_RDY); |
1114 | } | 893 | } |
1115 | 894 | ||
1116 | static unsigned int | 895 | static irqreturn_t dm9000_interrupt(int irq, void *dev_id) |
1117 | dm9000_read_locked(board_info_t *db, int reg) | ||
1118 | { | 896 | { |
1119 | unsigned long flags; | 897 | struct net_device *dev = dev_id; |
1120 | unsigned int ret; | 898 | board_info_t *db = dev->priv; |
899 | int int_status; | ||
900 | u8 reg_save; | ||
1121 | 901 | ||
1122 | spin_lock_irqsave(&db->lock, flags); | 902 | dm9000_dbg(db, 3, "entering %s\n", __func__); |
1123 | ret = ior(db, reg); | ||
1124 | spin_unlock_irqrestore(&db->lock, flags); | ||
1125 | 903 | ||
1126 | return ret; | 904 | /* A real interrupt coming */ |
1127 | } | ||
1128 | 905 | ||
1129 | static int dm9000_wait_eeprom(board_info_t *db) | 906 | spin_lock(&db->lock); |
1130 | { | ||
1131 | unsigned int status; | ||
1132 | int timeout = 8; /* wait max 8msec */ | ||
1133 | 907 | ||
1134 | /* The DM9000 data sheets say we should be able to | 908 | /* Save previous register address */ |
1135 | * poll the ERRE bit in EPCR to wait for the EEPROM | 909 | reg_save = readb(db->io_addr); |
1136 | * operation. From testing several chips, this bit | ||
1137 | * does not seem to work. | ||
1138 | * | ||
1139 | * We attempt to use the bit, but fall back to the | ||
1140 | * timeout (which is why we do not return an error | ||
1141 | * on expiry) to say that the EEPROM operation has | ||
1142 | * completed. | ||
1143 | */ | ||
1144 | 910 | ||
1145 | while (1) { | 911 | /* Disable all interrupts */ |
1146 | status = dm9000_read_locked(db, DM9000_EPCR); | 912 | iow(db, DM9000_IMR, IMR_PAR); |
1147 | 913 | ||
1148 | if ((status & EPCR_ERRE) == 0) | 914 | /* Got DM9000 interrupt status */ |
1149 | break; | 915 | int_status = ior(db, DM9000_ISR); /* Got ISR */ |
916 | iow(db, DM9000_ISR, int_status); /* Clear ISR status */ | ||
1150 | 917 | ||
1151 | if (timeout-- < 0) { | 918 | if (netif_msg_intr(db)) |
1152 | dev_dbg(db->dev, "timeout waiting EEPROM\n"); | 919 | dev_dbg(db->dev, "interrupt status %02x\n", int_status); |
1153 | break; | ||
1154 | } | ||
1155 | } | ||
1156 | 920 | ||
1157 | return 0; | 921 | /* Received the coming packet */ |
1158 | } | 922 | if (int_status & ISR_PRS) |
923 | dm9000_rx(dev); | ||
1159 | 924 | ||
1160 | /* | 925 | /* Trnasmit Interrupt check */ |
1161 | * Read a word data from EEPROM | 926 | if (int_status & ISR_PTS) |
1162 | */ | 927 | dm9000_tx_done(dev, db); |
1163 | static void | ||
1164 | dm9000_read_eeprom(board_info_t *db, int offset, u8 *to) | ||
1165 | { | ||
1166 | unsigned long flags; | ||
1167 | 928 | ||
1168 | if (db->flags & DM9000_PLATF_NO_EEPROM) { | 929 | if (db->type != TYPE_DM9000E) { |
1169 | to[0] = 0xff; | 930 | if (int_status & ISR_LNKCHNG) { |
1170 | to[1] = 0xff; | 931 | /* fire a link-change request */ |
1171 | return; | 932 | schedule_delayed_work(&db->phy_poll, 1); |
933 | } | ||
1172 | } | 934 | } |
1173 | 935 | ||
1174 | mutex_lock(&db->addr_lock); | 936 | /* Re-enable interrupt mask */ |
1175 | 937 | iow(db, DM9000_IMR, db->imr_all); | |
1176 | spin_lock_irqsave(&db->lock, flags); | ||
1177 | |||
1178 | iow(db, DM9000_EPAR, offset); | ||
1179 | iow(db, DM9000_EPCR, EPCR_ERPRR); | ||
1180 | |||
1181 | spin_unlock_irqrestore(&db->lock, flags); | ||
1182 | |||
1183 | dm9000_wait_eeprom(db); | ||
1184 | |||
1185 | /* delay for at-least 150uS */ | ||
1186 | msleep(1); | ||
1187 | |||
1188 | spin_lock_irqsave(&db->lock, flags); | ||
1189 | |||
1190 | iow(db, DM9000_EPCR, 0x0); | ||
1191 | 938 | ||
1192 | to[0] = ior(db, DM9000_EPDRL); | 939 | /* Restore previous register address */ |
1193 | to[1] = ior(db, DM9000_EPDRH); | 940 | writeb(reg_save, db->io_addr); |
1194 | 941 | ||
1195 | spin_unlock_irqrestore(&db->lock, flags); | 942 | spin_unlock(&db->lock); |
1196 | 943 | ||
1197 | mutex_unlock(&db->addr_lock); | 944 | return IRQ_HANDLED; |
1198 | } | 945 | } |
1199 | 946 | ||
947 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
1200 | /* | 948 | /* |
1201 | * Write a word data to SROM | 949 | *Used by netconsole |
1202 | */ | 950 | */ |
1203 | static void | 951 | static void dm9000_poll_controller(struct net_device *dev) |
1204 | dm9000_write_eeprom(board_info_t *db, int offset, u8 *data) | ||
1205 | { | 952 | { |
1206 | unsigned long flags; | 953 | disable_irq(dev->irq); |
1207 | 954 | dm9000_interrupt(dev->irq, dev); | |
1208 | if (db->flags & DM9000_PLATF_NO_EEPROM) | 955 | enable_irq(dev->irq); |
1209 | return; | ||
1210 | |||
1211 | mutex_lock(&db->addr_lock); | ||
1212 | |||
1213 | spin_lock_irqsave(&db->lock, flags); | ||
1214 | iow(db, DM9000_EPAR, offset); | ||
1215 | iow(db, DM9000_EPDRH, data[1]); | ||
1216 | iow(db, DM9000_EPDRL, data[0]); | ||
1217 | iow(db, DM9000_EPCR, EPCR_WEP | EPCR_ERPRW); | ||
1218 | spin_unlock_irqrestore(&db->lock, flags); | ||
1219 | |||
1220 | dm9000_wait_eeprom(db); | ||
1221 | |||
1222 | mdelay(1); /* wait at least 150uS to clear */ | ||
1223 | |||
1224 | spin_lock_irqsave(&db->lock, flags); | ||
1225 | iow(db, DM9000_EPCR, 0); | ||
1226 | spin_unlock_irqrestore(&db->lock, flags); | ||
1227 | |||
1228 | mutex_unlock(&db->addr_lock); | ||
1229 | } | 956 | } |
957 | #endif | ||
1230 | 958 | ||
1231 | /* | 959 | /* |
1232 | * Set DM9000 multicast address | 960 | * Open the interface. |
961 | * The interface is opened whenever "ifconfig" actives it. | ||
1233 | */ | 962 | */ |
1234 | static void | 963 | static int |
1235 | dm9000_hash_table(struct net_device *dev) | 964 | dm9000_open(struct net_device *dev) |
1236 | { | 965 | { |
1237 | board_info_t *db = (board_info_t *) dev->priv; | 966 | board_info_t *db = dev->priv; |
1238 | struct dev_mc_list *mcptr = dev->mc_list; | 967 | unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK; |
1239 | int mc_cnt = dev->mc_count; | ||
1240 | int i, oft; | ||
1241 | u32 hash_val; | ||
1242 | u16 hash_table[4]; | ||
1243 | u8 rcr = RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN; | ||
1244 | unsigned long flags; | ||
1245 | |||
1246 | dm9000_dbg(db, 1, "entering %s\n", __func__); | ||
1247 | |||
1248 | spin_lock_irqsave(&db->lock, flags); | ||
1249 | 968 | ||
1250 | for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++) | 969 | if (netif_msg_ifup(db)) |
1251 | iow(db, oft, dev->dev_addr[i]); | 970 | dev_dbg(db->dev, "enabling %s\n", dev->name); |
1252 | 971 | ||
1253 | /* Clear Hash Table */ | 972 | /* If there is no IRQ type specified, default to something that |
1254 | for (i = 0; i < 4; i++) | 973 | * may work, and tell the user that this is a problem */ |
1255 | hash_table[i] = 0x0; | ||
1256 | 974 | ||
1257 | /* broadcast address */ | 975 | if (irqflags == IRQF_TRIGGER_NONE) { |
1258 | hash_table[3] = 0x8000; | 976 | dev_warn(db->dev, "WARNING: no IRQ resource flags set.\n"); |
977 | irqflags = DEFAULT_TRIGGER; | ||
978 | } | ||
979 | |||
980 | irqflags |= IRQF_SHARED; | ||
1259 | 981 | ||
1260 | if (dev->flags & IFF_PROMISC) | 982 | if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev)) |
1261 | rcr |= RCR_PRMSC; | 983 | return -EAGAIN; |
1262 | 984 | ||
1263 | if (dev->flags & IFF_ALLMULTI) | 985 | /* Initialize DM9000 board */ |
1264 | rcr |= RCR_ALL; | 986 | dm9000_reset(db); |
987 | dm9000_init_dm9000(dev); | ||
1265 | 988 | ||
1266 | /* the multicast address in Hash Table : 64 bits */ | 989 | /* Init driver variable */ |
1267 | for (i = 0; i < mc_cnt; i++, mcptr = mcptr->next) { | 990 | db->dbug_cnt = 0; |
1268 | hash_val = ether_crc_le(6, mcptr->dmi_addr) & 0x3f; | ||
1269 | hash_table[hash_val / 16] |= (u16) 1 << (hash_val % 16); | ||
1270 | } | ||
1271 | 991 | ||
1272 | /* Write the hash table to MAC MD table */ | 992 | mii_check_media(&db->mii, netif_msg_link(db), 1); |
1273 | for (i = 0, oft = DM9000_MAR; i < 4; i++) { | 993 | netif_start_queue(dev); |
1274 | iow(db, oft++, hash_table[i]); | 994 | |
1275 | iow(db, oft++, hash_table[i] >> 8); | 995 | dm9000_schedule_poll(db); |
1276 | } | ||
1277 | 996 | ||
1278 | iow(db, DM9000_RCR, rcr); | 997 | return 0; |
1279 | spin_unlock_irqrestore(&db->lock, flags); | ||
1280 | } | 998 | } |
1281 | 999 | ||
1282 | |||
1283 | /* | 1000 | /* |
1284 | * Sleep, either by using msleep() or if we are suspending, then | 1001 | * Sleep, either by using msleep() or if we are suspending, then |
1285 | * use mdelay() to sleep. | 1002 | * use mdelay() to sleep. |
@@ -1383,6 +1100,269 @@ dm9000_phy_write(struct net_device *dev, | |||
1383 | mutex_unlock(&db->addr_lock); | 1100 | mutex_unlock(&db->addr_lock); |
1384 | } | 1101 | } |
1385 | 1102 | ||
1103 | static void | ||
1104 | dm9000_shutdown(struct net_device *dev) | ||
1105 | { | ||
1106 | board_info_t *db = dev->priv; | ||
1107 | |||
1108 | /* RESET device */ | ||
1109 | dm9000_phy_write(dev, 0, MII_BMCR, BMCR_RESET); /* PHY RESET */ | ||
1110 | iow(db, DM9000_GPR, 0x01); /* Power-Down PHY */ | ||
1111 | iow(db, DM9000_IMR, IMR_PAR); /* Disable all interrupt */ | ||
1112 | iow(db, DM9000_RCR, 0x00); /* Disable RX */ | ||
1113 | } | ||
1114 | |||
1115 | /* | ||
1116 | * Stop the interface. | ||
1117 | * The interface is stopped when it is brought. | ||
1118 | */ | ||
1119 | static int | ||
1120 | dm9000_stop(struct net_device *ndev) | ||
1121 | { | ||
1122 | board_info_t *db = ndev->priv; | ||
1123 | |||
1124 | if (netif_msg_ifdown(db)) | ||
1125 | dev_dbg(db->dev, "shutting down %s\n", ndev->name); | ||
1126 | |||
1127 | cancel_delayed_work_sync(&db->phy_poll); | ||
1128 | |||
1129 | netif_stop_queue(ndev); | ||
1130 | netif_carrier_off(ndev); | ||
1131 | |||
1132 | /* free interrupt */ | ||
1133 | free_irq(ndev->irq, ndev); | ||
1134 | |||
1135 | dm9000_shutdown(ndev); | ||
1136 | |||
1137 | return 0; | ||
1138 | } | ||
1139 | |||
1140 | #define res_size(_r) (((_r)->end - (_r)->start) + 1) | ||
1141 | |||
1142 | /* | ||
1143 | * Search DM9000 board, allocate space and register it | ||
1144 | */ | ||
1145 | static int __devinit | ||
1146 | dm9000_probe(struct platform_device *pdev) | ||
1147 | { | ||
1148 | struct dm9000_plat_data *pdata = pdev->dev.platform_data; | ||
1149 | struct board_info *db; /* Point a board information structure */ | ||
1150 | struct net_device *ndev; | ||
1151 | const unsigned char *mac_src; | ||
1152 | int ret = 0; | ||
1153 | int iosize; | ||
1154 | int i; | ||
1155 | u32 id_val; | ||
1156 | |||
1157 | /* Init network device */ | ||
1158 | ndev = alloc_etherdev(sizeof(struct board_info)); | ||
1159 | if (!ndev) { | ||
1160 | dev_err(&pdev->dev, "could not allocate device.\n"); | ||
1161 | return -ENOMEM; | ||
1162 | } | ||
1163 | |||
1164 | SET_NETDEV_DEV(ndev, &pdev->dev); | ||
1165 | |||
1166 | dev_dbg(&pdev->dev, "dm9000_probe()\n"); | ||
1167 | |||
1168 | /* setup board info structure */ | ||
1169 | db = ndev->priv; | ||
1170 | memset(db, 0, sizeof(*db)); | ||
1171 | |||
1172 | db->dev = &pdev->dev; | ||
1173 | db->ndev = ndev; | ||
1174 | |||
1175 | spin_lock_init(&db->lock); | ||
1176 | mutex_init(&db->addr_lock); | ||
1177 | |||
1178 | INIT_DELAYED_WORK(&db->phy_poll, dm9000_poll_work); | ||
1179 | |||
1180 | db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1181 | db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
1182 | db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
1183 | |||
1184 | if (db->addr_res == NULL || db->data_res == NULL || | ||
1185 | db->irq_res == NULL) { | ||
1186 | dev_err(db->dev, "insufficient resources\n"); | ||
1187 | ret = -ENOENT; | ||
1188 | goto out; | ||
1189 | } | ||
1190 | |||
1191 | iosize = res_size(db->addr_res); | ||
1192 | db->addr_req = request_mem_region(db->addr_res->start, iosize, | ||
1193 | pdev->name); | ||
1194 | |||
1195 | if (db->addr_req == NULL) { | ||
1196 | dev_err(db->dev, "cannot claim address reg area\n"); | ||
1197 | ret = -EIO; | ||
1198 | goto out; | ||
1199 | } | ||
1200 | |||
1201 | db->io_addr = ioremap(db->addr_res->start, iosize); | ||
1202 | |||
1203 | if (db->io_addr == NULL) { | ||
1204 | dev_err(db->dev, "failed to ioremap address reg\n"); | ||
1205 | ret = -EINVAL; | ||
1206 | goto out; | ||
1207 | } | ||
1208 | |||
1209 | iosize = res_size(db->data_res); | ||
1210 | db->data_req = request_mem_region(db->data_res->start, iosize, | ||
1211 | pdev->name); | ||
1212 | |||
1213 | if (db->data_req == NULL) { | ||
1214 | dev_err(db->dev, "cannot claim data reg area\n"); | ||
1215 | ret = -EIO; | ||
1216 | goto out; | ||
1217 | } | ||
1218 | |||
1219 | db->io_data = ioremap(db->data_res->start, iosize); | ||
1220 | |||
1221 | if (db->io_data == NULL) { | ||
1222 | dev_err(db->dev, "failed to ioremap data reg\n"); | ||
1223 | ret = -EINVAL; | ||
1224 | goto out; | ||
1225 | } | ||
1226 | |||
1227 | /* fill in parameters for net-dev structure */ | ||
1228 | ndev->base_addr = (unsigned long)db->io_addr; | ||
1229 | ndev->irq = db->irq_res->start; | ||
1230 | |||
1231 | /* ensure at least we have a default set of IO routines */ | ||
1232 | dm9000_set_io(db, iosize); | ||
1233 | |||
1234 | /* check to see if anything is being over-ridden */ | ||
1235 | if (pdata != NULL) { | ||
1236 | /* check to see if the driver wants to over-ride the | ||
1237 | * default IO width */ | ||
1238 | |||
1239 | if (pdata->flags & DM9000_PLATF_8BITONLY) | ||
1240 | dm9000_set_io(db, 1); | ||
1241 | |||
1242 | if (pdata->flags & DM9000_PLATF_16BITONLY) | ||
1243 | dm9000_set_io(db, 2); | ||
1244 | |||
1245 | if (pdata->flags & DM9000_PLATF_32BITONLY) | ||
1246 | dm9000_set_io(db, 4); | ||
1247 | |||
1248 | /* check to see if there are any IO routine | ||
1249 | * over-rides */ | ||
1250 | |||
1251 | if (pdata->inblk != NULL) | ||
1252 | db->inblk = pdata->inblk; | ||
1253 | |||
1254 | if (pdata->outblk != NULL) | ||
1255 | db->outblk = pdata->outblk; | ||
1256 | |||
1257 | if (pdata->dumpblk != NULL) | ||
1258 | db->dumpblk = pdata->dumpblk; | ||
1259 | |||
1260 | db->flags = pdata->flags; | ||
1261 | } | ||
1262 | |||
1263 | dm9000_reset(db); | ||
1264 | |||
1265 | /* try multiple times, DM9000 sometimes gets the read wrong */ | ||
1266 | for (i = 0; i < 8; i++) { | ||
1267 | id_val = ior(db, DM9000_VIDL); | ||
1268 | id_val |= (u32)ior(db, DM9000_VIDH) << 8; | ||
1269 | id_val |= (u32)ior(db, DM9000_PIDL) << 16; | ||
1270 | id_val |= (u32)ior(db, DM9000_PIDH) << 24; | ||
1271 | |||
1272 | if (id_val == DM9000_ID) | ||
1273 | break; | ||
1274 | dev_err(db->dev, "read wrong id 0x%08x\n", id_val); | ||
1275 | } | ||
1276 | |||
1277 | if (id_val != DM9000_ID) { | ||
1278 | dev_err(db->dev, "wrong id: 0x%08x\n", id_val); | ||
1279 | ret = -ENODEV; | ||
1280 | goto out; | ||
1281 | } | ||
1282 | |||
1283 | /* Identify what type of DM9000 we are working on */ | ||
1284 | |||
1285 | id_val = ior(db, DM9000_CHIPR); | ||
1286 | dev_dbg(db->dev, "dm9000 revision 0x%02x\n", id_val); | ||
1287 | |||
1288 | switch (id_val) { | ||
1289 | case CHIPR_DM9000A: | ||
1290 | db->type = TYPE_DM9000A; | ||
1291 | break; | ||
1292 | case CHIPR_DM9000B: | ||
1293 | db->type = TYPE_DM9000B; | ||
1294 | break; | ||
1295 | default: | ||
1296 | dev_dbg(db->dev, "ID %02x => defaulting to DM9000E\n", id_val); | ||
1297 | db->type = TYPE_DM9000E; | ||
1298 | } | ||
1299 | |||
1300 | /* from this point we assume that we have found a DM9000 */ | ||
1301 | |||
1302 | /* driver system function */ | ||
1303 | ether_setup(ndev); | ||
1304 | |||
1305 | ndev->open = &dm9000_open; | ||
1306 | ndev->hard_start_xmit = &dm9000_start_xmit; | ||
1307 | ndev->tx_timeout = &dm9000_timeout; | ||
1308 | ndev->watchdog_timeo = msecs_to_jiffies(watchdog); | ||
1309 | ndev->stop = &dm9000_stop; | ||
1310 | ndev->set_multicast_list = &dm9000_hash_table; | ||
1311 | ndev->ethtool_ops = &dm9000_ethtool_ops; | ||
1312 | ndev->do_ioctl = &dm9000_ioctl; | ||
1313 | |||
1314 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
1315 | ndev->poll_controller = &dm9000_poll_controller; | ||
1316 | #endif | ||
1317 | |||
1318 | db->msg_enable = NETIF_MSG_LINK; | ||
1319 | db->mii.phy_id_mask = 0x1f; | ||
1320 | db->mii.reg_num_mask = 0x1f; | ||
1321 | db->mii.force_media = 0; | ||
1322 | db->mii.full_duplex = 0; | ||
1323 | db->mii.dev = ndev; | ||
1324 | db->mii.mdio_read = dm9000_phy_read; | ||
1325 | db->mii.mdio_write = dm9000_phy_write; | ||
1326 | |||
1327 | mac_src = "eeprom"; | ||
1328 | |||
1329 | /* try reading the node address from the attached EEPROM */ | ||
1330 | for (i = 0; i < 6; i += 2) | ||
1331 | dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i); | ||
1332 | |||
1333 | if (!is_valid_ether_addr(ndev->dev_addr)) { | ||
1334 | /* try reading from mac */ | ||
1335 | |||
1336 | mac_src = "chip"; | ||
1337 | for (i = 0; i < 6; i++) | ||
1338 | ndev->dev_addr[i] = ior(db, i+DM9000_PAR); | ||
1339 | } | ||
1340 | |||
1341 | if (!is_valid_ether_addr(ndev->dev_addr)) | ||
1342 | dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please " | ||
1343 | "set using ifconfig\n", ndev->name); | ||
1344 | |||
1345 | platform_set_drvdata(pdev, ndev); | ||
1346 | ret = register_netdev(ndev); | ||
1347 | |||
1348 | if (ret == 0) { | ||
1349 | DECLARE_MAC_BUF(mac); | ||
1350 | printk(KERN_INFO "%s: dm9000%c at %p,%p IRQ %d MAC: %s (%s)\n", | ||
1351 | ndev->name, dm9000_type_to_char(db->type), | ||
1352 | db->io_addr, db->io_data, ndev->irq, | ||
1353 | print_mac(mac, ndev->dev_addr), mac_src); | ||
1354 | } | ||
1355 | return 0; | ||
1356 | |||
1357 | out: | ||
1358 | dev_err(db->dev, "not found (%d).\n", ret); | ||
1359 | |||
1360 | dm9000_release_board(pdev, db); | ||
1361 | free_netdev(ndev); | ||
1362 | |||
1363 | return ret; | ||
1364 | } | ||
1365 | |||
1386 | static int | 1366 | static int |
1387 | dm9000_drv_suspend(struct platform_device *dev, pm_message_t state) | 1367 | dm9000_drv_suspend(struct platform_device *dev, pm_message_t state) |
1388 | { | 1368 | { |