Merge branch 'stmmac-Enable-Flow-Control'
Jose Abreu says: ==================== net: stmmac: Enable Flow Control I don't know of any specific reason why Flow Control is off by default but do let me know if there is any. Tested in B2B between XGMAC2 and GMAC5. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e77b8ba640
@ -143,6 +143,11 @@
|
||||
#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)))
|
||||
|
@ -147,6 +147,52 @@ static void dwxgmac2_dma_rx_mode(void __iomem *ioaddr, int mode,
|
||||
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 */
|
||||
|
@ -74,7 +74,7 @@ MODULE_PARM_DESC(phyaddr, "Physical device address");
|
||||
#define STMMAC_TX_THRESH (DMA_TX_SIZE / 4)
|
||||
#define STMMAC_RX_THRESH (DMA_RX_SIZE / 4)
|
||||
|
||||
static int flow_ctrl = FLOW_OFF;
|
||||
static int flow_ctrl = FLOW_AUTO;
|
||||
module_param(flow_ctrl, int, 0644);
|
||||
MODULE_PARM_DESC(flow_ctrl, "Flow control ability [on/off]");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user