Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99f18f1d authored by Philippe Reynes's avatar Philippe Reynes Committed by David S. Miller
Browse files

net: qlogic: netxen: use new api ethtool_{get|set}_link_ksettings



The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: default avatarPhilippe Reynes <tremyfr@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 336f8a71
Loading
Loading
Loading
Loading
+65 −58
Original line number Original line Diff line number Diff line
@@ -96,69 +96,70 @@ netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
}
}


static int
static int
netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
netxen_nic_get_link_ksettings(struct net_device *dev,
			      struct ethtool_link_ksettings *cmd)
{
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	struct netxen_adapter *adapter = netdev_priv(dev);
	int check_sfp_module = 0;
	int check_sfp_module = 0;
	u32 supported, advertising;


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


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


		ecmd->port = PORT_TP;
		cmd->base.port = PORT_TP;


		ethtool_cmd_speed_set(ecmd, adapter->link_speed);
		cmd->base.speed = adapter->link_speed;
		ecmd->duplex = adapter->link_duplex;
		cmd->base.duplex = adapter->link_duplex;
		ecmd->autoneg = adapter->link_autoneg;
		cmd->base.autoneg = adapter->link_autoneg;


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


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


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


		ecmd->port = PORT_TP;
		cmd->base.port = PORT_TP;


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


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


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


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


	switch (adapter->ahw.board_type) {
	switch (adapter->ahw.board_type) {
	case NETXEN_BRDTYPE_P2_SB35_4G:
	case NETXEN_BRDTYPE_P2_SB35_4G:
@@ -167,16 +168,16 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
	case NETXEN_BRDTYPE_P3_4_GB:
	case NETXEN_BRDTYPE_P3_4_GB:
	case NETXEN_BRDTYPE_P3_4_GB_MM:
	case NETXEN_BRDTYPE_P3_4_GB_MM:


		ecmd->supported |= SUPPORTED_Autoneg;
		supported |= SUPPORTED_Autoneg;
		ecmd->advertising |= ADVERTISED_Autoneg;
		advertising |= ADVERTISED_Autoneg;
	case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
	case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
	case NETXEN_BRDTYPE_P3_10G_CX4:
	case NETXEN_BRDTYPE_P3_10G_CX4:
	case NETXEN_BRDTYPE_P3_10G_CX4_LP:
	case NETXEN_BRDTYPE_P3_10G_CX4_LP:
	case NETXEN_BRDTYPE_P3_10000_BASE_T:
	case NETXEN_BRDTYPE_P3_10000_BASE_T:
		ecmd->supported |= SUPPORTED_TP;
		supported |= SUPPORTED_TP;
		ecmd->advertising |= ADVERTISED_TP;
		advertising |= ADVERTISED_TP;
		ecmd->port = PORT_TP;
		cmd->base.port = PORT_TP;
		ecmd->autoneg = (adapter->ahw.board_type ==
		cmd->base.autoneg = (adapter->ahw.board_type ==
				 NETXEN_BRDTYPE_P2_SB31_10G_CX4) ?
				 NETXEN_BRDTYPE_P2_SB31_10G_CX4) ?
		    (AUTONEG_DISABLE) : (adapter->link_autoneg);
		    (AUTONEG_DISABLE) : (adapter->link_autoneg);
		break;
		break;
@@ -185,39 +186,39 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
	case NETXEN_BRDTYPE_P3_IMEZ:
	case NETXEN_BRDTYPE_P3_IMEZ:
	case NETXEN_BRDTYPE_P3_XG_LOM:
	case NETXEN_BRDTYPE_P3_XG_LOM:
	case NETXEN_BRDTYPE_P3_HMEZ:
	case NETXEN_BRDTYPE_P3_HMEZ:
		ecmd->supported |= SUPPORTED_MII;
		supported |= SUPPORTED_MII;
		ecmd->advertising |= ADVERTISED_MII;
		advertising |= ADVERTISED_MII;
		ecmd->port = PORT_MII;
		cmd->base.port = PORT_MII;
		ecmd->autoneg = AUTONEG_DISABLE;
		cmd->base.autoneg = AUTONEG_DISABLE;
		break;
		break;
	case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
	case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
	case NETXEN_BRDTYPE_P3_10G_SFP_CT:
	case NETXEN_BRDTYPE_P3_10G_SFP_CT:
	case NETXEN_BRDTYPE_P3_10G_SFP_QT:
	case NETXEN_BRDTYPE_P3_10G_SFP_QT:
		ecmd->advertising |= ADVERTISED_TP;
		advertising |= ADVERTISED_TP;
		ecmd->supported |= SUPPORTED_TP;
		supported |= SUPPORTED_TP;
		check_sfp_module = netif_running(dev) &&
		check_sfp_module = netif_running(dev) &&
			adapter->has_link_events;
			adapter->has_link_events;
	case NETXEN_BRDTYPE_P2_SB31_10G:
	case NETXEN_BRDTYPE_P2_SB31_10G:
	case NETXEN_BRDTYPE_P3_10G_XFP:
	case NETXEN_BRDTYPE_P3_10G_XFP:
		ecmd->supported |= SUPPORTED_FIBRE;
		supported |= SUPPORTED_FIBRE;
		ecmd->advertising |= ADVERTISED_FIBRE;
		advertising |= ADVERTISED_FIBRE;
		ecmd->port = PORT_FIBRE;
		cmd->base.port = PORT_FIBRE;
		ecmd->autoneg = AUTONEG_DISABLE;
		cmd->base.autoneg = AUTONEG_DISABLE;
		break;
		break;
	case NETXEN_BRDTYPE_P3_10G_TP:
	case NETXEN_BRDTYPE_P3_10G_TP:
		if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
			ecmd->autoneg = AUTONEG_DISABLE;
			cmd->base.autoneg = AUTONEG_DISABLE;
			ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
			supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
			ecmd->advertising |=
			advertising |=
				(ADVERTISED_FIBRE | ADVERTISED_TP);
				(ADVERTISED_FIBRE | ADVERTISED_TP);
			ecmd->port = PORT_FIBRE;
			cmd->base.port = PORT_FIBRE;
			check_sfp_module = netif_running(dev) &&
			check_sfp_module = netif_running(dev) &&
				adapter->has_link_events;
				adapter->has_link_events;
		} else {
		} else {
			ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg);
			supported |= (SUPPORTED_TP | SUPPORTED_Autoneg);
			ecmd->advertising |=
			advertising |=
				(ADVERTISED_TP | ADVERTISED_Autoneg);
				(ADVERTISED_TP | ADVERTISED_Autoneg);
			ecmd->port = PORT_TP;
			cmd->base.port = PORT_TP;
		}
		}
		break;
		break;
	default:
	default:
@@ -232,31 +233,37 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
		case LINKEVENT_MODULE_OPTICAL_SRLR:
		case LINKEVENT_MODULE_OPTICAL_SRLR:
		case LINKEVENT_MODULE_OPTICAL_LRM:
		case LINKEVENT_MODULE_OPTICAL_LRM:
		case LINKEVENT_MODULE_OPTICAL_SFP_1G:
		case LINKEVENT_MODULE_OPTICAL_SFP_1G:
			ecmd->port = PORT_FIBRE;
			cmd->base.port = PORT_FIBRE;
			break;
			break;
		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE:
		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE:
		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN:
		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN:
		case LINKEVENT_MODULE_TWINAX:
		case LINKEVENT_MODULE_TWINAX:
			ecmd->port = PORT_TP;
			cmd->base.port = PORT_TP;
			break;
			break;
		default:
		default:
			ecmd->port = -1;
			cmd->base.port = -1;
		}
		}
	}
	}


	if (!netif_running(dev) || !adapter->ahw.linkup) {
	if (!netif_running(dev) || !adapter->ahw.linkup) {
		ecmd->duplex = DUPLEX_UNKNOWN;
		cmd->base.duplex = DUPLEX_UNKNOWN;
		ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
		cmd->base.speed = SPEED_UNKNOWN;
	}
	}


	ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
						supported);
	ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
						advertising);

	return 0;
	return 0;
}
}


static int
static int
netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
netxen_nic_set_link_ksettings(struct net_device *dev,
			      const struct ethtool_link_ksettings *cmd)
{
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	struct netxen_adapter *adapter = netdev_priv(dev);
	u32 speed = ethtool_cmd_speed(ecmd);
	u32 speed = cmd->base.speed;
	int ret;
	int ret;


	if (adapter->ahw.port_type != NETXEN_NIC_GBE)
	if (adapter->ahw.port_type != NETXEN_NIC_GBE)
@@ -265,16 +272,16 @@ netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
	if (!(adapter->capabilities & NX_FW_CAPABILITY_GBE_LINK_CFG))
	if (!(adapter->capabilities & NX_FW_CAPABILITY_GBE_LINK_CFG))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	ret = nx_fw_cmd_set_gbe_port(adapter, speed, ecmd->duplex,
	ret = nx_fw_cmd_set_gbe_port(adapter, speed, cmd->base.duplex,
				     ecmd->autoneg);
				     cmd->base.autoneg);
	if (ret == NX_RCODE_NOT_SUPPORTED)
	if (ret == NX_RCODE_NOT_SUPPORTED)
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;
	else if (ret)
	else if (ret)
		return -EIO;
		return -EIO;


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


	if (!netif_running(dev))
	if (!netif_running(dev))
		return 0;
		return 0;
@@ -931,8 +938,6 @@ netxen_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
}
}


const struct ethtool_ops netxen_nic_ethtool_ops = {
const struct ethtool_ops netxen_nic_ethtool_ops = {
	.get_settings = netxen_nic_get_settings,
	.set_settings = netxen_nic_set_settings,
	.get_drvinfo = netxen_nic_get_drvinfo,
	.get_drvinfo = netxen_nic_get_drvinfo,
	.get_regs_len = netxen_nic_get_regs_len,
	.get_regs_len = netxen_nic_get_regs_len,
	.get_regs = netxen_nic_get_regs,
	.get_regs = netxen_nic_get_regs,
@@ -954,4 +959,6 @@ const struct ethtool_ops netxen_nic_ethtool_ops = {
	.get_dump_flag = netxen_get_dump_flag,
	.get_dump_flag = netxen_get_dump_flag,
	.get_dump_data = netxen_get_dump_data,
	.get_dump_data = netxen_get_dump_data,
	.set_dump = netxen_set_dump,
	.set_dump = netxen_set_dump,
	.get_link_ksettings = netxen_nic_get_link_ksettings,
	.set_link_ksettings = netxen_nic_set_link_ksettings,
};
};