Messages in this thread Patch in this message | | | From | Florian Fainelli <> | Subject | [PATCH net-next 5/5] net: bcmgenet: Interrogate PHY for WAKE_FILTER programming | Date | Wed, 25 Oct 2023 10:33:00 -0700 |
| |
Determine whether the PHY can support waking up from the user programmed network filter, and if it can utilize it.
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>> --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 16 ++++++++++++++++ drivers/net/phy/bcm-phy-lib.c | 12 +++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 9282403d1bf6..9d01c13552eb 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1524,6 +1524,14 @@ static int bcmgenet_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd) struct bcmgenet_priv *priv = netdev_priv(dev); int err = 0; + if (dev->phydev) { + err = phy_ethtool_set_rxnfc(dev->phydev, cmd); + if (err != -EOPNOTSUPP) + return err; + + err = 0; + } + switch (cmd->cmd) { case ETHTOOL_SRXCLSRLINS: err = bcmgenet_insert_flow(dev, cmd); @@ -1579,6 +1587,14 @@ static int bcmgenet_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, int err = 0; int i = 0; + if (dev->phydev) { + err = phy_ethtool_get_rxnfc(dev->phydev, cmd, rule_locs); + if (err != -EOPNOTSUPP) + return err; + + err = 0; + } + switch (cmd->cmd) { case ETHTOOL_GRXRINGS: cmd->data = priv->hw_params->rx_queues ?: 1; diff --git a/drivers/net/phy/bcm-phy-lib.c b/drivers/net/phy/bcm-phy-lib.c index cfbeedc5ee81..569aeab68f97 100644 --- a/drivers/net/phy/bcm-phy-lib.c +++ b/drivers/net/phy/bcm-phy-lib.c @@ -888,6 +888,15 @@ int bcm_phy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) if (wol->wolopts & WAKE_FILTER) goto program_ctl; + /* Enabling options other than WAKE_FILTER nullifies the one and only + * network rule that we support. + */ + if (!(wol->wolopts & WAKE_FILTER)) { + ret = bcm_phy_write_exp(phydev, BCM54XX_WOL_SEC_KEY_8B, 0); + if (ret < 0) + return ret; + } + /* When using WAKE_MAGIC, we program the magic pattern filter to match * the device's MAC address and we accept any MAC DA in the Ethernet * frame. @@ -1175,9 +1184,10 @@ static int bcm_phy_set_rule(struct phy_device *phydev, da = nfc->fs.m_u.ether_spec.h_dest; for (i = 0; i < ETH_ALEN / 2; i++) { + u16 mask = da[i * 2] << 8 | da[i * 2 + 1]; ret = bcm_phy_write_exp(phydev, BCM54XX_WOL_MASK(2 - i), - da[i * 2] << 8 | da[i * 2 + 1]); + ~mask); if (ret < 0) return ret; } -- 2.34.1 [unhandled content-type:application/pkcs7-signature] | |