306 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
Ported to U-Boot by Christian Pellegrin <chri@ascensit.com>
 | 
						|
 | 
						|
Based on sources from the Linux kernel (pcnet_cs.c, 8390.h) and
 | 
						|
eCOS(if_dp83902a.c, if_dp83902a.h). Both of these 2 wonderful world
 | 
						|
are GPL, so this is, of course, GPL.
 | 
						|
 | 
						|
 | 
						|
==========================================================================
 | 
						|
 | 
						|
	dev/dp83902a.h
 | 
						|
 | 
						|
	National Semiconductor DP83902a ethernet chip
 | 
						|
 | 
						|
==========================================================================
 | 
						|
####ECOSGPLCOPYRIGHTBEGIN####
 | 
						|
 -------------------------------------------
 | 
						|
 This file is part of eCos, the Embedded Configurable Operating System.
 | 
						|
 Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
 | 
						|
 | 
						|
 eCos 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 or (at your option) any later version.
 | 
						|
 | 
						|
 eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
 | 
						|
 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 | 
						|
 | 
						|
 As a special exception, if other files instantiate templates or use macros
 | 
						|
 or inline functions from this file, or you compile this file and link it
 | 
						|
 with other works to produce a work based on this file, this file does not
 | 
						|
 by itself cause the resulting work to be covered by the GNU General Public
 | 
						|
 License. However the source code for this file must still be made available
 | 
						|
 in accordance with section (3) of the GNU General Public License.
 | 
						|
 | 
						|
 This exception does not invalidate any other reasons why a work based on
 | 
						|
 this file might be covered by the GNU General Public License.
 | 
						|
 | 
						|
 Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
 | 
						|
 at http://sources.redhat.com/ecos/ecos-license/
 | 
						|
 -------------------------------------------
 | 
						|
####ECOSGPLCOPYRIGHTEND####
 | 
						|
####BSDCOPYRIGHTBEGIN####
 | 
						|
 | 
						|
 -------------------------------------------
 | 
						|
 | 
						|
 Portions of this software may have been derived from OpenBSD or other sources,
 | 
						|
 and are covered by the appropriate copyright disclaimers included herein.
 | 
						|
 | 
						|
 -------------------------------------------
 | 
						|
 | 
						|
####BSDCOPYRIGHTEND####
 | 
						|
==========================================================================
 | 
						|
#####DESCRIPTIONBEGIN####
 | 
						|
 | 
						|
 Author(s):	gthomas
 | 
						|
 Contributors:	gthomas, jskov
 | 
						|
 Date:		2001-06-13
 | 
						|
 Purpose:
 | 
						|
 Description:
 | 
						|
 | 
						|
####DESCRIPTIONEND####
 | 
						|
 | 
						|
==========================================================================
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
/*
 | 
						|
 ------------------------------------------------------------------------
 | 
						|
 Macros for accessing DP registers
 | 
						|
 These can be overridden by the platform header
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef __NE2000_BASE_H__
 | 
						|
#define __NE2000_BASE_H__
 | 
						|
 | 
						|
/*
 | 
						|
 * Debugging details
 | 
						|
 *
 | 
						|
 * Set to perms of:
 | 
						|
 * 0 disables all debug output
 | 
						|
 * 1 for process debug output
 | 
						|
 * 2 for added data IO output: get_reg, put_reg
 | 
						|
 * 4 for packet allocation/free output
 | 
						|
 * 8 for only startup status, so we can tell we're installed OK
 | 
						|
 */
 | 
						|
#if 0
 | 
						|
#define DEBUG 0xf
 | 
						|
#else
 | 
						|
#define DEBUG 0
 | 
						|
#endif
 | 
						|
 | 
						|
#if DEBUG & 1
 | 
						|
#define DEBUG_FUNCTION() do { printf("%s\n", __FUNCTION__); } while (0)
 | 
						|
#define DEBUG_LINE() do { printf("%d\n", __LINE__); } while (0)
 | 
						|
#define PRINTK(args...) printf(args)
 | 
						|
#else
 | 
						|
#define DEBUG_FUNCTION() do {} while(0)
 | 
						|
#define DEBUG_LINE() do {} while(0)
 | 
						|
#define PRINTK(args...)
 | 
						|
#endif
 | 
						|
 | 
						|
/* timeout for tx/rx in s */
 | 
						|
#include <linux/delay.h>
 | 
						|
#define TOUT 5
 | 
						|
/* Ether MAC address size */
 | 
						|
#define ETHER_ADDR_LEN 6
 | 
						|
 | 
						|
 | 
						|
#define CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA 1
 | 
						|
#define CYGACC_CALL_IF_DELAY_US(X) udelay(X)
 | 
						|
 | 
						|
/* H/W infomation struct */
 | 
						|
typedef struct hw_info_t {
 | 
						|
	u32 offset;
 | 
						|
	u8 a0, a1, a2;
 | 
						|
	u32 flags;
 | 
						|
} hw_info_t;
 | 
						|
 | 
						|
typedef struct dp83902a_priv_data {
 | 
						|
	u8* base;
 | 
						|
	u8* data;
 | 
						|
	u8* reset;
 | 
						|
	int tx_next;		/* First free Tx page */
 | 
						|
	int tx_int;		/* Expecting interrupt from this buffer */
 | 
						|
	int rx_next;		/* First free Rx page */
 | 
						|
	int tx1, tx2;		/* Page numbers for Tx buffers */
 | 
						|
	u32 tx1_key, tx2_key;	/* Used to ack when packet sent */
 | 
						|
	int tx1_len, tx2_len;
 | 
						|
	bool tx_started, running, hardwired_esa;
 | 
						|
	u8 esa[6];
 | 
						|
	void* plf_priv;
 | 
						|
 | 
						|
	/* Buffer allocation */
 | 
						|
	int tx_buf1, tx_buf2;
 | 
						|
	int rx_buf_start, rx_buf_end;
 | 
						|
} dp83902a_priv_data_t;
 | 
						|
 | 
						|
/* ------------------------------------------------------------------------ */
 | 
						|
/* Register offsets */
 | 
						|
 | 
						|
#define DP_CR		0x00
 | 
						|
#define DP_CLDA0	0x01
 | 
						|
#define DP_PSTART	0x01	/* write */
 | 
						|
#define DP_CLDA1	0x02
 | 
						|
#define DP_PSTOP	0x02	/* write */
 | 
						|
#define DP_BNDRY	0x03
 | 
						|
#define DP_TSR		0x04
 | 
						|
#define DP_TPSR		0x04	/* write */
 | 
						|
#define DP_NCR		0x05
 | 
						|
#define DP_TBCL		0x05	/* write */
 | 
						|
#define DP_FIFO		0x06
 | 
						|
#define DP_TBCH		0x06	/* write */
 | 
						|
#define DP_ISR		0x07
 | 
						|
#define DP_CRDA0	0x08
 | 
						|
#define DP_RSAL		0x08	/* write */
 | 
						|
#define DP_CRDA1	0x09
 | 
						|
#define DP_RSAH		0x09	/* write */
 | 
						|
#define DP_RBCL		0x0a	/* write */
 | 
						|
#define DP_RBCH		0x0b	/* write */
 | 
						|
#define DP_RSR		0x0c
 | 
						|
#define DP_RCR		0x0c	/* write */
 | 
						|
#define DP_FER		0x0d
 | 
						|
#define DP_TCR		0x0d	/* write */
 | 
						|
#define DP_CER		0x0e
 | 
						|
#define DP_DCR		0x0e	/* write */
 | 
						|
#define DP_MISSED	0x0f
 | 
						|
#define DP_IMR		0x0f	/* write */
 | 
						|
#define DP_DATAPORT	0x10	/* "eprom" data port */
 | 
						|
 | 
						|
#define DP_P1_CR	0x00
 | 
						|
#define DP_P1_PAR0	0x01
 | 
						|
#define DP_P1_PAR1	0x02
 | 
						|
#define DP_P1_PAR2	0x03
 | 
						|
#define DP_P1_PAR3	0x04
 | 
						|
#define DP_P1_PAR4	0x05
 | 
						|
#define DP_P1_PAR5	0x06
 | 
						|
#define DP_P1_CURP	0x07
 | 
						|
#define DP_P1_MAR0	0x08
 | 
						|
#define DP_P1_MAR1	0x09
 | 
						|
#define DP_P1_MAR2	0x0a
 | 
						|
#define DP_P1_MAR3	0x0b
 | 
						|
#define DP_P1_MAR4	0x0c
 | 
						|
#define DP_P1_MAR5	0x0d
 | 
						|
#define DP_P1_MAR6	0x0e
 | 
						|
#define DP_P1_MAR7	0x0f
 | 
						|
 | 
						|
#define DP_P2_CR	0x00
 | 
						|
#define DP_P2_PSTART	0x01
 | 
						|
#define DP_P2_CLDA0	0x01	/* write */
 | 
						|
#define DP_P2_PSTOP	0x02
 | 
						|
#define DP_P2_CLDA1	0x02	/* write */
 | 
						|
#define DP_P2_RNPP	0x03
 | 
						|
#define DP_P2_TPSR	0x04
 | 
						|
#define DP_P2_LNPP	0x05
 | 
						|
#define DP_P2_ACH	0x06
 | 
						|
#define DP_P2_ACL	0x07
 | 
						|
#define DP_P2_RCR	0x0c
 | 
						|
#define DP_P2_TCR	0x0d
 | 
						|
#define DP_P2_DCR	0x0e
 | 
						|
#define DP_P2_IMR	0x0f
 | 
						|
 | 
						|
/* Command register - common to all pages */
 | 
						|
 | 
						|
#define DP_CR_STOP	0x01	/* Stop: software reset */
 | 
						|
#define DP_CR_START	0x02	/* Start: initialize device */
 | 
						|
#define DP_CR_TXPKT	0x04	/* Transmit packet */
 | 
						|
#define DP_CR_RDMA	0x08	/* Read DMA (recv data from device) */
 | 
						|
#define DP_CR_WDMA	0x10	/* Write DMA (send data to device) */
 | 
						|
#define DP_CR_SEND	0x18	/* Send packet */
 | 
						|
#define DP_CR_NODMA	0x20	/* Remote (or no) DMA */
 | 
						|
#define DP_CR_PAGE0	0x00	/* Page select */
 | 
						|
#define DP_CR_PAGE1	0x40
 | 
						|
#define DP_CR_PAGE2	0x80
 | 
						|
#define DP_CR_PAGEMSK	0x3F	/* Used to mask out page bits */
 | 
						|
 | 
						|
/* Data configuration register */
 | 
						|
 | 
						|
#define DP_DCR_WTS	0x01	/* 1=16 bit word transfers */
 | 
						|
#define DP_DCR_BOS	0x02	/* 1=Little Endian */
 | 
						|
#define DP_DCR_LAS	0x04	/* 1=Single 32 bit DMA mode */
 | 
						|
#define DP_DCR_LS	0x08	/* 1=normal mode, 0=loopback */
 | 
						|
#define DP_DCR_ARM	0x10	/* 0=no send command (program I/O) */
 | 
						|
#define DP_DCR_FIFO_1	0x00	/* FIFO threshold */
 | 
						|
#define DP_DCR_FIFO_2	0x20
 | 
						|
#define DP_DCR_FIFO_4	0x40
 | 
						|
#define DP_DCR_FIFO_6	0x60
 | 
						|
 | 
						|
#define DP_DCR_INIT	(DP_DCR_LS|DP_DCR_FIFO_4)
 | 
						|
 | 
						|
/* Interrupt status register */
 | 
						|
 | 
						|
#define DP_ISR_RxP	0x01	/* Packet received */
 | 
						|
#define DP_ISR_TxP	0x02	/* Packet transmitted */
 | 
						|
#define DP_ISR_RxE	0x04	/* Receive error */
 | 
						|
#define DP_ISR_TxE	0x08	/* Transmit error */
 | 
						|
#define DP_ISR_OFLW	0x10	/* Receive overflow */
 | 
						|
#define DP_ISR_CNT	0x20	/* Tally counters need emptying */
 | 
						|
#define DP_ISR_RDC	0x40	/* Remote DMA complete */
 | 
						|
#define DP_ISR_RESET	0x80	/* Device has reset (shutdown, error) */
 | 
						|
 | 
						|
/* Interrupt mask register */
 | 
						|
 | 
						|
#define DP_IMR_RxP	0x01	/* Packet received */
 | 
						|
#define DP_IMR_TxP	0x02	/* Packet transmitted */
 | 
						|
#define DP_IMR_RxE	0x04	/* Receive error */
 | 
						|
#define DP_IMR_TxE	0x08	/* Transmit error */
 | 
						|
#define DP_IMR_OFLW	0x10	/* Receive overflow */
 | 
						|
#define DP_IMR_CNT	0x20	/* Tall counters need emptying */
 | 
						|
#define DP_IMR_RDC	0x40	/* Remote DMA complete */
 | 
						|
 | 
						|
#define DP_IMR_All	0x3F	/* Everything but remote DMA */
 | 
						|
 | 
						|
/* Receiver control register */
 | 
						|
 | 
						|
#define DP_RCR_SEP	0x01	/* Save bad(error) packets */
 | 
						|
#define DP_RCR_AR	0x02	/* Accept runt packets */
 | 
						|
#define DP_RCR_AB	0x04	/* Accept broadcast packets */
 | 
						|
#define DP_RCR_AM	0x08	/* Accept multicast packets */
 | 
						|
#define DP_RCR_PROM	0x10	/* Promiscuous mode */
 | 
						|
#define DP_RCR_MON	0x20	/* Monitor mode - 1=accept no packets */
 | 
						|
 | 
						|
/* Receiver status register */
 | 
						|
 | 
						|
#define DP_RSR_RxP	0x01	/* Packet received */
 | 
						|
#define DP_RSR_CRC	0x02	/* CRC error */
 | 
						|
#define DP_RSR_FRAME	0x04	/* Framing error */
 | 
						|
#define DP_RSR_FO	0x08	/* FIFO overrun */
 | 
						|
#define DP_RSR_MISS	0x10	/* Missed packet */
 | 
						|
#define DP_RSR_PHY	0x20	/* 0=pad match, 1=mad match */
 | 
						|
#define DP_RSR_DIS	0x40	/* Receiver disabled */
 | 
						|
#define DP_RSR_DFR	0x80	/* Receiver processing deferred */
 | 
						|
 | 
						|
/* Transmitter control register */
 | 
						|
 | 
						|
#define DP_TCR_NOCRC	0x01	/* 1=inhibit CRC */
 | 
						|
#define DP_TCR_NORMAL	0x00	/* Normal transmitter operation */
 | 
						|
#define DP_TCR_LOCAL	0x02	/* Internal NIC loopback */
 | 
						|
#define DP_TCR_INLOOP	0x04	/* Full internal loopback */
 | 
						|
#define DP_TCR_OUTLOOP	0x08	/* External loopback */
 | 
						|
#define DP_TCR_ATD	0x10	/* Auto transmit disable */
 | 
						|
#define DP_TCR_OFFSET	0x20	/* Collision offset adjust */
 | 
						|
 | 
						|
/* Transmit status register */
 | 
						|
 | 
						|
#define DP_TSR_TxP	0x01	/* Packet transmitted */
 | 
						|
#define DP_TSR_COL	0x04	/* Collision (at least one) */
 | 
						|
#define DP_TSR_ABT	0x08	/* Aborted because of too many collisions */
 | 
						|
#define DP_TSR_CRS	0x10	/* Lost carrier */
 | 
						|
#define DP_TSR_FU	0x20	/* FIFO underrun */
 | 
						|
#define DP_TSR_CDH	0x40	/* Collision Detect Heartbeat */
 | 
						|
#define DP_TSR_OWC	0x80	/* Collision outside normal window */
 | 
						|
 | 
						|
#define IEEE_8023_MAX_FRAME	1518	/* Largest possible ethernet frame */
 | 
						|
#define IEEE_8023_MIN_FRAME	64	/* Smallest possible ethernet frame */
 | 
						|
 | 
						|
/* Functions */
 | 
						|
int get_prom(u8* mac_addr, u8* base_addr);
 | 
						|
 | 
						|
#endif /* __NE2000_BASE_H__ */
 |