]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/net/ns8382x.c
arm: mx6: add support for i.MX6ULL
[karo-tx-uboot.git] / drivers / net / ns8382x.c
index f8b143a01a60f25282440776c0c138d21fc4cb16..f941c15b2704f8c843e600959e2c7c2cf9517350 100644 (file)
 /* Revision History
  * October 2002 mar    1.0
  *   Initial U-Boot Release.
- *     Tested with Netgear GA622T (83820)
- *     and SMC9452TX (83821)
- *     NOTE: custom boards with these chips may (likely) require
- *     a programmed EEPROM device (if present) in order to work
- *     correctly.
+ *     Tested with Netgear GA622T (83820)
+ *     and SMC9452TX (83821)
+ *     NOTE: custom boards with these chips may (likely) require
+ *     a programmed EEPROM device (if present) in order to work
+ *     correctly.
 */
 
 /* Includes */
 #include <common.h>
 #include <malloc.h>
 #include <net.h>
+#include <netdev.h>
 #include <asm/io.h>
 #include <pci.h>
 
-#if defined(CONFIG_CMD_NET) \
-       && defined(CONFIG_NET_MULTI) && defined(CONFIG_NS8382X)
-
 /* defines */
 #define DSIZE     0x00000FFF
 #define ETH_ALEN               6
@@ -115,50 +113,50 @@ enum ChipConfigBits {
 #define SpeedStatus_Polarity ( GigSpeed | HundSpeed | FullDuplex)
 
 enum TxConfig_bits {
-       TxDrthMask      = 0x000000ff,
-       TxFlthMask      = 0x0000ff00,
+       TxDrthMask      = 0x000000ff,
+       TxFlthMask      = 0x0000ff00,
        TxMxdmaMask     = 0x00700000,
-       TxMxdma_8       = 0x00100000,
-       TxMxdma_16      = 0x00200000,
-       TxMxdma_32      = 0x00300000,
-       TxMxdma_64      = 0x00400000,
-       TxMxdma_128     = 0x00500000,
-       TxMxdma_256     = 0x00600000,
-       TxMxdma_512     = 0x00700000,
-       TxMxdma_1024    = 0x00000000,
-       TxCollRetry     = 0x00800000,
-       TxAutoPad       = 0x10000000,
-       TxMacLoop       = 0x20000000,
-       TxHeartIgn      = 0x40000000,
-       TxCarrierIgn    = 0x80000000
+       TxMxdma_8       = 0x00100000,
+       TxMxdma_16      = 0x00200000,
+       TxMxdma_32      = 0x00300000,
+       TxMxdma_64      = 0x00400000,
+       TxMxdma_128     = 0x00500000,
+       TxMxdma_256     = 0x00600000,
+       TxMxdma_512     = 0x00700000,
+       TxMxdma_1024    = 0x00000000,
+       TxCollRetry     = 0x00800000,
+       TxAutoPad       = 0x10000000,
+       TxMacLoop       = 0x20000000,
+       TxHeartIgn      = 0x40000000,
+       TxCarrierIgn    = 0x80000000
 };
 
 enum RxConfig_bits {
-       RxDrthMask      = 0x0000003e,
-       RxMxdmaMask     = 0x00700000,
-       RxMxdma_8       = 0x00100000,
-       RxMxdma_16      = 0x00200000,
-       RxMxdma_32      = 0x00300000,
-       RxMxdma_64      = 0x00400000,
-       RxMxdma_128     = 0x00500000,
-       RxMxdma_256     = 0x00600000,
-       RxMxdma_512     = 0x00700000,
-       RxMxdma_1024    = 0x00000000,
-       RxAcceptLenErr  = 0x04000000,
-       RxAcceptLong    = 0x08000000,
-       RxAcceptTx      = 0x10000000,
-       RxStripCRC      = 0x20000000,
-       RxAcceptRunt    = 0x40000000,
-       RxAcceptErr     = 0x80000000,
+       RxDrthMask      = 0x0000003e,
+       RxMxdmaMask     = 0x00700000,
+       RxMxdma_8       = 0x00100000,
+       RxMxdma_16      = 0x00200000,
+       RxMxdma_32      = 0x00300000,
+       RxMxdma_64      = 0x00400000,
+       RxMxdma_128     = 0x00500000,
+       RxMxdma_256     = 0x00600000,
+       RxMxdma_512     = 0x00700000,
+       RxMxdma_1024    = 0x00000000,
+       RxAcceptLenErr  = 0x04000000,
+       RxAcceptLong    = 0x08000000,
+       RxAcceptTx      = 0x10000000,
+       RxStripCRC      = 0x20000000,
+       RxAcceptRunt    = 0x40000000,
+       RxAcceptErr     = 0x80000000,
 };
 
 /* Bits in the RxMode register. */
 enum rx_mode_bits {
-       RxFilterEnable          = 0x80000000,
-       AcceptAllBroadcast      = 0x40000000,
-       AcceptAllMulticast      = 0x20000000,
-       AcceptAllUnicast        = 0x10000000,
-       AcceptPerfectMatch      = 0x08000000,
+       RxFilterEnable          = 0x80000000,
+       AcceptAllBroadcast      = 0x40000000,
+       AcceptAllMulticast      = 0x20000000,
+       AcceptAllUnicast        = 0x10000000,
+       AcceptPerfectMatch      = 0x08000000,
 };
 
 typedef struct _BufferDesc {
@@ -260,8 +258,7 @@ static void ns8382x_init_txd(struct eth_device *dev);
 static void ns8382x_init_rxd(struct eth_device *dev);
 static void ns8382x_set_rx_mode(struct eth_device *dev);
 static void ns8382x_check_duplex(struct eth_device *dev);
-static int ns8382x_send(struct eth_device *dev, volatile void *packet,
-                       int length);
+static int ns8382x_send(struct eth_device *dev, void *packet, int length);
 static int ns8382x_poll(struct eth_device *dev);
 static void ns8382x_disable(struct eth_device *dev);
 
@@ -301,7 +298,7 @@ OUTL(struct eth_device *dev, int command, u_long addr)
  * Description: Retrieves the MAC address of the card, and sets up some
  *  globals required by other routines, and initializes the NIC, making it
  *  ready to send and receive packets.
- * Side effects: initializes ns8382xs, ready to recieve packets.
+ * Side effects: initializes ns8382xs, ready to receive packets.
  * Returns:   int:          number of cards found
  */
 
@@ -324,9 +321,7 @@ ns8382x_initialize(bd_t * bis)
                pci_read_config_dword(devno, PCI_BASE_ADDRESS_1, &iobase);
                iobase &= ~0x3; /* 1: unused and 0:I/O Space Indicator */
 
-#ifdef NS8382X_DEBUG
-               printf("ns8382x: NatSemi dp8382x @ 0x%x\n", iobase);
-#endif
+               debug("ns8382x: NatSemi dp8382x @ 0x%x\n", iobase);
 
                pci_write_config_dword(devno, PCI_COMMAND,
                                       PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
@@ -342,6 +337,11 @@ ns8382x_initialize(bd_t * bis)
                }
 
                dev = (struct eth_device *) malloc(sizeof *dev);
+               if (!dev) {
+                       printf("ns8382x: Can not allocate memory\n");
+                       break;
+               }
+               memset(dev, 0, sizeof(*dev));
 
                sprintf(dev->name, "dp8382x#%d", card_number);
                dev->iobase = bus_to_phys(iobase);
@@ -379,11 +379,9 @@ ns8382x_initialize(bd_t * bis)
                                rev = mdio_read(dev, phyAddress, PHYIDR2);
                                if ((rev & ~(0x000f)) == 0x00005c50 ||
                                    (rev & ~(0x000f)) == 0x00005c60) {
-#ifdef NS8382X_DEBUG
-                                       printf("phy rev is %x\n", rev);
-                                       printf("phy address is %x\n",
+                                       debug("phy rev is %x\n", rev);
+                                       debug("phy address is %x\n",
                                               phyAddress);
-#endif
                                        break;
                                }
                        }
@@ -408,21 +406,21 @@ ns8382x_initialize(bd_t * bis)
                OUTL(dev, (chip_config & ~(PhyDis)), ChipConfig);
 
                mdio_sync(dev, EECtrl);
-#ifdef NS8382X_DEBUG
+
                {
                        u32 chpcfg =
                            INL(dev, ChipConfig) ^ SpeedStatus_Polarity;
 
-                       printf("%s: Transceiver 10%s %s duplex.\n", dev->name,
+                       debug("%s: Transceiver 10%s %s duplex.\n", dev->name,
                               (chpcfg & GigSpeed) ? "00" : (chpcfg & HundSpeed)
                               ? "0" : "",
                               chpcfg & FullDuplex ? "full" : "half");
-                       printf("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
+                       debug("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
                               dev->enetaddr[0], dev->enetaddr[1],
                               dev->enetaddr[2], dev->enetaddr[3],
                               dev->enetaddr[4], dev->enetaddr[5]);
                }
-#endif
+
                /* Disable PME:
                 * The PME bit is initialized from the EEPROM contents.
                 * PCI cards probably have PME disabled, but motherboard
@@ -447,7 +445,7 @@ ns8382x_initialize(bd_t * bis)
        Read and write MII registers using software-generated serial MDIO
        protocol.  See the MII specifications or DP83840A data sheet for details.
 
-       The maximum data clock rate is 2.5 Mhz.  To meet minimum timing we
+       The maximum data clock rate is 2.5 MHz.  To meet minimum timing we
        must flush writes to the PCI bus with a PCI read. */
 #define mdio_delay(mdio_addr) INL(dev, mdio_addr)
 
@@ -527,7 +525,7 @@ mdio_write(struct eth_device *dev, int phy_id, int addr, int value)
  * Description: resets the ethernet controller chip and configures
  *    registers and data structures required for sending and receiving packets.
  * Arguments: struct eth_device *dev:       NIC data structure
- * returns:    int.
+ * returns:    int.
  */
 
 static int
@@ -560,10 +558,10 @@ ns8382x_init(struct eth_device *dev, bd_t * bis)
        tx_config = TxCarrierIgn | TxHeartIgn | TxAutoPad
            | TxCollRetry | TxMxdma_1024 | (0x1002);
        rx_config = RxMxdma_1024 | 0x20;
-#ifdef NS8382X_DEBUG
-       printf("%s: Setting TxConfig Register %#08X\n", dev->name, tx_config);
-       printf("%s: Setting RxConfig Register %#08X\n", dev->name, rx_config);
-#endif
+
+       debug("%s: Setting TxConfig Register %#08X\n", dev->name, tx_config);
+       debug("%s: Setting RxConfig Register %#08X\n", dev->name, rx_config);
+
        OUTL(dev, tx_config, TxConfig);
        OUTL(dev, rx_config, RxConfig);
 
@@ -626,10 +624,9 @@ ns8382x_init_txd(struct eth_device *dev)
 
        OUTL(dev, 0x0, TxRingPtrHi);
        OUTL(dev, phys_to_bus((u32)&txd), TxRingPtr);
-#ifdef NS8382X_DEBUG
-       printf("ns8382x_init_txd: TX descriptor register loaded with: %#08X (&txd: %p)\n",
+
+       debug("ns8382x_init_txd: TX descriptor register loaded with: %#08X (&txd: %p)\n",
               INL(dev, TxRingPtr), &txd);
-#endif
 }
 
 /* Function: ns8382x_init_rxd
@@ -655,19 +652,16 @@ ns8382x_init_rxd(struct eth_device *dev)
                rxd[i].extsts = cpu_to_le32((u32) 0x0);
                rxd[i].cmdsts = cpu_to_le32((u32) RX_BUF_SIZE);
                rxd[i].bufptr = cpu_to_le32((u32) & rxb[i * RX_BUF_SIZE]);
-#ifdef NS8382X_DEBUG
-               printf
+
+               debug
                    ("ns8382x_init_rxd: rxd[%d]=%p link=%X cmdsts=%X bufptr=%X\n",
                     i, &rxd[i], le32_to_cpu(rxd[i].link),
                     le32_to_cpu(rxd[i].cmdsts), le32_to_cpu(rxd[i].bufptr));
-#endif
        }
        OUTL(dev, phys_to_bus((u32) & rxd), RxRingPtr);
 
-#ifdef NS8382X_DEBUG
-       printf("ns8382x_init_rxd: RX descriptor register loaded with: %X\n",
+       debug("ns8382x_init_rxd: RX descriptor register loaded with: %X\n",
               INL(dev, RxRingPtr));
-#endif
 }
 
 /* Function: ns8382x_set_rx_mode
@@ -705,11 +699,11 @@ ns8382x_check_duplex(struct eth_device *dev)
        duplex = (config & FullDuplex) ? 1 : 0;
        gig = (config & GigSpeed) ? 1 : 0;
        hun = (config & HundSpeed) ? 1 : 0;
-#ifdef NS8382X_DEBUG
-       printf("%s: Setting 10%s %s-duplex based on negotiated link"
+
+       debug("%s: Setting 10%s %s-duplex based on negotiated link"
               " capability.\n", dev->name, (gig) ? "00" : (hun) ? "0" : "",
               duplex ? "full" : "half");
-#endif
+
        if (duplex) {
                rx_config |= RxAcceptTx;
                tx_config |= (TxCarrierIgn | TxHeartIgn);
@@ -717,10 +711,10 @@ ns8382x_check_duplex(struct eth_device *dev)
                rx_config &= ~RxAcceptTx;
                tx_config &= ~(TxCarrierIgn | TxHeartIgn);
        }
-#ifdef NS8382X_DEBUG
-       printf("%s: Resetting TxConfig Register %#08X\n", dev->name, tx_config);
-       printf("%s: Resetting RxConfig Register %#08X\n", dev->name, rx_config);
-#endif
+
+       debug("%s: Resetting TxConfig Register %#08X\n", dev->name, tx_config);
+       debug("%s: Resetting RxConfig Register %#08X\n", dev->name, rx_config);
+
        OUTL(dev, tx_config, TxConfig);
        OUTL(dev, rx_config, RxConfig);
 
@@ -732,26 +726,23 @@ ns8382x_check_duplex(struct eth_device *dev)
        else
                config &= ~Mode1000;
 
-#ifdef NS8382X_DEBUG
-       printf("%s: %setting Mode1000\n", dev->name, (gig) ? "S" : "Uns");
-#endif
+       debug("%s: %setting Mode1000\n", dev->name, (gig) ? "S" : "Uns");
+
        OUTL(dev, config, ChipConfig);
 }
 
 /* Function: ns8382x_send
  * Description: transmits a packet and waits for completion or timeout.
  * Returns:   void.  */
-static int
-ns8382x_send(struct eth_device *dev, volatile void *packet, int length)
+static int ns8382x_send(struct eth_device *dev, void *packet, int length)
 {
        u32 i, status = 0;
        vu_long tx_stat = 0;
 
        /* Stop the transmitter */
        OUTL(dev, TxOff, ChipCmd);
-#ifdef NS8382X_DEBUG
-       printf("ns8382x_send: sending %d bytes\n", (int)length);
-#endif
+
+       debug("ns8382x_send: sending %d bytes\n", (int)length);
 
        /* set the transmit buffer descriptor and enable Transmit State Machine */
        txd.link = cpu_to_le32(0x0);
@@ -761,34 +752,33 @@ ns8382x_send(struct eth_device *dev, volatile void *packet, int length)
 
        /* load Transmit Descriptor Register */
        OUTL(dev, phys_to_bus((u32) & txd), TxRingPtr);
-#ifdef NS8382X_DEBUG
-       printf("ns8382x_send: TX descriptor register loaded with: %#08X\n",
+
+       debug("ns8382x_send: TX descriptor register loaded with: %#08X\n",
               INL(dev, TxRingPtr));
-       printf("\ttxd.link:%X\tbufp:%X\texsts:%X\tcmdsts:%X\n",
+       debug("\ttxd.link:%X\tbufp:%X\texsts:%X\tcmdsts:%X\n",
               le32_to_cpu(txd.link), le32_to_cpu(txd.bufptr),
               le32_to_cpu(txd.extsts), le32_to_cpu(txd.cmdsts));
-#endif
+
        /* restart the transmitter */
        OUTL(dev, TxOn, ChipCmd);
 
        for (i = 0; (tx_stat = le32_to_cpu(txd.cmdsts)) & DescOwn; i++) {
                if (i >= TOUT_LOOP) {
-                       printf ("%s: tx error buffer not ready: txd.cmdsts %#X\n",
+                       printf ("%s: tx error buffer not ready: txd.cmdsts %#lX\n",
                             dev->name, tx_stat);
                        goto Done;
                }
        }
 
        if (!(tx_stat & DescPktOK)) {
-               printf("ns8382x_send: Transmit error, Tx status %X.\n", tx_stat);
+               printf("ns8382x_send: Transmit error, Tx status %lX.\n", tx_stat);
                goto Done;
        }
-#ifdef NS8382X_DEBUG
-       printf("ns8382x_send: tx_stat: %#08X\n", tx_stat);
-#endif
+
+       debug("ns8382x_send: tx_stat: %#08lX\n", tx_stat);
 
        status = 1;
-      Done:
+Done:
        return status;
 }
 
@@ -811,19 +801,21 @@ ns8382x_poll(struct eth_device *dev)
 
        if (!(rx_status & (u32) DescOwn))
                return retstat;
-#ifdef NS8382X_DEBUG
-       printf("ns8382x_poll: got a packet: cur_rx:%u, status:%lx\n",
+
+       debug("ns8382x_poll: got a packet: cur_rx:%u, status:%lx\n",
               cur_rx, rx_status);
-#endif
+
        length = (rx_status & DSIZE) - CRC_SIZE;
 
        if ((rx_status & (DescMore | DescPktOK | DescRxLong)) != DescPktOK) {
                /* corrupted packet received */
-               printf("ns8382x_poll: Corrupted packet, status:%lx\n", rx_status);
+               printf("ns8382x_poll: Corrupted packet, status:%lx\n",
+                      rx_status);
                retstat = 0;
        } else {
                /* give packet to higher level routine */
-               NetReceive((rxb + cur_rx * RX_BUF_SIZE), length);
+               net_process_received_packet((rxb + cur_rx * RX_BUF_SIZE),
+                                           length);
                retstat = 1;
        }
 
@@ -859,5 +851,3 @@ ns8382x_disable(struct eth_device *dev)
        /* Restore PME enable bit */
        OUTL(dev, SavedClkRun, ClkRun);
 }
-
-#endif