|
@@ -54,7 +54,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
},
|
|
|
.gdm1_cnt = 0x1c00,
|
|
|
.gdma_to_ppe = 0x3333,
|
|
|
-@@ -620,6 +624,75 @@ static void mtk_mac_link_down(struct phy
|
|
|
+@@ -619,6 +623,75 @@ static void mtk_mac_link_down(struct phy
|
|
|
mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
|
|
|
}
|
|
|
|
|
@@ -130,7 +130,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
static void mtk_mac_link_up(struct phylink_config *config,
|
|
|
struct phy_device *phy,
|
|
|
unsigned int mode, phy_interface_t interface,
|
|
|
-@@ -645,6 +718,8 @@ static void mtk_mac_link_up(struct phyli
|
|
|
+@@ -644,6 +717,8 @@ static void mtk_mac_link_up(struct phyli
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -139,7 +139,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
/* Configure duplex */
|
|
|
if (duplex == DUPLEX_FULL)
|
|
|
mcr |= MAC_MCR_FORCE_DPX;
|
|
|
-@@ -1105,7 +1180,8 @@ static void mtk_tx_set_dma_desc_v1(struc
|
|
|
+@@ -1104,7 +1179,8 @@ static void mtk_tx_set_dma_desc_v1(struc
|
|
|
|
|
|
WRITE_ONCE(desc->txd1, info->addr);
|
|
|
|
|
@@ -149,7 +149,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
if (info->last)
|
|
|
data |= TX_DMA_LS0;
|
|
|
WRITE_ONCE(desc->txd3, data);
|
|
|
-@@ -1139,9 +1215,6 @@ static void mtk_tx_set_dma_desc_v2(struc
|
|
|
+@@ -1138,9 +1214,6 @@ static void mtk_tx_set_dma_desc_v2(struc
|
|
|
data |= TX_DMA_LS0;
|
|
|
WRITE_ONCE(desc->txd3, data);
|
|
|
|
|
@@ -159,7 +159,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */
|
|
|
data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid);
|
|
|
WRITE_ONCE(desc->txd4, data);
|
|
|
-@@ -1185,11 +1258,12 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
+@@ -1184,11 +1257,12 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
.gso = gso,
|
|
|
.csum = skb->ip_summed == CHECKSUM_PARTIAL,
|
|
|
.vlan = skb_vlan_tag_present(skb),
|
|
@@ -173,7 +173,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
struct mtk_mac *mac = netdev_priv(dev);
|
|
|
struct mtk_eth *eth = mac->hw;
|
|
|
const struct mtk_soc_data *soc = eth->soc;
|
|
|
-@@ -1197,8 +1271,10 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
+@@ -1196,8 +1270,10 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
struct mtk_tx_dma *itxd_pdma, *txd_pdma;
|
|
|
struct mtk_tx_buf *itx_buf, *tx_buf;
|
|
|
int i, n_desc = 1;
|
|
@@ -184,7 +184,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
itxd = ring->next_free;
|
|
|
itxd_pdma = qdma_to_pdma(ring, itxd);
|
|
|
if (itxd == ring->last_free)
|
|
|
-@@ -1247,7 +1323,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
+@@ -1246,7 +1322,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info));
|
|
|
txd_info.size = min_t(unsigned int, frag_size,
|
|
|
soc->txrx.dma_max_len);
|
|
@@ -193,7 +193,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 &&
|
|
|
!(frag_size - txd_info.size);
|
|
|
txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag,
|
|
|
-@@ -1286,7 +1362,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
+@@ -1285,7 +1361,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
txd_pdma->txd2 |= TX_DMA_LS1;
|
|
|
}
|
|
|
|
|
@@ -202,7 +202,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
skb_tx_timestamp(skb);
|
|
|
|
|
|
ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
|
|
|
-@@ -1298,8 +1374,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
+@@ -1297,8 +1373,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
|
|
wmb();
|
|
|
|
|
|
if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) {
|
|
@@ -212,7 +212,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr);
|
|
|
} else {
|
|
|
int next_idx;
|
|
|
-@@ -1368,7 +1443,7 @@ static void mtk_wake_queue(struct mtk_et
|
|
|
+@@ -1367,7 +1442,7 @@ static void mtk_wake_queue(struct mtk_et
|
|
|
for (i = 0; i < MTK_MAC_COUNT; i++) {
|
|
|
if (!eth->netdev[i])
|
|
|
continue;
|
|
@@ -221,7 +221,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-@@ -1392,7 +1467,7 @@ static netdev_tx_t mtk_start_xmit(struct
|
|
|
+@@ -1391,7 +1466,7 @@ static netdev_tx_t mtk_start_xmit(struct
|
|
|
|
|
|
tx_num = mtk_cal_txd_req(eth, skb);
|
|
|
if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
|
|
@@ -230,7 +230,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
netif_err(eth, tx_queued, dev,
|
|
|
"Tx Ring full when queue awake!\n");
|
|
|
spin_unlock(ð->page_lock);
|
|
|
-@@ -1418,7 +1493,7 @@ static netdev_tx_t mtk_start_xmit(struct
|
|
|
+@@ -1417,7 +1492,7 @@ static netdev_tx_t mtk_start_xmit(struct
|
|
|
goto drop;
|
|
|
|
|
|
if (unlikely(atomic_read(&ring->free_count) <= ring->thresh))
|
|
@@ -239,7 +239,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
|
|
|
spin_unlock(ð->page_lock);
|
|
|
|
|
|
-@@ -1585,10 +1660,12 @@ static int mtk_xdp_submit_frame(struct m
|
|
|
+@@ -1584,10 +1659,12 @@ static int mtk_xdp_submit_frame(struct m
|
|
|
struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf);
|
|
|
const struct mtk_soc_data *soc = eth->soc;
|
|
|
struct mtk_tx_ring *ring = ð->tx_ring;
|
|
@@ -252,7 +252,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
};
|
|
|
int err, index = 0, n_desc = 1, nr_frags;
|
|
|
struct mtk_tx_buf *htx_buf, *tx_buf;
|
|
|
-@@ -1638,6 +1715,7 @@ static int mtk_xdp_submit_frame(struct m
|
|
|
+@@ -1637,6 +1714,7 @@ static int mtk_xdp_submit_frame(struct m
|
|
|
memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info));
|
|
|
txd_info.size = skb_frag_size(&sinfo->frags[index]);
|
|
|
txd_info.last = index + 1 == nr_frags;
|
|
@@ -260,7 +260,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
data = skb_frag_address(&sinfo->frags[index]);
|
|
|
|
|
|
index++;
|
|
|
-@@ -1992,8 +2070,46 @@ rx_done:
|
|
|
+@@ -1991,8 +2069,46 @@ rx_done:
|
|
|
return done;
|
|
|
}
|
|
|
|
|
@@ -308,7 +308,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
{
|
|
|
const struct mtk_reg_map *reg_map = eth->soc->reg_map;
|
|
|
struct mtk_tx_ring *ring = ð->tx_ring;
|
|
|
-@@ -2025,12 +2141,9 @@ static int mtk_poll_tx_qdma(struct mtk_e
|
|
|
+@@ -2024,12 +2140,9 @@ static int mtk_poll_tx_qdma(struct mtk_e
|
|
|
break;
|
|
|
|
|
|
if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) {
|
|
@@ -323,7 +323,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
budget--;
|
|
|
}
|
|
|
mtk_tx_unmap(eth, tx_buf, &bq, true);
|
|
|
-@@ -2049,7 +2162,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
|
|
|
+@@ -2048,7 +2161,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
|
|
|
}
|
|
|
|
|
|
static int mtk_poll_tx_pdma(struct mtk_eth *eth, int budget,
|
|
@@ -332,7 +332,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
{
|
|
|
struct mtk_tx_ring *ring = ð->tx_ring;
|
|
|
struct mtk_tx_buf *tx_buf;
|
|
|
-@@ -2067,12 +2180,8 @@ static int mtk_poll_tx_pdma(struct mtk_e
|
|
|
+@@ -2066,12 +2179,8 @@ static int mtk_poll_tx_pdma(struct mtk_e
|
|
|
break;
|
|
|
|
|
|
if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) {
|
|
@@ -347,7 +347,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
budget--;
|
|
|
}
|
|
|
mtk_tx_unmap(eth, tx_buf, &bq, true);
|
|
|
-@@ -2094,26 +2203,15 @@ static int mtk_poll_tx(struct mtk_eth *e
|
|
|
+@@ -2093,26 +2202,15 @@ static int mtk_poll_tx(struct mtk_eth *e
|
|
|
{
|
|
|
struct mtk_tx_ring *ring = ð->tx_ring;
|
|
|
struct dim_sample dim_sample = {};
|
|
@@ -379,7 +379,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
|
|
|
dim_update_sample(eth->tx_events, eth->tx_packets, eth->tx_bytes,
|
|
|
&dim_sample);
|
|
|
-@@ -2123,7 +2221,7 @@ static int mtk_poll_tx(struct mtk_eth *e
|
|
|
+@@ -2122,7 +2220,7 @@ static int mtk_poll_tx(struct mtk_eth *e
|
|
|
(atomic_read(&ring->free_count) > ring->thresh))
|
|
|
mtk_wake_queue(eth);
|
|
|
|
|
@@ -388,7 +388,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
}
|
|
|
|
|
|
static void mtk_handle_status_irq(struct mtk_eth *eth)
|
|
|
-@@ -2209,6 +2307,7 @@ static int mtk_tx_alloc(struct mtk_eth *
|
|
|
+@@ -2208,6 +2306,7 @@ static int mtk_tx_alloc(struct mtk_eth *
|
|
|
int i, sz = soc->txrx.txd_size;
|
|
|
struct mtk_tx_dma_v2 *txd;
|
|
|
int ring_size;
|
|
@@ -396,7 +396,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
|
|
|
if (MTK_HAS_CAPS(soc->caps, MTK_QDMA))
|
|
|
ring_size = MTK_QDMA_RING_SIZE;
|
|
|
-@@ -2276,8 +2375,25 @@ static int mtk_tx_alloc(struct mtk_eth *
|
|
|
+@@ -2275,8 +2374,25 @@ static int mtk_tx_alloc(struct mtk_eth *
|
|
|
ring->phys + ((ring_size - 1) * sz),
|
|
|
soc->reg_map->qdma.crx_ptr);
|
|
|
mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr);
|
|
@@ -424,7 +424,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
} else {
|
|
|
mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0);
|
|
|
mtk_w32(eth, ring_size, MT7628_TX_MAX_CNT0);
|
|
|
-@@ -2962,7 +3078,7 @@ static int mtk_start_dma(struct mtk_eth
|
|
|
+@@ -2961,7 +3077,7 @@ static int mtk_start_dma(struct mtk_eth
|
|
|
if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2))
|
|
|
val |= MTK_MUTLI_CNT | MTK_RESV_BUF |
|
|
|
MTK_WCOMP_EN | MTK_DMAD_WR_WDONE |
|
|
@@ -433,7 +433,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
else
|
|
|
val |= MTK_RX_BT_32DWORDS;
|
|
|
mtk_w32(eth, val, reg_map->qdma.glo_cfg);
|
|
|
-@@ -3008,6 +3124,45 @@ static void mtk_gdm_config(struct mtk_et
|
|
|
+@@ -3007,6 +3123,45 @@ static void mtk_gdm_config(struct mtk_et
|
|
|
mtk_w32(eth, 0, MTK_RST_GL);
|
|
|
}
|
|
|
|
|
@@ -479,7 +479,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
static int mtk_open(struct net_device *dev)
|
|
|
{
|
|
|
struct mtk_mac *mac = netdev_priv(dev);
|
|
|
-@@ -3050,7 +3205,8 @@ static int mtk_open(struct net_device *d
|
|
|
+@@ -3049,7 +3204,8 @@ static int mtk_open(struct net_device *d
|
|
|
refcount_inc(ð->dma_refcnt);
|
|
|
|
|
|
phylink_start(mac->phylink);
|
|
@@ -489,7 +489,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-@@ -3759,8 +3915,12 @@ static int mtk_unreg_dev(struct mtk_eth
|
|
|
+@@ -3758,8 +3914,12 @@ static int mtk_unreg_dev(struct mtk_eth
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < MTK_MAC_COUNT; i++) {
|
|
@@ -502,7 +502,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
unregister_netdev(eth->netdev[i]);
|
|
|
}
|
|
|
|
|
|
-@@ -3977,6 +4137,23 @@ static int mtk_set_rxnfc(struct net_devi
|
|
|
+@@ -3976,6 +4136,23 @@ static int mtk_set_rxnfc(struct net_devi
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -526,7 +526,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
static const struct ethtool_ops mtk_ethtool_ops = {
|
|
|
.get_link_ksettings = mtk_get_link_ksettings,
|
|
|
.set_link_ksettings = mtk_set_link_ksettings,
|
|
|
-@@ -4011,6 +4188,7 @@ static const struct net_device_ops mtk_n
|
|
|
+@@ -4010,6 +4187,7 @@ static const struct net_device_ops mtk_n
|
|
|
.ndo_setup_tc = mtk_eth_setup_tc,
|
|
|
.ndo_bpf = mtk_xdp,
|
|
|
.ndo_xdp_xmit = mtk_xdp_xmit,
|
|
@@ -534,7 +534,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
};
|
|
|
|
|
|
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
|
|
|
-@@ -4020,6 +4198,7 @@ static int mtk_add_mac(struct mtk_eth *e
|
|
|
+@@ -4019,6 +4197,7 @@ static int mtk_add_mac(struct mtk_eth *e
|
|
|
struct phylink *phylink;
|
|
|
struct mtk_mac *mac;
|
|
|
int id, err;
|
|
@@ -542,7 +542,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
|
|
|
if (!_id) {
|
|
|
dev_err(eth->dev, "missing mac id\n");
|
|
|
-@@ -4037,7 +4216,10 @@ static int mtk_add_mac(struct mtk_eth *e
|
|
|
+@@ -4036,7 +4215,10 @@ static int mtk_add_mac(struct mtk_eth *e
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
@@ -554,7 +554,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
if (!eth->netdev[id]) {
|
|
|
dev_err(eth->dev, "alloc_etherdev failed\n");
|
|
|
return -ENOMEM;
|
|
|
-@@ -4145,6 +4327,11 @@ static int mtk_add_mac(struct mtk_eth *e
|
|
|
+@@ -4144,6 +4326,11 @@ static int mtk_add_mac(struct mtk_eth *e
|
|
|
else
|
|
|
eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN;
|
|
|
|