]> git.sur5r.net Git - u-boot/blob - drivers/smc91111.c
45bc2483fcaf5efe7893b88d5f47779dc01e8725
[u-boot] / drivers / smc91111.c
1 /*------------------------------------------------------------------------
2  . smc91111.c
3  . This is a driver for SMSC's 91C111 single-chip Ethernet device.
4  .
5  . (C) Copyright 2002
6  . Sysgo Real-Time Solutions, GmbH <www.elinos.com>
7  . Rolf Offermanns <rof@sysgo.de>
8  .
9  . Copyright (C) 2001 Standard Microsystems Corporation (SMSC)
10  .       Developed by Simple Network Magic Corporation (SNMC)
11  . Copyright (C) 1996 by Erik Stahlman (ES)
12  .
13  . This program is free software; you can redistribute it and/or modify
14  . it under the terms of the GNU General Public License as published by
15  . the Free Software Foundation; either version 2 of the License, or
16  . (at your option) any later version.
17  .
18  . This program is distributed in the hope that it will be useful,
19  . but WITHOUT ANY WARRANTY; without even the implied warranty of
20  . MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  . GNU General Public License for more details.
22  .
23  . You should have received a copy of the GNU General Public License
24  . along with this program; if not, write to the Free Software
25  . Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  .
27  . Information contained in this file was obtained from the LAN91C111
28  . manual from SMC.  To get a copy, if you really want one, you can find
29  . information under www.smsc.com.
30  .
31  .
32  . "Features" of the SMC chip:
33  .   Integrated PHY/MAC for 10/100BaseT Operation
34  .   Supports internal and external MII
35  .   Integrated 8K packet memory
36  .   EEPROM interface for configuration
37  .
38  . Arguments:
39  .      io      = for the base address
40  .      irq     = for the IRQ
41  .
42  . author:
43  .      Erik Stahlman                           ( erik@vt.edu )
44  .      Daris A Nevil                           ( dnevil@snmc.com )
45  .
46  .
47  . Hardware multicast code from Peter Cammaert ( pc@denkart.be )
48  .
49  . Sources:
50  .    o   SMSC LAN91C111 databook (www.smsc.com)
51  .    o   smc9194.c by Erik Stahlman
52  .    o   skeleton.c by Donald Becker ( becker@cesdis.gsfc.nasa.gov )
53  .
54  . History:
55  .      06/19/03  Richard Woodruff Made u-boot environment aware and added mac addr checks.
56  .      10/17/01  Marco Hasewinkel Modify for DNP/1110
57  .      07/25/01  Woojung Huh      Modify for ADS Bitsy
58  .      04/25/01  Daris A Nevil    Initial public release through SMSC
59  .      03/16/01  Daris A Nevil    Modified smc9194.c for use with LAN91C111
60  ----------------------------------------------------------------------------*/
61
62 #include <common.h>
63 #include <command.h>
64 #include "smc91111.h"
65 #include <net.h>
66
67 #ifdef CONFIG_DRIVER_SMC91111
68
69 /* Use power-down feature of the chip */
70 #define POWER_DOWN      0
71
72 #define NO_AUTOPROBE
73
74 #define SMC_DEBUG 0
75
76 #if SMC_DEBUG > 1
77 static const char version[] =
78         "smc91111.c:v1.0 04/25/01 by Daris A Nevil (dnevil@snmc.com)\n";
79 #endif
80
81 /*------------------------------------------------------------------------
82  .
83  . Configuration options, for the experienced user to change.
84  .
85  -------------------------------------------------------------------------*/
86
87 /*
88  . Wait time for memory to be free.  This probably shouldn't be
89  . tuned that much, as waiting for this means nothing else happens
90  . in the system
91 */
92 #define MEMORY_WAIT_TIME 16
93
94
95 #if (SMC_DEBUG > 2 )
96 #define PRINTK3(args...) printf(args)
97 #else
98 #define PRINTK3(args...)
99 #endif
100
101 #if SMC_DEBUG > 1
102 #define PRINTK2(args...) printf(args)
103 #else
104 #define PRINTK2(args...)
105 #endif
106
107 #ifdef SMC_DEBUG
108 #define PRINTK(args...) printf(args)
109 #else
110 #define PRINTK(args...)
111 #endif
112
113
114 /*------------------------------------------------------------------------
115  .
116  . The internal workings of the driver.  If you are changing anything
117  . here with the SMC stuff, you should have the datasheet and know
118  . what you are doing.
119  .
120  -------------------------------------------------------------------------*/
121 #define CARDNAME "LAN91C111"
122
123 /* Memory sizing constant */
124 #define LAN91C111_MEMORY_MULTIPLIER     (1024*2)
125
126 #ifndef CONFIG_SMC91111_BASE
127 #define CONFIG_SMC91111_BASE 0x20000300
128 #endif
129
130 #define SMC_BASE_ADDRESS CONFIG_SMC91111_BASE
131
132 #define SMC_DEV_NAME "SMC91111"
133 #define SMC_PHY_ADDR 0x0000
134 #define SMC_ALLOC_MAX_TRY 5
135 #define SMC_TX_TIMEOUT 30
136
137 #define SMC_PHY_CLOCK_DELAY 1000
138
139 #define ETH_ZLEN 60
140
141 #ifdef  CONFIG_SMC_USE_32_BIT
142 #define USE_32_BIT  1
143 #else
144 #undef USE_32_BIT
145 #endif
146 /*-----------------------------------------------------------------
147  .
148  .  The driver can be entered at any of the following entry points.
149  .
150  .------------------------------------------------------------------  */
151
152 extern int eth_init(bd_t *bd);
153 extern void eth_halt(void);
154 extern int eth_rx(void);
155 extern int eth_send(volatile void *packet, int length);
156
157
158 /*
159  . This is called by  register_netdev().  It is responsible for
160  . checking the portlist for the SMC9000 series chipset.  If it finds
161  . one, then it will initialize the device, find the hardware information,
162  . and sets up the appropriate device parameters.
163  . NOTE: Interrupts are *OFF* when this procedure is called.
164  .
165  . NB:This shouldn't be static since it is referred to externally.
166 */
167 int smc_init(void);
168
169 /*
170  . This is called by  unregister_netdev().  It is responsible for
171  . cleaning up before the driver is finally unregistered and discarded.
172 */
173 void smc_destructor(void);
174
175 /*
176  . The kernel calls this function when someone wants to use the device,
177  . typically 'ifconfig ethX up'.
178 */
179 static int smc_open(bd_t *bd);
180
181
182 /*
183  . This is called by the kernel in response to 'ifconfig ethX down'.  It
184  . is responsible for cleaning up everything that the open routine
185  . does, and maybe putting the card into a powerdown state.
186 */
187 static int smc_close(void);
188
189 /*
190  . Configures the PHY through the MII Management interface
191 */
192 #ifndef CONFIG_SMC91111_EXT_PHY
193 static void smc_phy_configure(void);
194 #endif /* !CONFIG_SMC91111_EXT_PHY */
195
196 /*
197  . This is a separate procedure to handle the receipt of a packet, to
198  . leave the interrupt code looking slightly cleaner
199 */
200 static int smc_rcv(void);
201
202 /* See if a MAC address is defined in the current environment. If so use it. If not
203  . print a warning and set the environment and other globals with the default.
204  . If an EEPROM is present it really should be consulted.
205 */
206 int smc_get_ethaddr(bd_t *bd);
207 int get_rom_mac(char *v_rom_mac);
208
209 /*
210  ------------------------------------------------------------
211  .
212  . Internal routines
213  .
214  ------------------------------------------------------------
215 */
216
217 static char unsigned smc_mac_addr[6] = {0x02, 0x80, 0xad, 0x20, 0x31, 0xb8};
218
219 /*
220  * This function must be called before smc_open() if you want to override
221  * the default mac address.
222  */
223
224 void smc_set_mac_addr(const char *addr) {
225         int i;
226
227         for (i=0; i < sizeof(smc_mac_addr); i++){
228                 smc_mac_addr[i] = addr[i];
229         }
230 }
231
232 /*
233  * smc_get_macaddr is no longer used. If you want to override the default
234  * mac address, call smc_get_mac_addr as a part of the board initialization.
235  */
236
237 #if 0
238 void smc_get_macaddr( byte *addr ) {
239         /* MAC ADDRESS AT FLASHBLOCK 1 / OFFSET 0x10 */
240         unsigned char *dnp1110_mac = (unsigned char *) (0xE8000000 + 0x20010);
241         int i;
242
243
244         for (i=0; i<6; i++) {
245             addr[0] = *(dnp1110_mac+0);
246             addr[1] = *(dnp1110_mac+1);
247             addr[2] = *(dnp1110_mac+2);
248             addr[3] = *(dnp1110_mac+3);
249             addr[4] = *(dnp1110_mac+4);
250             addr[5] = *(dnp1110_mac+5);
251         }
252 }
253 #endif /* 0 */
254
255 /***********************************************
256  * Show available memory                       *
257  ***********************************************/
258 void dump_memory_info(void)
259 {
260         word mem_info;
261         word old_bank;
262
263         old_bank = SMC_inw(BANK_SELECT)&0xF;
264
265         SMC_SELECT_BANK(0);
266         mem_info = SMC_inw( MIR_REG );
267         PRINTK2("Memory: %4d available\n", (mem_info >> 8)*2048);
268
269         SMC_SELECT_BANK(old_bank);
270 }
271 /*
272  . A rather simple routine to print out a packet for debugging purposes.
273 */
274 #if SMC_DEBUG > 2
275 static void print_packet( byte *, int );
276 #endif
277
278 #define tx_done(dev) 1
279
280
281 /* this does a soft reset on the device */
282 static void smc_reset( void );
283
284 /* Enable Interrupts, Receive, and Transmit */
285 static void smc_enable( void );
286
287 /* this puts the device in an inactive state */
288 static void smc_shutdown( void );
289
290 /* Routines to Read and Write the PHY Registers across the
291    MII Management Interface
292 */
293
294 #ifndef CONFIG_SMC91111_EXT_PHY
295 static word smc_read_phy_register(byte phyreg);
296 static void smc_write_phy_register(byte phyreg, word phydata);
297 #endif /* !CONFIG_SMC91111_EXT_PHY */
298
299
300 static int poll4int (byte mask, int timeout)
301 {
302         int tmo = get_timer (0) + timeout * CFG_HZ;
303         int is_timeout = 0;
304         word old_bank = SMC_inw (BSR_REG);
305
306         PRINTK2 ("Polling...\n");
307         SMC_SELECT_BANK (2);
308         while ((SMC_inw (SMC91111_INT_REG) & mask) == 0) {
309                 if (get_timer (0) >= tmo) {
310                         is_timeout = 1;
311                         break;
312                 }
313         }
314
315         /* restore old bank selection */
316         SMC_SELECT_BANK (old_bank);
317
318         if (is_timeout)
319                 return 1;
320         else
321                 return 0;
322 }
323
324 /* Only one release command at a time, please */
325 static inline void smc_wait_mmu_release_complete (void)
326 {
327         int count = 0;
328
329         /* assume bank 2 selected */
330         while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
331                 udelay (1);     /* Wait until not busy */
332                 if (++count > 200)
333                         break;
334         }
335 }
336
337 /*
338  . Function: smc_reset( void )
339  . Purpose:
340  .      This sets the SMC91111 chip to its normal state, hopefully from whatever
341  .      mess that any other DOS driver has put it in.
342  .
343  . Maybe I should reset more registers to defaults in here?  SOFTRST  should
344  . do that for me.
345  .
346  . Method:
347  .      1.  send a SOFT RESET
348  .      2.  wait for it to finish
349  .      3.  enable autorelease mode
350  .      4.  reset the memory management unit
351  .      5.  clear all interrupts
352  .
353 */
354 static void smc_reset (void)
355 {
356         PRINTK2 ("%s:smc_reset\n", SMC_DEV_NAME);
357
358         /* This resets the registers mostly to defaults, but doesn't
359            affect EEPROM.  That seems unnecessary */
360         SMC_SELECT_BANK (0);
361         SMC_outw (RCR_SOFTRST, RCR_REG);
362
363         /* Setup the Configuration Register */
364         /* This is necessary because the CONFIG_REG is not affected */
365         /* by a soft reset */
366
367         SMC_SELECT_BANK (1);
368 #if defined(CONFIG_SMC91111_EXT_PHY)
369         SMC_outw (CONFIG_DEFAULT | CONFIG_EXT_PHY, CONFIG_REG);
370 #else
371         SMC_outw (CONFIG_DEFAULT, CONFIG_REG);
372 #endif
373
374
375         /* Release from possible power-down state */
376         /* Configuration register is not affected by Soft Reset */
377         SMC_outw (SMC_inw (CONFIG_REG) | CONFIG_EPH_POWER_EN, CONFIG_REG);
378
379         SMC_SELECT_BANK (0);
380
381         /* this should pause enough for the chip to be happy */
382         udelay (10);
383
384         /* Disable transmit and receive functionality */
385         SMC_outw (RCR_CLEAR, RCR_REG);
386         SMC_outw (TCR_CLEAR, TCR_REG);
387
388         /* set the control register */
389         SMC_SELECT_BANK (1);
390         SMC_outw (CTL_DEFAULT, CTL_REG);
391
392         /* Reset the MMU */
393         SMC_SELECT_BANK (2);
394         smc_wait_mmu_release_complete ();
395         SMC_outw (MC_RESET, MMU_CMD_REG);
396         while (SMC_inw (MMU_CMD_REG) & MC_BUSY)
397                 udelay (1);     /* Wait until not busy */
398
399         /* Note:  It doesn't seem that waiting for the MMU busy is needed here,
400            but this is a place where future chipsets _COULD_ break.  Be wary
401            of issuing another MMU command right after this */
402
403         /* Disable all interrupts */
404         SMC_outb (0, IM_REG);
405 }
406
407 /*
408  . Function: smc_enable
409  . Purpose: let the chip talk to the outside work
410  . Method:
411  .      1.  Enable the transmitter
412  .      2.  Enable the receiver
413  .      3.  Enable interrupts
414 */
415 static void smc_enable()
416 {
417         PRINTK2("%s:smc_enable\n", SMC_DEV_NAME);
418         SMC_SELECT_BANK( 0 );
419         /* see the header file for options in TCR/RCR DEFAULT*/
420         SMC_outw( TCR_DEFAULT, TCR_REG );
421         SMC_outw( RCR_DEFAULT, RCR_REG );
422
423         /* clear MII_DIS */
424 /*      smc_write_phy_register(PHY_CNTL_REG, 0x0000); */
425 }
426
427 /*
428  . Function: smc_shutdown
429  . Purpose:  closes down the SMC91xxx chip.
430  . Method:
431  .      1. zero the interrupt mask
432  .      2. clear the enable receive flag
433  .      3. clear the enable xmit flags
434  .
435  . TODO:
436  .   (1) maybe utilize power down mode.
437  .      Why not yet?  Because while the chip will go into power down mode,
438  .      the manual says that it will wake up in response to any I/O requests
439  .      in the register space.   Empirical results do not show this working.
440 */
441 static void smc_shutdown()
442 {
443         PRINTK2(CARDNAME ":smc_shutdown\n");
444
445         /* no more interrupts for me */
446         SMC_SELECT_BANK( 2 );
447         SMC_outb( 0, IM_REG );
448
449         /* and tell the card to stay away from that nasty outside world */
450         SMC_SELECT_BANK( 0 );
451         SMC_outb( RCR_CLEAR, RCR_REG );
452         SMC_outb( TCR_CLEAR, TCR_REG );
453 }
454
455
456 /*
457  . Function:  smc_hardware_send_packet(struct net_device * )
458  . Purpose:
459  .      This sends the actual packet to the SMC9xxx chip.
460  .
461  . Algorithm:
462  .      First, see if a saved_skb is available.
463  .              ( this should NOT be called if there is no 'saved_skb'
464  .      Now, find the packet number that the chip allocated
465  .      Point the data pointers at it in memory
466  .      Set the length word in the chip's memory
467  .      Dump the packet to chip memory
468  .      Check if a last byte is needed ( odd length packet )
469  .              if so, set the control flag right
470  .      Tell the card to send it
471  .      Enable the transmit interrupt, so I know if it failed
472  .      Free the kernel data if I actually sent it.
473 */
474 static int smc_send_packet (volatile void *packet, int packet_length)
475 {
476         byte packet_no;
477         unsigned long ioaddr;
478         byte *buf;
479         int length;
480         int numPages;
481         int try = 0;
482         int time_out;
483         byte status;
484
485
486         PRINTK3 ("%s:smc_hardware_send_packet\n", SMC_DEV_NAME);
487
488         length = ETH_ZLEN < packet_length ? packet_length : ETH_ZLEN;
489
490         /* allocate memory
491          ** The MMU wants the number of pages to be the number of 256 bytes
492          ** 'pages', minus 1 ( since a packet can't ever have 0 pages :) )
493          **
494          ** The 91C111 ignores the size bits, but the code is left intact
495          ** for backwards and future compatibility.
496          **
497          ** Pkt size for allocating is data length +6 (for additional status
498          ** words, length and ctl!)
499          **
500          ** If odd size then last byte is included in this header.
501          */
502         numPages = ((length & 0xfffe) + 6);
503         numPages >>= 8;         /* Divide by 256 */
504
505         if (numPages > 7) {
506                 printf ("%s: Far too big packet error. \n", SMC_DEV_NAME);
507                 return 0;
508         }
509
510         /* now, try to allocate the memory */
511         SMC_SELECT_BANK (2);
512         SMC_outw (MC_ALLOC | numPages, MMU_CMD_REG);
513
514         /* FIXME: the ALLOC_INT bit never gets set *
515          * so the following will always give a     *
516          * memory allocation error.                *
517          * same code works in armboot though       *
518          * -ro
519          */
520
521 again:
522         try++;
523         time_out = MEMORY_WAIT_TIME;
524         do {
525                 status = SMC_inb (SMC91111_INT_REG);
526                 if (status & IM_ALLOC_INT) {
527                         /* acknowledge the interrupt */
528                         SMC_outb (IM_ALLOC_INT, SMC91111_INT_REG);
529                         break;
530                 }
531         } while (--time_out);
532
533         if (!time_out) {
534                 PRINTK2 ("%s: memory allocation, try %d failed ...\n",
535                          SMC_DEV_NAME, try);
536                 if (try < SMC_ALLOC_MAX_TRY)
537                         goto again;
538                 else
539                         return 0;
540         }
541
542         PRINTK2 ("%s: memory allocation, try %d succeeded ...\n",
543                  SMC_DEV_NAME, try);
544
545         /* I can send the packet now.. */
546
547         ioaddr = SMC_BASE_ADDRESS;
548
549         buf = (byte *) packet;
550
551         /* If I get here, I _know_ there is a packet slot waiting for me */
552         packet_no = SMC_inb (AR_REG);
553         if (packet_no & AR_FAILED) {
554                 /* or isn't there?  BAD CHIP! */
555                 printf ("%s: Memory allocation failed. \n", SMC_DEV_NAME);
556                 return 0;
557         }
558
559         /* we have a packet address, so tell the card to use it */
560         SMC_outb (packet_no, PN_REG);
561
562         /* point to the beginning of the packet */
563         SMC_outw (PTR_AUTOINC, PTR_REG);
564
565         PRINTK3 ("%s: Trying to xmit packet of length %x\n",
566                  SMC_DEV_NAME, length);
567
568 #if SMC_DEBUG > 2
569         printf ("Transmitting Packet\n");
570         print_packet (buf, length);
571 #endif
572
573         /* send the packet length ( +6 for status, length and ctl byte )
574            and the status word ( set to zeros ) */
575 #ifdef USE_32_BIT
576         SMC_outl ((length + 6) << 16, SMC91111_DATA_REG);
577 #else
578         SMC_outw (0, SMC91111_DATA_REG);
579         /* send the packet length ( +6 for status words, length, and ctl */
580         SMC_outw ((length + 6), SMC91111_DATA_REG);
581 #endif
582
583         /* send the actual data
584            . I _think_ it's faster to send the longs first, and then
585            . mop up by sending the last word.  It depends heavily
586            . on alignment, at least on the 486.  Maybe it would be
587            . a good idea to check which is optimal?  But that could take
588            . almost as much time as is saved?
589          */
590 #ifdef USE_32_BIT
591         SMC_outsl (SMC91111_DATA_REG, buf, length >> 2);
592         if (length & 0x2)
593                 SMC_outw (*((word *) (buf + (length & 0xFFFFFFFC))),
594                           SMC91111_DATA_REG);
595 #else
596         SMC_outsw (SMC91111_DATA_REG, buf, (length) >> 1);
597 #endif /* USE_32_BIT */
598
599         /* Send the last byte, if there is one.   */
600         if ((length & 1) == 0) {
601                 SMC_outw (0, SMC91111_DATA_REG);
602         } else {
603                 SMC_outw (buf[length - 1] | 0x2000, SMC91111_DATA_REG);
604         }
605
606         /* and let the chipset deal with it */
607         SMC_outw (MC_ENQUEUE, MMU_CMD_REG);
608
609         /* poll for TX INT */
610         if (poll4int (IM_TX_INT, SMC_TX_TIMEOUT)) {
611                 /* sending failed */
612                 PRINTK2 ("%s: TX timeout, sending failed...\n", SMC_DEV_NAME);
613
614                 /* release packet */
615                 SMC_outw (MC_FREEPKT, MMU_CMD_REG);
616
617                 /* wait for MMU getting ready (low) */
618                 while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
619                         udelay (10);
620                 }
621
622                 PRINTK2 ("MMU ready\n");
623
624
625                 return 0;
626         } else {
627                 /* ack. int */
628                 SMC_outb (IM_TX_INT, SMC91111_INT_REG);
629                 PRINTK2 ("%s: Sent packet of length %d \n", SMC_DEV_NAME,
630                          length);
631
632                 /* release packet */
633                 SMC_outw (MC_FREEPKT, MMU_CMD_REG);
634
635                 /* wait for MMU getting ready (low) */
636                 while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
637                         udelay (10);
638                 }
639
640                 PRINTK2 ("MMU ready\n");
641
642
643         }
644
645         return length;
646 }
647
648 /*-------------------------------------------------------------------------
649  |
650  | smc_destructor( struct net_device * dev )
651  |   Input parameters:
652  |      dev, pointer to the device structure
653  |
654  |   Output:
655  |      None.
656  |
657  ---------------------------------------------------------------------------
658 */
659 void smc_destructor()
660 {
661         PRINTK2(CARDNAME ":smc_destructor\n");
662 }
663
664
665 /*
666  * Open and Initialize the board
667  *
668  * Set up everything, reset the card, etc ..
669  *
670  */
671 static int smc_open (bd_t * bd)
672 {
673         int i, err;
674
675         PRINTK2 ("%s:smc_open\n", SMC_DEV_NAME);
676
677         /* reset the hardware */
678         smc_reset ();
679         smc_enable ();
680
681         /* Configure the PHY */
682 #ifndef CONFIG_SMC91111_EXT_PHY
683         smc_phy_configure ();
684 #endif
685
686         /* conservative setting (10Mbps, HalfDuplex, no AutoNeg.) */
687 /*      SMC_SELECT_BANK(0); */
688 /*      SMC_outw(0, RPC_REG); */
689         SMC_SELECT_BANK (1);
690
691         err = smc_get_ethaddr (bd);     /* set smc_mac_addr, and sync it with u-boot globals */
692         if (err < 0) {
693                 memset (bd->bi_enetaddr, 0, 6); /* hack to make error stick! upper code will abort if not set */
694                 return (-1);    /* upper code ignores this, but NOT bi_enetaddr */
695         }
696 #ifdef USE_32_BIT
697         for (i = 0; i < 6; i += 2) {
698                 word address;
699
700                 address = smc_mac_addr[i + 1] << 8;
701                 address |= smc_mac_addr[i];
702                 SMC_outw (address, ADDR0_REG + i);
703         }
704 #else
705         for (i = 0; i < 6; i++)
706                 SMC_outb (smc_mac_addr[i], ADDR0_REG + i);
707 #endif
708
709         return 0;
710 }
711
712 /*-------------------------------------------------------------
713  .
714  . smc_rcv -  receive a packet from the card
715  .
716  . There is ( at least ) a packet waiting to be read from
717  . chip-memory.
718  .
719  . o Read the status
720  . o If an error, record it
721  . o otherwise, read in the packet
722  --------------------------------------------------------------
723 */
724 static int smc_rcv()
725 {
726         int     packet_number;
727         word    status;
728         word    packet_length;
729         int     is_error = 0;
730 #ifdef USE_32_BIT
731         dword stat_len;
732 #endif
733
734         SMC_SELECT_BANK(2);
735         packet_number = SMC_inw( RXFIFO_REG );
736
737         if ( packet_number & RXFIFO_REMPTY ) {
738
739                 return 0;
740         }
741
742         PRINTK3("%s:smc_rcv\n", SMC_DEV_NAME);
743         /*  start reading from the start of the packet */
744         SMC_outw( PTR_READ | PTR_RCV | PTR_AUTOINC, PTR_REG );
745
746         /* First two words are status and packet_length */
747 #ifdef USE_32_BIT
748         stat_len = SMC_inl(SMC91111_DATA_REG);
749         status = stat_len & 0xffff;
750         packet_length = stat_len >> 16;
751 #else
752         status          = SMC_inw( SMC91111_DATA_REG );
753         packet_length   = SMC_inw( SMC91111_DATA_REG );
754 #endif
755
756         packet_length &= 0x07ff;  /* mask off top bits */
757
758         PRINTK2("RCV: STATUS %4x LENGTH %4x\n", status, packet_length );
759
760         if ( !(status & RS_ERRORS ) ){
761                 /* Adjust for having already read the first two words */
762                 packet_length -= 4; /*4; */
763
764
765                 /* set odd length for bug in LAN91C111, */
766                 /* which never sets RS_ODDFRAME */
767                 /* TODO ? */
768
769
770 #ifdef USE_32_BIT
771                 PRINTK3(" Reading %d dwords (and %d bytes) \n",
772                         packet_length >> 2, packet_length & 3 );
773                 /* QUESTION:  Like in the TX routine, do I want
774                    to send the DWORDs or the bytes first, or some
775                    mixture.  A mixture might improve already slow PIO
776                    performance  */
777                 SMC_insl( SMC91111_DATA_REG , NetRxPackets[0], packet_length >> 2 );
778                 /* read the left over bytes */
779                 if (packet_length & 3) {
780                         int i;
781
782                         byte *tail = (byte *)(NetRxPackets[0] + (packet_length & ~3));
783                         dword leftover = SMC_inl(SMC91111_DATA_REG);
784                         for (i=0; i<(packet_length & 3); i++)
785                                 *tail++ = (byte) (leftover >> (8*i)) & 0xff;
786                 }
787 #else
788                 PRINTK3(" Reading %d words and %d byte(s) \n",
789                         (packet_length >> 1 ), packet_length & 1 );
790                 SMC_insw(SMC91111_DATA_REG , NetRxPackets[0], packet_length >> 1);
791
792 #endif /* USE_32_BIT */
793
794 #if     SMC_DEBUG > 2
795                 printf("Receiving Packet\n");
796                 print_packet( NetRxPackets[0], packet_length );
797 #endif
798         } else {
799                 /* error ... */
800                 /* TODO ? */
801                 is_error = 1;
802         }
803
804         while ( SMC_inw( MMU_CMD_REG ) & MC_BUSY )
805                 udelay(1); /* Wait until not busy */
806
807         /*  error or good, tell the card to get rid of this packet */
808         SMC_outw( MC_RELEASE, MMU_CMD_REG );
809
810         while ( SMC_inw( MMU_CMD_REG ) & MC_BUSY )
811                 udelay(1); /* Wait until not busy */
812
813         if (!is_error) {
814                 /* Pass the packet up to the protocol layers. */
815                 NetReceive(NetRxPackets[0], packet_length);
816                 return packet_length;
817         } else {
818                 return 0;
819         }
820
821 }
822
823
824 /*----------------------------------------------------
825  . smc_close
826  .
827  . this makes the board clean up everything that it can
828  . and not talk to the outside world.   Caused by
829  . an 'ifconfig ethX down'
830  .
831  -----------------------------------------------------*/
832 static int smc_close()
833 {
834         PRINTK2("%s:smc_close\n", SMC_DEV_NAME);
835
836         /* clear everything */
837         smc_shutdown();
838
839         return 0;
840 }
841
842
843 #if 0
844 /*------------------------------------------------------------
845  . Modify a bit in the LAN91C111 register set
846  .-------------------------------------------------------------*/
847 static word smc_modify_regbit(int bank, int ioaddr, int reg,
848         unsigned int bit, int val)
849 {
850         word regval;
851
852         SMC_SELECT_BANK( bank );
853
854         regval = SMC_inw( reg );
855         if (val)
856                 regval |= bit;
857         else
858                 regval &= ~bit;
859
860         SMC_outw( regval, 0 );
861         return(regval);
862 }
863
864
865 /*------------------------------------------------------------
866  . Retrieve a bit in the LAN91C111 register set
867  .-------------------------------------------------------------*/
868 static int smc_get_regbit(int bank, int ioaddr, int reg, unsigned int bit)
869 {
870         SMC_SELECT_BANK( bank );
871         if ( SMC_inw( reg ) & bit)
872                 return(1);
873         else
874                 return(0);
875 }
876
877
878 /*------------------------------------------------------------
879  . Modify a LAN91C111 register (word access only)
880  .-------------------------------------------------------------*/
881 static void smc_modify_reg(int bank, int ioaddr, int reg, word val)
882 {
883         SMC_SELECT_BANK( bank );
884         SMC_outw( val, reg );
885 }
886
887
888 /*------------------------------------------------------------
889  . Retrieve a LAN91C111 register (word access only)
890  .-------------------------------------------------------------*/
891 static int smc_get_reg(int bank, int ioaddr, int reg)
892 {
893         SMC_SELECT_BANK( bank );
894         return(SMC_inw( reg ));
895 }
896
897 #endif /* 0 */
898
899 /*---PHY CONTROL AND CONFIGURATION----------------------------------------- */
900
901 #if (SMC_DEBUG > 2 )
902
903 /*------------------------------------------------------------
904  . Debugging function for viewing MII Management serial bitstream
905  .-------------------------------------------------------------*/
906 static void smc_dump_mii_stream (byte * bits, int size)
907 {
908         int i;
909
910         printf ("BIT#:");
911         for (i = 0; i < size; ++i) {
912                 printf ("%d", i % 10);
913         }
914
915         printf ("\nMDOE:");
916         for (i = 0; i < size; ++i) {
917                 if (bits[i] & MII_MDOE)
918                         printf ("1");
919                 else
920                         printf ("0");
921         }
922
923         printf ("\nMDO :");
924         for (i = 0; i < size; ++i) {
925                 if (bits[i] & MII_MDO)
926                         printf ("1");
927                 else
928                         printf ("0");
929         }
930
931         printf ("\nMDI :");
932         for (i = 0; i < size; ++i) {
933                 if (bits[i] & MII_MDI)
934                         printf ("1");
935                 else
936                         printf ("0");
937         }
938
939         printf ("\n");
940 }
941 #endif
942
943 /*------------------------------------------------------------
944  . Reads a register from the MII Management serial interface
945  .-------------------------------------------------------------*/
946 #ifndef CONFIG_SMC91111_EXT_PHY
947 static word smc_read_phy_register (byte phyreg)
948 {
949         int oldBank;
950         int i;
951         byte mask;
952         word mii_reg;
953         byte bits[64];
954         int clk_idx = 0;
955         int input_idx;
956         word phydata;
957         byte phyaddr = SMC_PHY_ADDR;
958
959         /* 32 consecutive ones on MDO to establish sync */
960         for (i = 0; i < 32; ++i)
961                 bits[clk_idx++] = MII_MDOE | MII_MDO;
962
963         /* Start code <01> */
964         bits[clk_idx++] = MII_MDOE;
965         bits[clk_idx++] = MII_MDOE | MII_MDO;
966
967         /* Read command <10> */
968         bits[clk_idx++] = MII_MDOE | MII_MDO;
969         bits[clk_idx++] = MII_MDOE;
970
971         /* Output the PHY address, msb first */
972         mask = (byte) 0x10;
973         for (i = 0; i < 5; ++i) {
974                 if (phyaddr & mask)
975                         bits[clk_idx++] = MII_MDOE | MII_MDO;
976                 else
977                         bits[clk_idx++] = MII_MDOE;
978
979                 /* Shift to next lowest bit */
980                 mask >>= 1;
981         }
982
983         /* Output the phy register number, msb first */
984         mask = (byte) 0x10;
985         for (i = 0; i < 5; ++i) {
986                 if (phyreg & mask)
987                         bits[clk_idx++] = MII_MDOE | MII_MDO;
988                 else
989                         bits[clk_idx++] = MII_MDOE;
990
991                 /* Shift to next lowest bit */
992                 mask >>= 1;
993         }
994
995         /* Tristate and turnaround (2 bit times) */
996         bits[clk_idx++] = 0;
997         /*bits[clk_idx++] = 0; */
998
999         /* Input starts at this bit time */
1000         input_idx = clk_idx;
1001
1002         /* Will input 16 bits */
1003         for (i = 0; i < 16; ++i)
1004                 bits[clk_idx++] = 0;
1005
1006         /* Final clock bit */
1007         bits[clk_idx++] = 0;
1008
1009         /* Save the current bank */
1010         oldBank = SMC_inw (BANK_SELECT);
1011
1012         /* Select bank 3 */
1013         SMC_SELECT_BANK (3);
1014
1015         /* Get the current MII register value */
1016         mii_reg = SMC_inw (MII_REG);
1017
1018         /* Turn off all MII Interface bits */
1019         mii_reg &= ~(MII_MDOE | MII_MCLK | MII_MDI | MII_MDO);
1020
1021         /* Clock all 64 cycles */
1022         for (i = 0; i < sizeof bits; ++i) {
1023                 /* Clock Low - output data */
1024                 SMC_outw (mii_reg | bits[i], MII_REG);
1025                 udelay (SMC_PHY_CLOCK_DELAY);
1026
1027
1028                 /* Clock Hi - input data */
1029                 SMC_outw (mii_reg | bits[i] | MII_MCLK, MII_REG);
1030                 udelay (SMC_PHY_CLOCK_DELAY);
1031                 bits[i] |= SMC_inw (MII_REG) & MII_MDI;
1032         }
1033
1034         /* Return to idle state */
1035         /* Set clock to low, data to low, and output tristated */
1036         SMC_outw (mii_reg, MII_REG);
1037         udelay (SMC_PHY_CLOCK_DELAY);
1038
1039         /* Restore original bank select */
1040         SMC_SELECT_BANK (oldBank);
1041
1042         /* Recover input data */
1043         phydata = 0;
1044         for (i = 0; i < 16; ++i) {
1045                 phydata <<= 1;
1046
1047                 if (bits[input_idx++] & MII_MDI)
1048                         phydata |= 0x0001;
1049         }
1050
1051 #if (SMC_DEBUG > 2 )
1052         printf ("smc_read_phy_register(): phyaddr=%x,phyreg=%x,phydata=%x\n",
1053                 phyaddr, phyreg, phydata);
1054         smc_dump_mii_stream (bits, sizeof bits);
1055 #endif
1056
1057         return (phydata);
1058 }
1059
1060
1061 /*------------------------------------------------------------
1062  . Writes a register to the MII Management serial interface
1063  .-------------------------------------------------------------*/
1064 static void smc_write_phy_register (byte phyreg, word phydata)
1065 {
1066         int oldBank;
1067         int i;
1068         word mask;
1069         word mii_reg;
1070         byte bits[65];
1071         int clk_idx = 0;
1072         byte phyaddr = SMC_PHY_ADDR;
1073
1074         /* 32 consecutive ones on MDO to establish sync */
1075         for (i = 0; i < 32; ++i)
1076                 bits[clk_idx++] = MII_MDOE | MII_MDO;
1077
1078         /* Start code <01> */
1079         bits[clk_idx++] = MII_MDOE;
1080         bits[clk_idx++] = MII_MDOE | MII_MDO;
1081
1082         /* Write command <01> */
1083         bits[clk_idx++] = MII_MDOE;
1084         bits[clk_idx++] = MII_MDOE | MII_MDO;
1085
1086         /* Output the PHY address, msb first */
1087         mask = (byte) 0x10;
1088         for (i = 0; i < 5; ++i) {
1089                 if (phyaddr & mask)
1090                         bits[clk_idx++] = MII_MDOE | MII_MDO;
1091                 else
1092                         bits[clk_idx++] = MII_MDOE;
1093
1094                 /* Shift to next lowest bit */
1095                 mask >>= 1;
1096         }
1097
1098         /* Output the phy register number, msb first */
1099         mask = (byte) 0x10;
1100         for (i = 0; i < 5; ++i) {
1101                 if (phyreg & mask)
1102                         bits[clk_idx++] = MII_MDOE | MII_MDO;
1103                 else
1104                         bits[clk_idx++] = MII_MDOE;
1105
1106                 /* Shift to next lowest bit */
1107                 mask >>= 1;
1108         }
1109
1110         /* Tristate and turnaround (2 bit times) */
1111         bits[clk_idx++] = 0;
1112         bits[clk_idx++] = 0;
1113
1114         /* Write out 16 bits of data, msb first */
1115         mask = 0x8000;
1116         for (i = 0; i < 16; ++i) {
1117                 if (phydata & mask)
1118                         bits[clk_idx++] = MII_MDOE | MII_MDO;
1119                 else
1120                         bits[clk_idx++] = MII_MDOE;
1121
1122                 /* Shift to next lowest bit */
1123                 mask >>= 1;
1124         }
1125
1126         /* Final clock bit (tristate) */
1127         bits[clk_idx++] = 0;
1128
1129         /* Save the current bank */
1130         oldBank = SMC_inw (BANK_SELECT);
1131
1132         /* Select bank 3 */
1133         SMC_SELECT_BANK (3);
1134
1135         /* Get the current MII register value */
1136         mii_reg = SMC_inw (MII_REG);
1137
1138         /* Turn off all MII Interface bits */
1139         mii_reg &= ~(MII_MDOE | MII_MCLK | MII_MDI | MII_MDO);
1140
1141         /* Clock all cycles */
1142         for (i = 0; i < sizeof bits; ++i) {
1143                 /* Clock Low - output data */
1144                 SMC_outw (mii_reg | bits[i], MII_REG);
1145                 udelay (SMC_PHY_CLOCK_DELAY);
1146
1147
1148                 /* Clock Hi - input data */
1149                 SMC_outw (mii_reg | bits[i] | MII_MCLK, MII_REG);
1150                 udelay (SMC_PHY_CLOCK_DELAY);
1151                 bits[i] |= SMC_inw (MII_REG) & MII_MDI;
1152         }
1153
1154         /* Return to idle state */
1155         /* Set clock to low, data to low, and output tristated */
1156         SMC_outw (mii_reg, MII_REG);
1157         udelay (SMC_PHY_CLOCK_DELAY);
1158
1159         /* Restore original bank select */
1160         SMC_SELECT_BANK (oldBank);
1161
1162 #if (SMC_DEBUG > 2 )
1163         printf ("smc_write_phy_register(): phyaddr=%x,phyreg=%x,phydata=%x\n",
1164                 phyaddr, phyreg, phydata);
1165         smc_dump_mii_stream (bits, sizeof bits);
1166 #endif
1167 }
1168 #endif /* !CONFIG_SMC91111_EXT_PHY */
1169
1170
1171 /*------------------------------------------------------------
1172  . Waits the specified number of milliseconds - kernel friendly
1173  .-------------------------------------------------------------*/
1174 #ifndef CONFIG_SMC91111_EXT_PHY
1175 static void smc_wait_ms(unsigned int ms)
1176 {
1177         udelay(ms*1000);
1178 }
1179 #endif /* !CONFIG_SMC91111_EXT_PHY */
1180
1181
1182 /*------------------------------------------------------------
1183  . Configures the specified PHY using Autonegotiation. Calls
1184  . smc_phy_fixed() if the user has requested a certain config.
1185  .-------------------------------------------------------------*/
1186 #ifndef CONFIG_SMC91111_EXT_PHY
1187 static void smc_phy_configure ()
1188 {
1189         int timeout;
1190         byte phyaddr;
1191         word my_phy_caps;       /* My PHY capabilities */
1192         word my_ad_caps;        /* My Advertised capabilities */
1193         word status = 0;        /*;my status = 0 */
1194         int failed = 0;
1195
1196         PRINTK3 ("%s:smc_program_phy()\n", SMC_DEV_NAME);
1197
1198
1199         /* Get the detected phy address */
1200         phyaddr = SMC_PHY_ADDR;
1201
1202         /* Reset the PHY, setting all other bits to zero */
1203         smc_write_phy_register (PHY_CNTL_REG, PHY_CNTL_RST);
1204
1205         /* Wait for the reset to complete, or time out */
1206         timeout = 6;            /* Wait up to 3 seconds */
1207         while (timeout--) {
1208                 if (!(smc_read_phy_register (PHY_CNTL_REG)
1209                       & PHY_CNTL_RST)) {
1210                         /* reset complete */
1211                         break;
1212                 }
1213
1214                 smc_wait_ms (500);      /* wait 500 millisecs */
1215         }
1216
1217         if (timeout < 1) {
1218                 printf ("%s:PHY reset timed out\n", SMC_DEV_NAME);
1219                 goto smc_phy_configure_exit;
1220         }
1221
1222         /* Read PHY Register 18, Status Output */
1223         /* lp->lastPhy18 = smc_read_phy_register(PHY_INT_REG); */
1224
1225         /* Enable PHY Interrupts (for register 18) */
1226         /* Interrupts listed here are disabled */
1227         smc_write_phy_register (PHY_MASK_REG, 0xffff);
1228
1229         /* Configure the Receive/Phy Control register */
1230         SMC_SELECT_BANK (0);
1231         SMC_outw (RPC_DEFAULT, RPC_REG);
1232
1233         /* Copy our capabilities from PHY_STAT_REG to PHY_AD_REG */
1234         my_phy_caps = smc_read_phy_register (PHY_STAT_REG);
1235         my_ad_caps = PHY_AD_CSMA;       /* I am CSMA capable */
1236
1237         if (my_phy_caps & PHY_STAT_CAP_T4)
1238                 my_ad_caps |= PHY_AD_T4;
1239
1240         if (my_phy_caps & PHY_STAT_CAP_TXF)
1241                 my_ad_caps |= PHY_AD_TX_FDX;
1242
1243         if (my_phy_caps & PHY_STAT_CAP_TXH)
1244                 my_ad_caps |= PHY_AD_TX_HDX;
1245
1246         if (my_phy_caps & PHY_STAT_CAP_TF)
1247                 my_ad_caps |= PHY_AD_10_FDX;
1248
1249         if (my_phy_caps & PHY_STAT_CAP_TH)
1250                 my_ad_caps |= PHY_AD_10_HDX;
1251
1252         /* Update our Auto-Neg Advertisement Register */
1253         smc_write_phy_register (PHY_AD_REG, my_ad_caps);
1254
1255         PRINTK2 ("%s:phy caps=%x\n", SMC_DEV_NAME, my_phy_caps);
1256         PRINTK2 ("%s:phy advertised caps=%x\n", SMC_DEV_NAME, my_ad_caps);
1257
1258         /* Restart auto-negotiation process in order to advertise my caps */
1259         smc_write_phy_register (PHY_CNTL_REG,
1260                                 PHY_CNTL_ANEG_EN | PHY_CNTL_ANEG_RST);
1261
1262         /* Wait for the auto-negotiation to complete.  This may take from */
1263         /* 2 to 3 seconds. */
1264         /* Wait for the reset to complete, or time out */
1265         timeout = 20;           /* Wait up to 10 seconds */
1266         while (timeout--) {
1267                 status = smc_read_phy_register (PHY_STAT_REG);
1268                 if (status & PHY_STAT_ANEG_ACK) {
1269                         /* auto-negotiate complete */
1270                         break;
1271                 }
1272
1273                 smc_wait_ms (500);      /* wait 500 millisecs */
1274
1275                 /* Restart auto-negotiation if remote fault */
1276                 if (status & PHY_STAT_REM_FLT) {
1277                         printf ("%s:PHY remote fault detected\n",
1278                                 SMC_DEV_NAME);
1279
1280                         /* Restart auto-negotiation */
1281                         printf ("%s:PHY restarting auto-negotiation\n",
1282                                 SMC_DEV_NAME);
1283                         smc_write_phy_register (PHY_CNTL_REG,
1284                                                 PHY_CNTL_ANEG_EN |
1285                                                 PHY_CNTL_ANEG_RST |
1286                                                 PHY_CNTL_SPEED |
1287                                                 PHY_CNTL_DPLX);
1288                 }
1289         }
1290
1291         if (timeout < 1) {
1292                 printf ("%s:PHY auto-negotiate timed out\n", SMC_DEV_NAME);
1293                 printf ("%s:PHY auto-negotiate timed out\n", SMC_DEV_NAME);
1294                 failed = 1;
1295         }
1296
1297         /* Fail if we detected an auto-negotiate remote fault */
1298         if (status & PHY_STAT_REM_FLT) {
1299                 printf ("%s:PHY remote fault detected\n", SMC_DEV_NAME);
1300                 printf ("%s:PHY remote fault detected\n", SMC_DEV_NAME);
1301                 failed = 1;
1302         }
1303
1304         /* Re-Configure the Receive/Phy Control register */
1305         SMC_outw (RPC_DEFAULT, RPC_REG);
1306
1307       smc_phy_configure_exit:
1308
1309 }
1310 #endif /* !CONFIG_SMC91111_EXT_PHY */
1311
1312
1313 #if SMC_DEBUG > 2
1314 static void print_packet( byte * buf, int length )
1315 {
1316         int i;
1317         int remainder;
1318         int lines;
1319
1320         printf("Packet of length %d \n", length );
1321
1322 #if SMC_DEBUG > 3
1323         lines = length / 16;
1324         remainder = length % 16;
1325
1326         for ( i = 0; i < lines ; i ++ ) {
1327                 int cur;
1328
1329                 for ( cur = 0; cur < 8; cur ++ ) {
1330                         byte a, b;
1331
1332                         a = *(buf ++ );
1333                         b = *(buf ++ );
1334                         printf("%02x%02x ", a, b );
1335                 }
1336                 printf("\n");
1337         }
1338         for ( i = 0; i < remainder/2 ; i++ ) {
1339                 byte a, b;
1340
1341                 a = *(buf ++ );
1342                 b = *(buf ++ );
1343                 printf("%02x%02x ", a, b );
1344         }
1345         printf("\n");
1346 #endif
1347 }
1348 #endif
1349
1350 int eth_init(bd_t *bd) {
1351         return (smc_open(bd));
1352 }
1353
1354 void eth_halt() {
1355         smc_close();
1356 }
1357
1358 int eth_rx() {
1359         return smc_rcv();
1360 }
1361
1362 int eth_send(volatile void *packet, int length) {
1363         return smc_send_packet(packet, length);
1364 }
1365
1366 int smc_get_ethaddr (bd_t * bd)
1367 {
1368         int env_size, rom_valid, env_present = 0, reg;
1369         char *s = NULL, *e, *v_mac, es[] = "11:22:33:44:55:66";
1370         uchar s_env_mac[64], v_env_mac[6], v_rom_mac[6];
1371
1372         env_size = getenv_r ("ethaddr", s_env_mac, sizeof (s_env_mac));
1373         if ((env_size > 0) && (env_size < sizeof (es))) {       /* exit if env is bad */
1374                 printf ("\n*** ERROR: ethaddr is not set properly!!\n");
1375                 return (-1);
1376         }
1377
1378         if (env_size > 0) {
1379                 env_present = 1;
1380                 s = s_env_mac;
1381         }
1382
1383         for (reg = 0; reg < 6; ++reg) { /* turn string into mac value */
1384                 v_env_mac[reg] = s ? simple_strtoul (s, &e, 16) : 0;
1385                 if (s)
1386                         s = (*e) ? e + 1 : e;
1387         }
1388
1389         rom_valid = get_rom_mac (v_rom_mac);    /* get ROM mac value if any */
1390
1391         if (!env_present) {     /* if NO env */
1392                 if (rom_valid) {        /* but ROM is valid */
1393                         v_mac = v_rom_mac;
1394                         sprintf (s_env_mac, "%02X:%02X:%02X:%02X:%02X:%02X",
1395                                  v_mac[0], v_mac[1], v_mac[2], v_mac[3],
1396                                  v_mac[4], v_mac[5]);
1397                         setenv ("ethaddr", s_env_mac);
1398                 } else {        /* no env, bad ROM */
1399                         printf ("\n*** ERROR: ethaddr is NOT set !!\n");
1400                         return (-1);
1401                 }
1402         } else {                /* good env, don't care ROM */
1403                 v_mac = v_env_mac;      /* always use a good env over a ROM */
1404         }
1405
1406         if (env_present && rom_valid) { /* if both env and ROM are good */
1407                 if (memcmp (v_env_mac, v_rom_mac, 6) != 0) {
1408                         printf ("\nWarning: MAC addresses don't match:\n");
1409                         printf ("\tHW MAC address:  "
1410                                 "%02X:%02X:%02X:%02X:%02X:%02X\n",
1411                                 v_rom_mac[0], v_rom_mac[1],
1412                                 v_rom_mac[2], v_rom_mac[3],
1413                                 v_rom_mac[4], v_rom_mac[5] );
1414                         printf ("\t\"ethaddr\" value: "
1415                                 "%02X:%02X:%02X:%02X:%02X:%02X\n",
1416                                 v_env_mac[0], v_env_mac[1],
1417                                 v_env_mac[2], v_env_mac[3],
1418                                 v_env_mac[4], v_env_mac[5]) ;
1419                         debug ("### Set MAC addr from environment\n");
1420                 }
1421         }
1422         memcpy (bd->bi_enetaddr, v_mac, 6);     /* update global address to match env (allows env changing) */
1423         smc_set_mac_addr (v_mac);       /* use old function to update smc default */
1424         PRINTK("Using MAC Address %02X:%02X:%02X:%02X:%02X:%02X\n", v_mac[0], v_mac[1],
1425                 v_mac[2], v_mac[3], v_mac[4], v_mac[5]);
1426         return (0);
1427 }
1428
1429 int get_rom_mac (char *v_rom_mac)
1430 {
1431 #ifdef HARDCODE_MAC     /* used for testing or to supress run time warnings */
1432         char hw_mac_addr[] = { 0x02, 0x80, 0xad, 0x20, 0x31, 0xb8 };
1433
1434         memcpy (v_rom_mac, hw_mac_addr, 6);
1435         return (1);
1436 #else
1437         int i;
1438         SMC_SELECT_BANK (1);
1439         for (i=0; i<6; i++)
1440         {
1441                 v_rom_mac[i] = SMC_inb (ADDR0_REG + i);
1442         }
1443         return (1);
1444 #endif
1445 }
1446 #endif /* CONFIG_DRIVER_SMC91111 */