1. 22 7月, 2020 23 次提交
    • D
      Merge branch 'Phylink-PCS-updates' · 11de5770
      David S. Miller 提交于
      Russell King says:
      
      ====================
      Phylink PCS updates
      
      This series updates the rudimentary phylink PCS support with the
      results of the last four months of development of that.  Phylink
      PCS support was initially added back at the end of March, when it
      became clear that the current approach of treating everything at
      the MAC end as being part of the MAC was inadequate.
      
      However, this rudimentary implementation was fine initially for
      mvneta and similar, but in practice had a fair number of issues,
      particularly when ethtool interfaces were used to change various
      link properties.
      
      It became apparent that relying on the phylink_config structure for
      the PCS was also bad when it became clear that the same PCS was used
      in DSA drivers as well as in NXPs other offerings, and there was a
      desire to re-use that code.
      
      It also became apparent that splitting the "configuration" step on
      an interface mode configuration between the MAC and PCS using just
      mac_config() and pcs_config() methods was not sufficient for some
      setups, as the MAC needed to be "taken down" prior to making changes,
      and once all settings were complete, the MAC could only then be
      resumed.
      
      This series addresses these points, progressing PCS support, and
      has been developed with mvneta and DPAA2 setups, with work on both
      those drivers to prove this approach.  It has been rigorously tested
      with mvneta, as that provides the most flexibility for testing the
      various code paths.
      
      To solve the phylink_config reuse problem, we introduce a struct
      phylink_pcs, which contains the minimal information necessary, and it
      is intended that this is embedded in the PCS private data structure.
      
      To solve the interface mode configuration problem, we introduce two
      new MAC methods, mac_prepare() and mac_finish() which wrap the entire
      interface mode configuration only.  This has the additional benefit of
      relieving MAC drivers from working out whether an interface change has
      occurred, and whether they need to do some major work.
      
      I have not yet updated all the interface documentation for these
      changes yet, that work remains, but this patch set is provided in the
      hope that those working on PCS support in NXP will find this useful.
      
      Since there is a lot of change here, this is the reason why I strongly
      advise that everyone has converted to the mac_link_up() way of
      configuring the link parameters when the link comes up, rather than
      the old way of using mac_config() - especially as splitting the PCS
      changes how and when phylink calls mac_config(). Although no change
      for existing users is intended, that is something I no longer am able
      to test.
      
      Changes since RFC:
      - fix bisect build failure
      - add patch to use config.an_enabled
      - rename phylink_config_interface to phylink_major_reconfig
      - add expanded documentation for phylink_set_pcs()
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      11de5770
    • R
      net: phylink: add interface to configure clause 22 PCS PHY · 93eaceb0
      Russell King 提交于
      Add an interface to configure the advertisement for a clause 22 PCS
      PHY, and set the AN enable flag in the BMCR appropriately.
      Reviewed-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      93eaceb0
    • R
      net: phylink: add struct phylink_pcs · 7137e18f
      Russell King 提交于
      Add a way for MAC PCS to have private data while keeping independence
      from struct phylink_config, which is used for the MAC itself. We need
      this independence as we will have stand-alone code for PCS that is
      independent of the MAC.  Introduce struct phylink_pcs, which is
      designed to be embedded in a driver private data structure.
      
      This structure does not include a mdio_device as there are PCS
      implementations such as the Marvell DSA and network drivers where this
      is not necessary.
      Reviewed-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7137e18f
    • R
      net: phylink: re-implement interface configuration with PCS · b7ad14c2
      Russell King 提交于
      With PCS support, how we implement interface reconfiguration (or other
      major reconfiguration) is not up to the job; we end up reconfiguring
      the PCS for an interface change while the link could potentially be up.
      In order to solve this, add two additional MAC methods for major
      configuration, one to prepare for the change, and one to finish the
      change.
      
      This allows mvneta and mvpp2 to shutdown what they require prior to the
      MAC and PCS configuration calls, and then restart as appropriate.
      
      This impacts ksettings_set(), which now needs to identify whether the
      change is a minor tweak to the advertisement masks or whether the
      interface mode has changed, and call the appropriate function for that
      update.
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b7ad14c2
    • R
      net: phylink: in-band pause mode advertisement update for PCS · 1571e700
      Russell King 提交于
      Re-code the pause in-band advertisement update in light of the addition
      of PCS support, so that we perform the minimum required; only the PCS
      configuration function needs to be called in this case, followed by the
      request to trigger a restart of negotiation if the programmed
      advertisement changed.
      
      We need to change the pcs_config() signature to pass whether resolved
      pause should be passed to the MAC for setups such as mvneta and mvpp2
      where doing so overrides the MAC manual flow controls.
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1571e700
    • R
      net: phylink: simplify fixed-link case for ksettings_set method · 1e1bf14a
      Russell King 提交于
      For fixed links, we only allow the current settings, so this should be
      a matter of merely rejecting an attempt to change the settings.  If the
      settings agree, then there is nothing more we need to do.
      Reviewed-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1e1bf14a
    • R
      net: phylink: use config.an_enabled in ksettings_set method · a83c8829
      Russell King 提交于
      Rather than recomputing whether AN is enabled, use config.an_enabled.
      Suggested-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a83c8829
    • R
      net: phylink: simplify phy case for ksettings_set method · cbc1bb1e
      Russell King 提交于
      When we have a PHY attached, an ethtool ksettings_set() call only
      really needs to call through to the phylib equivalent; phylib will
      call back to us when the link changes so we can update our state.
      Therefore, we can bypass most of our ksettings_set() call for this
      case.
      Reviewed-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      cbc1bb1e
    • R
      net: phylink: simplify ksettings_set() implementation · c8cab719
      Russell King 提交于
      Simplify the ksettings_set() implementation to look more like phylib's
      implementation; use a switch() for validating the autoneg setting, and
      use the linkmode_modify() helper to set the autoneg bit in the
      advertisement mask.
      Reviewed-by: NIoana Ciornei <ioana.ciornei@nxp.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c8cab719
    • R
      net: phylink: avoid mac_config calls · 7cceb599
      Russell King 提交于
      Avoid calling mac_config() when using split PCS, and the interface
      remains the same.
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7cceb599
    • R
      net: phylink: update PCS when changing interface during resolution · 5005b163
      Russell King 提交于
      The only PHYs that are used with phylink which change their interface
      are the BCM84881 and MV88X3310 family, both of which only change their
      interface modes on link-up events.  This will break when drivers are
      converted to split-PCS.  Fix this.
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      5005b163
    • R
      net: phylink: ensure link is down when changing interface · 16319a7d
      Russell King 提交于
      The only PHYs that are used with phylink which change their interface
      are the BCM84881 and MV88X3310 family, both of which only change their
      interface modes on link-up events.  However, rather than relying upon
      this behaviour by the PHY, we should give a stronger guarantee when
      resolving that the link will be down whenever we change the interface
      mode.  This patch implements that stronger guarantee for resolve.
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      16319a7d
    • R
      net: phylink: rearrange resolve mac_config() call · 319bfafe
      Russell King 提交于
      Use a boolean to indicate whether mac_config() should be called during
      a resolution. This allows resolution to have a single location where
      mac_config() will be called, which will allow us to make decisions
      about how and what we do.
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      319bfafe
    • R
      net: phylink: rejig link state tracking · b06e5cac
      Russell King 提交于
      Rejig the link state tracking, so that we can use the current state
      in a future patch.
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b06e5cac
    • R
      net: phylink: update ethtool reporting for fixed-link modes · 1ceb7ee7
      Russell King 提交于
      Comparing the ethtool output from phylink and non-phylink fixed-link
      setups shows that we have some differences:
      
      - The "auto-negotiation" fields are different; phylink reports these
        as "No", non-phylink reports these as "Yes" for the supported and
        advertising masks.
      - The link partner advertisement is set to the link speed with non-
        phylink, but phylink leaves this unset, causing all link partner
        fields to be omitted.
      
      The phylink ethtool output also disagrees with the software emulated
      PHY dump via the MII registers.
      
      Update the phylink fixed-link parsing code so that we better reflect
      the behaviour of the non-phylink code that this facility replaces, and
      bring the ethtool interface more into line with the report from via the
      MII interface.
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1ceb7ee7
    • D
      Merge branch 'enetc-Add-adaptive-interrupt-coalescing' · ccbc6dac
      David S. Miller 提交于
      Claudiu Manoil says:
      
      ====================
      enetc: Add adaptive interrupt coalescing
      
      Apart from some related cleanup patches, this set
      introduces in a straightforward way the support needed
      to enable and configure interrupt coalescing for ENETC.
      
      Patch 5 introduces the support needed for configuring the
      interrupt coalescing parameters and for switching between
      moderated (int. coalescing) and per-packet interrupt modes.
      When interrupt coalescing is enabled the Rx/Tx time
      thresholds are configurable, packet thresholds are fixed.
      To make this work reliably, patch 5 uses the traffic
      pause procedure introduced in patch 2.
      
      Patch 6 adds DIM (Dynamic Interrupt Moderation) to implement
      adaptive coalescing based on time thresholds, for the Rx 'channel'.
      On the Tx side a default optimal value is used instead, optimized for
      TCP traffic over 1G and 2.5G links.  This default 'optimal' value can
      be overridden anytime via 'ethtool -C tx-usecs'.
      
      netperf -t TCP_MAERTS measurements show a significant CPU load
      reduction correlated w/ reduced interrupt rates. For the
      measurement results refer to the comments in patch 6.
      
      v2: Replaced Tx DIM with predefined optimal value, giving
      better results. This was also suggested by Jakub (cc).
      Switched order of patches 4 and 5, for better grouping.
      
      v3: minor cleanup/improvements
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ccbc6dac
    • C
      enetc: Add adaptive interrupt coalescing · ae0e6a5d
      Claudiu Manoil 提交于
      Use the generic dynamic interrupt moderation (dim)
      framework to implement adaptive interrupt coalescing
      on Rx.  With the per-packet interrupt scheme, a high
      interrupt rate has been noted for moderate traffic flows
      leading to high CPU utilization.  The 'dim' scheme
      implemented by the current patch addresses this issue
      improving CPU utilization while using minimal coalescing
      time thresholds in order to preserve a good latency.
      On the Tx side use an optimal time threshold value by
      default.  This value has been optimized for Tx TCP
      streams at a rate of around 85kpps on a 1G link,
      at which rate half of the Tx ring size (128) gets filled
      in 1500 usecs.  Scaling this down to 2.5G links yields
      the current value of 600 usecs, which is conservative
      and gives good enough results for 1G links too (see
      next).
      
      Below are some measurement results for before and after
      this patch (and related dependencies) basically, for a
      2 ARM Cortex-A72 @1.3Ghz CPUs system (32 KB L1 data cache),
      using 60secs log netperf TCP stream tests @ 1Gbit link
      (maximum throughput):
      
      1) 1 Rx TCP flow, both Rx and Tx processed by the same NAPI
      thread on the same CPU:
      	CPU utilization		int rate (ints/sec)
      Before:	50%-60% (over 50%)		92k
      After:  13%-22%				3.5k-12k
      Comment:  Major CPU utilization improvement for a single flow
      	  Rx TCP flow (i.e. netperf -t TCP_MAERTS) on a single
      	  CPU. Usually settles under 16% for longer tests.
      
      2) 4 Rx TCP flows + 4 Tx TCP flows (+ pings to check the latency):
      	Total CPU utilization	Total int rate (ints/sec)
      Before:	~80% (spikes to 90%)		~100k
      After:   60% (more steady)		  ~4k
      Comment:  Important improvement for this load test, while the
      	  ping test outcome does not show any notable
      	  difference compared to before.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ae0e6a5d
    • C
      enetc: Add interrupt coalescing support · 91571081
      Claudiu Manoil 提交于
      Enable programming of the interrupt coalescing registers
      and allow manual configuration of the coalescing time
      thresholds via ethtool.  Packet thresholds have been fixed
      to predetermined values as there's no point in making them
      run-time configurable, also anticipating the dynamic interrupt
      moderation (DIM) algorithm which uses fixed packet thresholds
      as well.  If the interface is up when the operation mode of
      traffic interrupt events is changed by the user (i.e. switching
      from default per-packet interrupts to coalesced interrupts),
      the traffic needs to be paused in the process.
      This patch also prepares the ground for introducing DIM on Rx.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      91571081
    • C
      enetc: Drop redundant ____cacheline_aligned_in_smp · 058d9cfa
      Claudiu Manoil 提交于
      'struct enetc_bdr' is already '____cacheline_aligned_in_smp'.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      058d9cfa
    • C
      enetc: Fix interrupt coalescing register naming · 12460a0a
      Claudiu Manoil 提交于
      Interrupt coalescing registers naming in the current revision
      of the Ref Man (RM) is ICR, deprecating the ICIR name used
      in earlier (draft) versions of the RM.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      12460a0a
    • C
      enetc: Factor out the traffic start/stop procedures · bbb96dc7
      Claudiu Manoil 提交于
      A reliable traffic pause (and reconfiguration) procedure
      is needed to be able to safely make h/w configuration
      changes during run-time, like changing the mode in which the
      interrupts are operating (i.e. with or without coalescing),
      as opposed to making on-the-fly register updates that
      may be subject to h/w or s/w concurrency issues.
      To this end, the code responsible of the run-time device
      configurations that basically starts resp. stops the traffic
      flow through the device has been extracted from the
      the enetc_open/_close procedures, to the separate standalone
      enetc_start/_stop procedures. Traffic stop should be as
      graceful as possible, it lets the executing napi threads to
      to finish while the interrupts stay disabled.  But since
      the napi thread will try to re-enable interrupts by clearing
      the device's unmask register, the enable_irq/ disable_irq
      API has been used to avoid this potential concurrency issue
      and make the traffic pause procedure more reliable.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      bbb96dc7
    • C
      enetc: Refine buffer descriptor ring sizes · 02293dd4
      Claudiu Manoil 提交于
      It's time to differentiate between Rx and Tx ring sizes.
      Not only Tx rings are processed differently than Rx rings,
      but their default number also differs - i.e. up to 8 Tx rings
      per device (8 traffic classes) vs. 2 Rx rings (one per CPU).
      So let's set Tx rings sizes to half the size of the Rx rings
      for now, to be conservative.
      The default ring sizes were decreased as well (to the next
      lower power of 2), to reduce the memory footprint, buffering
      etc., since the measurements I've made so far show that the
      rings are very unlikely to get full.
      This change also anticipates the introduction of the
      dynamic interrupt moderation (dim) algorithm which operates
      on maximum packet thresholds of 256 packets for Rx and 128
      packets for Tx.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      02293dd4
    • J
      net: mdio-mux-gpio: use devm_gpiod_get_array() · c17e3178
      Jisheng Zhang 提交于
      Use devm_gpiod_get_array() to simplify the error handling and exit
      code path.
      Signed-off-by: NJisheng Zhang <Jisheng.Zhang@synaptics.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c17e3178
  2. 21 7月, 2020 17 次提交