]> git.sur5r.net Git - u-boot/blobdiff - drivers/net/smc91111.c
Merge branch 'master' of git://git.denx.de/u-boot-sunxi
[u-boot] / drivers / net / smc91111.c
index ba9c67e4c903478a82ba690e513bf2925a7d25a7..5754c3106c9817f6d312f353d5a2fcdb8127dd77 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*------------------------------------------------------------------------
  . smc91111.c
  . This is a driver for SMSC's 91C111 single-chip Ethernet device.
  .      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
  .
  . 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;
@@ -514,15 +499,8 @@ again:
        }
 
        /* we have a packet address, so tell the card to use it */
-#ifndef CONFIG_XAENIAX
        SMC_outb (dev, packet_no, PN_REG);
-#else
-       /* On Xaeniax board, we can't use SMC_outb here because that way
-        * the Allocate MMU command will end up written to the command register
-        * as well, which will lead to a problem.
-        */
-       SMC_outl (dev, packet_no << 16, 0);
-#endif
+
        /* do not write new ptr value if Write data fifo not empty */
        while ( saved_ptr & PTR_NOTEMPTY )
                printf ("Write data fifo not empty!\n");
@@ -557,39 +535,19 @@ again:
         */
 #ifdef USE_32_BIT
        SMC_outsl (dev, SMC91111_DATA_REG, buf, length >> 2);
-#ifndef CONFIG_XAENIAX
        if (length & 0x2)
                SMC_outw (dev, *((word *) (buf + (length & 0xFFFFFFFC))),
                          SMC91111_DATA_REG);
-#else
-       /* On XANEIAX, we can only use 32-bit writes, so we need to handle
-        * unaligned tail part specially. The standard code doesn't work.
-        */
-       if ((length & 3) == 3) {
-               u16 * ptr = (u16*) &buf[length-3];
-               SMC_outl(dev, (*ptr) | ((0x2000 | buf[length-1]) << 16),
-                               SMC91111_DATA_REG);
-       } else if ((length & 2) == 2) {
-               u16 * ptr = (u16*) &buf[length-2];
-               SMC_outl(dev, *ptr, SMC91111_DATA_REG);
-       } else if (length & 1) {
-               SMC_outl(dev, (0x2000 | buf[length-1]), SMC91111_DATA_REG);
-       } else {
-               SMC_outl(dev, 0, SMC91111_DATA_REG);
-       }
-#endif
 #else
        SMC_outsw (dev, SMC91111_DATA_REG, buf, (length) >> 1);
 #endif /* USE_32_BIT */
 
-#ifndef CONFIG_XAENIAX
        /* Send the last byte, if there is one.   */
        if ((length & 1) == 0) {
                SMC_outw (dev, 0, SMC91111_DATA_REG);
        } else {
                SMC_outw (dev, buf[length - 1] | 0x2000, SMC91111_DATA_REG);
        }
-#endif
 
        /* and let the chipset deal with it */
        SMC_outw (dev, MC_ENQUEUE, MMU_CMD_REG);
@@ -603,9 +561,6 @@ again:
 
                /* release packet */
                /* no need to release, MMU does that now */
-#ifdef CONFIG_XAENIAX
-                SMC_outw (dev, MC_FREEPKT, MMU_CMD_REG);
-#endif
 
                /* wait for MMU getting ready (low) */
                while (SMC_inw (dev, MMU_CMD_REG) & MC_BUSY) {
@@ -625,9 +580,6 @@ again:
 
                /* release packet */
                /* no need to release, MMU does that now */
-#ifdef CONFIG_XAENIAX
-               SMC_outw (dev, MC_FREEPKT, MMU_CMD_REG);
-#endif
 
                /* wait for MMU getting ready (low) */
                while (SMC_inw (dev, MMU_CMD_REG) & MC_BUSY) {
@@ -640,15 +592,7 @@ again:
        }
 
        /* restore previously saved registers */
-#ifndef CONFIG_XAENIAX
        SMC_outb( dev, saved_pnr, PN_REG );
-#else
-       /* On Xaeniax board, we can't use SMC_outb here because that way
-        * the Allocate MMU command will end up written to the command register
-        * as well, which will lead to a problem.
-        */
-       SMC_outl(dev, saved_pnr << 16, 0);
-#endif
        SMC_outw( dev, saved_ptr, PTR_REG );
 
        return length;
@@ -771,35 +715,35 @@ static int smc_rcv(struct eth_device *dev)
 
 
 #ifdef USE_32_BIT
-               PRINTK3(" Reading %d dwords (and %d bytes) \n",
+               PRINTK3(" Reading %d dwords (and %d bytes)\n",
                        packet_length >> 2, packet_length & 3 );
                /* QUESTION:  Like in the TX routine, do I want
                   to send the DWORDs or the bytes first, or some
                   mixture.  A mixture might improve already slow PIO
                   performance  */
-               SMC_insl( dev, SMC91111_DATA_REG, NetRxPackets[0],
-                       packet_length >> 2 );
+               SMC_insl(dev, SMC91111_DATA_REG, net_rx_packets[0],
+                        packet_length >> 2);
                /* read the left over bytes */
                if (packet_length & 3) {
                        int i;
 
-                       byte *tail = (byte *)(NetRxPackets[0] +
+                       byte *tail = (byte *)(net_rx_packets[0] +
                                (packet_length & ~3));
                        dword leftover = SMC_inl(dev, SMC91111_DATA_REG);
                        for (i=0; i<(packet_length & 3); i++)
                                *tail++ = (byte) (leftover >> (8*i)) & 0xff;
                }
 #else
-               PRINTK3(" Reading %d words and %d byte(s) \n",
+               PRINTK3(" Reading %d words and %d byte(s)\n",
                        (packet_length >> 1 ), packet_length & 1 );
-               SMC_insw(dev, SMC91111_DATA_REG , NetRxPackets[0],
-                       packet_length >> 1);
+               SMC_insw(dev, SMC91111_DATA_REG , net_rx_packets[0],
+                        packet_length >> 1);
 
 #endif /* USE_32_BIT */
 
 #if    SMC_DEBUG > 2
                printf("Receiving Packet\n");
-               print_packet( NetRxPackets[0], packet_length );
+               print_packet(net_rx_packets[0], packet_length);
 #endif
        } else {
                /* error ... */
@@ -817,20 +761,12 @@ static int smc_rcv(struct eth_device *dev)
                udelay(1); /* Wait until not busy */
 
        /* restore saved registers */
-#ifndef CONFIG_XAENIAX
        SMC_outb( dev, saved_pnr, PN_REG );
-#else
-       /* On Xaeniax board, we can't use SMC_outb here because that way
-        * the Allocate MMU command will end up written to the command register
-        * as well, which will lead to a problem.
-        */
-       SMC_outl( dev, saved_pnr << 16, 0);
-#endif
        SMC_outw( dev, saved_ptr, PTR_REG );
 
        if (!is_error) {
                /* Pass the packet up to the protocol layers. */
-               NetReceive(NetRxPackets[0], packet_length);
+               net_process_received_packet(net_rx_packets[0], packet_length);
                return packet_length;
        } else {
                return 0;
@@ -1168,17 +1104,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.
@@ -1187,18 +1112,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);
 
@@ -1211,7 +1130,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) {
@@ -1276,7 +1195,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) {
@@ -1296,13 +1215,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 */