|
@@ -148,12 +148,40 @@ static u32 dwmac1000_configure_fc(u32 csr6, int rxfifosz)
|
|
|
return csr6;
|
|
|
}
|
|
|
|
|
|
-static void dwmac1000_dma_operation_mode(void __iomem *ioaddr, int txmode,
|
|
|
- int rxmode, int rxfifosz)
|
|
|
+static void dwmac1000_dma_operation_mode_rx(void __iomem *ioaddr, int mode,
|
|
|
+ u32 channel, int fifosz, u8 qmode)
|
|
|
{
|
|
|
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
|
|
|
|
|
- if (txmode == SF_DMA_MODE) {
|
|
|
+ if (mode == SF_DMA_MODE) {
|
|
|
+ pr_debug("GMAC: enable RX store and forward mode\n");
|
|
|
+ csr6 |= DMA_CONTROL_RSF;
|
|
|
+ } else {
|
|
|
+ pr_debug("GMAC: disable RX SF mode (threshold %d)\n", mode);
|
|
|
+ csr6 &= ~DMA_CONTROL_RSF;
|
|
|
+ csr6 &= DMA_CONTROL_TC_RX_MASK;
|
|
|
+ if (mode <= 32)
|
|
|
+ csr6 |= DMA_CONTROL_RTC_32;
|
|
|
+ else if (mode <= 64)
|
|
|
+ csr6 |= DMA_CONTROL_RTC_64;
|
|
|
+ else if (mode <= 96)
|
|
|
+ csr6 |= DMA_CONTROL_RTC_96;
|
|
|
+ else
|
|
|
+ csr6 |= DMA_CONTROL_RTC_128;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Configure flow control based on rx fifo size */
|
|
|
+ csr6 = dwmac1000_configure_fc(csr6, fifosz);
|
|
|
+
|
|
|
+ writel(csr6, ioaddr + DMA_CONTROL);
|
|
|
+}
|
|
|
+
|
|
|
+static void dwmac1000_dma_operation_mode_tx(void __iomem *ioaddr, int mode,
|
|
|
+ u32 channel, int fifosz, u8 qmode)
|
|
|
+{
|
|
|
+ u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
|
|
+
|
|
|
+ if (mode == SF_DMA_MODE) {
|
|
|
pr_debug("GMAC: enable TX store and forward mode\n");
|
|
|
/* Transmit COE type 2 cannot be done in cut-through mode. */
|
|
|
csr6 |= DMA_CONTROL_TSF;
|
|
@@ -162,42 +190,22 @@ static void dwmac1000_dma_operation_mode(void __iomem *ioaddr, int txmode,
|
|
|
*/
|
|
|
csr6 |= DMA_CONTROL_OSF;
|
|
|
} else {
|
|
|
- pr_debug("GMAC: disabling TX SF (threshold %d)\n", txmode);
|
|
|
+ pr_debug("GMAC: disabling TX SF (threshold %d)\n", mode);
|
|
|
csr6 &= ~DMA_CONTROL_TSF;
|
|
|
csr6 &= DMA_CONTROL_TC_TX_MASK;
|
|
|
/* Set the transmit threshold */
|
|
|
- if (txmode <= 32)
|
|
|
+ if (mode <= 32)
|
|
|
csr6 |= DMA_CONTROL_TTC_32;
|
|
|
- else if (txmode <= 64)
|
|
|
+ else if (mode <= 64)
|
|
|
csr6 |= DMA_CONTROL_TTC_64;
|
|
|
- else if (txmode <= 128)
|
|
|
+ else if (mode <= 128)
|
|
|
csr6 |= DMA_CONTROL_TTC_128;
|
|
|
- else if (txmode <= 192)
|
|
|
+ else if (mode <= 192)
|
|
|
csr6 |= DMA_CONTROL_TTC_192;
|
|
|
else
|
|
|
csr6 |= DMA_CONTROL_TTC_256;
|
|
|
}
|
|
|
|
|
|
- if (rxmode == SF_DMA_MODE) {
|
|
|
- pr_debug("GMAC: enable RX store and forward mode\n");
|
|
|
- csr6 |= DMA_CONTROL_RSF;
|
|
|
- } else {
|
|
|
- pr_debug("GMAC: disable RX SF mode (threshold %d)\n", rxmode);
|
|
|
- csr6 &= ~DMA_CONTROL_RSF;
|
|
|
- csr6 &= DMA_CONTROL_TC_RX_MASK;
|
|
|
- if (rxmode <= 32)
|
|
|
- csr6 |= DMA_CONTROL_RTC_32;
|
|
|
- else if (rxmode <= 64)
|
|
|
- csr6 |= DMA_CONTROL_RTC_64;
|
|
|
- else if (rxmode <= 96)
|
|
|
- csr6 |= DMA_CONTROL_RTC_96;
|
|
|
- else
|
|
|
- csr6 |= DMA_CONTROL_RTC_128;
|
|
|
- }
|
|
|
-
|
|
|
- /* Configure flow control based on rx fifo size */
|
|
|
- csr6 = dwmac1000_configure_fc(csr6, rxfifosz);
|
|
|
-
|
|
|
writel(csr6, ioaddr + DMA_CONTROL);
|
|
|
}
|
|
|
|
|
@@ -258,7 +266,8 @@ const struct stmmac_dma_ops dwmac1000_dma_ops = {
|
|
|
.init = dwmac1000_dma_init,
|
|
|
.axi = dwmac1000_dma_axi,
|
|
|
.dump_regs = dwmac1000_dump_dma_regs,
|
|
|
- .dma_mode = dwmac1000_dma_operation_mode,
|
|
|
+ .dma_rx_mode = dwmac1000_dma_operation_mode_rx,
|
|
|
+ .dma_tx_mode = dwmac1000_dma_operation_mode_tx,
|
|
|
.enable_dma_transmission = dwmac_enable_dma_transmission,
|
|
|
.enable_dma_irq = dwmac_enable_dma_irq,
|
|
|
.disable_dma_irq = dwmac_disable_dma_irq,
|