]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
net: zynq: Disable secondary queues
authorEdgar E. Iglesias <edgar.iglesias@xilinx.com>
Sat, 26 Sep 2015 06:50:07 +0000 (23:50 -0700)
committerMichal Simek <michal.simek@xilinx.com>
Mon, 5 Oct 2015 11:05:12 +0000 (13:05 +0200)
Zynq has no priority queues.
ZynqMP requires this change to get network working.
This patch was not needed on ep108 for uknown reason even it should be
used.
Tested on Zynq and ZynqMP.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/net/zynq_gem.c

index ad825af9bc5faedb036f72568d6fdb3cd4078c51..b01e54199718e02e0e9b0b8176dc19e51e194211 100644 (file)
@@ -138,6 +138,10 @@ struct zynq_gem_regs {
        u32 reserved6[18];
 #define STAT_SIZE      44
        u32 stat[STAT_SIZE]; /* 0x100 - Octects transmitted Low reg */
+       u32 reserved7[164];
+       u32 transmit_q1_ptr; /* 0x440 - Transmit priority queue 1 */
+       u32 reserved8[15];
+       u32 receive_q1_ptr; /* 0x480 - Receive priority queue 1 */
 };
 
 /* BD descriptors */
@@ -299,6 +303,8 @@ static int zynq_gem_init(struct eth_device *dev, bd_t * bis)
        struct phy_device *phydev;
        struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase;
        struct zynq_gem_priv *priv = dev->priv;
+       struct emac_bd *dummy_tx_bd = &priv->tx_bd[4];
+       struct emac_bd *dummy_rx_bd = &priv->tx_bd[6];
        const u32 supported = SUPPORTED_10baseT_Half |
                        SUPPORTED_10baseT_Full |
                        SUPPORTED_100baseT_Half |
@@ -347,6 +353,26 @@ static int zynq_gem_init(struct eth_device *dev, bd_t * bis)
                /* Setup for Network Control register, MDIO, Rx and Tx enable */
                setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK);
 
+               /*
+                * Disable the second priority queue.
+                * FIXME: Consider GEMs with more than 2 queues.
+                */
+               dummy_tx_bd->addr = 0;
+               dummy_tx_bd->status = ZYNQ_GEM_TXBUF_WRAP_MASK |
+                               ZYNQ_GEM_TXBUF_LAST_MASK|
+                               ZYNQ_GEM_TXBUF_USED_MASK;
+
+               dummy_rx_bd->addr = ZYNQ_GEM_RXBUF_WRAP_MASK |
+                               ZYNQ_GEM_RXBUF_NEW_MASK;
+               dummy_rx_bd->status = 0;
+               flush_dcache_range((ulong)&dummy_tx_bd, (ulong)&dummy_tx_bd +
+                                  sizeof(dummy_tx_bd));
+               flush_dcache_range((ulong)&dummy_rx_bd, (ulong)&dummy_rx_bd +
+                                  sizeof(dummy_rx_bd));
+
+               writel((u32)dummy_tx_bd, &regs->transmit_q1_ptr);
+               writel((u32)dummy_rx_bd, &regs->receive_q1_ptr);
+
                priv->init++;
        }