]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/net/rtl8169.c
rtl8169: fix PCI system memory address
[karo-tx-uboot.git] / drivers / net / rtl8169.c
index 7c00926a6de95afdb3ae9eacf29ed161f3b299e7..e45d1a52212d5739c096dcc1b105d5816666f128 100644 (file)
@@ -55,6 +55,7 @@
 #include <common.h>
 #include <malloc.h>
 #include <net.h>
+#include <netdev.h>
 #include <asm/io.h>
 #include <pci.h>
 
@@ -109,6 +110,9 @@ static int media[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
 #define ETH_ALEN       MAC_ADDR_LEN
 #define ETH_ZLEN       60
 
+#define bus_to_phys(a) pci_mem_to_phys((pci_dev_t)dev->priv, (pci_addr_t)a)
+#define phys_to_bus(a) pci_phys_to_mem((pci_dev_t)dev->priv, (phys_addr_t)a)
+
 enum RTL8169_registers {
        MAC0 = 0,               /* Ethernet hardware address. */
        MAR0 = 8,               /* Multicast filter. */
@@ -419,6 +423,8 @@ static int rtl_recv(struct eth_device *dev)
        ioaddr = dev->iobase;
 
        cur_rx = tpc->cur_rx;
+       flush_cache((unsigned long)&tpc->RxDescArray[cur_rx],
+                       sizeof(struct RxDesc));
        if ((le32_to_cpu(tpc->RxDescArray[cur_rx].status) & OWNbit) == 0) {
                if (!(le32_to_cpu(tpc->RxDescArray[cur_rx].status) & RxRES)) {
                        unsigned char rxdata[RX_BUF_LEN];
@@ -435,7 +441,9 @@ static int rtl_recv(struct eth_device *dev)
                                tpc->RxDescArray[cur_rx].status =
                                        cpu_to_le32(OWNbit + RX_BUF_SIZE);
                        tpc->RxDescArray[cur_rx].buf_addr =
-                               cpu_to_le32((unsigned long)tpc->RxBufferRing[cur_rx]);
+                               cpu_to_le32(bus_to_phys(tpc->RxBufferRing[cur_rx]));
+                       flush_cache((unsigned long)tpc->RxBufferRing[cur_rx],
+                                       RX_BUF_SIZE);
                } else {
                        puts("Error Rx");
                }
@@ -477,12 +485,13 @@ static int rtl_send(struct eth_device *dev, volatile void *packet, int length)
        /* point to the current txb incase multiple tx_rings are used */
        ptxb = tpc->Tx_skbuff[entry * MAX_ETH_FRAME_SIZE];
        memcpy(ptxb, (char *)packet, (int)length);
+       flush_cache((unsigned long)ptxb, length);
 
        while (len < ETH_ZLEN)
                ptxb[len++] = '\0';
 
        tpc->TxDescArray[entry].buf_Haddr = 0;
-       tpc->TxDescArray[entry].buf_addr = cpu_to_le32((unsigned long)ptxb);
+       tpc->TxDescArray[entry].buf_addr = cpu_to_le32(bus_to_phys(ptxb));
        if (entry != (NUM_TX_DESC - 1)) {
                tpc->TxDescArray[entry].status =
                        cpu_to_le32((OWNbit | FSbit | LSbit) |
@@ -496,7 +505,10 @@ static int rtl_send(struct eth_device *dev, volatile void *packet, int length)
 
        tpc->cur_tx++;
        to = currticks() + TX_TIMEOUT;
-       while ((le32_to_cpu(tpc->TxDescArray[entry].status) & OWNbit)
+       do {
+               flush_cache((unsigned long)&tpc->TxDescArray[entry],
+                               sizeof(struct TxDesc));
+       } while ((le32_to_cpu(tpc->TxDescArray[entry].status) & OWNbit)
                                && (currticks() < to)); /* wait */
 
        if (currticks() >= to) {
@@ -584,9 +596,9 @@ static void rtl8169_hw_start(struct eth_device *dev)
 
        tpc->cur_rx = 0;
 
-       RTL_W32(TxDescStartAddrLow, (unsigned long)tpc->TxDescArray);
+       RTL_W32(TxDescStartAddrLow, bus_to_phys(tpc->TxDescArray));
        RTL_W32(TxDescStartAddrHigh, (unsigned long)0);
-       RTL_W32(RxDescStartAddrLow, (unsigned long)tpc->RxDescArray);
+       RTL_W32(RxDescStartAddrLow, bus_to_phys(tpc->RxDescArray));
        RTL_W32(RxDescStartAddrHigh, (unsigned long)0);
 
        /* RTL-8169sc/8110sc or later version */
@@ -637,7 +649,8 @@ static void rtl8169_init_ring(struct eth_device *dev)
 
                tpc->RxBufferRing[i] = &rxb[i * RX_BUF_SIZE];
                tpc->RxDescArray[i].buf_addr =
-                       cpu_to_le32((unsigned long)tpc->RxBufferRing[i]);
+                       cpu_to_le32(bus_to_phys(tpc->RxBufferRing[i]));
+               flush_cache((unsigned long)tpc->RxBufferRing[i], RX_BUF_SIZE);
        }
 
 #ifdef DEBUG_RTL8169
@@ -749,7 +762,7 @@ static int rtl_init(struct eth_device *dev, bd_t *bis)
 
        /* Get MAC address.  FIXME: read EEPROM */
        for (i = 0; i < MAC_ADDR_LEN; i++)
-               bis->bi_enetaddr[i] = dev->enetaddr[i] = RTL_R8(MAC0 + i);
+               dev->enetaddr[i] = RTL_R8(MAC0 + i);
 
 #ifdef DEBUG_RTL8169
        printf("chipset = %d\n", tpc->chipset);