1. 21 8月, 2020 1 次提交
  2. 12 8月, 2020 1 次提交
    • M
      net: phy: marvell10g: fix null pointer dereference · 1b8ef142
      Marek Behún 提交于
      Commit c3e302ed ("net: phy: marvell10g: fix temperature sensor on 2110")
      added a check for PHY ID via phydev->drv->phy_id in a function which is
      called by devres at a time when phydev->drv is already set to null by
      phy_remove function.
      
      This null pointer dereference can be triggered via SFP subsystem with a
      SFP module containing this Marvell PHY. When the SFP interface is put
      down, the SFP subsystem removes the PHY.
      
      Fixes: c3e302ed ("net: phy: marvell10g: fix temperature sensor on 2110")
      Signed-off-by: NMarek Behún <marek.behun@nic.cz>
      Cc: Maxime Chevallier <maxime.chevallier@bootlin.com>
      Cc: Andrew Lunn <andrew@lunn.ch>
      Cc: Baruch Siach <baruch@tkos.co.il>
      Cc: Russell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1b8ef142
  3. 09 8月, 2020 1 次提交
  4. 04 8月, 2020 4 次提交
  5. 23 7月, 2020 1 次提交
    • V
      net: phy: fix check in get_phy_c45_ids · fb16d465
      Vladimir Oltean 提交于
      After the patch below, the iteration through the available MMDs is
      completely short-circuited, and devs_in_pkg remains set to the initial
      value of zero.
      
      Due to devs_in_pkg being zero, the rest of get_phy_c45_ids() is
      short-circuited too: the following loop never reaches below this point
      either (it executes "continue" for every device in package, failing to
      retrieve PHY ID for any of them):
      
      	/* Now probe Device Identifiers for each device present. */
      	for (i = 1; i < num_ids; i++) {
      		if (!(devs_in_pkg & (1 << i)))
      			continue;
      
      So c45_ids->device_ids remains populated with zeroes. This causes an
      Aquantia AQR412 PHY (same as any C45 PHY would, in fact) to be probed by
      the Generic PHY driver.
      
      The issue seems to be a case of submitting partially committed work (and
      therefore testing something other than was submitted).
      
      The intention of the patch was to delay exiting the loop until one more
      condition is reached (the devs_in_pkg read from hardware is either 0, OR
      mostly f's). So fix the patch to reflect that.
      
      Tested with traffic on a LS1028A-QDS, the PHY is now probed correctly
      using the Aquantia driver. The devs_in_pkg bit field is set to
      0xe000009a, and the MMDs that are present have the following IDs:
      
      [    5.600772] libphy: get_phy_c45_ids: device_ids[1]=0x3a1b662
      [    5.618781] libphy: get_phy_c45_ids: device_ids[3]=0x3a1b662
      [    5.630797] libphy: get_phy_c45_ids: device_ids[4]=0x3a1b662
      [    5.654535] libphy: get_phy_c45_ids: device_ids[7]=0x3a1b662
      [    5.791723] libphy: get_phy_c45_ids: device_ids[29]=0x3a1b662
      [    5.804050] libphy: get_phy_c45_ids: device_ids[30]=0x3a1b662
      [    5.816375] libphy: get_phy_c45_ids: device_ids[31]=0x0
      
      [    7.690237] mscc_felix 0000:00:00.5: PHY [0.5:00] driver [Aquantia AQR412] (irq=POLL)
      [    7.704739] mscc_felix 0000:00:00.5: PHY [0.5:01] driver [Aquantia AQR412] (irq=POLL)
      [    7.718918] mscc_felix 0000:00:00.5: PHY [0.5:02] driver [Aquantia AQR412] (irq=POLL)
      [    7.733044] mscc_felix 0000:00:00.5: PHY [0.5:03] driver [Aquantia AQR412] (irq=POLL)
      
      Fixes: bba238ed ("net: phy: continue searching for C45 MMDs even if first returned ffff:ffff")
      Reported-by: NColin King <colin.king@canonical.com>
      Reported-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      fb16d465
  6. 22 7月, 2020 15 次提交
  7. 20 7月, 2020 1 次提交
  8. 18 7月, 2020 2 次提交
    • C
      net: phy: sfp: Cotsworks SFF module EEPROM fixup · b18432c5
      Chris Healy 提交于
      Some Cotsworks SFF have invalid data in the first few bytes of the
      module EEPROM.  This results in these modules not being detected as
      valid modules.
      
      Address this by poking the correct EEPROM values into the module
      EEPROM when the model/PN match and the existing module EEPROM contents
      are not correct.
      Signed-off-by: NChris Healy <cphealy@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b18432c5
    • V
      net: phy: continue searching for C45 MMDs even if first returned ffff:ffff · bba238ed
      Vladimir Oltean 提交于
      At the time of introduction, in commit bdeced75 ("net: dsa: felix:
      Add PCS operations for PHYLINK"), support for the Lynx PCS inside Felix
      was relying, for USXGMII support, on the fact that get_phy_device() is
      able to parse the Lynx PCS "device-in-package" registers for this C45
      MDIO device and identify it correctly.
      
      However, this was actually working somewhat by mistake (in the sense
      that, even though it was detected, it was detected for the wrong
      reasons).
      
      The get_phy_c45_ids() function works by iterating through all MMDs
      starting from 1 (MDIO_MMD_PMAPMD) and stops at the first one which
      returns a non-zero value in the "device-in-package" register pair,
      proceeding to see what that non-zero value is.
      
      For the Felix PCS, the first MMD (1, for the PMA/PMD) returns a non-zero
      value of 0xffffffff in the "device-in-package" registers. There is a
      code branch which is supposed to treat this case and flag it as wrong,
      and normally, this would have caught my attention when adding initial
      support for this PCS:
      
      	if ((devs_in_pkg & 0x1fffffff) == 0x1fffffff) {
      		/* If mostly Fs, there is no device there, then let's probe
      		 * MMD 0, as some 10G PHYs have zero Devices In package,
      		 * e.g. Cortina CS4315/CS4340 PHY.
      		 */
      
      However, this code never actually kicked in, it seems, because this
      snippet from get_phy_c45_devs_in_pkg() was basically sabotaging itself,
      by returning 0xfffffffe instead of 0xffffffff:
      
      	/* Bit 0 doesn't represent a device, it indicates c22 regs presence */
      	*devices_in_package &= ~BIT(0);
      
      Then the rest of the code just carried on thinking "ok, MMD 1 (PMA/PMD)
      says that there are 31 devices in that package, each having a device id
      of ffff:ffff, that's perfectly fine, let's go ahead and probe this PHY
      device".
      
      But after cleanup commit 320ed3bf ("net: phy: split
      devices_in_package"), this got "fixed", and now devs_in_pkg is no longer
      0xfffffffe, but 0xffffffff. So now, get_phy_device is returning -ENODEV
      for the Lynx PCS, because the semantics have remained mostly unchanged:
      the loop stops at the first MMD that returns a non-zero value, and that
      is MMD 1.
      
      But the Lynx PCS is simply a clause 37 PCS which implements the required
      MAC-side functionality for USXGMII (when operated in C45 mode, which is
      where C45 devices-in-package detection is relevant to). Of course it
      will fail the PMD/PMA test (MMD 1), since it is not a PHY. But it does
      implement detection for MDIO_MMD_PCS (3):
      
      - MDIO_DEVS1=0x008a, MDIO_DEVS2=0x0000,
      - MDIO_DEVID1=0x0083, MDIO_DEVID2=0xe400
      
      Let get_phy_c45_ids() continue searching for valid MMDs, and don't
      assume that every phy_device has a PMA/PMD MMD implemented.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      bba238ed
  9. 17 7月, 2020 1 次提交
  10. 15 7月, 2020 1 次提交
  11. 14 7月, 2020 1 次提交
  12. 10 7月, 2020 1 次提交
  13. 09 7月, 2020 3 次提交
  14. 08 7月, 2020 7 次提交