X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fnet%2Fsmc91111.c;h=57c667a58a8dc0e338779e9e8cc75b8e4640c384;hb=1c68d01eea92137482b980318e2a7f7c0ebef2d4;hp=54a1bfb2a9237518b8815e2c1c3ffef7dbc5122e;hpb=7194ab809532eeca3e2ee5dc12017cb901cc5842;p=u-boot diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c index 54a1bfb2a9..57c667a58a 100644 --- a/drivers/net/smc91111.c +++ b/drivers/net/smc91111.c @@ -10,19 +10,7 @@ . Developed by Simple Network Magic Corporation (SNMC) . Copyright (C) 1996 by Erik Stahlman (ES) . - . This program 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 of the License, or - . (at your option) any later version. - . - . This program 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 this program; if not, write to the Free Software - . Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * SPDX-License-Identifier: GPL-2.0+ . . Information contained in this file was obtained from the LAN91C111 . manual from SMC. To get a copy, if you really want one, you can find @@ -178,8 +166,6 @@ static void smc_phy_configure(struct eth_device *dev); * inx,outx functions fixed this problem. */ -#define barrier() __asm__ __volatile__("": : :"memory") - static inline word SMC_inw(struct eth_device *dev, dword offset) { word v; @@ -426,8 +412,7 @@ static void smc_halt(struct eth_device *dev) . Enable the transmit interrupt, so I know if it failed . Free the kernel data if I actually sent it. */ -static int smc_send(struct eth_device *dev, volatile void *packet, - int packet_length) +static int smc_send(struct eth_device *dev, void *packet, int packet_length) { byte packet_no; byte *buf; @@ -654,6 +639,28 @@ again: return length; } +static int smc_write_hwaddr(struct eth_device *dev) +{ + int i; + + swap_to(ETHERNET); + SMC_SELECT_BANK (dev, 1); +#ifdef USE_32_BIT + for (i = 0; i < 6; i += 2) { + word address; + + address = dev->enetaddr[i + 1] << 8; + address |= dev->enetaddr[i]; + SMC_outw(dev, address, (ADDR0_REG + i)); + } +#else + for (i = 0; i < 6; i++) + SMC_outb(dev, dev->enetaddr[i], (ADDR0_REG + i)); +#endif + swap_to(FLASH); + return 0; +} + /* * Open and Initialize the board * @@ -662,8 +669,6 @@ again: */ static int smc_init(struct eth_device *dev, bd_t *bd) { - int i; - swap_to(ETHERNET); PRINTK2 ("%s: smc_init\n", SMC_DEV_NAME); @@ -680,20 +685,6 @@ static int smc_init(struct eth_device *dev, bd_t *bd) /* conservative setting (10Mbps, HalfDuplex, no AutoNeg.) */ /* SMC_SELECT_BANK(dev, 0); */ /* SMC_outw(dev, 0, RPC_REG); */ - SMC_SELECT_BANK (dev, 1); - -#ifdef USE_32_BIT - for (i = 0; i < 6; i += 2) { - word address; - - address = dev->enetaddr[i + 1] << 8; - address |= dev->enetaddr[i]; - SMC_outw(dev, address, (ADDR0_REG + i)); - } -#else - for (i = 0; i < 6; i++) - SMC_outb(dev, dev->enetaddr[i], (ADDR0_REG + i)); -#endif printf(SMC_DEV_NAME ": MAC %pM\n", dev->enetaddr); @@ -1162,17 +1153,6 @@ static void smc_write_phy_register (struct eth_device *dev, byte phyreg, #endif /* !CONFIG_SMC91111_EXT_PHY */ -/*------------------------------------------------------------ - . Waits the specified number of milliseconds - kernel friendly - .-------------------------------------------------------------*/ -#ifndef CONFIG_SMC91111_EXT_PHY -static void smc_wait_ms(unsigned int ms) -{ - udelay(ms*1000); -} -#endif /* !CONFIG_SMC91111_EXT_PHY */ - - /*------------------------------------------------------------ . Configures the specified PHY using Autonegotiation. Calls . smc_phy_fixed() if the user has requested a certain config. @@ -1181,18 +1161,12 @@ static void smc_wait_ms(unsigned int ms) static void smc_phy_configure (struct eth_device *dev) { int timeout; - byte phyaddr; word my_phy_caps; /* My PHY capabilities */ word my_ad_caps; /* My Advertised capabilities */ word status = 0; /*;my status = 0 */ - int failed = 0; PRINTK3 ("%s: smc_program_phy()\n", SMC_DEV_NAME); - - /* Get the detected phy address */ - phyaddr = SMC_PHY_ADDR; - /* Reset the PHY, setting all other bits to zero */ smc_write_phy_register (dev, PHY_CNTL_REG, PHY_CNTL_RST); @@ -1205,7 +1179,7 @@ static void smc_phy_configure (struct eth_device *dev) break; } - smc_wait_ms (500); /* wait 500 millisecs */ + mdelay(500); /* wait 500 millisecs */ } if (timeout < 1) { @@ -1270,7 +1244,7 @@ static void smc_phy_configure (struct eth_device *dev) break; } - smc_wait_ms (500); /* wait 500 millisecs */ + mdelay(500); /* wait 500 millisecs */ /* Restart auto-negotiation if remote fault */ if (status & PHY_STAT_REM_FLT) { @@ -1290,13 +1264,11 @@ static void smc_phy_configure (struct eth_device *dev) if (timeout < 1) { 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); - failed = 1; } /* Re-Configure the Receive/Phy Control register */ @@ -1360,6 +1332,7 @@ int smc91111_initialize(u8 dev_num, int base_addr) return 0; } + memset(dev, 0, sizeof(*dev)); priv->dev_num = dev_num; dev->priv = priv; dev->iobase = base_addr; @@ -1374,6 +1347,7 @@ int smc91111_initialize(u8 dev_num, int base_addr) dev->halt = smc_halt; dev->send = smc_send; dev->recv = smc_rcv; + dev->write_hwaddr = smc_write_hwaddr; sprintf(dev->name, "%s-%hu", SMC_DEV_NAME, dev_num); eth_register(dev);