1. 16 Aug, 2021 15 commits
    • Vladimir Oltean's avatar
      net: mscc: ocelot: convert to phylink · e6e12df6
      Vladimir Oltean authored
      The felix DSA driver, which is a wrapper over the same hardware class as
      ocelot, is integrated with phylink, but ocelot is using the plain PHY
      library. It makes sense to bring together the two implementations, which
      is what this patch achieves.
      
      This is a large patch and hard to break up, but it does the following:
      
      The existing ocelot_adjust_link writes some registers, and
      felix_phylink_mac_link_up writes some registers, some of them are
      common, but both functions write to some registers to which the other
      doesn't.
      
      The main reasons for this are:
      - Felix switches so far have used an NXP PCS so they had no need to
        write the PCS1G registers that ocelot_adjust_link writes
      - Felix switches have the MAC fixed at 1G, so some of the MAC speed
        changes actually break the link and must be avoided.
      
      The naming conventions for the functions introduced in this patch are:
      - vsc7514_phylink_{mac_config,validate} are specific to the Ocelot
        instantiations and placed in ocelot_net.c which is built only for the
        ocelot switchdev driver.
      - ocelot_phylink_mac_link_{up,down} are shared between the ocelot
        switchdev driver and the felix DSA driver (they are put in the common
        lib).
      
      One by one, the registers written by ocelot_adjust_link are:
      
      DEV_MAC_MODE_CFG - felix_phylink_mac_link_up had no need to write this
                         register since its out-of-reset value was fine and
                         did not need changing. The write is moved to the
                         common ocelot_phylink_mac_link_up and on felix it is
                         guarded by a quirk bit that makes the written value
                         identical with the out-of-reset one
      DEV_PORT_MISC - runtime invariant, was moved to vsc7514_phylink_mac_config
      PCS1G_MODE_CFG - same as above
      PCS1G_SD_CFG - same as above
      PCS1G_CFG - same as above
      PCS1G_ANEG_CFG - same as above
      PCS1G_LB_CFG - same as above
      DEV_MAC_ENA_CFG - both ocelot_adjust_link and ocelot_port_disable
                        touched this. felix_phylink_mac_link_{up,down} also
                        do. We go with what felix does and put it in
                        ocelot_phylink_mac_link_up.
      DEV_CLOCK_CFG - ocelot_adjust_link and felix_phylink_mac_link_up both
                      write this, but to different values. Move to the common
                      ocelot_phylink_mac_link_up and make sure via the quirk
                      that the old values are preserved for both.
      ANA_PFC_PFC_CFG - ocelot_adjust_link wrote this, felix_phylink_mac_link_up
                        did not. Runtime invariant, speed does not matter since
                        PFC is disabled via the RX_PFC_ENA bits which are cleared.
                        Move to vsc7514_phylink_mac_config.
      QSYS_SWITCH_PORT_MODE_PORT_ENA - both ocelot_adjust_link and
                                       felix_phylink_mac_link_{up,down} wrote
                                       this. Ocelot also wrote this register
                                       from ocelot_port_disable. Keep what
                                       felix did, move in ocelot_phylink_mac_link_{up,down}
                                       and delete ocelot_port_disable.
      ANA_POL_FLOWC - same as above
      SYS_MAC_FC_CFG - same as above, except slight behavior change. Whereas
                       ocelot always enabled RX and TX flow control, felix
                       listened to phylink (for the most part, at least - see
                       the 2500base-X comment).
      
      The registers which only felix_phylink_mac_link_up wrote are:
      
      SYS_PAUSE_CFG_PAUSE_ENA - this is why I am not sure that flow control
                                worked on ocelot. Not it should, since the
                                code is shared with felix where it does.
      ANA_PORT_PORT_CFG - this is a Frame Analyzer block register, phylink
                          should be the one touching them, deleted.
      
      Other changes:
      
      - The old phylib registration code was in mscc_ocelot_init_ports. It is
        hard to work with 2 levels of indentation already in, and with hard to
        follow teardown logic. The new phylink registration code was moved
        inside ocelot_probe_port(), right between alloc_etherdev() and
        register_netdev(). It could not be done before (=> outside of)
        ocelot_probe_port() because ocelot_probe_port() allocates the struct
        ocelot_port which we then use to assign ocelot_port->phy_mode to. It
        is more preferable to me to have all PHY handling logic inside the
        same function.
      - On the same topic: struct ocelot_port_private :: serdes is only used
        in ocelot_port_open to set the SERDES protocol to Ethernet. This is
        logically a runtime invariant and can be done just once, when the port
        registers with phylink. We therefore don't even need to keep the
        serdes reference inside struct ocelot_port_private, or to use the devm
        variant of of_phy_get().
      - Phylink needs a valid phy-mode for phylink_create() to succeed, and
        the existing device tree bindings in arch/mips/boot/dts/mscc/ocelot_pcb120.dts
        don't define one for the internal PHY ports. So we patch
        PHY_INTERFACE_MODE_NA into PHY_INTERFACE_MODE_INTERNAL.
      - There was a strategically placed:
      
      	switch (priv->phy_mode) {
      	case PHY_INTERFACE_MODE_NA:
      	        continue;
      
        which made the code skip the serdes initialization for the internal
        PHY ports. Frankly that is not all that obvious, so now we explicitly
        initialize the serdes under an "if" condition and not rely on code
        jumps, so everything is clearer.
      - There was a write of OCELOT_SPEED_1000 to DEV_CLOCK_CFG for QSGMII
        ports. Since that is in fact the default value for the register field
        DEV_CLOCK_CFG_LINK_SPEED, I can only guess the intention was to clear
        the adjacent fields, MAC_TX_RST and MAC_RX_RST, aka take the port out
        of reset, which does match the comment. I don't even want to know why
        this code is placed there, but if there is indeed an issue that all
        ports that share a QSGMII lane must all be up, then this logic is
        already buggy, since mscc_ocelot_init_ports iterates using
        for_each_available_child_of_node, so nobody prevents the user from
        putting a 'status = "disabled";' for some QSGMII ports which would
        break the driver's assumption.
        In any case, in the eventuality that I'm right, we would have yet
        another issue if ocelot_phylink_mac_link_down would reset those ports
        and that would be forbidden, so since the ocelot_adjust_link logic did
        not do that (maybe for a reason), add another quirk to preserve the
        old logic.
      
      The ocelot driver teardown goes through all ports in one fell swoop.
      When initialization of one port fails, the ocelot->ports[port] pointer
      for that is reset to NULL, and teardown is done only for non-NULL ports,
      so there is no reason to do partial teardowns, let the central
      mscc_ocelot_release_ports() do its job.
      
      Tested bind, unbind, rebind, link up, link down, speed change on mock-up
      hardware (modified the driver to probe on Felix VSC9959). Also
      regression tested the felix DSA driver. Could not test the Ocelot
      specific bits (PCS1G, SERDES, device tree bindings).
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e6e12df6
    • Vladimir Oltean's avatar
      net: dsa: felix: stop calling ocelot_port_{enable,disable} · 46efe4ef
      Vladimir Oltean authored
      ocelot_port_enable touches ANA_PORT_PORT_CFG, which has the following
      fields:
      
      - LOCKED_PORTMOVE_CPU, LEARNDROP, LEARNCPU, LEARNAUTO, RECV_ENA, all of
        which are written with their hardware default values, also runtime
        invariants. So it makes no sense to write these during every .ndo_open.
      
      - PORTID_VAL: this field has an out-of-reset value of zero for all ports
        and must be initialized by software. Additionally, the
        ocelot_setup_logical_port_ids() code path sets up different logical
        port IDs for the ports in a hardware LAG, and we absolutely don't want
        .ndo_open to interfere there and reset those values.
      
      So in fact the write from ocelot_port_enable can better be moved to
      ocelot_init_port, and the .ndo_open hook deleted.
      
      ocelot_port_disable touches DEV_MAC_ENA_CFG and QSYS_SWITCH_PORT_MODE_PORT_ENA,
      in an attempt to undo what ocelot_adjust_link did. But since .ndo_stop
      does not get called each time the link falls (i.e. this isn't a
      substitute for .phylink_mac_link_down), felix already does better at
      this by writing those registers already in felix_phylink_mac_link_down.
      
      So keep ocelot_port_disable (for now, until ocelot is converted to
      phylink too), and just delete the felix call to it, which is not
      necessary.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      46efe4ef
    • Changbin Du's avatar
      s390/net: replace in_irq() with in_hardirq() · e871ee69
      Changbin Du authored
      Replace the obsolete and ambiguos macro in_irq() with new
      macro in_hardirq().
      Signed-off-by: default avatarChangbin Du <changbin.du@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e871ee69
    • Vladimir Oltean's avatar
      net: dsa: tag_8021q: fix notifiers broadcast when they shouldn't, and vice versa · b2b89133
      Vladimir Oltean authored
      During the development of the blamed patch, the "bool broadcast"
      argument of dsa_port_tag_8021q_vlan_{add,del} was originally called
      "bool local", and the meaning was the exact opposite.
      
      Due to a rookie mistake where the patch was modified at the last minute
      without retesting, the instances of dsa_port_tag_8021q_vlan_{add,del}
      are called with the wrong values. During setup and teardown, cross-chip
      notifiers should not be broadcast to all DSA trees, while during
      bridging, they should.
      
      Fixes: 724395f4 ("net: dsa: tag_8021q: don't broadcast during setup/teardown")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b2b89133
    • Randy Dunlap's avatar
      ptp: ocp: don't allow on S390 · 944f5101
      Randy Dunlap authored
      Fix kconfig warning on arch/s390/:
      
      WARNING: unmet direct dependencies detected for SERIAL_8250
        Depends on [n]: TTY [=y] && HAS_IOMEM [=y] && !S390 [=y]
        Selected by [m]:
        - PTP_1588_CLOCK_OCP [=m] && PTP_1588_CLOCK [=m] && HAS_IOMEM [=y] && PCI [=y] && SPI [=y] && I2C [=m] && MTD [=m]
      Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Cc: Richard Cochran <richardcochran@gmail.com>
      Cc: Jonathan Lemon <jonathan.lemon@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      944f5101
    • Rao Shoaib's avatar
      af_unix: check socket state when queuing OOB · 19eed721
      Rao Shoaib authored
      edumazet@google.com pointed out that queue_oob
      does not check socket state after acquiring
      the lock. He also pointed to an incorrect usage
      of kfree_skb and an unnecessary setting of skb
      length. This patch addresses those issue.
      Signed-off-by: default avatarRao Shoaib <Rao.Shoaib@oracle.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      19eed721
    • Song Yoong Siang's avatar
      net: phy: marvell: Add WAKE_PHY support to WOL event · 6164659f
      Song Yoong Siang authored
      Add Wake-on-PHY feature support by enabling the Link Up Event.
      Signed-off-by: default avatarSong Yoong Siang <yoong.siang.song@intel.com>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6164659f
    • Wong Vee Khee's avatar
      net: pcs: xpcs: Add Pause Mode support for SGMII and 2500BaseX · 849d2f83
      Wong Vee Khee authored
      SGMII/2500BaseX supports Pause frame as defined in the IEEE802.3x
      Flow Control standardization.
      
      Add this as a supported feature under the xpcs_sgmii_features struct.
      
      Cc: Vladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarWong Vee Khee <vee.khee.wong@linux.intel.com>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      849d2f83
    • David S. Miller's avatar
      Merge branch 'pktgen-samples' · 5fa5fb8b
      David S. Miller authored
      samples: pktgen: enhance the usability of pktgen samples
      
      This patchset improves the usability of pktgen samples by adding an option for
      propagating the environment variable of normal user to sudo. And also adds the
      missing IPv6 option to pktgen scripts.
      
      Currently, all pktgen samples are able to use the environment variable instead
      of optional parameters. However, it doesn't work appropriately when running
      samples as normal user.
      
      This is results of running sample as root and user:
      
          // running as root
          # DEV=eth0 DEST_IP=10.1.0.1 DST_MAC=00:11:22:33:44:55 ./pktgen_sample01_simple.sh -v -n 1
          Running... ctrl^C to stop
      
          // running as normal user
          $ DEV=eth0 DEST_IP=10.1.0.1 DST_MAC=00:11:22:33:44:55 ./pktgen_sample01_simple.sh -v -n 1
          [...]
          ERROR: Please specify output device
      
      The reason why passing the environment varaible doesn't work properly when
      running samples as normal user is that the environment variable of normal user
      doesn't propagate to sudo (root_check_run_with_sudo)). So the first commit
      solves this issue by using "-E" (--preserve-env) option of "sudo", which passes
      normal user's existing environment variables.
      
      Also, "sample04" and "sample05" are not working properly when running with IPv6
      option parameter("-6"). Because the commit 0f06a678 ("samples: Add an IPv6
      "-6" option to the pktgen scripts") has omitted the addition of this option at
      these samples. So the second commit adds missing IPv6 option to pktgen scripts.
      
      ====================
      
      Fixes: 0f06a678 ("samples: Add an IPv6 "-6" option to the pktgen scripts")
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5fa5fb8b
    • Juhee Kang's avatar
      samples: pktgen: add missing IPv6 option to pktgen scripts · 0f0c4f1b
      Juhee Kang authored
      Currently, "sample04" and "sample05" are not working properly when
      running with an IPv6 option("-6"). The commit 0f06a678 ("samples:
      Add an IPv6 "-6" option to the pktgen scripts") has omitted the addition
      of this option at "sample04" and "sample05".
      
      In order to support IPv6 option, this commit adds logic related to IPv6
      option.
      
      Fixes: 0f06a678 ("samples: Add an IPv6 "-6" option to the pktgen scripts")
      Signed-off-by: default avatarJuhee Kang <claudiajkang@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      0f0c4f1b
    • Juhee Kang's avatar
      samples: pktgen: pass the environment variable of normal user to sudo · 7caeabd7
      Juhee Kang authored
      All pktgen samples can use the environment variable instead of option
      parameters(eg. $DEV is able to use instead of '-i' option).
      
      This is results of running sample as root and user:
      
          // running as root
          # DEV=eth0 DEST_IP=10.1.0.1 DST_MAC=00:11:22:33:44:55 ./pktgen_sample01_simple.sh -v -n 1
          Running... ctrl^C to stop
      
          // running as normal user
          $ DEV=eth0 DEST_IP=10.1.0.1 DST_MAC=00:11:22:33:44:55 ./pktgen_sample01_simple.sh -v -n 1
          [...]
          ERROR: Please specify output device
      
      This results show the sample doesn't work properly when the sample runs
      as normal user. Because the sample is restarted by the function
      (root_check_run_with_sudo) to run with sudo. In this process, the
      environment variable of normal user doesn't propagate to sudo.
      
      It can be solved by using "-E"(--preserve-env) option of "sudo", which
      preserve normal user's existing environment variables. So this commit
      adds "-E" option in the function (root_check_run_with_sudo).
      Signed-off-by: default avatarJuhee Kang <claudiajkang@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7caeabd7
    • David S. Miller's avatar
      Merge branch 'ipq-mdio' · cbbb7abd
      David S. Miller authored
      Luo Jie says:
      
      ====================
      net: mdio: Add IPQ MDIO reset related function
      
      This patch series add the MDIO reset features, which includes
      configuring MDIO clock source frequency and indicating CMN_PLL that
      ethernet LDO has been ready, this ethernet LDO is dedicated in the
      IPQ5018 platform.
      
      Specify more chipset IPQ40xx, IPQ807x, IPQ60xx and IPQ50xx supported by
      this MDIO driver.
      
      Changes in v3:
      	* simplify the function ipq_mdio_reset.
      
      Changes in v2:
      	* Addressed review comments (Andrew Lunn).
      	* Remove the IS_ERR().
      	* make binding patch part of series.
      	* document the property 'reg' and 'clock'.
      
      Changes in v1:
      	* make MDIO_IPQ4019 unchanged for backwards compatibility.
      	* remove the PHY reset functions
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cbbb7abd
    • Luo Jie's avatar
      dt-bindings: net: Add the properties for ipq4019 MDIO · 2a4c32e7
      Luo Jie authored
      The new added properties resource "reg" is for configuring
      ethernet LDO in the IPQ5018 chipset, the property "clocks"
      is for configuring the MDIO clock source frequency.
      Signed-off-by: default avatarLuo Jie <luoj@codeaurora.org>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2a4c32e7
    • Luo Jie's avatar
      MDIO: Kconfig: Specify more IPQ chipset supported · c76ee263
      Luo Jie authored
      The IPQ MDIO driver currently supports the chipset IPQ40xx, IPQ807x,
      IPQ60xx and IPQ50xx.
      
      Add the compatible 'qcom,ipq5018-mdio' because of ethernet LDO dedicated
      to the IPQ5018 platform.
      Signed-off-by: default avatarLuo Jie <luoj@codeaurora.org>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c76ee263
    • Luo Jie's avatar
      net: mdio: Add the reset function for IPQ MDIO driver · 23a890d4
      Luo Jie authored
      1. configure the MDIO clock source frequency.
      2. the LDO resource is needed to configure the ethernet LDO available
      for CMN_PLL.
      Signed-off-by: default avatarLuo Jie <luoj@codeaurora.org>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      23a890d4
  2. 14 Aug, 2021 25 commits
    • Cai Huoqing's avatar
      MAINTAINERS: Remove the ipx network layer info · e4637f62
      Cai Huoqing authored
      commit <47595e32> ("<MAINTAINERS: Mark some staging directories>")
      indicated the ipx network layer as obsolete in Jan 2018,
      updated in the MAINTAINERS file.
      
      now, after being exposed for 3 years to refactoring, so to
      remove the ipx network layer info from MAINTAINERS.
      additionally, there is no module that depends on ipx.h
      except a broken staging driver(r8188eu)
      Signed-off-by: default avatarCai Huoqing <caihuoqing@baidu.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e4637f62
    • Cai Huoqing's avatar
      net: Remove net/ipx.h and uapi/linux/ipx.h header files · 6c9b4084
      Cai Huoqing authored
      commit <47595e32> ("<MAINTAINERS: Mark some staging directories>")
      indicated the ipx network layer as obsolete in Jan 2018,
      updated in the MAINTAINERS file
      
      now, after being exposed for 3 years to refactoring, so to
      delete uapi/linux/ipx.h and net/ipx.h header files for good.
      additionally, there is no module that depends on ipx.h except
      a broken staging driver(r8188eu)
      Signed-off-by: default avatarCai Huoqing <caihuoqing@baidu.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6c9b4084
    • David S. Miller's avatar
      Merge branch 'iupa-last-things-before-pm-conversion' · fda4e19d
      David S. Miller authored
      Alex Elder says:
      
      ====================
      net: ipa: last things before PM conversion
      
      This series contains a few remaining changes needed before fully
      switching over to using runtime power management rather than the
      previous "IPA clock" mechanism.
      
      The first patch moves the calls to enable and disable the IPA
      interrupt as a system wakeup interrupt into "ipa_clock.c" with the
      rest of the power-related code.
      
      The second adds a flag to make it possible to distinguish runtime
      suspend from system suspend.
      
      The third and fourth patches arrange for the ->start_xmit path to
      resume hardware if necessary, to ensure it is powered.  If power is
      not active, the TX queue is stopped, and arrangements are made for
      the queue to be restarted once hardware power is active again.
      
      The fifth patch keeps the TX queue active during suspend.  This
      isn't necessary for system suspend but it's important for runtime
      suspend.
      
      And the last patch makes it so we don't hold the hardware active
      while the modem network device is open.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      fda4e19d
    • Alex Elder's avatar
      net: ipa: don't hold clock reference while netdev open · 8dc181f2
      Alex Elder authored
      Currently a clock reference is taken whenever the ->ndo_open
      callback for the modem netdev is called.  That reference is dropped
      when the device is closed, in ipa_stop().
      
      We no longer need this, because ipa_start_xmit() now handles the
      situation where the hardware power state is not active.
      
      Drop the clock reference in ipa_open() when we're done, and take a
      new reference in ipa_stop() before we begin closing the interface.
      
      Finally (and unrelated, but trivial), change the return type of
      ipa_start_xmit() to be netdev_tx_t instead of int.
      Signed-off-by: default avatarAlex Elder <elder@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8dc181f2
    • Alex Elder's avatar
      net: ipa: don't stop TX on suspend · 8dcf8bb3
      Alex Elder authored
      Currently we stop the modem netdev transmit queue when suspending
      the hardware.  For system suspend this ensured we'd never attempt
      to transmit while attempting to suspend the modem endpoints.
      
      For runtime suspend, the IPA hardware might get suspended while the
      system is operating.  In that case we want an attempt to transmit a
      packet to cause the hardware to resume if necessary.  But if we
      disable the queue this cannot happen.
      
      So stop disabling the queue on suspend.  In case we end up disabling
      it in ipa_start_xmit() (see the previous commit), we still arrange
      to start the TX queue on resume.
      Signed-off-by: default avatarAlex Elder <elder@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8dcf8bb3
    • Alex Elder's avatar
      net: ipa: ensure hardware has power in ipa_start_xmit() · 6b51f802
      Alex Elder authored
      We need to ensure the hardware is powered when we transmit a packet.
      But if it's not, we can't block to wait for it.  So asynchronously
      request power in ipa_start_xmit(), and only proceed if the return
      value indicates the power state is active.
      
      If the hardware is not active, a runtime resume request will have
      been initiated.  In that case, stop the network stack from further
      transmit attempts until the resume completes.  Return NETDEV_TX_BUSY,
      to retry sending the packet once the queue is restarted.
      
      If the power request returns an error (other than -EINPROGRESS,
      which just means a resume requested elsewhere isn't complete), just
      drop the packet.
      Signed-off-by: default avatarAlex Elder <elder@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6b51f802
    • Alex Elder's avatar
      net: ipa: re-enable transmit in PM WQ context · a96e73fa
      Alex Elder authored
      Create a new work structure in the modem private data, and use it to
      re-enable the modem network device transmit queue when resuming.
      
      This is needed by the next patch, which stops the TX queue if IPA
      power isn't active when a transmit request arrives.  Packets will
      start arriving the instant the TX queue is enabled, but resuming
      isn't complete until ipa_modem_resume() returns.  This way we're
      sure to be resumed before transmits are allowed again.
      
      Cancel it before calling ipa_stop() in ipa_modem_stop() to ensure
      the transmit queue restart completes before it gets stopped there.
      Signed-off-by: default avatarAlex Elder <elder@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a96e73fa
    • Alex Elder's avatar
      net: ipa: distinguish system from runtime suspend · b9c532c1
      Alex Elder authored
      Add a new flag that is set when the hardware is suspended due to a
      system suspend operation, distingishing it from runtime suspend.
      Use it in the SUSPEND IPA interrupt handler to determine whether to
      trigger a system resume because of the event.  Define new suspend
      and resume power management callback functions to set and clear the
      new flag, respectively.
      Signed-off-by: default avatarAlex Elder <elder@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b9c532c1
    • Alex Elder's avatar
      net: ipa: enable wakeup in ipa_power_setup() · d430fe4b
      Alex Elder authored
      Move the call to enable the IPA interrupt as a wakeup interrupt into
      ipa_power_setup(), disable it in ipa_power_teardown().
      Signed-off-by: default avatarAlex Elder <elder@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d430fe4b
    • David S. Miller's avatar
      Merge branch 'bridgge-mcast' · 8db102a6
      David S. Miller authored
      Nikolay Aleksandrov says:
      
      ====================
      net: bridge: mcast: dump querier state
      
      This set adds the ability to dump the current multicast querier state.
      This is extremely useful when debugging multicast issues, we've had
      many cases of unexpected queriers causing strange behaviour and mcast
      test failures. The first patch changes the querier struct to record
      a port device's ifindex instead of a pointer to the port itself so we
      can later retrieve it, I chose this way because it's much simpler
      and doesn't require us to do querier port ref counting, it is best
      effort anyway. Then patch 02 makes the querier address/port updates
      consistent via a combination of multicast_lock and seqcount, so readers
      can only use seqcount to get a consistent snapshot of address and port.
      Patch 03 is a minor cleanup in preparation for the dump support, it
      consolidates IPv4 and IPv6 querier selection paths as they share most of
      the logic (except address comparisons of course). Finally the last three
      patches add the new querier state dumping support, for the bridge's
      global multicast context we embed the BRIDGE_QUERIER_xxx attributes
      into IFLA_BR_MCAST_QUERIER_STATE and for the per-vlan global mcast
      contexts we embed them into BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_STATE.
      
      The structure is:
        [IFLA_BR_MCAST_QUERIER_STATE / BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_STATE]
        `[BRIDGE_QUERIER_IP_ADDRESS] - ip address of the querier
        `[BRIDGE_QUERIER_IP_PORT]    - bridge port ifindex where the querier was
                                       seen (set only if external querier)
        `[BRIDGE_QUERIER_IP_OTHER_TIMER]   -  other querier timeout
        `[BRIDGE_QUERIER_IPV6_ADDRESS] - ip address of the querier
        `[BRIDGE_QUERIER_IPV6_PORT]    - bridge port ifindex where the querier
                                         was seen (set only if external querier)
        `[BRIDGE_QUERIER_IPV6_OTHER_TIMER]   -  other querier timeout
      
      Later we can also add IGMP version of seen queriers and last seen values
      from the queries.
      ====================
      8db102a6
    • Nikolay Aleksandrov's avatar
      net: bridge: vlan: dump mcast ctx querier state · ddc649d1
      Nikolay Aleksandrov authored
      Use the new mcast querier state dump infrastructure and export vlans'
      mcast context querier state embedded in attribute
      BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_STATE.
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ddc649d1
    • Nikolay Aleksandrov's avatar
      net: bridge: mcast: dump ipv6 querier state · 85b41082
      Nikolay Aleksandrov authored
      Add support for dumping global IPv6 querier state, we dump the state
      only if our own querier is enabled or there has been another external
      querier which has won the election. For the bridge global state we use
      a new attribute IFLA_BR_MCAST_QUERIER_STATE and embed the state inside.
      The structure is:
        [IFLA_BR_MCAST_QUERIER_STATE]
         `[BRIDGE_QUERIER_IPV6_ADDRESS] - ip address of the querier
         `[BRIDGE_QUERIER_IPV6_PORT]    - bridge port ifindex where the querier
                                          was seen (set only if external querier)
         `[BRIDGE_QUERIER_IPV6_OTHER_TIMER]   -  other querier timeout
      
      IPv4 and IPv6 attributes are embedded at the same level of
      IFLA_BR_MCAST_QUERIER_STATE. If we didn't dump anything we cancel the nest
      and return.
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      85b41082
    • Nikolay Aleksandrov's avatar
      net: bridge: mcast: dump ipv4 querier state · c7fa1d9b
      Nikolay Aleksandrov authored
      Add support for dumping global IPv4 querier state, we dump the state
      only if our own querier is enabled or there has been another external
      querier which has won the election. For the bridge global state we use
      a new attribute IFLA_BR_MCAST_QUERIER_STATE and embed the state inside.
      The structure is:
       [IFLA_BR_MCAST_QUERIER_STATE]
        `[BRIDGE_QUERIER_IP_ADDRESS] - ip address of the querier
        `[BRIDGE_QUERIER_IP_PORT]    - bridge port ifindex where the querier was
                                       seen (set only if external querier)
        `[BRIDGE_QUERIER_IP_OTHER_TIMER]   -  other querier timeout
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c7fa1d9b
    • Nikolay Aleksandrov's avatar
      net: bridge: mcast: consolidate querier selection for ipv4 and ipv6 · c3fb3698
      Nikolay Aleksandrov authored
      We can consolidate both functions as they share almost the same logic.
      This is easier to maintain and we have a single querier update function.
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c3fb3698
    • Nikolay Aleksandrov's avatar
      net: bridge: mcast: make sure querier port/address updates are consistent · 67b746f9
      Nikolay Aleksandrov authored
      Use a sequence counter to make sure port/address updates can be read
      consistently without requiring the bridge multicast_lock. We need to
      zero out the port and address when the other querier has expired and
      we're about to select ourselves as querier. br_multicast_read_querier
      will be used later when dumping querier state. Updates are done only
      with the multicast spinlock and softirqs disabled, while reads are done
      from process context and from softirqs (due to notifications).
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      67b746f9
    • Nikolay Aleksandrov's avatar
      net: bridge: mcast: record querier port device ifindex instead of pointer · bb18ef8e
      Nikolay Aleksandrov authored
      Currently when a querier port is detected its net_bridge_port pointer is
      recorded, but it's used only for comparisons so it's fine to have stale
      pointer, in order to dereference and use the port pointer a proper
      accounting of its usage must be implemented adding unnecessary
      complexity. To solve the problem we can just store the netdevice ifindex
      instead of the port pointer and retrieve the bridge port. It is a best
      effort and the device needs to be validated that is still part of that
      bridge before use, but that is small price to pay for avoiding querier
      reference counting for each port/vlan.
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      bb18ef8e
    • David S. Miller's avatar
      Merge branch 'devlink-cleanup-for-delay-event' · 2fa16787
      David S. Miller authored
      Leon Romanovsky says:
      
      ====================
      Devlink cleanup for delay event series
      
      Jakub's request to make sure that devlink events are delayed and not
      printed till they fully accessible [1] requires us to implement delayed
      event notification system in the devlink.
      
      In order to do it, I moved some of my patches (xarray e.t.c) from the future
      series to be before "Move devlink_register to be near devlink_reload_enable" [2].
      
      That allows us to rely on DEVLINK_REGISTERED xarray mark to decide if to print
      event or not.
      
      Other patches are simple cleanup which is needed anyway.
      
      [1] https://lore.kernel.org/lkml/20210811071817.4af5ab34@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com
      [2] https://lore.kernel.org/lkml/cover.1628599239.git.leonro@nvidia.com
      
      Next in the queue:
       * Delay event series
       * Move devlink_register to be near devlink_reload_enable"
       * Extension of devlink_ops to be set dynamically
       * devlink_reload_* delete
       * Devlink locks rework to user xarray and reference counting
       * ????
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2fa16787
    • Leon Romanovsky's avatar
      net: hns3: remove always exist devlink pointer check · a1fcb106
      Leon Romanovsky authored
      The devlink pointer always exists after hclge_devlink_init() succeed.
      Remove that check together with NULL setting after release and ensure
      that devlink_register is last command prior to call to devlink_reload_enable().
      
      Fixes: b741269b ("net: hns3: add support for registering devlink for PF")
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a1fcb106
    • Leon Romanovsky's avatar
      devlink: Clear whole devlink_flash_notify struct · ed43fbac
      Leon Romanovsky authored
      The { 0 } doesn't clear all fields in the struct, but tells to the
      compiler to set all fields to zero and doesn't touch any sub-fields
      if they exists.
      
      The {} is an empty initialiser that instructs to fully initialize whole
      struct including sub-fields, which is error-prone for future
      devlink_flash_notify extensions.
      
      Fixes: 6700acc5 ("devlink: collect flash notify params into a struct")
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ed43fbac
    • Leon Romanovsky's avatar
      devlink: Use xarray to store devlink instances · 11a861d7
      Leon Romanovsky authored
      We can use xarray instead of linearly organized linked lists for the
      devlink instances. This will let us revise the locking scheme in favour
      of internal xarray locking that protects database.
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      11a861d7
    • Leon Romanovsky's avatar
      devlink: Count struct devlink consumers · 437ebfd9
      Leon Romanovsky authored
      The struct devlink itself is protected by internal lock and doesn't
      need global lock during operation. That global lock is used to protect
      addition/removal new devlink instances from the global list in use by
      all devlink consumers in the system.
      
      The future conversion of linked list to be xarray will allow us to
      actually delete that lock, but first we need to count all struct devlink
      users.
      
      The reference counting provides us a way to ensure that no new user
      space commands success to grab devlink instance which is going to be
      destroyed makes it is safe to access it without lock.
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      437ebfd9
    • Leon Romanovsky's avatar
      devlink: Remove check of always valid devlink pointer · 7ca973dc
      Leon Romanovsky authored
      Devlink objects are accessible only after they were registered and
      have valid devlink_*->devlink pointers.
      
      Remove that check and simplify respective fill functions as an outcome
      of such change.
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7ca973dc
    • Leon Romanovsky's avatar
      devlink: Simplify devlink_pernet_pre_exit call · cbf6ab67
      Leon Romanovsky authored
      The devlink_pernet_pre_exit() will be called if net namespace exits.
      
      That routine is relevant for devlink instances that were assigned to
      that namespaces first. This assignment is possible only with the following
      command: "devlink reload DEV netns ...", which already checks reload support.
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cbf6ab67
    • David S. Miller's avatar
      Merge branch 'mptcp-improve-backup-subflows' · 38e3bfa8
      David S. Miller authored
      Mat Martineau says:
      
      ====================
      mptcp: Improve use of backup subflows
      
      Multipath TCP combines multiple TCP subflows in to one stream, and the
      MPTCP-level socket must decide which subflow to use when sending (or
      resending) chunks of data. The choice of the "best" subflow to transmit
      on can vary depending on the priority (normal or backup) for each
      subflow and how well the subflow is performing.
      
      In order to improve MPTCP performance when some subflows are failing,
      this patch set changes how backup subflows are utilized and introduces
      tracking of "stale" subflows that are still connected but not making
      progress.
      
      Patch 1 adjusts MPTCP-level retransmit timeouts to use data from all
      subflows.
      
      Patch 2 makes MPTCP-level retransmissions less aggressive to avoid
      resending data that's still queued at the TCP level.
      
      Patch 3 changes the way pending data is handled when subflows are
      closed. Unacked MPTCP-level data still in the subflow tx queue is
      immediately moved to another subflow for transmission instead of waiting
      for MPTCP-level timeouts to trigger retransmission.
      
      Patch 4 has some sysctl code cleanup.
      
      Patches 5 and 6 add tracking of "stale" subflows, so only underlying TCP
      subflow connections that appear to be making progress are considered
      when selecting a subflow to (re)transmit data. How fast a subflow goes
      stale is configurable with a per-namespace sysctl. Related MIBS are
      added too.
      
      Patch 7 makes sure the backup flag is always correctly recorded when the
      MP_JOIN SYN/ACK is received for an added subflow.
      
      Patch 8 adds more test cases for backup subflows and stale subflows.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      38e3bfa8
    • Paolo Abeni's avatar
      selftests: mptcp: add testcase for active-back · 7d1e6f16
      Paolo Abeni authored
      Add more test-case for link failures scenario,
      including recovery from link failure using only
      backup subflows and bi-directional transfer.
      
      Additionally explicitly check for stale count
      Co-developed-by: default avatarGeliang Tang <geliangtang@gmail.com>
      Signed-off-by: default avatarGeliang Tang <geliangtang@gmail.com>
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7d1e6f16