1e89cf15aae8d07e273c4c56f68cf50113b0935d
[openwrt/staging/thess.git] /
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
5 controller
6
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.
9
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>
13 ---
14 drivers/net/ethernet/mediatek/airoha_eth.c | 37 +++++++++++-----------
15 1 file changed, 19 insertions(+), 18 deletions(-)
16
17 --- a/drivers/net/ethernet/mediatek/airoha_eth.c
18 +++ b/drivers/net/ethernet/mediatek/airoha_eth.c
19 @@ -18,7 +18,7 @@
20 #include <uapi/linux/ppp_defs.h>
21
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 {
29 };
30
31 struct airoha_gdm_port {
32 + struct airoha_qdma *qdma;
33 struct net_device *dev;
34 - struct airoha_eth *eth;
35 int id;
36
37 struct airoha_hw_stats stats;
38 @@ -2139,7 +2139,7 @@ static void airoha_qdma_start_napi(struc
39
40 static void airoha_update_hw_stats(struct airoha_gdm_port *port)
41 {
42 - struct airoha_eth *eth = port->eth;
43 + struct airoha_eth *eth = port->qdma->eth;
44 u32 val, i = 0;
45
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)
49 {
50 struct airoha_gdm_port *port = netdev_priv(dev);
51 - struct airoha_eth *eth = port->eth;
52 + struct airoha_qdma *qdma = port->qdma;
53 int err;
54
55 netif_tx_start_all_queues(dev);
56 - err = airoha_set_gdm_ports(eth, true);
57 + err = airoha_set_gdm_ports(qdma->eth, true);
58 if (err)
59 return err;
60
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),
64 GDM_STAG_EN_MASK);
65 else
66 - airoha_fe_clear(eth, REG_GDM_INGRESS_CFG(port->id),
67 + airoha_fe_clear(qdma->eth, REG_GDM_INGRESS_CFG(port->id),
68 GDM_STAG_EN_MASK);
69
70 - airoha_qdma_set(&eth->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);
74
75 @@ -2309,15 +2309,15 @@ static int airoha_dev_open(struct net_de
76 static int airoha_dev_stop(struct net_device *dev)
77 {
78 struct airoha_gdm_port *port = netdev_priv(dev);
79 - struct airoha_eth *eth = port->eth;
80 + struct airoha_qdma *qdma = port->qdma;
81 int err;
82
83 netif_tx_disable(dev);
84 - err = airoha_set_gdm_ports(eth, false);
85 + err = airoha_set_gdm_ports(qdma->eth, false);
86 if (err)
87 return err;
88
89 - airoha_qdma_clear(&eth->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);
93
94 @@ -2333,7 +2333,7 @@ static int airoha_dev_set_macaddr(struct
95 if (err)
96 return err;
97
98 - airoha_set_macaddr(port->eth, dev->dev_addr);
99 + airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
100
101 return 0;
102 }
103 @@ -2342,7 +2342,7 @@ static int airoha_dev_init(struct net_de
104 {
105 struct airoha_gdm_port *port = netdev_priv(dev);
106
107 - airoha_set_macaddr(port->eth, dev->dev_addr);
108 + airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
109
110 return 0;
111 }
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;
123 u16 index;
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);
127
128 - qdma = &eth->qdma[0];
129 q = &qdma->q_tx[qid];
130 if (WARN_ON_ONCE(!q->ndesc))
131 goto error;
132 @@ -2490,7 +2488,7 @@ static void airoha_ethtool_get_drvinfo(s
133 struct ethtool_drvinfo *info)
134 {
135 struct airoha_gdm_port *port = netdev_priv(dev);
136 - struct airoha_eth *eth = port->eth;
137 + struct airoha_eth *eth = port->qdma->eth;
138
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
142 {
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;
147 int err, index;
148 u32 id;
149 @@ -2600,6 +2599,7 @@ static int airoha_alloc_gdm_port(struct
150 return -ENOMEM;
151 }
152
153 + qdma = &eth->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);
163
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);
169 + port->qdma = qdma;
170 port->dev = dev;
171 - port->eth = eth;
172 port->id = id;
173 eth->ports[index] = port;
174