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

Commit 0dffc83e authored by Ajit Khaparde's avatar Ajit Khaparde Committed by David S. Miller
Browse files

be2net: fix unnecessary access to hardware to get link, port info



Every time while doing ethtool->get_settings we are accessing
the hardware to get link status and port information.
This is not necessary.  We now use the cached copy for this info
and update it when the link status changes.

From: Suresh R <sureshr@serverengines.com>

Signed-off-by: default avatarAjit Khaparde <ajitk@serverengines.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b7b83ac3
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -272,6 +272,8 @@ struct be_adapter {
	u32 cap;
	u32 rx_fc;		/* Rx flow control */
	u32 tx_fc;		/* Tx flow control */
	int link_speed;
	u8 port_type;
};

extern const struct ethtool_ops be_ethtool_ops;
+33 −21
Original line number Diff line number Diff line
@@ -297,8 +297,11 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
	u8 mac_speed = 0, connector = 0;
	u16 link_speed = 0;
	bool link_up = false;
	int status;

	be_cmd_link_status_query(adapter, &link_up, &mac_speed, &link_speed);
	if (adapter->link_speed < 0) {
		status = be_cmd_link_status_query(adapter, &link_up,
						&mac_speed, &link_speed);

		/* link_speed is in units of 10 Mbps */
		if (link_speed) {
@@ -313,11 +316,9 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
				break;
			}
		}
	ecmd->duplex = DUPLEX_FULL;
	ecmd->autoneg = AUTONEG_DISABLE;
	ecmd->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_TP);

	be_cmd_read_port_type(adapter, adapter->port_num, &connector);
		status = be_cmd_read_port_type(adapter, adapter->port_num,
						&connector);
		switch (connector) {
		case 7:
			ecmd->port = PORT_FIBRE;
@@ -327,6 +328,17 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
			break;
		}

		/* Save for future use */
		adapter->link_speed = ecmd->speed;
		adapter->port_type = ecmd->port;
	} else {
		ecmd->speed = adapter->link_speed;
		ecmd->port = adapter->port_type;
	}

	ecmd->duplex = DUPLEX_FULL;
	ecmd->autoneg = AUTONEG_DISABLE;
	ecmd->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_TP);
	ecmd->phy_address = adapter->port_num;
	ecmd->transceiver = XCVR_INTERNAL;

+3 −0
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ void be_link_status_update(struct be_adapter *adapter, bool link_up)

	/* If link came up or went down */
	if (adapter->link_up != link_up) {
		adapter->link_speed = -1;
		if (link_up) {
			netif_start_queue(netdev);
			netif_carrier_on(netdev);
@@ -1674,6 +1675,8 @@ static int be_setup(struct be_adapter *adapter)
	if (status != 0)
		goto rx_qs_destroy;

	adapter->link_speed = -1;

	return 0;

rx_qs_destroy: