1. 02 Feb, 2022 20 commits
    • David S. Miller's avatar
      Merge branch 'qca8k-mdio' · 0b6b0d31
      David S. Miller authored
      Ansuel Smith says:
      
      ====================
      Add support for qca8k mdio rw in Ethernet packet
      
      The main reason for this is that we notice some routing problem in the
      switch and it seems assisted learning is needed. Considering mdio is
      quite slow due to the indirect write using this Ethernet alternative way
      seems to be quicker.
      
      The qca8k switch supports a special way to pass mdio read/write request
      using specially crafted Ethernet packet.
      This works by putting some defined data in the Ethernet header where the
      mac source and dst should be placed. The Ethernet type header is set to qca
      header and is set to a mdio read/write type.
      This is used to communicate to the switch that this is a special packet
      and should be parsed differently.
      
      Currently we use Ethernet packet for
      - MIB counter
      - mdio read/write configuration
      - phy read/write for each port
      
      Current implementation of this use completion API to wait for the packet
      to be processed by the tagger and has a timeout that fallback to the
      legacy mdio way and mutex to enforce one transaction at time.
      
      We now have connect()/disconnect() ops for the tagger. They are used to
      allocate priv data in the dsa priv. The header still has to be put in
      global include to make it usable by a dsa driver.
      They are called when the tag is connect to the dst and the data is freed
      using discconect on tagger change.
      
      (if someone wonder why the bind function is put at in the general setup
      function it's because tag is set in the cpu port where the notifier is
      still not available and we require the notifier to sen the
      tag_proto_connect() event.
      
      We now have a tag_proto_connect() for the dsa driver used to put
      additional data in the tagger priv (that is actually the dsa priv).
      This is called using a switch event DSA_NOTIFIER_TAG_PROTO_CONNECT.
      Current use for this is adding handler for the Ethernet packet to keep
      the tagger code as dumb as possible.
      
      The tagger priv implement only the handler for the special packet. All the
      other stuff is placed in the qca8k_priv and the tagger has to access
      it under lock.
      
      We use the new API from Vladimir to track if the master port is
      operational or not. We had to track many thing to reach a usable state.
      Checking if the port is UP is not enough and tracking a NETDEV_CHANGE is
      also not enough since it use also for other task. The correct way was
      both track for interface UP and if a qdisc was assigned to the
      interface. That tells us the port (and the tagger indirectly) is ready
      to accept and process packet.
      
      I tested this with multicpu port and with port6 set as the unique port and
      it's sad.
      It seems they implemented this feature in a bad way and this is only
      supported with cpu port0. When cpu port6 is the unique port, the switch
      doesn't send ack packet. With multicpu port, packet ack are not duplicated
      and only cpu port0 sends them. This is the same for the MIB counter.
      For this reason this feature is enabled only when cpu port0 is enabled and
      operational.
      
      v8:
      - Reworked to rolling counter for the seq_num
      - Reworked the hi/lo cache patch
      - Fix multiple missing skb free and mutex lock errors
      - Fix some spelling mistake
      - Add macro build check for mgmt packet size
      - Change some struct naming to make them more descriptive
      v7:
      - Rebase on net-next changes
      - Add bulk patches to speedup this even more
      v6:
      - Fix some error in ethtool handler caused by rebase/cleanup
      v5:
      - Adapt to new API fixes
      - Fix a wrong logic for noop
      - Add additional lock for master_state change
      - Limit mdio Ethernet to cpu port0 (switch limitation)
      - Add priority to these special packet
      - Move mdio cache to qca8k_priv
      v4:
      - Remove duplicate patch sent by mistake.
      v3:
      - Include MIB with Ethernet packet.
      - Include phy read/write with Ethernet packet.
      - Reorganize code with new API.
      - Introuce master tracking by Vladimir
      v2:
      - Address all suggestion from Vladimir.
        Try to generilize this with connect/disconnect function from the
        tagger and tag_proto_connect for the driver.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      0b6b0d31
    • Ansuel Smith's avatar
      net: dsa: qca8k: introduce qca8k_bulk_read/write function · 4f3701fc
      Ansuel Smith authored
      Introduce qca8k_bulk_read/write() function to use mgmt Ethernet way to
      read/write packet in bulk. Make use of this new function in the fdb
      function and while at it reduce the reg for fdb_read from 4 to 3 as the
      max bit for the ARL(fdb) table is 83 bits.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4f3701fc
    • Ansuel Smith's avatar
      net: dsa: qca8k: add support for larger read/write size with mgmt Ethernet · 90386223
      Ansuel Smith authored
      mgmt Ethernet packet can read/write up to 16byte at times. The len reg
      is limited to 15 (0xf). The switch actually sends and accepts data in 4
      different steps of len values.
      Len steps:
      - 0: nothing
      - 1-4: first 4 byte
      - 5-6: first 12 byte
      - 7-15: all 16 byte
      
      In the alloc skb function we check if the len is 16 and we fix it to a
      len of 15. It the read/write function interest to extract the real asked
      data. The tagger handler will always copy the fully 16byte with a READ
      command. This is useful for some big regs like the fdb reg that are
      more than 4byte of data. This permits to introduce a bulk function that
      will send and request the entire entry in one go.
      Write function is changed and it does now require to pass the pointer to
      val to also handle array val.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      90386223
    • Ansuel Smith's avatar
      net: dsa: qca8k: cache lo and hi for mdio write · 2481d206
      Ansuel Smith authored
      From Documentation, we can cache lo and hi the same way we do with the
      page. This massively reduce the mdio write as 3/4 of the time as we only
      require to write the lo or hi part for a mdio write.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2481d206
    • Ansuel Smith's avatar
      net: dsa: qca8k: move page cache to driver priv · 4264350a
      Ansuel Smith authored
      There can be multiple qca8k switch on the same system. Move the static
      qca8k_current_page to qca8k_priv and make it specific for each switch.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4264350a
    • Ansuel Smith's avatar
      net: dsa: qca8k: add support for phy read/write with mgmt Ethernet · 2cd54856
      Ansuel Smith authored
      Use mgmt Ethernet also for phy read/write if availabale. Use a different
      seq number to make sure we receive the correct packet.
      On any error, we fallback to the legacy mdio read/write.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2cd54856
    • Ansuel Smith's avatar
      net: dsa: qca8k: add support for mib autocast in Ethernet packet · 5c957c7c
      Ansuel Smith authored
      The switch can autocast MIB counter using Ethernet packet.
      Add support for this and provide a handler for the tagger.
      The switch will send packet with MIB counter for each port, the switch
      will use completion API to wait for the correct packet to be received
      and will complete the task only when each packet is received.
      Although the handler will drop all the other packet, we still have to
      consume each MIB packet to complete the request. This is done to prevent
      mixed data with concurrent ethtool request.
      
      connect_tag_protocol() is used to add the handler to the tag_qca tagger,
      master_state_change() use the MIB lock to make sure no MIB Ethernet is
      in progress.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5c957c7c
    • Ansuel Smith's avatar
      net: dsa: qca8k: add support for mgmt read/write in Ethernet packet · 5950c7c0
      Ansuel Smith authored
      Add qca8k side support for mgmt read/write in Ethernet packet.
      qca8k supports some specially crafted Ethernet packet that can be used
      for mgmt read/write instead of the legacy method uart/internal mdio.
      This add support for the qca8k side to craft the packet and enqueue it.
      Each port and the qca8k_priv have a special struct to put data in it.
      The completion API is used to wait for the packet to be received back
      with the requested data.
      
      The various steps are:
      1. Craft the special packet with the qca hdr set to mgmt read/write
         mode.
      2. Set the lock in the dedicated mgmt struct.
      3. Increment the seq number and set it in the mgmt pkt
      4. Reinit the completion.
      5. Enqueue the packet.
      6. Wait the packet to be received.
      7. Use the data set by the tagger to complete the mdio operation.
      
      If the completion timeouts or the ack value is not true, the legacy
      mdio way is used.
      
      It has to be considered that in the initial setup mdio is still used and
      mdio is still used until DSA is ready to accept and tag packet.
      
      tag_proto_connect() is used to fill the required handler for the tagger
      to correctly parse and elaborate the special Ethernet mdio packet.
      
      Locking is added to qca8k_master_change() to make sure no mgmt Ethernet
      are in progress.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5950c7c0
    • Ansuel Smith's avatar
      net: dsa: qca8k: add tracking state of master port · cddbec19
      Ansuel Smith authored
      MDIO/MIB Ethernet require the master port and the tagger availabale to
      correctly work. Use the new api master_state_change to track when master
      is operational or not and set a bool in qca8k_priv.
      We cache the first cached master available and we check if other cpu
      port are operational when the cached one goes down.
      This cached master will later be used by mdio read/write and mib request to
      correctly use the working function.
      
      qca8k implementation for MDIO/MIB Ethernet is bad. CPU port0 is the only
      one that answers with the ack packet or sends MIB Ethernet packets. For
      this reason the master_state_change ignore CPU port6 and only checks
      CPU port0 if it's operational and enables this mode.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cddbec19
    • Ansuel Smith's avatar
      net: dsa: tag_qca: add support for handling mgmt and MIB Ethernet packet · 31eb6b43
      Ansuel Smith authored
      Add connect/disconnect helper to assign private struct to the DSA switch.
      Add support for Ethernet mgmt and MIB if the DSA driver provide an handler
      to correctly parse and elaborate the data.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      31eb6b43
    • Ansuel Smith's avatar
      net: dsa: tag_qca: add define for handling MIB packet · 18be654a
      Ansuel Smith authored
      Add struct to correctly parse a mib Ethernet packet.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      18be654a
    • Ansuel Smith's avatar
      net: dsa: tag_qca: add define for handling mgmt Ethernet packet · c2ee8181
      Ansuel Smith authored
      Add all the required define to prepare support for mgmt read/write in
      Ethernet packet. Any packet of this type has to be dropped as the only
      use of these special packet is receive ack for an mgmt write request or
      receive data for an mgmt read request.
      A struct is used that emulates the Ethernet header but is used for a
      different purpose.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c2ee8181
    • Ansuel Smith's avatar
      net: dsa: tag_qca: enable promisc_on_master flag · 101c04c3
      Ansuel Smith authored
      Ethernet MDIO packets are non-standard and DSA master expects the first
      6 octets to be the MAC DA. To address these kind of packet, enable
      promisc_on_master flag for the tagger.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      101c04c3
    • Ansuel Smith's avatar
      net: dsa: tag_qca: move define to include linux/dsa · 3ec762fb
      Ansuel Smith authored
      Move tag_qca define to include dir linux/dsa as the qca8k require access
      to the tagger define to support in-band mdio read/write using ethernet
      packet.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3ec762fb
    • Ansuel Smith's avatar
      net: dsa: tag_qca: convert to FIELD macro · 6b045829
      Ansuel Smith authored
      Convert driver to FIELD macro to drop redundant define.
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6b045829
    • Vladimir Oltean's avatar
      net: dsa: replay master state events in dsa_tree_{setup,teardown}_master · e83d5653
      Vladimir Oltean authored
      In order for switch driver to be able to make simple and reliable use of
      the master tracking operations, they must also be notified of the
      initial state of the DSA master, not just of the changes. This is
      because they might enable certain features only during the time when
      they know that the DSA master is up and running.
      
      Therefore, this change explicitly checks the state of the DSA master
      under the same rtnl_mutex as we were holding during the
      dsa_master_setup() and dsa_master_teardown() call. The idea being that
      if the DSA master became operational in between the moment in which it
      became a DSA master (dsa_master_setup set dev->dsa_ptr) and the moment
      when we checked for the master being up, there is a chance that we
      would emit a ->master_state_change() call with no actual state change.
      We need to avoid that by serializing the concurrent netdevice event with
      us. If the netdevice event started before, we force it to finish before
      we begin, because we take rtnl_lock before making netdev_uses_dsa()
      return true. So we also handle that early event and do nothing on it.
      Similarly, if the dev_open() attempt is concurrent with us, it will
      attempt to take the rtnl_mutex, but we're holding it. We'll see that
      the master flag IFF_UP isn't set, then when we release the rtnl_mutex
      we'll process the NETDEV_UP notifier.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e83d5653
    • Vladimir Oltean's avatar
      net: dsa: provide switch operations for tracking the master state · 295ab96f
      Vladimir Oltean authored
      Certain drivers may need to send management traffic to the switch for
      things like register access, FDB dump, etc, to accelerate what their
      slow bus (SPI, I2C, MDIO) can already do.
      
      Ethernet is faster (especially in bulk transactions) but is also more
      unreliable, since the user may decide to bring the DSA master down (or
      not bring it up), therefore severing the link between the host and the
      attached switch.
      
      Drivers needing Ethernet-based register access already should have
      fallback logic to the slow bus if the Ethernet method fails, but that
      fallback may be based on a timeout, and the I/O to the switch may slow
      down to a halt if the master is down, because every Ethernet packet will
      have to time out. The driver also doesn't have the option to turn off
      Ethernet-based I/O momentarily, because it wouldn't know when to turn it
      back on.
      
      Which is where this change comes in. By tracking NETDEV_CHANGE,
      NETDEV_UP and NETDEV_GOING_DOWN events on the DSA master, we should know
      the exact interval of time during which this interface is reliably
      available for traffic. Provide this information to switches so they can
      use it as they wish.
      
      An helper is added dsa_port_master_is_operational() to check if a master
      port is operational.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      295ab96f
    • Martin Habets's avatar
      sfc: The size of the RX recycle ring should be more flexible · 000fe940
      Martin Habets authored
      Ideally the size would depend on the link speed, but the recycle
      ring is created when the interface is brought up before the driver
      knows the link speed. So size it for the maximum speed of a given NIC.
      PowerPC is only supported on SFN7xxx and SFN8xxx NICs.
      
      With this patch on a 40G NIC the number of calls to alloc_pages and
      friends went down from about 18% to under 2%.
      On a 10G NIC the number of calls to alloc_pages and friends went down
      from about 15% to 0 (perf did not capture any calls during the 60
      second test).
      On a 100G NIC the number of calls to alloc_pages and friends went down
      from about 23% to 4%.
      Reported-by: default avatarÍñigo Huguet <ihuguet@redhat.com>
      Signed-off-by: default avatarMartin Habets <habetsm.xilinx@gmail.com>
      Link: https://lore.kernel.org/r/20220131111054.cp4f6foyinaarwbn@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      000fe940
    • Heiner Kallweit's avatar
      r8169: support L1.2 control on RTL8168h · 68650b4e
      Heiner Kallweit authored
      According to Realtek RTL8168h supports the same L1.2 control as RTL8125.
      Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
      Link: https://lore.kernel.org/r/4784d5ce-38ac-046a-cbfa-5fdd9773f820@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      68650b4e
    • Jakub Kicinski's avatar
      net: allow SO_MARK with CAP_NET_RAW via cmsg · 91f0d8a4
      Jakub Kicinski authored
      There's not reason SO_MARK would be allowed via setsockopt()
      and not via cmsg, let's keep the two consistent. See
      commit 079925cc ("net: allow SO_MARK with CAP_NET_RAW")
      for justification why NET_RAW -> SO_MARK is safe.
      Reviewed-by: default avatarMaciej Żenczykowski <maze@google.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Link: https://lore.kernel.org/r/20220131233357.52964-1-kuba@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      91f0d8a4
  2. 01 Feb, 2022 16 commits
  3. 31 Jan, 2022 4 commits