| From e9122e0a81541001cc44f17a02bbfb19d8e0ded5 Mon Sep 17 00:00:00 2001 |
| From: Timur Tabi <timur@codeaurora.org> |
| Date: Wed, 7 Dec 2016 13:20:51 -0600 |
| Subject: [PATCH 034/299] net: phy: phy drivers should not set |
| SUPPORTED_[Asym_]Pause |
| |
| Instead of having individual PHY drivers set the SUPPORTED_Pause and |
| SUPPORTED_Asym_Pause flags, phylib itself should set those flags, |
| unless there is a hardware erratum or other special case. During |
| autonegotiation, the PHYs will determine whether to enable pause |
| frame support. |
| |
| Pause frames are a feature that is supported by the MAC. It is the MAC |
| that generates the frames and that processes them. The PHY can only be |
| configured to allow them to pass through. |
| |
| This commit also effectively reverts the recently applied c7a61319 |
| ("net: phy: dp83848: Support ethernet pause frames"). |
| |
| So the new process is: |
| |
| 1) Unless the PHY driver overrides it, phylib sets the SUPPORTED_Pause |
| and SUPPORTED_AsymPause bits in phydev->supported. This indicates that |
| the PHY supports pause frames. |
| |
| 2) The MAC driver checks phydev->supported before it calls phy_start(). |
| If (SUPPORTED_Pause | SUPPORTED_AsymPause) is set, then the MAC driver |
| sets those bits in phydev->advertising, if it wants to enable pause |
| frame support. |
| |
| 3) When the link state changes, the MAC driver checks phydev->pause and |
| phydev->asym_pause, If the bits are set, then it enables the corresponding |
| features in the MAC. The algorithm is: |
| |
| if (phydev->pause) |
| The MAC should be programmed to receive and honor |
| pause frames it receives, i.e. enable receive flow control. |
| |
| if (phydev->pause != phydev->asym_pause) |
| The MAC should be programmed to transmit pause |
| frames when needed, i.e. enable transmit flow control. |
| |
| Signed-off-by: Timur Tabi <timur@codeaurora.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| (cherry picked from commit 529ed12752635ba8a35dc78ec70ed6f42570b4ca) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/net/phy/bcm-cygnus.c | 3 +-- |
| drivers/net/phy/bcm7xxx.c | 6 ++---- |
| drivers/net/phy/broadcom.c | 36 ++++++++++++------------------------ |
| drivers/net/phy/icplus.c | 6 ++---- |
| drivers/net/phy/intel-xway.c | 24 ++++++++---------------- |
| drivers/net/phy/micrel.c | 30 ++++++++++++------------------ |
| drivers/net/phy/microchip.c | 3 +-- |
| drivers/net/phy/national.c | 2 +- |
| drivers/net/phy/phy_device.c | 19 +++++++++++++++++++ |
| drivers/net/phy/smsc.c | 18 ++++++------------ |
| 10 files changed, 64 insertions(+), 83 deletions(-) |
| |
| --- a/drivers/net/phy/bcm-cygnus.c |
| +++ b/drivers/net/phy/bcm-cygnus.c |
| @@ -134,8 +134,7 @@ static struct phy_driver bcm_cygnus_phy_ |
| .phy_id = PHY_ID_BCM_CYGNUS, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom Cygnus PHY", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .config_init = bcm_cygnus_config_init, |
| .config_aneg = genphy_config_aneg, |
| .read_status = genphy_read_status, |
| --- a/drivers/net/phy/bcm7xxx.c |
| +++ b/drivers/net/phy/bcm7xxx.c |
| @@ -308,8 +308,7 @@ static int bcm7xxx_suspend(struct phy_de |
| .phy_id = (_oui), \ |
| .phy_id_mask = 0xfffffff0, \ |
| .name = _name, \ |
| - .features = PHY_GBIT_FEATURES | \ |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, \ |
| + .features = PHY_GBIT_FEATURES, \ |
| .flags = PHY_IS_INTERNAL, \ |
| .config_init = bcm7xxx_28nm_config_init, \ |
| .config_aneg = genphy_config_aneg, \ |
| @@ -322,8 +321,7 @@ static int bcm7xxx_suspend(struct phy_de |
| .phy_id = (_oui), \ |
| .phy_id_mask = 0xfffffff0, \ |
| .name = _name, \ |
| - .features = PHY_BASIC_FEATURES | \ |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, \ |
| + .features = PHY_BASIC_FEATURES, \ |
| .flags = PHY_IS_INTERNAL, \ |
| .config_init = bcm7xxx_config_init, \ |
| .config_aneg = genphy_config_aneg, \ |
| --- a/drivers/net/phy/broadcom.c |
| +++ b/drivers/net/phy/broadcom.c |
| @@ -452,8 +452,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5411, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5411", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -464,8 +463,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5421, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5421", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -476,8 +474,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5461, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5461", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -488,8 +485,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM54616S, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM54616S", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -500,8 +496,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5464, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5464", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -512,8 +507,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5481, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5481", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = bcm5481_config_aneg, |
| @@ -524,8 +518,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5482, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5482", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm5482_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -536,8 +529,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM50610, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM50610", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -548,8 +540,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM50610M, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM50610M", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -560,8 +551,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM57780, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM57780", |
| - .features = PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = bcm54xx_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -572,8 +562,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCMAC131, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCMAC131", |
| - .features = PHY_BASIC_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = brcm_fet_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -584,8 +573,7 @@ static struct phy_driver broadcom_driver |
| .phy_id = PHY_ID_BCM5241, |
| .phy_id_mask = 0xfffffff0, |
| .name = "Broadcom BCM5241", |
| - .features = PHY_BASIC_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = brcm_fet_config_init, |
| .config_aneg = genphy_config_aneg, |
| --- a/drivers/net/phy/icplus.c |
| +++ b/drivers/net/phy/icplus.c |
| @@ -225,8 +225,7 @@ static struct phy_driver icplus_driver[] |
| .phy_id = 0x02430d90, |
| .name = "ICPlus IP1001", |
| .phy_id_mask = 0x0ffffff0, |
| - .features = PHY_GBIT_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .config_init = &ip1001_config_init, |
| .config_aneg = &genphy_config_aneg, |
| .read_status = &genphy_read_status, |
| @@ -236,8 +235,7 @@ static struct phy_driver icplus_driver[] |
| .phy_id = 0x02430c54, |
| .name = "ICPlus IP101A/G", |
| .phy_id_mask = 0x0ffffff0, |
| - .features = PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause, |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .ack_interrupt = ip101a_g_ack_interrupt, |
| .config_init = &ip101a_g_config_init, |
| --- a/drivers/net/phy/intel-xway.c |
| +++ b/drivers/net/phy/intel-xway.c |
| @@ -239,8 +239,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY11G_1_3, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.3", |
| - .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = xway_gphy14_config_aneg, |
| @@ -254,8 +253,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY22F_1_3, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY22F (PEF 7061) v1.3", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = xway_gphy14_config_aneg, |
| @@ -269,8 +267,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY11G_1_4, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.4", |
| - .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = xway_gphy14_config_aneg, |
| @@ -284,8 +281,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY22F_1_4, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY22F (PEF 7061) v1.4", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = xway_gphy14_config_aneg, |
| @@ -299,8 +295,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY11G_1_5, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.5 / v1.6", |
| - .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -314,8 +309,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY22F_1_5, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY22F (PEF 7061) v1.5 / v1.6", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -329,8 +323,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY11G_VR9, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY11G (xRX integrated)", |
| - .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -344,8 +337,7 @@ static struct phy_driver xway_gphy[] = { |
| .phy_id = PHY_ID_PHY22F_VR9, |
| .phy_id_mask = 0xffffffff, |
| .name = "Intel XWAY PHY22F (xRX integrated)", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = xway_gphy_config_init, |
| .config_aneg = genphy_config_aneg, |
| --- a/drivers/net/phy/micrel.c |
| +++ b/drivers/net/phy/micrel.c |
| @@ -792,7 +792,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KS8737, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KS8737", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ks8737_type, |
| .config_init = kszphy_config_init, |
| @@ -809,8 +809,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8021, |
| .phy_id_mask = 0x00ffffff, |
| .name = "Micrel KSZ8021 or KSZ8031", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8021_type, |
| .probe = kszphy_probe, |
| @@ -828,8 +827,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8031, |
| .phy_id_mask = 0x00ffffff, |
| .name = "Micrel KSZ8031", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
| - SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8021_type, |
| .probe = kszphy_probe, |
| @@ -847,8 +845,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8041, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KSZ8041", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8041_type, |
| .probe = kszphy_probe, |
| @@ -866,8 +863,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8041RNLI, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KSZ8041RNLI", |
| - .features = PHY_BASIC_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8041_type, |
| .probe = kszphy_probe, |
| @@ -885,8 +881,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8051, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KSZ8051", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8051_type, |
| .probe = kszphy_probe, |
| @@ -904,7 +899,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8001, |
| .name = "Micrel KSZ8001 or KS8721", |
| .phy_id_mask = 0x00fffffc, |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8041_type, |
| .probe = kszphy_probe, |
| @@ -922,7 +917,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8081, |
| .name = "Micrel KSZ8081 or KSZ8091", |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz8081_type, |
| .probe = kszphy_probe, |
| @@ -940,7 +935,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8061, |
| .name = "Micrel KSZ8061", |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = kszphy_config_init, |
| .config_aneg = genphy_config_aneg, |
| @@ -956,7 +951,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ9021, |
| .phy_id_mask = 0x000ffffe, |
| .name = "Micrel KSZ9021 Gigabit PHY", |
| - .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz9021_type, |
| .config_init = ksz9021_config_init, |
| @@ -975,7 +970,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ9031, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KSZ9031 Gigabit PHY", |
| - .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .driver_data = &ksz9021_type, |
| .config_init = ksz9031_config_init, |
| @@ -992,7 +987,6 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ8873MLL, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KSZ8873MLL Switch", |
| - .features = (SUPPORTED_Pause | SUPPORTED_Asym_Pause), |
| .flags = PHY_HAS_MAGICANEG, |
| .config_init = kszphy_config_init, |
| .config_aneg = ksz8873mll_config_aneg, |
| @@ -1006,7 +1000,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id = PHY_ID_KSZ886X, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| .name = "Micrel KSZ886X Switch", |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| .config_init = kszphy_config_init, |
| .config_aneg = genphy_config_aneg, |
| --- a/drivers/net/phy/microchip.c |
| +++ b/drivers/net/phy/microchip.c |
| @@ -112,8 +112,7 @@ static struct phy_driver microchip_phy_d |
| .phy_id_mask = 0xfffffff0, |
| .name = "Microchip LAN88xx", |
| |
| - .features = (PHY_GBIT_FEATURES | |
| - SUPPORTED_Pause | SUPPORTED_Asym_Pause), |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = lan88xx_probe, |
| --- a/drivers/net/phy/national.c |
| +++ b/drivers/net/phy/national.c |
| @@ -133,7 +133,7 @@ static struct phy_driver dp83865_driver[ |
| .phy_id = DP83865_PHY_ID, |
| .phy_id_mask = 0xfffffff0, |
| .name = "NatSemi DP83865", |
| - .features = PHY_GBIT_FEATURES | SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| + .features = PHY_GBIT_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_init = ns_config_init, |
| .config_aneg = genphy_config_aneg, |
| --- a/drivers/net/phy/phy_device.c |
| +++ b/drivers/net/phy/phy_device.c |
| @@ -1699,6 +1699,25 @@ static int phy_probe(struct device *dev) |
| */ |
| of_set_phy_eee_broken(phydev); |
| |
| + /* The Pause Frame bits indicate that the PHY can support passing |
| + * pause frames. During autonegotiation, the PHYs will determine if |
| + * they should allow pause frames to pass. The MAC driver should then |
| + * use that result to determine whether to enable flow control via |
| + * pause frames. |
| + * |
| + * Normally, PHY drivers should not set the Pause bits, and instead |
| + * allow phylib to do that. However, there may be some situations |
| + * (e.g. hardware erratum) where the driver wants to set only one |
| + * of these bits. |
| + */ |
| + if (phydrv->features & (SUPPORTED_Pause | SUPPORTED_Asym_Pause)) { |
| + phydev->supported &= ~(SUPPORTED_Pause | SUPPORTED_Asym_Pause); |
| + phydev->supported |= phydrv->features & |
| + (SUPPORTED_Pause | SUPPORTED_Asym_Pause); |
| + } else { |
| + phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; |
| + } |
| + |
| /* Set the state to READY by default */ |
| phydev->state = PHY_READY; |
| |
| --- a/drivers/net/phy/smsc.c |
| +++ b/drivers/net/phy/smsc.c |
| @@ -168,8 +168,7 @@ static struct phy_driver smsc_phy_driver |
| .phy_id_mask = 0xfffffff0, |
| .name = "SMSC LAN83C185", |
| |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = smsc_phy_probe, |
| @@ -191,8 +190,7 @@ static struct phy_driver smsc_phy_driver |
| .phy_id_mask = 0xfffffff0, |
| .name = "SMSC LAN8187", |
| |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = smsc_phy_probe, |
| @@ -214,8 +212,7 @@ static struct phy_driver smsc_phy_driver |
| .phy_id_mask = 0xfffffff0, |
| .name = "SMSC LAN8700", |
| |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = smsc_phy_probe, |
| @@ -237,8 +234,7 @@ static struct phy_driver smsc_phy_driver |
| .phy_id_mask = 0xfffffff0, |
| .name = "SMSC LAN911x Internal PHY", |
| |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = smsc_phy_probe, |
| @@ -259,8 +255,7 @@ static struct phy_driver smsc_phy_driver |
| .phy_id_mask = 0xfffffff0, |
| .name = "SMSC LAN8710/LAN8720", |
| |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = smsc_phy_probe, |
| @@ -282,8 +277,7 @@ static struct phy_driver smsc_phy_driver |
| .phy_id_mask = 0xfffffff0, |
| .name = "SMSC LAN8740", |
| |
| - .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| - | SUPPORTED_Asym_Pause), |
| + .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, |
| |
| .probe = smsc_phy_probe, |