// SPDX-License-Identifier: GPL-2.0
/* Renesas Ethernet-TSN device driver
*
* Copyright (C) 2022 Renesas Electronics Corporation
* Copyright (C) 2023 Niklas Söderlund <niklas.soderlund@ragnatech.se>
*/
#include <linux/clk.h>
#include <linux/dma-mapping.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/module.h>
#include <linux/net_tstamp.h>
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h>
#include <linux/phy.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <linux/spinlock.h>
#include "rtsn.h"
#include "rcar_gen4_ptp.h"
struct rtsn_private {
struct net_device *ndev;
struct platform_device *pdev;
void __iomem *base;
struct rcar_gen4_ptp_private *ptp_priv;
struct clk *clk;
struct reset_control *reset;
u32 num_tx_ring;
u32 num_rx_ring;
u32 tx_desc_bat_size;
dma_addr_t tx_desc_bat_dma;
struct rtsn_desc *tx_desc_bat;
u32 rx_desc_bat_size;
dma_addr_t rx_desc_bat_dma;
struct rtsn_desc *rx_desc_bat;
dma_addr_t tx_desc_dma;
dma_addr_t rx_desc_dma;
struct rtsn_ext_desc *tx_ring;
struct rtsn_ext_ts_desc *rx_ring;
struct sk_buff **tx_skb;
struct sk_buff **rx_skb;
spinlock_t lock; /* Register access lock */
u32 cur_tx;
u32 dirty_tx;
u32 cur_rx;
u32 dirty_rx;
u8 ts_tag;
struct napi_struct napi;
struct rtnl_link_stats64 stats;
struct mii_bus *mii;
phy_interface_t iface;
int link;
int speed;
int tx_data_irq;
int rx_data_irq;
};
static u32 rtsn_read(struct rtsn_private *priv, enum rtsn_reg reg)
{
return ioread32(priv->base + reg);
}
static void rtsn_write(struct rtsn_private *priv, enum rtsn_reg reg, u32 data)
{
iowrite32(data, priv->base + reg);
}
static void rtsn_modify(struct rtsn_private *priv, enum rtsn_reg reg,
u32 clear, u32 set)
{
rtsn_write(priv, reg, (rtsn_read(priv, reg) & ~clear) | set);
}
static