13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 23d0407baSopenharmony_ci/******************************************************************************* 33d0407baSopenharmony_ci Copyright (C) 2007-2009 STMicroelectronics Ltd 43d0407baSopenharmony_ci 53d0407baSopenharmony_ci 63d0407baSopenharmony_ci Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> 73d0407baSopenharmony_ci*******************************************************************************/ 83d0407baSopenharmony_ci 93d0407baSopenharmony_ci#ifndef __STMMAC_H__ 103d0407baSopenharmony_ci#define __STMMAC_H__ 113d0407baSopenharmony_ci 123d0407baSopenharmony_ci#define STMMAC_RESOURCE_NAME "stmmaceth" 133d0407baSopenharmony_ci#define DRV_MODULE_VERSION "Jan_2016" 143d0407baSopenharmony_ci 153d0407baSopenharmony_ci#include <linux/clk.h> 163d0407baSopenharmony_ci#include <linux/if_vlan.h> 173d0407baSopenharmony_ci#include <linux/stmmac.h> 183d0407baSopenharmony_ci#include <linux/phylink.h> 193d0407baSopenharmony_ci#include <linux/pci.h> 203d0407baSopenharmony_ci#include "common.h" 213d0407baSopenharmony_ci#include <linux/ptp_clock_kernel.h> 223d0407baSopenharmony_ci#include <linux/net_tstamp.h> 233d0407baSopenharmony_ci#include <linux/reset.h> 243d0407baSopenharmony_ci#include <net/page_pool.h> 253d0407baSopenharmony_ci 263d0407baSopenharmony_cistruct stmmac_resources { 273d0407baSopenharmony_ci void __iomem *addr; 283d0407baSopenharmony_ci const char *mac; 293d0407baSopenharmony_ci int wol_irq; 303d0407baSopenharmony_ci int lpi_irq; 313d0407baSopenharmony_ci int irq; 323d0407baSopenharmony_ci}; 333d0407baSopenharmony_ci 343d0407baSopenharmony_cistruct stmmac_tx_info { 353d0407baSopenharmony_ci dma_addr_t buf; 363d0407baSopenharmony_ci bool map_as_page; 373d0407baSopenharmony_ci unsigned len; 383d0407baSopenharmony_ci bool last_segment; 393d0407baSopenharmony_ci bool is_jumbo; 403d0407baSopenharmony_ci}; 413d0407baSopenharmony_ci 423d0407baSopenharmony_ci#define STMMAC_TBS_AVAIL BIT(0) 433d0407baSopenharmony_ci#define STMMAC_TBS_EN BIT(1) 443d0407baSopenharmony_ci 453d0407baSopenharmony_ci/* Frequently used values are kept adjacent for cache effect */ 463d0407baSopenharmony_cistruct stmmac_tx_queue { 473d0407baSopenharmony_ci u32 tx_count_frames; 483d0407baSopenharmony_ci int tbs; 493d0407baSopenharmony_ci struct timer_list txtimer; 503d0407baSopenharmony_ci u32 queue_index; 513d0407baSopenharmony_ci struct stmmac_priv *priv_data; 523d0407baSopenharmony_ci struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp; 533d0407baSopenharmony_ci struct dma_edesc *dma_entx; 543d0407baSopenharmony_ci struct dma_desc *dma_tx; 553d0407baSopenharmony_ci struct sk_buff **tx_skbuff; 563d0407baSopenharmony_ci struct stmmac_tx_info *tx_skbuff_dma; 573d0407baSopenharmony_ci unsigned int cur_tx; 583d0407baSopenharmony_ci unsigned int dirty_tx; 593d0407baSopenharmony_ci dma_addr_t dma_tx_phy; 603d0407baSopenharmony_ci u32 tx_tail_addr; 613d0407baSopenharmony_ci u32 mss; 623d0407baSopenharmony_ci}; 633d0407baSopenharmony_ci 643d0407baSopenharmony_cistruct stmmac_rx_buffer { 653d0407baSopenharmony_ci struct page *page; 663d0407baSopenharmony_ci struct page *sec_page; 673d0407baSopenharmony_ci dma_addr_t addr; 683d0407baSopenharmony_ci dma_addr_t sec_addr; 693d0407baSopenharmony_ci}; 703d0407baSopenharmony_ci 713d0407baSopenharmony_cistruct stmmac_rx_queue { 723d0407baSopenharmony_ci u32 rx_count_frames; 733d0407baSopenharmony_ci u32 queue_index; 743d0407baSopenharmony_ci struct page_pool *page_pool; 753d0407baSopenharmony_ci struct stmmac_rx_buffer *buf_pool; 763d0407baSopenharmony_ci struct stmmac_priv *priv_data; 773d0407baSopenharmony_ci struct dma_extended_desc *dma_erx; 783d0407baSopenharmony_ci struct dma_desc *dma_rx ____cacheline_aligned_in_smp; 793d0407baSopenharmony_ci unsigned int cur_rx; 803d0407baSopenharmony_ci unsigned int dirty_rx; 813d0407baSopenharmony_ci u32 rx_zeroc_thresh; 823d0407baSopenharmony_ci dma_addr_t dma_rx_phy; 833d0407baSopenharmony_ci u32 rx_tail_addr; 843d0407baSopenharmony_ci unsigned int state_saved; 853d0407baSopenharmony_ci struct { 863d0407baSopenharmony_ci struct sk_buff *skb; 873d0407baSopenharmony_ci unsigned int len; 883d0407baSopenharmony_ci unsigned int error; 893d0407baSopenharmony_ci } state; 903d0407baSopenharmony_ci}; 913d0407baSopenharmony_ci 923d0407baSopenharmony_cistruct stmmac_channel { 933d0407baSopenharmony_ci struct napi_struct rx_napi ____cacheline_aligned_in_smp; 943d0407baSopenharmony_ci struct napi_struct tx_napi ____cacheline_aligned_in_smp; 953d0407baSopenharmony_ci struct stmmac_priv *priv_data; 963d0407baSopenharmony_ci spinlock_t lock; 973d0407baSopenharmony_ci u32 index; 983d0407baSopenharmony_ci}; 993d0407baSopenharmony_ci 1003d0407baSopenharmony_cistruct stmmac_tc_entry { 1013d0407baSopenharmony_ci bool in_use; 1023d0407baSopenharmony_ci bool in_hw; 1033d0407baSopenharmony_ci bool is_last; 1043d0407baSopenharmony_ci bool is_frag; 1053d0407baSopenharmony_ci void *frag_ptr; 1063d0407baSopenharmony_ci unsigned int table_pos; 1073d0407baSopenharmony_ci u32 handle; 1083d0407baSopenharmony_ci u32 prio; 1093d0407baSopenharmony_ci struct { 1103d0407baSopenharmony_ci u32 match_data; 1113d0407baSopenharmony_ci u32 match_en; 1123d0407baSopenharmony_ci u8 af:1; 1133d0407baSopenharmony_ci u8 rf:1; 1143d0407baSopenharmony_ci u8 im:1; 1153d0407baSopenharmony_ci u8 nc:1; 1163d0407baSopenharmony_ci u8 res1:4; 1173d0407baSopenharmony_ci u8 frame_offset; 1183d0407baSopenharmony_ci u8 ok_index; 1193d0407baSopenharmony_ci u8 dma_ch_no; 1203d0407baSopenharmony_ci u32 res2; 1213d0407baSopenharmony_ci } __packed val; 1223d0407baSopenharmony_ci}; 1233d0407baSopenharmony_ci 1243d0407baSopenharmony_ci#define STMMAC_PPS_MAX 4 1253d0407baSopenharmony_cistruct stmmac_pps_cfg { 1263d0407baSopenharmony_ci bool available; 1273d0407baSopenharmony_ci struct timespec64 start; 1283d0407baSopenharmony_ci struct timespec64 period; 1293d0407baSopenharmony_ci}; 1303d0407baSopenharmony_ci 1313d0407baSopenharmony_cistruct stmmac_rss { 1323d0407baSopenharmony_ci int enable; 1333d0407baSopenharmony_ci u8 key[STMMAC_RSS_HASH_KEY_SIZE]; 1343d0407baSopenharmony_ci u32 table[STMMAC_RSS_MAX_TABLE_SIZE]; 1353d0407baSopenharmony_ci}; 1363d0407baSopenharmony_ci 1373d0407baSopenharmony_ci#define STMMAC_FLOW_ACTION_DROP BIT(0) 1383d0407baSopenharmony_cistruct stmmac_flow_entry { 1393d0407baSopenharmony_ci unsigned long cookie; 1403d0407baSopenharmony_ci unsigned long action; 1413d0407baSopenharmony_ci u8 ip_proto; 1423d0407baSopenharmony_ci int in_use; 1433d0407baSopenharmony_ci int idx; 1443d0407baSopenharmony_ci int is_l4; 1453d0407baSopenharmony_ci}; 1463d0407baSopenharmony_ci 1473d0407baSopenharmony_cistruct stmmac_priv { 1483d0407baSopenharmony_ci /* Frequently used values are kept adjacent for cache effect */ 1493d0407baSopenharmony_ci u32 tx_coal_frames; 1503d0407baSopenharmony_ci u32 tx_coal_timer; 1513d0407baSopenharmony_ci u32 rx_coal_frames; 1523d0407baSopenharmony_ci 1533d0407baSopenharmony_ci int tx_coalesce; 1543d0407baSopenharmony_ci int hwts_tx_en; 1553d0407baSopenharmony_ci bool tx_path_in_lpi_mode; 1563d0407baSopenharmony_ci bool tso; 1573d0407baSopenharmony_ci int sph; 1583d0407baSopenharmony_ci u32 sarc_type; 1593d0407baSopenharmony_ci 1603d0407baSopenharmony_ci unsigned int dma_buf_sz; 1613d0407baSopenharmony_ci unsigned int rx_copybreak; 1623d0407baSopenharmony_ci u32 rx_riwt; 1633d0407baSopenharmony_ci int hwts_rx_en; 1643d0407baSopenharmony_ci 1653d0407baSopenharmony_ci void __iomem *ioaddr; 1663d0407baSopenharmony_ci struct net_device *dev; 1673d0407baSopenharmony_ci struct device *device; 1683d0407baSopenharmony_ci struct mac_device_info *hw; 1693d0407baSopenharmony_ci int (*hwif_quirks)(struct stmmac_priv *priv); 1703d0407baSopenharmony_ci struct mutex lock; 1713d0407baSopenharmony_ci 1723d0407baSopenharmony_ci /* RX Queue */ 1733d0407baSopenharmony_ci struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES]; 1743d0407baSopenharmony_ci unsigned int dma_rx_size; 1753d0407baSopenharmony_ci 1763d0407baSopenharmony_ci /* TX Queue */ 1773d0407baSopenharmony_ci struct stmmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES]; 1783d0407baSopenharmony_ci unsigned int dma_tx_size; 1793d0407baSopenharmony_ci 1803d0407baSopenharmony_ci /* Generic channel for NAPI */ 1813d0407baSopenharmony_ci struct stmmac_channel channel[STMMAC_CH_MAX]; 1823d0407baSopenharmony_ci 1833d0407baSopenharmony_ci int speed; 1843d0407baSopenharmony_ci unsigned int flow_ctrl; 1853d0407baSopenharmony_ci unsigned int pause; 1863d0407baSopenharmony_ci struct mii_bus *mii; 1873d0407baSopenharmony_ci int mii_irq[PHY_MAX_ADDR]; 1883d0407baSopenharmony_ci 1893d0407baSopenharmony_ci struct phylink_config phylink_config; 1903d0407baSopenharmony_ci struct phylink *phylink; 1913d0407baSopenharmony_ci 1923d0407baSopenharmony_ci struct stmmac_extra_stats xstats ____cacheline_aligned_in_smp; 1933d0407baSopenharmony_ci struct stmmac_safety_stats sstats; 1943d0407baSopenharmony_ci struct plat_stmmacenet_data *plat; 1953d0407baSopenharmony_ci struct dma_features dma_cap; 1963d0407baSopenharmony_ci struct stmmac_counters mmc; 1973d0407baSopenharmony_ci int hw_cap_support; 1983d0407baSopenharmony_ci int synopsys_id; 1993d0407baSopenharmony_ci u32 msg_enable; 2003d0407baSopenharmony_ci int wolopts; 2013d0407baSopenharmony_ci int wol_irq; 2023d0407baSopenharmony_ci int clk_csr; 2033d0407baSopenharmony_ci struct timer_list eee_ctrl_timer; 2043d0407baSopenharmony_ci int lpi_irq; 2053d0407baSopenharmony_ci int eee_enabled; 2063d0407baSopenharmony_ci int eee_active; 2073d0407baSopenharmony_ci int tx_lpi_timer; 2083d0407baSopenharmony_ci int tx_lpi_enabled; 2093d0407baSopenharmony_ci int eee_tw_timer; 2103d0407baSopenharmony_ci unsigned int mode; 2113d0407baSopenharmony_ci unsigned int chain_mode; 2123d0407baSopenharmony_ci int extend_desc; 2133d0407baSopenharmony_ci struct hwtstamp_config tstamp_config; 2143d0407baSopenharmony_ci struct ptp_clock *ptp_clock; 2153d0407baSopenharmony_ci struct ptp_clock_info ptp_clock_ops; 2163d0407baSopenharmony_ci unsigned int default_addend; 2173d0407baSopenharmony_ci u32 sub_second_inc; 2183d0407baSopenharmony_ci u32 systime_flags; 2193d0407baSopenharmony_ci u32 adv_ts; 2203d0407baSopenharmony_ci int use_riwt; 2213d0407baSopenharmony_ci int irq_wake; 2223d0407baSopenharmony_ci spinlock_t ptp_lock; 2233d0407baSopenharmony_ci void __iomem *mmcaddr; 2243d0407baSopenharmony_ci void __iomem *ptpaddr; 2253d0407baSopenharmony_ci unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 2263d0407baSopenharmony_ci 2273d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_FS 2283d0407baSopenharmony_ci struct dentry *dbgfs_dir; 2293d0407baSopenharmony_ci#endif 2303d0407baSopenharmony_ci 2313d0407baSopenharmony_ci unsigned long state; 2323d0407baSopenharmony_ci struct workqueue_struct *wq; 2333d0407baSopenharmony_ci struct work_struct service_task; 2343d0407baSopenharmony_ci 2353d0407baSopenharmony_ci /* TC Handling */ 2363d0407baSopenharmony_ci unsigned int tc_entries_max; 2373d0407baSopenharmony_ci unsigned int tc_off_max; 2383d0407baSopenharmony_ci struct stmmac_tc_entry *tc_entries; 2393d0407baSopenharmony_ci unsigned int flow_entries_max; 2403d0407baSopenharmony_ci struct stmmac_flow_entry *flow_entries; 2413d0407baSopenharmony_ci 2423d0407baSopenharmony_ci /* Pulse Per Second output */ 2433d0407baSopenharmony_ci struct stmmac_pps_cfg pps[STMMAC_PPS_MAX]; 2443d0407baSopenharmony_ci 2453d0407baSopenharmony_ci /* Receive Side Scaling */ 2463d0407baSopenharmony_ci struct stmmac_rss rss; 2473d0407baSopenharmony_ci}; 2483d0407baSopenharmony_ci 2493d0407baSopenharmony_cienum stmmac_state { 2503d0407baSopenharmony_ci STMMAC_DOWN, 2513d0407baSopenharmony_ci STMMAC_RESET_REQUESTED, 2523d0407baSopenharmony_ci STMMAC_RESETING, 2533d0407baSopenharmony_ci STMMAC_SERVICE_SCHED, 2543d0407baSopenharmony_ci}; 2553d0407baSopenharmony_ci 2563d0407baSopenharmony_ciint stmmac_mdio_unregister(struct net_device *ndev); 2573d0407baSopenharmony_ciint stmmac_mdio_register(struct net_device *ndev); 2583d0407baSopenharmony_ciint stmmac_mdio_reset(struct mii_bus *mii); 2593d0407baSopenharmony_civoid stmmac_set_ethtool_ops(struct net_device *netdev); 2603d0407baSopenharmony_ci 2613d0407baSopenharmony_ciint stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags); 2623d0407baSopenharmony_civoid stmmac_ptp_register(struct stmmac_priv *priv); 2633d0407baSopenharmony_civoid stmmac_ptp_unregister(struct stmmac_priv *priv); 2643d0407baSopenharmony_ciint stmmac_resume(struct device *dev); 2653d0407baSopenharmony_ciint stmmac_suspend(struct device *dev); 2663d0407baSopenharmony_ciint stmmac_dvr_remove(struct device *dev); 2673d0407baSopenharmony_ciint stmmac_dvr_probe(struct device *device, 2683d0407baSopenharmony_ci struct plat_stmmacenet_data *plat_dat, 2693d0407baSopenharmony_ci struct stmmac_resources *res); 2703d0407baSopenharmony_civoid stmmac_disable_eee_mode(struct stmmac_priv *priv); 2713d0407baSopenharmony_cibool stmmac_eee_init(struct stmmac_priv *priv); 2723d0407baSopenharmony_ciint stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt); 2733d0407baSopenharmony_ciint stmmac_reinit_ringparam(struct net_device *dev, u32 rx_size, u32 tx_size); 2743d0407baSopenharmony_ciint stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled); 2753d0407baSopenharmony_ci 2763d0407baSopenharmony_ci#if IS_ENABLED(CONFIG_STMMAC_SELFTESTS) 2773d0407baSopenharmony_civoid stmmac_selftest_run(struct net_device *dev, 2783d0407baSopenharmony_ci struct ethtool_test *etest, u64 *buf); 2793d0407baSopenharmony_civoid stmmac_selftest_get_strings(struct stmmac_priv *priv, u8 *data); 2803d0407baSopenharmony_ciint stmmac_selftest_get_count(struct stmmac_priv *priv); 2813d0407baSopenharmony_ci#else 2823d0407baSopenharmony_cistatic inline void stmmac_selftest_run(struct net_device *dev, 2833d0407baSopenharmony_ci struct ethtool_test *etest, u64 *buf) 2843d0407baSopenharmony_ci{ 2853d0407baSopenharmony_ci /* Not enabled */ 2863d0407baSopenharmony_ci} 2873d0407baSopenharmony_cistatic inline void stmmac_selftest_get_strings(struct stmmac_priv *priv, 2883d0407baSopenharmony_ci u8 *data) 2893d0407baSopenharmony_ci{ 2903d0407baSopenharmony_ci /* Not enabled */ 2913d0407baSopenharmony_ci} 2923d0407baSopenharmony_cistatic inline int stmmac_selftest_get_count(struct stmmac_priv *priv) 2933d0407baSopenharmony_ci{ 2943d0407baSopenharmony_ci return -EOPNOTSUPP; 2953d0407baSopenharmony_ci} 2963d0407baSopenharmony_ci#endif /* CONFIG_STMMAC_SELFTESTS */ 2973d0407baSopenharmony_ci 2983d0407baSopenharmony_ci#endif /* __STMMAC_H__ */ 299