[U-Boot-Users] [PATCH] smc91111
Robert Schwebel
robert at schwebel.de
Sat May 15 16:54:36 CEST 2004
ChangeLog:
* Patch by Robert Schwebel, 2003-05-14:
call mac address reading code also for SMSC91C111;
fix output of printks to use space after colon
consistently; make timeout configurable when no cable
is plugged in; remove duplicate printks
Robert
--
Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de
Pengutronix - Linux Solutions for Science and Industry
Handelsregister: Amtsgericht Hildesheim, HRA 2686
Hornemannstraße 12, 31137 Hildesheim, Germany
Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4
-------------- next part --------------
#
# Author: Robert Schwebel <r.schwebel at pengutronix.de>
#
# Description: ChangeLog:
#
# * Patch by Robert Schwebel, 2003-05-14:
# call mac address reading code also for SMSC91C111;
# fix output of printks to use space after colon
# consistently; don't wait for about 10 seconds timeout
# when no cable is plugged in; remove duplicate printks
#
# State: 2004-05-15: submitted
#
#
# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher
#
--- u-boot-maintainance1/lib_arm/board.c~submit-smsc91111 2004-05-14 19:02:46.000000000 +0200
+++ u-boot-maintainance1/lib_arm/board.c 2004-05-14 19:02:48.000000000 +0200
@@ -32,6 +32,13 @@
#include <version.h>
#include <net.h>
+#ifdef CONFIG_DRIVER_SMC91111
+#include "../drivers/smc91111.h"
+#endif
+#ifdef CONFIG_DRIVER_LAN91C96
+#include "../drivers/lan91c96.h"
+#endif
+
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
void nand_init (void);
#endif
@@ -58,9 +65,6 @@
extern void rtl8019_get_enetaddr (uchar * addr);
#endif
-#ifdef CONFIG_DRIVER_LAN91C96
-#include "../drivers/lan91c96.h"
-#endif
/*
* Begin and End of memory area for malloc(), and current "brk"
*/
@@ -302,12 +306,13 @@
cs8900_get_enetaddr (gd->bd->bi_enetaddr);
#endif
-#ifdef CONFIG_DRIVER_LAN91C96
+#if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96)
if (getenv ("ethaddr")) {
+ puts("Configuring MAC address for network card\n");
smc_set_mac_addr(gd->bd->bi_enetaddr);
}
- /* eth_hw_init(); */
-#endif /* CONFIG_DRIVER_LAN91C96 */
+ eth_init(gd->bd);
+#endif
/* Initialize from environment */
if ((s = getenv ("loadaddr")) != NULL) {
--- u-boot-maintainance1/drivers/smc91111.c~submit-smsc91111 2004-05-14 19:02:46.000000000 +0200
+++ u-boot-maintainance1/drivers/smc91111.c 2004-05-14 19:02:48.000000000 +0200
@@ -61,6 +61,7 @@
#include <common.h>
#include <command.h>
+#include <config.h>
#include "smc91111.h"
#include <net.h>
@@ -78,6 +79,11 @@
"smc91111.c:v1.0 04/25/01 by Daris A Nevil (dnevil at snmc.com)\n";
#endif
+/* Autonegotiation timeout in seconds */
+#ifndef CONFIG_SMC_AUTONEG_TIMEOUT
+#define CONFIG_SMC_AUTONEG_TIMEOUT 10
+#endif
+
/*------------------------------------------------------------------------
.
. Configuration options, for the experienced user to change.
@@ -353,7 +359,7 @@
*/
static void smc_reset (void)
{
- PRINTK2 ("%s:smc_reset\n", SMC_DEV_NAME);
+ PRINTK2 ("%s: smc_reset\n", SMC_DEV_NAME);
/* This resets the registers mostly to defaults, but doesn't
affect EEPROM. That seems unnecessary */
@@ -414,7 +420,7 @@
*/
static void smc_enable()
{
- PRINTK2("%s:smc_enable\n", SMC_DEV_NAME);
+ PRINTK2("%s: smc_enable\n", SMC_DEV_NAME);
SMC_SELECT_BANK( 0 );
/* see the header file for options in TCR/RCR DEFAULT*/
SMC_outw( TCR_DEFAULT, TCR_REG );
@@ -440,7 +446,7 @@
*/
static void smc_shutdown()
{
- PRINTK2(CARDNAME ":smc_shutdown\n");
+ PRINTK2(CARDNAME ": smc_shutdown\n");
/* no more interrupts for me */
SMC_SELECT_BANK( 2 );
@@ -489,7 +495,7 @@
saved_pnr = SMC_inb( PN_REG );
saved_ptr = SMC_inw( PTR_REG );
- PRINTK3 ("%s:smc_hardware_send_packet\n", SMC_DEV_NAME);
+ PRINTK3 ("%s: smc_hardware_send_packet\n", SMC_DEV_NAME);
length = ETH_ZLEN < packet_length ? packet_length : ETH_ZLEN;
@@ -677,7 +683,7 @@
*/
void smc_destructor()
{
- PRINTK2(CARDNAME ":smc_destructor\n");
+ PRINTK2(CARDNAME ": smc_destructor\n");
}
@@ -691,7 +697,7 @@
{
int i, err;
- PRINTK2 ("%s:smc_open\n", SMC_DEV_NAME);
+ PRINTK2 ("%s: smc_open\n", SMC_DEV_NAME);
/* reset the hardware */
smc_reset ();
@@ -764,7 +770,7 @@
return 0;
}
- PRINTK3("%s:smc_rcv\n", SMC_DEV_NAME);
+ PRINTK3("%s: smc_rcv\n", SMC_DEV_NAME);
/* start reading from the start of the packet */
SMC_outw( PTR_READ | PTR_RCV | PTR_AUTOINC, PTR_REG );
@@ -860,7 +866,7 @@
-----------------------------------------------------*/
static int smc_close()
{
- PRINTK2("%s:smc_close\n", SMC_DEV_NAME);
+ PRINTK2("%s: smc_close\n", SMC_DEV_NAME);
/* clear everything */
smc_shutdown();
@@ -1222,7 +1228,7 @@
word status = 0; /*;my status = 0 */
int failed = 0;
- PRINTK3 ("%s:smc_program_phy()\n", SMC_DEV_NAME);
+ PRINTK3 ("%s: smc_program_phy()\n", SMC_DEV_NAME);
/* Get the detected phy address */
@@ -1286,8 +1292,8 @@
/* the link does not come up. */
smc_read_phy_register(PHY_AD_REG);
- PRINTK2 ("%s:phy caps=%x\n", SMC_DEV_NAME, my_phy_caps);
- PRINTK2 ("%s:phy advertised caps=%x\n", SMC_DEV_NAME, my_ad_caps);
+ PRINTK2 ("%s: phy caps=%x\n", SMC_DEV_NAME, my_phy_caps);
+ PRINTK2 ("%s: phy advertised caps=%x\n", SMC_DEV_NAME, my_ad_caps);
/* Restart auto-negotiation process in order to advertise my caps */
smc_write_phy_register (PHY_CNTL_REG,
@@ -1296,8 +1302,9 @@
/* Wait for the auto-negotiation to complete. This may take from */
/* 2 to 3 seconds. */
/* Wait for the reset to complete, or time out */
- timeout = 20; /* Wait up to 10 seconds */
+ timeout = CONFIG_SMC_AUTONEG_TIMEOUT * 2;
while (timeout--) {
+
status = smc_read_phy_register (PHY_STAT_REG);
if (status & PHY_STAT_ANEG_ACK) {
/* auto-negotiate complete */
@@ -1308,11 +1315,11 @@
/* Restart auto-negotiation if remote fault */
if (status & PHY_STAT_REM_FLT) {
- printf ("%s:PHY remote fault detected\n",
+ printf ("%s: PHY remote fault detected\n",
SMC_DEV_NAME);
/* Restart auto-negotiation */
- printf ("%s:PHY restarting auto-negotiation\n",
+ printf ("%s: PHY restarting auto-negotiation\n",
SMC_DEV_NAME);
smc_write_phy_register (PHY_CNTL_REG,
PHY_CNTL_ANEG_EN |
@@ -1323,15 +1330,13 @@
}
if (timeout < 1) {
- printf ("%s:PHY auto-negotiate timed out\n", SMC_DEV_NAME);
- printf ("%s:PHY auto-negotiate timed out\n", SMC_DEV_NAME);
+ printf ("%s: PHY auto-negotiate timed out\n", SMC_DEV_NAME);
failed = 1;
}
/* Fail if we detected an auto-negotiate remote fault */
if (status & PHY_STAT_REM_FLT) {
- printf ("%s:PHY remote fault detected\n", SMC_DEV_NAME);
- printf ("%s:PHY remote fault detected\n", SMC_DEV_NAME);
+ printf ("%s: PHY remote fault detected\n", SMC_DEV_NAME);
failed = 1;
}
@@ -1469,12 +1474,16 @@
return (1);
#else
int i;
+ int valid_mac = 0;
+
SMC_SELECT_BANK (1);
for (i=0; i<6; i++)
{
v_rom_mac[i] = SMC_inb (ADDR0_REG + i);
+ valid_mac |= v_rom_mac[i];
}
- return (1);
+
+ return (valid_mac ? 1 : 0);
#endif
}
#endif /* CONFIG_DRIVER_SMC91111 */
--- u-boot-maintainance1/include/configs/innokom.h~submit-smsc91111 2004-05-14 19:02:46.000000000 +0200
+++ u-boot-maintainance1/include/configs/innokom.h 2004-05-14 19:17:19.000000000 +0200
@@ -140,6 +140,7 @@
#define CONFIG_SMC91111_BASE 0x14000000 /* chip select 5 */
#undef CONFIG_SMC_USE_32_BIT /* 16 bit bus access */
#undef CONFIG_SMC_91111_EXT_PHY /* we use internal phy */
+#define CONFIG_SMC_AUTONEG_TIMEOUT 10 /* timeout 10 seconds */
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 /* # of retries */
More information about the U-Boot
mailing list