Commit 5da8baa3 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-stmmac-Stop-using-hard-coded-callbacks'

Jose Abreu says:

====================
net: stmmac: Stop using hard-coded callbacks

This a starting point for a cleanup and re-organization of stmmac.

In this series we stop using hard-coded callbacks along the code and use
instead helpers which are defined in a single place ("hwif.h").

This brings several advantages:
	1) Less typing :)
	2) Guaranteed function pointer check
	3) More flexibility

By 2) we stop using the repeated pattern of:
	if (priv->hw->mac->some_func)
		priv->hw->mac->some_func(...)

I didn't check but I expect the final .ko will be bigger with this series
because *all* of function pointers are checked.

Anyway, I hope this can make the code more readable and more flexible now.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 309c446c 2c520b1c
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "stmmac.h" #include "stmmac.h"
static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) static int jumbo_frm(void *p, struct sk_buff *skb, int csum)
{ {
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p; struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p;
unsigned int nopaged_len = skb_headlen(skb); unsigned int nopaged_len = skb_headlen(skb);
...@@ -51,7 +51,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -51,7 +51,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
tx_q->tx_skbuff_dma[entry].buf = des2; tx_q->tx_skbuff_dma[entry].buf = des2;
tx_q->tx_skbuff_dma[entry].len = bmax; tx_q->tx_skbuff_dma[entry].len = bmax;
/* do not close the descriptor and do not set own bit */ /* do not close the descriptor and do not set own bit */
priv->hw->desc->prepare_tx_desc(desc, 1, bmax, csum, STMMAC_CHAIN_MODE, stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum, STMMAC_CHAIN_MODE,
0, false, skb->len); 0, false, skb->len);
while (len != 0) { while (len != 0) {
...@@ -68,9 +68,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -68,9 +68,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
return -1; return -1;
tx_q->tx_skbuff_dma[entry].buf = des2; tx_q->tx_skbuff_dma[entry].buf = des2;
tx_q->tx_skbuff_dma[entry].len = bmax; tx_q->tx_skbuff_dma[entry].len = bmax;
priv->hw->desc->prepare_tx_desc(desc, 0, bmax, csum, stmmac_prepare_tx_desc(priv, desc, 0, bmax, csum,
STMMAC_CHAIN_MODE, 1, STMMAC_CHAIN_MODE, 1, false, skb->len);
false, skb->len);
len -= bmax; len -= bmax;
i++; i++;
} else { } else {
...@@ -83,9 +82,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -83,9 +82,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
tx_q->tx_skbuff_dma[entry].buf = des2; tx_q->tx_skbuff_dma[entry].buf = des2;
tx_q->tx_skbuff_dma[entry].len = len; tx_q->tx_skbuff_dma[entry].len = len;
/* last descriptor can be set now */ /* last descriptor can be set now */
priv->hw->desc->prepare_tx_desc(desc, 0, len, csum, stmmac_prepare_tx_desc(priv, desc, 0, len, csum,
STMMAC_CHAIN_MODE, 1, STMMAC_CHAIN_MODE, 1, true, skb->len);
true, skb->len);
len = 0; len = 0;
} }
} }
...@@ -95,7 +93,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -95,7 +93,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
return entry; return entry;
} }
static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc) static unsigned int is_jumbo_frm(int len, int enh_desc)
{ {
unsigned int ret = 0; unsigned int ret = 0;
...@@ -107,7 +105,7 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc) ...@@ -107,7 +105,7 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)
return ret; return ret;
} }
static void stmmac_init_dma_chain(void *des, dma_addr_t phy_addr, static void init_dma_chain(void *des, dma_addr_t phy_addr,
unsigned int size, unsigned int extend_desc) unsigned int size, unsigned int extend_desc)
{ {
/* /*
...@@ -137,7 +135,7 @@ static void stmmac_init_dma_chain(void *des, dma_addr_t phy_addr, ...@@ -137,7 +135,7 @@ static void stmmac_init_dma_chain(void *des, dma_addr_t phy_addr,
} }
} }
static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) static void refill_desc3(void *priv_ptr, struct dma_desc *p)
{ {
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)priv_ptr; struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)priv_ptr;
struct stmmac_priv *priv = rx_q->priv_data; struct stmmac_priv *priv = rx_q->priv_data;
...@@ -153,7 +151,7 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) ...@@ -153,7 +151,7 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p)
sizeof(struct dma_desc))); sizeof(struct dma_desc)));
} }
static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) static void clean_desc3(void *priv_ptr, struct dma_desc *p)
{ {
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr; struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr;
struct stmmac_priv *priv = tx_q->priv_data; struct stmmac_priv *priv = tx_q->priv_data;
...@@ -171,9 +169,9 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) ...@@ -171,9 +169,9 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p)
} }
const struct stmmac_mode_ops chain_mode_ops = { const struct stmmac_mode_ops chain_mode_ops = {
.init = stmmac_init_dma_chain, .init = init_dma_chain,
.is_jumbo_frm = stmmac_is_jumbo_frm, .is_jumbo_frm = is_jumbo_frm,
.jumbo_frm = stmmac_jumbo_frm, .jumbo_frm = jumbo_frm,
.refill_desc3 = stmmac_refill_desc3, .refill_desc3 = refill_desc3,
.clean_desc3 = stmmac_clean_desc3, .clean_desc3 = clean_desc3,
}; };
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#endif #endif
#include "descs.h" #include "descs.h"
#include "hwif.h"
#include "mmc.h" #include "mmc.h"
/* Synopsys Core versions */ /* Synopsys Core versions */
...@@ -377,197 +378,11 @@ struct dma_features { ...@@ -377,197 +378,11 @@ struct dma_features {
#define JUMBO_LEN 9000 #define JUMBO_LEN 9000
/* Descriptors helpers */
struct stmmac_desc_ops {
/* DMA RX descriptor ring initialization */
void (*init_rx_desc) (struct dma_desc *p, int disable_rx_ic, int mode,
int end);
/* DMA TX descriptor ring initialization */
void (*init_tx_desc) (struct dma_desc *p, int mode, int end);
/* Invoked by the xmit function to prepare the tx descriptor */
void (*prepare_tx_desc) (struct dma_desc *p, int is_fs, int len,
bool csum_flag, int mode, bool tx_own,
bool ls, unsigned int tot_pkt_len);
void (*prepare_tso_tx_desc)(struct dma_desc *p, int is_fs, int len1,
int len2, bool tx_own, bool ls,
unsigned int tcphdrlen,
unsigned int tcppayloadlen);
/* Set/get the owner of the descriptor */
void (*set_tx_owner) (struct dma_desc *p);
int (*get_tx_owner) (struct dma_desc *p);
/* Clean the tx descriptor as soon as the tx irq is received */
void (*release_tx_desc) (struct dma_desc *p, int mode);
/* Clear interrupt on tx frame completion. When this bit is
* set an interrupt happens as soon as the frame is transmitted */
void (*set_tx_ic)(struct dma_desc *p);
/* Last tx segment reports the transmit status */
int (*get_tx_ls) (struct dma_desc *p);
/* Return the transmit status looking at the TDES1 */
int (*tx_status) (void *data, struct stmmac_extra_stats *x,
struct dma_desc *p, void __iomem *ioaddr);
/* Get the buffer size from the descriptor */
int (*get_tx_len) (struct dma_desc *p);
/* Handle extra events on specific interrupts hw dependent */
void (*set_rx_owner) (struct dma_desc *p);
/* Get the receive frame size */
int (*get_rx_frame_len) (struct dma_desc *p, int rx_coe_type);
/* Return the reception status looking at the RDES1 */
int (*rx_status) (void *data, struct stmmac_extra_stats *x,
struct dma_desc *p);
void (*rx_extended_status) (void *data, struct stmmac_extra_stats *x,
struct dma_extended_desc *p);
/* Set tx timestamp enable bit */
void (*enable_tx_timestamp) (struct dma_desc *p);
/* get tx timestamp status */
int (*get_tx_timestamp_status) (struct dma_desc *p);
/* get timestamp value */
u64(*get_timestamp) (void *desc, u32 ats);
/* get rx timestamp status */
int (*get_rx_timestamp_status)(void *desc, void *next_desc, u32 ats);
/* Display ring */
void (*display_ring)(void *head, unsigned int size, bool rx);
/* set MSS via context descriptor */
void (*set_mss)(struct dma_desc *p, unsigned int mss);
};
extern const struct stmmac_desc_ops enh_desc_ops; extern const struct stmmac_desc_ops enh_desc_ops;
extern const struct stmmac_desc_ops ndesc_ops; extern const struct stmmac_desc_ops ndesc_ops;
/* Specific DMA helpers */
struct stmmac_dma_ops {
/* DMA core initialization */
int (*reset)(void __iomem *ioaddr);
void (*init)(void __iomem *ioaddr, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx, u32 dma_rx, int atds);
void (*init_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, u32 chan);
void (*init_rx_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan);
void (*init_tx_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan);
/* Configure the AXI Bus Mode Register */
void (*axi)(void __iomem *ioaddr, struct stmmac_axi *axi);
/* Dump DMA registers */
void (*dump_regs)(void __iomem *ioaddr, u32 *reg_space);
/* Set tx/rx threshold in the csr6 register
* An invalid value enables the store-and-forward mode */
void (*dma_mode)(void __iomem *ioaddr, int txmode, int rxmode,
int rxfifosz);
void (*dma_rx_mode)(void __iomem *ioaddr, int mode, u32 channel,
int fifosz, u8 qmode);
void (*dma_tx_mode)(void __iomem *ioaddr, int mode, u32 channel,
int fifosz, u8 qmode);
/* To track extra statistic (if supported) */
void (*dma_diagnostic_fr) (void *data, struct stmmac_extra_stats *x,
void __iomem *ioaddr);
void (*enable_dma_transmission) (void __iomem *ioaddr);
void (*enable_dma_irq)(void __iomem *ioaddr, u32 chan);
void (*disable_dma_irq)(void __iomem *ioaddr, u32 chan);
void (*start_tx)(void __iomem *ioaddr, u32 chan);
void (*stop_tx)(void __iomem *ioaddr, u32 chan);
void (*start_rx)(void __iomem *ioaddr, u32 chan);
void (*stop_rx)(void __iomem *ioaddr, u32 chan);
int (*dma_interrupt) (void __iomem *ioaddr,
struct stmmac_extra_stats *x, u32 chan);
/* If supported then get the optional core features */
void (*get_hw_feature)(void __iomem *ioaddr,
struct dma_features *dma_cap);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt, u32 number_chan);
void (*set_tx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
void (*set_rx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
void (*set_rx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
void (*set_tx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
void (*enable_tso)(void __iomem *ioaddr, bool en, u32 chan);
};
struct mac_device_info; struct mac_device_info;
/* Helpers to program the MAC core */
struct stmmac_ops {
/* MAC core initialization */
void (*core_init)(struct mac_device_info *hw, struct net_device *dev);
/* Enable the MAC RX/TX */
void (*set_mac)(void __iomem *ioaddr, bool enable);
/* Enable and verify that the IPC module is supported */
int (*rx_ipc)(struct mac_device_info *hw);
/* Enable RX Queues */
void (*rx_queue_enable)(struct mac_device_info *hw, u8 mode, u32 queue);
/* RX Queues Priority */
void (*rx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
/* TX Queues Priority */
void (*tx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
/* RX Queues Routing */
void (*rx_queue_routing)(struct mac_device_info *hw, u8 packet,
u32 queue);
/* Program RX Algorithms */
void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw, u32 rx_alg);
/* Program TX Algorithms */
void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw, u32 tx_alg);
/* Set MTL TX queues weight */
void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw,
u32 weight, u32 queue);
/* RX MTL queue to RX dma mapping */
void (*map_mtl_to_dma)(struct mac_device_info *hw, u32 queue, u32 chan);
/* Configure AV Algorithm */
void (*config_cbs)(struct mac_device_info *hw, u32 send_slope,
u32 idle_slope, u32 high_credit, u32 low_credit,
u32 queue);
/* Dump MAC registers */
void (*dump_regs)(struct mac_device_info *hw, u32 *reg_space);
/* Handle extra events on specific interrupts hw dependent */
int (*host_irq_status)(struct mac_device_info *hw,
struct stmmac_extra_stats *x);
/* Handle MTL interrupts */
int (*host_mtl_irq_status)(struct mac_device_info *hw, u32 chan);
/* Multicast filter setting */
void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
/* Flow control setting */
void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
unsigned int fc, unsigned int pause_time, u32 tx_cnt);
/* Set power management mode (e.g. magic frame) */
void (*pmt)(struct mac_device_info *hw, unsigned long mode);
/* Set/Get Unicast MAC addresses */
void (*set_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
unsigned int reg_n);
void (*get_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
unsigned int reg_n);
void (*set_eee_mode)(struct mac_device_info *hw,
bool en_tx_lpi_clockgating);
void (*reset_eee_mode)(struct mac_device_info *hw);
void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw);
void (*set_eee_pls)(struct mac_device_info *hw, int link);
void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x,
u32 rx_queues, u32 tx_queues);
/* PCS calls */
void (*pcs_ctrl_ane)(void __iomem *ioaddr, bool ane, bool srgmi_ral,
bool loopback);
void (*pcs_rane)(void __iomem *ioaddr, bool restart);
void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
/* Safety Features */
int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp);
bool (*safety_feat_irq_status)(struct net_device *ndev,
void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats);
const char *(*safety_feat_dump)(struct stmmac_safety_stats *stats,
int index, unsigned long *count);
};
/* PTP and HW Timer helpers */
struct stmmac_hwtimestamp {
void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
u32 (*config_sub_second_increment)(void __iomem *ioaddr, u32 ptp_clock,
int gmac4);
int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec);
int (*config_addend) (void __iomem *ioaddr, u32 addend);
int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec,
int add_sub, int gmac4);
u64(*get_systime) (void __iomem *ioaddr);
};
extern const struct stmmac_hwtimestamp stmmac_ptp; extern const struct stmmac_hwtimestamp stmmac_ptp;
extern const struct stmmac_mode_ops dwmac4_ring_mode_ops; extern const struct stmmac_mode_ops dwmac4_ring_mode_ops;
...@@ -590,18 +405,6 @@ struct mii_regs { ...@@ -590,18 +405,6 @@ struct mii_regs {
unsigned int clk_csr_mask; unsigned int clk_csr_mask;
}; };
/* Helpers to manage the descriptors for chain and ring modes */
struct stmmac_mode_ops {
void (*init) (void *des, dma_addr_t phy_addr, unsigned int size,
unsigned int extend_desc);
unsigned int (*is_jumbo_frm) (int len, int ehn_desc);
int (*jumbo_frm)(void *priv, struct sk_buff *skb, int csum);
int (*set_16kib_bfsize)(int mtu);
void (*init_desc3)(struct dma_desc *p);
void (*refill_desc3) (void *priv, struct dma_desc *p);
void (*clean_desc3) (void *priv, struct dma_desc *p);
};
struct mac_device_info { struct mac_device_info {
const struct stmmac_ops *mac; const struct stmmac_ops *mac;
const struct stmmac_desc_ops *desc; const struct stmmac_desc_ops *desc;
......
...@@ -223,7 +223,7 @@ static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p) ...@@ -223,7 +223,7 @@ static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p)
return 0; return 0;
} }
static inline u64 dwmac4_get_timestamp(void *desc, u32 ats) static inline void dwmac4_get_timestamp(void *desc, u32 ats, u64 *ts)
{ {
struct dma_desc *p = (struct dma_desc *)desc; struct dma_desc *p = (struct dma_desc *)desc;
u64 ns; u64 ns;
...@@ -232,7 +232,7 @@ static inline u64 dwmac4_get_timestamp(void *desc, u32 ats) ...@@ -232,7 +232,7 @@ static inline u64 dwmac4_get_timestamp(void *desc, u32 ats)
/* convert high/sec time stamp value to nanosecond */ /* convert high/sec time stamp value to nanosecond */
ns += le32_to_cpu(p->des1) * 1000000000ULL; ns += le32_to_cpu(p->des1) * 1000000000ULL;
return ns; *ts = ns;
} }
static int dwmac4_rx_check_timestamp(void *desc) static int dwmac4_rx_check_timestamp(void *desc)
......
...@@ -237,15 +237,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp) ...@@ -237,15 +237,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)
return 0; return 0;
} }
bool dwmac5_safety_feat_irq_status(struct net_device *ndev, int dwmac5_safety_feat_irq_status(struct net_device *ndev,
void __iomem *ioaddr, unsigned int asp, void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats) struct stmmac_safety_stats *stats)
{ {
bool ret = false, err, corr; bool err, corr;
u32 mtl, dma; u32 mtl, dma;
int ret = 0;
if (!asp) if (!asp)
return false; return -EINVAL;
mtl = readl(ioaddr + MTL_SAFETY_INT_STATUS); mtl = readl(ioaddr + MTL_SAFETY_INT_STATUS);
dma = readl(ioaddr + DMA_SAFETY_INT_STATUS); dma = readl(ioaddr + DMA_SAFETY_INT_STATUS);
...@@ -282,17 +283,19 @@ static const struct dwmac5_error { ...@@ -282,17 +283,19 @@ static const struct dwmac5_error {
{ dwmac5_dma_errors }, { dwmac5_dma_errors },
}; };
const char *dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats, int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
int index, unsigned long *count) int index, unsigned long *count, const char **desc)
{ {
int module = index / 32, offset = index % 32; int module = index / 32, offset = index % 32;
unsigned long *ptr = (unsigned long *)stats; unsigned long *ptr = (unsigned long *)stats;
if (module >= ARRAY_SIZE(dwmac5_all_errors)) if (module >= ARRAY_SIZE(dwmac5_all_errors))
return NULL; return -EINVAL;
if (!dwmac5_all_errors[module].desc[offset].valid) if (!dwmac5_all_errors[module].desc[offset].valid)
return NULL; return -EINVAL;
if (count) if (count)
*count = *(ptr + index); *count = *(ptr + index);
return dwmac5_all_errors[module].desc[offset].desc; if (desc)
*desc = dwmac5_all_errors[module].desc[offset].desc;
return 0;
} }
...@@ -43,10 +43,10 @@ ...@@ -43,10 +43,10 @@
#define DMA_ECC_INT_STATUS 0x00001088 #define DMA_ECC_INT_STATUS 0x00001088
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp); int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp);
bool dwmac5_safety_feat_irq_status(struct net_device *ndev, int dwmac5_safety_feat_irq_status(struct net_device *ndev,
void __iomem *ioaddr, unsigned int asp, void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats); struct stmmac_safety_stats *stats);
const char *dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats, int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
int index, unsigned long *count); int index, unsigned long *count, const char **desc);
#endif /* __DWMAC5_H__ */ #endif /* __DWMAC5_H__ */
...@@ -382,7 +382,7 @@ static int enh_desc_get_tx_timestamp_status(struct dma_desc *p) ...@@ -382,7 +382,7 @@ static int enh_desc_get_tx_timestamp_status(struct dma_desc *p)
return (le32_to_cpu(p->des0) & ETDES0_TIME_STAMP_STATUS) >> 17; return (le32_to_cpu(p->des0) & ETDES0_TIME_STAMP_STATUS) >> 17;
} }
static u64 enh_desc_get_timestamp(void *desc, u32 ats) static void enh_desc_get_timestamp(void *desc, u32 ats, u64 *ts)
{ {
u64 ns; u64 ns;
...@@ -397,7 +397,7 @@ static u64 enh_desc_get_timestamp(void *desc, u32 ats) ...@@ -397,7 +397,7 @@ static u64 enh_desc_get_timestamp(void *desc, u32 ats)
ns += le32_to_cpu(p->des3) * 1000000000ULL; ns += le32_to_cpu(p->des3) * 1000000000ULL;
} }
return ns; *ts = ns;
} }
static int enh_desc_get_rx_timestamp_status(void *desc, void *next_desc, static int enh_desc_get_rx_timestamp_status(void *desc, void *next_desc,
......
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
// Copyright (c) 2018 Synopsys, Inc. and/or its affiliates.
// stmmac HW Interface Callbacks
#ifndef __STMMAC_HWIF_H__
#define __STMMAC_HWIF_H__
#define stmmac_do_void_callback(__priv, __module, __cname, __arg0, __args...) \
({ \
int __result = -EINVAL; \
if ((__priv)->hw->__module->__cname) { \
(__priv)->hw->__module->__cname((__arg0), ##__args); \
__result = 0; \
} \
__result; \
})
#define stmmac_do_callback(__priv, __module, __cname, __arg0, __args...) \
({ \
int __result = -EINVAL; \
if ((__priv)->hw->__module->__cname) \
__result = (__priv)->hw->__module->__cname((__arg0), ##__args); \
__result; \
})
struct stmmac_extra_stats;
struct stmmac_safety_stats;
struct dma_desc;
struct dma_extended_desc;
/* Descriptors helpers */
struct stmmac_desc_ops {
/* DMA RX descriptor ring initialization */
void (*init_rx_desc)(struct dma_desc *p, int disable_rx_ic, int mode,
int end);
/* DMA TX descriptor ring initialization */
void (*init_tx_desc)(struct dma_desc *p, int mode, int end);
/* Invoked by the xmit function to prepare the tx descriptor */
void (*prepare_tx_desc)(struct dma_desc *p, int is_fs, int len,
bool csum_flag, int mode, bool tx_own, bool ls,
unsigned int tot_pkt_len);
void (*prepare_tso_tx_desc)(struct dma_desc *p, int is_fs, int len1,
int len2, bool tx_own, bool ls, unsigned int tcphdrlen,
unsigned int tcppayloadlen);
/* Set/get the owner of the descriptor */
void (*set_tx_owner)(struct dma_desc *p);
int (*get_tx_owner)(struct dma_desc *p);
/* Clean the tx descriptor as soon as the tx irq is received */
void (*release_tx_desc)(struct dma_desc *p, int mode);
/* Clear interrupt on tx frame completion. When this bit is
* set an interrupt happens as soon as the frame is transmitted */
void (*set_tx_ic)(struct dma_desc *p);
/* Last tx segment reports the transmit status */
int (*get_tx_ls)(struct dma_desc *p);
/* Return the transmit status looking at the TDES1 */
int (*tx_status)(void *data, struct stmmac_extra_stats *x,
struct dma_desc *p, void __iomem *ioaddr);
/* Get the buffer size from the descriptor */
int (*get_tx_len)(struct dma_desc *p);
/* Handle extra events on specific interrupts hw dependent */
void (*set_rx_owner)(struct dma_desc *p);
/* Get the receive frame size */
int (*get_rx_frame_len)(struct dma_desc *p, int rx_coe_type);
/* Return the reception status looking at the RDES1 */
int (*rx_status)(void *data, struct stmmac_extra_stats *x,
struct dma_desc *p);
void (*rx_extended_status)(void *data, struct stmmac_extra_stats *x,
struct dma_extended_desc *p);
/* Set tx timestamp enable bit */
void (*enable_tx_timestamp) (struct dma_desc *p);
/* get tx timestamp status */
int (*get_tx_timestamp_status) (struct dma_desc *p);
/* get timestamp value */
void (*get_timestamp)(void *desc, u32 ats, u64 *ts);
/* get rx timestamp status */
int (*get_rx_timestamp_status)(void *desc, void *next_desc, u32 ats);
/* Display ring */
void (*display_ring)(void *head, unsigned int size, bool rx);
/* set MSS via context descriptor */
void (*set_mss)(struct dma_desc *p, unsigned int mss);
};
#define stmmac_init_rx_desc(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, init_rx_desc, __args)
#define stmmac_init_tx_desc(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, init_tx_desc, __args)
#define stmmac_prepare_tx_desc(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, prepare_tx_desc, __args)
#define stmmac_prepare_tso_tx_desc(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, prepare_tso_tx_desc, __args)
#define stmmac_set_tx_owner(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, set_tx_owner, __args)
#define stmmac_get_tx_owner(__priv, __args...) \
stmmac_do_callback(__priv, desc, get_tx_owner, __args)
#define stmmac_release_tx_desc(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, release_tx_desc, __args)
#define stmmac_set_tx_ic(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, set_tx_ic, __args)
#define stmmac_get_tx_ls(__priv, __args...) \
stmmac_do_callback(__priv, desc, get_tx_ls, __args)
#define stmmac_tx_status(__priv, __args...) \
stmmac_do_callback(__priv, desc, tx_status, __args)
#define stmmac_get_tx_len(__priv, __args...) \
stmmac_do_callback(__priv, desc, get_tx_len, __args)
#define stmmac_set_rx_owner(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, set_rx_owner, __args)
#define stmmac_get_rx_frame_len(__priv, __args...) \
stmmac_do_callback(__priv, desc, get_rx_frame_len, __args)
#define stmmac_rx_status(__priv, __args...) \
stmmac_do_callback(__priv, desc, rx_status, __args)
#define stmmac_rx_extended_status(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, rx_extended_status, __args)
#define stmmac_enable_tx_timestamp(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, enable_tx_timestamp, __args)
#define stmmac_get_tx_timestamp_status(__priv, __args...) \
stmmac_do_callback(__priv, desc, get_tx_timestamp_status, __args)
#define stmmac_get_timestamp(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, get_timestamp, __args)
#define stmmac_get_rx_timestamp_status(__priv, __args...) \
stmmac_do_callback(__priv, desc, get_rx_timestamp_status, __args)
#define stmmac_display_ring(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, display_ring, __args)
#define stmmac_set_mss(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, set_mss, __args)
struct stmmac_dma_cfg;
struct dma_features;
/* Specific DMA helpers */
struct stmmac_dma_ops {
/* DMA core initialization */
int (*reset)(void __iomem *ioaddr);
void (*init)(void __iomem *ioaddr, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx, u32 dma_rx, int atds);
void (*init_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, u32 chan);
void (*init_rx_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan);
void (*init_tx_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan);
/* Configure the AXI Bus Mode Register */
void (*axi)(void __iomem *ioaddr, struct stmmac_axi *axi);
/* Dump DMA registers */
void (*dump_regs)(void __iomem *ioaddr, u32 *reg_space);
/* Set tx/rx threshold in the csr6 register
* An invalid value enables the store-and-forward mode */
void (*dma_mode)(void __iomem *ioaddr, int txmode, int rxmode,
int rxfifosz);
void (*dma_rx_mode)(void __iomem *ioaddr, int mode, u32 channel,
int fifosz, u8 qmode);
void (*dma_tx_mode)(void __iomem *ioaddr, int mode, u32 channel,
int fifosz, u8 qmode);
/* To track extra statistic (if supported) */
void (*dma_diagnostic_fr) (void *data, struct stmmac_extra_stats *x,
void __iomem *ioaddr);
void (*enable_dma_transmission) (void __iomem *ioaddr);
void (*enable_dma_irq)(void __iomem *ioaddr, u32 chan);
void (*disable_dma_irq)(void __iomem *ioaddr, u32 chan);
void (*start_tx)(void __iomem *ioaddr, u32 chan);
void (*stop_tx)(void __iomem *ioaddr, u32 chan);
void (*start_rx)(void __iomem *ioaddr, u32 chan);
void (*stop_rx)(void __iomem *ioaddr, u32 chan);
int (*dma_interrupt) (void __iomem *ioaddr,
struct stmmac_extra_stats *x, u32 chan);
/* If supported then get the optional core features */
void (*get_hw_feature)(void __iomem *ioaddr,
struct dma_features *dma_cap);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt, u32 number_chan);
void (*set_tx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
void (*set_rx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
void (*set_rx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
void (*set_tx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
void (*enable_tso)(void __iomem *ioaddr, bool en, u32 chan);
};
#define stmmac_reset(__priv, __args...) \
stmmac_do_callback(__priv, dma, reset, __args)
#define stmmac_dma_init(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, init, __args)
#define stmmac_init_chan(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, init_chan, __args)
#define stmmac_init_rx_chan(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, init_rx_chan, __args)
#define stmmac_init_tx_chan(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, init_tx_chan, __args)
#define stmmac_axi(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, axi, __args)
#define stmmac_dump_dma_regs(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, dump_regs, __args)
#define stmmac_dma_mode(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, dma_mode, __args)
#define stmmac_dma_rx_mode(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, dma_rx_mode, __args)
#define stmmac_dma_tx_mode(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, dma_tx_mode, __args)
#define stmmac_dma_diagnostic_fr(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, dma_diagnostic_fr, __args)
#define stmmac_enable_dma_transmission(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, enable_dma_transmission, __args)
#define stmmac_enable_dma_irq(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, enable_dma_irq, __args)
#define stmmac_disable_dma_irq(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, disable_dma_irq, __args)
#define stmmac_start_tx(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, start_tx, __args)
#define stmmac_stop_tx(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, stop_tx, __args)
#define stmmac_start_rx(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, start_rx, __args)
#define stmmac_stop_rx(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, stop_rx, __args)
#define stmmac_dma_interrupt_status(__priv, __args...) \
stmmac_do_callback(__priv, dma, dma_interrupt, __args)
#define stmmac_get_hw_feature(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, get_hw_feature, __args)
#define stmmac_rx_watchdog(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, rx_watchdog, __args)
#define stmmac_set_tx_ring_len(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, set_tx_ring_len, __args)
#define stmmac_set_rx_ring_len(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, set_rx_ring_len, __args)
#define stmmac_set_rx_tail_ptr(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, set_rx_tail_ptr, __args)
#define stmmac_set_tx_tail_ptr(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, set_tx_tail_ptr, __args)
#define stmmac_enable_tso(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, enable_tso, __args)
struct mac_device_info;
struct net_device;
struct rgmii_adv;
struct stmmac_safety_stats;
/* Helpers to program the MAC core */
struct stmmac_ops {
/* MAC core initialization */
void (*core_init)(struct mac_device_info *hw, struct net_device *dev);
/* Enable the MAC RX/TX */
void (*set_mac)(void __iomem *ioaddr, bool enable);
/* Enable and verify that the IPC module is supported */
int (*rx_ipc)(struct mac_device_info *hw);
/* Enable RX Queues */
void (*rx_queue_enable)(struct mac_device_info *hw, u8 mode, u32 queue);
/* RX Queues Priority */
void (*rx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
/* TX Queues Priority */
void (*tx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
/* RX Queues Routing */
void (*rx_queue_routing)(struct mac_device_info *hw, u8 packet,
u32 queue);
/* Program RX Algorithms */
void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw, u32 rx_alg);
/* Program TX Algorithms */
void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw, u32 tx_alg);
/* Set MTL TX queues weight */
void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw,
u32 weight, u32 queue);
/* RX MTL queue to RX dma mapping */
void (*map_mtl_to_dma)(struct mac_device_info *hw, u32 queue, u32 chan);
/* Configure AV Algorithm */
void (*config_cbs)(struct mac_device_info *hw, u32 send_slope,
u32 idle_slope, u32 high_credit, u32 low_credit,
u32 queue);
/* Dump MAC registers */
void (*dump_regs)(struct mac_device_info *hw, u32 *reg_space);
/* Handle extra events on specific interrupts hw dependent */
int (*host_irq_status)(struct mac_device_info *hw,
struct stmmac_extra_stats *x);
/* Handle MTL interrupts */
int (*host_mtl_irq_status)(struct mac_device_info *hw, u32 chan);
/* Multicast filter setting */
void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
/* Flow control setting */
void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
unsigned int fc, unsigned int pause_time, u32 tx_cnt);
/* Set power management mode (e.g. magic frame) */
void (*pmt)(struct mac_device_info *hw, unsigned long mode);
/* Set/Get Unicast MAC addresses */
void (*set_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
unsigned int reg_n);
void (*get_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
unsigned int reg_n);
void (*set_eee_mode)(struct mac_device_info *hw,
bool en_tx_lpi_clockgating);
void (*reset_eee_mode)(struct mac_device_info *hw);
void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw);
void (*set_eee_pls)(struct mac_device_info *hw, int link);
void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x,
u32 rx_queues, u32 tx_queues);
/* PCS calls */
void (*pcs_ctrl_ane)(void __iomem *ioaddr, bool ane, bool srgmi_ral,
bool loopback);
void (*pcs_rane)(void __iomem *ioaddr, bool restart);
void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
/* Safety Features */
int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp);
int (*safety_feat_irq_status)(struct net_device *ndev,
void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_stats *stats);
int (*safety_feat_dump)(struct stmmac_safety_stats *stats,
int index, unsigned long *count, const char **desc);
};
#define stmmac_core_init(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, core_init, __args)
#define stmmac_mac_set(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_mac, __args)
#define stmmac_rx_ipc(__priv, __args...) \
stmmac_do_callback(__priv, mac, rx_ipc, __args)
#define stmmac_rx_queue_enable(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, rx_queue_enable, __args)
#define stmmac_rx_queue_prio(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, rx_queue_prio, __args)
#define stmmac_tx_queue_prio(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, tx_queue_prio, __args)
#define stmmac_rx_queue_routing(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, rx_queue_routing, __args)
#define stmmac_prog_mtl_rx_algorithms(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, prog_mtl_rx_algorithms, __args)
#define stmmac_prog_mtl_tx_algorithms(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, prog_mtl_tx_algorithms, __args)
#define stmmac_set_mtl_tx_queue_weight(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_mtl_tx_queue_weight, __args)
#define stmmac_map_mtl_to_dma(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, map_mtl_to_dma, __args)
#define stmmac_config_cbs(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, config_cbs, __args)
#define stmmac_dump_mac_regs(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, dump_regs, __args)
#define stmmac_host_irq_status(__priv, __args...) \
stmmac_do_callback(__priv, mac, host_irq_status, __args)
#define stmmac_host_mtl_irq_status(__priv, __args...) \
stmmac_do_callback(__priv, mac, host_mtl_irq_status, __args)
#define stmmac_set_filter(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_filter, __args)
#define stmmac_flow_ctrl(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, flow_ctrl, __args)
#define stmmac_pmt(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, pmt, __args)
#define stmmac_set_umac_addr(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_umac_addr, __args)
#define stmmac_get_umac_addr(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, get_umac_addr, __args)
#define stmmac_set_eee_mode(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_eee_mode, __args)
#define stmmac_reset_eee_mode(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, reset_eee_mode, __args)
#define stmmac_set_eee_timer(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_eee_timer, __args)
#define stmmac_set_eee_pls(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_eee_pls, __args)
#define stmmac_mac_debug(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, debug, __args)
#define stmmac_pcs_ctrl_ane(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, pcs_ctrl_ane, __args)
#define stmmac_pcs_rane(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, pcs_rane, __args)
#define stmmac_pcs_get_adv_lp(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, pcs_get_adv_lp, __args)
#define stmmac_safety_feat_config(__priv, __args...) \
stmmac_do_callback(__priv, mac, safety_feat_config, __args)
#define stmmac_safety_feat_irq_status(__priv, __args...) \
stmmac_do_callback(__priv, mac, safety_feat_irq_status, __args)
#define stmmac_safety_feat_dump(__priv, __args...) \
stmmac_do_callback(__priv, mac, safety_feat_dump, __args)
/* PTP and HW Timer helpers */
struct stmmac_hwtimestamp {
void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
void (*config_sub_second_increment)(void __iomem *ioaddr, u32 ptp_clock,
int gmac4, u32 *ssinc);
int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec);
int (*config_addend) (void __iomem *ioaddr, u32 addend);
int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec,
int add_sub, int gmac4);
void (*get_systime) (void __iomem *ioaddr, u64 *systime);
};
#define stmmac_config_hw_tstamping(__priv, __args...) \
stmmac_do_void_callback(__priv, ptp, config_hw_tstamping, __args)
#define stmmac_config_sub_second_increment(__priv, __args...) \
stmmac_do_void_callback(__priv, ptp, config_sub_second_increment, __args)
#define stmmac_init_systime(__priv, __args...) \
stmmac_do_callback(__priv, ptp, init_systime, __args)
#define stmmac_config_addend(__priv, __args...) \
stmmac_do_callback(__priv, ptp, config_addend, __args)
#define stmmac_adjust_systime(__priv, __args...) \
stmmac_do_callback(__priv, ptp, adjust_systime, __args)
#define stmmac_get_systime(__priv, __args...) \
stmmac_do_void_callback(__priv, ptp, get_systime, __args)
/* Helpers to manage the descriptors for chain and ring modes */
struct stmmac_mode_ops {
void (*init) (void *des, dma_addr_t phy_addr, unsigned int size,
unsigned int extend_desc);
unsigned int (*is_jumbo_frm) (int len, int ehn_desc);
int (*jumbo_frm)(void *priv, struct sk_buff *skb, int csum);
int (*set_16kib_bfsize)(int mtu);
void (*init_desc3)(struct dma_desc *p);
void (*refill_desc3) (void *priv, struct dma_desc *p);
void (*clean_desc3) (void *priv, struct dma_desc *p);
};
#define stmmac_mode_init(__priv, __args...) \
stmmac_do_void_callback(__priv, mode, init, __args)
#define stmmac_is_jumbo_frm(__priv, __args...) \
stmmac_do_callback(__priv, mode, is_jumbo_frm, __args)
#define stmmac_jumbo_frm(__priv, __args...) \
stmmac_do_callback(__priv, mode, jumbo_frm, __args)
#define stmmac_set_16kib_bfsize(__priv, __args...) \
stmmac_do_callback(__priv, mode, set_16kib_bfsize, __args)
#define stmmac_init_desc3(__priv, __args...) \
stmmac_do_void_callback(__priv, mode, init_desc3, __args)
#define stmmac_refill_desc3(__priv, __args...) \
stmmac_do_void_callback(__priv, mode, refill_desc3, __args)
#define stmmac_clean_desc3(__priv, __args...) \
stmmac_do_void_callback(__priv, mode, clean_desc3, __args)
#endif /* __STMMAC_HWIF_H__ */
...@@ -253,7 +253,7 @@ static int ndesc_get_tx_timestamp_status(struct dma_desc *p) ...@@ -253,7 +253,7 @@ static int ndesc_get_tx_timestamp_status(struct dma_desc *p)
return (le32_to_cpu(p->des0) & TDES0_TIME_STAMP_STATUS) >> 17; return (le32_to_cpu(p->des0) & TDES0_TIME_STAMP_STATUS) >> 17;
} }
static u64 ndesc_get_timestamp(void *desc, u32 ats) static void ndesc_get_timestamp(void *desc, u32 ats, u64 *ts)
{ {
struct dma_desc *p = (struct dma_desc *)desc; struct dma_desc *p = (struct dma_desc *)desc;
u64 ns; u64 ns;
...@@ -262,7 +262,7 @@ static u64 ndesc_get_timestamp(void *desc, u32 ats) ...@@ -262,7 +262,7 @@ static u64 ndesc_get_timestamp(void *desc, u32 ats)
/* convert high/sec time stamp value to nanosecond */ /* convert high/sec time stamp value to nanosecond */
ns += le32_to_cpu(p->des3) * 1000000000ULL; ns += le32_to_cpu(p->des3) * 1000000000ULL;
return ns; *ts = ns;
} }
static int ndesc_get_rx_timestamp_status(void *desc, void *next_desc, u32 ats) static int ndesc_get_rx_timestamp_status(void *desc, void *next_desc, u32 ats)
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "stmmac.h" #include "stmmac.h"
static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) static int jumbo_frm(void *p, struct sk_buff *skb, int csum)
{ {
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p; struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p;
unsigned int nopaged_len = skb_headlen(skb); unsigned int nopaged_len = skb_headlen(skb);
...@@ -58,9 +58,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -58,9 +58,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
tx_q->tx_skbuff_dma[entry].is_jumbo = true; tx_q->tx_skbuff_dma[entry].is_jumbo = true;
desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB); desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
priv->hw->desc->prepare_tx_desc(desc, 1, bmax, csum, stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum,
STMMAC_RING_MODE, 0, STMMAC_RING_MODE, 0, false, skb->len);
false, skb->len);
tx_q->tx_skbuff[entry] = NULL; tx_q->tx_skbuff[entry] = NULL;
entry = STMMAC_GET_ENTRY(entry, DMA_TX_SIZE); entry = STMMAC_GET_ENTRY(entry, DMA_TX_SIZE);
...@@ -79,9 +78,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -79,9 +78,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
tx_q->tx_skbuff_dma[entry].is_jumbo = true; tx_q->tx_skbuff_dma[entry].is_jumbo = true;
desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB); desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
priv->hw->desc->prepare_tx_desc(desc, 0, len, csum, stmmac_prepare_tx_desc(priv, desc, 0, len, csum,
STMMAC_RING_MODE, 1, STMMAC_RING_MODE, 1, true, skb->len);
true, skb->len);
} else { } else {
des2 = dma_map_single(priv->device, skb->data, des2 = dma_map_single(priv->device, skb->data,
nopaged_len, DMA_TO_DEVICE); nopaged_len, DMA_TO_DEVICE);
...@@ -92,9 +90,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -92,9 +90,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
tx_q->tx_skbuff_dma[entry].len = nopaged_len; tx_q->tx_skbuff_dma[entry].len = nopaged_len;
tx_q->tx_skbuff_dma[entry].is_jumbo = true; tx_q->tx_skbuff_dma[entry].is_jumbo = true;
desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB); desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, csum, stmmac_prepare_tx_desc(priv, desc, 1, nopaged_len, csum,
STMMAC_RING_MODE, 0, STMMAC_RING_MODE, 0, true, skb->len);
true, skb->len);
} }
tx_q->cur_tx = entry; tx_q->cur_tx = entry;
...@@ -102,7 +99,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) ...@@ -102,7 +99,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
return entry; return entry;
} }
static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc) static unsigned int is_jumbo_frm(int len, int enh_desc)
{ {
unsigned int ret = 0; unsigned int ret = 0;
...@@ -112,7 +109,7 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc) ...@@ -112,7 +109,7 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)
return ret; return ret;
} }
static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) static void refill_desc3(void *priv_ptr, struct dma_desc *p)
{ {
struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr; struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr;
...@@ -122,12 +119,12 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) ...@@ -122,12 +119,12 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p)
} }
/* In ring mode we need to fill the desc3 because it is used as buffer */ /* In ring mode we need to fill the desc3 because it is used as buffer */
static void stmmac_init_desc3(struct dma_desc *p) static void init_desc3(struct dma_desc *p)
{ {
p->des3 = cpu_to_le32(le32_to_cpu(p->des2) + BUF_SIZE_8KiB); p->des3 = cpu_to_le32(le32_to_cpu(p->des2) + BUF_SIZE_8KiB);
} }
static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) static void clean_desc3(void *priv_ptr, struct dma_desc *p)
{ {
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr; struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr;
struct stmmac_priv *priv = tx_q->priv_data; struct stmmac_priv *priv = tx_q->priv_data;
...@@ -140,7 +137,7 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) ...@@ -140,7 +137,7 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p)
p->des3 = 0; p->des3 = 0;
} }
static int stmmac_set_16kib_bfsize(int mtu) static int set_16kib_bfsize(int mtu)
{ {
int ret = 0; int ret = 0;
if (unlikely(mtu >= BUF_SIZE_8KiB)) if (unlikely(mtu >= BUF_SIZE_8KiB))
...@@ -149,10 +146,10 @@ static int stmmac_set_16kib_bfsize(int mtu) ...@@ -149,10 +146,10 @@ static int stmmac_set_16kib_bfsize(int mtu)
} }
const struct stmmac_mode_ops ring_mode_ops = { const struct stmmac_mode_ops ring_mode_ops = {
.is_jumbo_frm = stmmac_is_jumbo_frm, .is_jumbo_frm = is_jumbo_frm,
.jumbo_frm = stmmac_jumbo_frm, .jumbo_frm = jumbo_frm,
.refill_desc3 = stmmac_refill_desc3, .refill_desc3 = refill_desc3,
.init_desc3 = stmmac_init_desc3, .init_desc3 = init_desc3,
.clean_desc3 = stmmac_clean_desc3, .clean_desc3 = clean_desc3,
.set_16kib_bfsize = stmmac_set_16kib_bfsize, .set_16kib_bfsize = set_16kib_bfsize,
}; };
...@@ -291,11 +291,9 @@ static int stmmac_ethtool_get_link_ksettings(struct net_device *dev, ...@@ -291,11 +291,9 @@ static int stmmac_ethtool_get_link_ksettings(struct net_device *dev,
cmd->base.speed = priv->xstats.pcs_speed; cmd->base.speed = priv->xstats.pcs_speed;
/* Get and convert ADV/LP_ADV from the HW AN registers */ /* Get and convert ADV/LP_ADV from the HW AN registers */
if (!priv->hw->mac->pcs_get_adv_lp) if (stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv))
return -EOPNOTSUPP; /* should never happen indeed */ return -EOPNOTSUPP; /* should never happen indeed */
priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv);
/* Encoding of PSE bits is defined in 802.3z, 37.2.1.4 */ /* Encoding of PSE bits is defined in 802.3z, 37.2.1.4 */
ethtool_convert_link_mode_to_legacy_u32( ethtool_convert_link_mode_to_legacy_u32(
...@@ -393,11 +391,7 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev, ...@@ -393,11 +391,7 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev,
ADVERTISED_10baseT_Full); ADVERTISED_10baseT_Full);
spin_lock(&priv->lock); spin_lock(&priv->lock);
stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0);
if (priv->hw->mac->pcs_ctrl_ane)
priv->hw->mac->pcs_ctrl_ane(priv->ioaddr, 1,
priv->hw->ps, 0);
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
return 0; return 0;
...@@ -442,8 +436,8 @@ static void stmmac_ethtool_gregs(struct net_device *dev, ...@@ -442,8 +436,8 @@ static void stmmac_ethtool_gregs(struct net_device *dev,
memset(reg_space, 0x0, REG_SPACE_SIZE); memset(reg_space, 0x0, REG_SPACE_SIZE);
priv->hw->mac->dump_regs(priv->hw, reg_space); stmmac_dump_mac_regs(priv, priv->hw, reg_space);
priv->hw->dma->dump_regs(priv->ioaddr, reg_space); stmmac_dump_dma_regs(priv, priv->ioaddr, reg_space);
/* Copy DMA registers to where ethtool expects them */ /* Copy DMA registers to where ethtool expects them */
memcpy(&reg_space[ETHTOOL_DMA_OFFSET], &reg_space[DMA_BUS_MODE / 4], memcpy(&reg_space[ETHTOOL_DMA_OFFSET], &reg_space[DMA_BUS_MODE / 4],
NUM_DWMAC1000_DMA_REGS * 4); NUM_DWMAC1000_DMA_REGS * 4);
...@@ -454,15 +448,13 @@ stmmac_get_pauseparam(struct net_device *netdev, ...@@ -454,15 +448,13 @@ stmmac_get_pauseparam(struct net_device *netdev,
struct ethtool_pauseparam *pause) struct ethtool_pauseparam *pause)
{ {
struct stmmac_priv *priv = netdev_priv(netdev); struct stmmac_priv *priv = netdev_priv(netdev);
struct rgmii_adv adv_lp;
pause->rx_pause = 0; pause->rx_pause = 0;
pause->tx_pause = 0; pause->tx_pause = 0;
if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) { if (priv->hw->pcs && !stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv_lp)) {
struct rgmii_adv adv_lp;
pause->autoneg = 1; pause->autoneg = 1;
priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
if (!adv_lp.pause) if (!adv_lp.pause)
return; return;
} else { } else {
...@@ -488,12 +480,10 @@ stmmac_set_pauseparam(struct net_device *netdev, ...@@ -488,12 +480,10 @@ stmmac_set_pauseparam(struct net_device *netdev,
u32 tx_cnt = priv->plat->tx_queues_to_use; u32 tx_cnt = priv->plat->tx_queues_to_use;
struct phy_device *phy = netdev->phydev; struct phy_device *phy = netdev->phydev;
int new_pause = FLOW_OFF; int new_pause = FLOW_OFF;
if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) {
struct rgmii_adv adv_lp; struct rgmii_adv adv_lp;
if (priv->hw->pcs && !stmmac_pcs_get_adv_lp(priv, priv->ioaddr, &adv_lp)) {
pause->autoneg = 1; pause->autoneg = 1;
priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
if (!adv_lp.pause) if (!adv_lp.pause)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} else { } else {
...@@ -515,7 +505,7 @@ stmmac_set_pauseparam(struct net_device *netdev, ...@@ -515,7 +505,7 @@ stmmac_set_pauseparam(struct net_device *netdev,
return phy_start_aneg(phy); return phy_start_aneg(phy);
} }
priv->hw->mac->flow_ctrl(priv->hw, phy->duplex, priv->flow_ctrl, stmmac_flow_ctrl(priv, priv->hw, phy->duplex, priv->flow_ctrl,
priv->pause, tx_cnt); priv->pause, tx_cnt);
return 0; return 0;
} }
...@@ -523,29 +513,24 @@ stmmac_set_pauseparam(struct net_device *netdev, ...@@ -523,29 +513,24 @@ stmmac_set_pauseparam(struct net_device *netdev,
static void stmmac_get_ethtool_stats(struct net_device *dev, static void stmmac_get_ethtool_stats(struct net_device *dev,
struct ethtool_stats *dummy, u64 *data) struct ethtool_stats *dummy, u64 *data)
{ {
const char *(*dump)(struct stmmac_safety_stats *stats, int index,
unsigned long *count);
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
u32 rx_queues_count = priv->plat->rx_queues_to_use; u32 rx_queues_count = priv->plat->rx_queues_to_use;
u32 tx_queues_count = priv->plat->tx_queues_to_use; u32 tx_queues_count = priv->plat->tx_queues_to_use;
unsigned long count; unsigned long count;
int i, j = 0; int i, j = 0, ret;
if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
dump = priv->hw->mac->safety_feat_dump;
if (priv->dma_cap.asp) {
for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) { for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
if (dump(&priv->sstats, i, &count)) if (!stmmac_safety_feat_dump(priv, &priv->sstats, i,
&count, NULL))
data[j++] = count; data[j++] = count;
} }
} }
/* Update the DMA HW counters for dwmac10/100 */ /* Update the DMA HW counters for dwmac10/100 */
if (priv->hw->dma->dma_diagnostic_fr) ret = stmmac_dma_diagnostic_fr(priv, &dev->stats, (void *) &priv->xstats,
priv->hw->dma->dma_diagnostic_fr(&dev->stats,
(void *) &priv->xstats,
priv->ioaddr); priv->ioaddr);
else { if (ret) {
/* If supported, for new GMAC chips expose the MMC counters */ /* If supported, for new GMAC chips expose the MMC counters */
if (priv->dma_cap.rmon) { if (priv->dma_cap.rmon) {
dwmac_mmc_read(priv->mmcaddr, &priv->mmc); dwmac_mmc_read(priv->mmcaddr, &priv->mmc);
...@@ -565,9 +550,8 @@ static void stmmac_get_ethtool_stats(struct net_device *dev, ...@@ -565,9 +550,8 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
priv->xstats.phy_eee_wakeup_error_n = val; priv->xstats.phy_eee_wakeup_error_n = val;
} }
if ((priv->hw->mac->debug) && if (priv->synopsys_id >= DWMAC_CORE_3_50)
(priv->synopsys_id >= DWMAC_CORE_3_50)) stmmac_mac_debug(priv, priv->ioaddr,
priv->hw->mac->debug(priv->ioaddr,
(void *)&priv->xstats, (void *)&priv->xstats,
rx_queues_count, tx_queues_count); rx_queues_count, tx_queues_count);
} }
...@@ -581,8 +565,6 @@ static void stmmac_get_ethtool_stats(struct net_device *dev, ...@@ -581,8 +565,6 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
static int stmmac_get_sset_count(struct net_device *netdev, int sset) static int stmmac_get_sset_count(struct net_device *netdev, int sset)
{ {
struct stmmac_priv *priv = netdev_priv(netdev); struct stmmac_priv *priv = netdev_priv(netdev);
const char *(*dump)(struct stmmac_safety_stats *stats, int index,
unsigned long *count);
int i, len, safety_len = 0; int i, len, safety_len = 0;
switch (sset) { switch (sset) {
...@@ -591,11 +573,11 @@ static int stmmac_get_sset_count(struct net_device *netdev, int sset) ...@@ -591,11 +573,11 @@ static int stmmac_get_sset_count(struct net_device *netdev, int sset)
if (priv->dma_cap.rmon) if (priv->dma_cap.rmon)
len += STMMAC_MMC_STATS_LEN; len += STMMAC_MMC_STATS_LEN;
if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) { if (priv->dma_cap.asp) {
dump = priv->hw->mac->safety_feat_dump;
for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) { for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
if (dump(&priv->sstats, i, NULL)) if (!stmmac_safety_feat_dump(priv,
&priv->sstats, i,
NULL, NULL))
safety_len++; safety_len++;
} }
...@@ -613,17 +595,15 @@ static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data) ...@@ -613,17 +595,15 @@ static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data)
int i; int i;
u8 *p = data; u8 *p = data;
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
const char *(*dump)(struct stmmac_safety_stats *stats, int index,
unsigned long *count);
switch (stringset) { switch (stringset) {
case ETH_SS_STATS: case ETH_SS_STATS:
if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) { if (priv->dma_cap.asp) {
dump = priv->hw->mac->safety_feat_dump;
for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) { for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
const char *desc = dump(&priv->sstats, i, NULL); const char *desc;
if (!stmmac_safety_feat_dump(priv,
if (desc) { &priv->sstats, i,
NULL, &desc)) {
memcpy(p, desc, ETH_GSTRING_LEN); memcpy(p, desc, ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN; p += ETH_GSTRING_LEN;
} }
...@@ -810,7 +790,7 @@ static int stmmac_set_coalesce(struct net_device *dev, ...@@ -810,7 +790,7 @@ static int stmmac_set_coalesce(struct net_device *dev,
priv->tx_coal_frames = ec->tx_max_coalesced_frames; priv->tx_coal_frames = ec->tx_max_coalesced_frames;
priv->tx_coal_timer = ec->tx_coalesce_usecs; priv->tx_coal_timer = ec->tx_coalesce_usecs;
priv->rx_riwt = rx_riwt; priv->rx_riwt = rx_riwt;
priv->hw->dma->rx_watchdog(priv->ioaddr, priv->rx_riwt, rx_cnt); stmmac_rx_watchdog(priv, priv->ioaddr, priv->rx_riwt, rx_cnt);
return 0; return 0;
} }
......
...@@ -24,13 +24,13 @@ ...@@ -24,13 +24,13 @@
#include "common.h" #include "common.h"
#include "stmmac_ptp.h" #include "stmmac_ptp.h"
static void stmmac_config_hw_tstamping(void __iomem *ioaddr, u32 data) static void config_hw_tstamping(void __iomem *ioaddr, u32 data)
{ {
writel(data, ioaddr + PTP_TCR); writel(data, ioaddr + PTP_TCR);
} }
static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr, static void config_sub_second_increment(void __iomem *ioaddr,
u32 ptp_clock, int gmac4) u32 ptp_clock, int gmac4, u32 *ssinc)
{ {
u32 value = readl(ioaddr + PTP_TCR); u32 value = readl(ioaddr + PTP_TCR);
unsigned long data; unsigned long data;
...@@ -57,10 +57,11 @@ static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr, ...@@ -57,10 +57,11 @@ static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr,
writel(reg_value, ioaddr + PTP_SSIR); writel(reg_value, ioaddr + PTP_SSIR);
return data; if (ssinc)
*ssinc = data;
} }
static int stmmac_init_systime(void __iomem *ioaddr, u32 sec, u32 nsec) static int init_systime(void __iomem *ioaddr, u32 sec, u32 nsec)
{ {
int limit; int limit;
u32 value; u32 value;
...@@ -85,7 +86,7 @@ static int stmmac_init_systime(void __iomem *ioaddr, u32 sec, u32 nsec) ...@@ -85,7 +86,7 @@ static int stmmac_init_systime(void __iomem *ioaddr, u32 sec, u32 nsec)
return 0; return 0;
} }
static int stmmac_config_addend(void __iomem *ioaddr, u32 addend) static int config_addend(void __iomem *ioaddr, u32 addend)
{ {
u32 value; u32 value;
int limit; int limit;
...@@ -109,7 +110,7 @@ static int stmmac_config_addend(void __iomem *ioaddr, u32 addend) ...@@ -109,7 +110,7 @@ static int stmmac_config_addend(void __iomem *ioaddr, u32 addend)
return 0; return 0;
} }
static int stmmac_adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec, static int adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,
int add_sub, int gmac4) int add_sub, int gmac4)
{ {
u32 value; u32 value;
...@@ -152,7 +153,7 @@ static int stmmac_adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec, ...@@ -152,7 +153,7 @@ static int stmmac_adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,
return 0; return 0;
} }
static u64 stmmac_get_systime(void __iomem *ioaddr) static void get_systime(void __iomem *ioaddr, u64 *systime)
{ {
u64 ns; u64 ns;
...@@ -161,14 +162,15 @@ static u64 stmmac_get_systime(void __iomem *ioaddr) ...@@ -161,14 +162,15 @@ static u64 stmmac_get_systime(void __iomem *ioaddr)
/* Get the TSS and convert sec time value to nanosecond */ /* Get the TSS and convert sec time value to nanosecond */
ns += readl(ioaddr + PTP_STSR) * 1000000000ULL; ns += readl(ioaddr + PTP_STSR) * 1000000000ULL;
return ns; if (systime)
*systime = ns;
} }
const struct stmmac_hwtimestamp stmmac_ptp = { const struct stmmac_hwtimestamp stmmac_ptp = {
.config_hw_tstamping = stmmac_config_hw_tstamping, .config_hw_tstamping = config_hw_tstamping,
.init_systime = stmmac_init_systime, .init_systime = init_systime,
.config_sub_second_increment = stmmac_config_sub_second_increment, .config_sub_second_increment = config_sub_second_increment,
.config_addend = stmmac_config_addend, .config_addend = config_addend,
.adjust_systime = stmmac_adjust_systime, .adjust_systime = adjust_systime,
.get_systime = stmmac_get_systime, .get_systime = get_systime,
}; };
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <linux/reset.h> #include <linux/reset.h>
#include <linux/of_mdio.h> #include <linux/of_mdio.h>
#include "dwmac1000.h" #include "dwmac1000.h"
#include "hwif.h"
#define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x) #define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x)
#define TSO_MAX_BUFF_SIZE (SZ_16K - 1) #define TSO_MAX_BUFF_SIZE (SZ_16K - 1)
...@@ -335,7 +336,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv) ...@@ -335,7 +336,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv)
/* Check and enter in LPI mode */ /* Check and enter in LPI mode */
if (!priv->tx_path_in_lpi_mode) if (!priv->tx_path_in_lpi_mode)
priv->hw->mac->set_eee_mode(priv->hw, stmmac_set_eee_mode(priv, priv->hw,
priv->plat->en_tx_lpi_clockgating); priv->plat->en_tx_lpi_clockgating);
} }
...@@ -347,7 +348,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv) ...@@ -347,7 +348,7 @@ static void stmmac_enable_eee_mode(struct stmmac_priv *priv)
*/ */
void stmmac_disable_eee_mode(struct stmmac_priv *priv) void stmmac_disable_eee_mode(struct stmmac_priv *priv)
{ {
priv->hw->mac->reset_eee_mode(priv->hw); stmmac_reset_eee_mode(priv, priv->hw);
del_timer_sync(&priv->eee_ctrl_timer); del_timer_sync(&priv->eee_ctrl_timer);
priv->tx_path_in_lpi_mode = false; priv->tx_path_in_lpi_mode = false;
} }
...@@ -410,7 +411,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv) ...@@ -410,7 +411,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
if (priv->eee_active) { if (priv->eee_active) {
netdev_dbg(priv->dev, "disable EEE\n"); netdev_dbg(priv->dev, "disable EEE\n");
del_timer_sync(&priv->eee_ctrl_timer); del_timer_sync(&priv->eee_ctrl_timer);
priv->hw->mac->set_eee_timer(priv->hw, 0, stmmac_set_eee_timer(priv, priv->hw, 0,
tx_lpi_timer); tx_lpi_timer);
} }
priv->eee_active = 0; priv->eee_active = 0;
...@@ -426,12 +427,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv) ...@@ -426,12 +427,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
mod_timer(&priv->eee_ctrl_timer, mod_timer(&priv->eee_ctrl_timer,
STMMAC_LPI_T(eee_timer)); STMMAC_LPI_T(eee_timer));
priv->hw->mac->set_eee_timer(priv->hw, stmmac_set_eee_timer(priv, priv->hw,
STMMAC_DEFAULT_LIT_LS, STMMAC_DEFAULT_LIT_LS, tx_lpi_timer);
tx_lpi_timer);
} }
/* Set HW EEE according to the speed */ /* Set HW EEE according to the speed */
priv->hw->mac->set_eee_pls(priv->hw, ndev->phydev->link); stmmac_set_eee_pls(priv, priv->hw, ndev->phydev->link);
ret = true; ret = true;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
...@@ -464,9 +464,9 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv, ...@@ -464,9 +464,9 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
return; return;
/* check tx tstamp status */ /* check tx tstamp status */
if (priv->hw->desc->get_tx_timestamp_status(p)) { if (stmmac_get_tx_timestamp_status(priv, p)) {
/* get the valid tstamp */ /* get the valid tstamp */
ns = priv->hw->desc->get_timestamp(p, priv->adv_ts); stmmac_get_timestamp(priv, p, priv->adv_ts, &ns);
memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
shhwtstamp.hwtstamp = ns_to_ktime(ns); shhwtstamp.hwtstamp = ns_to_ktime(ns);
...@@ -502,8 +502,8 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p, ...@@ -502,8 +502,8 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
desc = np; desc = np;
/* Check if timestamp is available */ /* Check if timestamp is available */
if (priv->hw->desc->get_rx_timestamp_status(p, np, priv->adv_ts)) { if (stmmac_get_rx_timestamp_status(priv, p, np, priv->adv_ts)) {
ns = priv->hw->desc->get_timestamp(desc, priv->adv_ts); stmmac_get_timestamp(priv, desc, priv->adv_ts, &ns);
netdev_dbg(priv->dev, "get valid RX hw timestamp %llu\n", ns); netdev_dbg(priv->dev, "get valid RX hw timestamp %llu\n", ns);
shhwtstamp = skb_hwtstamps(skb); shhwtstamp = skb_hwtstamps(skb);
memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
...@@ -707,18 +707,18 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -707,18 +707,18 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)
priv->hwts_tx_en = config.tx_type == HWTSTAMP_TX_ON; priv->hwts_tx_en = config.tx_type == HWTSTAMP_TX_ON;
if (!priv->hwts_tx_en && !priv->hwts_rx_en) if (!priv->hwts_tx_en && !priv->hwts_rx_en)
priv->hw->ptp->config_hw_tstamping(priv->ptpaddr, 0); stmmac_config_hw_tstamping(priv, priv->ptpaddr, 0);
else { else {
value = (PTP_TCR_TSENA | PTP_TCR_TSCFUPDT | PTP_TCR_TSCTRLSSR | value = (PTP_TCR_TSENA | PTP_TCR_TSCFUPDT | PTP_TCR_TSCTRLSSR |
tstamp_all | ptp_v2 | ptp_over_ethernet | tstamp_all | ptp_v2 | ptp_over_ethernet |
ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en | ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en |
ts_master_en | snap_type_sel); ts_master_en | snap_type_sel);
priv->hw->ptp->config_hw_tstamping(priv->ptpaddr, value); stmmac_config_hw_tstamping(priv, priv->ptpaddr, value);
/* program Sub Second Increment reg */ /* program Sub Second Increment reg */
sec_inc = priv->hw->ptp->config_sub_second_increment( stmmac_config_sub_second_increment(priv,
priv->ptpaddr, priv->plat->clk_ptp_rate, priv->ptpaddr, priv->plat->clk_ptp_rate,
priv->plat->has_gmac4); priv->plat->has_gmac4, &sec_inc);
temp = div_u64(1000000000ULL, sec_inc); temp = div_u64(1000000000ULL, sec_inc);
/* calculate default added value: /* calculate default added value:
...@@ -728,15 +728,14 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -728,15 +728,14 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)
*/ */
temp = (u64)(temp << 32); temp = (u64)(temp << 32);
priv->default_addend = div_u64(temp, priv->plat->clk_ptp_rate); priv->default_addend = div_u64(temp, priv->plat->clk_ptp_rate);
priv->hw->ptp->config_addend(priv->ptpaddr, stmmac_config_addend(priv, priv->ptpaddr, priv->default_addend);
priv->default_addend);
/* initialize system time */ /* initialize system time */
ktime_get_real_ts64(&now); ktime_get_real_ts64(&now);
/* lower 32 bits of tv_sec are safe until y2106 */ /* lower 32 bits of tv_sec are safe until y2106 */
priv->hw->ptp->init_systime(priv->ptpaddr, (u32)now.tv_sec, stmmac_init_systime(priv, priv->ptpaddr,
now.tv_nsec); (u32)now.tv_sec, now.tv_nsec);
} }
return copy_to_user(ifr->ifr_data, &config, return copy_to_user(ifr->ifr_data, &config,
...@@ -795,7 +794,7 @@ static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex) ...@@ -795,7 +794,7 @@ static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex)
{ {
u32 tx_cnt = priv->plat->tx_queues_to_use; u32 tx_cnt = priv->plat->tx_queues_to_use;
priv->hw->mac->flow_ctrl(priv->hw, duplex, priv->flow_ctrl, stmmac_flow_ctrl(priv, priv->hw, duplex, priv->flow_ctrl,
priv->pause, tx_cnt); priv->pause, tx_cnt);
} }
...@@ -1008,7 +1007,7 @@ static void stmmac_display_rx_rings(struct stmmac_priv *priv) ...@@ -1008,7 +1007,7 @@ static void stmmac_display_rx_rings(struct stmmac_priv *priv)
head_rx = (void *)rx_q->dma_rx; head_rx = (void *)rx_q->dma_rx;
/* Display RX ring */ /* Display RX ring */
priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true); stmmac_display_ring(priv, head_rx, DMA_RX_SIZE, true);
} }
} }
...@@ -1029,7 +1028,7 @@ static void stmmac_display_tx_rings(struct stmmac_priv *priv) ...@@ -1029,7 +1028,7 @@ static void stmmac_display_tx_rings(struct stmmac_priv *priv)
else else
head_tx = (void *)tx_q->dma_tx; head_tx = (void *)tx_q->dma_tx;
priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false); stmmac_display_ring(priv, head_tx, DMA_TX_SIZE, false);
} }
} }
...@@ -1073,11 +1072,11 @@ static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, u32 queue) ...@@ -1073,11 +1072,11 @@ static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, u32 queue)
/* Clear the RX descriptors */ /* Clear the RX descriptors */
for (i = 0; i < DMA_RX_SIZE; i++) for (i = 0; i < DMA_RX_SIZE; i++)
if (priv->extend_desc) if (priv->extend_desc)
priv->hw->desc->init_rx_desc(&rx_q->dma_erx[i].basic, stmmac_init_rx_desc(priv, &rx_q->dma_erx[i].basic,
priv->use_riwt, priv->mode, priv->use_riwt, priv->mode,
(i == DMA_RX_SIZE - 1)); (i == DMA_RX_SIZE - 1));
else else
priv->hw->desc->init_rx_desc(&rx_q->dma_rx[i], stmmac_init_rx_desc(priv, &rx_q->dma_rx[i],
priv->use_riwt, priv->mode, priv->use_riwt, priv->mode,
(i == DMA_RX_SIZE - 1)); (i == DMA_RX_SIZE - 1));
} }
...@@ -1097,13 +1096,11 @@ static void stmmac_clear_tx_descriptors(struct stmmac_priv *priv, u32 queue) ...@@ -1097,13 +1096,11 @@ static void stmmac_clear_tx_descriptors(struct stmmac_priv *priv, u32 queue)
/* Clear the TX descriptors */ /* Clear the TX descriptors */
for (i = 0; i < DMA_TX_SIZE; i++) for (i = 0; i < DMA_TX_SIZE; i++)
if (priv->extend_desc) if (priv->extend_desc)
priv->hw->desc->init_tx_desc(&tx_q->dma_etx[i].basic, stmmac_init_tx_desc(priv, &tx_q->dma_etx[i].basic,
priv->mode, priv->mode, (i == DMA_TX_SIZE - 1));
(i == DMA_TX_SIZE - 1));
else else
priv->hw->desc->init_tx_desc(&tx_q->dma_tx[i], stmmac_init_tx_desc(priv, &tx_q->dma_tx[i],
priv->mode, priv->mode, (i == DMA_TX_SIZE - 1));
(i == DMA_TX_SIZE - 1));
} }
/** /**
...@@ -1164,9 +1161,8 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, ...@@ -1164,9 +1161,8 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,
else else
p->des2 = cpu_to_le32(rx_q->rx_skbuff_dma[i]); p->des2 = cpu_to_le32(rx_q->rx_skbuff_dma[i]);
if ((priv->hw->mode->init_desc3) && if (priv->dma_buf_sz == BUF_SIZE_16KiB)
(priv->dma_buf_sz == BUF_SIZE_16KiB)) stmmac_init_desc3(priv, p);
priv->hw->mode->init_desc3(p);
return 0; return 0;
} }
...@@ -1232,13 +1228,14 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) ...@@ -1232,13 +1228,14 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags)
{ {
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
u32 rx_count = priv->plat->rx_queues_to_use; u32 rx_count = priv->plat->rx_queues_to_use;
unsigned int bfsize = 0;
int ret = -ENOMEM; int ret = -ENOMEM;
int bfsize = 0;
int queue; int queue;
int i; int i;
if (priv->hw->mode->set_16kib_bfsize) bfsize = stmmac_set_16kib_bfsize(priv, dev->mtu);
bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu); if (bfsize < 0)
bfsize = 0;
if (bfsize < BUF_SIZE_16KiB) if (bfsize < BUF_SIZE_16KiB)
bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz);
...@@ -1282,13 +1279,11 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) ...@@ -1282,13 +1279,11 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags)
/* Setup the chained descriptor addresses */ /* Setup the chained descriptor addresses */
if (priv->mode == STMMAC_CHAIN_MODE) { if (priv->mode == STMMAC_CHAIN_MODE) {
if (priv->extend_desc) if (priv->extend_desc)
priv->hw->mode->init(rx_q->dma_erx, stmmac_mode_init(priv, rx_q->dma_erx,
rx_q->dma_rx_phy, rx_q->dma_rx_phy, DMA_RX_SIZE, 1);
DMA_RX_SIZE, 1);
else else
priv->hw->mode->init(rx_q->dma_rx, stmmac_mode_init(priv, rx_q->dma_rx,
rx_q->dma_rx_phy, rx_q->dma_rx_phy, DMA_RX_SIZE, 0);
DMA_RX_SIZE, 0);
} }
} }
...@@ -1335,13 +1330,11 @@ static int init_dma_tx_desc_rings(struct net_device *dev) ...@@ -1335,13 +1330,11 @@ static int init_dma_tx_desc_rings(struct net_device *dev)
/* Setup the chained descriptor addresses */ /* Setup the chained descriptor addresses */
if (priv->mode == STMMAC_CHAIN_MODE) { if (priv->mode == STMMAC_CHAIN_MODE) {
if (priv->extend_desc) if (priv->extend_desc)
priv->hw->mode->init(tx_q->dma_etx, stmmac_mode_init(priv, tx_q->dma_etx,
tx_q->dma_tx_phy, tx_q->dma_tx_phy, DMA_TX_SIZE, 1);
DMA_TX_SIZE, 1);
else else
priv->hw->mode->init(tx_q->dma_tx, stmmac_mode_init(priv, tx_q->dma_tx,
tx_q->dma_tx_phy, tx_q->dma_tx_phy, DMA_TX_SIZE, 0);
DMA_TX_SIZE, 0);
} }
for (i = 0; i < DMA_TX_SIZE; i++) { for (i = 0; i < DMA_TX_SIZE; i++) {
...@@ -1664,7 +1657,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) ...@@ -1664,7 +1657,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
for (queue = 0; queue < rx_queues_count; queue++) { for (queue = 0; queue < rx_queues_count; queue++) {
mode = priv->plat->rx_queues_cfg[queue].mode_to_use; mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
priv->hw->mac->rx_queue_enable(priv->hw, mode, queue); stmmac_rx_queue_enable(priv, priv->hw, mode, queue);
} }
} }
...@@ -1678,7 +1671,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) ...@@ -1678,7 +1671,7 @@ static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan) static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan)
{ {
netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan); netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan);
priv->hw->dma->start_rx(priv->ioaddr, chan); stmmac_start_rx(priv, priv->ioaddr, chan);
} }
/** /**
...@@ -1691,7 +1684,7 @@ static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan) ...@@ -1691,7 +1684,7 @@ static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan)
static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan) static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan)
{ {
netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan); netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan);
priv->hw->dma->start_tx(priv->ioaddr, chan); stmmac_start_tx(priv, priv->ioaddr, chan);
} }
/** /**
...@@ -1704,7 +1697,7 @@ static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan) ...@@ -1704,7 +1697,7 @@ static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan)
static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan) static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan)
{ {
netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan); netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan);
priv->hw->dma->stop_rx(priv->ioaddr, chan); stmmac_stop_rx(priv, priv->ioaddr, chan);
} }
/** /**
...@@ -1717,7 +1710,7 @@ static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan) ...@@ -1717,7 +1710,7 @@ static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan)
static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan) static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan)
{ {
netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan); netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan);
priv->hw->dma->stop_tx(priv->ioaddr, chan); stmmac_stop_tx(priv, priv->ioaddr, chan);
} }
/** /**
...@@ -1808,19 +1801,18 @@ static void stmmac_dma_operation_mode(struct stmmac_priv *priv) ...@@ -1808,19 +1801,18 @@ static void stmmac_dma_operation_mode(struct stmmac_priv *priv)
for (chan = 0; chan < rx_channels_count; chan++) { for (chan = 0; chan < rx_channels_count; chan++) {
qmode = priv->plat->rx_queues_cfg[chan].mode_to_use; qmode = priv->plat->rx_queues_cfg[chan].mode_to_use;
priv->hw->dma->dma_rx_mode(priv->ioaddr, rxmode, chan, stmmac_dma_rx_mode(priv, priv->ioaddr, rxmode, chan,
rxfifosz, qmode); rxfifosz, qmode);
} }
for (chan = 0; chan < tx_channels_count; chan++) { for (chan = 0; chan < tx_channels_count; chan++) {
qmode = priv->plat->tx_queues_cfg[chan].mode_to_use; qmode = priv->plat->tx_queues_cfg[chan].mode_to_use;
priv->hw->dma->dma_tx_mode(priv->ioaddr, txmode, chan, stmmac_dma_tx_mode(priv, priv->ioaddr, txmode, chan,
txfifosz, qmode); txfifosz, qmode);
} }
} else { } else {
priv->hw->dma->dma_mode(priv->ioaddr, txmode, rxmode, stmmac_dma_mode(priv, priv->ioaddr, txmode, rxmode, rxfifosz);
rxfifosz);
} }
} }
...@@ -1851,9 +1843,8 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue) ...@@ -1851,9 +1843,8 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue)
else else
p = tx_q->dma_tx + entry; p = tx_q->dma_tx + entry;
status = priv->hw->desc->tx_status(&priv->dev->stats, status = stmmac_tx_status(priv, &priv->dev->stats,
&priv->xstats, p, &priv->xstats, p, priv->ioaddr);
priv->ioaddr);
/* Check if the descriptor is owned by the DMA */ /* Check if the descriptor is owned by the DMA */
if (unlikely(status & tx_dma_own)) if (unlikely(status & tx_dma_own))
break; break;
...@@ -1891,8 +1882,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue) ...@@ -1891,8 +1882,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue)
tx_q->tx_skbuff_dma[entry].map_as_page = false; tx_q->tx_skbuff_dma[entry].map_as_page = false;
} }
if (priv->hw->mode->clean_desc3) stmmac_clean_desc3(priv, tx_q, p);
priv->hw->mode->clean_desc3(tx_q, p);
tx_q->tx_skbuff_dma[entry].last_segment = false; tx_q->tx_skbuff_dma[entry].last_segment = false;
tx_q->tx_skbuff_dma[entry].is_jumbo = false; tx_q->tx_skbuff_dma[entry].is_jumbo = false;
...@@ -1904,7 +1894,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue) ...@@ -1904,7 +1894,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue)
tx_q->tx_skbuff[entry] = NULL; tx_q->tx_skbuff[entry] = NULL;
} }
priv->hw->desc->release_tx_desc(p, priv->mode); stmmac_release_tx_desc(priv, p, priv->mode);
entry = STMMAC_GET_ENTRY(entry, DMA_TX_SIZE); entry = STMMAC_GET_ENTRY(entry, DMA_TX_SIZE);
} }
...@@ -1929,16 +1919,6 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue) ...@@ -1929,16 +1919,6 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue)
netif_tx_unlock(priv->dev); netif_tx_unlock(priv->dev);
} }
static inline void stmmac_enable_dma_irq(struct stmmac_priv *priv, u32 chan)
{
priv->hw->dma->enable_dma_irq(priv->ioaddr, chan);
}
static inline void stmmac_disable_dma_irq(struct stmmac_priv *priv, u32 chan)
{
priv->hw->dma->disable_dma_irq(priv->ioaddr, chan);
}
/** /**
* stmmac_tx_err - to manage the tx error * stmmac_tx_err - to manage the tx error
* @priv: driver private structure * @priv: driver private structure
...@@ -1957,13 +1937,11 @@ static void stmmac_tx_err(struct stmmac_priv *priv, u32 chan) ...@@ -1957,13 +1937,11 @@ static void stmmac_tx_err(struct stmmac_priv *priv, u32 chan)
dma_free_tx_skbufs(priv, chan); dma_free_tx_skbufs(priv, chan);
for (i = 0; i < DMA_TX_SIZE; i++) for (i = 0; i < DMA_TX_SIZE; i++)
if (priv->extend_desc) if (priv->extend_desc)
priv->hw->desc->init_tx_desc(&tx_q->dma_etx[i].basic, stmmac_init_tx_desc(priv, &tx_q->dma_etx[i].basic,
priv->mode, priv->mode, (i == DMA_TX_SIZE - 1));
(i == DMA_TX_SIZE - 1));
else else
priv->hw->desc->init_tx_desc(&tx_q->dma_tx[i], stmmac_init_tx_desc(priv, &tx_q->dma_tx[i],
priv->mode, priv->mode, (i == DMA_TX_SIZE - 1));
(i == DMA_TX_SIZE - 1));
tx_q->dirty_tx = 0; tx_q->dirty_tx = 0;
tx_q->cur_tx = 0; tx_q->cur_tx = 0;
tx_q->mss = 0; tx_q->mss = 0;
...@@ -2004,30 +1982,30 @@ static void stmmac_set_dma_operation_mode(struct stmmac_priv *priv, u32 txmode, ...@@ -2004,30 +1982,30 @@ static void stmmac_set_dma_operation_mode(struct stmmac_priv *priv, u32 txmode,
txfifosz /= tx_channels_count; txfifosz /= tx_channels_count;
if (priv->synopsys_id >= DWMAC_CORE_4_00) { if (priv->synopsys_id >= DWMAC_CORE_4_00) {
priv->hw->dma->dma_rx_mode(priv->ioaddr, rxmode, chan, stmmac_dma_rx_mode(priv, priv->ioaddr, rxmode, chan, rxfifosz,
rxfifosz, rxqmode); rxqmode);
priv->hw->dma->dma_tx_mode(priv->ioaddr, txmode, chan, stmmac_dma_tx_mode(priv, priv->ioaddr, txmode, chan, txfifosz,
txfifosz, txqmode); txqmode);
} else { } else {
priv->hw->dma->dma_mode(priv->ioaddr, txmode, rxmode, stmmac_dma_mode(priv, priv->ioaddr, txmode, rxmode, rxfifosz);
rxfifosz);
} }
} }
static bool stmmac_safety_feat_interrupt(struct stmmac_priv *priv) static bool stmmac_safety_feat_interrupt(struct stmmac_priv *priv)
{ {
bool ret = false; int ret = false;
/* Safety features are only available in cores >= 5.10 */ /* Safety features are only available in cores >= 5.10 */
if (priv->synopsys_id < DWMAC_CORE_5_10) if (priv->synopsys_id < DWMAC_CORE_5_10)
return ret; return ret;
if (priv->hw->mac->safety_feat_irq_status) ret = stmmac_safety_feat_irq_status(priv, priv->dev,
ret = priv->hw->mac->safety_feat_irq_status(priv->dev,
priv->ioaddr, priv->dma_cap.asp, &priv->sstats); priv->ioaddr, priv->dma_cap.asp, &priv->sstats);
if (ret && (ret != -EINVAL)) {
if (ret)
stmmac_global_err(priv); stmmac_global_err(priv);
return ret; return true;
}
return false;
} }
/** /**
...@@ -2054,16 +2032,15 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv) ...@@ -2054,16 +2032,15 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv)
* all tx queues rather than just a single tx queue. * all tx queues rather than just a single tx queue.
*/ */
for (chan = 0; chan < channels_to_check; chan++) for (chan = 0; chan < channels_to_check; chan++)
status[chan] = priv->hw->dma->dma_interrupt(priv->ioaddr, status[chan] = stmmac_dma_interrupt_status(priv, priv->ioaddr,
&priv->xstats, &priv->xstats, chan);
chan);
for (chan = 0; chan < rx_channel_count; chan++) { for (chan = 0; chan < rx_channel_count; chan++) {
if (likely(status[chan] & handle_rx)) { if (likely(status[chan] & handle_rx)) {
struct stmmac_rx_queue *rx_q = &priv->rx_queue[chan]; struct stmmac_rx_queue *rx_q = &priv->rx_queue[chan];
if (likely(napi_schedule_prep(&rx_q->napi))) { if (likely(napi_schedule_prep(&rx_q->napi))) {
stmmac_disable_dma_irq(priv, chan); stmmac_disable_dma_irq(priv, priv->ioaddr, chan);
__napi_schedule(&rx_q->napi); __napi_schedule(&rx_q->napi);
poll_scheduled = true; poll_scheduled = true;
} }
...@@ -2084,7 +2061,8 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv) ...@@ -2084,7 +2061,8 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv)
&priv->rx_queue[0]; &priv->rx_queue[0];
if (likely(napi_schedule_prep(&rx_q->napi))) { if (likely(napi_schedule_prep(&rx_q->napi))) {
stmmac_disable_dma_irq(priv, chan); stmmac_disable_dma_irq(priv,
priv->ioaddr, chan);
__napi_schedule(&rx_q->napi); __napi_schedule(&rx_q->napi);
} }
break; break;
...@@ -2180,15 +2158,7 @@ static void stmmac_selec_desc_mode(struct stmmac_priv *priv) ...@@ -2180,15 +2158,7 @@ static void stmmac_selec_desc_mode(struct stmmac_priv *priv)
*/ */
static int stmmac_get_hw_features(struct stmmac_priv *priv) static int stmmac_get_hw_features(struct stmmac_priv *priv)
{ {
u32 ret = 0; return stmmac_get_hw_feature(priv, priv->ioaddr, &priv->dma_cap) == 0;
if (priv->hw->dma->get_hw_feature) {
priv->hw->dma->get_hw_feature(priv->ioaddr,
&priv->dma_cap);
ret = 1;
}
return ret;
} }
/** /**
...@@ -2201,8 +2171,7 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv) ...@@ -2201,8 +2171,7 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)
static void stmmac_check_ether_addr(struct stmmac_priv *priv) static void stmmac_check_ether_addr(struct stmmac_priv *priv)
{ {
if (!is_valid_ether_addr(priv->dev->dev_addr)) { if (!is_valid_ether_addr(priv->dev->dev_addr)) {
priv->hw->mac->get_umac_addr(priv->hw, stmmac_get_umac_addr(priv, priv->hw, priv->dev->dev_addr, 0);
priv->dev->dev_addr, 0);
if (!is_valid_ether_addr(priv->dev->dev_addr)) if (!is_valid_ether_addr(priv->dev->dev_addr))
eth_hw_addr_random(priv->dev); eth_hw_addr_random(priv->dev);
netdev_info(priv->dev, "device MAC address %pM\n", netdev_info(priv->dev, "device MAC address %pM\n",
...@@ -2238,7 +2207,7 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv) ...@@ -2238,7 +2207,7 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
if (priv->extend_desc && (priv->mode == STMMAC_RING_MODE)) if (priv->extend_desc && (priv->mode == STMMAC_RING_MODE))
atds = 1; atds = 1;
ret = priv->hw->dma->reset(priv->ioaddr); ret = stmmac_reset(priv, priv->ioaddr);
if (ret) { if (ret) {
dev_err(priv->device, "Failed to reset the dma\n"); dev_err(priv->device, "Failed to reset the dma\n");
return ret; return ret;
...@@ -2246,51 +2215,48 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv) ...@@ -2246,51 +2215,48 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
if (priv->synopsys_id >= DWMAC_CORE_4_00) { if (priv->synopsys_id >= DWMAC_CORE_4_00) {
/* DMA Configuration */ /* DMA Configuration */
priv->hw->dma->init(priv->ioaddr, priv->plat->dma_cfg, stmmac_dma_init(priv, priv->ioaddr, priv->plat->dma_cfg,
dummy_dma_tx_phy, dummy_dma_rx_phy, atds); dummy_dma_tx_phy, dummy_dma_rx_phy, atds);
/* DMA RX Channel Configuration */ /* DMA RX Channel Configuration */
for (chan = 0; chan < rx_channels_count; chan++) { for (chan = 0; chan < rx_channels_count; chan++) {
rx_q = &priv->rx_queue[chan]; rx_q = &priv->rx_queue[chan];
priv->hw->dma->init_rx_chan(priv->ioaddr, stmmac_init_rx_chan(priv, priv->ioaddr,
priv->plat->dma_cfg, priv->plat->dma_cfg, rx_q->dma_rx_phy,
rx_q->dma_rx_phy, chan); chan);
rx_q->rx_tail_addr = rx_q->dma_rx_phy + rx_q->rx_tail_addr = rx_q->dma_rx_phy +
(DMA_RX_SIZE * sizeof(struct dma_desc)); (DMA_RX_SIZE * sizeof(struct dma_desc));
priv->hw->dma->set_rx_tail_ptr(priv->ioaddr, stmmac_set_rx_tail_ptr(priv, priv->ioaddr,
rx_q->rx_tail_addr, rx_q->rx_tail_addr, chan);
chan);
} }
/* DMA TX Channel Configuration */ /* DMA TX Channel Configuration */
for (chan = 0; chan < tx_channels_count; chan++) { for (chan = 0; chan < tx_channels_count; chan++) {
tx_q = &priv->tx_queue[chan]; tx_q = &priv->tx_queue[chan];
priv->hw->dma->init_chan(priv->ioaddr, stmmac_init_chan(priv, priv->ioaddr,
priv->plat->dma_cfg, priv->plat->dma_cfg, chan);
chan);
priv->hw->dma->init_tx_chan(priv->ioaddr, stmmac_init_tx_chan(priv, priv->ioaddr,
priv->plat->dma_cfg, priv->plat->dma_cfg, tx_q->dma_tx_phy,
tx_q->dma_tx_phy, chan); chan);
tx_q->tx_tail_addr = tx_q->dma_tx_phy + tx_q->tx_tail_addr = tx_q->dma_tx_phy +
(DMA_TX_SIZE * sizeof(struct dma_desc)); (DMA_TX_SIZE * sizeof(struct dma_desc));
priv->hw->dma->set_tx_tail_ptr(priv->ioaddr, stmmac_set_tx_tail_ptr(priv, priv->ioaddr,
tx_q->tx_tail_addr, tx_q->tx_tail_addr, chan);
chan);
} }
} else { } else {
rx_q = &priv->rx_queue[chan]; rx_q = &priv->rx_queue[chan];
tx_q = &priv->tx_queue[chan]; tx_q = &priv->tx_queue[chan];
priv->hw->dma->init(priv->ioaddr, priv->plat->dma_cfg, stmmac_dma_init(priv, priv->ioaddr, priv->plat->dma_cfg,
tx_q->dma_tx_phy, rx_q->dma_rx_phy, atds); tx_q->dma_tx_phy, rx_q->dma_rx_phy, atds);
} }
if (priv->plat->axi && priv->hw->dma->axi) if (priv->plat->axi)
priv->hw->dma->axi(priv->ioaddr, priv->plat->axi); stmmac_axi(priv, priv->ioaddr, priv->plat->axi);
return ret; return ret;
} }
...@@ -2336,18 +2302,14 @@ static void stmmac_set_rings_length(struct stmmac_priv *priv) ...@@ -2336,18 +2302,14 @@ static void stmmac_set_rings_length(struct stmmac_priv *priv)
u32 chan; u32 chan;
/* set TX ring length */ /* set TX ring length */
if (priv->hw->dma->set_tx_ring_len) {
for (chan = 0; chan < tx_channels_count; chan++) for (chan = 0; chan < tx_channels_count; chan++)
priv->hw->dma->set_tx_ring_len(priv->ioaddr, stmmac_set_tx_ring_len(priv, priv->ioaddr,
(DMA_TX_SIZE - 1), chan); (DMA_TX_SIZE - 1), chan);
}
/* set RX ring length */ /* set RX ring length */
if (priv->hw->dma->set_rx_ring_len) {
for (chan = 0; chan < rx_channels_count; chan++) for (chan = 0; chan < rx_channels_count; chan++)
priv->hw->dma->set_rx_ring_len(priv->ioaddr, stmmac_set_rx_ring_len(priv, priv->ioaddr,
(DMA_RX_SIZE - 1), chan); (DMA_RX_SIZE - 1), chan);
}
} }
/** /**
...@@ -2363,7 +2325,7 @@ static void stmmac_set_tx_queue_weight(struct stmmac_priv *priv) ...@@ -2363,7 +2325,7 @@ static void stmmac_set_tx_queue_weight(struct stmmac_priv *priv)
for (queue = 0; queue < tx_queues_count; queue++) { for (queue = 0; queue < tx_queues_count; queue++) {
weight = priv->plat->tx_queues_cfg[queue].weight; weight = priv->plat->tx_queues_cfg[queue].weight;
priv->hw->mac->set_mtl_tx_queue_weight(priv->hw, weight, queue); stmmac_set_mtl_tx_queue_weight(priv, priv->hw, weight, queue);
} }
} }
...@@ -2384,7 +2346,7 @@ static void stmmac_configure_cbs(struct stmmac_priv *priv) ...@@ -2384,7 +2346,7 @@ static void stmmac_configure_cbs(struct stmmac_priv *priv)
if (mode_to_use == MTL_QUEUE_DCB) if (mode_to_use == MTL_QUEUE_DCB)
continue; continue;
priv->hw->mac->config_cbs(priv->hw, stmmac_config_cbs(priv, priv->hw,
priv->plat->tx_queues_cfg[queue].send_slope, priv->plat->tx_queues_cfg[queue].send_slope,
priv->plat->tx_queues_cfg[queue].idle_slope, priv->plat->tx_queues_cfg[queue].idle_slope,
priv->plat->tx_queues_cfg[queue].high_credit, priv->plat->tx_queues_cfg[queue].high_credit,
...@@ -2406,7 +2368,7 @@ static void stmmac_rx_queue_dma_chan_map(struct stmmac_priv *priv) ...@@ -2406,7 +2368,7 @@ static void stmmac_rx_queue_dma_chan_map(struct stmmac_priv *priv)
for (queue = 0; queue < rx_queues_count; queue++) { for (queue = 0; queue < rx_queues_count; queue++) {
chan = priv->plat->rx_queues_cfg[queue].chan; chan = priv->plat->rx_queues_cfg[queue].chan;
priv->hw->mac->map_mtl_to_dma(priv->hw, queue, chan); stmmac_map_mtl_to_dma(priv, priv->hw, queue, chan);
} }
} }
...@@ -2426,7 +2388,7 @@ static void stmmac_mac_config_rx_queues_prio(struct stmmac_priv *priv) ...@@ -2426,7 +2388,7 @@ static void stmmac_mac_config_rx_queues_prio(struct stmmac_priv *priv)
continue; continue;
prio = priv->plat->rx_queues_cfg[queue].prio; prio = priv->plat->rx_queues_cfg[queue].prio;
priv->hw->mac->rx_queue_prio(priv->hw, prio, queue); stmmac_rx_queue_prio(priv, priv->hw, prio, queue);
} }
} }
...@@ -2446,7 +2408,7 @@ static void stmmac_mac_config_tx_queues_prio(struct stmmac_priv *priv) ...@@ -2446,7 +2408,7 @@ static void stmmac_mac_config_tx_queues_prio(struct stmmac_priv *priv)
continue; continue;
prio = priv->plat->tx_queues_cfg[queue].prio; prio = priv->plat->tx_queues_cfg[queue].prio;
priv->hw->mac->tx_queue_prio(priv->hw, prio, queue); stmmac_tx_queue_prio(priv, priv->hw, prio, queue);
} }
} }
...@@ -2467,7 +2429,7 @@ static void stmmac_mac_config_rx_queues_routing(struct stmmac_priv *priv) ...@@ -2467,7 +2429,7 @@ static void stmmac_mac_config_rx_queues_routing(struct stmmac_priv *priv)
continue; continue;
packet = priv->plat->rx_queues_cfg[queue].pkt_route; packet = priv->plat->rx_queues_cfg[queue].pkt_route;
priv->hw->mac->rx_queue_routing(priv->hw, packet, queue); stmmac_rx_queue_routing(priv, priv->hw, packet, queue);
} }
} }
...@@ -2481,50 +2443,47 @@ static void stmmac_mtl_configuration(struct stmmac_priv *priv) ...@@ -2481,50 +2443,47 @@ static void stmmac_mtl_configuration(struct stmmac_priv *priv)
u32 rx_queues_count = priv->plat->rx_queues_to_use; u32 rx_queues_count = priv->plat->rx_queues_to_use;
u32 tx_queues_count = priv->plat->tx_queues_to_use; u32 tx_queues_count = priv->plat->tx_queues_to_use;
if (tx_queues_count > 1 && priv->hw->mac->set_mtl_tx_queue_weight) if (tx_queues_count > 1)
stmmac_set_tx_queue_weight(priv); stmmac_set_tx_queue_weight(priv);
/* Configure MTL RX algorithms */ /* Configure MTL RX algorithms */
if (rx_queues_count > 1 && priv->hw->mac->prog_mtl_rx_algorithms) if (rx_queues_count > 1)
priv->hw->mac->prog_mtl_rx_algorithms(priv->hw, stmmac_prog_mtl_rx_algorithms(priv, priv->hw,
priv->plat->rx_sched_algorithm); priv->plat->rx_sched_algorithm);
/* Configure MTL TX algorithms */ /* Configure MTL TX algorithms */
if (tx_queues_count > 1 && priv->hw->mac->prog_mtl_tx_algorithms) if (tx_queues_count > 1)
priv->hw->mac->prog_mtl_tx_algorithms(priv->hw, stmmac_prog_mtl_tx_algorithms(priv, priv->hw,
priv->plat->tx_sched_algorithm); priv->plat->tx_sched_algorithm);
/* Configure CBS in AVB TX queues */ /* Configure CBS in AVB TX queues */
if (tx_queues_count > 1 && priv->hw->mac->config_cbs) if (tx_queues_count > 1)
stmmac_configure_cbs(priv); stmmac_configure_cbs(priv);
/* Map RX MTL to DMA channels */ /* Map RX MTL to DMA channels */
if (priv->hw->mac->map_mtl_to_dma)
stmmac_rx_queue_dma_chan_map(priv); stmmac_rx_queue_dma_chan_map(priv);
/* Enable MAC RX Queues */ /* Enable MAC RX Queues */
if (priv->hw->mac->rx_queue_enable)
stmmac_mac_enable_rx_queues(priv); stmmac_mac_enable_rx_queues(priv);
/* Set RX priorities */ /* Set RX priorities */
if (rx_queues_count > 1 && priv->hw->mac->rx_queue_prio) if (rx_queues_count > 1)
stmmac_mac_config_rx_queues_prio(priv); stmmac_mac_config_rx_queues_prio(priv);
/* Set TX priorities */ /* Set TX priorities */
if (tx_queues_count > 1 && priv->hw->mac->tx_queue_prio) if (tx_queues_count > 1)
stmmac_mac_config_tx_queues_prio(priv); stmmac_mac_config_tx_queues_prio(priv);
/* Set RX routing */ /* Set RX routing */
if (rx_queues_count > 1 && priv->hw->mac->rx_queue_routing) if (rx_queues_count > 1)
stmmac_mac_config_rx_queues_routing(priv); stmmac_mac_config_rx_queues_routing(priv);
} }
static void stmmac_safety_feat_configuration(struct stmmac_priv *priv) static void stmmac_safety_feat_configuration(struct stmmac_priv *priv)
{ {
if (priv->hw->mac->safety_feat_config && priv->dma_cap.asp) { if (priv->dma_cap.asp) {
netdev_info(priv->dev, "Enabling Safety Features\n"); netdev_info(priv->dev, "Enabling Safety Features\n");
priv->hw->mac->safety_feat_config(priv->ioaddr, stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp);
priv->dma_cap.asp);
} else { } else {
netdev_info(priv->dev, "No Safety Features support found\n"); netdev_info(priv->dev, "No Safety Features support found\n");
} }
...@@ -2559,7 +2518,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2559,7 +2518,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
} }
/* Copy the MAC addr into the HW */ /* Copy the MAC addr into the HW */
priv->hw->mac->set_umac_addr(priv->hw, dev->dev_addr, 0); stmmac_set_umac_addr(priv, priv->hw, dev->dev_addr, 0);
/* PS and related bits will be programmed according to the speed */ /* PS and related bits will be programmed according to the speed */
if (priv->hw->pcs) { if (priv->hw->pcs) {
...@@ -2575,7 +2534,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2575,7 +2534,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
} }
/* Initialize the MAC Core */ /* Initialize the MAC Core */
priv->hw->mac->core_init(priv->hw, dev); stmmac_core_init(priv, priv->hw, dev);
/* Initialize MTL*/ /* Initialize MTL*/
if (priv->synopsys_id >= DWMAC_CORE_4_00) if (priv->synopsys_id >= DWMAC_CORE_4_00)
...@@ -2585,7 +2544,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2585,7 +2544,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
if (priv->synopsys_id >= DWMAC_CORE_5_10) if (priv->synopsys_id >= DWMAC_CORE_5_10)
stmmac_safety_feat_configuration(priv); stmmac_safety_feat_configuration(priv);
ret = priv->hw->mac->rx_ipc(priv->hw); ret = stmmac_rx_ipc(priv, priv->hw);
if (!ret) { if (!ret) {
netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n"); netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n");
priv->plat->rx_coe = STMMAC_RX_COE_NONE; priv->plat->rx_coe = STMMAC_RX_COE_NONE;
...@@ -2593,7 +2552,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2593,7 +2552,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
} }
/* Enable the MAC Rx/Tx */ /* Enable the MAC Rx/Tx */
priv->hw->mac->set_mac(priv->ioaddr, true); stmmac_mac_set(priv, priv->ioaddr, true);
/* Set the HW DMA mode and the COE */ /* Set the HW DMA mode and the COE */
stmmac_dma_operation_mode(priv); stmmac_dma_operation_mode(priv);
...@@ -2623,13 +2582,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2623,13 +2582,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
priv->tx_lpi_timer = STMMAC_DEFAULT_TWT_LS; priv->tx_lpi_timer = STMMAC_DEFAULT_TWT_LS;
if ((priv->use_riwt) && (priv->hw->dma->rx_watchdog)) { if (priv->use_riwt) {
ret = stmmac_rx_watchdog(priv, priv->ioaddr, MAX_DMA_RIWT, rx_cnt);
if (!ret)
priv->rx_riwt = MAX_DMA_RIWT; priv->rx_riwt = MAX_DMA_RIWT;
priv->hw->dma->rx_watchdog(priv->ioaddr, MAX_DMA_RIWT, rx_cnt);
} }
if (priv->hw->pcs && priv->hw->mac->pcs_ctrl_ane) if (priv->hw->pcs)
priv->hw->mac->pcs_ctrl_ane(priv->hw, 1, priv->hw->ps, 0); stmmac_pcs_ctrl_ane(priv, priv->hw, 1, priv->hw->ps, 0);
/* set TX and RX rings length */ /* set TX and RX rings length */
stmmac_set_rings_length(priv); stmmac_set_rings_length(priv);
...@@ -2637,7 +2597,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) ...@@ -2637,7 +2597,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
/* Enable TSO */ /* Enable TSO */
if (priv->tso) { if (priv->tso) {
for (chan = 0; chan < tx_cnt; chan++) for (chan = 0; chan < tx_cnt; chan++)
priv->hw->dma->enable_tso(priv->ioaddr, 1, chan); stmmac_enable_tso(priv, priv->ioaddr, 1, chan);
} }
return 0; return 0;
...@@ -2808,7 +2768,7 @@ static int stmmac_release(struct net_device *dev) ...@@ -2808,7 +2768,7 @@ static int stmmac_release(struct net_device *dev)
free_dma_desc_resources(priv); free_dma_desc_resources(priv);
/* Disable the MAC Rx/Tx */ /* Disable the MAC Rx/Tx */
priv->hw->mac->set_mac(priv->ioaddr, false); stmmac_mac_set(priv, priv->ioaddr, false);
netif_carrier_off(dev); netif_carrier_off(dev);
...@@ -2851,7 +2811,7 @@ static void stmmac_tso_allocator(struct stmmac_priv *priv, unsigned int des, ...@@ -2851,7 +2811,7 @@ static void stmmac_tso_allocator(struct stmmac_priv *priv, unsigned int des,
buff_size = tmp_len >= TSO_MAX_BUFF_SIZE ? buff_size = tmp_len >= TSO_MAX_BUFF_SIZE ?
TSO_MAX_BUFF_SIZE : tmp_len; TSO_MAX_BUFF_SIZE : tmp_len;
priv->hw->desc->prepare_tso_tx_desc(desc, 0, buff_size, stmmac_prepare_tso_tx_desc(priv, desc, 0, buff_size,
0, 1, 0, 1,
(last_segment) && (tmp_len <= TSO_MAX_BUFF_SIZE), (last_segment) && (tmp_len <= TSO_MAX_BUFF_SIZE),
0, 0); 0, 0);
...@@ -2926,7 +2886,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2926,7 +2886,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
/* set new MSS value if needed */ /* set new MSS value if needed */
if (mss != tx_q->mss) { if (mss != tx_q->mss) {
mss_desc = tx_q->dma_tx + tx_q->cur_tx; mss_desc = tx_q->dma_tx + tx_q->cur_tx;
priv->hw->desc->set_mss(mss_desc, mss); stmmac_set_mss(priv, mss_desc, mss);
tx_q->mss = mss; tx_q->mss = mss;
tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, DMA_TX_SIZE); tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, DMA_TX_SIZE);
WARN_ON(tx_q->tx_skbuff[tx_q->cur_tx]); WARN_ON(tx_q->tx_skbuff[tx_q->cur_tx]);
...@@ -3012,7 +2972,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3012,7 +2972,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
STMMAC_COAL_TIMER(priv->tx_coal_timer)); STMMAC_COAL_TIMER(priv->tx_coal_timer));
} else { } else {
priv->tx_count_frames = 0; priv->tx_count_frames = 0;
priv->hw->desc->set_tx_ic(desc); stmmac_set_tx_ic(priv, desc);
priv->xstats.tx_set_ic_bit++; priv->xstats.tx_set_ic_bit++;
} }
...@@ -3022,11 +2982,11 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3022,11 +2982,11 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
priv->hwts_tx_en)) { priv->hwts_tx_en)) {
/* declare that device is doing timestamping */ /* declare that device is doing timestamping */
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
priv->hw->desc->enable_tx_timestamp(first); stmmac_enable_tx_timestamp(priv, first);
} }
/* Complete the first descriptor before granting the DMA */ /* Complete the first descriptor before granting the DMA */
priv->hw->desc->prepare_tso_tx_desc(first, 1, stmmac_prepare_tso_tx_desc(priv, first, 1,
proto_hdr_len, proto_hdr_len,
pay_len, pay_len,
1, tx_q->tx_skbuff_dma[first_entry].last_segment, 1, tx_q->tx_skbuff_dma[first_entry].last_segment,
...@@ -3040,7 +3000,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3040,7 +3000,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
* sure that MSS's own bit is the last thing written. * sure that MSS's own bit is the last thing written.
*/ */
dma_wmb(); dma_wmb();
priv->hw->desc->set_tx_owner(mss_desc); stmmac_set_tx_owner(priv, mss_desc);
} }
/* The own bit must be the latest setting done when prepare the /* The own bit must be the latest setting done when prepare the
...@@ -3054,8 +3014,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3054,8 +3014,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
__func__, tx_q->cur_tx, tx_q->dirty_tx, first_entry, __func__, tx_q->cur_tx, tx_q->dirty_tx, first_entry,
tx_q->cur_tx, first, nfrags); tx_q->cur_tx, first, nfrags);
priv->hw->desc->display_ring((void *)tx_q->dma_tx, DMA_TX_SIZE, stmmac_display_ring(priv, (void *)tx_q->dma_tx, DMA_TX_SIZE, 0);
0);
pr_info(">>> frame to be transmitted: "); pr_info(">>> frame to be transmitted: ");
print_pkt(skb->data, skb_headlen(skb)); print_pkt(skb->data, skb_headlen(skb));
...@@ -3063,8 +3022,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3063,8 +3022,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len); netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len);
priv->hw->dma->set_tx_tail_ptr(priv->ioaddr, tx_q->tx_tail_addr, stmmac_set_tx_tail_ptr(priv, priv->ioaddr, tx_q->tx_tail_addr, queue);
queue);
return NETDEV_TX_OK; return NETDEV_TX_OK;
...@@ -3136,11 +3094,11 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3136,11 +3094,11 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
enh_desc = priv->plat->enh_desc; enh_desc = priv->plat->enh_desc;
/* To program the descriptors according to the size of the frame */ /* To program the descriptors according to the size of the frame */
if (enh_desc) if (enh_desc)
is_jumbo = priv->hw->mode->is_jumbo_frm(skb->len, enh_desc); is_jumbo = stmmac_is_jumbo_frm(priv, skb->len, enh_desc);
if (unlikely(is_jumbo) && likely(priv->synopsys_id < if (unlikely(is_jumbo) && likely(priv->synopsys_id <
DWMAC_CORE_4_00)) { DWMAC_CORE_4_00)) {
entry = priv->hw->mode->jumbo_frm(tx_q, skb, csum_insertion); entry = stmmac_jumbo_frm(priv, tx_q, skb, csum_insertion);
if (unlikely(entry < 0)) if (unlikely(entry < 0))
goto dma_map_err; goto dma_map_err;
} }
...@@ -3174,9 +3132,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3174,9 +3132,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
tx_q->tx_skbuff_dma[entry].last_segment = last_segment; tx_q->tx_skbuff_dma[entry].last_segment = last_segment;
/* Prepare the descriptor and set the own bit too */ /* Prepare the descriptor and set the own bit too */
priv->hw->desc->prepare_tx_desc(desc, 0, len, csum_insertion, stmmac_prepare_tx_desc(priv, desc, 0, len, csum_insertion,
priv->mode, 1, last_segment, priv->mode, 1, last_segment, skb->len);
skb->len);
} }
/* Only the last descriptor gets to point to the skb. */ /* Only the last descriptor gets to point to the skb. */
...@@ -3203,7 +3160,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3203,7 +3160,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
else else
tx_head = (void *)tx_q->dma_tx; tx_head = (void *)tx_q->dma_tx;
priv->hw->desc->display_ring(tx_head, DMA_TX_SIZE, false); stmmac_display_ring(priv, tx_head, DMA_TX_SIZE, false);
netdev_dbg(priv->dev, ">>> frame to be transmitted: "); netdev_dbg(priv->dev, ">>> frame to be transmitted: ");
print_pkt(skb->data, skb->len); print_pkt(skb->data, skb->len);
...@@ -3228,7 +3185,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3228,7 +3185,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
STMMAC_COAL_TIMER(priv->tx_coal_timer)); STMMAC_COAL_TIMER(priv->tx_coal_timer));
} else { } else {
priv->tx_count_frames = 0; priv->tx_count_frames = 0;
priv->hw->desc->set_tx_ic(desc); stmmac_set_tx_ic(priv, desc);
priv->xstats.tx_set_ic_bit++; priv->xstats.tx_set_ic_bit++;
} }
...@@ -3259,13 +3216,13 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3259,13 +3216,13 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
priv->hwts_tx_en)) { priv->hwts_tx_en)) {
/* declare that device is doing timestamping */ /* declare that device is doing timestamping */
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
priv->hw->desc->enable_tx_timestamp(first); stmmac_enable_tx_timestamp(priv, first);
} }
/* Prepare the first descriptor setting the OWN bit too */ /* Prepare the first descriptor setting the OWN bit too */
priv->hw->desc->prepare_tx_desc(first, 1, nopaged_len, stmmac_prepare_tx_desc(priv, first, 1, nopaged_len,
csum_insertion, priv->mode, 1, csum_insertion, priv->mode, 1, last_segment,
last_segment, skb->len); skb->len);
/* The own bit must be the latest setting done when prepare the /* The own bit must be the latest setting done when prepare the
* descriptor and then barrier is needed to make sure that * descriptor and then barrier is needed to make sure that
...@@ -3277,9 +3234,9 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3277,9 +3234,9 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len); netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len);
if (priv->synopsys_id < DWMAC_CORE_4_00) if (priv->synopsys_id < DWMAC_CORE_4_00)
priv->hw->dma->enable_dma_transmission(priv->ioaddr); stmmac_enable_dma_transmission(priv, priv->ioaddr);
else else
priv->hw->dma->set_tx_tail_ptr(priv->ioaddr, tx_q->tx_tail_addr, stmmac_set_tx_tail_ptr(priv, priv->ioaddr, tx_q->tx_tail_addr,
queue); queue);
return NETDEV_TX_OK; return NETDEV_TX_OK;
...@@ -3370,8 +3327,8 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue) ...@@ -3370,8 +3327,8 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
} else { } else {
p->des2 = cpu_to_le32(rx_q->rx_skbuff_dma[entry]); p->des2 = cpu_to_le32(rx_q->rx_skbuff_dma[entry]);
} }
if (priv->hw->mode->refill_desc3)
priv->hw->mode->refill_desc3(rx_q, p); stmmac_refill_desc3(priv, rx_q, p);
if (rx_q->rx_zeroc_thresh > 0) if (rx_q->rx_zeroc_thresh > 0)
rx_q->rx_zeroc_thresh--; rx_q->rx_zeroc_thresh--;
...@@ -3382,9 +3339,9 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue) ...@@ -3382,9 +3339,9 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
dma_wmb(); dma_wmb();
if (unlikely(priv->synopsys_id >= DWMAC_CORE_4_00)) if (unlikely(priv->synopsys_id >= DWMAC_CORE_4_00))
priv->hw->desc->init_rx_desc(p, priv->use_riwt, 0, 0); stmmac_init_rx_desc(priv, p, priv->use_riwt, 0, 0);
else else
priv->hw->desc->set_rx_owner(p); stmmac_set_rx_owner(priv, p);
dma_wmb(); dma_wmb();
...@@ -3418,7 +3375,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) ...@@ -3418,7 +3375,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
else else
rx_head = (void *)rx_q->dma_rx; rx_head = (void *)rx_q->dma_rx;
priv->hw->desc->display_ring(rx_head, DMA_RX_SIZE, true); stmmac_display_ring(priv, rx_head, DMA_RX_SIZE, true);
} }
while (count < limit) { while (count < limit) {
int status; int status;
...@@ -3431,7 +3388,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) ...@@ -3431,7 +3388,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
p = rx_q->dma_rx + entry; p = rx_q->dma_rx + entry;
/* read the status of the incoming frame */ /* read the status of the incoming frame */
status = priv->hw->desc->rx_status(&priv->dev->stats, status = stmmac_rx_status(priv, &priv->dev->stats,
&priv->xstats, p); &priv->xstats, p);
/* check if managed by the DMA otherwise go ahead */ /* check if managed by the DMA otherwise go ahead */
if (unlikely(status & dma_own)) if (unlikely(status & dma_own))
...@@ -3449,11 +3406,9 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) ...@@ -3449,11 +3406,9 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
prefetch(np); prefetch(np);
if ((priv->extend_desc) && (priv->hw->desc->rx_extended_status)) if (priv->extend_desc)
priv->hw->desc->rx_extended_status(&priv->dev->stats, stmmac_rx_extended_status(priv, &priv->dev->stats,
&priv->xstats, &priv->xstats, rx_q->dma_erx + entry);
rx_q->dma_erx +
entry);
if (unlikely(status == discard_frame)) { if (unlikely(status == discard_frame)) {
priv->dev->stats.rx_errors++; priv->dev->stats.rx_errors++;
if (priv->hwts_rx_en && !priv->extend_desc) { if (priv->hwts_rx_en && !priv->extend_desc) {
...@@ -3479,7 +3434,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) ...@@ -3479,7 +3434,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
else else
des = le32_to_cpu(p->des2); des = le32_to_cpu(p->des2);
frame_len = priv->hw->desc->get_rx_frame_len(p, coe); frame_len = stmmac_get_rx_frame_len(priv, p, coe);
/* If frame length is greater than skb buffer size /* If frame length is greater than skb buffer size
* (preallocated during init) then the packet is * (preallocated during init) then the packet is
...@@ -3616,7 +3571,7 @@ static int stmmac_poll(struct napi_struct *napi, int budget) ...@@ -3616,7 +3571,7 @@ static int stmmac_poll(struct napi_struct *napi, int budget)
work_done = stmmac_rx(priv, budget, rx_q->queue_index); work_done = stmmac_rx(priv, budget, rx_q->queue_index);
if (work_done < budget) { if (work_done < budget) {
napi_complete_done(napi, work_done); napi_complete_done(napi, work_done);
stmmac_enable_dma_irq(priv, chan); stmmac_enable_dma_irq(priv, priv->ioaddr, chan);
} }
return work_done; return work_done;
} }
...@@ -3649,7 +3604,7 @@ static void stmmac_set_rx_mode(struct net_device *dev) ...@@ -3649,7 +3604,7 @@ static void stmmac_set_rx_mode(struct net_device *dev)
{ {
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
priv->hw->mac->set_filter(priv->hw, dev); stmmac_set_filter(priv, priv->hw, dev);
} }
/** /**
...@@ -3722,7 +3677,7 @@ static int stmmac_set_features(struct net_device *netdev, ...@@ -3722,7 +3677,7 @@ static int stmmac_set_features(struct net_device *netdev,
/* No check needed because rx_coe has been set before and it will be /* No check needed because rx_coe has been set before and it will be
* fixed in case of issue. * fixed in case of issue.
*/ */
priv->hw->mac->rx_ipc(priv->hw); stmmac_rx_ipc(priv, priv->hw);
return 0; return 0;
} }
...@@ -3766,8 +3721,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id) ...@@ -3766,8 +3721,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
/* To handle GMAC own interrupts */ /* To handle GMAC own interrupts */
if ((priv->plat->has_gmac) || (priv->plat->has_gmac4)) { if ((priv->plat->has_gmac) || (priv->plat->has_gmac4)) {
int status = priv->hw->mac->host_irq_status(priv->hw, int status = stmmac_host_irq_status(priv, priv->hw, &priv->xstats);
&priv->xstats);
if (unlikely(status)) { if (unlikely(status)) {
/* For LPI we need to save the tx status */ /* For LPI we need to save the tx status */
...@@ -3782,13 +3736,12 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id) ...@@ -3782,13 +3736,12 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
struct stmmac_rx_queue *rx_q = struct stmmac_rx_queue *rx_q =
&priv->rx_queue[queue]; &priv->rx_queue[queue];
status |= status |= stmmac_host_mtl_irq_status(priv,
priv->hw->mac->host_mtl_irq_status(priv->hw, priv->hw, queue);
queue);
if (status & CORE_IRQ_MTL_RX_OVERFLOW && if (status & CORE_IRQ_MTL_RX_OVERFLOW)
priv->hw->dma->set_rx_tail_ptr) stmmac_set_rx_tail_ptr(priv,
priv->hw->dma->set_rx_tail_ptr(priv->ioaddr, priv->ioaddr,
rx_q->rx_tail_addr, rx_q->rx_tail_addr,
queue); queue);
} }
...@@ -3864,7 +3817,7 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr) ...@@ -3864,7 +3817,7 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr)
if (ret) if (ret)
return ret; return ret;
priv->hw->mac->set_umac_addr(priv->hw, ndev->dev_addr, 0); stmmac_set_umac_addr(priv, priv->hw, ndev->dev_addr, 0);
return ret; return ret;
} }
...@@ -4453,7 +4406,7 @@ int stmmac_dvr_remove(struct device *dev) ...@@ -4453,7 +4406,7 @@ int stmmac_dvr_remove(struct device *dev)
stmmac_stop_all_dma(priv); stmmac_stop_all_dma(priv);
priv->hw->mac->set_mac(priv->ioaddr, false); stmmac_mac_set(priv, priv->ioaddr, false);
netif_carrier_off(ndev); netif_carrier_off(ndev);
unregister_netdev(ndev); unregister_netdev(ndev);
if (priv->plat->stmmac_rst) if (priv->plat->stmmac_rst)
...@@ -4502,10 +4455,10 @@ int stmmac_suspend(struct device *dev) ...@@ -4502,10 +4455,10 @@ int stmmac_suspend(struct device *dev)
/* Enable Power down mode by programming the PMT regs */ /* Enable Power down mode by programming the PMT regs */
if (device_may_wakeup(priv->device)) { if (device_may_wakeup(priv->device)) {
priv->hw->mac->pmt(priv->hw, priv->wolopts); stmmac_pmt(priv, priv->hw, priv->wolopts);
priv->irq_wake = 1; priv->irq_wake = 1;
} else { } else {
priv->hw->mac->set_mac(priv->ioaddr, false); stmmac_mac_set(priv, priv->ioaddr, false);
pinctrl_pm_select_sleep_state(priv->device); pinctrl_pm_select_sleep_state(priv->device);
/* Disable clock in case of PWM is off */ /* Disable clock in case of PWM is off */
clk_disable(priv->plat->pclk); clk_disable(priv->plat->pclk);
...@@ -4569,7 +4522,7 @@ int stmmac_resume(struct device *dev) ...@@ -4569,7 +4522,7 @@ int stmmac_resume(struct device *dev)
*/ */
if (device_may_wakeup(priv->device)) { if (device_may_wakeup(priv->device)) {
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
priv->hw->mac->pmt(priv->hw, 0); stmmac_pmt(priv, priv->hw, 0);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
priv->irq_wake = 0; priv->irq_wake = 0;
} else { } else {
......
...@@ -49,9 +49,7 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, s32 ppb) ...@@ -49,9 +49,7 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, s32 ppb)
addend = neg_adj ? (addend - diff) : (addend + diff); addend = neg_adj ? (addend - diff) : (addend + diff);
spin_lock_irqsave(&priv->ptp_lock, flags); spin_lock_irqsave(&priv->ptp_lock, flags);
stmmac_config_addend(priv, priv->ptpaddr, addend);
priv->hw->ptp->config_addend(priv->ptpaddr, addend);
spin_unlock_irqrestore(&priv->ptp_lock, flags); spin_unlock_irqrestore(&priv->ptp_lock, flags);
return 0; return 0;
...@@ -84,10 +82,8 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta) ...@@ -84,10 +82,8 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta)
nsec = reminder; nsec = reminder;
spin_lock_irqsave(&priv->ptp_lock, flags); spin_lock_irqsave(&priv->ptp_lock, flags);
stmmac_adjust_systime(priv, priv->ptpaddr, sec, nsec, neg_adj,
priv->hw->ptp->adjust_systime(priv->ptpaddr, sec, nsec, neg_adj,
priv->plat->has_gmac4); priv->plat->has_gmac4);
spin_unlock_irqrestore(&priv->ptp_lock, flags); spin_unlock_irqrestore(&priv->ptp_lock, flags);
return 0; return 0;
...@@ -110,9 +106,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts) ...@@ -110,9 +106,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts)
u64 ns; u64 ns;
spin_lock_irqsave(&priv->ptp_lock, flags); spin_lock_irqsave(&priv->ptp_lock, flags);
stmmac_get_systime(priv, priv->ptpaddr, &ns);
ns = priv->hw->ptp->get_systime(priv->ptpaddr);
spin_unlock_irqrestore(&priv->ptp_lock, flags); spin_unlock_irqrestore(&priv->ptp_lock, flags);
*ts = ns_to_timespec64(ns); *ts = ns_to_timespec64(ns);
...@@ -137,9 +131,7 @@ static int stmmac_set_time(struct ptp_clock_info *ptp, ...@@ -137,9 +131,7 @@ static int stmmac_set_time(struct ptp_clock_info *ptp,
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&priv->ptp_lock, flags); spin_lock_irqsave(&priv->ptp_lock, flags);
stmmac_init_systime(priv, priv->ptpaddr, ts->tv_sec, ts->tv_nsec);
priv->hw->ptp->init_systime(priv->ptpaddr, ts->tv_sec, ts->tv_nsec);
spin_unlock_irqrestore(&priv->ptp_lock, flags); spin_unlock_irqrestore(&priv->ptp_lock, flags);
return 0; return 0;
......
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