On Thu, 2016-02-18 at 22:40 +0000, Woojung.Huh@microchip.com wrote:
Add ethtool operations of set_pauseram and get_pauseparm.
[...]
+static void lan78xx_get_pause(struct net_device *net,
+ struct ethtool_pauseparam *pause)
+{
+ struct lan78xx_net *dev = netdev_priv(net);
+ struct phy_device *phydev = net->phydev;
+ struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
+
+ phy_ethtool_gset(phydev, &ecmd);
+
+ pause->autoneg = dev->fc_autoneg;
+
+ if (dev->fc_autoneg) {
+ if (dev->fc_autoneg_control & FLOW_CTRL_TX)
+ pause->tx_pause = 1;
+
+ if (dev->fc_autoneg_control & FLOW_CTRL_RX)
+ pause->rx_pause = 1;
This is incorrect; you should always return the manual settings
(fc_request_control flags) here. If autonegotiation is enabled then
your get_settings function will return the actual pause flags.
Ben.
+ } else {
+ if (dev->fc_request_control & FLOW_CTRL_TX)
+ pause->tx_pause = 1;
+
+ if (dev->fc_request_control & FLOW_CTRL_RX)
+ pause->rx_pause = 1;
+ }
+}
[...]
--
Ben Hutchings
Once a job is fouled up, anything done to improve it makes it worse.