#define XGMAC_RSF                      BIT(5)
 #define XGMAC_RTC                      GENMASK(1, 0)
 #define XGMAC_RTC_SHIFT                        0
+#define XGMAC_MTL_RXQ_FLOW_CONTROL(x)  (0x00001150 + (0x80 * (x)))
+#define XGMAC_RFD                      GENMASK(31, 17)
+#define XGMAC_RFD_SHIFT                        17
+#define XGMAC_RFA                      GENMASK(15, 1)
+#define XGMAC_RFA_SHIFT                        1
 #define XGMAC_MTL_QINTEN(x)            (0x00001170 + (0x80 * (x)))
 #define XGMAC_RXOIE                    BIT(16)
 #define XGMAC_MTL_QINT_STATUS(x)       (0x00001174 + (0x80 * (x)))
 
        value &= ~XGMAC_RQS;
        value |= (rqs << XGMAC_RQS_SHIFT) & XGMAC_RQS;
 
+       if ((fifosz >= 4096) && (qmode != MTL_QUEUE_AVB)) {
+               u32 flow = readl(ioaddr + XGMAC_MTL_RXQ_FLOW_CONTROL(channel));
+               unsigned int rfd, rfa;
+
+               value |= XGMAC_EHFC;
+
+               /* Set Threshold for Activating Flow Control to min 2 frames,
+                * i.e. 1500 * 2 = 3000 bytes.
+                *
+                * Set Threshold for Deactivating Flow Control to min 1 frame,
+                * i.e. 1500 bytes.
+                */
+               switch (fifosz) {
+               case 4096:
+                       /* This violates the above formula because of FIFO size
+                        * limit therefore overflow may occur in spite of this.
+                        */
+                       rfd = 0x03; /* Full-2.5K */
+                       rfa = 0x01; /* Full-1.5K */
+                       break;
+
+               case 8192:
+                       rfd = 0x06; /* Full-4K */
+                       rfa = 0x0a; /* Full-6K */
+                       break;
+
+               case 16384:
+                       rfd = 0x06; /* Full-4K */
+                       rfa = 0x12; /* Full-10K */
+                       break;
+
+               default:
+                       rfd = 0x06; /* Full-4K */
+                       rfa = 0x1e; /* Full-16K */
+                       break;
+               }
+
+               flow &= ~XGMAC_RFD;
+               flow |= rfd << XGMAC_RFD_SHIFT;
+
+               flow &= ~XGMAC_RFA;
+               flow |= rfa << XGMAC_RFA_SHIFT;
+
+               writel(flow, ioaddr + XGMAC_MTL_RXQ_FLOW_CONTROL(channel));
+       }
+
        writel(value, ioaddr + XGMAC_MTL_RXQ_OPMODE(channel));
 
        /* Enable MTL RX overflow */