> @@ -5373,6 +5402,30 @@ static int mvpp2_ethtool_set_pause_param(struct > net_device *dev, > struct ethtool_pauseparam *pause) > { > struct mvpp2_port *port = netdev_priv(dev); > + int i; > + > + if (pause->tx_pause && port->priv->global_tx_fc) { > + port->tx_fc = true; > + mvpp2_rxq_enable_fc(port); > + if (port->priv->percpu_pools) { > + for (i = 0; i < port->nrxqs; i++) > + mvpp2_bm_pool_update_fc(port, > &port->priv->bm_pools[i], true); > + } else { > + mvpp2_bm_pool_update_fc(port, port->pool_long, true); > + mvpp2_bm_pool_update_fc(port, port->pool_short, true); > + } > + > + } else if (port->priv->global_tx_fc) { > + port->tx_fc = false; > + mvpp2_rxq_disable_fc(port); > + if (port->priv->percpu_pools) { > + for (i = 0; i < port->nrxqs; i++) > + mvpp2_bm_pool_update_fc(port, > &port->priv->bm_pools[i], false); > + } else { > + mvpp2_bm_pool_update_fc(port, port->pool_long, false); > + mvpp2_bm_pool_update_fc(port, port->pool_short, false); > + } > + }
This looks wrong. Flow control is normally the result of auto negotiation. Both ends need to agree to it. Which is why mvpp2_ethtool_set_pause_param() passes the users request onto phylink. phylink will handle the autoneg and then ask the MAC to setup flow control depending on the result in mvpp2_mac_link_up(). Andrew