|
@@ -109,6 +109,39 @@ static void dwmac4_tx_queue_priority(struct mac_device_info *hw,
|
|
|
writel(value, ioaddr + base_register);
|
|
|
}
|
|
|
|
|
|
+static void dwmac4_tx_queue_routing(struct mac_device_info *hw,
|
|
|
+ u8 packet, u32 queue)
|
|
|
+{
|
|
|
+ void __iomem *ioaddr = hw->pcsr;
|
|
|
+ u32 value;
|
|
|
+
|
|
|
+ const struct stmmac_rx_routing route_possibilities[] = {
|
|
|
+ { GMAC_RXQCTRL_AVCPQ_MASK, GMAC_RXQCTRL_AVCPQ_SHIFT },
|
|
|
+ { GMAC_RXQCTRL_PTPQ_MASK, GMAC_RXQCTRL_PTPQ_SHIFT },
|
|
|
+ { GMAC_RXQCTRL_DCBCPQ_MASK, GMAC_RXQCTRL_DCBCPQ_SHIFT },
|
|
|
+ { GMAC_RXQCTRL_UPQ_MASK, GMAC_RXQCTRL_UPQ_SHIFT },
|
|
|
+ { GMAC_RXQCTRL_MCBCQ_MASK, GMAC_RXQCTRL_MCBCQ_SHIFT },
|
|
|
+ };
|
|
|
+
|
|
|
+ value = readl(ioaddr + GMAC_RXQ_CTRL1);
|
|
|
+
|
|
|
+ /* routing configuration */
|
|
|
+ value &= ~route_possibilities[packet - 1].reg_mask;
|
|
|
+ value |= (queue << route_possibilities[packet-1].reg_shift) &
|
|
|
+ route_possibilities[packet - 1].reg_mask;
|
|
|
+
|
|
|
+ /* some packets require extra ops */
|
|
|
+ if (packet == PACKET_AVCPQ) {
|
|
|
+ value &= ~GMAC_RXQCTRL_TACPQE;
|
|
|
+ value |= 0x1 << GMAC_RXQCTRL_TACPQE_SHIFT;
|
|
|
+ } else if (packet == PACKET_MCBCQ) {
|
|
|
+ value &= ~GMAC_RXQCTRL_MCBCQEN;
|
|
|
+ value |= 0x1 << GMAC_RXQCTRL_MCBCQEN_SHIFT;
|
|
|
+ }
|
|
|
+
|
|
|
+ writel(value, ioaddr + GMAC_RXQ_CTRL1);
|
|
|
+}
|
|
|
+
|
|
|
static void dwmac4_prog_mtl_rx_algorithms(struct mac_device_info *hw,
|
|
|
u32 rx_alg)
|
|
|
{
|
|
@@ -640,6 +673,7 @@ static const struct stmmac_ops dwmac4_ops = {
|
|
|
.rx_queue_enable = dwmac4_rx_queue_enable,
|
|
|
.rx_queue_prio = dwmac4_rx_queue_priority,
|
|
|
.tx_queue_prio = dwmac4_tx_queue_priority,
|
|
|
+ .rx_queue_routing = dwmac4_tx_queue_routing,
|
|
|
.prog_mtl_rx_algorithms = dwmac4_prog_mtl_rx_algorithms,
|
|
|
.prog_mtl_tx_algorithms = dwmac4_prog_mtl_tx_algorithms,
|
|
|
.set_mtl_tx_queue_weight = dwmac4_set_mtl_tx_queue_weight,
|