From: Kumar Gala <ga...@kernel.crashing.org>

Signed-off-by: Kumar Gala <ga...@kernel.crashing.org>
Signed-off-by: Mingkai Hu <mingkai...@freescale.com>
---
 arch/powerpc/include/asm/fsl_enet.h |   12 ++
 drivers/net/fm/dtsec.c              |  168 +++++++++++++++++++++++
 drivers/net/fm/dtsec.h              |  251 +++++++++++++++++++++++++++++++++++
 3 files changed, 431 insertions(+), 0 deletions(-)
 create mode 100644 drivers/net/fm/dtsec.c
 create mode 100644 drivers/net/fm/dtsec.h

diff --git a/arch/powerpc/include/asm/fsl_enet.h 
b/arch/powerpc/include/asm/fsl_enet.h
index 9475249..f94482d 100644
--- a/arch/powerpc/include/asm/fsl_enet.h
+++ b/arch/powerpc/include/asm/fsl_enet.h
@@ -38,6 +38,18 @@ typedef struct tsec_mii_mng {
        u32 ifstat;             /* Interface Status Register */
 } __attribute__ ((packed))tsec_mii_t;
 
+struct fsl_enet_mac {
+       void *base; /* MAC controller registers base address */
+       void *phyregs;
+       int max_rx_len;
+       void (*init_mac)(struct fsl_enet_mac *mac);
+       void (*enable_mac)(struct fsl_enet_mac *mac);
+       void (*disable_mac)(struct fsl_enet_mac *mac);
+       void (*set_mac_addr)(struct fsl_enet_mac *mac, u8 *mac_addr);
+       void (*set_if_mode)(struct fsl_enet_mac *mac, enum fsl_phy_enet_if type,
+                               int speed);
+};
+
 int fdt_fixup_phy_connection(void *blob, int offset, enum fsl_phy_enet_if 
phyc);
 
 #endif /* __ASM_PPC_FSL_ENET_H */
diff --git a/drivers/net/fm/dtsec.c b/drivers/net/fm/dtsec.c
new file mode 100644
index 0000000..7c28217
--- /dev/null
+++ b/drivers/net/fm/dtsec.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2009-2010 Freescale Semiconductor, Inc.
+ *     Dave Liu <dave...@freescale.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/types.h>
+#include <asm/io.h>
+#include <asm/fsl_enet.h>
+
+#include "dtsec.h"
+#include "../fsl_phy.h"
+
+static void dtsec_init_mac(struct fsl_enet_mac *mac)
+{
+       struct dtsec *regs = mac->base;
+
+       /* soft reset */
+       out_be32(&regs->maccfg1, MACCFG1_SOFT_RST);
+       udelay(1000);
+
+       /* clear soft reset, Rx/Tx MAC disable */
+       out_be32(&regs->maccfg1, 0);
+
+       /* graceful stop rx */
+       out_be32(&regs->rctrl, RCTRL_INIT);
+       udelay(1000);
+
+       /* graceful stop tx */
+       out_be32(&regs->tctrl, TCTRL_INIT);
+       udelay(1000);
+
+       /* disable all interrupts */
+       out_be32(&regs->imask, IMASK_MASK_ALL);
+
+       /* clear all events */
+       out_be32(&regs->ievent, IEVENT_CLEAR_ALL);
+
+       /* set the max Rx length */
+       out_be32(&regs->maxfrm, mac->max_rx_len);
+
+       /* set the ecntrl to reset value */
+       out_be32(&regs->ecntrl, ECNTRL_DEFAULT);
+
+       /* Rx length check, no strip CRC for Rx,
+        * pad and append CRC for Tx, full duplex
+        */
+       out_be32(&regs->maccfg2, MACCFG2_INIT);
+}
+
+static void dtsec_enable_mac(struct fsl_enet_mac *mac)
+{
+       struct dtsec *regs = mac->base;
+
+       /* enable Rx/Tx MAC */
+       setbits_be32(&regs->maccfg1, MACCFG1_RXTX_EN);
+
+       /* clear the graceful Rx stop */
+       clrbits_be32(&regs->rctrl, RCTRL_GRS);
+
+       /* clear the graceful Tx stop */
+       clrbits_be32(&regs->tctrl, TCTRL_GTS);
+}
+
+static void dtsec_disable_mac(struct fsl_enet_mac *mac)
+{
+       struct dtsec *regs = mac->base;
+
+       /* graceful Rx stop */
+       setbits_be32(&regs->rctrl, RCTRL_GRS);
+
+       /* graceful Tx stop */
+       setbits_be32(&regs->tctrl, TCTRL_GTS);
+
+       /* disable Rx/Tx MAC */
+       clrbits_be32(&regs->maccfg1, MACCFG1_RXTX_EN);
+}
+
+static void dtsec_set_mac_addr(struct fsl_enet_mac *mac, u8 *mac_addr)
+{
+       struct dtsec *regs = mac->base;
+       u32 mac_addr1, mac_addr2;
+
+       /* if a station address of 0x12345678ABCD, perform a write to
+          MACSTNADDR1 of 0xCDAB7856,
+          MACSTNADDR2 of 0x34120000 */
+
+       mac_addr1 = (mac_addr[5] << 24) | (mac_addr[4] << 16) | \
+                       (mac_addr[3] << 8)  | (mac_addr[2]);
+       out_be32(&regs->macstnaddr1, mac_addr1);
+
+       mac_addr2 = ((mac_addr[1] << 24) | (mac_addr[0] << 16)) & 0xffff0000;
+       out_be32(&regs->macstnaddr2, mac_addr2);
+}
+
+static void dtsec_set_interface_mode(struct fsl_enet_mac *mac, enum 
fsl_phy_enet_if type,
+                                       int speed)
+{
+       struct dtsec *regs = mac->base;
+       u32 ecntrl, maccfg2;
+
+       /* clear all bits relative with interface mode */
+       ecntrl = in_be32(&regs->ecntrl);
+       ecntrl &= ~(ECNTRL_TBIM | ECNTRL_GMIIM | ECNTRL_RPM |
+                                 ECNTRL_R100M | ECNTRL_SGMIIM);
+
+       maccfg2 = in_be32(&regs->maccfg2);
+       maccfg2 &= ~MACCFG2_IF_MODE_MASK;
+
+       if (speed == SPEED_1000)
+               maccfg2 |= MACCFG2_IF_MODE_BYTE;
+       else
+               maccfg2 |= MACCFG2_IF_MODE_NIBBLE;
+
+       /* set interface mode */
+       switch (type) {
+       case GMII:
+               ecntrl |= ECNTRL_GMIIM;
+               break;
+       case RGMII:
+               ecntrl |= (ECNTRL_GMIIM | ECNTRL_RPM);
+               if (speed == SPEED_100)
+                       ecntrl |= ECNTRL_R100M;
+               break;
+       case RMII:
+               if (speed == SPEED_100)
+                       ecntrl |= ECNTRL_R100M;
+               break;
+       case SGMII:
+               ecntrl |= (ECNTRL_SGMIIM | ECNTRL_TBIM);
+               if (speed == SPEED_100)
+                       ecntrl |= ECNTRL_R100M;
+               break;
+       default:
+               break;
+       }
+
+       out_be32(&regs->ecntrl, ecntrl);
+       out_be32(&regs->maccfg2, maccfg2);
+}
+
+void init_dtsec(struct fsl_enet_mac *mac, void *base,
+               void *phyregs, int max_rx_len)
+{
+       mac->base = base;
+       mac->phyregs = phyregs;
+       mac->max_rx_len = max_rx_len;
+       mac->init_mac = dtsec_init_mac;
+       mac->enable_mac = dtsec_enable_mac;
+       mac->disable_mac = dtsec_disable_mac;
+       mac->set_mac_addr = dtsec_set_mac_addr;
+       mac->set_if_mode = dtsec_set_interface_mode;
+}
diff --git a/drivers/net/fm/dtsec.h b/drivers/net/fm/dtsec.h
new file mode 100644
index 0000000..64339e0
--- /dev/null
+++ b/drivers/net/fm/dtsec.h
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2009-2010 Freescale Semiconductor, Inc.
+ *     Dave Liu <dave...@freescale.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __DTSEC_H__
+#define __DTSEC_H__
+
+#include <asm/types.h>
+#include <asm/fsl_enet.h>
+
+/* TBI register addresses */
+#define TBI_CR                 0x00
+#define TBI_SR                 0x01
+#define TBI_ANA                        0x04
+#define TBI_ANLPBPA            0x05
+#define TBI_ANEX               0x06
+#define TBI_TBICON             0x11
+
+/* TBI MDIO register bit fields*/
+#define TBICON_CLK_SELECT      0x0020
+#define TBIANA_ASYMMETRIC_PAUSE 0x0100
+#define TBIANA_SYMMETRIC_PAUSE  0x0080
+#define TBIANA_HALF_DUPLEX     0x0040
+#define TBIANA_FULL_DUPLEX     0x0020
+#define TBICR_PHY_RESET                0x8000
+#define TBICR_ANEG_ENABLE      0x1000
+#define TBICR_RESTART_ANEG     0x0200
+#define TBICR_FULL_DUPLEX      0x0100
+#define TBICR_SPEED1_SET       0x0040
+
+/* IEVENT - interrupt events register */
+#define IEVENT_BABR    0x80000000 /* Babbling receive error */
+#define IEVENT_RXC     0x40000000 /* pause control frame received */
+#define IEVENT_MSRO    0x04000000 /* MIB counter overflow */
+#define IEVENT_GTSC    0x02000000 /* Graceful transmit stop complete */
+#define IEVENT_BABT    0x01000000 /* Babbling transmit error */
+#define IEVENT_TXC     0x00800000 /* control frame transmitted */
+#define IEVENT_TXE     0x00400000 /* Transmit channel error */
+#define IEVENT_LC      0x00040000 /* Late collision occurred */
+#define IEVENT_CRL     0x00020000 /* Collision retry exceed limit */
+#define IEVENT_XFUN    0x00010000 /* Transmit FIFO underrun */
+#define IEVENT_ABRT    0x00008000 /* Transmit packet abort */
+#define IEVENT_MMRD    0x00000400 /* MII management read complete */
+#define IEVENT_MMWR    0x00000200 /* MII management write complete */
+#define IEVENT_GRSC    0x00000100 /* Graceful stop complete */
+#define IEVENT_TDPE    0x00000002 /* Internal data parity error on Tx */
+#define IEVENT_RDPE    0x00000001 /* Internal data parity error on Rx */
+
+#define IEVENT_CLEAR_ALL       0xffffffff
+
+/* IMASK - interrupt mask register */
+#define IMASK_BREN     0x80000000 /* Babbling receive enable */
+#define IMASK_RXCEN    0x40000000 /* receive control enable */
+#define IMASK_MSROEN   0x04000000 /* MIB counter overflow enable */
+#define IMASK_GTSCEN   0x02000000 /* Graceful Tx stop complete enable */
+#define IMASK_BTEN     0x01000000 /* Babbling transmit error enable */
+#define IMASK_TXCEN    0x00800000 /* control frame transmitted enable */
+#define IMASK_TXEEN    0x00400000 /* Transmit channel error enable */
+#define IMASK_LCEN     0x00040000 /* Late collision interrupt enable */
+#define IMASK_CRLEN    0x00020000 /* Collision retry exceed limit */
+#define IMASK_XFUNEN   0x00010000 /* Transmit FIFO underrun enable */
+#define IMASK_ABRTEN   0x00008000 /* Transmit packet abort enable */
+#define IMASK_MMRDEN   0x00000400 /* MII management read complete enable */
+#define IMASK_MMWREN   0x00000200 /* MII management write complete enable */
+#define IMASK_GRSCEN   0x00000100 /* Graceful stop complete interrupt enable */
+#define IMASK_TDPEEN   0x00000002 /* Internal data parity error on Tx enable */
+#define IMASK_RDPEEN   0x00000001 /* Internal data parity error on Rx enable */
+
+#define IMASK_MASK_ALL 0x00000000
+
+/* ECNTRL - ethernet control register */
+#define ECNTRL_CFG_RO  0x80000000 /* GMIIM, RPM, R100M, SGMIIM bits are 
read-only */
+#define ECNTRL_CLRCNT  0x00004000 /* clear all statistics */
+#define ECNTRL_AUTOZ   0x00002000 /* auto zero MIB counter */
+#define ECNTRL_STEN    0x00001000 /* enable internal counters to update */
+#define ECNTRL_GMIIM   0x00000040 /* 1- GMII or RGMII interface mode */
+#define ECNTRL_RPM     0x00000010 /* 1- RGMII reduced-pin mode */
+#define ECNTRL_R100M   0x00000008 /* 1- RGMII 100 Mbps, SGMII 100 Mbps
+                                     0- RGMII 10 Mbps, SGMII 10 Mbps */
+#define ECNTRL_SGMIIM  0x00000002 /* 1- SGMII interface mode */
+#define ECNTRL_TBIM    0x00000020 /* 1- TBI Interface mode (for SGMII) */
+
+#define ECNTRL_DEFAULT 0x0000002a
+
+/* TCTRL - Transmit control register */
+#define TCTRL_THDF     0x00000800 /* Transmit half-duplex flow control */
+#define TCTRL_TTSE     0x00000040 /* Transmit time-stamp enable */
+#define TCTRL_GTS      0x00000020 /* Graceful transmit stop */
+#define TCTRL_RFC_PAUSE        0x00000010 /* Receive flow control pause frame 
*/
+
+#define TCTRL_INIT     TCTRL_GTS
+
+/* RCTRL - Receive control register */
+#define RCTRL_PAL_MASK 0x001f0000 /* packet alignment padding length */
+#define RCTRL_PAL_SHIFT        16
+#define RCTRL_CFA      0x00008000 /* control frame accept enable */
+#define RCTRL_GHTX     0x00000800 /* group address hash table extend */
+#define RCTRL_RTSE     0x00000040 /* receive 1588 time-stamp enable */
+#define RCTRL_GRS      0x00000020 /* graceful receive stop */
+#define RCTRL_BC_REJ   0x00000010 /* broadcast frame reject */
+#define RCTRL_BC_MPROM 0x00000008 /* all multicast/broadcast frames received */
+#define RCTRL_RSF      0x00000004 /* receive short frame(17~63 bytes) enable */
+#define RCTRL_EMEN     0x00000002 /* Exact match MAC address enable */
+#define RCTRL_UPROM    0x00000001 /* all unicast frame received */
+
+#define RCTRL_INIT     (RCTRL_GRS | RCTRL_UPROM)
+
+/* MACCFG1 - MAC configuration 1 register */
+#define MACCFG1_SOFT_RST       0x80000000 /* place the MAC in reset */
+#define MACCFG1_RST_RXMAC      0x00080000 /* reset receive MAC control block */
+#define MACCFG1_RST_TXMAC      0x00040000 /* reet transmit MAC control block */
+#define MACCFG1_RST_RXFUN      0x00020000 /* reset receive function block */
+#define MACCFG1_RST_TXFUN      0x00010000 /* reset transmit function block */
+#define MACCFG1_LOOPBACK       0x00000100 /* MAC loopback */
+#define MACCFG1_RX_FLOW                0x00000020 /* Receive flow */
+#define MACCFG1_TX_FLOW                0x00000010 /* Transmit flow */
+#define MACCFG1_SYNC_RXEN      0x00000008 /* Frame reception enabled */
+#define MACCFG1_RX_EN          0x00000004 /* Rx enable */
+#define MACCFG1_SYNC_TXEN      0x00000002 /* Frame transmission is enabled */
+#define MACCFG1_TX_EN          0x00000001 /* Tx enable */
+
+#define MACCFG1_RXTX_EN                (MACCFG1_RX_EN | MACCFG1_TX_EN)
+#define MACCFG1_INIT           MACCFG1_SOFT_RST
+
+/* MACCFG2 - MAC configuration 2 register */
+#define MACCFG2_PRE_LEN                0x0000f000 /* preamble length */
+#define MACCFG2_IF_MODE_MASK   0x00000300 /* 01 - Nibble mode, MII, 10/100 
Mbps MII/RMII
+                                             10 - Byte mode, GMII/TBI, 1000 
GMII/TBI */
+#define MACCFG2_IF_MODE_NIBBLE 0x00000100
+#define MACCFG2_IF_MODE_BYTE   0x00000200
+#define MACCFG2_PRE_RX_EN      0x00000080 /* receive preamble enable */
+#define MACCFG2_PRE_TX_EN      0x00000040 /* enable user defined preamble for 
Tx */
+#define MACCFG2_HUGE_FRAME     0x00000020 /* huge frame enable (eq/gt maximum 
frame length) */
+#define MACCFG2_LEN_CHECK      0x00000010 /* MAC check frame's length field on 
Rx */
+#define MACCFG2_MAG_EN         0x00000008 /* magic packet enable */
+#define MACCFG2_PAD_CRC                0x00000004 /* pad and append CRC for 
transmitted short frame */
+#define MACCFG2_CRC_EN         0x00000002 /* MAC appends a CRC on all frames */
+#define MACCFG2_FULL_DUPLEX    0x00000001 /* The MAC operates in full deplex 
mode */
+
+#define MACCFG2_DEFAULT                0x00007000
+#define MACCFG2_INIT           (MACCFG2_DEFAULT | MACCFG2_LEN_CHECK | 
MACCFG2_PAD_CRC \
+                               | MACCFG2_FULL_DUPLEX | MACCFG2_IF_MODE_NIBBLE)
+
+struct dtsec {
+       u32     tsec_id;        /* controller ID and version */
+       u32     tsec_id2;       /* controller ID and configuration */
+       u32     ievent;         /* interrupt event */
+       u32     imask;          /* interrupt mask */
+       u32     res0;
+       u32     ecntrl;         /* ethernet control and configuration */
+       u32     ptv;            /* pause time value */
+       u32     tbipa;          /* TBI PHY address */
+       u32     res1[8];
+       u32     tctrl;          /* Transmit control register */
+       u32     res2[3];
+       u32     rctrl;          /* Receive control register */
+       u32     res3[11];
+       u32     igaddr[8];      /* Individual group address */
+       u32     gaddr[8];       /* group address */
+       u32     res4[16];
+       u32     maccfg1;        /* MAC configuration register 1 */
+       u32     maccfg2;        /* MAC configuration register 2 */
+       u32     ipgifg;         /* inter-packet/inter-frame gap */
+       u32     hafdup;         /* half-duplex control */
+       u32     maxfrm;         /* Maximum frame size */
+       u32     res5[3];
+       u32     miimcfg;        /* MII management configuration */
+       u32     miimcom;        /* MII management command */
+       u32     miimadd;        /* MII management address */
+       u32     miimcon;        /* MII management control */
+       u32     miimstat;       /* MII management status */
+       u32     miimind;        /* MII management indicator */
+       u32     res6;
+       u32     ifstat;         /* Interface status */
+       u32     macstnaddr1;    /* MAC station address 1 */
+       u32     macstnaddr2;    /* MAC station address 2 */
+       u32     res7[46];
+       /* transmit and receive counter */
+       u32     tr64;           /* Tx and Rx 64 bytes frame */
+       u32     tr127;          /* Tx and Rx 65 to 127 bytes frame */
+       u32     tr255;          /* Tx and Rx 128 to 255 bytes frame */
+       u32     tr511;          /* Tx and Rx 256 to 511 bytes frame */
+       u32     tr1k;           /* Tx and Rx 512 to 1023 bytes frame */
+       u32     trmax;          /* Tx and Rx 1024 to 1518 bytes frame */
+       u32     trmgv;          /* Tx and Rx 1519 to 1522 good VLAN frame */
+       /* receive counters */
+       u32     rbyt;           /* Receive byte counter */
+       u32     rpkt;           /* Receive packet counter */
+       u32     rfcs;           /* Receive FCS error */
+       u32     rmca;           /* Receive multicast packet */
+       u32     rbca;           /* Receive broadcast packet */
+       u32     rxcf;           /* Receive control frame */
+       u32     rxpf;           /* Receive pause frame */
+       u32     rxuo;           /* Receive unknown OP code */
+       u32     raln;           /* Receive alignment error */
+       u32     rflr;           /* Receive frame length error */
+       u32     rcde;           /* Receive code error */
+       u32     rcse;           /* Receive carrier sense error */
+       u32     rund;           /* Receive undersize packet */
+       u32     rovr;           /* Receive oversize packet */
+       u32     rfrg;           /* Receive fragments counter */
+       u32     rjbr;           /* Receive jabber counter */
+       u32     rdrp;           /* Receive drop counter */
+       /* transmit counters */
+       u32     tbyt;           /* Transmit byte counter */
+       u32     tpkt;           /* Transmit packet */
+       u32     tmca;           /* Transmit multicast packet */
+       u32     tbca;           /* Transmit broadcast packet */
+       u32     txpf;           /* Transmit pause control frame */
+       u32     tdfr;           /* Transmit deferral packet */
+       u32     tedf;           /* Transmit excessive deferral pkt */
+       u32     tscl;           /* Transmit single collision pkt */
+       u32     tmcl;           /* Transmit multiple collision pkt */
+       u32     tlcl;           /* Transmit late collision pkt */
+       u32     txcl;           /* Transmit excessive collision */
+       u32     tncl;           /* Transmit total collision */
+       u32     res8;
+       u32     tdrp;           /* Transmit drop frame */
+       u32     tjbr;           /* Transmit jabber frame */
+       u32     tfcs;           /* Transmit FCS error */
+       u32     txcf;           /* Transmit control frame */
+       u32     tovr;           /* Transmit oversize frame */
+       u32     tund;           /* Transmit undersize frame */
+       u32     tfrg;           /* Transmit fragments frame */
+       /* counter controls */
+       u32     car1;           /* carry register 1 */
+       u32     car2;           /* carry register 2 */
+       u32     cam1;           /* carry register 1 mask */
+       u32     cam2;           /* carry register 2 mask */
+       u32     res9[80];
+} __attribute__ ((packed));
+
+void init_dtsec(struct fsl_enet_mac *mac, void *base, void *phyregs, int 
max_rx_len);
+
+#endif
-- 
1.6.4


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to