Commit b87a542c authored by David S. Miller's avatar David S. Miller

Merge branch 'ravb-gbit-refactor'

Biju Das says:

====================
Add Factorisation code to support Gigabit Ethernet driver

The DMAC and EMAC blocks of Gigabit Ethernet IP found on RZ/G2L SoC are
similar to the R-Car Ethernet AVB IP.

The Gigabit Ethernet IP consists of Ethernet controller (E-MAC), Internal
TCP/IP Offload Engine (TOE)  and Dedicated Direct memory access controller
(DMAC).

With a few changes in the driver we can support both IPs.

This patch series aims to add factorisation code to support RZ/G2L SoC,
hardware feature bits for gPTP feature, Multiple irq feature and
optional reset support.

Ref:-
 * https://lore.kernel.org/linux-renesas-soc/TYCPR01MB59334319695607A2683C1A5E86E59@TYCPR01MB5933.jpnprd01.prod.outlook.com/T/#t
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 6956fa39 0d13a1a4
...@@ -956,10 +956,6 @@ enum RAVB_QUEUE { ...@@ -956,10 +956,6 @@ enum RAVB_QUEUE {
#define RX_BUF_SZ (2048 - ETH_FCS_LEN + sizeof(__sum16)) #define RX_BUF_SZ (2048 - ETH_FCS_LEN + sizeof(__sum16))
/* TX descriptors per packet */
#define NUM_TX_DESC_GEN2 2
#define NUM_TX_DESC_GEN3 1
struct ravb_tstamp_skb { struct ravb_tstamp_skb {
struct list_head list; struct list_head list;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -983,17 +979,19 @@ struct ravb_ptp { ...@@ -983,17 +979,19 @@ struct ravb_ptp {
struct ravb_ptp_perout perout[N_PER_OUT]; struct ravb_ptp_perout perout[N_PER_OUT];
}; };
enum ravb_chip_id {
RCAR_GEN2,
RCAR_GEN3,
};
struct ravb_hw_info { struct ravb_hw_info {
void (*rx_ring_free)(struct net_device *ndev, int q);
void (*rx_ring_format)(struct net_device *ndev, int q);
void *(*alloc_rx_desc)(struct net_device *ndev, int q);
bool (*receive)(struct net_device *ndev, int *quota, int q);
void (*set_rate)(struct net_device *ndev);
int (*set_rx_csum_feature)(struct net_device *ndev, netdev_features_t features);
void (*dmac_init)(struct net_device *ndev);
void (*emac_init)(struct net_device *ndev);
const char (*gstrings_stats)[ETH_GSTRING_LEN]; const char (*gstrings_stats)[ETH_GSTRING_LEN];
size_t gstrings_size; size_t gstrings_size;
netdev_features_t net_hw_features; netdev_features_t net_hw_features;
netdev_features_t net_features; netdev_features_t net_features;
enum ravb_chip_id chip_id;
int stats_len; int stats_len;
size_t max_rx_len; size_t max_rx_len;
unsigned aligned_tx: 1; unsigned aligned_tx: 1;
...@@ -1001,6 +999,9 @@ struct ravb_hw_info { ...@@ -1001,6 +999,9 @@ struct ravb_hw_info {
/* hardware features */ /* hardware features */
unsigned internal_delay:1; /* AVB-DMAC has internal delays */ unsigned internal_delay:1; /* AVB-DMAC has internal delays */
unsigned tx_counters:1; /* E-MAC has TX counters */ unsigned tx_counters:1; /* E-MAC has TX counters */
unsigned multi_irqs:1; /* AVB-DMAC and E-MAC has multiple irqs */
unsigned no_ptp_cfg_active:1; /* AVB-DMAC does not support gPTP active in config mode */
unsigned ptp_cfg_active:1; /* AVB-DMAC has gPTP support active in config mode */
}; };
struct ravb_private { struct ravb_private {
...@@ -1044,7 +1045,6 @@ struct ravb_private { ...@@ -1044,7 +1045,6 @@ struct ravb_private {
int msg_enable; int msg_enable;
int speed; int speed;
int emac_irq; int emac_irq;
enum ravb_chip_id chip_id;
int rx_irqs[NUM_RX_QUEUE]; int rx_irqs[NUM_RX_QUEUE];
int tx_irqs[NUM_TX_QUEUE]; int tx_irqs[NUM_TX_QUEUE];
...@@ -1057,6 +1057,7 @@ struct ravb_private { ...@@ -1057,6 +1057,7 @@ struct ravb_private {
unsigned int num_tx_desc; /* TX descriptors per packet */ unsigned int num_tx_desc; /* TX descriptors per packet */
const struct ravb_hw_info *info; const struct ravb_hw_info *info;
struct reset_control *rstc;
}; };
static inline u32 ravb_read(struct net_device *ndev, enum ravb_reg reg) static inline u32 ravb_read(struct net_device *ndev, enum ravb_reg reg)
......
This diff is collapsed.
...@@ -179,6 +179,7 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp, ...@@ -179,6 +179,7 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp,
{ {
struct ravb_private *priv = container_of(ptp, struct ravb_private, struct ravb_private *priv = container_of(ptp, struct ravb_private,
ptp.info); ptp.info);
const struct ravb_hw_info *info = priv->info;
struct net_device *ndev = priv->ndev; struct net_device *ndev = priv->ndev;
unsigned long flags; unsigned long flags;
...@@ -197,7 +198,7 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp, ...@@ -197,7 +198,7 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp,
priv->ptp.extts[req->index] = on; priv->ptp.extts[req->index] = on;
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
if (priv->chip_id == RCAR_GEN2) if (!info->multi_irqs)
ravb_modify(ndev, GIC, GIC_PTCE, on ? GIC_PTCE : 0); ravb_modify(ndev, GIC, GIC_PTCE, on ? GIC_PTCE : 0);
else if (on) else if (on)
ravb_write(ndev, GIE_PTCS, GIE); ravb_write(ndev, GIE_PTCS, GIE);
...@@ -213,6 +214,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp, ...@@ -213,6 +214,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
{ {
struct ravb_private *priv = container_of(ptp, struct ravb_private, struct ravb_private *priv = container_of(ptp, struct ravb_private,
ptp.info); ptp.info);
const struct ravb_hw_info *info = priv->info;
struct net_device *ndev = priv->ndev; struct net_device *ndev = priv->ndev;
struct ravb_ptp_perout *perout; struct ravb_ptp_perout *perout;
unsigned long flags; unsigned long flags;
...@@ -252,7 +254,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp, ...@@ -252,7 +254,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
error = ravb_ptp_update_compare(priv, (u32)start_ns); error = ravb_ptp_update_compare(priv, (u32)start_ns);
if (!error) { if (!error) {
/* Unmask interrupt */ /* Unmask interrupt */
if (priv->chip_id == RCAR_GEN2) if (!info->multi_irqs)
ravb_modify(ndev, GIC, GIC_PTME, GIC_PTME); ravb_modify(ndev, GIC, GIC_PTME, GIC_PTME);
else else
ravb_write(ndev, GIE_PTMS0, GIE); ravb_write(ndev, GIE_PTMS0, GIE);
...@@ -264,7 +266,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp, ...@@ -264,7 +266,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
perout->period = 0; perout->period = 0;
/* Mask interrupt */ /* Mask interrupt */
if (priv->chip_id == RCAR_GEN2) if (!info->multi_irqs)
ravb_modify(ndev, GIC, GIC_PTME, 0); ravb_modify(ndev, GIC, GIC_PTME, 0);
else else
ravb_write(ndev, GID_PTMD0, GID); ravb_write(ndev, GID_PTMD0, GID);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment