]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/net/fec_mxc.c
net: fec_mxc: use a definite delay when waiting for TDAR/RDAR to clear
[karo-tx-uboot.git] / drivers / net / fec_mxc.c
index 027c6123ad6487945912b306efcb84f32b93c03c..aed7e07fc62bb0bb42e9bb3d4a6e5e396d1f3e03 100644 (file)
@@ -256,7 +256,7 @@ static int miiphy_wait_aneg(struct eth_device *dev)
 
 static inline void fec_rx_task_enable(struct fec_priv *fec)
 {
-       writel(1 << 24, &fec->eth->r_des_active);
+       writel(FEC_X_DES_ACTIVE_TDAR, &fec->eth->r_des_active);
 }
 
 static inline void fec_rx_task_disable(struct fec_priv *fec)
@@ -265,7 +265,7 @@ static inline void fec_rx_task_disable(struct fec_priv *fec)
 
 static inline void fec_tx_task_enable(struct fec_priv *fec)
 {
-       writel(1 << 24, &fec->eth->x_des_active);
+       writel(FEC_X_DES_ACTIVE_TDAR, &fec->eth->x_des_active);
 }
 
 static inline void fec_tx_task_disable(struct fec_priv *fec)
@@ -724,6 +724,7 @@ static int fec_send(struct eth_device *dev, void *packet, int length)
        while (--timeout) {
                if (!(readl(&fec->eth->x_des_active) & FEC_X_DES_ACTIVE_TDAR))
                        break;
+               udelay(1);
        }
 
        if (!timeout) {
@@ -751,6 +752,7 @@ static int fec_send(struct eth_device *dev, void *packet, int length)
                if (!(readw(&fec->tbd_base[fec->tbd_index].status) &
                    FEC_TBD_READY))
                        break;
+               udelay(1);
        }
 
        if (!timeout)
@@ -783,6 +785,7 @@ static int fec_recv(struct eth_device *dev)
        uint16_t bd_status;
        uint32_t addr, size, end;
        int i;
+       ALLOC_CACHE_ALIGN_BUFFER(uchar, buff, FEC_MAX_PKT_SIZE);
 
        /*
         * Check if any critical events have happened
@@ -1105,7 +1108,8 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
        if (!bus)
                return -ENOMEM;
 #ifdef CONFIG_PHYLIB
-       phydev = phy_find_by_mask(bus, 1 << phy_id, PHY_INTERFACE_MODE_RGMII);
+       phydev = phy_find_by_mask(bus, phy_id < 0 ? 0xff : (1 << phy_id),
+                               PHY_INTERFACE_MODE_RGMII);
        if (!phydev) {
                free(bus);
                return -ENOMEM;