1. 02 Jul, 2019 40 commits
    • Colin Ian King's avatar
      nfc: st-nci: remove redundant assignment to variable r · 23ec8eaf
      Colin Ian King authored
      The variable r is being initialized with a value that is never
      read and it is being updated later with a new value. The
      initialization is redundant and can be removed.
      
      Addresses-Coverity: ("Unused value")
      Signed-off-by: default avatarColin Ian King <colin.king@canonical.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      23ec8eaf
    • Xue Chaojing's avatar
      hinic: remove standard netdev stats · 83b6a85b
      Xue Chaojing authored
      This patch removes standard netdev stats in ethtool -S.
      Suggested-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
      Signed-off-by: default avatarXue Chaojing <xuechaojing@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      83b6a85b
    • Jose Abreu's avatar
      net: stmmac: Re-word Kconfig entry · b432bdb6
      Jose Abreu authored
      We support many speeds and it doesn't make much sense to list them all
      in the Kconfig. Let's just call it Multi-Gigabit.
      Suggested-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarJose Abreu <joabreu@synopsys.com>
      Cc: Joao Pinto <jpinto@synopsys.com>
      Cc: David S. Miller <davem@davemloft.net>
      Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
      Cc: Alexandre Torgue <alexandre.torgue@st.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b432bdb6
    • David S. Miller's avatar
      Merge branch 'Add-gve-driver' · 337d1ccb
      David S. Miller authored
      Catherine Sullivan says:
      
      ====================
      Add gve driver
      
      This patch series adds the gve driver which will support the
      Compute Engine Virtual NIC that will be available in the future.
      
      v2:
      - Patch 1:
        - Remove gve_size_assert.h and use static_assert instead.
        - Loop forever instead of bugging if the device won't reset
        - Use module_pci_driver
      - Patch 2:
        - Use be16_to_cpu in the RX Seq No define
        - Remove unneeded ndo_change_mtu
      - Patch 3:
        - No Changes
      - Patch 4:
        - Instead of checking netif_carrier_ok in ethtool stats, just make sure
      
      v3:
      - Patch 1:
        - Remove X86 dep
      - Patch 2:
        - No changes
      - Patch 3:
        - No changes
      - Patch 4:
        - Remove unneeded memsets in ethtool stats
      
      v4:
      - Patch 1:
        - Use io[read|write]32be instead of [read|write]l(cpu_to_be32())
        - Explicitly add padding to gve_adminq_set_driver_parameter
        - Use static where appropriate
      - Patch 2:
        - Use u64_stats_sync
        - Explicity add padding to gve_adminq_create_rx_queue
        - Fix some enianness typing issues found by kbuild
        - Use static where appropriate
        - Remove unused variables
      - Patch 3:
        - Use io[read|write]32be instead of [read|write]l(cpu_to_be32())
      - Patch 4:
        - Use u64_stats_sync
        - Use static where appropriate
      Warnings reported by:
      Reported-by: default avatarkbuild test robot <lkp@intel.com>
      Reported-by: default avatarJulia Lawall <julia.lawall@lip6.fr>
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      337d1ccb
    • Catherine Sullivan's avatar
      gve: Add ethtool support · e5b845dc
      Catherine Sullivan authored
      Add support for the following ethtool commands:
      
      ethtool -s|--change devname [msglvl N] [msglevel type on|off]
      ethtool -S|--statistics devname
      ethtool -i|--driver devname
      ethtool -l|--show-channels devname
      ethtool -L|--set-channels devname
      ethtool -g|--show-ring devname
      ethtool --reset devname
      Signed-off-by: default avatarCatherine Sullivan <csully@google.com>
      Signed-off-by: default avatarSagi Shahar <sagis@google.com>
      Signed-off-by: default avatarJon Olson <jonolson@google.com>
      Acked-by: default avatarWillem de Bruijn <willemb@google.com>
      Reviewed-by: default avatarLuigi Rizzo <lrizzo@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e5b845dc
    • Catherine Sullivan's avatar
      gve: Add workqueue and reset support · 9e5f7d26
      Catherine Sullivan authored
      Add support for the workqueue to handle management interrupts and
      support for resets.
      Signed-off-by: default avatarCatherine Sullivan <csully@google.com>
      Signed-off-by: default avatarSagi Shahar <sagis@google.com>
      Signed-off-by: default avatarJon Olson <jonolson@google.com>
      Acked-by: default avatarWillem de Bruijn <willemb@google.com>
      Reviewed-by: default avatarLuigi Rizzo <lrizzo@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9e5f7d26
    • Catherine Sullivan's avatar
      gve: Add transmit and receive support · f5cedc84
      Catherine Sullivan authored
      Add support for passing traffic.
      Signed-off-by: default avatarCatherine Sullivan <csully@google.com>
      Signed-off-by: default avatarSagi Shahar <sagis@google.com>
      Signed-off-by: default avatarJon Olson <jonolson@google.com>
      Acked-by: default avatarWillem de Bruijn <willemb@google.com>
      Reviewed-by: default avatarLuigi Rizzo <lrizzo@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      f5cedc84
    • Catherine Sullivan's avatar
      gve: Add basic driver framework for Compute Engine Virtual NIC · 893ce44d
      Catherine Sullivan authored
      Add a driver framework for the Compute Engine Virtual NIC that will be
      available in the future.
      
      At this point the only functionality is loading the driver.
      Signed-off-by: default avatarCatherine Sullivan <csully@google.com>
      Signed-off-by: default avatarSagi Shahar <sagis@google.com>
      Signed-off-by: default avatarJon Olson <jonolson@google.com>
      Acked-by: default avatarWillem de Bruijn <willemb@google.com>
      Reviewed-by: default avatarLuigi Rizzo <lrizzo@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      893ce44d
    • David S. Miller's avatar
      Merge branch 'blackhole-device-to-invalidate-dst' · 2a8d8e0f
      David S. Miller authored
      Mahesh Bandewar says:
      
      ====================
      blackhole device to invalidate dst
      
      When we invalidate dst or mark it "dead", we assign 'lo' to
      dst->dev. First of all this assignment is racy and more over,
      it has MTU implications.
      
      The standard dev MTU is 1500 while the Loopback MTU is 64k. TCP
      code when dereferencing the dst don't check if the dst is valid
      or not. TCP when dereferencing a dead-dst while negotiating a
      new connection, may use dst device which is 'lo' instead of
      using the correct device. Consider the following scenario:
      
      A SYN arrives on an interface and tcp-layer while processing
      SYNACK finds a dst and associates it with SYNACK skb. Now before
      skb gets passed to L3 for processing, if that dst gets "dead"
      (because of the virtual device getting disappeared & then reappeared),
      the 'lo' gets assigned to that dst (lo MTU = 64k). Let's assume
      the SYN has ADV_MSS set as 9k while the output device through
      which this SYNACK is going to go out has standard MTU of 1500.
      The MTU check during the route check passes since MIN(9K, 64K)
      is 9k and TCP successfully negotiates 9k MSS. The subsequent
      data packet; bigger in size gets passed to the device and it
      won't be marked as GSO since the assumed MTU of the device is
      9k.
      
      This either crashes the NIC and we have seen fixes that went
      into drivers to handle this scenario. 8914a595 ('bnx2x:
      disable GSO where gso_size is too big for hardware') and
      2b16f048 ('net: create skb_gso_validate_mac_len()') and
      with those fixes TCP eventually recovers but not before
      few dropped segments.
      
      Well, I'm not a TCP expert and though we have experienced
      these corner cases in our environment, I could not reproduce
      this case reliably in my test setup to try this fix myself.
      However, Michael Chan <michael.chan@broadcom.com> had a setup
      where these fixes helped him mitigate the issue and not cause
      the crash.
      
      The idea here is to not alter the data-path with additional
      locks or smb()/rmb() barriers to avoid racy assignments but
      to create a new device that has really low MTU that has
      .ndo_start_xmit essentially a kfree_skb(). Make use of this
      device instead of 'lo' when marking the dst dead.
      
      First patch implements the blackhole device and second
      patch uses it in IPv4 and IPv6 stack while the third patch
      is the self test that ensures the sanity of this device.
      
      v1->v2
        fixed the self-test patch to handle the conflict
      
      v2 -> v3
        fixed Kconfig text/string.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2a8d8e0f
    • Mahesh Bandewar's avatar
      blackhole_dev: add a selftest · 509e56b3
      Mahesh Bandewar authored
      Since this is not really a device with all capabilities, this test
      ensures that it has *enough* to make it through the data path
      without causing unwanted side-effects (read crash!).
      Signed-off-by: default avatarMahesh Bandewar <maheshb@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      509e56b3
    • Mahesh Bandewar's avatar
      blackhole_netdev: use blackhole_netdev to invalidate dst entries · 8d7017fd
      Mahesh Bandewar authored
      Use blackhole_netdev instead of 'lo' device with lower MTU when marking
      dst "dead".
      Signed-off-by: default avatarMahesh Bandewar <maheshb@google.com>
      Tested-by: default avatarMichael Chan <michael.chan@broadcom.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8d7017fd
    • Mahesh Bandewar's avatar
      loopback: create blackhole net device similar to loopack. · 4de83b88
      Mahesh Bandewar authored
      Create a blackhole net device that can be used for "dead"
      dst entries instead of loopback device. This blackhole device differs
      from loopback in few aspects: (a) It's not per-ns. (b)  MTU on this
      device is ETH_MIN_MTU (c) The xmit function is essentially kfree_skb().
      and (d) since it's not registered it won't have ifindex.
      
      Lower MTU effectively make the device not pass the MTU check during
      the route check when a dst associated with the skb is dead.
      Signed-off-by: default avatarMahesh Bandewar <maheshb@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4de83b88
    • Hariprasad Kelam's avatar
      net: ethernet: broadcom: bcm63xx_enet: Remove unneeded memset · 8909783c
      Hariprasad Kelam authored
      Remove unneeded memset as alloc_etherdev is using kvzalloc which uses
      __GFP_ZERO flag
      Signed-off-by: default avatarHariprasad Kelam <hariprasad.kelam@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8909783c
    • David S. Miller's avatar
      Merge branch 'net-netsec-Add-XDP-Support' · fec3b9ec
      David S. Miller authored
      Ilias Apalodimas says:
      
      ====================
      net: netsec: Add XDP Support
      
      This is a respin of https://www.spinics.net/lists/netdev/msg526066.html
      Since page_pool API fixes are merged into net-next we can now safely use
      it's DMA mapping capabilities.
      
      First patch changes the buffer allocation from napi/netdev_alloc_frag()
      to page_pool API. Although this will lead to slightly reduced performance
      (on raw packet drops only) we can use the API for XDP buffer recycling.
      Another side effect is a slight increase in memory usage, due to using a
      single page per packet.
      
      The second patch adds XDP support on the driver.
      There's a bunch of interesting options that come up due to the single
      Tx queue.
      Locking is needed(to avoid messing up the Tx queues since ndo_xdp_xmit
      and the normal stack can co-exist). We also need to track down the
      'buffer type' for TX and properly free or recycle the packet depending
      on it's nature.
      
      Changes since RFC:
      - Bug fixes from Jesper and Maciej
      - Added page pool API to retrieve the DMA direction
      
      Changes since v1:
      - Use page_pool_free correctly if xdp_rxq_info_reg() failed
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      fec3b9ec
    • Ilias Apalodimas's avatar
      net: netsec: add XDP support · ba2b2321
      Ilias Apalodimas authored
      The interface only supports 1 Tx queue so locking is introduced on
      the Tx queue if XDP is enabled to make sure .ndo_start_xmit and
      .ndo_xdp_xmit won't corrupt Tx ring
      
      - Performance (SMMU off)
      
      Benchmark   XDP_SKB     XDP_DRV
      xdp1        291kpps     344kpps
      rxdrop      282kpps     342kpps
      
      - Performance (SMMU on)
      Benchmark   XDP_SKB     XDP_DRV
      xdp1        167kpps     324kpps
      rxdrop      164kpps     323kpps
      Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
      Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ba2b2321
    • Ilias Apalodimas's avatar
      net: page_pool: add helper function for retrieving dma direction · bb005f2a
      Ilias Apalodimas authored
      Since the dma direction is stored in page pool params, offer an API
      helper for driver that choose not to keep track of it locally
      Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
      Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      bb005f2a
    • Ilias Apalodimas's avatar
      net: netsec: Use page_pool API · 5c67bf0e
      Ilias Apalodimas authored
      Use page_pool and it's DMA mapping capabilities for Rx buffers instead
      of netdev/napi_alloc_frag()
      
      Although this will result in a slight performance penalty on small sized
      packets (~10%) the use of the API will allow to easily add XDP support.
      The penalty won't be visible in network testing i.e ipef/netperf etc, it
      only happens during raw packet drops.
      Furthermore we intend to add recycling capabilities on the API
      in the future. Once the recycling is added the performance penalty will
      go away.
      The only 'real' penalty is the slightly increased memory usage, since we
      now allocate a page per packet instead of the amount of bytes we need +
      skb metadata (difference is roughly 2kb per packet).
      With a minimum of 4BG of RAM on the only SoC that has this NIC the
      extra memory usage is negligible (a bit more on 64K pages)
      Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
      Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5c67bf0e
    • Roman Mashak's avatar
      a8488b70
    • David S. Miller's avatar
      Merge branch 'mirred-batch-fixes' · c8881faf
      David S. Miller authored
      Roman Mashak says:
      
      ====================
      Fix batched event generation for mirred action
      
      When adding or deleting a batch of entries, the kernel sends upto
      TCA_ACT_MAX_PRIO entries in an event to user space. However it does not
      consider that the action sizes may vary and require different skb sizes.
      
      For example :
      
      % cat tc-batch.sh
      TC="sudo /mnt/iproute2.git/tc/tc"
      
      $TC actions flush action mirred
      for i in `seq 1 $1`;
      do
         cmd="action mirred egress redirect dev lo index $i "
         args=$args$cmd
      done
      $TC actions add $args
      %
      % ./tc-batch.sh 32
      Error: Failed to fill netlink attributes while adding TC action.
      We have an error talking to the kernel
      %
      
      patch 1 adds callback in tc_action_ops of mirred action, which calculates
      the action size, and passes size to tcf_add_notify()/tcf_del_notify().
      
      patch 2 updates the TDC test suite with relevant test cases.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c8881faf
    • Roman Mashak's avatar
    • Roman Mashak's avatar
      net sched: update mirred action for batched events operations · b84b2d4e
      Roman Mashak authored
      Add get_fill_size() routine used to calculate the action size
      when building a batch of events.
      Signed-off-by: default avatarRoman Mashak <mrv@mojatatu.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b84b2d4e
    • Jason A. Donenfeld's avatar
      netlink: use 48 byte ctx instead of 6 signed longs for callback · 362b87f5
      Jason A. Donenfeld authored
      People are inclined to stuff random things into cb->args[n] because it
      looks like an array of integers. Sometimes people even put u64s in there
      with comments noting that a certain member takes up two slots. The
      horror! Really this should mirror the usage of skb->cb, which are just
      48 opaque bytes suitable for casting a struct. Then people can create
      their usual casting macros for accessing strongly typed members of a
      struct.
      
      As a plus, this also gives us the same amount of space on 32bit and 64bit.
      Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
      Reviewed-by: default avatarJohannes Berg <johannes@sipsolutions.net>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      362b87f5
    • Jon Maloy's avatar
      tipc: embed jiffies in macro TIPC_BC_RETR_LIM · 53962bce
      Jon Maloy authored
      The macro TIPC_BC_RETR_LIM is always used in combination with 'jiffies',
      so we can just as well perform the addition in the macro itself. This
      way, we get a few shorter code lines and one less line break.
      Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
      Acked-by: default avatarYing Xue <ying.xue@windriver.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      53962bce
    • Eiichi Tsukata's avatar
      net/ipv6: Fix misuse of proc_dointvec "flowlabel_reflect" · 00dc3307
      Eiichi Tsukata authored
      /proc/sys/net/ipv6/flowlabel_reflect assumes written value to be in the
      range of 0 to 3. Use proc_dointvec_minmax instead of proc_dointvec.
      
      Fixes: 323a53c4 ("ipv6: tcp: enable flowlabel reflection in some RST packets")
      Signed-off-by: default avatarEiichi Tsukata <devel@etsukata.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      00dc3307
    • Yunsheng Lin's avatar
      net: link_watch: prevent starvation when processing linkwatch wq · 27ba4059
      Yunsheng Lin authored
      When user has configured a large number of virtual netdev, such
      as 4K vlans, the carrier on/off operation of the real netdev
      will also cause it's virtual netdev's link state to be processed
      in linkwatch. Currently, the processing is done in a work queue,
      which may cause rtnl locking starvation problem and worker
      starvation problem for other work queue, such as irqfd_inject wq.
      
      This patch releases the cpu when link watch worker has processed
      a fixed number of netdev' link watch event, and schedule the
      work queue again when there is still link watch event remaining.
      Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      27ba4059
    • David S. Miller's avatar
      Merge branch 'mlxsw-PTP-timestamping-support' · 0d0bcacc
      David S. Miller authored
      Ido Schimmel says:
      
      ====================
      mlxsw: PTP timestamping support
      
      This is the second patchset adding PTP support in mlxsw. Next patchset
      will add PTP shapers which are required to maintain accuracy under rates
      lower than 40Gb/s, while subsequent patchsets will add tracepoints and
      selftests.
      
      Petr says:
      
      This patch set introduces support for retrieving and processing hardware
      timestamps for PTP packets.
      
      The way PTP timestamping works on Spectrum-1 is that there are two queues
      associated with each front panel port. When a packet is timestamped, the
      timestamp is put to one of the queues: timestamps for transmitted packets
      to one and for received packets to the other. Activity on these queues is
      signaled through the events PTP_ING_FIFO and PTP_EGR_FIFO.
      
      Packets themselves arrive through two traps: PTP0 and PTP1. It is possible
      to configure which PTP messages should be trapped under which PTP trap. On
      Spectrum systems, mlxsw will use PTP0 for event messages (which need
      timestamping), and PTP1 for general messages (which do not).
      
      There are therefore four relevant traps: receive of PTP event resp. general
      message, and receive of timestamp for a transmitted resp. received PTP
      packet. The obvious point where to put the new logic is a custom listener
      to the mentioned traps.
      
      Besides handling ingress traffic (be in packets or timestamps), the driver
      also needs to handle timestamping of transmitted packets. One option would
      be to invoke the relevant logic from mlxsw_core_ptp_transmitted(). However
      on Spectrum-2, the timestamps are actually delivered through the completion
      queue, and for that reason this patchset opts to invoke the logic from the
      PCI code, via core and the driver, to a chip-specific operation. That way
      the invocation will be done in a place where a Spectrum-2 implementation
      will have an opportunity to extract the timestamp.
      
      As indicated above, the PTP FIFO signaling happens independently from
      packet delivery. A packet corresponding to any given timestamp could be
      delivered sooner or later than the timestamp itself. Additionally, the
      queues are only four elements deep, and it is therefore possible that the
      timestamp for a delivered packet never arrives at all. Similarly a PTP
      packet might be dropped due to CPU traffic pressure, and never be delivered
      even if the corresponding timestamp was.
      
      The driver thus needs to hold a cache of as-yet-unmatched SKBs and
      timestamps. The first piece to arrive (be it timestamp or SKB) is put to
      this cache. When the other piece arrives, the timestamp is attached to the
      SKB and that is passed on. A delayed work is run at regular intervals to
      prune the old unmatched entries.
      
      As mentioned above, the mechanism for timestamp delivery changes on
      Spectrum-2, where timestamps are part of completion queue elements, and all
      packets are timestamped. All this bookkeeping is therefore unnecessary on
      Spectrum-2. For this reason, this patchset spends some time introducing
      Spectrum-1 specific artifacts such as a possibility to register a given
      trap only on Spectrum-1.
      
      Patches #1-#4 describe new registers.
      
      Patches #5 and #6 introduce the possibility to register certain traps
      only on some systems. The list of Spectrum-1 specific traps is left empty
      at this point.
      
      Patch #7 hooks into packet receive path by registering PTP traps
      and appropriate handlers (that however do nothing of substance yet).
      
      Patch #8 adds a helper to allow storing custom data to SKB->cb.
      
      Patch #9 adds a call into the PCI completion queue handler that invokes,
      via core and spectrum code, a PTP transmit handler. (Which also does not do
      anything interesting yet.)
      
      Patch #10 introduces code to invoke PTP initialization and adds data types
      for the cache of unmatched entries.
      
      Patches #11 and #12 implement the timestamping itself. In #11, the PHC
      spin_locks are converted to _bh variants, because unlike normal PHC path,
      which runs in process context, timestamp processing runs as soft interrupt.
      Then #12 introduces the code for saving and retrieval of unmatched entries,
      invokes PTP classifier to identify packets of interest, registers timestamp
      FIFO events, and handles decoding and attaching timestamps to packets.
      
      Patch #13 introduces a garbage collector for left-behind entries that have
      not been matched for about a second.
      
      In patch #14, PTP message types are configured to arrive as PTP0
      (events) or PTP1 (everything else) as appropriate. At this point, the PTP
      packets start arriving through the traps, but because PTP is disabled and
      there is no way to enable it yet, they are always just passed to the usual
      receive path right away.
      
      Finally patches #15 and #16 add the plumbing to actually make it possible
      to enable this code through SIOCSHWTSTAMP ioctl, and to advertise the
      hardware timestamping capabilities through ethtool.
      
      v2:
      - Patch #12:
          - In mlxsw_sp1_ptp_fifo_event_func(), post-increment when iterating over PTP
            FIFO records.
      - Patch #14:
          - Change namespace of message type enumerators from MLXSW_ to MLXSW_SP_.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      0d0bcacc
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Support ethtool get_ts_info · 87ee07f8
      Petr Machata authored
      The get_ts_info callback is used for obtaining information about
      timestamping capabilities of a network device. On Spectrum-1, implement
      it to advertise the PHC and the capability to do HW timestamping, and
      the supported RX and TX filters.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      87ee07f8
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Support SIOCGHWTSTAMP, SIOCSHWTSTAMP ioctls · 87486427
      Petr Machata authored
      The SIOCSHWTSTAMP ioctl configures HW timestamping on a given port.
      Dispatch the ioctls to per-chip handler (which add to ptp_ops). Find
      which PTP messages need to be timestamped and configure MTPPPC
      accordingly.
      
      The SIOCGHWTSTAMP ioctl is getter for the current configuration.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      87486427
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Configure PTP traps and FIFO events · a773c76c
      Petr Machata authored
      Configure MTPTPT to set which message types should arrive under which
      PTP trap, and MOGCR to clear the timestamp queue after its contents are
      reported through PTP_ING_FIFO or PTP_EGR_FIFO.
      
      With this configuration, PTP packets start arriving through the PTP
      traps. However since timestamping is disabled by default and there is
      currently no way to enable it, they will not be timestamped.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a773c76c
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Garbage-collect unmatched entries · 5d23e415
      Petr Machata authored
      On Spectrum-1, timestamped PTP packets and the corresponding timestamps
      need to be kept in caches until both are available, at which point they are
      matched up and packets forwarded as appropriate. However, not all packets
      will ever see their timestamp, and not all timestamps will ever see their
      packet. It is therefore necessary to dispose of such abandoned entries.
      
      To that end, introduce a garbage collector to collect entries that have
      not had their counterpart turn up within about a second. The GC
      maintains a monotonously-increasing value of GC cycle. Every entry that
      is put to the hash table is annotated with the GC cycle at which it
      should be collected. When the GC runs, it walks the hash table, and
      collects the objects according to their GC cycle annotation.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5d23e415
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Support timestamping on Spectrum-1 · d92e4e6e
      Petr Machata authored
      On Spectrum-1, timestamps arrive through a pair of dedicated events:
      MLXSW_TRAP_ID_PTP_ING_FIFO and _EGR_FIFO. The payload delivered with
      those traps is contents of the timestamp FIFO at a given port in a given
      direction. Add a Spectrum-1-specific handler for these two events which
      decodes the timestamps and forwards them to the PTP module.
      
      Add a function that parses a packet, dispatching to ptp_classify_raw(),
      and decodes PTP message type, domain number, and sequence ID. Add a new
      mlxsw dependency on the PTP classifier.
      
      Add helpers that can store and retrieve unmatched timestamps and SKBs to
      the hash table added in a preceding patch.
      
      Add the matching code itself: upon arrival of a timestamp or a packet,
      look up the corresponding unmatched entry, and match it up. If there is
      none, add a new unmatched entry. This logic is the same on ingress as on
      egress.
      
      Packets and timestamps that never matched need to be eventually disposed
      of. A garbage collector added in a follow-up patch will take care of
      that. Since currently all this code is turned off, no crud will
      accumulate in the hash table.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d92e4e6e
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Disable BH when working with PHC · 89e602ee
      Petr Machata authored
      Up until now, the PTP hardware clock code was only invoked in the process
      context (SYS_clock_adjtime -> do_clock_adjtime -> k_clock::clock_adj ->
      pc_clock_adjtime -> posix_clock_operations::clock_adjtime ->
      ptp_clock_info::adjtime -> mlxsw_spectrum).
      
      In order to enable HW timestamping, which is tied into trap handling, it
      will be necessary to take the clock lock from the PCI queue handler
      tasklets as well.
      
      Therefore use the _bh variants when handling the clock lock. Incidentally,
      Documentation/ptp/ptp.txt recommends _irqsave variants, but that's
      unnecessarily strong for our needs.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      89e602ee
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Add PTP initialization / finalization · 810256ce
      Petr Machata authored
      Add two ptp_ops: init and fini, to initialize and finalize the PTP
      subsystem. Call as appropriate from mlxsw_sp_init() and _fini().
      
      Lay the groundwork for Spectrum-1 support. On Spectrum-1, the received
      timestamped packets and their corresponding timestamps arrive
      independently, and need to be matched up. Introduce the related data types
      and add to struct mlxsw_sp_ptp_state the hash table that will keep the
      unmatched entries.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      810256ce
    • Petr Machata's avatar
      mlxsw: pci: PTP: Hook into packet transmit path · 0714256c
      Petr Machata authored
      On Spectrum-1, timestamps are delivered separately from the packets, and
      need to paired up. Therefore, at some point after mlxsw_sp_port_xmit()
      is invoked, it is necessary to involve the chip-specific driver code to
      allow it to do the necessary bookkeeping and matching.
      
      On Spectrum-2, timestamps are delivered in CQE. For that reason,
      position the point of driver involvement into mlxsw_pci_cqe_sdq_handle()
      to make it hopefully easier to extend for Spectrum-2 in the future.
      
      To tell the driver what port the packet was sent on, keep tx_info
      in SKB control buffer.
      
      Introduce a new driver core interface mlxsw_core_ptp_transmitted(), a
      driver callback ptp_transmitted, and a PTP op transmitted. The callee is
      responsible for taking care of releasing the SKB passed to the new
      interfaces, and correspondingly have the new stub callbacks just call
      dev_kfree_skb_any().
      
      Follow-up patches will introduce the actual content into
      mlxsw_sp1_ptp_transmitted() in particular.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      0714256c
    • Petr Machata's avatar
      mlxsw: core: Add support for using SKB control buffer · d7cd206d
      Petr Machata authored
      The SKB control buffer is useful (and used) for bookkeeping of information
      related to that SKB. Add helpers so that the mlxsw driver(s) can safely use
      the buffer as well. The structure is currently empty, individual users will
      add members to it as necessary.
      
      Note that SKB allocation functions already clear the buffer, so the cleanup
      is only necessary when ndo_start_xmit is called.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d7cd206d
    • Petr Machata's avatar
      mlxsw: spectrum: PTP: Hook into packet receive path · aed4b572
      Petr Machata authored
      When configured, the Spectrum hardware can recognize PTP packets and
      trap them to the CPU using dedicated traps, PTP0 and PTP1.
      
      One reason to get PTP packets under dedicated traps is to have a
      separate policer suitable for the amount of PTP traffic expected when
      switch is operated as a boundary clock. For this, add two new trap
      groups, MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP0 and _PTP1, and associate the
      two PTP traps with these two groups.
      
      In the driver, specifically for Spectrum-1, event PTP packets will need
      to be paired up with their timestamps. Those arrive through a different
      set of traps, added later in the patch set. To support this future use,
      introduce a new PTP op, ptp_receive.
      
      It is possible to configure which PTP messages should be trapped under
      which PTP trap. On Spectrum systems, we will use PTP0 for event
      packets (which need timestamping), and PTP1 for control packets (which
      do not). Thus configure PTP0 trap with a custom callback that defers to
      the ptp_receive op.
      
      Additionally, L2 PTP packets are actually trapped through the LLDP trap,
      not through any of the PTP traps. So treat the LLDP trap the same way as
      the PTP0 trap. Unlike PTP traps, which are currently still disabled,
      LLDP trap is active. Correspondingly, have all the implementations of
      the ptp_receive op return true, which the handler treats as a signal to
      forward the packet immediately.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      aed4b572
    • Petr Machata's avatar
      mlxsw: spectrum: Add support for traps specific to Spectrum-1 · dadbc6bc
      Petr Machata authored
      On Spectrum-1, timestamps for PTP packets are delivered through queues
      of ingress and egress timestamps. There are two event traps
      corresponding to activity on each of those queues. This mechanism is
      absent on Spectrum-2, and therefore the traps should only be registered
      on Spectrum-1.
      
      Carry a chip-specific listener array in mlxsw_sp->listeners and
      listeners_count. Register listeners from that array in
      mlxsw_sp_traps_init(). Add a new listener array for Spectrum-1 traps and
      configure the newly-added mlxsw_sp->listeners with this array.
      
      The listener array is empty for now, the events will be added in a later
      patch.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      dadbc6bc
    • Petr Machata's avatar
      mlxsw: spectrum: Extract a helper for trap registration · 4b6b91ed
      Petr Machata authored
      On Spectrum-1, timestamps for PTP packets are delivered through queues
      of ingress and egress timestamps. There are two event traps
      corresponding to activity on each of those queues. This mechanism is
      absent on Spectrum-2, and therefore the traps should only be registered
      on Spectrum-1.
      
      Extract out of mlxsw_sp_traps_init() a generic helper,
      mlxsw_sp_traps_register(), and likewise with _unregister(). The new helpers
      will later be called with Spectrum-1-specific traps.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4b6b91ed
    • Petr Machata's avatar
      mlxsw: reg: Add Monitoring Global Configuration Register · 41ce78b9
      Petr Machata authored
      This register serves to configure global parameters of certain
      monitoring operations. The following patches will use it to configure
      that when PTP timestamps are delivered through the PTP FIFO traps, the
      FIFO in question is cleared as well.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      41ce78b9
    • Petr Machata's avatar
      mlxsw: reg: Add Time Precision Packet Timestamping Reading · 98b9028e
      Petr Machata authored
      The MTPPTR is used for reading the per port PTP timestamp FIFO.
      Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      98b9028e