xref: /rk3399_rockchip-uboot/drivers/net/ne2000.h (revision e710185aae90c64d39c2d453e40e58ceefe4f250)
12439e4bfSJean-Christophe PLAGNIOL-VILLARD /*
22439e4bfSJean-Christophe PLAGNIOL-VILLARD Ported to U-Boot  by Christian Pellegrin <chri@ascensit.com>
32439e4bfSJean-Christophe PLAGNIOL-VILLARD 
42439e4bfSJean-Christophe PLAGNIOL-VILLARD Based on sources from the Linux kernel (pcnet_cs.c, 8390.h) and
52439e4bfSJean-Christophe PLAGNIOL-VILLARD eCOS(if_dp83902a.c, if_dp83902a.h). Both of these 2 wonderful world
62439e4bfSJean-Christophe PLAGNIOL-VILLARD are GPL, so this is, of course, GPL.
72439e4bfSJean-Christophe PLAGNIOL-VILLARD 
82439e4bfSJean-Christophe PLAGNIOL-VILLARD 
92439e4bfSJean-Christophe PLAGNIOL-VILLARD ==========================================================================
102439e4bfSJean-Christophe PLAGNIOL-VILLARD 
112439e4bfSJean-Christophe PLAGNIOL-VILLARD       dev/dp83902a.h
122439e4bfSJean-Christophe PLAGNIOL-VILLARD 
132439e4bfSJean-Christophe PLAGNIOL-VILLARD       National Semiconductor DP83902a ethernet chip
142439e4bfSJean-Christophe PLAGNIOL-VILLARD 
152439e4bfSJean-Christophe PLAGNIOL-VILLARD ==========================================================================
162439e4bfSJean-Christophe PLAGNIOL-VILLARD ####ECOSGPLCOPYRIGHTBEGIN####
172439e4bfSJean-Christophe PLAGNIOL-VILLARD  -------------------------------------------
182439e4bfSJean-Christophe PLAGNIOL-VILLARD  This file is part of eCos, the Embedded Configurable Operating System.
192439e4bfSJean-Christophe PLAGNIOL-VILLARD  Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
202439e4bfSJean-Christophe PLAGNIOL-VILLARD 
212439e4bfSJean-Christophe PLAGNIOL-VILLARD  eCos is free software; you can redistribute it and/or modify it under
222439e4bfSJean-Christophe PLAGNIOL-VILLARD  the terms of the GNU General Public License as published by the Free
232439e4bfSJean-Christophe PLAGNIOL-VILLARD  Software Foundation; either version 2 or (at your option) any later version.
242439e4bfSJean-Christophe PLAGNIOL-VILLARD 
252439e4bfSJean-Christophe PLAGNIOL-VILLARD  eCos is distributed in the hope that it will be useful, but WITHOUT ANY
262439e4bfSJean-Christophe PLAGNIOL-VILLARD  WARRANTY; without even the implied warranty of MERCHANTABILITY or
272439e4bfSJean-Christophe PLAGNIOL-VILLARD  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
282439e4bfSJean-Christophe PLAGNIOL-VILLARD  for more details.
292439e4bfSJean-Christophe PLAGNIOL-VILLARD 
302439e4bfSJean-Christophe PLAGNIOL-VILLARD  You should have received a copy of the GNU General Public License along
312439e4bfSJean-Christophe PLAGNIOL-VILLARD  with eCos; if not, write to the Free Software Foundation, Inc.,
322439e4bfSJean-Christophe PLAGNIOL-VILLARD  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
332439e4bfSJean-Christophe PLAGNIOL-VILLARD 
342439e4bfSJean-Christophe PLAGNIOL-VILLARD  As a special exception, if other files instantiate templates or use macros
352439e4bfSJean-Christophe PLAGNIOL-VILLARD  or inline functions from this file, or you compile this file and link it
362439e4bfSJean-Christophe PLAGNIOL-VILLARD  with other works to produce a work based on this file, this file does not
372439e4bfSJean-Christophe PLAGNIOL-VILLARD  by itself cause the resulting work to be covered by the GNU General Public
382439e4bfSJean-Christophe PLAGNIOL-VILLARD  License. However the source code for this file must still be made available
392439e4bfSJean-Christophe PLAGNIOL-VILLARD  in accordance with section (3) of the GNU General Public License.
402439e4bfSJean-Christophe PLAGNIOL-VILLARD 
412439e4bfSJean-Christophe PLAGNIOL-VILLARD  This exception does not invalidate any other reasons why a work based on
422439e4bfSJean-Christophe PLAGNIOL-VILLARD  this file might be covered by the GNU General Public License.
432439e4bfSJean-Christophe PLAGNIOL-VILLARD 
442439e4bfSJean-Christophe PLAGNIOL-VILLARD  Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
452439e4bfSJean-Christophe PLAGNIOL-VILLARD  at http://sources.redhat.com/ecos/ecos-license/
462439e4bfSJean-Christophe PLAGNIOL-VILLARD  -------------------------------------------
472439e4bfSJean-Christophe PLAGNIOL-VILLARD ####ECOSGPLCOPYRIGHTEND####
482439e4bfSJean-Christophe PLAGNIOL-VILLARD ####BSDCOPYRIGHTBEGIN####
492439e4bfSJean-Christophe PLAGNIOL-VILLARD 
502439e4bfSJean-Christophe PLAGNIOL-VILLARD  -------------------------------------------
512439e4bfSJean-Christophe PLAGNIOL-VILLARD 
522439e4bfSJean-Christophe PLAGNIOL-VILLARD  Portions of this software may have been derived from OpenBSD or other sources,
532439e4bfSJean-Christophe PLAGNIOL-VILLARD  and are covered by the appropriate copyright disclaimers included herein.
542439e4bfSJean-Christophe PLAGNIOL-VILLARD 
552439e4bfSJean-Christophe PLAGNIOL-VILLARD  -------------------------------------------
562439e4bfSJean-Christophe PLAGNIOL-VILLARD 
572439e4bfSJean-Christophe PLAGNIOL-VILLARD ####BSDCOPYRIGHTEND####
582439e4bfSJean-Christophe PLAGNIOL-VILLARD ==========================================================================
592439e4bfSJean-Christophe PLAGNIOL-VILLARD #####DESCRIPTIONBEGIN####
602439e4bfSJean-Christophe PLAGNIOL-VILLARD 
612439e4bfSJean-Christophe PLAGNIOL-VILLARD  Author(s):    gthomas
622439e4bfSJean-Christophe PLAGNIOL-VILLARD  Contributors: gthomas, jskov
632439e4bfSJean-Christophe PLAGNIOL-VILLARD  Date:         2001-06-13
642439e4bfSJean-Christophe PLAGNIOL-VILLARD  Purpose:
652439e4bfSJean-Christophe PLAGNIOL-VILLARD  Description:
662439e4bfSJean-Christophe PLAGNIOL-VILLARD 
672439e4bfSJean-Christophe PLAGNIOL-VILLARD ####DESCRIPTIONEND####
682439e4bfSJean-Christophe PLAGNIOL-VILLARD 
692439e4bfSJean-Christophe PLAGNIOL-VILLARD ==========================================================================
702439e4bfSJean-Christophe PLAGNIOL-VILLARD 
712439e4bfSJean-Christophe PLAGNIOL-VILLARD */
722439e4bfSJean-Christophe PLAGNIOL-VILLARD 
732439e4bfSJean-Christophe PLAGNIOL-VILLARD /*
74*e710185aSgoda.yusuke  * NE2000 support header file.
75*e710185aSgoda.yusuke  *		Created by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
762439e4bfSJean-Christophe PLAGNIOL-VILLARD  */
772439e4bfSJean-Christophe PLAGNIOL-VILLARD 
78*e710185aSgoda.yusuke #ifndef __DRIVERS_NE2000_H__
79*e710185aSgoda.yusuke #define __DRIVERS_NE2000_H__
802439e4bfSJean-Christophe PLAGNIOL-VILLARD 
81*e710185aSgoda.yusuke /* Enable NE2000 basic init function */
82*e710185aSgoda.yusuke #define NE2000_BASIC_INIT
83*e710185aSgoda.yusuke 
84*e710185aSgoda.yusuke #define DP_DATA     0x10
85*e710185aSgoda.yusuke #define START_PG    0x50    /* First page of TX buffer */
86*e710185aSgoda.yusuke #define STOP_PG     0x80    /* Last page +1 of RX ring */
87*e710185aSgoda.yusuke 
88*e710185aSgoda.yusuke #define RX_START    0x50
89*e710185aSgoda.yusuke #define RX_END      0x80
90*e710185aSgoda.yusuke 
91*e710185aSgoda.yusuke #define DP_IN(_b_, _o_, _d_)  (_d_) = *( (vu_char *) ((_b_)+(_o_)))
92*e710185aSgoda.yusuke #define DP_OUT(_b_, _o_, _d_) *( (vu_char *) ((_b_)+(_o_))) = (_d_)
93*e710185aSgoda.yusuke #define DP_IN_DATA(_b_, _d_)  (_d_) = *( (vu_char *) ((_b_)))
94*e710185aSgoda.yusuke #define DP_OUT_DATA(_b_, _d_) *( (vu_char *) ((_b_))) = (_d_)
95*e710185aSgoda.yusuke 
96*e710185aSgoda.yusuke static void pcnet_reset_8390(void)
97*e710185aSgoda.yusuke {
98*e710185aSgoda.yusuke 	int i, r;
99*e710185aSgoda.yusuke 
100*e710185aSgoda.yusuke 	PRINTK("nic base is %lx\n", nic_base);
101*e710185aSgoda.yusuke 
102*e710185aSgoda.yusuke 	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD);
103*e710185aSgoda.yusuke 	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD));
104*e710185aSgoda.yusuke 	n2k_outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, E8390_CMD);
105*e710185aSgoda.yusuke 	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD));
106*e710185aSgoda.yusuke 	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD);
107*e710185aSgoda.yusuke 	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD));
108*e710185aSgoda.yusuke 	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD);
109*e710185aSgoda.yusuke 
110*e710185aSgoda.yusuke 	n2k_outb(n2k_inb(PCNET_RESET), PCNET_RESET);
111*e710185aSgoda.yusuke 
112*e710185aSgoda.yusuke 	for (i = 0; i < 100; i++) {
113*e710185aSgoda.yusuke 		if ((r = (n2k_inb(EN0_ISR) & ENISR_RESET)) != 0)
114*e710185aSgoda.yusuke 			break;
115*e710185aSgoda.yusuke 		PRINTK("got %x in reset\n", r);
116*e710185aSgoda.yusuke 		udelay(100);
117*e710185aSgoda.yusuke 	}
118*e710185aSgoda.yusuke 	n2k_outb(ENISR_RESET, EN0_ISR); /* Ack intr. */
119*e710185aSgoda.yusuke 
120*e710185aSgoda.yusuke 	if (i == 100)
121*e710185aSgoda.yusuke 		printf("pcnet_reset_8390() did not complete.\n");
122*e710185aSgoda.yusuke } /* pcnet_reset_8390 */
123*e710185aSgoda.yusuke 
124*e710185aSgoda.yusuke int get_prom(u8* mac_addr)
125*e710185aSgoda.yusuke {
126*e710185aSgoda.yusuke 	u8 prom[32];
127*e710185aSgoda.yusuke 	int i, j;
128*e710185aSgoda.yusuke 	struct {
129*e710185aSgoda.yusuke 		u_char value, offset;
130*e710185aSgoda.yusuke 	} program_seq[] = {
131*e710185aSgoda.yusuke 		{E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
132*e710185aSgoda.yusuke 		{0x48,  EN0_DCFG},  /* Set byte-wide (0x48) access. */
133*e710185aSgoda.yusuke 		{0x00,  EN0_RCNTLO},    /* Clear the count regs. */
134*e710185aSgoda.yusuke 		{0x00,  EN0_RCNTHI},
135*e710185aSgoda.yusuke 		{0x00,  EN0_IMR},   /* Mask completion irq. */
136*e710185aSgoda.yusuke 		{0xFF,  EN0_ISR},
137*e710185aSgoda.yusuke 		{E8390_RXOFF, EN0_RXCR},    /* 0x20  Set to monitor */
138*e710185aSgoda.yusuke 		{E8390_TXOFF, EN0_TXCR},    /* 0x02  and loopback mode. */
139*e710185aSgoda.yusuke 		{32,    EN0_RCNTLO},
140*e710185aSgoda.yusuke 		{0x00,  EN0_RCNTHI},
141*e710185aSgoda.yusuke 		{0x00,  EN0_RSARLO},    /* DMA starting at 0x0000. */
142*e710185aSgoda.yusuke 		{0x00,  EN0_RSARHI},
143*e710185aSgoda.yusuke 		{E8390_RREAD+E8390_START, E8390_CMD},
144*e710185aSgoda.yusuke 	};
145*e710185aSgoda.yusuke 
146*e710185aSgoda.yusuke     PRINTK("trying to get MAC via prom reading\n");
147*e710185aSgoda.yusuke 
148*e710185aSgoda.yusuke     pcnet_reset_8390();
149*e710185aSgoda.yusuke 
150*e710185aSgoda.yusuke     mdelay(10);
151*e710185aSgoda.yusuke 
152*e710185aSgoda.yusuke     for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
153*e710185aSgoda.yusuke         n2k_outb(program_seq[i].value, program_seq[i].offset);
154*e710185aSgoda.yusuke 
155*e710185aSgoda.yusuke     PRINTK("PROM:");
156*e710185aSgoda.yusuke     for (i = 0; i < 32; i++) {
157*e710185aSgoda.yusuke         prom[i] = n2k_inb(PCNET_DATAPORT);
158*e710185aSgoda.yusuke         PRINTK(" %02x", prom[i]);
159*e710185aSgoda.yusuke     }
160*e710185aSgoda.yusuke     PRINTK("\n");
161*e710185aSgoda.yusuke     for (i = 0; i < NR_INFO; i++) {
162*e710185aSgoda.yusuke         if ((prom[0] == hw_info[i].a0) &&
163*e710185aSgoda.yusuke             (prom[2] == hw_info[i].a1) &&
164*e710185aSgoda.yusuke             (prom[4] == hw_info[i].a2)) {
165*e710185aSgoda.yusuke             PRINTK("matched board %d\n", i);
166*e710185aSgoda.yusuke             break;
167*e710185aSgoda.yusuke         }
168*e710185aSgoda.yusuke     }
169*e710185aSgoda.yusuke     if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) {
170*e710185aSgoda.yusuke         PRINTK("on exit i is %d/%ld\n", i, NR_INFO);
171*e710185aSgoda.yusuke         PRINTK("MAC address is ");
172*e710185aSgoda.yusuke         for (j = 0; j < 6; j++){
173*e710185aSgoda.yusuke             mac_addr[j] = prom[j<<1];
174*e710185aSgoda.yusuke             PRINTK("%02x:",mac_addr[i]);
175*e710185aSgoda.yusuke         }
176*e710185aSgoda.yusuke         PRINTK("\n");
177*e710185aSgoda.yusuke         return (i < NR_INFO) ? i : 0;
178*e710185aSgoda.yusuke     }
179*e710185aSgoda.yusuke     return NULL;
180*e710185aSgoda.yusuke }
1812439e4bfSJean-Christophe PLAGNIOL-VILLARD 
1822439e4bfSJean-Christophe PLAGNIOL-VILLARD 
183*e710185aSgoda.yusuke #endif /* __DRIVERS_NE2000_H__ */
184