Message ID | 20230511120808.28646-3-harini.katakam@amd.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Add support for VSC8531_02 PHY and DT RGMII tuning | expand |
Context | Check | Description |
---|---|---|
netdev/series_format | success | Posting correctly formatted |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/fixes_present | success | Fixes tag not required for -next series |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 8 this patch: 8 |
netdev/cc_maintainers | success | CCed 12 of 12 maintainers |
netdev/build_clang | success | Errors and warnings before: 8 this patch: 8 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/deprecated_api | success | None detected |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | No Fixes tag |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 8 this patch: 8 |
netdev/checkpatch | warning | WARNING: line length of 91 exceeds 80 columns |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
On Thu, May 11, 2023 at 05:38:07PM +0530, Harini Katakam wrote: > Add support for optional rx/tx-internal-delay-ps from devicetree. > - When rx/tx-internal-delay-ps is/are specified, these take priority > - When either is absent, > 1) use 2ns for respective settings if rgmii-id/rxid/txid is/are present > 2) use 0.2ns for respective settings if mode is rgmii > > Signed-off-by: Harini Katakam <harini.katakam@amd.com> > --- > v3 - Patch split: > - Use rx/tx-internal-delay-ps with phy_get_internal_delay > - Change RGMII delay selection precedence > - Update commit description and subject everywhere to say RGMII delays > instead of RGMII tuning. > > drivers/net/phy/mscc/mscc.h | 2 ++ > drivers/net/phy/mscc/mscc_main.c | 35 +++++++++++++++++++++++++------- > 2 files changed, 30 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h > index 9acee8759105..ab6c0b7c2136 100644 > --- a/drivers/net/phy/mscc/mscc.h > +++ b/drivers/net/phy/mscc/mscc.h > @@ -374,6 +374,8 @@ struct vsc8531_private { > * package. > */ > unsigned int base_addr; > + u32 rx_delay; > + u32 tx_delay; rx_delay and tx_delay are unsigned... > > #if IS_ENABLED(CONFIG_MACSEC) > /* MACsec fields: > diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c > index 91010524e03d..9e856231e464 100644 > --- a/drivers/net/phy/mscc/mscc_main.c > +++ b/drivers/net/phy/mscc/mscc_main.c > @@ -525,17 +525,14 @@ static int vsc85xx_rgmii_set_skews(struct phy_device *phydev, u32 rgmii_cntl, > { > u16 rgmii_rx_delay_pos = ffs(rgmii_rx_delay_mask) - 1; > u16 rgmii_tx_delay_pos = ffs(rgmii_tx_delay_mask) - 1; > + struct vsc8531_private *vsc8531 = phydev->priv; > u16 reg_val = 0; > int rc; > > mutex_lock(&phydev->lock); > > - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || > - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) > - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_rx_delay_pos; > - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || > - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) > - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_tx_delay_pos; > + reg_val |= vsc8531->rx_delay << rgmii_rx_delay_pos; > + reg_val |= vsc8531->tx_delay << rgmii_tx_delay_pos; > > rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2, > rgmii_cntl, > @@ -1808,10 +1805,34 @@ static irqreturn_t vsc8584_handle_interrupt(struct phy_device *phydev) > return IRQ_HANDLED; > } > > +static const int vsc8531_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300, > + 2600, 3400}; > static int vsc85xx_config_init(struct phy_device *phydev) > { > - int rc, i, phy_id; > + int delay_size = ARRAY_SIZE(vsc8531_internal_delay); > struct vsc8531_private *vsc8531 = phydev->priv; > + struct device *dev = &phydev->mdio.dev; > + int rc, i, phy_id; > + > + vsc8531->rx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0], > + delay_size, true); But phy_get_internal_delay a signed value. > + if (vsc8531->rx_delay < 0) { This comparison can never be true due to the unsigned type of rx_delay. > + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || > + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) > + vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS; > + else > + vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS; > + } > + > + vsc8531->tx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0], > + delay_size, false); > + if (vsc8531->tx_delay < 0) { Here too. > + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || > + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) > + vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS; > + else > + vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS; > + } > > rc = vsc85xx_default_config(phydev); > if (rc) --- pw-bot: cr
Hi Harini, kernel test robot noticed the following build warnings: [auto build test WARNING on net-next/main] url: https://github.com/intel-lab-lkp/linux/commits/Harini-Katakam/phy-mscc-Use-PHY_ID_MATCH_VENDOR-to-minimize-PHY-ID-table/20230511-200935 base: net-next/main patch link: https://lore.kernel.org/r/20230511120808.28646-3-harini.katakam%40amd.com patch subject: [PATCH net-next v3 2/3] phy: mscc: Add support for RGMII delay configuration config: openrisc-randconfig-m041-20230509 (https://download.01.org/0day-ci/archive/20230514/202305140248.lh4LUw2j-lkp@intel.com/config) compiler: or1k-linux-gcc (GCC) 12.1.0 If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202305140248.lh4LUw2j-lkp@intel.com/ smatch warnings: drivers/net/phy/mscc/mscc_main.c:1819 vsc85xx_config_init() warn: unsigned 'vsc8531->rx_delay' is never less than zero. drivers/net/phy/mscc/mscc_main.c:1829 vsc85xx_config_init() warn: unsigned 'vsc8531->tx_delay' is never less than zero. vim +1819 drivers/net/phy/mscc/mscc_main.c 1807 1808 static const int vsc8531_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300, 1809 2600, 3400}; 1810 static int vsc85xx_config_init(struct phy_device *phydev) 1811 { 1812 int delay_size = ARRAY_SIZE(vsc8531_internal_delay); 1813 struct vsc8531_private *vsc8531 = phydev->priv; 1814 struct device *dev = &phydev->mdio.dev; 1815 int rc, i, phy_id; 1816 1817 vsc8531->rx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0], 1818 delay_size, true); > 1819 if (vsc8531->rx_delay < 0) { 1820 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || 1821 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 1822 vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS; 1823 else 1824 vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS; 1825 } 1826 1827 vsc8531->tx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0], 1828 delay_size, false); > 1829 if (vsc8531->tx_delay < 0) { 1830 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || 1831 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 1832 vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS; 1833 else 1834 vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS; 1835 } 1836 1837 rc = vsc85xx_default_config(phydev); 1838 if (rc) 1839 return rc; 1840 1841 rc = vsc85xx_mac_if_set(phydev, phydev->interface); 1842 if (rc) 1843 return rc; 1844 1845 rc = vsc85xx_edge_rate_cntl_set(phydev, vsc8531->rate_magic); 1846 if (rc) 1847 return rc; 1848 1849 phy_id = phydev->drv->phy_id & phydev->drv->phy_id_mask; 1850 if (PHY_ID_VSC8531 == phy_id || PHY_ID_VSC8541 == phy_id || 1851 PHY_ID_VSC8530 == phy_id || PHY_ID_VSC8540 == phy_id) { 1852 rc = vsc8531_pre_init_seq_set(phydev); 1853 if (rc) 1854 return rc; 1855 } 1856 1857 rc = vsc85xx_eee_init_seq_set(phydev); 1858 if (rc) 1859 return rc; 1860 1861 for (i = 0; i < vsc8531->nleds; i++) { 1862 rc = vsc85xx_led_cntl_set(phydev, i, vsc8531->leds_mode[i]); 1863 if (rc) 1864 return rc; 1865 } 1866 1867 return 0; 1868 } 1869
diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h index 9acee8759105..ab6c0b7c2136 100644 --- a/drivers/net/phy/mscc/mscc.h +++ b/drivers/net/phy/mscc/mscc.h @@ -374,6 +374,8 @@ struct vsc8531_private { * package. */ unsigned int base_addr; + u32 rx_delay; + u32 tx_delay; #if IS_ENABLED(CONFIG_MACSEC) /* MACsec fields: diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c index 91010524e03d..9e856231e464 100644 --- a/drivers/net/phy/mscc/mscc_main.c +++ b/drivers/net/phy/mscc/mscc_main.c @@ -525,17 +525,14 @@ static int vsc85xx_rgmii_set_skews(struct phy_device *phydev, u32 rgmii_cntl, { u16 rgmii_rx_delay_pos = ffs(rgmii_rx_delay_mask) - 1; u16 rgmii_tx_delay_pos = ffs(rgmii_tx_delay_mask) - 1; + struct vsc8531_private *vsc8531 = phydev->priv; u16 reg_val = 0; int rc; mutex_lock(&phydev->lock); - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_rx_delay_pos; - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_tx_delay_pos; + reg_val |= vsc8531->rx_delay << rgmii_rx_delay_pos; + reg_val |= vsc8531->tx_delay << rgmii_tx_delay_pos; rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2, rgmii_cntl, @@ -1808,10 +1805,34 @@ static irqreturn_t vsc8584_handle_interrupt(struct phy_device *phydev) return IRQ_HANDLED; } +static const int vsc8531_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300, + 2600, 3400}; static int vsc85xx_config_init(struct phy_device *phydev) { - int rc, i, phy_id; + int delay_size = ARRAY_SIZE(vsc8531_internal_delay); struct vsc8531_private *vsc8531 = phydev->priv; + struct device *dev = &phydev->mdio.dev; + int rc, i, phy_id; + + vsc8531->rx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0], + delay_size, true); + if (vsc8531->rx_delay < 0) { + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) + vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS; + else + vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS; + } + + vsc8531->tx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0], + delay_size, false); + if (vsc8531->tx_delay < 0) { + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) + vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS; + else + vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS; + } rc = vsc85xx_default_config(phydev); if (rc)
Add support for optional rx/tx-internal-delay-ps from devicetree. - When rx/tx-internal-delay-ps is/are specified, these take priority - When either is absent, 1) use 2ns for respective settings if rgmii-id/rxid/txid is/are present 2) use 0.2ns for respective settings if mode is rgmii Signed-off-by: Harini Katakam <harini.katakam@amd.com> --- v3 - Patch split: - Use rx/tx-internal-delay-ps with phy_get_internal_delay - Change RGMII delay selection precedence - Update commit description and subject everywhere to say RGMII delays instead of RGMII tuning. drivers/net/phy/mscc/mscc.h | 2 ++ drivers/net/phy/mscc/mscc_main.c | 35 +++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-)