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