1. 02 8月, 2021 1 次提交
    • V
      net: dsa: sja1105: overwrite dynamic FDB entries with static ones in .port_fdb_add · e11e865b
      Vladimir Oltean 提交于
      The SJA1105 switch family leaves it up to software to decide where
      within the FDB to install a static entry, and to concatenate destination
      ports for already existing entries (the FDB is also used for multicast
      entries), it is not as simple as just saying "please add this entry".
      
      This means we first need to search for an existing FDB entry before
      adding a new one. The driver currently manages to fool itself into
      thinking that if an FDB entry already exists, there is nothing to be
      done. But that FDB entry might be dynamically learned, case in which it
      should be replaced with a static entry, but instead it is left alone.
      
      This patch checks the LOCKEDS ("locked/static") bit from found FDB
      entries, and lets the code "goto skip_finding_an_index;" if the FDB
      entry was not static. So we also need to move the place where we set
      LOCKEDS = true, to cover the new case where a dynamic FDB entry existed
      but was dynamic.
      
      Fixes: 291d1e72 ("net: dsa: sja1105: Add support for FDB and MDB management")
      Fixes: 1da73821 ("net: dsa: sja1105: Add FDB operations for P/Q/R/S series")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e11e865b
  2. 22 7月, 2021 1 次提交
    • V
      net: dsa: sja1105: make VID 4095 a bridge VLAN too · e40cba94
      Vladimir Oltean 提交于
      This simple series of commands:
      
      ip link add br0 type bridge vlan_filtering 1
      ip link set swp0 master br0
      
      fails on sja1105 with the following error:
      [   33.439103] sja1105 spi0.1: vlan-lookup-table needs to have at least the default untagged VLAN
      [   33.447710] sja1105 spi0.1: Invalid config, cannot upload
      Warning: sja1105: Failed to change VLAN Ethertype.
      
      For context, sja1105 has 3 operating modes:
      - SJA1105_VLAN_UNAWARE: the dsa_8021q_vlans are committed to hardware
      - SJA1105_VLAN_FILTERING_FULL: the bridge_vlans are committed to hardware
      - SJA1105_VLAN_FILTERING_BEST_EFFORT: both the dsa_8021q_vlans and the
        bridge_vlans are committed to hardware
      
      Swapping out a VLAN list and another in happens in
      sja1105_build_vlan_table(), which performs a delta update procedure.
      That function is called from a few places, notably from
      sja1105_vlan_filtering() which is called from the
      SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING handler.
      
      The above set of 2 commands fails when run on a kernel pre-commit
      8841f6e6 ("net: dsa: sja1105: make devlink property
      best_effort_vlan_filtering true by default"). So the priv->vlan_state
      transition that takes place is between VLAN-unaware and full VLAN
      filtering. So the dsa_8021q_vlans are swapped out and the bridge_vlans
      are swapped in.
      
      So why does it fail?
      
      Well, the bridge driver, through nbp_vlan_init(), first sets up the
      SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING attribute, and only then
      proceeds to call nbp_vlan_add for the default_pvid.
      
      So when we swap out the dsa_8021q_vlans and swap in the bridge_vlans in
      the SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING handler, there are no bridge
      VLANs (yet). So we have wiped the VLAN table clean, and the low-level
      static config checker complains of an invalid configuration. We _will_
      add the bridge VLANs using the dynamic config interface, albeit later,
      when nbp_vlan_add() calls us. So it is natural that it fails.
      
      So why did it ever work?
      
      Surprisingly, it looks like I only tested this configuration with 2
      things set up in a particular way:
      - a network manager that brings all ports up
      - a kernel with CONFIG_VLAN_8021Q=y
      
      It is widely known that commit ad1afb00 ("vlan_dev: VLAN 0 should be
      treated as "no vlan tag" (802.1p packet)") installs VID 0 to every net
      device that comes up. DSA treats these VLANs as bridge VLANs, and
      therefore, in my testing, the list of bridge_vlans was never empty.
      
      However, if CONFIG_VLAN_8021Q is not enabled, or the port is not up when
      it joins a VLAN-aware bridge, the bridge_vlans list will be temporarily
      empty, and the sja1105_static_config_reload() call from
      sja1105_vlan_filtering() will fail.
      
      To fix this, the simplest thing is to keep VID 4095, the one used for
      CPU-injected control packets since commit ed040abc ("net: dsa:
      sja1105: use 4095 as the private VLAN for untagged traffic"), in the
      list of bridge VLANs too, not just the list of tag_8021q VLANs. This
      ensures that the list of bridge VLANs will never be empty.
      
      Fixes: ec5ae610 ("net: dsa: sja1105: save/restore VLANs using a delta commit method")
      Reported-by: NRadu Pirea (NXP OSS) <radu-nicolae.pirea@oss.nxp.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e40cba94
  3. 14 7月, 2021 1 次提交
    • V
      net: dsa: sja1105: fix address learning getting disabled on the CPU port · b0b33b04
      Vladimir Oltean 提交于
      In May 2019 when commit 640f763f ("net: dsa: sja1105: Add support
      for Spanning Tree Protocol") was introduced, the comment that "STP does
      not get called for the CPU port" was true. This changed after commit
      0394a63a ("net: dsa: enable and disable all ports") in August 2019
      and went largely unnoticed, because the sja1105_bridge_stp_state_set()
      method did nothing different compared to the static setup done by
      sja1105_init_mac_settings().
      
      With the ability to turn address learning off introduced by the blamed
      commit, there is a new priv->learn_ena port mask in the driver. When
      sja1105_bridge_stp_state_set() gets called and we are in
      BR_STATE_LEARNING or later, address learning is enabled or not depending
      on priv->learn_ena & BIT(port).
      
      So what happens is that priv->learn_ena is not being set from anywhere
      for the CPU port, and the static configuration done by
      sja1105_init_mac_settings() is being overwritten.
      
      To solve this, acknowledge that the static configuration of STP state is
      no longer necessary because the STP state is being set by the DSA core
      now, but what is necessary is to set priv->learn_ena for the CPU port.
      
      Fixes: 4d942354 ("net: dsa: sja1105: offload bridge port flags to device")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b0b33b04
  4. 25 6月, 2021 1 次提交
    • V
      net: dsa: sja1105: fix NULL pointer dereference in sja1105_reload_cbs() · be7f62ee
      Vladimir Oltean 提交于
      priv->cbs is an array of priv->info->num_cbs_shapers elements of type
      struct sja1105_cbs_entry which only get allocated if CONFIG_NET_SCH_CBS
      is enabled.
      
      However, sja1105_reload_cbs() is called from sja1105_static_config_reload()
      which in turn is called for any of the items in sja1105_reset_reasons,
      therefore during the normal runtime of the driver and not just from a
      code path which can be triggered by the tc-cbs offload.
      
      The sja1105_reload_cbs() function does not contain a check whether the
      priv->cbs array is NULL or not, it just assumes it isn't and proceeds to
      iterate through the credit-based shaper elements. This leads to a NULL
      pointer dereference.
      
      The solution is to return success if the priv->cbs array has not been
      allocated, since sja1105_reload_cbs() has nothing to do.
      
      Fixes: 4d752508 ("net: dsa: sja1105: offload the Credit-Based Shaper qdisc")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      be7f62ee
  5. 19 6月, 2021 2 次提交
    • V
      net: dsa: sja1105: completely error out in sja1105_static_config_reload if something fails · 61c77533
      Vladimir Oltean 提交于
      If reloading the static config fails for whatever reason, for example if
      sja1105_static_config_check_valid() fails, then we "goto out_unlock_ptp"
      but we print anyway that "Reset switch and programmed static config.",
      which is confusing because we didn't. We also do a bunch of other stuff
      like reprogram the XPCS and reload the credit-based shapers, as if a
      switch reset took place, which didn't.
      
      So just unlock the PTP lock and goto out, skipping all of that.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      61c77533
    • V
      net: dsa: sja1105: properly power down the microcontroller clock for SJA1110 · cb5a82d2
      Vladimir Oltean 提交于
      It turns out that powering down the BASE_TIMER_CLK does not turn off the
      microcontroller, just its timers, including the one for the watchdog.
      So the embedded microcontroller is still running, and potentially still
      doing things.
      
      To prevent unwanted interference, we should power down the BASE_MCSS_CLK
      as well (MCSS = microcontroller subsystem).
      
      The trouble is that currently we turn off the BASE_TIMER_CLK for SJA1110
      from the .clocking_setup() method, mostly because this is a Clock
      Generation Unit (CGU) setting which was traditionally configured in that
      method for SJA1105. But in SJA1105, the CGU was used for bringing up the
      port clocks at the proper speeds, and in SJA1110 it's not (but rather
      for initial configuration), so it's best that we rebrand the
      sja1110_clocking_setup() method into what it really is - an implementation
      of the .disable_microcontroller() method.
      
      Since disabling the microcontroller only needs to be done once, at probe
      time, we can choose the best place to do that as being in sja1105_setup(),
      before we upload the static config to the device. This guarantees that
      the static config being used by the switch afterwards is really ours.
      
      Note that the procedure to upload a static config necessarily resets the
      switch. This already did not reset the microcontroller, only the switch
      core, so since the .disable_microcontroller() method is guaranteed to be
      called by that point, if it's disabled, it remains disabled. Add a
      comment to make that clear.
      
      With the code movement for SJA1110 from .clocking_setup() to
      .disable_microcontroller(), both methods are optional and are guarded by
      "if" conditions.
      
      Tested by enabling in the device tree the rev-mii switch port 0 that
      goes towards the microcontroller, and flashing a firmware that would
      have networking. Without this patch, the microcontroller can be pinged,
      with this patch it cannot.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      cb5a82d2
  6. 12 6月, 2021 6 次提交
    • V
      net: dsa: sja1105: plug in support for 2500base-x · 56b63466
      Vladimir Oltean 提交于
      The MAC treats 2500base-x same as SGMII (yay for that) except that it
      must be set to a different speed.
      
      Extend all places that check for SGMII to also check for 2500base-x.
      
      Also add the missing 2500base-x compatibility matrix entry for SJA1110D.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      56b63466
    • V
      net: dsa: sja1105: SGMII and 2500base-x on the SJA1110 are 'special' · ece578bc
      Vladimir Oltean 提交于
      For the xMII Mode Parameters Table to be properly configured for SGMII
      mode on SJA1110, we need to set the "special" bit, since SGMII is
      officially bitwise coded as 0b0011 in SJA1105 (decimal 3, equal to
      XMII_MODE_SGMII), and as 0b1011 in SJA1110 (decimal 11).
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ece578bc
    • V
      net: dsa: sja1105: migrate to xpcs for SGMII · 3ad1d171
      Vladimir Oltean 提交于
      There is a desire to use the generic driver for the Synopsys XPCS
      located in drivers/net/pcs, and to achieve that, the sja1105 driver must
      expose an MDIO bus for the SGMII PCS, because the XPCS probes as an
      mdio_device.
      
      In preparation of the SJA1110 which in fact has a different access
      procedure for the SJA1105, we register this PCS MDIO bus once in the
      common code, but we implement function pointers for the read and write
      methods. In this patch there is a single implementation for them.
      
      There is exactly one MDIO bus for the PCS, this will contain all PCSes
      at MDIO addresses equal to the port number.
      
      We delete a bunch of hardware support code because the xpcs driver
      already does what we need.
      
      We need to hack up the MDIO reads for the PHY ID, since our XPCS
      instantiation returns zeroes and there are some specific fixups which
      need to be applied by the xpcs driver.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3ad1d171
    • V
      net: dsa: add support for the SJA1110 native tagging protocol · 4913b8eb
      Vladimir Oltean 提交于
      The SJA1110 has improved a few things compared to SJA1105:
      
      - To send a control packet from the host port with SJA1105, one needed
        to program a one-shot "management route" over SPI. This is no longer
        true with SJA1110, you can actually send "in-band control extensions"
        in the packets sent by DSA, these are in fact DSA tags which contain
        the destination port and switch ID.
      
      - When receiving a control packet from the switch with SJA1105, the
        source port and switch ID were written in bytes 3 and 4 of the
        destination MAC address of the frame (which was a very poor shot at a
        DSA header). If the control packet also had an RX timestamp, that
        timestamp was sent in an actual follow-up packet, so there were
        reordering concerns on multi-core/multi-queue DSA masters, where the
        metadata frame with the RX timestamp might get processed before the
        actual packet to which that timestamp belonged (there is no way to
        pair a packet to its timestamp other than the order in which they were
        received). On SJA1110, this is no longer true, control packets have
        the source port, switch ID and timestamp all in the DSA tags.
      
      - Timestamps from the switch were partial: to get a 64-bit timestamp as
        required by PTP stacks, one would need to take the partial 24-bit or
        32-bit timestamp from the packet, then read the current PTP time very
        quickly, and then patch in the high bits of the current PTP time into
        the captured partial timestamp, to reconstruct what the full 64-bit
        timestamp must have been. That is awful because packet processing is
        done in NAPI context, but reading the current PTP time is done over
        SPI and therefore needs sleepable context.
      
      But it also aggravated a few things:
      
      - Not only is there a DSA header in SJA1110, but there is a DSA trailer
        in fact, too. So DSA needs to be extended to support taggers which
        have both a header and a trailer. Very unconventional - my understanding
        is that the trailer exists because the timestamps couldn't be prepared
        in time for putting them in the header area.
      
      - Like SJA1105, not all packets sent to the CPU have the DSA tag added
        to them, only control packets do:
      
        * the ones which match the destination MAC filters/traps in
          MAC_FLTRES1 and MAC_FLTRES0
        * the ones which match FDB entries which have TRAP or TAKETS bits set
      
        So we could in theory hack something up to request the switch to take
        timestamps for all packets that reach the CPU, and those would be
        DSA-tagged and contain the source port / switch ID by virtue of the
        fact that there needs to be a timestamp trailer provided. BUT:
      
      - The SJA1110 does not parse its own DSA tags in a way that is useful
        for routing in cross-chip topologies, a la Marvell. And the sja1105
        driver already supports cross-chip bridging from the SJA1105 days.
        It does that by automatically setting up the DSA links as VLAN trunks
        which contain all the necessary tag_8021q RX VLANs that must be
        communicated between the switches that span the same bridge. So when
        using tag_8021q on sja1105, it is possible to have 2 switches with
        ports sw0p0, sw0p1, sw1p0, sw1p1, and 2 VLAN-unaware bridges br0 and
        br1, and br0 can take sw0p0 and sw1p0, and br1 can take sw0p1 and
        sw1p1, and forwarding will happen according to the expected rules of
        the Linux bridge.
        We like that, and we don't want that to go away, so as a matter of
        fact, the SJA1110 tagger still needs to support tag_8021q.
      
      So the sja1110 tagger is a hybrid between tag_8021q for data packets,
      and the native hardware support for control packets.
      
      On RX, packets have a 13-byte trailer if they contain an RX timestamp.
      That trailer is padded in such a way that its byte 8 (the start of the
      "residence time" field - not parsed by Linux because we don't care) is
      aligned on a 16 byte boundary. So the padding has a variable length
      between 0 and 15 bytes. The DSA header contains the offset of the
      beginning of the padding relative to the beginning of the frame (and the
      end of the padding is obviously the end of the packet minus 13 bytes,
      the length of the trailer). So we discard it.
      
      Packets which don't have a trailer contain the source port and switch ID
      information in the header (they are "trap-to-host" packets). Packets
      which have a trailer contain the source port and switch ID in the trailer.
      
      On TX, the destination port mask and switch ID is always in the trailer,
      so we always need to say in the header that a trailer is present.
      
      The header needs a custom EtherType and this was chosen as 0xdadc, after
      0xdada which is for Marvell and 0xdadb which is for VLANs in
      VLAN-unaware mode on SJA1105 (and SJA1110 in fact too).
      
      Because we use tag_8021q in concert with the native tagging protocol,
      control packets will have 2 DSA tags.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4913b8eb
    • V
      net: dsa: sja1105: allow RX timestamps to be taken on all ports for SJA1110 · 6c0de59b
      Vladimir Oltean 提交于
      On SJA1105, there is support for a cascade port which is presumably
      connected to a downstream SJA1105 switch. The upstream one does not take
      PTP timestamps for packets received on this port, presumably because the
      downstream switch already did (and for PTP, it only makes sense for the
      leaf nodes in a DSA switch tree to do that).
      
      I haven't been able to validate that feature in a fully assembled setup,
      so I am disabling the feature by setting the cascade port to an unused
      port value (ds->num_ports).
      
      In SJA1110, multiple cascade ports are supported, and CASC_PORT became
      a bit mask from a port number. So when CASC_PORT is set to ds->num_ports
      (which is 11 on SJA1110), it is actually set to 0b1011, so ports 3, 1
      and 0 are configured as cascade ports and we cannot take RX timestamps
      on them.
      
      So we need to introduce a check for SJA1110 and set things differently
      (to zero there), so that the cascading feature is properly disabled and
      RX timestamps can be taken on all ports.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      6c0de59b
    • V
      net: dsa: sja1105: enable the TTEthernet engine on SJA1110 · 29305260
      Vladimir Oltean 提交于
      As opposed to SJA1105 where there are parts with TTEthernet and parts
      without, in SJA1110 all parts support it, but it must be enabled in the
      static config. So enable it unconditionally. We use it for the tc-taprio
      and tc-gate offload.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      29305260
  7. 09 6月, 2021 3 次提交
    • V
      net: dsa: sja1105: register the MDIO buses for 100base-T1 and 100base-TX · 5a8f0974
      Vladimir Oltean 提交于
      The SJA1110 contains two types of integrated PHYs: one 100base-TX PHY
      and multiple 100base-T1 PHYs.
      
      The access procedure for the 100base-T1 PHYs is also different than it
      is for the 100base-TX one. So we register 2 MDIO buses, one for the
      base-TX and the other for the base-T1. Each bus has an OF node which is
      a child of the "mdio" subnode of the switch, and they are recognized by
      compatible string.
      
      Cc: Russell King <linux@armlinux.org.uk>
      Cc: Heiner Kallweit <hkallweit1@gmail.com>
      Cc: Rob Herring <robh+dt@kernel.org>
      Cc: devicetree@vger.kernel.org
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      5a8f0974
    • V
      net: dsa: sja1105: make sure the retagging port is enabled for SJA1110 · ceec8bc0
      Vladimir Oltean 提交于
      The SJA1110 has an extra configuration in the General Parameters Table
      through which the user can select the buffer reservation config.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ceec8bc0
    • V
      net: dsa: sja1105: add support for the SJA1110 switch family · 3e77e59b
      Vladimir Oltean 提交于
      The SJA1110 is basically an SJA1105 with more ports, some integrated
      PHYs (100base-T1 and 100base-TX) and an embedded microcontroller which
      can be disabled, and the switch core can be controlled by a host running
      Linux, over SPI.
      
      This patch contains:
      - the static and dynamic config packing functions, for the tables that
        are common with SJA1105
      - one more static config tables which is "unique" to the SJA1110
        (actually it is a rehash of stuff that was placed somewhere else in
        SJA1105): the PCP Remapping Table
      - a reset and clock configuration procedure for the SJA1110 switch.
        This resets just the switch subsystem, and gates off the clock which
        powers on the embedded microcontroller.
      - an RGMII delay configuration procedure for SJA1110, which is very
        similar to SJA1105, but different enough for us to be unable to reuse
        it (this is a pattern that repeats itself)
      - some adaptations to dynamic config table entries which are no longer
        programmed in the same way. For example, to delete a VLAN, you used to
        write an entry through the dynamic reconfiguration interface with the
        desired VLAN ID, and with the VALIDENT bit set to false. Now, the VLAN
        table entries contain a TYPE_ENTRY field, which must be set to zero
        (in a backwards-incompatible way) in order for the entry to be deleted,
        or to some other entry for the VLAN to match "inner tagged" or "outer
        tagged" packets.
      - a similar thing for the static config: the xMII Mode Parameters Table
        encoding for SGMII and MII (the latter just when attached to a
        100base-TX PHY) just isn't what it used to be in SJA1105. They are
        identical, except there is an extra "special" bit which needs to be
        set. Set it.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3e77e59b
  8. 08 6月, 2021 2 次提交
  9. 01 6月, 2021 7 次提交
    • V
      net: dsa: sja1105: always keep RGMII ports in the MAC role · f41fad3c
      Vladimir Oltean 提交于
      In SJA1105, the xMII Mode Parameters Table field called PHY_MAC denotes
      the 'role' of the port, be it a PHY or a MAC. This makes a difference in
      the MII and RMII protocols, but RGMII is symmetric, so either PHY or MAC
      settings result in the same hardware behavior.
      
      The SJA1110 is different, and the RGMII ports only work when configured
      in MAC mode, so keep the port roles in MAC mode unconditionally.
      
      Why we had an RGMII port in the PHY role in the first place was because
      we wanted to have a way in the driver to denote whether RGMII delays
      should be applied based on the phy-mode property or not. This is already
      done in sja1105_parse_rgmii_delays() based on an intermediary
      struct sja1105_dt_port (which contains the port role). So it is a
      logical fallacy to use the hardware configuration as a scratchpad for
      driver data, it isn't necessary.
      
      We can also remove the gating condition for applying RGMII delays only
      for ports in the PHY role. The .setup_rgmii_delay() method looks at
      the priv->rgmii_rx_delay[port] and priv->rgmii_tx_delay[port] properties
      which are already populated properly (in the case of a port in the MAC
      role they are false). Removing this condition generates a few more SPI
      writes for these ports (clearing the RGMII delays) which are perhaps
      useless for SJA1105P/Q/R/S, where we know that the delays are disabled
      by default. But for SJA1110, the firmware on the embedded microcontroller
      might have done something funny, so it's always a good idea to clear the
      RGMII delays if that's what Linux expects.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      f41fad3c
    • V
      net: dsa: sja1105: add a translation table for port speeds · 41fed17f
      Vladimir Oltean 提交于
      In order to support the new speed of 2500Mbps, the SJA1110 has achieved
      the great performance of changing the encoding in the MAC Configuration
      Table for the port speeds of 10, 100, 1000 compared to SJA1105.
      
      Because this is a common driver, we need a layer of indirection in order
      to program the hardware with the right values irrespective of switch
      generation.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      41fed17f
    • V
      net: dsa: sja1105: add a PHY interface type compatibility matrix · 91a05078
      Vladimir Oltean 提交于
      On the SJA1105, all ports support the parallel "xMII" protocols (MII,
      RMII, RGMII) except for port 4 on SJA1105R/S which supports only SGMII.
      This was relatively easy to model, by special-casing the SGMII port.
      
      On the SJA1110, certain ports can be pinmuxed between SGMII and xMII, or
      between SGMII and an internal 100base-TX PHY. This creates problems,
      because the driver's assumption so far was that if a port supports
      SGMII, it uses SGMII.
      
      We allow the device tree to tell us how the port pinmuxing is done, and
      check that against a PHY interface type compatibility matrix for
      plausibility.
      
      The other big change is that instead of doing SGMII configuration based
      on what the port supports, we do it based on what is the configured
      phy_mode of the port.
      
      The 2500base-x support added in this patch is not complete.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      91a05078
    • V
      net: dsa: sja1105: cache the phy-mode port property · bf4edf4a
      Vladimir Oltean 提交于
      So far we've succeeded in operating without keeping a copy of the
      phy-mode in the driver, since we already have the static config and we
      can look at the xMII Mode Parameters Table which already holds that
      information.
      
      But with the SJA1110, we cannot make the distinction between sgmii and
      2500base-x, because to the hardware's static config, it's all SGMII.
      So add a phy_mode property per port inside struct sja1105_private.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      bf4edf4a
    • V
      net: dsa: sja1105: the 0x1F0000 SGMII "base address" is actually MDIO_MMD_VEND2 · 4c7ee010
      Vladimir Oltean 提交于
      Looking at the SGMII PCS from SJA1110, which is accessed indirectly
      through a different base address as can be seen in the next patch, it
      appears odd that the address accessed through indirection still
      references the base address from the SJA1105S register map (first MDIO
      register is at 0x1f0000), when it could index the SGMII registers
      starting from zero.
      
      Except that the 0x1f0000 is not a base address at all, it seems. It is
      0x1f << 16 | 0x0000, and 0x1f is coding for the vendor-specific MMD2.
      So, it turns out, the Synopsys PCS implements all its registers inside
      the vendor-specific MMDs 1 and 2 (0x1e and 0x1f). This explains why the
      PCS has no overlaps (for the other MMDs) with other register regions of
      the switch (because no other MMDs are implemented).
      
      Change the code to remove the SGMII "base address" and explicitly encode
      the MMD for reads/writes. This will become necessary for SJA1110 support.
      
      Cc: Russell King <linux@armlinux.org.uk>
      Cc: Heiner Kallweit <hkallweit1@gmail.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      4c7ee010
    • V
      net: dsa: sja1105: allow SGMII PCS configuration to be per port · 84db00f2
      Vladimir Oltean 提交于
      The SJA1105 R and S switches have 1 SGMII port (port 4). Because there
      is only one such port, there is no "port" parameter in the configuration
      code for the SGMII PCS.
      
      However, the SJA1110 can have up to 4 SGMII ports, each with its own
      SGMII register map. So we need to generalize the logic.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      84db00f2
    • V
      net: dsa: sja1105: be compatible with "ethernet-ports" OF node name · 15074a36
      Vladimir Oltean 提交于
      Since commit f2f3e09396be ("net: dsa: sja1105: be compatible with
      "ethernet-ports" OF node name"), DSA supports the "ethernet-ports" name
      for the container node of the ports, but the sja1105 driver doesn't,
      because it handles some device tree parsing of its own.
      
      Add the second node name as a fallback.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      15074a36
  10. 25 5月, 2021 13 次提交
    • V
      net: dsa: sja1105: allow the frame buffer size to be customized · 1bf658ee
      Vladimir Oltean 提交于
      The shared frame buffer of the SJA1110 is larger than that of SJA1105,
      which is natural due to the fact that there are more ports.
      
      Introduce yet another property in struct sja1105_info which encodes the
      maximum number of 128 byte blocks that can be used for frame buffers.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1bf658ee
    • V
      net: dsa: sja1105: configure the multicast policers, if present · 38fbe91f
      Vladimir Oltean 提交于
      The SJA1110 policer array is similar in layout with SJA1105, except it
      contains one multicast policer per port at the end.
      
      Detect the presence of multicast policers based on the maximum number of
      supported L2 Policing Table entries, and make those policers have a
      shared index equal to the port's default policer. Letting the user
      configure these policers is not supported at the moment.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      38fbe91f
    • V
      net: dsa: sja1105: dynamically choose the number of static config table entries · fd6f2c25
      Vladimir Oltean 提交于
      Due to the fact that the port count is different, some static config
      tables have a different number of elements in SJA1105 compared to
      SJA1110. Such an example is the L2 Policing table, which has 45 entries
      in SJA1105 (one per port x traffic class, and one broadcast policer per
      port) and 110 entries in SJA1110 (one per port x traffic class, one
      broadcast and one multicast policer per port).
      
      Similarly, the MAC Configuration Table, the L2 Forwarding table, all
      have a different number of elements simply because the port count is
      different, and although this can be accounted for by looking at
      ds->ports, the policing table can't because of the presence of the extra
      multicast policers.
      
      The common denominator for the static config initializers for these
      tables is that they must set up all the entries within that table.
      So the simplest way to account for these differences in a uniform manner
      is to look at struct sja1105_table_ops::max_entry_count. For the sake of
      uniformity, this patch makes that change also for tables whose number of
      elements did not change in SJA1110, like the xMII Mode Parameters, the
      L2 Lookup Parameters, General Parameters, AVB Parameters (all of these
      are singleton tables with a single entry).
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      fd6f2c25
    • V
      net: dsa: sja1105: skip CGU configuration if it's unnecessary · c5037678
      Vladimir Oltean 提交于
      There are two distinct code paths which enter sja1105_clocking.c, one
      through sja1105_clocking_setup() and the other through
      sja1105_clocking_setup_port():
      
      sja1105_static_config_reload      sja1105_setup
                    |                         |
                    |      +------------------+
                    |      |
                    v      v
         sja1105_clocking_setup               sja1105_adjust_port_config
                       |                                   |
                       v                                   |
            sja1105_clocking_setup_port <------------------+
      
      As opposed to SJA1105, the SJA1110 does not need any configuration of
      the Clock Generation Unit in order for xMII ports to work. Just RGMII
      internal delays need to be configured, and that is done inside
      sja1105_clocking_setup_port for the RGMII ports.
      
      So this patch introduces the concept of a "reserved address", which the
      CGU configuration functions from sja1105_clocking.c must check before
      proceeding to do anything. The SJA1110 will have reserved addresses for
      the CGU PLLs for MII/RMII/RGMII.
      
      Additionally, make sja1105_clocking_setup() a function pointer so it can
      be overridden by the SJA1110. Even though nothing port-related needs to
      be done in the CGU, there are some operations such as disabling the
      watchdog clock which are unique to the SJA1110.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c5037678
    • V
      net: dsa: sja1105: don't assign the host port using dsa_upstream_port() · df2a81a3
      Vladimir Oltean 提交于
      If @port is unused, then dsa_upstream_port(ds, port) returns @port,
      which means we cannot assume the CPU port can be retrieved this way.
      
      The sja1105 switches support a single CPU port, so just iterate over the
      switch ports and stop at the first CPU port we see.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      df2a81a3
    • V
      net: dsa: sja1105: dimension the data structures for a larger port count · 82760d7f
      Vladimir Oltean 提交于
      Introduce a SJA1105_MAX_NUM_PORTS macro which at the moment is equal to
      SJA1105_NUM_PORTS (5). With the introduction of SJA1110, these
      structures will need to hold information for up to 11 ports.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      82760d7f
    • V
      net: dsa: sja1105: avoid some work for unused ports · f238fef1
      Vladimir Oltean 提交于
      Do not put unused ports in the forwarding domain, and do not allocate
      FDB entries for dynamic address learning for them.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f238fef1
    • V
      net: dsa: sja1105: parameterize the number of ports · 542043e9
      Vladimir Oltean 提交于
      The sja1105 driver will gain support for the next-gen SJA1110 switch,
      which is very similar except for the fact it has more than 5 ports.
      
      So we need to replace the hardcoded SJA1105_NUM_PORTS in this driver
      with ds->num_ports. This patch is as mechanical as possible (save for
      the fact that ds->num_ports is not an integer constant expression).
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      542043e9
    • V
      net: dsa: sja1105: update existing VLANs from the bridge VLAN list · b38e659d
      Vladimir Oltean 提交于
      When running this sequence of operations:
      
      ip link add br0 type bridge vlan_filtering 1
      ip link set swp4 master br0
      bridge vlan add dev swp4 vid 1
      
      We observe the traffic sent on swp4 is still untagged, even though the
      bridge has overwritten the existing VLAN entry:
      
      port    vlan ids
      swp4     1 PVID
      
      br0      1 PVID Egress Untagged
      
      This happens because we didn't consider that the 'bridge vlan add'
      command just overwrites VLANs like it's nothing. We treat the 'vid 1
      pvid untagged' and the 'vid 1' as two separate VLANs, and the first
      still has precedence when calling sja1105_build_vlan_table. Obviously
      there is a disagreement regarding semantics, and we end up doing
      something unexpected from the PoV of the bridge.
      
      Let's actually consider an "existing VLAN" to be one which is on the
      same port, and has the same VLAN ID, as one we already have, and update
      it if it has different flags than we do.
      
      The first blamed commit is the one introducing the bug, the second one
      is the latest on top of which the bugfix still applies.
      
      Fixes: ec5ae610 ("net: dsa: sja1105: save/restore VLANs using a delta commit method")
      Fixes: 5899ee36 ("net: dsa: tag_8021q: add a context structure")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b38e659d
    • V
      net: dsa: sja1105: use 4095 as the private VLAN for untagged traffic · ed040abc
      Vladimir Oltean 提交于
      One thing became visible when writing the blamed commit, and that was
      that STP and PTP frames injected by net/dsa/tag_sja1105.c using the
      deferred xmit mechanism are always classified to the pvid of the CPU
      port, regardless of whatever VLAN there might be in these packets.
      
      So a decision needed to be taken regarding the mechanism through which
      we should ensure that delivery of STP and PTP traffic is possible when
      we are in a VLAN awareness mode that involves tag_8021q. This is because
      tag_8021q is not concerned with managing the pvid of the CPU port, since
      as far as tag_8021q is concerned, no traffic should be sent as untagged
      from the CPU port. So we end up not actually having a pvid on the CPU
      port if we only listen to tag_8021q, and unless we do something about it.
      
      The decision taken at the time was to keep VLAN 1 in the list of
      priv->dsa_8021q_vlans, and make it a pvid of the CPU port. This ensures
      that STP and PTP frames can always be sent to the outside world.
      
      However there is a problem. If we do the following while we are in
      the best_effort_vlan_filtering=true mode:
      
      ip link add br0 type bridge vlan_filtering 1
      ip link set swp2 master br0
      bridge vlan del dev swp2 vid 1
      
      Then untagged and pvid-tagged frames should be dropped. But we observe
      that they aren't, and this is because of the precaution we took that VID
      1 is always installed on all ports.
      
      So clearly VLAN 1 is not good for this purpose. What about VLAN 0?
      Well, VLAN 0 is managed by the 8021q module, and that module wants to
      ensure that 802.1p tagged frames are always received by a port, and are
      always transmitted as VLAN-tagged (with VLAN ID 0). Whereas we want our
      STP and PTP frames to be untagged if the stack sent them as untagged -
      we don't want the driver to just decide out of the blue that it adds
      VID 0 to some packets.
      
      So what to do?
      
      Well, there is one other VLAN that is reserved, and that is 4095:
      $ ip link add link swp2 name swp2.4095 type vlan id 4095
      Error: 8021q: Invalid VLAN id.
      $ bridge vlan add dev swp2 vid 4095
      Error: bridge: Vlan id is invalid.
      
      After we made this change, VLAN 1 is indeed forwarded and/or dropped
      according to the bridge VLAN table, there are no further alterations
      done by the sja1105 driver.
      
      Fixes: ec5ae610 ("net: dsa: sja1105: save/restore VLANs using a delta commit method")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ed040abc
    • V
      net: dsa: sja1105: error out on unsupported PHY mode · 6729188d
      Vladimir Oltean 提交于
      The driver continues probing when a port is configured for an
      unsupported PHY interface type, instead it should stop.
      
      Fixes: 8aa9ebcc ("net: dsa: Introduce driver for NXP SJA1105 5-port L2 switch")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      6729188d
    • V
      net: dsa: sja1105: add error handling in sja1105_setup() · cec279a8
      Vladimir Oltean 提交于
      If any of sja1105_static_config_load(), sja1105_clocking_setup() or
      sja1105_devlink_setup() fails, we can't just return in the middle of
      sja1105_setup() or memory will leak. Add a cleanup path.
      
      Fixes: 0a7bdbc2 ("net: dsa: sja1105: move devlink param code to sja1105_devlink.c")
      Fixes: 8aa9ebcc ("net: dsa: Introduce driver for NXP SJA1105 5-port L2 switch")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      cec279a8
    • V
      net: dsa: sja1105: call dsa_unregister_switch when allocating memory fails · dc596e3f
      Vladimir Oltean 提交于
      Unlike other drivers which pretty much end their .probe() execution with
      dsa_register_switch(), the sja1105 does some extra stuff. When that
      fails with -ENOMEM, the driver is quick to return that, forgetting to
      call dsa_unregister_switch(). Not critical, but a bug nonetheless.
      
      Fixes: 4d752508 ("net: dsa: sja1105: offload the Credit-Based Shaper qdisc")
      Fixes: a68578c2 ("net: dsa: Make deferred_xmit private to sja1105")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      dc596e3f
  11. 22 5月, 2021 1 次提交
    • V
      net: dsa: sja1105: adapt to a SPI controller with a limited max transfer size · 718bad0e
      Vladimir Oltean 提交于
      The static config of the sja1105 switch is a long stream of bytes which
      is programmed to the hardware in chunks (portions with the chip select
      continuously asserted) of max 256 bytes each. Each chunk is a
      spi_message composed of 2 spi_transfers: the buffer with the data and a
      preceding buffer with the SPI access header.
      
      Only that certain SPI controllers, such as the spi-sc18is602 I2C-to-SPI
      bridge, cannot keep the chip select asserted for that long.
      The spi_max_transfer_size() and spi_max_message_size() functions are how
      the controller can impose its hardware limitations upon the SPI
      peripheral driver.
      
      For the sja1105 driver to work with these controllers, both buffers must
      be smaller than the transfer limit, and their sum must be smaller than
      the message limit.
      
      Regression-tested on a switch connected to a controller with no
      limitations (spi-fsl-dspi) as well as with one with caps for both
      max_transfer_size and max_message_size (spi-sc18is602).
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      718bad0e
  12. 28 4月, 2021 1 次提交
    • Y
      net: dsa: free skb->cb usage in core driver · c4b364ce
      Yangbo Lu 提交于
      Free skb->cb usage in core driver and let device drivers decide to
      use or not. The reason having a DSA_SKB_CB(skb)->clone was because
      dsa_skb_tx_timestamp() which may set the clone pointer was called
      before p->xmit() which would use the clone if any, and the device
      driver has no way to initialize the clone pointer.
      
      This patch just put memset(skb->cb, 0, sizeof(skb->cb)) at beginning
      of dsa_slave_xmit(). Some new features in the future, like one-step
      timestamp may need more bytes of skb->cb to use in
      dsa_skb_tx_timestamp(), and p->xmit().
      Signed-off-by: NYangbo Lu <yangbo.lu@nxp.com>
      Acked-by: NRichard Cochran <richardcochran@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c4b364ce
  13. 21 3月, 2021 1 次提交
    • V
      Revert "net: dsa: sja1105: Clear VLAN filtering offload netdev feature" · a1e6f641
      Vladimir Oltean 提交于
      This reverts commit e9bf9694.
      
      The topic of the reverted patch is the support for switches with global
      VLAN filtering, added by commit 061f6a50 ("net: dsa: Add
      ndo_vlan_rx_{add, kill}_vid implementation"). Be there a switch with 4
      ports swp0 -> swp3, and the following setup:
      
      ip link add br0 type bridge vlan_filtering 1
      ip link set swp0 master br0
      ip link set swp1 master br0
      
      What would happen with VLAN-tagged traffic received on standalone ports
      swp2 and swp3? Well, it would get dropped, were it not for the
      .ndo_vlan_rx_add_vid and .ndo_vlan_rx_kill_vid implementations (called
      from vlan_vid_add and vlan_vid_del respectively). Basically, for DSA
      switches where VLAN filtering is a global attribute, we enforce the
      standalone ports to have 'rx-vlan-filter: off [fixed]' in their ethtool
      features, which lets the user know that all VLAN-tagged packets that are
      not explicitly added in the RX filtering list are dropped.
      
      As for the sja1105 driver, at the time of the reverted patch, it was
      operating in a pretty handicapped mode when it had ports under a bridge
      with vlan_filtering=1. Specifically, it was unable to terminate traffic
      through the CPU port (for further explanation see "Traffic support" in
      Documentation/networking/dsa/sja1105.rst).
      
      However, since then, the sja1105 driver has made considerable progress,
      and that limitation is no longer as severe now. Specifically, since
      commit 2cafa72e ("net: dsa: sja1105: add a new
      best_effort_vlan_filtering devlink parameter"), the driver is able to
      perform CPU termination even when some ports are under bridges with
      vlan_filtering=1. Then, since commit 8841f6e6 ("net: dsa: sja1105:
      make devlink property best_effort_vlan_filtering true by default"), this
      even became the default operating mode.
      
      So we can now take advantage of the logic in the DSA core.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a1e6f641