Skip to content
Snippets Groups Projects
mpc512x_fec.h 3.22 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * (C) Copyright 2003 - 2009
    
     * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
     *
     * Derived from the MPC8xx driver's header file.
     */
    
    #ifndef __MPC512X_FEC_H
    #define __MPC512X_FEC_H
    
    #include <common.h>
    
    /* Receive & Transmit Buffer Descriptor definitions */
    typedef struct BufferDescriptor {
    
    	u16 status;
    	u16 dataLength;
    	u32 dataPointer;
    
    } FEC_RBD;
    
    typedef struct {
    
    	u16 status;
    	u16 dataLength;
    	u32 dataPointer;
    
    } FEC_TBD;
    
    /* private structure */
    typedef enum {
    	SEVENWIRE,			/* 7-wire       */
    	MII10,				/* MII 10Mbps   */
    	MII100				/* MII 100Mbps  */
    } xceiver_type;
    
    /* BD Numer definitions */
    #define FEC_TBD_NUM		48	/* The user can adjust this value */
    #define FEC_RBD_NUM		32	/* The user can adjust this value */
    
    /* packet size limit */
    
    #define FEC_MAX_FRAME_LEN	1522	/* recommended default value */
    
    /* Buffer size must be evenly divisible by 16 */
    #define FEC_BUFFER_SIZE		((FEC_MAX_FRAME_LEN + 0x10) & (~0xf))
    
    	u8 frame[FEC_BUFFER_SIZE];
    
    } mpc512x_frame;
    
    typedef struct {
    	FEC_RBD rbd[FEC_RBD_NUM];			/* RBD ring */
    	FEC_TBD tbd[FEC_TBD_NUM];			/* TBD ring */
    	mpc512x_frame recv_frames[FEC_RBD_NUM];		/* receive buff */
    } mpc512x_buff_descs;
    
    typedef struct {
    
    	volatile fec512x_t *eth;
    
    	xceiver_type xcv_type;		/* transceiver type */
    	mpc512x_buff_descs *bdBase;	/* BD rings and recv buffer */
    
    	u16 rbdIndex;			/* next receive BD to read */
    	u16 tbdIndex;			/* next transmit BD to send */
    	u16 usedTbdIndex;		/* next transmit BD to clean */
    	u16 cleanTbdNum;		/* the number of available transmit BDs */
    
    } mpc512x_fec_priv;
    
    /* RBD bits definitions */
    #define FEC_RBD_EMPTY		0x8000	/* Buffer is empty */
    #define FEC_RBD_WRAP		0x2000	/* Last BD in ring */
    #define FEC_RBD_LAST		0x0800	/* Buffer is last in frame(useless) */
    #define FEC_RBD_MISS		0x0100	/* Miss bit for prom mode */
    #define FEC_RBD_BC		0x0080	/* The received frame is broadcast frame */
    #define FEC_RBD_MC		0x0040	/* The received frame is multicast frame */
    #define FEC_RBD_LG		0x0020	/* Frame length violation */
    #define FEC_RBD_NO		0x0010	/* Nonoctet align frame */
    #define FEC_RBD_SH		0x0008	/* Short frame */
    #define FEC_RBD_CR		0x0004	/* CRC error */
    #define FEC_RBD_OV		0x0002	/* Receive FIFO overrun */
    #define FEC_RBD_TR		0x0001	/* Frame is truncated */
    #define FEC_RBD_ERR		(FEC_RBD_LG | FEC_RBD_NO | FEC_RBD_CR | \
    				FEC_RBD_OV | FEC_RBD_TR)
    
    /* TBD bits definitions */
    #define FEC_TBD_READY		0x8000	/* Buffer is ready */
    #define FEC_TBD_WRAP		0x2000	/* Last BD in ring */
    #define FEC_TBD_LAST		0x0800	/* Buffer is last in frame */
    #define FEC_TBD_TC		0x0400	/* Transmit the CRC */
    #define FEC_TBD_ABC		0x0200	/* Append bad CRC */
    
    /* MII-related definitios */
    #define FEC_MII_DATA_ST		0x40000000	/* Start of frame delimiter */
    #define FEC_MII_DATA_OP_RD	0x20000000	/* Perform a read operation */
    #define FEC_MII_DATA_OP_WR	0x10000000	/* Perform a write operation */
    #define FEC_MII_DATA_PA_MSK	0x0f800000	/* PHY Address field mask */
    #define FEC_MII_DATA_RA_MSK	0x007c0000	/* PHY Register field mask */
    #define FEC_MII_DATA_TA		0x00020000	/* Turnaround */
    #define FEC_MII_DATA_DATAMSK	0x0000ffff	/* PHY data field */
    
    #define FEC_MII_DATA_RA_SHIFT	18	/* MII Register address bits */
    #define FEC_MII_DATA_PA_SHIFT	23	/* MII PHY address bits */
    
    #endif	/* __MPC512X_FEC_H */