static void
unm_nic_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
{
	struct unm_adapter_s *adapter = netdev_priv(netdev);
	uint32_t fw_major = 0;
	uint32_t fw_minor = 0;
	uint32_t fw_build = 0;

	strncpy(drvinfo->driver, unm_nic_driver_name, 32);
	strncpy(drvinfo->version, UNM_NIC_LINUX_VERSIONID, 32);

	read_lock(&adapter->adapter_lock);
	fw_major = NXRD32(adapter, UNM_FW_VERSION_MAJOR);
	fw_minor = NXRD32(adapter, UNM_FW_VERSION_MINOR);
	fw_build = NXRD32(adapter, UNM_FW_VERSION_SUB);
	read_unlock(&adapter->adapter_lock);
	sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build);

	strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
	drvinfo->n_stats = UNM_NIC_STATS_LEN;
	drvinfo->testinfo_len = UNM_NIC_TEST_LEN;
    if (adapter->mdump.has_valid_dump) {
        drvinfo->regdump_len = adapter->mdump.md_dump_size;
    } else {
        drvinfo->regdump_len = UNM_NIC_REGS_LEN;
    }
	drvinfo->eedump_len = unm_nic_get_eeprom_len(netdev);
}
Ejemplo n.º 2
0
static void
netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 mode, *regs_buff = p;
	int i, window;

	memset(p, 0, NETXEN_NIC_REGS_LEN);
	regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) |
	    (adapter->pdev)->device;
	/* which mode */
	regs_buff[0] = NXRD32(adapter, NETXEN_NIU_MODE);
	mode = regs_buff[0];

	/* Common registers to all the modes */
	regs_buff[2] = NXRD32(adapter, NETXEN_NIU_STRAP_VALUE_SAVE_HIGHER);
	/* GB/XGB Mode */
	mode = (mode / 2) - 1;
	window = 0;
	if (mode <= 1) {
		for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) {
			/* GB: port specific registers */
			if (mode == 0 && i >= 19)
				window = adapter->physical_port *
					NETXEN_NIC_PORT_WINDOW;

			regs_buff[i] = NXRD32(adapter,
				niu_registers[mode].reg[i - 3] + window);
		}

	}
}
Ejemplo n.º 3
0
static int
netxen_nic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	u32 wol_cfg = 0;

	if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
		return -EOPNOTSUPP;

	if (wol->wolopts & ~WAKE_MAGIC)
		return -EOPNOTSUPP;

	wol_cfg = NXRD32(adapter, NETXEN_WOL_CONFIG_NV);
	if (!(wol_cfg & (1 << adapter->portnum)))
		return -EOPNOTSUPP;

	wol_cfg = NXRD32(adapter, NETXEN_WOL_CONFIG);
	if (wol->wolopts & WAKE_MAGIC)
		wol_cfg |= 1UL << adapter->portnum;
	else
		wol_cfg &= ~(1UL << adapter->portnum);
	NXWR32(adapter, NETXEN_WOL_CONFIG, wol_cfg);

	return 0;
}
int sw_lock(struct unm_adapter_s *adapter)
{
    int i;
    int done = 0, timeout = 0;

	while (!done) {
		/* acquire semaphore3 from PCI HW block */
		done = NXRD32(adapter, UNM_PCIE_REG(PCIE_SEM6_LOCK));
		if (done == 1)
			break;
		if (timeout >= sw_lock_timeout) {
			return -1;
		}
		timeout++;
		/*
		 * Yield CPU
		 */
		if(!in_atomic())
			schedule();
		else {
			for(i = 0; i < 20; i++)
				cpu_relax();    /*This a nop instr on i386*/
		}
	}
    return 0;
}
Ejemplo n.º 5
0
static int
netxen_api_unlock(struct netxen_adapter *adapter)
{
	/* Release PCIE HW semaphore5 */
	NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM5_UNLOCK));
	return 0;
}
Ejemplo n.º 6
0
static int
netxen_api_lock(struct netxen_adapter *adapter)
{
	u32 done = 0, timeout = 0;

	for (;;) {
		/* Acquire PCIE HW semaphore5 */
		done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM5_LOCK));

		if (done == 1)
			break;

		if (++timeout >= NX_OS_CRB_RETRY_COUNT) {
			printk(KERN_ERR "%s: lock timeout.\n", __func__);
			return -1;
		}

		msleep(1);
	}

#if 0
	NXWR32(adapter,
		NETXEN_API_LOCK_ID, NX_OS_API_LOCK_DRIVER);
#endif
	return 0;
}
Ejemplo n.º 7
0
static int netxen_nic_reg_test(struct net_device *dev)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	u32 data_read, data_written;

	data_read = NXRD32(adapter, NETXEN_PCIX_PH_REG(0));
	if ((data_read & 0xffff) != PHAN_VENDOR_ID)
	return 1;

	data_written = (u32)0xa5a5a5a5;

	NXWR32(adapter, CRB_SCRATCHPAD_TEST, data_written);
	data_read = NXRD32(adapter, CRB_SCRATCHPAD_TEST);
	if (data_written != data_read)
		return 1;

	return 0;
}
Ejemplo n.º 8
0
static void
netxen_nic_get_pauseparam(struct net_device *dev,
			  struct ethtool_pauseparam *pause)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 val;
	int port = adapter->physical_port;

	if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS))
			return;
		/* get flow control settings */
		val = NXRD32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port));
		pause->rx_pause = netxen_gb_get_rx_flowctl(val);
		val = NXRD32(adapter, NETXEN_NIU_GB_PAUSE_CTL);
		switch (port) {
			case 0:
				pause->tx_pause = !(netxen_gb_get_gb0_mask(val));
				break;
			case 1:
				pause->tx_pause = !(netxen_gb_get_gb1_mask(val));
				break;
			case 2:
				pause->tx_pause = !(netxen_gb_get_gb2_mask(val));
				break;
			case 3:
			default:
				pause->tx_pause = !(netxen_gb_get_gb3_mask(val));
				break;
		}
	} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_XG_PORTS))
			return;
		pause->rx_pause = 1;
		val = NXRD32(adapter, NETXEN_NIU_XG_PAUSE_CTL);
		if (port == 0)
			pause->tx_pause = !(netxen_xg_get_xg0_mask(val));
		else
			pause->tx_pause = !(netxen_xg_get_xg1_mask(val));
	} else {
		printk(KERN_ERR"%s: Unknown board type: %x\n",
				netxen_nic_driver_name, adapter->ahw.port_type);
	}
}
Ejemplo n.º 9
0
static void
netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	u32 wol_cfg = 0;

	wol->supported = 0;
	wol->wolopts = 0;

	if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
		return;

	wol_cfg = NXRD32(adapter, NETXEN_WOL_CONFIG_NV);
	if (wol_cfg & (1UL << adapter->portnum))
		wol->supported |= WAKE_MAGIC;

	wol_cfg = NXRD32(adapter, NETXEN_WOL_CONFIG);
	if (wol_cfg & (1UL << adapter->portnum))
		wol->wolopts |= WAKE_MAGIC;
}
static int unm_nic_reg_test(struct net_device *netdev)
{
	struct unm_adapter_s *adapter = netdev_priv(netdev);
	uint32_t data_read, data_written;

	// Read test
	data_read = NXRD32(adapter, UNM_PCIX_PH_REG(0));
	if ((data_read & 0xffff) != PHAN_VENDOR_ID) {
		return 1;
	}
	// write test
	data_written = (uint32_t) 0xa5a5a5a5;

	NXWR32(adapter, CRB_SCRATCHPAD_TEST, data_written);
	data_read = NXRD32(adapter, CRB_SCRATCHPAD_TEST);
	if (data_written != data_read) {
		return 1;
	}

	return 0;
}
Ejemplo n.º 11
0
static void
netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	unsigned long flags;
	u32 fw_major = 0;
	u32 fw_minor = 0;
	u32 fw_build = 0;

	strncpy(drvinfo->driver, netxen_nic_driver_name, 32);
	strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32);
	write_lock_irqsave(&adapter->adapter_lock, flags);
	fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
	fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
	fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
	write_unlock_irqrestore(&adapter->adapter_lock, flags);
	sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build);

	strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
	drvinfo->regdump_len = NETXEN_NIC_REGS_LEN;
	drvinfo->eedump_len = netxen_nic_get_eeprom_len(dev);
}
static u32
netxen_poll_rsp(struct netxen_adapter *adapter)
{
	u32 rsp = NX_CDRP_RSP_OK;
	int	timeout = 0;

	do {
		/* give atleast 1ms for firmware to respond */
		msleep(1);

		if (++timeout > NX_OS_CRB_RETRY_COUNT)
			return NX_CDRP_RSP_TIMEOUT;

		rsp = NXRD32(adapter, NX_CDRP_CRB_OFFSET);
	} while (!NX_CDRP_IS_RSP(rsp));

	return rsp;
}
Ejemplo n.º 13
0
int
nx_fw_cmd_query_phy(struct netxen_adapter *adapter, u32 reg, u32 *val)
{
	u32 rcode;

	rcode = netxen_issue_cmd(adapter,
			adapter->ahw.pci_func,
			NXHAL_VERSION,
			reg,
			0,
			0,
			NX_CDRP_CMD_READ_PHY);

	if (rcode != NX_RCODE_SUCCESS)
		return -EIO;

	return NXRD32(adapter, NX_ARG1_CRB_OFFSET);
}
static u32
netxen_issue_cmd(struct netxen_adapter *adapter,
	u32 pci_fn, u32 version, u32 arg1, u32 arg2, u32 arg3, u32 cmd)
{
	u32 rsp;
	u32 signature = 0;
	u32 rcode = NX_RCODE_SUCCESS;

	signature = NX_CDRP_SIGNATURE_MAKE(pci_fn, version);

	/* Acquire semaphore before accessing CRB */
	if (netxen_api_lock(adapter))
		return NX_RCODE_TIMEOUT;

	NXWR32(adapter, NX_SIGN_CRB_OFFSET, signature);

	NXWR32(adapter, NX_ARG1_CRB_OFFSET, arg1);

	NXWR32(adapter, NX_ARG2_CRB_OFFSET, arg2);

	NXWR32(adapter, NX_ARG3_CRB_OFFSET, arg3);

	NXWR32(adapter, NX_CDRP_CRB_OFFSET, NX_CDRP_FORM_CMD(cmd));

	rsp = netxen_poll_rsp(adapter);

	if (rsp == NX_CDRP_RSP_TIMEOUT) {
		printk(KERN_ERR "%s: card response timeout.\n",
				netxen_nic_driver_name);

		rcode = NX_RCODE_TIMEOUT;
	} else if (rsp == NX_CDRP_RSP_FAIL) {
		rcode = NXRD32(adapter, NX_ARG1_CRB_OFFSET);

		printk(KERN_ERR "%s: failed card response code:0x%x\n",
				netxen_nic_driver_name, rcode);
	}

	/* Release semaphore */
	netxen_api_unlock(adapter);

	return rcode;
}
Ejemplo n.º 15
0
static u32 netxen_nic_test_link(struct net_device *dev)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 status;
	int val;

	/* read which mode */
	if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
		if (adapter->phy_read
		    && adapter->phy_read(adapter,
					 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
					 &status) != 0)
			return -EIO;
		else {
			val = netxen_get_phy_link(status);
			return !val;
		}
	} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		val = NXRD32(adapter, CRB_XG_STATE);
		return (val == XG_LINK_UP) ? 0 : 1;
	}
	return -EIO;
}
Ejemplo n.º 16
0
static int
netxen_nic_set_pauseparam(struct net_device *dev,
			  struct ethtool_pauseparam *pause)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 val;
	int port = adapter->physical_port;
	/* read mode */
	if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS))
			return -EIO;
		/* set flow control */
		val = NXRD32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port));

		if (pause->rx_pause)
			netxen_gb_rx_flowctl(val);
		else
			netxen_gb_unset_rx_flowctl(val);

		NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
				val);
		/* set autoneg */
		val = NXRD32(adapter, NETXEN_NIU_GB_PAUSE_CTL);
		switch (port) {
			case 0:
				if (pause->tx_pause)
					netxen_gb_unset_gb0_mask(val);
				else
					netxen_gb_set_gb0_mask(val);
				break;
			case 1:
				if (pause->tx_pause)
					netxen_gb_unset_gb1_mask(val);
				else
					netxen_gb_set_gb1_mask(val);
				break;
			case 2:
				if (pause->tx_pause)
					netxen_gb_unset_gb2_mask(val);
				else
					netxen_gb_set_gb2_mask(val);
				break;
			case 3:
			default:
				if (pause->tx_pause)
					netxen_gb_unset_gb3_mask(val);
				else
					netxen_gb_set_gb3_mask(val);
				break;
		}
		NXWR32(adapter, NETXEN_NIU_GB_PAUSE_CTL, val);
	} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_XG_PORTS))
			return -EIO;
		val = NXRD32(adapter, NETXEN_NIU_XG_PAUSE_CTL);
		if (port == 0) {
			if (pause->tx_pause)
				netxen_xg_unset_xg0_mask(val);
			else
				netxen_xg_set_xg0_mask(val);
		} else {
			if (pause->tx_pause)
				netxen_xg_unset_xg1_mask(val);
			else
				netxen_xg_set_xg1_mask(val);
		}
		NXWR32(adapter, NETXEN_NIU_XG_PAUSE_CTL, val);
	} else {
		printk(KERN_ERR "%s: Unknown board type: %x\n",
				netxen_nic_driver_name,
				adapter->ahw.port_type);
	}
	return 0;
}
void sw_unlock(struct unm_adapter_s *adapter)
{
    int val;
    /* release semaphore3 */
    val = NXRD32(adapter, UNM_PCIE_REG(PCIE_SEM6_UNLOCK));
}
static int
unm_nic_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
{
	struct unm_adapter_s *adapter = netdev_priv(netdev);
	unm_board_info_t *boardinfo;
	u32 port_mode = 0;
	int linkevent_cap;

	boardinfo = &adapter->ahw.boardcfg;

	linkevent_cap = nx_nic_get_linkevent_cap(adapter) &&
				netif_running(netdev);

	// read which mode
	if (adapter->ahw.board_type == UNM_NIC_GBE) {
		ecmd->supported = ( SUPPORTED_10baseT_Full |
				SUPPORTED_100baseT_Full |
				SUPPORTED_1000baseT_Full);

		ecmd->advertising = ( ADVERTISED_100baseT_Full |
				ADVERTISED_1000baseT_Full);

		ecmd->speed = adapter->link_speed;
		ecmd->duplex = adapter->link_duplex;
		ecmd->autoneg = adapter->link_autoneg;

	} else if (adapter->ahw.board_type == UNM_NIC_XGBE) {
		port_mode = NXRD32(adapter, UNM_PORT_MODE_ADDR);
		if (port_mode == UNM_PORT_MODE_802_3_AP) {
			ecmd->supported = SUPPORTED_1000baseT_Full;
			ecmd->advertising = ADVERTISED_1000baseT_Full;
			ecmd->speed = SPEED_1000;
		} else {
			ecmd->supported = SUPPORTED_10000baseT_Full;
			ecmd->advertising = ADVERTISED_10000baseT_Full;
			ecmd->speed = SPEED_10000;
		}
		ecmd->duplex = DUPLEX_FULL;

		/* if f/w can send async notification,
		 * link_speed is the correct speed 
		 */
		if (linkevent_cap) {

			ecmd->speed = adapter->link_speed;

		} else if((adapter->ahw.revision_id >= NX_P3_B0)) {
			u32 val;

			/* Use the per-function link speed value */
			val = NXRD32(adapter,
			     PF_LINK_SPEED_REG(adapter->ahw.pci_func));

			/* we have per-function link speed */
			ecmd->speed = PF_LINK_SPEED_VAL(adapter->ahw.pci_func, val)
					* PF_LINK_SPEED_MHZ;
		}
	} else {
		printk(KERN_ERR "%s: ERROR: Unsupported board model %d\n",
		       unm_nic_driver_name,
		       (unm_brdtype_t) boardinfo->board_type);
		return -EIO;
	}

	ecmd->phy_address = adapter->portnum;
	ecmd->transceiver = XCVR_EXTERNAL;

	switch ((unm_brdtype_t) boardinfo->board_type) {
	case UNM_BRDTYPE_P3_REF_QG:
	case UNM_BRDTYPE_P3_4_GB:
	case UNM_BRDTYPE_P3_4_GB_MM:
		ecmd->supported |= SUPPORTED_Autoneg;
		ecmd->advertising |= ADVERTISED_Autoneg;
	case UNM_BRDTYPE_P3_10G_CX4:
	case UNM_BRDTYPE_P3_10G_CX4_LP:
	case UNM_BRDTYPE_P3_10000_BASE_T:
		ecmd->supported |= SUPPORTED_TP;
		ecmd->advertising |= ADVERTISED_TP;
		ecmd->port = PORT_TP;
		ecmd->autoneg = adapter->link_autoneg;
		break;
	case UNM_BRDTYPE_P3_XG_LOM:
	case UNM_BRDTYPE_P3_HMEZ:
		ecmd->supported = (SUPPORTED_1000baseT_Full  |
				SUPPORTED_10000baseT_Full |
				SUPPORTED_Autoneg | SUPPORTED_MII);
		ecmd->advertising = (ADVERTISED_1000baseT_Full  |
				ADVERTISED_10000baseT_Full |
				ADVERTISED_Autoneg | ADVERTISED_MII);
		ecmd->port = PORT_MII;
		ecmd->autoneg = AUTONEG_ENABLE;
		break;
	case UNM_BRDTYPE_P3_IMEZ:
		ecmd->supported |= SUPPORTED_MII;
		ecmd->advertising |= ADVERTISED_MII;
		ecmd->port = PORT_MII;
		ecmd->autoneg = AUTONEG_DISABLE;
		break;

	case UNM_BRDTYPE_P3_10G_SFP_PLUS:
	case UNM_BRDTYPE_P3_10G_XFP:
		ecmd->supported |= SUPPORTED_FIBRE;
		ecmd->advertising |= ADVERTISED_FIBRE;

		if (linkevent_cap && adapter->link_module_type == 
					LINKEVENT_MODULE_TWINAX) {
			ecmd->port = PORT_TP;
		} else {
			ecmd->port = PORT_FIBRE;
		}
		ecmd->autoneg = AUTONEG_DISABLE;
		break;

        case UNM_BRDTYPE_P3_10G_TP:
                if (adapter->ahw.board_type == UNM_NIC_XGBE) {
                  ecmd->autoneg = AUTONEG_DISABLE;
                  ecmd->supported |= SUPPORTED_FIBRE;
                  ecmd->advertising |= ADVERTISED_FIBRE;
                  ecmd->port = PORT_FIBRE;
                }else {
                  ecmd->autoneg = AUTONEG_ENABLE;
                  ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg);
                  ecmd->advertising |= (ADVERTISED_TP | ADVERTISED_Autoneg);
                  ecmd->port = PORT_TP;
               }
                  break;

	default:
		printk(KERN_ERR "%s: ERROR: Unsupported board model %d\n",
		       unm_nic_driver_name,
		       (unm_brdtype_t) boardinfo->board_type);
		return -EIO;
		break;
	}

	return 0;
}
Ejemplo n.º 19
0
static int
netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	int check_sfp_module = 0;

	/* read which mode */
	if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
		ecmd->supported = (SUPPORTED_10baseT_Half |
				   SUPPORTED_10baseT_Full |
				   SUPPORTED_100baseT_Half |
				   SUPPORTED_100baseT_Full |
				   SUPPORTED_1000baseT_Half |
				   SUPPORTED_1000baseT_Full);

		ecmd->advertising = (ADVERTISED_100baseT_Half |
				     ADVERTISED_100baseT_Full |
				     ADVERTISED_1000baseT_Half |
				     ADVERTISED_1000baseT_Full);

		ecmd->port = PORT_TP;

		ecmd->speed = adapter->link_speed;
		ecmd->duplex = adapter->link_duplex;
		ecmd->autoneg = adapter->link_autoneg;

	} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		u32 val;

		val = NXRD32(adapter, NETXEN_PORT_MODE_ADDR);
		if (val == NETXEN_PORT_MODE_802_3_AP) {
			ecmd->supported = SUPPORTED_1000baseT_Full;
			ecmd->advertising = ADVERTISED_1000baseT_Full;
		} else {
			ecmd->supported = SUPPORTED_10000baseT_Full;
			ecmd->advertising = ADVERTISED_10000baseT_Full;
		}

		if (netif_running(dev) && adapter->has_link_events) {
			ecmd->speed = adapter->link_speed;
			ecmd->autoneg = adapter->link_autoneg;
			ecmd->duplex = adapter->link_duplex;
			goto skip;
		}

		ecmd->port = PORT_TP;

		if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
			u16 pcifn = adapter->ahw.pci_func;

			val = NXRD32(adapter, P3_LINK_SPEED_REG(pcifn));
			ecmd->speed = P3_LINK_SPEED_MHZ *
					P3_LINK_SPEED_VAL(pcifn, val);
		} else
			ecmd->speed = SPEED_10000;

		ecmd->duplex = DUPLEX_FULL;
		ecmd->autoneg = AUTONEG_DISABLE;
	} else
		return -EIO;

skip:
	ecmd->phy_address = adapter->physical_port;
	ecmd->transceiver = XCVR_EXTERNAL;

	switch (adapter->ahw.board_type) {
	case NETXEN_BRDTYPE_P2_SB35_4G:
	case NETXEN_BRDTYPE_P2_SB31_2G:
	case NETXEN_BRDTYPE_P3_REF_QG:
	case NETXEN_BRDTYPE_P3_4_GB:
	case NETXEN_BRDTYPE_P3_4_GB_MM:

		ecmd->supported |= SUPPORTED_Autoneg;
		ecmd->advertising |= ADVERTISED_Autoneg;
	case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
	case NETXEN_BRDTYPE_P3_10G_CX4:
	case NETXEN_BRDTYPE_P3_10G_CX4_LP:
	case NETXEN_BRDTYPE_P3_10000_BASE_T:
		ecmd->supported |= SUPPORTED_TP;
		ecmd->advertising |= ADVERTISED_TP;
		ecmd->port = PORT_TP;
		ecmd->autoneg = (adapter->ahw.board_type ==
				 NETXEN_BRDTYPE_P2_SB31_10G_CX4) ?
		    (AUTONEG_DISABLE) : (adapter->link_autoneg);
		break;
	case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
	case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
	case NETXEN_BRDTYPE_P3_IMEZ:
	case NETXEN_BRDTYPE_P3_XG_LOM:
	case NETXEN_BRDTYPE_P3_HMEZ:
		ecmd->supported |= SUPPORTED_MII;
		ecmd->advertising |= ADVERTISED_MII;
		ecmd->port = PORT_MII;
		ecmd->autoneg = AUTONEG_DISABLE;
		break;
	case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
	case NETXEN_BRDTYPE_P3_10G_SFP_CT:
	case NETXEN_BRDTYPE_P3_10G_SFP_QT:
		ecmd->advertising |= ADVERTISED_TP;
		ecmd->supported |= SUPPORTED_TP;
		check_sfp_module = netif_running(dev) &&
			adapter->has_link_events;
	case NETXEN_BRDTYPE_P2_SB31_10G:
	case NETXEN_BRDTYPE_P3_10G_XFP:
		ecmd->supported |= SUPPORTED_FIBRE;
		ecmd->advertising |= ADVERTISED_FIBRE;
		ecmd->port = PORT_FIBRE;
		ecmd->autoneg = AUTONEG_DISABLE;
		break;
	case NETXEN_BRDTYPE_P3_10G_TP:
		if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
			ecmd->autoneg = AUTONEG_DISABLE;
			ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
			ecmd->advertising |=
				(ADVERTISED_FIBRE | ADVERTISED_TP);
			ecmd->port = PORT_FIBRE;
			check_sfp_module = netif_running(dev) &&
				adapter->has_link_events;
		} else {
			ecmd->autoneg = AUTONEG_ENABLE;
			ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg);
			ecmd->advertising |=
				(ADVERTISED_TP | ADVERTISED_Autoneg);
			ecmd->port = PORT_TP;
		}
		break;
	default:
		printk(KERN_ERR "netxen-nic: Unsupported board model %d\n",
				adapter->ahw.board_type);
		return -EIO;
	}

	if (check_sfp_module) {
		switch (adapter->module_type) {
		case LINKEVENT_MODULE_OPTICAL_UNKNOWN:
		case LINKEVENT_MODULE_OPTICAL_SRLR:
		case LINKEVENT_MODULE_OPTICAL_LRM:
		case LINKEVENT_MODULE_OPTICAL_SFP_1G:
			ecmd->port = PORT_FIBRE;
			break;
		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE:
		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN:
		case LINKEVENT_MODULE_TWINAX:
			ecmd->port = PORT_TP;
			break;
		default:
			ecmd->port = -1;
		}
	}

	return 0;
}
static void
unm_nic_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p)
{
	struct unm_adapter_s *adapter = netdev_priv(netdev);

	if (adapter->mdump.has_valid_dump) {

		u8 *capture_buff = adapter->mdump.md_capture_buff;
		memset(p, 0, adapter->mdump.md_dump_size);
		regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) |
					adapter->ahw.device_id;
		memcpy(p, capture_buff, adapter->mdump.md_dump_size);

	} else {

		unm_crbword_t mode, *regs_buff = p;

		memset(p, 0, UNM_NIC_REGS_LEN);
		regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) |
			adapter->ahw.device_id;


		/* P3 */
		// which mode
		regs_buff[0] = NXRD32(adapter, UNM_PORT_MODE_ADDR);
		mode = regs_buff[0];

		// Common registers to all the modes
		nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
				crb_pci_to_internal(UNM_NIU_STRAP_VALUE_SAVE_HIGHER),
				0, &regs_buff[2]);
		switch (mode) {

			case UNM_PORT_MODE_XG:
			case UNM_PORT_MODE_AUTO_NEG_XG:{
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_SINGLE_TERM),
													   0, &regs_buff[3]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_DRIVE_HI),
													   0, &regs_buff[4]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_DRIVE_LO),
													   0, &regs_buff[5]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_DTX),
													   0, &regs_buff[6]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_DEQ),
													   0, &regs_buff[7]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_WORD_ALIGN),
													   0, &regs_buff[8]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_RESET),
													   0, &regs_buff[9]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_POWER_DOWN),
													   0, &regs_buff[10]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_RESET_PLL),
													   0, &regs_buff[11]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_SERDES_LOOPBACK),
													   0, &regs_buff[12]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_DO_BYTE_ALIGN),
													   0, &regs_buff[13]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_TX_ENABLE),
													   0, &regs_buff[14]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_RX_ENABLE),
													   0, &regs_buff[15]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_STATUS),
													   0, &regs_buff[16]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XG_PAUSE_THRESHOLD),
													   0, &regs_buff[17]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_CONFIG_0),
													   0, &regs_buff[18]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_CONFIG_1),
													   0, &regs_buff[19]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_IPG),
													   0, &regs_buff[20]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_STATION_ADDR_0_HI),
													   0, &regs_buff[21]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_STATION_ADDR_0_1),
													   0, &regs_buff[22]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_STATION_ADDR_1_LO),
													   0, &regs_buff[23]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_STATUS),
													   0, &regs_buff[24]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_MAX_FRAME_SIZE),
													   0, &regs_buff[25]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_PAUSE_FRAME_VALUE),
													   0, &regs_buff[26]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_TX_BYTE_CNT),
													   0, &regs_buff[27]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_TX_FRAME_CNT),
													   0, &regs_buff[28]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_RX_BYTE_CNT),
													   0, &regs_buff[29]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_RX_FRAME_CNT),
													   0, &regs_buff[30]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_AGGR_ERROR_CNT),
													   0, &regs_buff[31]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_MULTICAST_FRAME_CNT),
													   0, &regs_buff[32]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_UNICAST_FRAME_CNT),
													   0, &regs_buff[33]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_CRC_ERROR_CNT),
													   0, &regs_buff[34]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_OVERSIZE_FRAME_ERR),
													   0, &regs_buff[35]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_UNDERSIZE_FRAME_ERR),
													   0, &regs_buff[36]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_LOCAL_ERROR_CNT),
													   0, &regs_buff[37]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_REMOTE_ERROR_CNT),
													   0, &regs_buff[38]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_CONTROL_CHAR_CNT),
													   0, &regs_buff[39]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_XGE_PAUSE_FRAME_CNT),
													   0, &regs_buff[40]);
											   break;
										   }

			case UNM_PORT_MODE_GB:
			case UNM_PORT_MODE_AUTO_NEG_1G:{
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_SERDES_RESET),
													   0, &regs_buff[3]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB0_MII_MODE),
													   0, &regs_buff[4]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB1_MII_MODE),
													   0, &regs_buff[5]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB2_MII_MODE),
													   0, &regs_buff[6]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB3_MII_MODE),
													   0, &regs_buff[7]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB0_GMII_MODE),
													   0, &regs_buff[8]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB1_GMII_MODE),
													   0, &regs_buff[9]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB2_GMII_MODE),
													   0, &regs_buff[10]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB3_GMII_MODE),
													   0, &regs_buff[11]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_REMOTE_LOOPBACK),
													   0, &regs_buff[12]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB0_HALF_DUPLEX),
													   0, &regs_buff[13]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB1_HALF_DUPLEX),
													   0, &regs_buff[14]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_RESET_SYS_FIFOS),
													   0, &regs_buff[15]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_CRC_DROP),
													   0, &regs_buff[16]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_DROP_WRONGADDR),
													   0, &regs_buff[17]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_TEST_MUX_CTL),
													   0, &regs_buff[18]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MAC_CONFIG_0(0)),
													   0x10000, &regs_buff[19]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MAC_CONFIG_1(0)),
													   0x10000, &regs_buff[20]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_HALF_DUPLEX_CTRL(0)),
													   0x10000, &regs_buff[21]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MAX_FRAME_SIZE(0)),
													   0x10000, &regs_buff[22]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_TEST_REG(0)),
													   0x10000, &regs_buff[23]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MII_MGMT_CONFIG(0)),
													   0x10000, &regs_buff[24]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MII_MGMT_COMMAND(0)),
													   0x10000, &regs_buff[25]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MII_MGMT_ADDR(0)),
													   0x10000, &regs_buff[26]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MII_MGMT_CTRL(0)),
													   0x10000, &regs_buff[27]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MII_MGMT_STATUS(0)),
													   0x10000, &regs_buff[28]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_MII_MGMT_INDICATE(0)),
													   0x10000, &regs_buff[29]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_INTERFACE_CTRL(0)),
													   0x10000, &regs_buff[30]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_INTERFACE_STATUS(0)),
													   0x10000, &regs_buff[31]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_STATION_ADDR_0(0)),
													   0x10000, &regs_buff[32]);
											   nx_fw_cmd_query_hw_reg(adapter, adapter->portnum,
													   crb_pci_to_internal(UNM_NIU_GB_STATION_ADDR_1(0)),
													   0x10000, &regs_buff[33]);
											   break;
										   }

		}
	}
}