1 From 9304640f2f78147dddf97a5ea01502ae175e41d9 Mon Sep 17 00:00:00 2001
2 From: Lorenzo Bianconi <lorenzo@kernel.org>
3 Date: Thu, 1 Aug 2024 16:35:10 +0200
4 Subject: [PATCH 8/8] net: airoha: Link the gdm port to the selected qdma
7 Link the running gdm port to the qdma controller used to connect with
8 the CPU. Moreover, load all QDMA controllers available on EN7581 SoC.
10 Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
11 Link: https://patch.msgid.link/95b515df34ba4727f7ae5b14a1d0462cceec84ff.1722522582.git.lorenzo@kernel.org
12 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
14 drivers/net/ethernet/mediatek/airoha_eth.c | 37 +++++++++++-----------
15 1 file changed, 19 insertions(+), 18 deletions(-)
17 --- a/drivers/net/ethernet/mediatek/airoha_eth.c
18 +++ b/drivers/net/ethernet/mediatek/airoha_eth.c
20 #include <uapi/linux/ppp_defs.h>
22 #define AIROHA_MAX_NUM_GDM_PORTS 1
23 -#define AIROHA_MAX_NUM_QDMA 1
24 +#define AIROHA_MAX_NUM_QDMA 2
25 #define AIROHA_MAX_NUM_RSTS 3
26 #define AIROHA_MAX_NUM_XSI_RSTS 5
27 #define AIROHA_MAX_MTU 2000
28 @@ -805,8 +805,8 @@ struct airoha_qdma {
31 struct airoha_gdm_port {
32 + struct airoha_qdma *qdma;
33 struct net_device *dev;
34 - struct airoha_eth *eth;
37 struct airoha_hw_stats stats;
38 @@ -2139,7 +2139,7 @@ static void airoha_qdma_start_napi(struc
40 static void airoha_update_hw_stats(struct airoha_gdm_port *port)
42 - struct airoha_eth *eth = port->eth;
43 + struct airoha_eth *eth = port->qdma->eth;
46 spin_lock(&port->stats.lock);
47 @@ -2284,22 +2284,22 @@ static void airoha_update_hw_stats(struc
48 static int airoha_dev_open(struct net_device *dev)
50 struct airoha_gdm_port *port = netdev_priv(dev);
51 - struct airoha_eth *eth = port->eth;
52 + struct airoha_qdma *qdma = port->qdma;
55 netif_tx_start_all_queues(dev);
56 - err = airoha_set_gdm_ports(eth, true);
57 + err = airoha_set_gdm_ports(qdma->eth, true);
61 if (netdev_uses_dsa(dev))
62 - airoha_fe_set(eth, REG_GDM_INGRESS_CFG(port->id),
63 + airoha_fe_set(qdma->eth, REG_GDM_INGRESS_CFG(port->id),
66 - airoha_fe_clear(eth, REG_GDM_INGRESS_CFG(port->id),
67 + airoha_fe_clear(qdma->eth, REG_GDM_INGRESS_CFG(port->id),
70 - airoha_qdma_set(ð->qdma[0], REG_QDMA_GLOBAL_CFG,
71 + airoha_qdma_set(qdma, REG_QDMA_GLOBAL_CFG,
72 GLOBAL_CFG_TX_DMA_EN_MASK |
73 GLOBAL_CFG_RX_DMA_EN_MASK);
75 @@ -2309,15 +2309,15 @@ static int airoha_dev_open(struct net_de
76 static int airoha_dev_stop(struct net_device *dev)
78 struct airoha_gdm_port *port = netdev_priv(dev);
79 - struct airoha_eth *eth = port->eth;
80 + struct airoha_qdma *qdma = port->qdma;
83 netif_tx_disable(dev);
84 - err = airoha_set_gdm_ports(eth, false);
85 + err = airoha_set_gdm_ports(qdma->eth, false);
89 - airoha_qdma_clear(ð->qdma[0], REG_QDMA_GLOBAL_CFG,
90 + airoha_qdma_clear(qdma, REG_QDMA_GLOBAL_CFG,
91 GLOBAL_CFG_TX_DMA_EN_MASK |
92 GLOBAL_CFG_RX_DMA_EN_MASK);
94 @@ -2333,7 +2333,7 @@ static int airoha_dev_set_macaddr(struct
98 - airoha_set_macaddr(port->eth, dev->dev_addr);
99 + airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
103 @@ -2342,7 +2342,7 @@ static int airoha_dev_init(struct net_de
105 struct airoha_gdm_port *port = netdev_priv(dev);
107 - airoha_set_macaddr(port->eth, dev->dev_addr);
108 + airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
112 @@ -2376,10 +2376,9 @@ static netdev_tx_t airoha_dev_xmit(struc
113 struct airoha_gdm_port *port = netdev_priv(dev);
114 u32 msg0 = 0, msg1, len = skb_headlen(skb);
115 int i, qid = skb_get_queue_mapping(skb);
116 - struct airoha_eth *eth = port->eth;
117 + struct airoha_qdma *qdma = port->qdma;
118 u32 nr_frags = 1 + sinfo->nr_frags;
119 struct netdev_queue *txq;
120 - struct airoha_qdma *qdma;
121 struct airoha_queue *q;
122 void *data = skb->data;
124 @@ -2407,7 +2406,6 @@ static netdev_tx_t airoha_dev_xmit(struc
125 msg1 = FIELD_PREP(QDMA_ETH_TXMSG_FPORT_MASK, fport) |
126 FIELD_PREP(QDMA_ETH_TXMSG_METER_MASK, 0x7f);
128 - qdma = ð->qdma[0];
129 q = &qdma->q_tx[qid];
130 if (WARN_ON_ONCE(!q->ndesc))
132 @@ -2490,7 +2488,7 @@ static void airoha_ethtool_get_drvinfo(s
133 struct ethtool_drvinfo *info)
135 struct airoha_gdm_port *port = netdev_priv(dev);
136 - struct airoha_eth *eth = port->eth;
137 + struct airoha_eth *eth = port->qdma->eth;
139 strscpy(info->driver, eth->dev->driver->name, sizeof(info->driver));
140 strscpy(info->bus_info, dev_name(eth->dev), sizeof(info->bus_info));
141 @@ -2571,6 +2569,7 @@ static int airoha_alloc_gdm_port(struct
143 const __be32 *id_ptr = of_get_property(np, "reg", NULL);
144 struct airoha_gdm_port *port;
145 + struct airoha_qdma *qdma;
146 struct net_device *dev;
149 @@ -2600,6 +2599,7 @@ static int airoha_alloc_gdm_port(struct
153 + qdma = ð->qdma[index % AIROHA_MAX_NUM_QDMA];
154 dev->netdev_ops = &airoha_netdev_ops;
155 dev->ethtool_ops = &airoha_ethtool_ops;
156 dev->max_mtu = AIROHA_MAX_MTU;
157 @@ -2609,6 +2609,7 @@ static int airoha_alloc_gdm_port(struct
158 NETIF_F_SG | NETIF_F_TSO;
159 dev->features |= dev->hw_features;
160 dev->dev.of_node = np;
161 + dev->irq = qdma->irq;
162 SET_NETDEV_DEV(dev, eth->dev);
164 err = of_get_ethdev_address(np, dev);
165 @@ -2624,8 +2625,8 @@ static int airoha_alloc_gdm_port(struct
166 port = netdev_priv(dev);
167 u64_stats_init(&port->stats.syncp);
168 spin_lock_init(&port->stats.lock);
173 eth->ports[index] = port;