platforms.
 - tx-fifo-depth: See ethernet.txt file in the same directory
 - rx-fifo-depth: See ethernet.txt file in the same directory
-- snps,pbl             Programmable Burst Length
+- snps,pbl             Programmable Burst Length (tx and rx)
+- snps,txpbl           Tx Programmable Burst Length. Only for GMAC and newer.
+                       If set, DMA tx will use this value rather than snps,pbl.
+- snps,rxpbl           Rx Programmable Burst Length. Only for GMAC and newer.
+                       If set, DMA rx will use this value rather than snps,pbl.
 - snps,aal             Address-Aligned Beats
 - snps,fixed-burst     Program the DMA to use the fixed burst mode
 - snps,mixed-burst     Program the DMA to use the mixed burst mode
 
    o pbl: the Programmable Burst Length is maximum number of beats to
        be transferred in one DMA transaction.
        GMAC also enables the 4xPBL by default.
-   o fixed_burst/mixed_burst/burst_len
+   o txpbl/rxpbl: GMAC and newer supports independent DMA pbl for tx/rx.
+   o fixed_burst/mixed_burst/aal
  o clk_csr: fixed CSR Clock range selection.
  o has_gmac: uses the GMAC core.
  o enh_desc: if sets the MAC will use the enhanced descriptor structure.
 
 struct stmmac_dma_cfg {
        int pbl;
+       int txpbl;
+       int rxpbl;
        int fixed_burst;
-       int burst_len_supported;
+       int mixed_burst;
+       bool aal;
 };
 
 Where:
- o pbl: Programmable Burst Length
+ o pbl: Programmable Burst Length (tx and rx)
+ o txpbl: Transmit Programmable Burst Length. Only for GMAC and newer.
+        If set, DMA tx will use this value rather than pbl.
+ o rxpbl: Receive Programmable Burst Length. Only for GMAC and newer.
+        If set, DMA rx will use this value rather than pbl.
  o fixed_burst: program the DMA to use the fixed burst mode
- o burst_len: this is the value we put in the register
-             supported values are provided as macros in
-             linux/stmmac.h header file.
+ o mixed_burst: program the DMA to use the mixed burst mode
+ o aal: Address-Aligned Beats
 
 ---
 
 
                               u32 dma_tx, u32 dma_rx, int atds)
 {
        u32 value = readl(ioaddr + DMA_BUS_MODE);
+       int txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
+       int rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
 
        /*
         * Set the DMA PBL (Programmable Burst Length) mode.
         *
         * Note: before stmmac core 3.50 this mode bit was 4xPBL, and
         * post 3.5 mode bit acts as 8*PBL.
-        *
-        * This configuration doesn't take care about the Separate PBL
-        * so only the bits: 13-8 are programmed with the PBL passed from the
-        * platform.
         */
        value |= DMA_BUS_MODE_MAXPBL;
-       value &= ~DMA_BUS_MODE_PBL_MASK;
-       value |= (dma_cfg->pbl << DMA_BUS_MODE_PBL_SHIFT);
+       value |= DMA_BUS_MODE_USP;
+       value &= ~(DMA_BUS_MODE_PBL_MASK | DMA_BUS_MODE_RPBL_MASK);
+       value |= (txpbl << DMA_BUS_MODE_PBL_SHIFT);
+       value |= (rxpbl << DMA_BUS_MODE_RPBL_SHIFT);
 
        /* Set the Fixed burst mode */
        if (dma_cfg->fixed_burst)
 
        writel(value, ioaddr + DMA_SYS_BUS_MODE);
 }
 
-static void dwmac4_dma_init_channel(void __iomem *ioaddr, int pbl,
+static void dwmac4_dma_init_channel(void __iomem *ioaddr,
+                                   struct stmmac_dma_cfg *dma_cfg,
                                    u32 dma_tx_phy, u32 dma_rx_phy,
                                    u32 channel)
 {
        u32 value;
+       int txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
+       int rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
 
        /* set PBL for each channels. Currently we affect same configuration
         * on each channel
        writel(value, ioaddr + DMA_CHAN_CONTROL(channel));
 
        value = readl(ioaddr + DMA_CHAN_TX_CONTROL(channel));
-       value = value | (pbl << DMA_BUS_MODE_PBL_SHIFT);
+       value = value | (txpbl << DMA_BUS_MODE_PBL_SHIFT);
        writel(value, ioaddr + DMA_CHAN_TX_CONTROL(channel));
 
        value = readl(ioaddr + DMA_CHAN_RX_CONTROL(channel));
-       value = value | (pbl << DMA_BUS_MODE_RPBL_SHIFT);
+       value = value | (rxpbl << DMA_BUS_MODE_RPBL_SHIFT);
        writel(value, ioaddr + DMA_CHAN_RX_CONTROL(channel));
 
        /* Mask interrupts by writing to CSR7 */
        writel(value, ioaddr + DMA_SYS_BUS_MODE);
 
        for (i = 0; i < DMA_CHANNEL_NB_MAX; i++)
-               dwmac4_dma_init_channel(ioaddr, dma_cfg->pbl,
-                                       dma_tx, dma_rx, i);
+               dwmac4_dma_init_channel(ioaddr, dma_cfg, dma_tx, dma_rx, i);
 }
 
 static void _dwmac4_dump_dma_regs(void __iomem *ioaddr, u32 channel)
 
        of_property_read_u32(np, "snps,pbl", &dma_cfg->pbl);
        if (!dma_cfg->pbl)
                dma_cfg->pbl = DEFAULT_DMA_PBL;
+       of_property_read_u32(np, "snps,txpbl", &dma_cfg->txpbl);
+       of_property_read_u32(np, "snps,rxpbl", &dma_cfg->rxpbl);
 
        dma_cfg->aal = of_property_read_bool(np, "snps,aal");
        dma_cfg->fixed_burst = of_property_read_bool(np, "snps,fixed-burst");
 
 
 struct stmmac_dma_cfg {
        int pbl;
+       int txpbl;
+       int rxpbl;
        int fixed_burst;
        int mixed_burst;
        bool aal;