mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-29 19:18:22 +00:00 
			
		
		
		
	get_prom function was used __attriute__ , but it is not enable. ax88796.o does not do link besides ne2000.o. When ld is carried out, get_prom function of ax88796.c is ignored. This problem is a thing by specifications of ld. I checked and test this patch on SuperH and MIPS. Signed-off-by: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
		
			
				
	
	
		
			309 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			309 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__
 | |
| 
 | |
| #define bool int
 | |
| #define false 0
 | |
| #define true 1
 | |
| 
 | |
| /*
 | |
|  * 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 */
 | |
| #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__ */
 |