#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include <linux/in.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <linux/highmem.h>
#include <linux/proc_fs.h>
#include <linux/ctype.h>
#include <linux/spinlock.h>
#include <linux/dma-mapping.h>
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/semaphore.h>
#include <linux/phy.h>
#include <linux/bitops.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/pm_runtime.h>
#include <linux/davinci_emac.h>
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h>
#include <linux/mfd/syscon.h>
#include <asm/irq.h>
#include <asm/page.h>
#include "cpsw.h"
#include "davinci_cpdma.h"
static int debug_level;
module_param(debug_level, int, 0);
MODULE_PARM_DESC(…) …;
#define DAVINCI_EMAC_DEBUG …
#define EMAC_MAJOR_VERSION …
#define EMAC_MINOR_VERSION …
#define EMAC_MODULE_VERSION …
MODULE_VERSION(…);
static const char emac_version_string[] = …;
#define EMAC_DEF_PASS_CRC …
#define EMAC_DEF_QOS_EN …
#define EMAC_DEF_NO_BUFF_CHAIN …
#define EMAC_DEF_MACCTRL_FRAME_EN …
#define EMAC_DEF_SHORT_FRAME_EN …
#define EMAC_DEF_ERROR_FRAME_EN …
#define EMAC_DEF_PROM_EN …
#define EMAC_DEF_PROM_CH …
#define EMAC_DEF_BCAST_EN …
#define EMAC_DEF_BCAST_CH …
#define EMAC_DEF_MCAST_EN …
#define EMAC_DEF_MCAST_CH …
#define EMAC_DEF_TXPRIO_FIXED …
#define EMAC_DEF_TXPACING_EN …
#define EMAC_DEF_BUFFER_OFFSET …
#define EMAC_DEF_MIN_ETHPKTSIZE …
#define EMAC_DEF_MAX_FRAME_SIZE …
#define EMAC_DEF_TX_CH …
#define EMAC_DEF_RX_CH …
#define EMAC_DEF_RX_NUM_DESC …
#define EMAC_DEF_MAX_TX_CH …
#define EMAC_DEF_MAX_RX_CH …
#define EMAC_DEF_TX_MAX_SERVICE …
#define EMAC_DEF_RX_MAX_SERVICE …
#define EMAC_ALL_MULTI_REG_VALUE …
#define EMAC_NUM_MULTICAST_BITS …
#define EMAC_TX_CONTROL_TX_ENABLE_VAL …
#define EMAC_RX_CONTROL_RX_ENABLE_VAL …
#define EMAC_MAC_HOST_ERR_INTMASK_VAL …
#define EMAC_RX_UNICAST_CLEAR_ALL …
#define EMAC_INT_MASK_CLEAR …
#define EMAC_RXMBP_PASSCRC_MASK …
#define EMAC_RXMBP_QOSEN_MASK …
#define EMAC_RXMBP_NOCHAIN_MASK …
#define EMAC_RXMBP_CMFEN_MASK …
#define EMAC_RXMBP_CSFEN_MASK …
#define EMAC_RXMBP_CEFEN_MASK …
#define EMAC_RXMBP_CAFEN_MASK …
#define EMAC_RXMBP_PROMCH_SHIFT …
#define EMAC_RXMBP_PROMCH_MASK …
#define EMAC_RXMBP_BROADEN_MASK …
#define EMAC_RXMBP_BROADCH_SHIFT …
#define EMAC_RXMBP_BROADCH_MASK …
#define EMAC_RXMBP_MULTIEN_MASK …
#define EMAC_RXMBP_MULTICH_SHIFT …
#define EMAC_RXMBP_MULTICH_MASK …
#define EMAC_RXMBP_CHMASK …
#define EMAC_MBP_RXPROMISC …
#define EMAC_MBP_PROMISCCH(ch) …
#define EMAC_MBP_RXBCAST …
#define EMAC_MBP_BCASTCHAN(ch) …
#define EMAC_MBP_RXMCAST …
#define EMAC_MBP_MCASTCHAN(ch) …
#define EMAC_MACCONTROL_TXPTYPE …
#define EMAC_MACCONTROL_TXPACEEN …
#define EMAC_MACCONTROL_GMIIEN …
#define EMAC_MACCONTROL_GIGABITEN …
#define EMAC_MACCONTROL_FULLDUPLEXEN …
#define EMAC_MACCONTROL_RMIISPEED_MASK …
#define EMAC_DM646X_MACCONTORL_GIG …
#define EMAC_DM646X_MACCONTORL_GIGFORCE …
#define EMAC_MACSTATUS_TXERRCODE_MASK …
#define EMAC_MACSTATUS_TXERRCODE_SHIFT …
#define EMAC_MACSTATUS_TXERRCH_MASK …
#define EMAC_MACSTATUS_TXERRCH_SHIFT …
#define EMAC_MACSTATUS_RXERRCODE_MASK …
#define EMAC_MACSTATUS_RXERRCODE_SHIFT …
#define EMAC_MACSTATUS_RXERRCH_MASK …
#define EMAC_MACSTATUS_RXERRCH_SHIFT …
#define EMAC_RX_MAX_LEN_MASK …
#define EMAC_RX_BUFFER_OFFSET_MASK …
#define EMAC_DM644X_MAC_IN_VECTOR_HOST_INT …
#define EMAC_DM644X_MAC_IN_VECTOR_STATPEND_INT …
#define EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC …
#define EMAC_DM644X_MAC_IN_VECTOR_TX_INT_VEC …
#define EMAC_DM646X_MAC_IN_VECTOR_RX_INT_VEC …
#define EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC …
#define EMAC_DM646X_MAC_IN_VECTOR_HOST_INT …
#define EMAC_DM646X_MAC_IN_VECTOR_STATPEND_INT …
#define EMAC_CPPI_SOP_BIT …
#define EMAC_CPPI_EOP_BIT …
#define EMAC_CPPI_OWNERSHIP_BIT …
#define EMAC_CPPI_EOQ_BIT …
#define EMAC_CPPI_TEARDOWN_COMPLETE_BIT …
#define EMAC_CPPI_PASS_CRC_BIT …
#define EMAC_RX_BD_BUF_SIZE …
#define EMAC_BD_LENGTH_FOR_CACHE …
#define EMAC_RX_BD_PKT_LENGTH_MASK …
#define EMAC_MAX_TXRX_CHANNELS …
#define EMAC_DEF_MAX_MULTICAST_ADDRESSES …
#define EMAC_MACINVECTOR …
#define EMAC_DM646X_MACEOIVECTOR …
#define EMAC_MACINTSTATRAW …
#define EMAC_MACINTSTATMASKED …
#define EMAC_MACINTMASKSET …
#define EMAC_MACINTMASKCLEAR …
#define EMAC_RXMBPENABLE …
#define EMAC_RXUNICASTSET …
#define EMAC_RXUNICASTCLEAR …
#define EMAC_RXMAXLEN …
#define EMAC_RXBUFFEROFFSET …
#define EMAC_RXFILTERLOWTHRESH …
#define EMAC_MACCONTROL …
#define EMAC_MACSTATUS …
#define EMAC_EMCONTROL …
#define EMAC_FIFOCONTROL …
#define EMAC_MACCONFIG …
#define EMAC_SOFTRESET …
#define EMAC_MACSRCADDRLO …
#define EMAC_MACSRCADDRHI …
#define EMAC_MACHASH1 …
#define EMAC_MACHASH2 …
#define EMAC_MACADDRLO …
#define EMAC_MACADDRHI …
#define EMAC_MACINDEX …
#define EMAC_RXGOODFRAMES …
#define EMAC_RXBCASTFRAMES …
#define EMAC_RXMCASTFRAMES …
#define EMAC_RXPAUSEFRAMES …
#define EMAC_RXCRCERRORS …
#define EMAC_RXALIGNCODEERRORS …
#define EMAC_RXOVERSIZED …
#define EMAC_RXJABBER …
#define EMAC_RXUNDERSIZED …
#define EMAC_RXFRAGMENTS …
#define EMAC_RXFILTERED …
#define EMAC_RXQOSFILTERED …
#define EMAC_RXOCTETS …
#define EMAC_TXGOODFRAMES …
#define EMAC_TXBCASTFRAMES …
#define EMAC_TXMCASTFRAMES …
#define EMAC_TXPAUSEFRAMES …
#define EMAC_TXDEFERRED …
#define EMAC_TXCOLLISION …
#define EMAC_TXSINGLECOLL …
#define EMAC_TXMULTICOLL …
#define EMAC_TXEXCESSIVECOLL …
#define EMAC_TXLATECOLL …
#define EMAC_TXUNDERRUN …
#define EMAC_TXCARRIERSENSE …
#define EMAC_TXOCTETS …
#define EMAC_NETOCTETS …
#define EMAC_RXSOFOVERRUNS …
#define EMAC_RXMOFOVERRUNS …
#define EMAC_RXDMAOVERRUNS …
#define EMAC_CTRL_EWCTL …
#define EMAC_CTRL_EWINTTCNT …
#define EMAC_DM644X_EWINTCNT_MASK …
#define EMAC_DM644X_INTMIN_INTVL …
#define EMAC_DM644X_INTMAX_INTVL …
#define EMAC_DM646X_CMINTCTRL …
#define EMAC_DM646X_CMRXINTEN …
#define EMAC_DM646X_CMTXINTEN …
#define EMAC_DM646X_CMRXINTMAX …
#define EMAC_DM646X_CMTXINTMAX …
#define EMAC_DM646X_INTPACEEN …
#define EMAC_DM646X_INTPRESCALE_MASK …
#define EMAC_DM646X_CMINTMAX_CNT …
#define EMAC_DM646X_CMINTMIN_CNT …
#define EMAC_DM646X_CMINTMAX_INTVL …
#define EMAC_DM646X_CMINTMIN_INTVL …
#define EMAC_DM646X_MAC_EOI_C0_RXEN …
#define EMAC_DM646X_MAC_EOI_C0_TXEN …
#define EMAC_STATS_CLR_MASK …
struct emac_priv { … };
static char *emac_txhost_errcodes[16] = …;
static char *emac_rxhost_errcodes[16] = …;
#define emac_read(reg) …
#define emac_write(reg, val) …
#define emac_ctrl_read(reg) …
#define emac_ctrl_write(reg, val) …
static void emac_get_drvinfo(struct net_device *ndev,
struct ethtool_drvinfo *info)
{ … }
static int emac_get_coalesce(struct net_device *ndev,
struct ethtool_coalesce *coal,
struct kernel_ethtool_coalesce *kernel_coal,
struct netlink_ext_ack *extack)
{ … }
static int emac_set_coalesce(struct net_device *ndev,
struct ethtool_coalesce *coal,
struct kernel_ethtool_coalesce *kernel_coal,
struct netlink_ext_ack *extack)
{ … }
static const struct ethtool_ops ethtool_ops = …;
static void emac_update_phystatus(struct emac_priv *priv)
{ … }
static u32 hash_get(u8 *addr)
{ … }
static int emac_hash_add(struct emac_priv *priv, u8 *mac_addr)
{ … }
static int emac_hash_del(struct emac_priv *priv, u8 *mac_addr)
{ … }
#define EMAC_MULTICAST_ADD …
#define EMAC_MULTICAST_DEL …
#define EMAC_ALL_MULTI_SET …
#define EMAC_ALL_MULTI_CLR …
static void emac_add_mcast(struct emac_priv *priv, u32 action, u8 *mac_addr)
{ … }
static void emac_dev_mcast_set(struct net_device *ndev)
{ … }
static void emac_int_disable(struct emac_priv *priv)
{ … }
static void emac_int_enable(struct emac_priv *priv)
{ … }
static irqreturn_t emac_irq(int irq, void *dev_id)
{ … }
static struct sk_buff *emac_rx_alloc(struct emac_priv *priv)
{ … }
static void emac_rx_handler(void *token, int len, int status)
{ … }
static void emac_tx_handler(void *token, int len, int status)
{ … }
static netdev_tx_t emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev)
{ … }
static void emac_dev_tx_timeout(struct net_device *ndev, unsigned int txqueue)
{ … }
static void emac_set_type0addr(struct emac_priv *priv, u32 ch, char *mac_addr)
{ … }
static void emac_set_type1addr(struct emac_priv *priv, u32 ch, char *mac_addr)
{ … }
static void emac_set_type2addr(struct emac_priv *priv, u32 ch,
char *mac_addr, int index, int match)
{ … }
static void emac_setmac(struct emac_priv *priv, u32 ch, char *mac_addr)
{ … }
static int emac_dev_setmac_addr(struct net_device *ndev, void *addr)
{ … }
static int emac_hw_enable(struct emac_priv *priv)
{ … }
static int emac_poll(struct napi_struct *napi, int budget)
{ … }
#ifdef CONFIG_NET_POLL_CONTROLLER
static void emac_poll_controller(struct net_device *ndev)
{ … }
#endif
static void emac_adjust_link(struct net_device *ndev)
{ … }
static int emac_devioctl(struct net_device *ndev, struct ifreq *ifrq, int cmd)
{ … }
static int match_first_device(struct device *dev, const void *data)
{ … }
static int emac_dev_open(struct net_device *ndev)
{ … }
static int emac_dev_stop(struct net_device *ndev)
{ … }
static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev)
{ … }
static const struct net_device_ops emac_netdev_ops = …;
static struct emac_platform_data *
davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv)
{ … }
static int davinci_emac_try_get_mac(struct platform_device *pdev,
int instance, u8 *mac_addr)
{ … }
static int davinci_emac_probe(struct platform_device *pdev)
{ … }
static void davinci_emac_remove(struct platform_device *pdev)
{ … }
static int davinci_emac_suspend(struct device *dev)
{ … }
static int davinci_emac_resume(struct device *dev)
{ … }
static const struct dev_pm_ops davinci_emac_pm_ops = …;
static const struct emac_platform_data am3517_emac_data = …;
static const struct emac_platform_data dm816_emac_data = …;
static const struct of_device_id davinci_emac_of_match[] = …;
MODULE_DEVICE_TABLE(of, davinci_emac_of_match);
static struct platform_driver davinci_emac_driver = …;
static int __init davinci_emac_init(void)
{ … }
late_initcall(davinci_emac_init);
static void __exit davinci_emac_exit(void)
{ … }
module_exit(davinci_emac_exit);
MODULE_LICENSE(…) …;
MODULE_AUTHOR(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;