diff options
| author | Vitaly Bordug <vbordug@ru.mvista.com> | 2006-08-15 02:00:30 -0400 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-08-19 17:44:31 -0400 |
| commit | 5b4b8454344a0391bb0f69fda0f4ec8e1f0d2fed (patch) | |
| tree | a5e662cdc03d319e56a277281dcde754150276f4 | |
| parent | 11b0bacd717c285c94dbb56505a28434b34f0639 (diff) | |
[PATCH] FS_ENET: use PAL for mii management
This patch should update the fs_enet infrastructure to utilize Phy Abstraction
Layer subsystem. Along with the above, there are apparent bugfixes, overhaul
and improvements.
Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
| -rw-r--r-- | drivers/net/fs_enet/Makefile | 6 | ||||
| -rw-r--r-- | drivers/net/fs_enet/fec.h | 42 | ||||
| -rw-r--r-- | drivers/net/fs_enet/fs_enet-main.c | 207 | ||||
| -rw-r--r-- | drivers/net/fs_enet/fs_enet-mii.c | 505 | ||||
| -rw-r--r-- | drivers/net/fs_enet/fs_enet.h | 40 | ||||
| -rw-r--r-- | drivers/net/fs_enet/mac-fcc.c | 32 | ||||
| -rw-r--r-- | drivers/net/fs_enet/mac-fec.c | 142 | ||||
| -rw-r--r-- | drivers/net/fs_enet/mac-scc.c | 4 | ||||
| -rw-r--r-- | drivers/net/fs_enet/mii-bitbang.c | 448 | ||||
| -rw-r--r-- | drivers/net/fs_enet/mii-fec.c | 243 | ||||
| -rw-r--r-- | drivers/net/fs_enet/mii-fixed.c | 91 |
11 files changed, 711 insertions, 1049 deletions
diff --git a/drivers/net/fs_enet/Makefile b/drivers/net/fs_enet/Makefile index d6dd3f2fb43e..02d4dc18ba69 100644 --- a/drivers/net/fs_enet/Makefile +++ b/drivers/net/fs_enet/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | obj-$(CONFIG_FS_ENET) += fs_enet.o | 5 | obj-$(CONFIG_FS_ENET) += fs_enet.o |
| 6 | 6 | ||
| 7 | obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o | 7 | obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o mii-fec.o |
| 8 | obj-$(CONFIG_8260) += mac-fcc.o | 8 | obj-$(CONFIG_CPM2) += mac-fcc.o mii-bitbang.o |
| 9 | 9 | ||
| 10 | fs_enet-objs := fs_enet-main.o fs_enet-mii.o mii-bitbang.o mii-fixed.o | 10 | fs_enet-objs := fs_enet-main.o |
diff --git a/drivers/net/fs_enet/fec.h b/drivers/net/fs_enet/fec.h new file mode 100644 index 000000000000..e980527e2b99 --- /dev/null +++ b/drivers/net/fs_enet/fec.h | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | #ifndef FS_ENET_FEC_H | ||
| 2 | #define FS_ENET_FEC_H | ||
| 3 | |||
| 4 | /* CRC polynomium used by the FEC for the multicast group filtering */ | ||
| 5 | #define FEC_CRC_POLY 0x04C11DB7 | ||
| 6 | |||
| 7 | #define FEC_MAX_MULTICAST_ADDRS 64 | ||
| 8 | |||
| 9 | /* Interrupt events/masks. | ||
| 10 | */ | ||
| 11 | #define FEC_ENET_HBERR 0x80000000U /* Heartbeat error */ | ||
| 12 | #define FEC_ENET_BABR 0x40000000U /* Babbling receiver */ | ||
| 13 | #define FEC_ENET_BABT 0x20000000U /* Babbling transmitter */ | ||
| 14 | #define FEC_ENET_GRA 0x10000000U /* Graceful stop complete */ | ||
| 15 | #define FEC_ENET_TXF 0x08000000U /* Full frame transmitted */ | ||
| 16 | #define FEC_ENET_TXB 0x04000000U /* A buffer was transmitted */ | ||
| 17 | #define FEC_ENET_RXF 0x02000000U /* Full frame received */ | ||
| 18 | #define FEC_ENET_RXB 0x01000000U /* A buffer was received */ | ||
| 19 | #define FEC_ENET_MII 0x00800000U /* MII interrupt */ | ||
| 20 | #define FEC_ENET_EBERR 0x00400000U /* SDMA bus error */ | ||
| 21 | |||
| 22 | #define FEC_ECNTRL_PINMUX 0x00000004 | ||
| 23 | #define FEC_ECNTRL_ETHER_EN 0x00000002 | ||
| 24 | #define FEC_ECNTRL_RESET 0x00000001 | ||
| 25 | |||
| 26 | #define FEC_RCNTRL_BC_REJ 0x00000010 | ||
| 27 | #define FEC_RCNTRL_PROM 0x00000008 | ||
| 28 | #define FEC_RCNTRL_MII_MODE 0x00000004 | ||
| 29 | #define FEC_RCNTRL_DRT 0x00000002 | ||
| 30 | #define FEC_RCNTRL_LOOP 0x00000001 | ||
| 31 | |||
| 32 | #define FEC_TCNTRL_FDEN 0x00000004 | ||
| 33 | #define FEC_TCNTRL_HBC 0x00000002 | ||
| 34 | #define FEC_TCNTRL_GTS 0x00000001 | ||
| 35 | |||
| 36 | |||
| 37 | |||
| 38 | /* | ||
| 39 | * Delay to wait for FEC reset command to complete (in us) | ||
| 40 | */ | ||
| 41 | #define FEC_RESET_DELAY 50 | ||
| 42 | #endif | ||
diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index f6abff5846b3..df62506a1787 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/bitops.h> | 37 | #include <linux/bitops.h> |
| 38 | #include <linux/fs.h> | 38 | #include <linux/fs.h> |
| 39 | #include <linux/platform_device.h> | 39 | #include <linux/platform_device.h> |
| 40 | #include <linux/phy.h> | ||
| 40 | 41 | ||
| 41 | #include <linux/vmalloc.h> | 42 | #include <linux/vmalloc.h> |
| 42 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
| @@ -682,35 +683,6 @@ static void fs_free_irq(struct net_device *dev, int irq) | |||
| 682 | (*fep->ops->post_free_irq)(dev, irq); | 683 | (*fep->ops->post_free_irq)(dev, irq); |
| 683 | } | 684 | } |
| 684 | 685 | ||
| 685 | /**********************************************************************************/ | ||
| 686 | |||
| 687 | /* This interrupt occurs when the PHY detects a link change. */ | ||
| 688 | static irqreturn_t | ||
| 689 | fs_mii_link_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
| 690 | { | ||
| 691 | struct net_device *dev = dev_id; | ||
| 692 | struct fs_enet_private *fep; | ||
| 693 | const struct fs_platform_info *fpi; | ||
| 694 | |||
| 695 | fep = netdev_priv(dev); | ||
| 696 | fpi = fep->fpi; | ||
| 697 | |||
| 698 | /* | ||
| 699 | * Acknowledge the interrupt if possible. If we have not | ||
| 700 | * found the PHY yet we can't process or acknowledge the | ||
| 701 | * interrupt now. Instead we ignore this interrupt for now, | ||
| 702 | * which we can do since it is edge triggered. It will be | ||
| 703 | * acknowledged later by fs_enet_open(). | ||
| 704 | */ | ||
| 705 | if (!fep->phy) | ||
| 706 | return IRQ_NONE; | ||
| 707 | |||
| 708 | fs_mii_ack_int(dev); | ||
| 709 | fs_mii_link_status_change_check(dev, 0); | ||
| 710 | |||
| 711 | return IRQ_HANDLED; | ||
| 712 | } | ||
| 713 | |||
| 714 | static void fs_timeout(struct net_device *dev) | 686 | static void fs_timeout(struct net_device *dev) |
| 715 | { | 687 | { |
| 716 | struct fs_enet_private *fep = netdev_priv(dev); | 688 | struct fs_enet_private *fep = netdev_priv(dev); |
| @@ -722,10 +694,13 @@ static void fs_timeout(struct net_device *dev) | |||
| 722 | spin_lock_irqsave(&fep->lock, flags); | 694 | spin_lock_irqsave(&fep->lock, flags); |
| 723 | 695 | ||
| 724 | if (dev->flags & IFF_UP) { | 696 | if (dev->flags & IFF_UP) { |
| 697 | phy_stop(fep->phydev); | ||
| 725 | (*fep->ops->stop)(dev); | 698 | (*fep->ops->stop)(dev); |
| 726 | (*fep->ops->restart)(dev); | 699 | (*fep->ops->restart)(dev); |
| 700 | phy_start(fep->phydev); | ||
| 727 | } | 701 | } |
| 728 | 702 | ||
| 703 | phy_start(fep->phydev); | ||
| 729 | wake = fep->tx_free && !(CBDR_SC(fep->cur_tx) & BD_ENET_TX_READY); | 704 | wake = fep->tx_free && !(CBDR_SC(fep->cur_tx) & BD_ENET_TX_READY); |
| 730 | spin_unlock_irqrestore(&fep->lock, flags); | 705 | spin_unlock_irqrestore(&fep->lock, flags); |
| 731 | 706 | ||
| @@ -733,35 +708,112 @@ static void fs_timeout(struct net_device *dev) | |||
| 733 | netif_wake_queue(dev); | 708 | netif_wake_queue(dev); |
| 734 | } | 709 | } |
| 735 | 710 | ||
| 711 | /*----------------------------------------------------------------------------- | ||
| 712 | * generic link-change handler - should be sufficient for most cases | ||
| 713 | *-----------------------------------------------------------------------------*/ | ||
| 714 | static void generic_adjust_link(struct net_device *dev) | ||
| 715 | { | ||
| 716 | struct fs_enet_private *fep = netdev_priv(dev); | ||
| 717 | struct phy_device *phydev = fep->phydev; | ||
| 718 | int new_state = 0; | ||
| 719 | |||
| 720 | if (phydev->link) { | ||
| 721 | |||
| 722 | /* adjust to duplex mode */ | ||
| 723 | if (phydev->duplex != fep->oldduplex){ | ||
| 724 | new_state = 1; | ||
| 725 | fep->oldduplex = phydev->duplex; | ||
| 726 | } | ||
| 727 | |||
| 728 | if (phydev->speed != fep->oldspeed) { | ||
| 729 | new_state = 1; | ||
| 730 | fep->oldspeed = phydev->speed; | ||
| 731 | } | ||
| 732 | |||
| 733 | if (!fep->oldlink) { | ||
| 734 | new_state = 1; | ||
| 735 | fep->oldlink = 1; | ||
| 736 | netif_schedule(dev); | ||
| 737 | netif_carrier_on(dev); | ||
| 738 | netif_start_queue(dev); | ||
| 739 | } | ||
| 740 | |||
| 741 | if (new_state) | ||
| 742 | fep->ops->restart(dev); | ||
| 743 | |||
| 744 | } else if (fep->oldlink) { | ||
| 745 | new_state = 1; | ||
| 746 | fep->oldlink = 0; | ||
| 747 | fep->oldspeed = 0; | ||
| 748 | fep->oldduplex = -1; | ||
| 749 | netif_carrier_off(dev); | ||
| 750 | netif_stop_queue(dev); | ||
| 751 | } | ||
| 752 | |||
| 753 | if (new_state && netif_msg_link(fep)) | ||
| 754 | phy_print_status(phydev); | ||
| 755 | } | ||
| 756 | |||
