mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
9131cb44ff
Introduce EN7581 SoC support with currently rfb board supported. This is a new 64bit SoC from Airoha that is currently almost fully supported upstream with only the DTS missing. Setting source-only waiting for the full upstream support to be completed. Link: https://github.com/openwrt/openwrt/pull/16730 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
175 lines
5.4 KiB
Diff
175 lines
5.4 KiB
Diff
From 9304640f2f78147dddf97a5ea01502ae175e41d9 Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Thu, 1 Aug 2024 16:35:10 +0200
|
|
Subject: [PATCH 8/8] net: airoha: Link the gdm port to the selected qdma
|
|
controller
|
|
|
|
Link the running gdm port to the qdma controller used to connect with
|
|
the CPU. Moreover, load all QDMA controllers available on EN7581 SoC.
|
|
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Link: https://patch.msgid.link/95b515df34ba4727f7ae5b14a1d0462cceec84ff.1722522582.git.lorenzo@kernel.org
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/ethernet/mediatek/airoha_eth.c | 37 +++++++++++-----------
|
|
1 file changed, 19 insertions(+), 18 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
|
|
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
|
|
@@ -18,7 +18,7 @@
|
|
#include <uapi/linux/ppp_defs.h>
|
|
|
|
#define AIROHA_MAX_NUM_GDM_PORTS 1
|
|
-#define AIROHA_MAX_NUM_QDMA 1
|
|
+#define AIROHA_MAX_NUM_QDMA 2
|
|
#define AIROHA_MAX_NUM_RSTS 3
|
|
#define AIROHA_MAX_NUM_XSI_RSTS 5
|
|
#define AIROHA_MAX_MTU 2000
|
|
@@ -805,8 +805,8 @@ struct airoha_qdma {
|
|
};
|
|
|
|
struct airoha_gdm_port {
|
|
+ struct airoha_qdma *qdma;
|
|
struct net_device *dev;
|
|
- struct airoha_eth *eth;
|
|
int id;
|
|
|
|
struct airoha_hw_stats stats;
|
|
@@ -2139,7 +2139,7 @@ static void airoha_qdma_start_napi(struc
|
|
|
|
static void airoha_update_hw_stats(struct airoha_gdm_port *port)
|
|
{
|
|
- struct airoha_eth *eth = port->eth;
|
|
+ struct airoha_eth *eth = port->qdma->eth;
|
|
u32 val, i = 0;
|
|
|
|
spin_lock(&port->stats.lock);
|
|
@@ -2284,22 +2284,22 @@ static void airoha_update_hw_stats(struc
|
|
static int airoha_dev_open(struct net_device *dev)
|
|
{
|
|
struct airoha_gdm_port *port = netdev_priv(dev);
|
|
- struct airoha_eth *eth = port->eth;
|
|
+ struct airoha_qdma *qdma = port->qdma;
|
|
int err;
|
|
|
|
netif_tx_start_all_queues(dev);
|
|
- err = airoha_set_gdm_ports(eth, true);
|
|
+ err = airoha_set_gdm_ports(qdma->eth, true);
|
|
if (err)
|
|
return err;
|
|
|
|
if (netdev_uses_dsa(dev))
|
|
- airoha_fe_set(eth, REG_GDM_INGRESS_CFG(port->id),
|
|
+ airoha_fe_set(qdma->eth, REG_GDM_INGRESS_CFG(port->id),
|
|
GDM_STAG_EN_MASK);
|
|
else
|
|
- airoha_fe_clear(eth, REG_GDM_INGRESS_CFG(port->id),
|
|
+ airoha_fe_clear(qdma->eth, REG_GDM_INGRESS_CFG(port->id),
|
|
GDM_STAG_EN_MASK);
|
|
|
|
- airoha_qdma_set(ð->qdma[0], REG_QDMA_GLOBAL_CFG,
|
|
+ airoha_qdma_set(qdma, REG_QDMA_GLOBAL_CFG,
|
|
GLOBAL_CFG_TX_DMA_EN_MASK |
|
|
GLOBAL_CFG_RX_DMA_EN_MASK);
|
|
|
|
@@ -2309,15 +2309,15 @@ static int airoha_dev_open(struct net_de
|
|
static int airoha_dev_stop(struct net_device *dev)
|
|
{
|
|
struct airoha_gdm_port *port = netdev_priv(dev);
|
|
- struct airoha_eth *eth = port->eth;
|
|
+ struct airoha_qdma *qdma = port->qdma;
|
|
int err;
|
|
|
|
netif_tx_disable(dev);
|
|
- err = airoha_set_gdm_ports(eth, false);
|
|
+ err = airoha_set_gdm_ports(qdma->eth, false);
|
|
if (err)
|
|
return err;
|
|
|
|
- airoha_qdma_clear(ð->qdma[0], REG_QDMA_GLOBAL_CFG,
|
|
+ airoha_qdma_clear(qdma, REG_QDMA_GLOBAL_CFG,
|
|
GLOBAL_CFG_TX_DMA_EN_MASK |
|
|
GLOBAL_CFG_RX_DMA_EN_MASK);
|
|
|
|
@@ -2333,7 +2333,7 @@ static int airoha_dev_set_macaddr(struct
|
|
if (err)
|
|
return err;
|
|
|
|
- airoha_set_macaddr(port->eth, dev->dev_addr);
|
|
+ airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
|
|
|
|
return 0;
|
|
}
|
|
@@ -2342,7 +2342,7 @@ static int airoha_dev_init(struct net_de
|
|
{
|
|
struct airoha_gdm_port *port = netdev_priv(dev);
|
|
|
|
- airoha_set_macaddr(port->eth, dev->dev_addr);
|
|
+ airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
|
|
|
|
return 0;
|
|
}
|
|
@@ -2376,10 +2376,9 @@ static netdev_tx_t airoha_dev_xmit(struc
|
|
struct airoha_gdm_port *port = netdev_priv(dev);
|
|
u32 msg0 = 0, msg1, len = skb_headlen(skb);
|
|
int i, qid = skb_get_queue_mapping(skb);
|
|
- struct airoha_eth *eth = port->eth;
|
|
+ struct airoha_qdma *qdma = port->qdma;
|
|
u32 nr_frags = 1 + sinfo->nr_frags;
|
|
struct netdev_queue *txq;
|
|
- struct airoha_qdma *qdma;
|
|
struct airoha_queue *q;
|
|
void *data = skb->data;
|
|
u16 index;
|
|
@@ -2407,7 +2406,6 @@ static netdev_tx_t airoha_dev_xmit(struc
|
|
msg1 = FIELD_PREP(QDMA_ETH_TXMSG_FPORT_MASK, fport) |
|
|
FIELD_PREP(QDMA_ETH_TXMSG_METER_MASK, 0x7f);
|
|
|
|
- qdma = ð->qdma[0];
|
|
q = &qdma->q_tx[qid];
|
|
if (WARN_ON_ONCE(!q->ndesc))
|
|
goto error;
|
|
@@ -2490,7 +2488,7 @@ static void airoha_ethtool_get_drvinfo(s
|
|
struct ethtool_drvinfo *info)
|
|
{
|
|
struct airoha_gdm_port *port = netdev_priv(dev);
|
|
- struct airoha_eth *eth = port->eth;
|
|
+ struct airoha_eth *eth = port->qdma->eth;
|
|
|
|
strscpy(info->driver, eth->dev->driver->name, sizeof(info->driver));
|
|
strscpy(info->bus_info, dev_name(eth->dev), sizeof(info->bus_info));
|
|
@@ -2571,6 +2569,7 @@ static int airoha_alloc_gdm_port(struct
|
|
{
|
|
const __be32 *id_ptr = of_get_property(np, "reg", NULL);
|
|
struct airoha_gdm_port *port;
|
|
+ struct airoha_qdma *qdma;
|
|
struct net_device *dev;
|
|
int err, index;
|
|
u32 id;
|
|
@@ -2600,6 +2599,7 @@ static int airoha_alloc_gdm_port(struct
|
|
return -ENOMEM;
|
|
}
|
|
|
|
+ qdma = ð->qdma[index % AIROHA_MAX_NUM_QDMA];
|
|
dev->netdev_ops = &airoha_netdev_ops;
|
|
dev->ethtool_ops = &airoha_ethtool_ops;
|
|
dev->max_mtu = AIROHA_MAX_MTU;
|
|
@@ -2609,6 +2609,7 @@ static int airoha_alloc_gdm_port(struct
|
|
NETIF_F_SG | NETIF_F_TSO;
|
|
dev->features |= dev->hw_features;
|
|
dev->dev.of_node = np;
|
|
+ dev->irq = qdma->irq;
|
|
SET_NETDEV_DEV(dev, eth->dev);
|
|
|
|
err = of_get_ethdev_address(np, dev);
|
|
@@ -2624,8 +2625,8 @@ static int airoha_alloc_gdm_port(struct
|
|
port = netdev_priv(dev);
|
|
u64_stats_init(&port->stats.syncp);
|
|
spin_lock_init(&port->stats.lock);
|
|
+ port->qdma = qdma;
|
|
port->dev = dev;
|
|
- port->eth = eth;
|
|
port->id = id;
|
|
eth->ports[index] = port;
|
|
|