/**
 * Copyright (c) 2008-2012 Quantenna Communications, Inc.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 **/
#include <linux/version.h>
#include <linux/netdevice.h>
#include <linux/ethtool.h>
#include <linux/mii.h>
#include <linux/phy.h>
#include <linux/sysfs.h>
#include <linux/crc32.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
#include <linux/proc_fs.h>
#include <linux/pm_qos.h>
#include <linux/gpio.h>
#else
#include <linux/pm_qos_params.h>
#include <asm/gpio.h>
#endif



#include <asm/board/soc.h>
#include <asm/board/board_config.h>

#include <common/ruby_pm.h>
#include <qtn/emac_debug.h>
#include "ar823x.h"
#include "mv88e6071.h"
#include "emac_lib.h"
#include "rtl8367b/rtl8367b_init.h"
#include <common/topaz_emac.h>
#include <qtn/dmautil.h>
#include <qtn/qtn_debug.h>

/* create build error if arasan structure is re-introduced */
struct emac_lib_private {
};

#define MDIO_REGISTERS		32

#define DRV_NAME		"emac_lib"
#define DRV_VERSION		"1.0"
#define DRV_AUTHOR		"Quantenna Communications Inc."
#define DRV_DESC		"Arasan AHB-EMAC on-chip Ethernet driver"

#define PHY_REG_PROC_FILE_NAME	"phy_reg"
#define PHY_PW_PROC_FILE_NAME	"phy_pw"
#define PHY_PW_CMD_MAX_LEN	20

static int mdio_use_noops = 0;
module_param(mdio_use_noops, int, 0);
int mdc_clk_divisor = 1;
module_param(mdc_clk_divisor, int, 0644);

static uint32_t emac_lib_dual_emac;

static ssize_t show_mdio_use_noops(struct device *dev, struct device_attribute *attr, char *buf)
{
	return snprintf(buf, PAGE_SIZE, "%d\n", mdio_use_noops);
}

static ssize_t store_mdio_use_noops(struct device *dev, struct device_attribute *attr,
					const char *buf, size_t count)
{
	if (count >= 1)
		mdio_use_noops = (buf[0] == '1');
	if (mdio_use_noops)
		printk(KERN_INFO "Disabling MDIO read/write for %s\n", dev_name(dev));

#if EMAC_REG_DEBUG
	if (buf[0] == 'd') {
		unsigned long base = RUBY_ENET0_BASE_ADDR;
		if (buf[1] == '1')
			base = RUBY_ENET1_BASE_ADDR;
		emac_lib_reg_debug(base);
	}
#endif

#ifdef RTL_SWITCH
	if (buf[0] == 'a') {
		rtl8367b_dump_status();
	}
	if (buf[0] == 's') {
		rtl8367b_dump_stats();
	}
#endif

	return count;
}

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
static DEVICE_ATTR(mdio_use_noops, S_IRUSR | S_IWUSR, show_mdio_use_noops, store_mdio_use_noops);
#else
static DEVICE_ATTR(mdio_use_noops, S_IRUGO | S_IWUGO, show_mdio_use_noops, store_mdio_use_noops);
#endif

int emac_lib_mdio_sysfs_create(struct net_device *net_dev)
{
	return sysfs_create_file(&net_dev->dev.kobj, &dev_attr_mdio_use_noops.attr);
}
EXPORT_SYMBOL(emac_lib_mdio_sysfs_create);

void emac_lib_mdio_sysfs_remove(struct net_device *net_dev)
{
	sysfs_remove_file(&net_dev->dev.kobj, &dev_attr_mdio_use_noops.attr);
}
EXPORT_SYMBOL(emac_lib_mdio_sysfs_remove);

/* noop_values are shared between all devices, could get interesting if there are more than one */
static u32 mdio_noop_values[MDIO_REGISTERS] = {
			    0xFFFF,
			    0x796D,
			    0x243,
			    0xD91,
			    0xDE1,
			    0xCDE1,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0x700,
			    0x7C00,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF,
			    0xFFFF
};


/*
 * This functions polls until register value is changed (apply mask and compare with val).
 * Function has timeout, so polling is not indefinite.
 * Also function try to be clever and work safely in heavy loaded system.
 * It also try to reduce CPU load using sleep or context switch.
 */
int emac_lib_poll_wait(struct emac_common *privc, u32(*read_func)(struct emac_common*, int),
		int reg, u32 mask, u32 val, unsigned long ms, const char *func)
{
	int ret = 1;
	unsigned long ms_warn = ms / 2;

	int first_run = 1;
	unsigned long deadline = jiffies + max(msecs_to_jiffies(ms), 1UL);

	while (((*read_func)(privc, reg) & mask) != val) {
		if (first_run) {
			deadline = jiffies + max(msecs_to_jiffies(ms), 1UL);
			first_run = 0;
		} else if (time_after_eq(jiffies, deadline)) {
			break;
		} else if (irqs_disabled() || in_atomic()) {
			udelay(100);
		} else if (time_before(jiffies + 5, deadline)) {
			msleep(1000 / HZ);
		} else {
			cond_resched();
		}
	}
	if (((*read_func)(privc, reg) & mask) != val) {
		if (func) {
			if (printk_ratelimit()) {
				printk(KERN_ERR "%s %s: err: timeout %lums\n",
						privc->dev->name, func, ms);
			}
		}
		ret = 0;
	} else if(time_after_eq(jiffies + msecs_to_jiffies(ms_warn), deadline)) {
		if (func) {
			if (printk_ratelimit())
				printk(KERN_WARNING "%s %s: warn: system is overloaded : spend more ~%lums!\n",
					privc->dev->name, func, ms_warn);
		}
	}

	return ret;
}
EXPORT_SYMBOL(emac_lib_poll_wait);

int emac_lib_board_cfg(int port, int *cfg, int *phy)
{
	int cfg_param;
	int phy_param;
	int rc;

	if (port == 0) {
		cfg_param = BOARD_CFG_EMAC0;
		phy_param = BOARD_CFG_PHY0_ADDR;
	} else if (port == 1) {
		cfg_param = BOARD_CFG_EMAC1;
		phy_param = BOARD_CFG_PHY1_ADDR;
	} else {
		printk(KERN_ERR "%s invalid port number %d\n", __FUNCTION__, port);
		return -EINVAL;
	}

	rc = get_board_config(cfg_param, cfg);
	if (rc) {
		printk(KERN_ERR "%s get_board_config returns %d\n", __FUNCTION__, rc);
		return rc;
	}

	rc = get_board_config(phy_param, phy);
	if (rc) {
		printk(KERN_ERR "%s get_board_config returns %d\n", __FUNCTION__, rc);
		return rc;
	}

	return 0;
}
EXPORT_SYMBOL(emac_lib_board_cfg);

static void emac_lib_adjust_speed(struct net_device *dev, int speed, int duplex)
{
	u32 val;
	u32 speed_shift = 0;
	struct emac_common *privc = netdev_priv(dev);

	switch (privc->mac_id) {
		case 0:
			speed_shift = RUBY_SYS_CTL_MASK_GMII0_SHIFT;
			break;
		case 1:
			speed_shift = RUBY_SYS_CTL_MASK_GMII1_SHIFT;
			break;
		default:
			panic("No speed_shift defined for %d\n", (int)privc->mac_id);
			break;
	}

	val = emac_rd(privc, EMAC_MAC_GLOBAL_CTRL) & ~(MacSpeedMask | MacFullDuplex);
	if (duplex == DUPLEX_FULL) {
		val |= MacFullDuplex;
	}
	/* note: this covers emac0 - need to extend for emac1 when we add support */
	writel(RUBY_SYS_CTL_MASK_GMII_TXCLK << speed_shift, IO_ADDRESS(RUBY_SYS_CTL_MASK));
	switch (speed) {
		case SPEED_10:
			emac_wr(privc, EMAC_MAC_GLOBAL_CTRL, val | MacSpeed10M);
			writel(RUBY_SYS_CTL_MASK_GMII_10M << speed_shift, IO_ADDRESS(RUBY_SYS_CTL_CTRL));
			break;
		case SPEED_100:
			emac_wr(privc, EMAC_MAC_GLOBAL_CTRL, val | MacSpeed100M);
			writel(RUBY_SYS_CTL_MASK_GMII_100M << speed_shift, IO_ADDRESS(RUBY_SYS_CTL_CTRL));
			break;
		case SPEED_1000:
			emac_wr(privc, EMAC_MAC_GLOBAL_CTRL, val | MacSpeed1G);
			writel(RUBY_SYS_CTL_MASK_GMII_1000M << speed_shift, IO_ADDRESS(RUBY_SYS_CTL_CTRL));
			break;
		default:
			printk(KERN_WARNING "%s: Speed (%d) is not supported\n", dev->name, speed);
			break;
	}
}

static void emac_lib_adjust_link(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct phy_device *phydev = privc->phy_dev;

	BUG_ON(!privc->phy_dev);
	if (phydev->link != privc->old_link) {
		if (phydev->link) {
			emac_lib_adjust_speed(dev, phydev->speed, phydev->duplex);
			netif_tx_schedule_all(dev);
			printk(KERN_INFO "%s: link up (%d/%s)\n",
					dev->name, phydev->speed,
					phydev->duplex == DUPLEX_FULL ? "Full" : "Half");
		} else {
			printk(KERN_INFO "%s: link down\n", dev->name);
		}
		privc->old_link = phydev->link;
	}
}

/*
* One MDIO bus is used on our SoC to access PHYs of all EMACs.
* This mutex guards access to the bus.
*/
static DEFINE_MUTEX(mdio_bus_lock);
/*
 * MII operations
 */
int emac_lib_mdio_read(struct mii_bus *bus, int phy_addr, int reg)
{
	struct net_device *dev;
	struct emac_common *privc;
	u32 mii_control, read_val;

	mutex_lock(&mdio_bus_lock);

	if (mdio_use_noops) {
		uint32_t noop_value = mdio_noop_values[reg % MDIO_REGISTERS];
		mutex_unlock(&mdio_bus_lock);
		return noop_value;
	}

	dev = bus->priv;
	privc = netdev_priv(dev);

	if (!mdio_wait(privc, EMAC_MAC_MDIO_CTRL, MacMdioCtrlStart, 0, TIMEOUT_MAC_MDIO_CTRL, __FUNCTION__)) {
		mutex_unlock(&mdio_bus_lock);
		return -1;
	}

	mii_control =
		((reg & MacMdioCtrlRegMask) << MacMdioCtrlRegShift) |
		((phy_addr & MacMdioCtrlPhyMask) << MacMdioCtrlPhyShift) |
		((mdc_clk_divisor & MacMdioCtrlClkMask) << MacMdioCtrlClkShift) |
		MacMdioCtrlRead | MacMdioCtrlStart;
	mdio_wr(privc, EMAC_MAC_MDIO_CTRL, mii_control);
	if (!mdio_wait(privc, EMAC_MAC_MDIO_CTRL, MacMdioCtrlStart, 0, TIMEOUT_MAC_MDIO_CTRL, __FUNCTION__)) {
		mutex_unlock(&mdio_bus_lock);
		return -1;
	}

	read_val = mdio_rd(privc, EMAC_MAC_MDIO_DATA) & MacMdioDataMask;
	/* printk(KERN_INFO "%s: PHY: %d Reg %d Value 0x%08x\n", __FUNCTION__, phy_addr, reg, read_val); */
	mdio_noop_values[reg % MDIO_REGISTERS] = read_val;
	mutex_unlock(&mdio_bus_lock);

	return (int)(read_val);
}

int emac_lib_mdio_write(struct mii_bus *bus, int phy_addr, int reg, uint16_t value)
{
	struct net_device *dev;
	struct emac_common *privc;
	u32 mii_control;

	if (mdio_use_noops) {
		/* printk(KERN_WARNING "MII Write is a noop: MII WR: Reg %d Value %08X\n",reg,(unsigned)value); */
		return 0;
	}

	mutex_lock(&mdio_bus_lock);
	dev = bus->priv;
	privc = netdev_priv(dev);

	if (!mdio_wait(privc, EMAC_MAC_MDIO_CTRL, MacMdioCtrlStart, 0, TIMEOUT_MAC_MDIO_CTRL, __FUNCTION__)) {
		mutex_unlock(&mdio_bus_lock);
		return -1;
	}

	mii_control =
		((reg & MacMdioCtrlRegMask) << MacMdioCtrlRegShift) |
		((phy_addr & MacMdioCtrlPhyMask) << MacMdioCtrlPhyShift) |
		((mdc_clk_divisor & MacMdioCtrlClkMask) << MacMdioCtrlClkShift) |
		MacMdioCtrlWrite | MacMdioCtrlStart;

	/* printk(KERN_INFO "%s: PHY: %d Reg %d Value 0x%08x\n", __FUNCTION__, phy_addr, reg, value); */
	mdio_wr(privc, EMAC_MAC_MDIO_DATA, value);
	mdio_wr(privc, EMAC_MAC_MDIO_CTRL, mii_control);
	mutex_unlock(&mdio_bus_lock);

	return 0;
}

static u32 phydev_addr_inuse[2] = { -1, -1 };

static int mii_probe(struct net_device *dev)
{
	struct emac_common * const privc = netdev_priv(dev);
	struct phy_device *phydev = NULL;
	int phy_index;
	int phy_found = 0;
	int port_num = privc->mac_id;
	unsigned long phy_supported = 0;

	privc->phy_dev = NULL;

	if (privc->emac_cfg & (EMAC_PHY_AR8236 | EMAC_PHY_AR8327)) {
		// handle ar823x switch first
		return ar823x_init(privc->phy_addr);
	} else if (privc->emac_cfg & EMAC_PHY_MV88E6071) {
		return mv88e6071_init(privc);
	}

	if (privc->emac_cfg & EMAC_PHY_NOT_IN_USE) {
		// no PHY - just return OK
		return 0;
	}

	/*
	 * Find a matching phy address on the current bus, or the first unused
	 * by index if scanning for phys
	 */
	for (phy_index = 0; phy_index < PHY_MAX_ADDR; phy_index++) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
		struct phy_device *pdev = mdiobus_get_phy(privc->mii_bus, phy_index); 
#else
		struct phy_device *pdev = privc->mii_bus->phy_map[phy_index];
#endif
		int in_use = 0;
		int i;

		if (!pdev) {
			continue;
		}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
		printk(KERN_INFO DRV_NAME " %s: index %d id 0x%x addr %d\n",
				dev->name, phy_index, pdev->phy_id, pdev->mdio.addr);

		if (phy_found) {
			continue;
		}

		/* check that this phy isn't currently in use */
		for (i = 0; i < ARRAY_SIZE(phydev_addr_inuse); i++) {
			if (port_num != i && phydev_addr_inuse[i] == pdev->mdio.addr) {
				in_use = 1;
			}
		}

		if (!in_use && (privc->phy_addr == pdev->mdio.addr ||
					privc->phy_addr == EMAC_PHY_ADDR_SCAN)) {
			phydev = pdev;
			phydev_addr_inuse[port_num] = pdev->mdio.addr;
			phy_found = 1;
		}
#else
		printk(KERN_INFO DRV_NAME " %s: index %d id 0x%x addr %d\n",
				dev->name, phy_index, pdev->phy_id, pdev->addr);

		if (phy_found) {
			continue;
		}

		/* check that this phy isn't currently in use */
		for (i = 0; i < ARRAY_SIZE(phydev_addr_inuse); i++) {
			if (port_num != i && phydev_addr_inuse[i] == pdev->addr) {
				in_use = 1;
			}
		}

		if (!in_use && (privc->phy_addr == pdev->addr ||
					privc->phy_addr == EMAC_PHY_ADDR_SCAN)) {
			phydev = pdev;
			phydev_addr_inuse[port_num] = pdev->addr;
			phy_found = 1;
		}
#endif
	}

	if (!phydev) {
		printk(KERN_ERR DRV_NAME " %s: no PHY found\n", dev->name);
		return -1;
	}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
	printk(KERN_INFO DRV_NAME " %s: phy_id 0x%x addr %d\n",
			dev->name, phydev->phy_id, phydev->mdio.addr);
#else
	printk(KERN_INFO DRV_NAME " %s: phy_id 0x%x addr %d\n",
			dev->name, phydev->phy_id, phydev->addr);
#endif
	/* now we are supposed to have a proper phydev, to attach to... */
	BUG_ON(phydev->attached_dev);

	/* XXX: Check if this should be done here. Forcing advert of Symm Pause */
	phy_write(phydev, MII_ADVERTISE,
			phy_read(phydev, MII_ADVERTISE) | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM );

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
	phydev = phy_connect(dev, dev_name(&phydev->dev), &emac_lib_adjust_link, 0,
			PHY_INTERFACE_MODE_MII);
#else
	phydev = phy_connect(dev, dev_name(&phydev->mdio.dev), &emac_lib_adjust_link,
			PHY_INTERFACE_MODE_MII);
#endif
	if (IS_ERR(phydev)) {
		printk(KERN_ERR DRV_NAME " %s: Could not attach to PHY\n", dev->name);
		return PTR_ERR(phydev);
	}

	/* mask with MAC supported features */
	phy_supported =	SUPPORTED_Autoneg        |
		SUPPORTED_Pause          |
		SUPPORTED_Asym_Pause     |
		SUPPORTED_MII            |
		SUPPORTED_TP;

	if (privc->emac_cfg & EMAC_PHY_FORCE_10MB) {
		phy_supported |= SUPPORTED_10baseT_Half   |
			SUPPORTED_10baseT_Full;
	} else if (privc->emac_cfg & EMAC_PHY_FORCE_100MB) {
		phy_supported |= SUPPORTED_100baseT_Half   |
			SUPPORTED_100baseT_Full;
	} else if (privc->emac_cfg & EMAC_PHY_FORCE_1000MB) {
		phy_supported |= SUPPORTED_1000baseT_Half   |
			SUPPORTED_1000baseT_Full;
	} else {
		phy_supported |= SUPPORTED_10baseT_Half   |
			SUPPORTED_10baseT_Full   |
			SUPPORTED_100baseT_Half  |
			SUPPORTED_100baseT_Full  |
			SUPPORTED_1000baseT_Half |
			SUPPORTED_1000baseT_Full;
	}

	phydev->supported &= phy_supported;
	phydev->advertising = phydev->supported;
	privc->old_link = 0;
	privc->phy_dev = phydev;

	printk(KERN_INFO DRV_NAME " %s: attached PHY driver [%s] "
			"(mii_bus:phy_addr=%s, irq=%d)\n",
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
			dev->name, phydev->drv->name, phydev->mdio.dev.bus->name, phydev->irq);
#else
			dev->name, phydev->drv->name, phydev->dev.bus->name, phydev->irq);
#endif
	return 0;
}

void emac_lib_phy_start(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);

	if ((privc->emac_cfg & EMAC_PHY_NOT_IN_USE) == 0){
		/* cause the PHY state machine to schedule a link state check */
		privc->old_link = 0;
		phy_stop(privc->phy_dev);
		phy_start(privc->phy_dev);
	} else {
		// This is the case of no phy - need to force link speed
		int speed = 0;
		int duplex = DUPLEX_FULL;

		if (privc->emac_cfg & EMAC_PHY_FORCE_10MB)  {
			speed = SPEED_10;
		} else if (privc->emac_cfg & EMAC_PHY_FORCE_100MB)  {
			speed = SPEED_100;
		} else if (privc->emac_cfg & EMAC_PHY_FORCE_1000MB)  {
			speed = SPEED_1000;
		}
		if (privc->emac_cfg & EMAC_PHY_FORCE_HDX) {
			duplex = 0;
		}
		emac_lib_adjust_speed(dev, speed, duplex);
		printk(KERN_INFO DRV_NAME " %s: force link (%d/%s)\n",
				dev->name, speed,
				duplex == DUPLEX_FULL ? "Full" : "Half");
	}

#ifdef RTL_SWITCH
	if (emac_lib_rtl_switch(privc->emac_cfg)) {
		rtl8367b_ext_port_enable(dev->if_port);
	}
#endif
}
EXPORT_SYMBOL(emac_lib_phy_start);

void emac_lib_phy_stop(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);

#ifdef RTL_SWITCH
	if (emac_lib_rtl_switch(privc->emac_cfg)) {
		rtl8367b_ext_port_disable(dev->if_port);
	}
#endif

	if (privc->phy_dev) {
		phy_stop(privc->phy_dev);
	}
}
EXPORT_SYMBOL(emac_lib_phy_stop);

static void emac_lib_enable_gpio_reset_pin(int pin)
{
	printk(KERN_INFO "%s GPIO pin %d reset sequence\n", DRV_NAME, pin);
	if (gpio_request(pin, DRV_NAME) < 0)
		printk(KERN_ERR "%s: Failed to request GPIO%d for GPIO reset\n",
				DRV_NAME, pin);

	gpio_direction_output(pin, 1);
	udelay(100);
	gpio_set_value(pin, 0);
	mdelay(100);
	gpio_set_value(pin, 1);
	gpio_free(pin);
}

static void emac_lib_enable_gpio_reset(uint32_t cfg)
{
	if (cfg & EMAC_PHY_GPIO1_RESET) {
		emac_lib_enable_gpio_reset_pin(RUBY_GPIO_PIN1);
	}

	if (cfg & EMAC_PHY_GPIO13_RESET) {
		emac_lib_enable_gpio_reset_pin(RUBY_GPIO_PIN13);
	}
}

void emac_lib_enable(uint32_t ext_reset)
{
	uint32_t emac0_cfg = EMAC_NOT_IN_USE;
	uint32_t emac1_cfg = EMAC_NOT_IN_USE;
	uint32_t emac_cfg;
	uint32_t rgmii_timing = CONFIG_ARCH_RGMII_DEFAULT;

	get_board_config(BOARD_CFG_RGMII_TIMING, (int *) &rgmii_timing);

	if (get_board_config(BOARD_CFG_EMAC0, (int *) &emac0_cfg) != 0) {
		printk(KERN_ERR "%s: get_board_config returned error status for EMAC0\n", DRV_NAME);
	}

	if (get_board_config(BOARD_CFG_EMAC1, (int *) &emac1_cfg) != 0) {
		printk(KERN_ERR "%s: get_board_config returned error status for EMAC1\n", DRV_NAME);
	}
	emac_cfg = emac0_cfg | emac1_cfg;

	/* Use GPIO to reset ODM PHY */
	emac_lib_enable_gpio_reset(emac_cfg);

	arasan_initialize_release_reset(emac0_cfg, emac1_cfg, rgmii_timing, ext_reset);
}
EXPORT_SYMBOL(emac_lib_enable);

static struct mii_bus* emac_lib_alloc_mii(struct net_device *dev)
{
	int i;
	struct emac_common *privc = netdev_priv(dev);
	struct mii_bus *mii = NULL;

	/* Alloc bus structure */
	mii = mdiobus_alloc();
	if (!mii) {
		goto mii_alloc_err_out;
	}

	/* Initialize mii structure fields */
	mii->priv = dev;

	/* if we are using ar8236 switch, the mdio ops are special */
	if (privc->emac_cfg & (EMAC_PHY_AR8236 | EMAC_PHY_AR8327)) {
		mii->read = ar823x_mdio_read;
		mii->write = ar823x_mdio_write;
	} else if (privc->emac_cfg & EMAC_PHY_MV88E6071) {
		mii->read = mv88e6071_mdio_read;
		mii->write = mv88e6071_mdio_write;
	} else if (emac_lib_rtl_switch(privc->emac_cfg)) {
#ifdef RTL_SWITCH
		if (rtl8367b_init(mii, &emac_lib_mdio_read,
					&emac_lib_mdio_write,
					privc->emac_cfg, privc->mac_id)) {
			goto board_init_err_out;
		}
#else
		printk(KERN_ERR "rtl switch module not available\n");
		goto board_init_err_out;
#endif
	} else {
		mii->read = emac_lib_mdio_read;
		mii->write = emac_lib_mdio_write;
	}
	mii->name = "emac_eth_mii";
	snprintf(mii->id, MII_BUS_ID_SIZE, "%x", privc->mac_id);

#if 0
	mii->irq is array. Allocation not needed.
	/* Initialize irq field */
	mii->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
	if (!mii->irq) {
		goto irq_alloc_err_out;
	}
#endif

	for(i = 0; i < PHY_MAX_ADDR; ++i) {
		mii->irq[i] = PHY_POLL;
	}

	/* Register bus if we are using PHY */
	if ((privc->emac_cfg & EMAC_PHY_NOT_IN_USE) == 0) {
		if (mdiobus_register(mii)) {
			goto mii_register_err_out;
		}
	}
	return mii;

mii_register_err_out:
	kfree(mii->irq);

/*irq_alloc_err_out:*/
board_init_err_out:
	mdiobus_free(mii);

mii_alloc_err_out:
	return NULL;
}

void emac_lib_mii_exit(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct mii_bus *mii = privc->mii_bus;

	if (mii) {
#ifdef RTL_SWITCH
		if (emac_lib_rtl_switch(privc->emac_cfg)) {
			rtl8367b_exit();
		}
#endif
		if (mii->irq) {
			kfree(mii->irq);
		}
		if ((privc->emac_cfg & EMAC_PHY_NOT_IN_USE) == 0)
			mdiobus_unregister(mii);
		mdiobus_free(mii);
	}

	phydev_addr_inuse[privc->mac_id] = -1;
}
EXPORT_SYMBOL(emac_lib_mii_exit);

int emac_lib_mii_init(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);

	privc->mii_bus = emac_lib_alloc_mii(dev);
	if (!privc->mii_bus) {
		goto err_out;
	}

	if (mii_probe(dev)) {
		goto err_out;
	}

	return 0;

err_out:
	if (privc->mii_bus) {
		emac_lib_mii_exit(dev);
		privc->mii_bus = NULL;
	}
	return -ENODEV;
}
EXPORT_SYMBOL(emac_lib_mii_init);

static int emac_lib_ethtool_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{
	struct emac_common *privc = netdev_priv(dev);

	if (privc->phy_dev) {
		return phy_ethtool_gset(privc->phy_dev, cmd);
	}

	if (privc->emac_cfg & EMAC_PHY_NOT_IN_USE) {
		uint32_t supported = 0;
		uint16_t speed = 0;
		uint8_t duplex;

		memset(cmd, 0, sizeof(*cmd));

		/*
		 * Return forced settings; used by bonding driver etc
		 */
		if (privc->emac_cfg & EMAC_PHY_FORCE_10MB) {
			supported = SUPPORTED_10baseT_Half |
				SUPPORTED_10baseT_Full;
			speed = SPEED_10;
		} else if (privc->emac_cfg & EMAC_PHY_FORCE_100MB) {
			supported |= SUPPORTED_100baseT_Half |
				SUPPORTED_100baseT_Full;
			speed = SPEED_100;
		} else if (privc->emac_cfg & EMAC_PHY_FORCE_1000MB) {
			supported |= SUPPORTED_1000baseT_Half |
				SUPPORTED_1000baseT_Full;
			speed = SPEED_1000;
		}

		if (privc->emac_cfg & EMAC_PHY_FORCE_HDX) {
			duplex = DUPLEX_HALF;
		} else {
			duplex = DUPLEX_FULL;
		}

		cmd->supported = supported;
		cmd->advertising = supported;
		cmd->speed = speed;
		cmd->duplex = duplex;
		cmd->port = PORT_MII;
		cmd->transceiver = XCVR_EXTERNAL;

		return 0;
	}

	return -EINVAL;
}

static int emac_lib_ethtool_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{
	struct emac_common *privc = netdev_priv(dev);

	if (!capable(CAP_NET_ADMIN)) {
		return -EPERM;
	}

	if (privc->phy_dev) {
		return phy_ethtool_sset(privc->phy_dev, cmd);
	}

	return -EINVAL;
}

static void emac_lib_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
{
	struct emac_common *privc = netdev_priv(dev);

	strcpy(info->driver, DRV_NAME);
	strcpy(info->version, DRV_VERSION);
	info->fw_version[0] = '\0';
	sprintf(info->bus_info, "%s %d", DRV_NAME, privc->mac_id);
	info->regdump_len = 0;
}

const struct ethtool_ops emac_lib_ethtool_ops = {
	.get_settings = emac_lib_ethtool_get_settings,
	.set_settings = emac_lib_ethtool_set_settings,
	.get_drvinfo = emac_lib_ethtool_get_drvinfo,
	.get_link = ethtool_op_get_link,
};
EXPORT_SYMBOL(emac_lib_ethtool_ops);


void emac_lib_descs_free(struct net_device *dev)
{
	/*
	 * All Ethernet activity should have ceased before calling
	 * this function
	 */
	struct emac_common *priv = netdev_priv(dev);

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
	dma_free_coherent(NULL, priv->rx.desc_count *
			sizeof(priv->rx.descs[0]), priv->rx.descs,
			priv->rx.descs_dma_addr);
	dma_free_coherent(NULL, priv->tx.desc_count *
			sizeof(priv->tx.descs[0]), priv->tx.descs,
			priv->tx.descs_dma_addr);
#else
	ALIGNED_DMA_DESC_FREE(&priv->rx);
	ALIGNED_DMA_DESC_FREE(&priv->tx);
#endif
}
EXPORT_SYMBOL(emac_lib_descs_free);

int emac_lib_descs_alloc(struct net_device *dev,
		u32 rxdescs, bool rxdescs_sram,
		u32 txdescs, bool txdescs_sram)
{
	struct emac_common *priv = netdev_priv(dev);
	dma_addr_t dma_handle;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
	priv->rx.desc_count = rxdescs;
	priv->rx.descs = dma_alloc_coherent(NULL, rxdescs * sizeof(priv->rx.descs[0]), &dma_handle, GFP_KERNEL);
	if (!priv->rx.descs)
		goto bad;
	if (dma_handle & 7) {
		panic("dma_alloc_coherent returned pointer that is not 8 byte aligned\n");
	}
	priv->rx.descs_dma_addr = dma_handle;
	
	priv->tx.desc_count = txdescs;
	priv->tx.descs = dma_alloc_coherent(NULL, txdescs * sizeof(priv->tx.descs[0]), &dma_handle, GFP_KERNEL);
	if (!priv->tx.descs)
		goto bad;
	if (dma_handle & 7) {
		panic("dma_alloc_coherent returned pointer that is not 8 byte aligned\n");
	}
	priv->tx.descs_dma_addr = dma_handle;
	
#else
	if (ALIGNED_DMA_DESC_ALLOC(&priv->rx, rxdescs, desc_align, rxdescs_sram)) {
		goto bad;
	}

	if (ALIGNED_DMA_DESC_ALLOC(&priv->tx, txdescs, desc_align, txdescs_sram)) {
		goto bad;
	}
#endif

	return 0;
bad:
	emac_lib_descs_free(dev);

	return -ENOMEM;
}
EXPORT_SYMBOL(emac_lib_descs_alloc);

void emac_lib_send_pause(struct net_device *dev, int pause_time)
{
	struct emac_common *privc = netdev_priv(dev);
	uint32_t control;

	emac_wr(privc, EMAC_MAC_FLOW_PAUSE_TIMEVAL, pause_time);
	emac_wr(privc, EMAC_MAC_FLOW_PAUSE_GENERATE, 0);
	control  = emac_rd(privc, EMAC_MAC_FLOW_PAUSE_GENERATE);

	emac_wr(privc, EMAC_MAC_FLOW_PAUSE_GENERATE, 1);
	while (control & 0x1) {
		control  = emac_rd(privc, EMAC_MAC_FLOW_PAUSE_GENERATE);
	}
}
EXPORT_SYMBOL(emac_lib_send_pause);

void emac_lib_init_mac(struct net_device *dev)
{
	/* This routine has the side-effect of stopping MAC RX and TX */
	struct emac_common *privc = netdev_priv(dev);

	/* EMAC_MAC_GLOBAL_CTRL set in response to link negotiation */
	emac_wr(privc, EMAC_MAC_TX_CTRL, MacTxAutoRetry);
	emac_wr(privc, EMAC_MAC_RX_CTRL, MacRxEnable | MacRxStripFCS |
			MacRxStoreAndForward | MacAccountVLANs);
	/* FIXME : These values should change based on required MTU size */
	emac_wr(privc, EMAC_MAC_MAX_FRAME_SIZE, 0xC80);
	emac_wr(privc, EMAC_MAC_TX_JABBER_SIZE, 0xCA0);
	emac_wr(privc, EMAC_MAC_RX_JABBER_SIZE, 0xCA0);
	emac_wr(privc, EMAC_MAC_ADDR1_HIGH, *(u16 *)&dev->dev_addr[0]);
	emac_wr(privc, EMAC_MAC_ADDR1_MED, *(u16 *)&dev->dev_addr[2]);
	emac_wr(privc, EMAC_MAC_ADDR1_LOW, *(u16 *)&dev->dev_addr[4]);
	emac_wr(privc, EMAC_MAC_ADDR_CTRL, MacAddr1Enable);

	emac_wr(privc, EMAC_MAC_TABLE1, 0);
	emac_wr(privc, EMAC_MAC_TABLE2, 0);
	emac_wr(privc, EMAC_MAC_TABLE3, 0);
	emac_wr(privc, EMAC_MAC_TABLE4, 0);
	emac_wr(privc, EMAC_MAC_FLOW_CTRL, MacFlowDecodeEnable |
			MacFlowGenerationEnable | MacAutoFlowGenerationEnable |
			MacFlowMulticastMode | MacBlockPauseFrames);
	emac_wr(privc, EMAC_MAC_FLOW_SA_HIGH, *(u16 *)&dev->dev_addr[0]);
	emac_wr(privc, EMAC_MAC_FLOW_SA_MED, *(u16 *)&dev->dev_addr[2]);
	emac_wr(privc, EMAC_MAC_FLOW_SA_LOW, *(u16 *)&dev->dev_addr[4]);

	/* !!! FIXME - whether or not we need this depends on whether
	 * the auto-pause generation uses it.  The auto function may just
	 * use 0xffff val to stop sending & then 0 to restart it.
	 */
	emac_wr(privc, EMAC_MAC_FLOW_PAUSE_TIMEVAL, 100);

	emac_wr(privc, EMAC_MAC_TX_ALMOST_FULL, 0x1f8);
	emac_wr(privc, EMAC_MAC_TX_START_THRESHOLD, 1518);
	/* EMAC_MAC_RX_START_THRESHOLD ignored in store & forward mode */
	emac_wr(privc, EMAC_MAC_INT, MacUnderrun | MacJabber); /* clear ints */
}
EXPORT_SYMBOL(emac_lib_init_mac);

void emac_lib_init_dma(struct emac_common *privc)
{
	emac_wr(privc, EMAC_DMA_CONFIG, DmaRoundRobin | Dma16WordBurst | Dma64BitMode);
	emac_wr(privc, EMAC_DMA_CTRL, 0);
	emac_wr(privc, EMAC_DMA_STATUS_IRQ, (u32)-1);
	emac_wr(privc, EMAC_DMA_INT_ENABLE, 0);
	emac_wr(privc, EMAC_DMA_TX_AUTO_POLL, 0);
	emac_wr(privc, EMAC_DMA_TX_BASE_ADDR, privc->tx.descs_dma_addr);
	emac_wr(privc, EMAC_DMA_RX_BASE_ADDR, privc->rx.descs_dma_addr);
}
EXPORT_SYMBOL(emac_lib_init_dma);

#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,30)
static inline int netdev_mc_count(const struct net_device *dev)
{
	return dev->mc_count;
}
#endif

static void set_rx_mode_mcfilter(struct net_device *dev, u32 *mc_filter)
{
#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,30)
	int i;
	struct dev_mc_list *mclist;

	for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
			i++, mclist = mclist->next) {
		set_bit(ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26, mc_filter);
	}
#else
	struct netdev_hw_addr *ha;

	netdev_for_each_mc_addr(ha, dev) {
		set_bit(ether_crc(ETH_ALEN, ha->addr) >> 26,
				(unsigned long *)mc_filter);
	}
#endif
}

void emac_lib_set_rx_mode(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);

	if (dev->flags & IFF_PROMISC) {
		emac_setbits(arapc, EMAC_MAC_ADDR_CTRL, MacPromiscuous);
	} else if ((dev->flags & IFF_ALLMULTI)  ||
			netdev_mc_count(dev) > MULTICAST_FILTER_LIMIT) {
		emac_wr(arapc, EMAC_MAC_TABLE1, 0xffff);
		emac_wr(arapc, EMAC_MAC_TABLE2, 0xffff);
		emac_wr(arapc, EMAC_MAC_TABLE3, 0xffff);
		emac_wr(arapc, EMAC_MAC_TABLE4, 0xffff);
		emac_clrbits(arapc, EMAC_MAC_ADDR_CTRL, MacPromiscuous);
		printk(KERN_INFO "%s: Pass all multicast\n", dev->name);
	} else {
		u32 mc_filter[2];	/* Multicast hash filter */
		mc_filter[1] = mc_filter[0] = 0;

		set_rx_mode_mcfilter(dev, mc_filter);

		emac_wr(arapc, EMAC_MAC_TABLE1, mc_filter[0] & 0xffff);
		emac_wr(arapc, EMAC_MAC_TABLE2, mc_filter[0] >> 16);
		emac_wr(arapc, EMAC_MAC_TABLE3, mc_filter[1] & 0xffff);
		emac_wr(arapc, EMAC_MAC_TABLE4, mc_filter[1] >> 16);
		emac_clrbits(arapc, EMAC_MAC_ADDR_CTRL, MacPromiscuous);
	}
}
EXPORT_SYMBOL(emac_lib_set_rx_mode);

static void emac_pm_enter_to_halt(struct phy_device *phy_dev)
{
	if (phy_dev && phy_dev->state != PHY_HALTED) {
		phy_stop(phy_dev);
		genphy_suspend(phy_dev);
		printk(KERN_INFO"emac enter halted state\n");
	}
}

static void emac_pm_return_from_halt(struct phy_device *phy_dev)
{
	if (phy_dev->state == PHY_HALTED) {
		genphy_resume(phy_dev);
		phy_start(phy_dev);
		printk(KERN_INFO "%s: emac resumed from halt\n", DRV_NAME);
	}
	/* Delay of about 50ms between PHY is resume and start auto negotiation */
	mdelay(50);
}

static unsigned long emac_pm_power_save_level = PM_QOS_DEFAULT_VALUE;
static int emac_pm_adjust_level(const int pm_emac_level, struct phy_device *phy_dev)
{
	if (pm_emac_level != BOARD_PM_LEVEL_NO &&
			(phy_dev->state == PHY_HALTED || emac_lib_dual_emac)) {
		return pm_emac_level;
	}

	return emac_pm_power_save_level;
}

static void emac_pm_level(struct emac_common *arapc, int level)
{
	struct phy_device *phy_dev = arapc->phy_dev;

	if (arapc->emac_cfg & (EMAC_PHY_NOT_IN_USE |
				EMAC_PHY_NO_COC |
				EMAC_PHY_AUTO_MASK)) {
		return;
	}

	level = emac_pm_adjust_level(level, phy_dev);

	if (level >= BOARD_PM_LEVEL_SUSPEND) {
		if (phy_dev->state != PHY_HALTED) {
			phy_stop(phy_dev);
			genphy_suspend(phy_dev);
			printk(KERN_INFO "%s: emac halted\n", DRV_NAME);
		}
	} else if (level >= BOARD_PM_LEVEL_IDLE) {
		emac_pm_return_from_halt(phy_dev);

		if (!arapc->pm_adv_mode) {
			const uint32_t adv_10M_H = SUPPORTED_10baseT_Half;
			const uint32_t adv_10M_F = SUPPORTED_10baseT_Full;
			const uint32_t adv_100M_F = SUPPORTED_100baseT_Full;
			const uint32_t adv_100M_H = SUPPORTED_100baseT_Half;
			const uint32_t adv_1G_F = SUPPORTED_1000baseT_Full;
			const uint32_t adv_1G_H = SUPPORTED_1000baseT_Half;
			uint32_t clear_adv = 0;

			if (phy_dev->advertising & (adv_10M_F | adv_10M_H)) {
				clear_adv = adv_10M_H | adv_100M_F | adv_100M_H | adv_1G_F | adv_1G_H;
			} else if (phy_dev->advertising & (adv_100M_F | adv_100M_H)) {
				clear_adv = (adv_1G_H | adv_1G_F);
			}

			if (clear_adv) {
				arapc->pm_adv_mode = 1;
				mutex_lock(&phy_dev->lock);
				phy_dev->advertising &= ~clear_adv;
				phy_dev->state = PHY_QTNPM;
				phy_dev->link = 0;
				mutex_unlock(&phy_dev->lock);
			}

			printk(KERN_INFO "%s: emac slowed down\n", DRV_NAME);
		}
	} else {
		emac_pm_return_from_halt(phy_dev);

		if (arapc->pm_adv_mode) {
			arapc->pm_adv_mode = 0;
			mutex_lock(&phy_dev->lock);
			phy_dev->advertising = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \
				SUPPORTED_100baseT_Half | SUPPORTED_10baseT_Full | \
				SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full;
			phy_dev->state = PHY_QTNPM;
			phy_dev->link = 0;
			mutex_unlock(&phy_dev->lock);

			printk(KERN_INFO "%s: emac resumed from slow down\n", DRV_NAME);
		}
	}
}

static int emac_lib_pm_emac_notify(struct notifier_block *b, unsigned long level, void *v)
{
	struct emac_common *arapc = container_of(b, struct emac_common, pm_notifier);

	emac_pm_level(arapc, level);

	return NOTIFY_OK;
}

void emac_lib_pm_emac_add_notifier(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);

	arapc->pm_notifier.notifier_call = emac_lib_pm_emac_notify;
	pm_qos_add_notifier(PM_QOS_POWER_EMAC, &arapc->pm_notifier);
}
EXPORT_SYMBOL(emac_lib_pm_emac_add_notifier);

void emac_lib_pm_emac_remove_notifier(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);

	pm_qos_remove_notifier(PM_QOS_POWER_EMAC, &arapc->pm_notifier);
}
EXPORT_SYMBOL(emac_lib_pm_emac_remove_notifier);

static int emac_pm_save_notify(struct notifier_block *b, unsigned long level, void *v)
{
	emac_pm_power_save_level = level;
	pm_qos_refresh_notifiers(PM_QOS_POWER_EMAC);

	return NOTIFY_OK;
}

static struct notifier_block pm_save_notifier = {
	.notifier_call = emac_pm_save_notify,
};

void emac_lib_pm_save_add_notifier(void)
{
	pm_qos_add_notifier(PM_QOS_POWER_SAVE, &pm_save_notifier);
}
EXPORT_SYMBOL(emac_lib_pm_save_add_notifier);

void emac_lib_pm_save_remove_notifier(void)
{
	pm_qos_remove_notifier(PM_QOS_POWER_SAVE, &pm_save_notifier);
}
EXPORT_SYMBOL(emac_lib_pm_save_remove_notifier);

void emac_lib_update_link_vars(const uint32_t dual_link)
{
	emac_lib_dual_emac = dual_link;
	pm_qos_refresh_notifiers(PM_QOS_POWER_EMAC);
}
EXPORT_SYMBOL(emac_lib_update_link_vars);

static struct phy_device *phy_power_get_phy(struct net_device *dev)
{
	struct phy_device *phy_dev = NULL;
	struct emac_common *arapc;

	if (!dev) {
		return NULL;
	}

	if (!netif_running(dev)) {
		return NULL;
	}

	arapc = netdev_priv(dev);

	if (arapc) {
		phy_dev = arapc->phy_dev;
	}

	return phy_dev;
}

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)

static int phy_power_write_proc(struct file *file, const char __user *buffer, unsigned long count, void *data)
{
	char cmd[PHY_PW_CMD_MAX_LEN];
	int ret = 0;
	struct phy_device *phy_dev;
	struct net_device *dev = data;

	phy_dev = phy_power_get_phy(dev);

	if (!phy_dev) return -EINVAL;

	if (!count) {
		return -EINVAL;
	} else if (count > (PHY_PW_CMD_MAX_LEN - 1)) {
		return -EINVAL;
	} else if (copy_from_user(cmd, buffer, count)) {
		return -EINVAL;
	}

	cmd[count - 1] = '\0';

	if (strcmp(cmd, "1") == 0) {
		emac_pm_enter_to_halt(phy_dev);
		printk(KERN_INFO "%s: emac halted\n", DRV_NAME);
	} else if (strcmp(cmd, "0") == 0) {
		emac_pm_return_from_halt(phy_dev);
		printk(KERN_INFO "%s: emac resumed\n", DRV_NAME);
	} else {
		ret = -EINVAL;
	}

	return ret ? ret : count;
}

static int phy_power_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data)
{
	struct net_device *dev = data;
	struct phy_device *phy_dev;
	int status;

	phy_dev = phy_power_get_phy(dev);

	if (!phy_dev) return -EINVAL;

	if (phy_dev->state == PHY_HALTED) {
		status = 1;
	} else {
		status = 0;
	}

	return sprintf(page, "%d\n", status);
}

static void phy_power_proc_name(char *buf, struct emac_common *arapc)
{
	sprintf(buf, "%s%d", PHY_PW_PROC_FILE_NAME, arapc->mac_id);
}

int emac_lib_phy_power_create_proc(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12];

	phy_power_proc_name(proc_name, arapc);
	struct proc_dir_entry *entry = create_proc_entry(proc_name, 0600, NULL);
	if (!entry) {
		return -ENOMEM;
	}

	entry->write_proc = phy_power_write_proc;
	entry->read_proc = phy_power_read_proc;
	entry->data = dev;

	return 0;
}
EXPORT_SYMBOL(emac_lib_phy_power_create_proc);

void emac_lib_phy_power_remove_proc(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12];

	phy_power_proc_name(proc_name, arapc);
	remove_proc_entry(proc_name, NULL);
}
EXPORT_SYMBOL(emac_lib_phy_power_remove_proc);

static int phy_reg_rw_proc(struct file *file, const char __user *buffer, unsigned long count, void *data)
{
	char cmd[PHY_PW_CMD_MAX_LEN];
	int ret = 0;
	struct phy_device *phy_dev;
	struct net_device *dev = (struct net_device *)data;
	int phyreg, val;
	char mode;

	phy_dev = phy_power_get_phy(dev);

	if (!phy_dev)
		return -EINVAL;

	if (!count)
		return -EINVAL;
	else if (count > (PHY_PW_CMD_MAX_LEN - 1))
		return -EINVAL;
	else if (copy_from_user(cmd, buffer, count))
		return -EINVAL;

	cmd[count] = '\0';

	sscanf(cmd, "%c %x %x", &mode, &phyreg, &val);

	if (mode == 'r') {
		val =  phy_read(phy_dev, phyreg);
		printk(KERN_ERR"0x%04x\n", val);
	} else if (mode == 'w') {
		ret = phy_write(phy_dev, phyreg, val);
		if (!ret) {
			printk(KERN_ERR"complete\n");
		}
	} else {
		printk(KERN_ERR"usage: echo [r|w] reg [val] > /proc/%s\n", PHY_REG_PROC_FILE_NAME);
	}

	return ret ? ret : count;
}

static void phy_reg_proc_name(char *buf, struct emac_common *arapc)
{
	sprintf(buf, "%s%d", PHY_REG_PROC_FILE_NAME, arapc->mac_id);
}

int emac_lib_phy_reg_create_proc(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12] = {0};

	phy_reg_proc_name(proc_name, arapc);

	struct proc_dir_entry *entry = create_proc_entry(proc_name, 0600, NULL);
	if (!entry) {
		return -ENOMEM;
	}

	entry->write_proc = phy_reg_rw_proc;
	entry->data = dev;

	return 0;
}
EXPORT_SYMBOL(emac_lib_phy_reg_create_proc);
#else
static int phy_power_write_proc(struct file *file, const char __user *buffer, size_t count, loff_t *loff)
{
	char cmd[PHY_PW_CMD_MAX_LEN];
	int ret = 0;
	struct phy_device *phy_dev;
	struct net_device *dev = (struct net_device *)PDE_DATA(file_inode(file));

	phy_dev = phy_power_get_phy(dev);

	if (!phy_dev) return -EINVAL;

	if (!count) {
		return -EINVAL;
	} else if (count > (PHY_PW_CMD_MAX_LEN - 1)) {
		return -EINVAL;
	} else if (copy_from_user(cmd, buffer, count)) {
		return -EINVAL;
	}

	cmd[count - 1] = '\0';

	if (strcmp(cmd, "1") == 0) {
		emac_pm_enter_to_halt(phy_dev);
		printk(KERN_INFO "%s: emac halted\n", DRV_NAME);
	} else if (strcmp(cmd, "0") == 0) {
		emac_pm_return_from_halt(phy_dev);
		printk(KERN_INFO "%s: emac resumed\n", DRV_NAME);
	} else {
		ret = -EINVAL;
	}

	return ret ? ret : count;
}

static int phy_power_read_proc(struct file *file, char __user *buffer, size_t count, loff_t *loff)
{
	struct net_device *dev = (struct net_device *)PDE_DATA(file_inode(file));
	struct phy_device *phy_dev;
	int status;
	char buf_status[2];

	phy_dev = phy_power_get_phy(dev);

	if (!phy_dev) return -EINVAL;

	if (phy_dev->state == PHY_HALTED) {
		status = 1;
	} else {
		status = 0;
	}

	sprintf(buf_status, "%d\n", status);

	copy_to_user(buffer, buf_status, sizeof(buf_status));

	return sizeof(buf_status);
}

struct file_operations phy_power_ops = {
	.owner	= THIS_MODULE,
	.read	= phy_power_read_proc,
	.write	= phy_power_write_proc,
};

static void phy_power_proc_name(char *buf, struct emac_common *arapc)
{
	sprintf(buf, "%s%d", PHY_PW_PROC_FILE_NAME, arapc->mac_id);
}

int emac_lib_phy_power_create_proc(struct net_device *dev)
{
	struct proc_dir_entry *entry;
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12];

	phy_power_proc_name(proc_name, arapc);
	entry = proc_create_data(proc_name, 0600, NULL, &phy_power_ops, dev);
	if (!entry) {
		return -ENOMEM;
	}

	return 0;
}
EXPORT_SYMBOL(emac_lib_phy_power_create_proc);

void emac_lib_phy_power_remove_proc(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12];

	phy_power_proc_name(proc_name, arapc);
	remove_proc_entry(proc_name, NULL);
}
EXPORT_SYMBOL(emac_lib_phy_power_remove_proc);

static int phy_reg_rw_proc(struct file *file, const char __user *buffer, size_t count, loff_t *loff)
{
	char cmd[PHY_PW_CMD_MAX_LEN];
	int ret = 0;
	struct phy_device *phy_dev;
	struct net_device *dev = (struct net_device *)PDE_DATA(file_inode(file));
	int phyreg, val;
	char mode;

	phy_dev = phy_power_get_phy(dev);

	if (!phy_dev)
		return -EINVAL;

	if (!count)
		return -EINVAL;
	else if (count > (PHY_PW_CMD_MAX_LEN - 1))
		return -EINVAL;
	else if (copy_from_user(cmd, buffer, count))
		return -EINVAL;

	cmd[count] = '\0';

	sscanf(cmd, "%c %x %x", &mode, &phyreg, &val);

	if (mode == 'r') {
		val =  phy_read(phy_dev, phyreg);
		printk(KERN_ERR"0x%04x\n", val);
	} else if (mode == 'w') {
		ret = phy_write(phy_dev, phyreg, val);
		if (!ret) {
			printk(KERN_ERR"complete\n");
		}
	} else {
		printk(KERN_ERR"usage: echo [r|w] reg [val] > /proc/%s\n", PHY_REG_PROC_FILE_NAME);
	}

	return ret ? ret : count;
}

struct file_operations phy_reg_ops = {
	.owner	= THIS_MODULE,
	.write	= phy_reg_rw_proc,
};

static void phy_reg_proc_name(char *buf, struct emac_common *arapc)
{
	sprintf(buf, "%s%d", PHY_REG_PROC_FILE_NAME, arapc->mac_id);
}

int emac_lib_phy_reg_create_proc(struct net_device *dev)
{
	struct proc_dir_entry *entry;
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12] = {0};

	phy_reg_proc_name(proc_name, arapc);

	entry = proc_create_data(proc_name, 0600, NULL, &phy_reg_ops, dev);
	if (!entry) {
		return -ENOMEM;
	}

	return 0;
}
EXPORT_SYMBOL(emac_lib_phy_reg_create_proc);
#endif

void emac_lib_phy_reg_remove_proc(struct net_device *dev)
{
	struct emac_common *arapc = netdev_priv(dev);
	char proc_name[12];

	phy_reg_proc_name(proc_name, arapc);
	remove_proc_entry(proc_name, NULL);
}
EXPORT_SYMBOL(emac_lib_phy_reg_remove_proc);

/* The max time (in ms) to wait for statistics counters to return a value */
static const int max_stat_loop_count = 20;

static uint32_t emac_lib_rxstatistics_counter(struct net_device *dev, int counter)
{
	uint32_t val;
	struct emac_common *arapc = netdev_priv(dev);

	if (!arapc || counter < 0 || counter > RxLastStatCounter) {
		return 0;
	}

	if (!(arapc->emac_cfg & EMAC_PHY_NOT_IN_USE) && arapc->phy_dev &&
			(arapc->phy_dev->state == PHY_HALTED)) {
		return 0;
	}

	if (!emac_wait(arapc, EMAC_MAC_RXSTAT_CTRL, RxStatReadBusy, 0, 10 * max_stat_loop_count, __FUNCTION__)) {
		return 0;
	}

	emac_wr(arapc, EMAC_MAC_RXSTAT_CTRL, RxStatReadBusy | counter);

	if (!emac_wait(arapc, EMAC_MAC_RXSTAT_CTRL, RxStatReadBusy, 0, max_stat_loop_count, __FUNCTION__)) {
		return 0;
	}

	val = emac_rd(arapc, EMAC_MAC_RXSTAT_DATA_HIGH) << 16;
	val |= (emac_rd(arapc, EMAC_MAC_RXSTAT_DATA_LOW) & 0xffff);

	return val;
}

static uint32_t emac_lib_txstatistics_counter(struct net_device *dev, int counter)
{
	uint32_t val;
	struct emac_common *arapc = netdev_priv(dev);

	if (!arapc || counter < 0 || counter > TxLastStatCounter) {
		return 0;
	}

	if (!(arapc->emac_cfg & EMAC_PHY_NOT_IN_USE) && arapc->phy_dev &&
			(arapc->phy_dev->state == PHY_HALTED)) {
		return 0;
	}

	if (!emac_wait(arapc, EMAC_MAC_TXSTAT_CTRL, TxStatReadBusy, 0, 10 * max_stat_loop_count, __FUNCTION__)) {
		return 0;
	}

	emac_wr(arapc, EMAC_MAC_TXSTAT_CTRL, TxStatReadBusy | counter);

	if (!emac_wait(arapc, EMAC_MAC_TXSTAT_CTRL, TxStatReadBusy, 0, max_stat_loop_count, __FUNCTION__)) {
		return 0;
	}

	val = emac_rd(arapc, EMAC_MAC_TXSTAT_DATA_HIGH) << 16;
	val |= (emac_rd(arapc, EMAC_MAC_TXSTAT_DATA_LOW) & 0xffff);

	return val;
}

static void emac_lib_stat_read_hw_counters(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct emac_stats *stats = &privc->stats[privc->current_stats];
	int i;

	/*
	 * If privc->emac_cfg has flag EMAC_PHY_NOT_IN_USE/EMAC_PHY_AR8236/EMAC_PHY_AR8327/EMAC_PHY_MV88E6071 set,
	 * the privc->phy_dev will be NULL after initialization, it does not mean that there is no phy device,
	 * still can read Tx/Rx statistics from HW
	 */
	if (privc->phy_dev && privc->phy_dev->state != PHY_RUNNING)
		return;

	for (i = 0; i < ARRAY_SIZE(stats->tx); i++)
		stats->tx[i] = emac_lib_txstatistics_counter(dev, i);
	for (i = 0; i < ARRAY_SIZE(stats->rx); i++)
		stats->rx[i] = emac_lib_rxstatistics_counter(dev, i);
}

static void emac_lib_stat_read_hw_dma(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct emac_stats *stats = &privc->stats[privc->current_stats];

	stats->dma[DmaMissedFrame] += emac_rd(privc, EMAC_DMA_MISSED_FRAMES) & 0x7fffffff;
	stats->dma[DmaStopFlush] += emac_rd(privc, EMAC_DMA_STOP_FLUSHES) & 0x7fffffff;
}

static void emac_lib_stat_read_hw(struct net_device *dev)
{
	emac_lib_stat_read_hw_counters(dev);
	emac_lib_stat_read_hw_dma(dev);
}

static int emac_lib_stats_switch(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct emac_stats *becoming_old_stats = &privc->stats[privc->current_stats];
	struct emac_stats *becoming_new_stats = &privc->stats[!privc->current_stats];
	int i;

	emac_lib_stat_read_hw(dev);
	memset(&dev->stats, 0, sizeof(dev->stats));
	memset(becoming_new_stats, 0, sizeof(*becoming_new_stats));

	/* DMA counters not cumulative, so copy them */
	for (i = 0; i <= DmaLastStatCounter; i++)
		becoming_new_stats->dma[i] = becoming_old_stats->dma[i];

	/* Flip stats structures */
	privc->current_stats = !privc->current_stats;

	return 0;
}

static uint32_t emac_lib_stat_rx(struct emac_common *privc, enum ArasanRxStatisticsCounters stat)
{
	return privc->stats[privc->current_stats].rx[stat] -
		privc->stats[!privc->current_stats].rx[stat];
}

static uint32_t emac_lib_stat_tx(struct emac_common *privc, enum ArasanTxStatisticsCounters stat)
{
	return privc->stats[privc->current_stats].tx[stat] -
		privc->stats[!privc->current_stats].tx[stat];
}

static uint32_t emac_lib_stat_dma(struct emac_common *privc, enum emac_dma_counter stat)
{
	return privc->stats[privc->current_stats].dma[stat] -
		privc->stats[!privc->current_stats].dma[stat];
}

struct net_device_stats *emac_lib_stats(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct net_device_stats *stats = &dev->stats;

	if (!netif_device_present(dev)) {
		return 0;
	}

	emac_lib_stat_read_hw(dev);

	stats->rx_packets = emac_lib_stat_rx(privc, FramesRxTotal);
	stats->tx_packets = emac_lib_stat_tx(privc, FramesSentTotal);
	stats->rx_bytes = emac_lib_stat_rx(privc, OctetsRxTotal);
	stats->tx_bytes = emac_lib_stat_tx(privc, OctetsSentOK);
	stats->rx_errors = emac_lib_stat_rx(privc, FramesRxErrTotal);
	stats->tx_errors = emac_lib_stat_tx(privc, FramesSentError);
	stats->multicast = emac_lib_stat_rx(privc, FramesRxMulticast);
	stats->collisions = emac_lib_stat_tx(privc, FramesSentSingleCol) +
		emac_lib_stat_tx(privc, FramesSentMultipleCol) +
		emac_lib_stat_tx(privc, FramesSentLateCol) +
		emac_lib_stat_tx(privc, FramesSentExcessiveCol);

	stats->rx_length_errors = emac_lib_stat_rx(privc, FramesRxLenErr);
	stats->rx_crc_errors = emac_lib_stat_rx(privc, FramesRxCrcErr);
	stats->rx_frame_errors = emac_lib_stat_rx(privc, FramesRxAlignErr);
	stats->rx_fifo_errors = emac_lib_stat_rx(privc, FramesRxDroppedBufFull) +
		emac_lib_stat_rx(privc, FramesRxTruncatedBufFull);
	stats->rx_missed_errors =  emac_lib_stat_dma(privc, DmaMissedFrame);

	stats->rx_unicast_packets = emac_lib_stat_rx(privc, FramesRxUnicast);
	stats->tx_unicast_packets = emac_lib_stat_tx(privc, FramesSentUnicast);
	stats->tx_multicast_packets = emac_lib_stat_tx(privc, FramesSentMulticast);
	stats->rx_broadcast_packets = emac_lib_stat_rx(privc, FramesRxBroadcast);
	stats->tx_broadcast_packets = emac_lib_stat_tx(privc, FramesSentBroadcast);

	return stats;
}
EXPORT_SYMBOL(emac_lib_stats);

uint32_t qtn_eth_rx_lost_get(struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct emac_stats *stats = &privc->stats[privc->current_stats];

	emac_lib_stat_read_hw_dma(dev);

	return stats->dma[DmaMissedFrame];
}
EXPORT_SYMBOL(qtn_eth_rx_lost_get);

static const char * const tx_stat_names[] = {
	"OK", "Total", "OK", "Err", "SingleClsn", "MultipleClsn",
	"LateClsn", "ExcessiveClsn", "Unicast", "Multicast",
	"Broadcast", "Pause",
};

static const char * tx_stat_name_prefix(enum ArasanTxStatisticsCounters stat)
{
	if (stat == OctetsSentOK)
		return "Octets";
	return "Frames";
}

static const char * const rx_stat_names[] = {
	"OK", "Total", "CrcErr", "AlignErr", "TotalErr", "OK",
	"Total", "Unicast", "Multicast", "Broadcast", "Pause",
	"LenErr", "Undersized", "Oversized", "Frags", "Jabber",
	"Len64", "Len65-127", "Len128-255", "Len256-511", "Len512-1023",
	"Len1024-1518", "LenOver1518", "DroppedBufFull", "TruncBufFull",
};

static const char *rx_stat_name_prefix(enum ArasanRxStatisticsCounters stat)
{
	if (stat == OctetsRxOK || stat == OctetsRxTotal)
		return "Octets";
	return "Frames";
}

static const char * const dma_stat_names[] = {
	"DmaMissedFrame", "DmaStopFlush",
};

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
int emac_lib_stats_sprintf(char *buf, struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct emac_stats *stats = &privc->stats[privc->current_stats];
	char *p = buf;
	int i;

	emac_lib_stat_read_hw(dev);

	for (i = 0; i < ARRAY_SIZE(stats->tx); i++)
		p += sprintf(p, "%2s#%02d %6s%-14s : %10d\n",
				"Tx", i, tx_stat_name_prefix(i), tx_stat_names[i], stats->tx[i]);
	for (i = 0; i < ARRAY_SIZE(stats->rx); i++)
		p += sprintf(p, "%2s#%02d %6s%-14s : %10d\n",
				"Rx", i, rx_stat_name_prefix(i), rx_stat_names[i], stats->rx[i]);
	for (i = 0; i < ARRAY_SIZE(stats->dma); i++)
		p += sprintf(p, "%-14s             : %10d\n",
				dma_stat_names[i], stats->dma[i]);

	return p - buf;
}
#else
int emac_lib_stats_sprintf(struct seq_file *sfile, struct net_device *dev)
{
	struct emac_common *privc = netdev_priv(dev);
	struct emac_stats *stats = &privc->stats[privc->current_stats];
	int i;

	emac_lib_stat_read_hw(dev);

	for (i = 0; i < ARRAY_SIZE(stats->tx); i++)
		seq_printf(sfile, "%2s#%02d %6s%-14s : %10d\n",
				"Tx", i, tx_stat_name_prefix(i), tx_stat_names[i], stats->tx[i]);
	for (i = 0; i < ARRAY_SIZE(stats->rx); i++)
		seq_printf(sfile, "%2s#%02d %6s%-14s : %10d\n",
				"Rx", i, rx_stat_name_prefix(i), rx_stat_names[i], stats->rx[i]);
	for (i = 0; i < ARRAY_SIZE(stats->dma); i++)
		seq_printf(sfile, "%-14s             : %10d\n",
				dma_stat_names[i], stats->dma[i]);

	return 0;
}
#endif
EXPORT_SYMBOL(emac_lib_stats_sprintf);

int emac_lib_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
	struct emac_common *arapc = netdev_priv(dev);

	if (!netif_running(dev)) {
		return -EINVAL;
	}

	if (!arapc->phy_dev) {
		/* PHY not controllable */
		return -EINVAL;
	}

	switch(cmd) {
	case SIOCRDEVSTATS:
		return emac_lib_stats_switch(dev);

	case SIOCGMIIPHY:
	case SIOCGMIIREG:
	case SIOCSMIIREG:
		/* Accept these */
		break;
	default:
		/* Reject the rest */
		return -EOPNOTSUPP;
	}

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
	return phy_mii_ioctl(arapc->phy_dev, if_mii(rq), cmd);
#else
	return phy_mii_ioctl(arapc->phy_dev, rq, cmd);
#endif
}
EXPORT_SYMBOL(emac_lib_ioctl);

#ifdef CONFIG_QVSP
struct qvsp_wrapper emac_qvsp;
EXPORT_SYMBOL(emac_qvsp);

void qvsp_wrapper_init(struct qvsp_ext_s *qvsp, QVSP_CHECK_FUNC_PROTOTYPE(*check_func))
{
	emac_qvsp.qvsp = qvsp;
	emac_qvsp.qvsp_check_func = check_func;
}
EXPORT_SYMBOL(qvsp_wrapper_init);

void qvsp_wrapper_exit(void)
{
	emac_qvsp.qvsp_check_func = NULL;
	emac_qvsp.qvsp = NULL;
}
EXPORT_SYMBOL(qvsp_wrapper_exit);
#endif	// CONFIG_QVSP

#if EMAC_REG_DEBUG
struct emac_reg_debug_s {
	const char *name;
	uint16_t offset;
	uint16_t count;
};

#define EMACR(x)	{ #x, (x), 1 }
#define EMACRR(x, r)	{ #x, (x), r }
const static struct emac_reg_debug_s emac_reg_debug_list[] = {
	EMACR(EMAC_DMA_CONFIG),
	EMACR(EMAC_DMA_CTRL),
	EMACR(EMAC_DMA_STATUS_IRQ),
	EMACR(EMAC_DMA_INT_ENABLE),
	EMACR(EMAC_DMA_TX_AUTO_POLL),
	EMACR(EMAC_DMA_TX_POLL_DEMAND),
	EMACR(EMAC_DMA_RX_POLL_DEMAND),
	EMACR(EMAC_DMA_TX_BASE_ADDR),
	EMACR(EMAC_DMA_RX_BASE_ADDR),
	EMACR(EMAC_DMA_MISSED_FRAMES),
	EMACR(EMAC_DMA_STOP_FLUSHES),
	EMACR(EMAC_DMA_RX_IRQ_MITIGATION),
	EMACR(EMAC_DMA_CUR_TXDESC_PTR),
	EMACR(EMAC_DMA_CUR_TXBUF_PTR),
	EMACR(EMAC_DMA_CUR_RXDESC_PTR),
	EMACR(EMAC_DMA_CUR_RXBUF_PTR),
	EMACR(EMAC_MAC_GLOBAL_CTRL),
	EMACR(EMAC_MAC_TX_CTRL),
	EMACR(EMAC_MAC_RX_CTRL),
	EMACR(EMAC_MAC_MAX_FRAME_SIZE),
	EMACR(EMAC_MAC_TX_JABBER_SIZE),
	EMACR(EMAC_MAC_RX_JABBER_SIZE),
	EMACR(EMAC_MAC_ADDR_CTRL),
	EMACR(EMAC_MAC_ADDR1_HIGH),
	EMACR(EMAC_MAC_ADDR1_MED),
	EMACR(EMAC_MAC_ADDR1_LOW),
	EMACR(EMAC_MAC_ADDR2_HIGH),
	EMACR(EMAC_MAC_ADDR2_MED),
	EMACR(EMAC_MAC_ADDR2_LOW),
	EMACR(EMAC_MAC_ADDR3_HIGH),
	EMACR(EMAC_MAC_ADDR3_MED),
	EMACR(EMAC_MAC_ADDR3_LOW),
	EMACR(EMAC_MAC_ADDR4_HIGH),
	EMACR(EMAC_MAC_ADDR4_MED),
	EMACR(EMAC_MAC_ADDR4_LOW),
	EMACR(EMAC_MAC_TABLE1),
	EMACR(EMAC_MAC_TABLE2),
	EMACR(EMAC_MAC_TABLE3),
	EMACR(EMAC_MAC_TABLE4),
	EMACR(EMAC_MAC_FLOW_CTRL),
	EMACR(EMAC_MAC_FLOW_PAUSE_GENERATE),
	EMACR(EMAC_MAC_FLOW_SA_HIGH),
	EMACR(EMAC_MAC_FLOW_SA_MED),
	EMACR(EMAC_MAC_FLOW_SA_LOW),
	EMACR(EMAC_MAC_FLOW_DA_HIGH),
	EMACR(EMAC_MAC_FLOW_DA_MED),
	EMACR(EMAC_MAC_FLOW_DA_LOW),
	EMACR(EMAC_MAC_FLOW_PAUSE_TIMEVAL),
	EMACR(EMAC_MAC_MDIO_CTRL),
	EMACR(EMAC_MAC_MDIO_DATA),
	EMACR(EMAC_MAC_RXSTAT_CTRL),
	EMACR(EMAC_MAC_RXSTAT_DATA_HIGH),
	EMACR(EMAC_MAC_RXSTAT_DATA_LOW),
	EMACR(EMAC_MAC_TXSTAT_CTRL),
	EMACR(EMAC_MAC_TXSTAT_DATA_HIGH),
	EMACR(EMAC_MAC_TXSTAT_DATA_LOW),
	EMACR(EMAC_MAC_TX_ALMOST_FULL),
	EMACR(EMAC_MAC_TX_START_THRESHOLD),
	EMACR(EMAC_MAC_RX_START_THRESHOLD),
	EMACR(EMAC_MAC_INT),
	EMACR(EMAC_MAC_INT_ENABLE),
	EMACR(TOPAZ_EMAC_WRAP_CTRL),
	EMACR(TOPAZ_EMAC_RXP_CTRL),
	EMACR(TOPAZ_EMAC_TXP_CTRL),
	EMACR(TOPAZ_EMAC_TXP_Q_FULL),
	EMACR(TOPAZ_EMAC_TXP_DESC_PTR),
	EMACR(TOPAZ_EMAC_BUFFER_POOLS),
	EMACR(TOPAZ_EMAC_TXP_STATUS),
	EMACR(TOPAZ_EMAC_DESC_LIMIT),
	EMACR(TOPAZ_EMAC_RXP_PRIO_CTRL),
	EMACR(TOPAZ_EMAC_RXP_OUTPORT_CTRL),
	EMACR(TOPAZ_EMAC_RXP_OUTNODE_CTRL),
	EMACR(TOPAZ_EMAC_RXP_VLAN_PRI_TO_TID),
	EMACR(TOPAZ_EMAC_RXP_VLAN_PRI_CTRL),
	EMACR(TOPAZ_EMAC_RXP_VLAN_TAG_0_1),
	EMACR(TOPAZ_EMAC_RXP_VLAN_TAG_2_3),
	EMACR(TOPAZ_EMAC_RXP_IP_CTRL),
	EMACR(TOPAZ_EMAC_RXP_DPI_CTRL),
	EMACR(TOPAZ_EMAC_RXP_STATUS),
	EMACR(TOPAZ_EMAC_RXP_CST_SEL),
	EMACR(TOPAZ_EMAC_RXP_FRAME_CNT_CLEAR),
	EMACR(TOPAZ_EMAC_FRM_COUNT_ERRORS),
	EMACR(TOPAZ_EMAC_FRM_COUNT_TOTAL),
	EMACR(TOPAZ_EMAC_FRM_COUNT_DA_MATCH),
	EMACR(TOPAZ_EMAC_FRM_COUNT_SA_MATCH),
	EMACRR(TOPAZ_EMAC_RXP_IP_DIFF_SRV_TID_REG(0), 8),
	EMACR(TOPAZ_EMAC_RXP_IP_CTRL),
	EMACRR(TOPAZ_EMAC_RXP_DPI_TID_MAP_REG(0), 8),
	EMACRR(TOPAZ_EMAC_RX_DPI_FIELD_VAL(0), TOPAZ_EMAC_NUM_DPI_FIELDS),
	EMACRR(TOPAZ_EMAC_RX_DPI_FIELD_MASK(0), TOPAZ_EMAC_NUM_DPI_FIELDS),
	EMACRR(TOPAZ_EMAC_RX_DPI_FIELD_CTRL(0), TOPAZ_EMAC_NUM_DPI_FIELDS),
	EMACRR(TOPAZ_EMAC_RX_DPI_FIELD_GROUP(0), TOPAZ_EMAC_NUM_DPI_FILTERS),
	EMACRR(TOPAZ_EMAC_RX_DPI_OUT_CTRL(0), TOPAZ_EMAC_NUM_DPI_FILTERS),
	EMACRR(TOPAZ_EMAC_RX_DPI_IPT_GROUP(0), TOPAZ_EMAC_NUM_DPI_FILTERS),
};

void emac_lib_reg_debug(u32 base) {
	int i;
	int j;
	for (i = 0; i < ARRAY_SIZE(emac_reg_debug_list); i++) {
		u32 regcount = emac_reg_debug_list[i].count;
		for (j = 0; j < regcount; j++) {
			u32 reg = base + emac_reg_debug_list[i].offset + 4 * j;
			u32 val = readl(reg);
			printk("%s: 0x%08x = 0x%08x %s[%d]\n",
					__FUNCTION__, reg, val, emac_reg_debug_list[i].name, j);
		}
	}
}
EXPORT_SYMBOL(emac_lib_reg_debug);
#endif	// EMAC_REG_DEBUG

MODULE_LICENSE("GPL");

