$subject should begin with "net: macb: " Parshuram,
Sorry but NACK on the series. David, This patch series seem pretty intrusive, so I would like that you wait for my explicit ACK before applying even next versions of it. More comments below... On 25/02/2019 at 18:21, Florian Fainelli wrote: > On 2/25/19 1:11 AM, Parshuram Raju Thombare wrote: >>> Le 2/22/19 à 12:12 PM, Parshuram Thombare a écrit : >>>> This patch add support for PCS (for SGMII interface) and 2.5Gbps MAC >>>> in Cadence ethernet controller driver. >>> >>> At a high level you don't seem to be making use of PHYLINK so which 2.5Gbps >>> interfaces do you actually support? >>> >> >> New ethernet controller have MAC which support 2.5G speed. >> Also there is addition of PCS and SGMII interface. > > I should have asked this more clearly: have you tested with SFP modules > for instance? If you want to be able to reliably support 2500baseT > and/or 2500baseX with hot plugging of such modules, you need to > implement PHYLINK for that network driver, there is no other way around. > >> >>>> >>>> Signed-off-by: Parshuram Thombare <pthom...@cadence.com> >>>> --- >>> [..] >>>> >>>> - switch (speed) { >>>> - case SPEED_10: >>>> + if (interface == PHY_INTERFACE_MODE_GMII || >>>> + interface == PHY_INTERFACE_MODE_MII) { >>>> + switch (speed) { >>>> + case SPEED_10:> rate = 2500000; >>> >>> You need to add one tab to align rate and break. >> >> Do you mean a tab each for rate and break lines ? >> All switch statements are aligned at a tab. I am not sure how does case and >> rate got on same line. > > It should look like this: > > switch (cond) { > case cond1: > do_something(); > break; > > etc. Read the coding style documentation, everything is well explained there. >>>> break; >>>> - case SPEED_100: >>>> + case SPEED_100: >>>> rate = 25000000; >>>> break; >>>> - case SPEED_1000: >>>> + case SPEED_1000: >>>> rate = 125000000; >>>> break; >>>> - default: >>>> + default: >>>> + return; >>>> + } >>>> + } else if (interface == PHY_INTERFACE_MODE_SGMII) { >>>> + switch (speed) { >>>> + case SPEED_10: >>>> + rate = 1250000; >>>> + break; >>>> + case SPEED_100: >>>> + rate = 12500000; >>>> + break; >>>> + case SPEED_1000: >>>> + rate = 125000000; >>>> + break; >>>> + case SPEED_2500: >>>> + rate = 312500000; >>>> + break; >>>> + default: >>>> + return; >>> >>> The indentation is broken here and you can greatly simplify this with a >>> simple >>> function that returns speed * 1250 and does an initial check for unsupported >>> speeds. >>> >> >> I ran checkpatch.pl and all indentation issues were cleared. But I think >> having function >> is better option, I will make that change. >> >>>> + } >>>> + } else { >>>> return; >>>> } [..] >>>> int macb_mii_probe(struct net_device *dev) >>>> } >>>> >>>> /* mask with MAC supported features */ >>>> - if (macb_is_gem(bp) && bp->caps & >>> MACB_CAPS_GIGABIT_MODE_AVAILABLE) >>>> - phy_set_max_speed(phydev, SPEED_1000); >>>> - else >>>> - phy_set_max_speed(phydev, SPEED_100); >>>> + if (macb_is_gem(bp)) { >>> >>> You have changed the previous logic that also checked for >>> MACB_CAPS_GIGABIT_MODE_AVAILABLE, why? >> >> My understanding is all GEM (ID >= 0x2) support GIGABIT mode. >> Was there any other reason for this check ? We use (ID >= 0x2) and only 10/100 mode on sama5d4/sama5d2 for more than 5 years, as seen in their respective struct macb_config, weren't you aware? > Well, if anyone would know, it would be you, I don't work for Cadence > nor have access to the internal IP documentation. I agree with Florian, and what you modify makes me feel that the rest of the patch might break my use of the Cadence IP in my products. That's not a good sign, to say the least. I'm expecting that Cadence don't break software used by their customers on products already deployed on the field. For next series, I would like that you report that you actually tested your changes on older IP revisions and that non-regression tests are passed successfully for some of the long time users of this IP (namely Microchip/Atmel and Xilinx products). >>>> + linkmode_copy(phydev->supported, PHY_GBIT_FEATURES); >>>> + if (bp->caps & MACB_CAPS_TWO_PT_FIVE_GIG_SPEED) >>>> + >>> linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, >>>> + phydev->supported); >>>> + } else { >>>> + linkmode_copy(phydev->supported, PHY_BASIC_FEATURES); >>>> + } >>>> + >>>> + linkmode_copy(phydev->advertising, phydev->supported); >>>> >>>> if (bp->caps & MACB_CAPS_NO_GIGABIT_HALF) >>>> phy_remove_link_mode(phydev, >>>> @@ -2217,8 +2267,6 @@ static void macb_init_hw(struct macb *bp) >>>> macb_set_hwaddr(bp); >>>> >>>> config = macb_mdc_clk_div(bp); >>>> - if (bp->phy_interface == PHY_INTERFACE_MODE_SGMII) >>>> - config |= GEM_BIT(SGMIIEN) | GEM_BIT(PCSSEL); >>>> config |= MACB_BF(RBOF, NET_IP_ALIGN); /* Make eth data >>> aligned */ >>>> config |= MACB_BIT(PAE); /* PAuse Enable */ >>>> config |= MACB_BIT(DRFCS); /* Discard Rx FCS */ >>>> @@ -3255,6 +3303,23 @@ static void macb_configure_caps(struct macb *bp, >>>> dcfg = gem_readl(bp, DCFG1); >>>> if (GEM_BFEXT(IRQCOR, dcfg) == 0) >>>> bp->caps |= MACB_CAPS_ISR_CLEAR_ON_WRITE; >>>> + if (GEM_BFEXT(NO_PCS, dcfg) == 0) >>>> + bp->caps |= MACB_CAPS_PCS; >>>> + switch (MACB_BFEXT(IDNUM, macb_readl(bp, MID))) { >>>> + case MACB_GEM7016_IDNUM: >>>> + case MACB_GEM7017_IDNUM: >>>> + case MACB_GEM7017A_IDNUM: >>>> + case MACB_GEM7020_IDNUM: >>>> + case MACB_GEM7021_IDNUM: >>>> + case MACB_GEM7021A_IDNUM: >>>> + case MACB_GEM7022_IDNUM: >>>> + if (bp->caps & MACB_CAPS_PCS) >>>> + bp->caps |= MACB_CAPS_TWO_PT_FIVE_GIG_SPEED; >>>> + break; >>>> + >>>> + default: >>>> + break; >>>> + } >>>> dcfg = gem_readl(bp, DCFG2); >>>> if ((dcfg & (GEM_BIT(RX_PKT_BUFF) | GEM_BIT(TX_PKT_BUFF))) >>> == 0) >>>> bp->caps |= MACB_CAPS_FIFO_MODE; >>>> @@ -4110,7 +4175,28 @@ static int macb_probe(struct platform_device >>> *pdev) >>>> else >>>> bp->phy_interface = PHY_INTERFACE_MODE_MII; >>>> } else { >>>> + switch (err) { >>>> + case PHY_INTERFACE_MODE_SGMII: >>>> + if (bp->caps & MACB_CAPS_PCS) { >>>> + bp->phy_interface = PHY_INTERFACE_MODE_SGMII; >>>> + break; >>>> + } >>> >>> If SGMII was selected on a version of the IP that does not support it, then >>> falling >>> back to GMII or MII does not sound correct, this is a hard error that must >>> be >>> handled as such. >>> -- >>> Florian >> >> My intention was to continue (instead of failing) with whatever >> functionality is available. >> Can we have some error message and continue with what is available ? > > This is probably not going to help anyone, imagine you incorrectly > specified a 'phy-mode' property in the Device Tree and you have to dig > into the driver in the function that sets the clock rate to find out > what you just defaulted to 1Gbits/GMII for instance. This is not user > friendly at all and will increase the support burden on your end as > well, if SGMII is specified and the IP does not support it, detect it > and return an error, how that propagates, either as a probe failure or > the inability to open the network device, your call. > Best regards, -- Nicolas Ferre