182 lines
5.6 KiB
Diff
182 lines
5.6 KiB
Diff
From 5af2b2dc4d6ba0ff7696e79f18e5b2bf862194eb Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Tue, 7 Mar 2023 15:55:24 +0000
|
|
Subject: [PATCH 2/7] net: ethernet: mtk_eth_soc: move MAX_DEVS in mtk_soc_data
|
|
|
|
This is a preliminary patch to add MT7988 SoC support since it runs 3
|
|
macs instead of 2.
|
|
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|
---
|
|
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 34 +++++++++++++++++++--
|
|
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 11 +++----
|
|
2 files changed, 36 insertions(+), 9 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
|
@@ -4043,7 +4043,10 @@ static void mtk_sgmii_destroy(struct mtk
|
|
{
|
|
int i;
|
|
|
|
- for (i = 0; i < MTK_MAX_DEVS; i++)
|
|
+ if (!eth->sgmii_pcs)
|
|
+ return;
|
|
+
|
|
+ for (i = 0; i < eth->soc->num_devs; i++)
|
|
mtk_pcs_lynxi_destroy(eth->sgmii_pcs[i]);
|
|
}
|
|
|
|
@@ -4486,7 +4489,12 @@ static int mtk_sgmii_init(struct mtk_eth
|
|
u32 flags;
|
|
int i;
|
|
|
|
- for (i = 0; i < MTK_MAX_DEVS; i++) {
|
|
+ eth->sgmii_pcs = devm_kzalloc(eth->dev,
|
|
+ sizeof(*eth->sgmii_pcs) *
|
|
+ eth->soc->num_devs,
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ for (i = 0; i < eth->soc->num_devs; i++) {
|
|
np = of_parse_phandle(eth->dev->of_node, "mediatek,sgmiisys", i);
|
|
if (!np)
|
|
break;
|
|
@@ -4531,6 +4539,18 @@ static int mtk_probe(struct platform_dev
|
|
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628))
|
|
eth->ip_align = NET_IP_ALIGN;
|
|
|
|
+ eth->netdev = devm_kzalloc(eth->dev,
|
|
+ sizeof(*eth->netdev) * eth->soc->num_devs,
|
|
+ GFP_KERNEL);
|
|
+ if (!eth->netdev)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ eth->mac = devm_kzalloc(eth->dev,
|
|
+ sizeof(*eth->mac) * eth->soc->num_devs,
|
|
+ GFP_KERNEL);
|
|
+ if (!eth->mac)
|
|
+ return -ENOMEM;
|
|
+
|
|
spin_lock_init(ð->page_lock);
|
|
spin_lock_init(ð->tx_irq_lock);
|
|
spin_lock_init(ð->rx_irq_lock);
|
|
@@ -4716,7 +4736,7 @@ static int mtk_probe(struct platform_dev
|
|
goto err_deinit_ppe;
|
|
}
|
|
|
|
- for (i = 0; i < MTK_MAX_DEVS; i++) {
|
|
+ for (i = 0; i < eth->soc->num_devs; i++) {
|
|
if (!eth->netdev[i])
|
|
continue;
|
|
|
|
@@ -4792,6 +4812,7 @@ static const struct mtk_soc_data mt2701_
|
|
.hw_features = MTK_HW_FEATURES,
|
|
.required_clks = MT7623_CLKS_BITMAP,
|
|
.required_pctl = true,
|
|
+ .num_devs = 2,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma),
|
|
.rxd_size = sizeof(struct mtk_rx_dma),
|
|
@@ -4810,6 +4831,7 @@ static const struct mtk_soc_data mt7621_
|
|
.required_pctl = false,
|
|
.offload_version = 1,
|
|
.hash_offset = 2,
|
|
+ .num_devs = 2,
|
|
.foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma),
|
|
@@ -4831,6 +4853,7 @@ static const struct mtk_soc_data mt7622_
|
|
.offload_version = 2,
|
|
.hash_offset = 2,
|
|
.has_accounting = true,
|
|
+ .num_devs = 2,
|
|
.foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma),
|
|
@@ -4850,6 +4873,7 @@ static const struct mtk_soc_data mt7623_
|
|
.required_pctl = true,
|
|
.offload_version = 1,
|
|
.hash_offset = 2,
|
|
+ .num_devs = 2,
|
|
.foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma),
|
|
@@ -4869,6 +4893,7 @@ static const struct mtk_soc_data mt7629_
|
|
.required_clks = MT7629_CLKS_BITMAP,
|
|
.required_pctl = false,
|
|
.has_accounting = true,
|
|
+ .num_devs = 2,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma),
|
|
.rxd_size = sizeof(struct mtk_rx_dma),
|
|
@@ -4890,6 +4915,7 @@ static const struct mtk_soc_data mt7981_
|
|
.hash_offset = 4,
|
|
.foe_entry_size = sizeof(struct mtk_foe_entry),
|
|
.has_accounting = true,
|
|
+ .num_devs = 2,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma_v2),
|
|
.rxd_size = sizeof(struct mtk_rx_dma_v2),
|
|
@@ -4908,6 +4934,7 @@ static const struct mtk_soc_data mt7986_
|
|
.required_clks = MT7986_CLKS_BITMAP,
|
|
.required_pctl = false,
|
|
.hash_offset = 4,
|
|
+ .num_devs = 2,
|
|
.foe_entry_size = sizeof(struct mtk_foe_entry),
|
|
.has_accounting = true,
|
|
.txrx = {
|
|
@@ -4926,6 +4953,7 @@ static const struct mtk_soc_data rt5350_
|
|
.hw_features = MTK_HW_FEATURES_MT7628,
|
|
.required_clks = MT7628_CLKS_BITMAP,
|
|
.required_pctl = false,
|
|
+ .num_devs = 2,
|
|
.txrx = {
|
|
.txd_size = sizeof(struct mtk_tx_dma),
|
|
.rxd_size = sizeof(struct mtk_rx_dma),
|
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
|
@@ -1021,6 +1021,7 @@ struct mtk_reg_map {
|
|
* @required_pctl A bool value to show whether the SoC requires
|
|
* the extra setup for those pins used by GMAC.
|
|
* @hash_offset Flow table hash offset.
|
|
+ * @num_devs SoC number of macs.
|
|
* @foe_entry_size Foe table entry size.
|
|
* @has_accounting Bool indicating support for accounting of
|
|
* offloaded flows.
|
|
@@ -1039,6 +1040,7 @@ struct mtk_soc_data {
|
|
bool required_pctl;
|
|
u8 offload_version;
|
|
u8 hash_offset;
|
|
+ u8 num_devs;
|
|
u16 foe_entry_size;
|
|
netdev_features_t hw_features;
|
|
bool has_accounting;
|
|
@@ -1054,9 +1056,6 @@ struct mtk_soc_data {
|
|
|
|
#define MTK_DMA_MONITOR_TIMEOUT msecs_to_jiffies(1000)
|
|
|
|
-/* currently no SoC has more than 2 macs */
|
|
-#define MTK_MAX_DEVS 2
|
|
-
|
|
/* struct mtk_eth - This is the main datasructure for holding the state
|
|
* of the driver
|
|
* @dev: The device pointer
|
|
@@ -1111,14 +1110,14 @@ struct mtk_eth {
|
|
spinlock_t tx_irq_lock;
|
|
spinlock_t rx_irq_lock;
|
|
struct net_device dummy_dev;
|
|
- struct net_device *netdev[MTK_MAX_DEVS];
|
|
- struct mtk_mac *mac[MTK_MAX_DEVS];
|
|
+ struct net_device **netdev;
|
|
+ struct mtk_mac **mac;
|
|
int irq[3];
|
|
u32 msg_enable;
|
|
unsigned long sysclk;
|
|
struct regmap *ethsys;
|
|
struct regmap *infra;
|
|
- struct phylink_pcs *sgmii_pcs[MTK_MAX_DEVS];
|
|
+ struct phylink_pcs **sgmii_pcs;
|
|
struct regmap *pctl;
|
|
bool hwlro;
|
|
refcount_t dma_refcnt;
|