1. 01 4月, 2021 2 次提交
    • V
      net: enetc: add support for XDP_REDIRECT · 9d2b68cc
      Vladimir Oltean 提交于
      The driver implementation of the XDP_REDIRECT action reuses parts from
      XDP_TX, most notably the enetc_xdp_tx function which transmits an array
      of TX software BDs. Only this time, the buffers don't have DMA mappings,
      we need to create them.
      
      When a BPF program reaches the XDP_REDIRECT verdict for a frame, we can
      employ the same buffer reuse strategy as for the normal processing path
      and for XDP_PASS: we can flip to the other page half and seed that to
      the RX ring.
      
      Note that scatter/gather support is there, but disabled due to lack of
      multi-buffer support in XDP (which is added by this series):
      https://patchwork.kernel.org/project/netdevbpf/cover/cover.1616179034.git.lorenzo@kernel.org/Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      9d2b68cc
    • V
      net: enetc: add support for XDP_DROP and XDP_PASS · d1b15102
      Vladimir Oltean 提交于
      For the RX ring, enetc uses an allocation scheme based on pages split
      into two buffers, which is already very efficient in terms of preventing
      reallocations / maximizing reuse, so I see no reason why I would change
      that.
      
       +--------+--------+--------+--------+--------+--------+--------+
       |        |        |        |        |        |        |        |
       | half B | half B | half B | half B | half B | half B | half B |
       |        |        |        |        |        |        |        |
       +--------+--------+--------+--------+--------+--------+--------+
       |        |        |        |        |        |        |        |
       | half A | half A | half A | half A | half A | half A | half A | RX ring
       |        |        |        |        |        |        |        |
       +--------+--------+--------+--------+--------+--------+--------+
           ^                                                     ^
           |                                                     |
       next_to_clean                                       next_to_alloc
                                                            next_to_use
      
                         +--------+--------+--------+--------+--------+
                         |        |        |        |        |        |
                         | half B | half B | half B | half B | half B |
                         |        |        |        |        |        |
       +--------+--------+--------+--------+--------+--------+--------+
       |        |        |        |        |        |        |        |
       | half B | half B | half A | half A | half A | half A | half A | RX ring
       |        |        |        |        |        |        |        |
       +--------+--------+--------+--------+--------+--------+--------+
       |        |        |   ^                                   ^
       | half A | half A |   |                                   |
       |        |        | next_to_clean                   next_to_use
       +--------+--------+
                    ^
                    |
               next_to_alloc
      
      then when enetc_refill_rx_ring is called, whose purpose is to advance
      next_to_use, it sees that it can take buffers up to next_to_alloc, and
      it says "oh, hey, rx_swbd->page isn't NULL, I don't need to allocate
      one!".
      
      The only problem is that for default PAGE_SIZE values of 4096, buffer
      sizes are 2048 bytes. While this is enough for normal skb allocations at
      an MTU of 1500 bytes, for XDP it isn't, because the XDP headroom is 256
      bytes, and including skb_shared_info and alignment, we end up being able
      to make use of only 1472 bytes, which is insufficient for the default
      MTU.
      
      To solve that problem, we implement scatter/gather processing in the
      driver, because we would really like to keep the existing allocation
      scheme. A packet of 1500 bytes is received in a buffer of 1472 bytes and
      another one of 28 bytes.
      
      Because the headroom required by XDP is different (and much larger) than
      the one required by the network stack, whenever a BPF program is added
      or deleted on the port, we drain the existing RX buffers and seed new
      ones with the required headroom. We also keep the required headroom in
      rx_ring->buffer_offset.
      
      The simplest way to implement XDP_PASS, where an skb must be created, is
      to create an xdp_buff based on the next_to_clean RX BDs, but not clear
      those BDs from the RX ring yet, just keep the original index at which
      the BDs for this frame started. Then, if the verdict is XDP_PASS,
      instead of converting the xdb_buff to an skb, we replay a call to
      enetc_build_skb (just as in the normal enetc_clean_rx_ring case),
      starting from the original BD index.
      
      We would also like to be minimally invasive to the regular RX data path,
      and not check whether there is a BPF program attached to the ring on
      every packet. So we create a separate RX ring processing function for
      XDP.
      
      Because we only install/remove the BPF program while the interface is
      down, we forgo the rcu_read_lock() in enetc_clean_rx_ring, since there
      shouldn't be any circumstance in which we are processing packets and
      there is a potentially freed BPF program attached to the RX ring.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d1b15102
  2. 25 3月, 2021 2 次提交
    • V
      net: enetc: don't depend on system endianness in enetc_set_mac_ht_flt · e366a392
      Vladimir Oltean 提交于
      When enetc runs out of exact match entries for unicast address
      filtering, it switches to an approach based on hash tables, where
      multiple MAC addresses might end up in the same bucket.
      
      However, the enetc_set_mac_ht_flt function currently depends on the
      system endianness, because it interprets the 64-bit hash value as an
      array of two u32 elements. Modify this to use lower_32_bits and
      upper_32_bits.
      
      Tested by forcing enetc to go into hash table mode by creating two
      macvlan upper interfaces:
      
      ip link add link eno0 address 00:01:02:03:00:00 eno0.0 type macvlan && ip link set eno0.0 up
      ip link add link eno0 address 00:01:02:03:00:01 eno0.1 type macvlan && ip link set eno0.1 up
      
      and verified that the same bit values are written to the registers
      before and after:
      
      enetc_sync_mac_filters: addr 00:00:80:00:40:10 exact match 0
      enetc_sync_mac_filters: addr 00:00:00:00:80:00 exact match 0
      enetc_set_mac_ht_flt: hash 0x80008000000000 UMHFR0 0x0 UMHFR1 0x800080
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e366a392
    • V
      net: enetc: don't depend on system endianness in enetc_set_vlan_ht_filter · 110eccdb
      Vladimir Oltean 提交于
      ENETC has a 64-entry hash table for VLAN RX filtering per Station
      Interface, which is accessed through two 32-bit registers: VHFR0 holding
      the low portion, and VHFR1 holding the high portion.
      
      The enetc_set_vlan_ht_filter function looks at the pf->vlan_ht_filter
      bitmap, which is fundamentally an unsigned long variable, and casts it
      to a u32 array of two elements. It puts the first u32 element into VHFR0
      and the second u32 element into VHFR1.
      
      It is easy to imagine that this will not work on big endian systems
      (although, yes, we have bigger problems, because currently enetc assumes
      that the CPU endianness is equal to the controller endianness, aka
      little endian - but let's assume that we could add a cpu_to_le32 in
      enetc_wd_reg and a le32_to_cpu in enetc_rd_reg).
      
      Let's use lower_32_bits and upper_32_bits which are designed to work
      regardless of endianness.
      
      Tested that both the old and the new method produce the same results:
      
      $ ethtool -K eth1 rx-vlan-filter on
      $ ip link add link eth1 name eth1.100 type vlan id 100
      enetc_set_vlan_ht_filter: method 1: si_idx 0 VHFR0 0x0 VHFR1 0x20
      enetc_set_vlan_ht_filter: method 2: si_idx 0 VHFR0 0x0 VHFR1 0x20
      $ ip link add link eth1 name eth1.101 type vlan id 101
      enetc_set_vlan_ht_filter: method 1: si_idx 0 VHFR0 0x0 VHFR1 0x30
      enetc_set_vlan_ht_filter: method 2: si_idx 0 VHFR0 0x0 VHFR1 0x30
      $ ip link add link eth1 name eth1.34 type vlan id 34
      enetc_set_vlan_ht_filter: method 1: si_idx 0 VHFR0 0x0 VHFR1 0x34
      enetc_set_vlan_ht_filter: method 2: si_idx 0 VHFR0 0x0 VHFR1 0x34
      $ ip link add link eth1 name eth1.1024 type vlan id 1024
      enetc_set_vlan_ht_filter: method 1: si_idx 0 VHFR0 0x1 VHFR1 0x34
      enetc_set_vlan_ht_filter: method 2: si_idx 0 VHFR0 0x1 VHFR1 0x34
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      110eccdb
  3. 20 3月, 2021 1 次提交
    • V
      net: enetc: teardown CBDR during PF/VF unbind · c54f042d
      Vladimir Oltean 提交于
      Michael reports that after the blamed patch, unbinding a VF would cause
      these transactions to remain pending, and trigger some warnings with the
      DMA API debug:
      
      $ echo 1 > /sys/bus/pci/devices/0000\:00\:00.0/sriov_numvfs
      pci 0000:00:01.0: [1957:ef00] type 00 class 0x020001
      fsl_enetc_vf 0000:00:01.0: Adding to iommu group 19
      fsl_enetc_vf 0000:00:01.0: enabling device (0000 -> 0002)
      fsl_enetc_vf 0000:00:01.0 eno0vf0: renamed from eth0
      
      $ echo 0 > /sys/bus/pci/devices/0000\:00\:00.0/sriov_numvfs
      DMA-API: pci 0000:00:01.0: device driver has pending DMA allocations while released from device [count=1]
      One of leaked entries details: [size=2048 bytes] [mapped with DMA_BIDIRECTIONAL] [mapped as coherent]
      WARNING: CPU: 0 PID: 2547 at kernel/dma/debug.c:853 dma_debug_device_change+0x174/0x1c8
      (...)
      Call trace:
       dma_debug_device_change+0x174/0x1c8
       blocking_notifier_call_chain+0x74/0xa8
       device_release_driver_internal+0x18c/0x1f0
       device_release_driver+0x20/0x30
       pci_stop_bus_device+0x8c/0xe8
       pci_stop_and_remove_bus_device+0x20/0x38
       pci_iov_remove_virtfn+0xb8/0x128
       sriov_disable+0x3c/0x110
       pci_disable_sriov+0x24/0x30
       enetc_sriov_configure+0x4c/0x108
       sriov_numvfs_store+0x11c/0x198
      (...)
      DMA-API: Mapped at:
       dma_entry_alloc+0xa4/0x130
       debug_dma_alloc_coherent+0xbc/0x138
       dma_alloc_attrs+0xa4/0x108
       enetc_setup_cbdr+0x4c/0x1d0
       enetc_vf_probe+0x11c/0x250
      pci 0000:00:01.0: Removing from iommu group 19
      
      This happens because stupid me moved enetc_teardown_cbdr outside of
      enetc_free_si_resources, but did not bother to keep calling
      enetc_teardown_cbdr from all the places where enetc_free_si_resources
      was called. In particular, now it is no longer called from the main
      unbind function, just from the probe error path.
      
      Fixes: 4b47c0b8 ("net: enetc: don't initialize unused ports from a separate code path")
      Reported-by: NMichael Walle <michael@walle.cc>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Tested-by: NMichael Walle <michael@walle.cc>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c54f042d
  4. 11 3月, 2021 6 次提交
  5. 09 3月, 2021 1 次提交
  6. 02 3月, 2021 4 次提交
    • V
      net: enetc: force the RGMII speed and duplex instead of operating in inband mode · c76a9721
      Vladimir Oltean 提交于
      The ENETC port 0 MAC supports in-band status signaling coming from a PHY
      when operating in RGMII mode, and this feature is enabled by default.
      
      It has been reported that RGMII is broken in fixed-link, and that is not
      surprising considering the fact that no PHY is attached to the MAC in
      that case, but a switch.
      
      This brings us to the topic of the patch: the enetc driver should have
      not enabled the optional in-band status signaling for RGMII unconditionally,
      but should have forced the speed and duplex to what was resolved by
      phylink.
      
      Note that phylink does not accept the RGMII modes as valid for in-band
      signaling, and these operate a bit differently than 1000base-x and SGMII
      (notably there is no clause 37 state machine so no ACK required from the
      MAC, instead the PHY sends extra code words on RXD[3:0] whenever it is
      not transmitting something else, so it should be safe to leave a PHY
      with this option unconditionally enabled even if we ignore it). The spec
      talks about this here:
      https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/138/RGMIIv1_5F00_3.pdf
      
      Fixes: 71b77a7a ("enetc: Migrate to PHYLINK and PCS_LYNX")
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Andrew Lunn <andrew@lunn.ch>
      Cc: Russell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Acked-by: NRussell King <rmk+kernel@armlinux.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c76a9721
    • V
      net: enetc: don't disable VLAN filtering in IFF_PROMISC mode · a74dbce9
      Vladimir Oltean 提交于
      Quoting from the blamed commit:
      
          In promiscuous mode, it is more intuitive that all traffic is received,
          including VLAN tagged traffic. It appears that it is necessary to set
          the flag in PSIPVMR for that to be the case, so VLAN promiscuous mode is
          also temporarily enabled. On exit from promiscuous mode, the setting
          made by ethtool is restored.
      
      Intuitive or not, there isn't any definition issued by a standards body
      which says that promiscuity has anything to do with VLAN filtering - it
      only has to do with accepting packets regardless of destination MAC address.
      
      In fact people are already trying to use this misunderstanding/bug of
      the enetc driver as a justification to transform promiscuity into
      something it never was about: accepting every packet (maybe that would
      be the "rx-all" netdev feature?):
      https://lore.kernel.org/netdev/20201110153958.ci5ekor3o2ekg3ky@ipetronik.com/
      
      This is relevant because there are use cases in the kernel (such as
      tc-flower rules with the protocol 802.1Q and a vlan_id key) which do not
      (yet) use the vlan_vid_add API to be compatible with VLAN-filtering NICs
      such as enetc, so for those, disabling rx-vlan-filter is currently the
      only right solution to make these setups work:
      https://lore.kernel.org/netdev/CA+h21hoxwRdhq4y+w8Kwgm74d4cA0xLeiHTrmT-VpSaM7obhkg@mail.gmail.com/
      The blamed patch has unintentionally introduced one more way for this to
      work, which is to enable IFF_PROMISC, however this is non-portable
      because port promiscuity is not meant to disable VLAN filtering.
      Therefore, it could invite people to write broken scripts for enetc, and
      then wonder why they are broken when migrating to other drivers that
      don't handle promiscuity in the same way.
      
      Fixes: 7070eea5 ("enetc: permit configuration of rx-vlan-filter with ethtool")
      Cc: Markus Blöchl <Markus.Bloechl@ipetronik.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a74dbce9
    • V
      net: enetc: initialize RFS/RSS memories for unused ports too · 3222b5b6
      Vladimir Oltean 提交于
      Michael reports that since linux-next-20210211, the AER messages for ECC
      errors have started reappearing, and this time they can be reliably
      reproduced with the first ping on one of his LS1028A boards.
      
      $ ping 1[   33.258069] pcieport 0000:00:1f.0: AER: Multiple Corrected error received: 0000:00:00.0
      72.16.0.1
      PING [   33.267050] pcieport 0000:00:1f.0: AER: can't find device of ID0000
      172.16.0.1 (172.16.0.1): 56 data bytes
      64 bytes from 172.16.0.1: seq=0 ttl=64 time=17.124 ms
      64 bytes from 172.16.0.1: seq=1 ttl=64 time=0.273 ms
      
      $ devmem 0x1f8010e10 32
      0xC0000006
      
      It isn't clear why this is necessary, but it seems that for the errors
      to go away, we must clear the entire RFS and RSS memory, not just for
      the ports in use.
      
      Sadly the code is structured in such a way that we can't have unified
      logic for the used and unused ports. For the minimal initialization of
      an unused port, we need just to enable and ioremap the PF memory space,
      and a control buffer descriptor ring. Unused ports must then free the
      CBDR because the driver will exit, but used ports can not pick up from
      where that code path left, since the CBDR API does not reinitialize a
      ring when setting it up, so its producer and consumer indices are out of
      sync between the software and hardware state. So a separate
      enetc_init_unused_port function was created, and it gets called right
      after the PF memory space is enabled.
      
      Fixes: 07bf34a5 ("net: enetc: initialize the RFS and RSS memories")
      Reported-by: NMichael Walle <michael@walle.cc>
      Cc: Jesse Brandeburg <jesse.brandeburg@intel.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Tested-by: NMichael Walle <michael@walle.cc>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3222b5b6
    • V
      net: enetc: don't overwrite the RSS indirection table when initializing · c646d10d
      Vladimir Oltean 提交于
      After the blamed patch, all RX traffic gets hashed to CPU 0 because the
      hashing indirection table set up in:
      
      enetc_pf_probe
      -> enetc_alloc_si_resources
         -> enetc_configure_si
            -> enetc_setup_default_rss_table
      
      is overwritten later in:
      
      enetc_pf_probe
      -> enetc_init_port_rss_memory
      
      which zero-initializes the entire port RSS table in order to avoid ECC errors.
      
      The trouble really is that enetc_init_port_rss_memory really neads
      enetc_alloc_si_resources to be called, because it depends upon
      enetc_alloc_cbdr and enetc_setup_cbdr. But that whole enetc_configure_si
      thing could have been better thought out, it has nothing to do in a
      function called "alloc_si_resources", especially since its counterpart,
      "free_si_resources", does nothing to unwind the configuration of the SI.
      
      The point is, we need to pull out enetc_configure_si out of
      enetc_alloc_resources, and move it after enetc_init_port_rss_memory.
      This allows us to set up the default RSS indirection table after
      initializing the memory.
      
      Fixes: 07bf34a5 ("net: enetc: initialize the RFS and RSS memories")
      Cc: Jesse Brandeburg <jesse.brandeburg@intel.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c646d10d
  7. 17 2月, 2021 1 次提交
    • V
      net: enetc: fix destroyed phylink dereference during unbind · 3af409ca
      Vladimir Oltean 提交于
      The following call path suggests that calling unregister_netdev on an
      interface that is up will first bring it down.
      
      enetc_pf_remove
      -> unregister_netdev
         -> unregister_netdevice_queue
            -> unregister_netdevice_many
               -> dev_close_many
                  -> __dev_close_many
                     -> enetc_close
                        -> enetc_stop
                           -> phylink_stop
      
      However, enetc first destroys the phylink instance, then calls
      unregister_netdev. This is already dissimilar to the setup (and error
      path teardown path) from enetc_pf_probe, but more than that, it is buggy
      because it is invalid to call phylink_stop after phylink_destroy.
      
      So let's first unregister the netdev (and let the .ndo_stop events
      consume themselves), then destroy the phylink instance, then free the
      netdev.
      
      Fixes: 71b77a7a ("enetc: Migrate to PHYLINK and PCS_LYNX")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3af409ca
  8. 05 2月, 2021 1 次提交
    • V
      net: enetc: initialize the RFS and RSS memories · 07bf34a5
      Vladimir Oltean 提交于
      Michael tried to enable Advanced Error Reporting through the ENETC's
      Root Complex Event Collector, and the system started spitting out single
      bit correctable ECC errors coming from the ENETC interfaces:
      
      pcieport 0000:00:1f.0: AER: Multiple Corrected error received: 0000:00:00.0
      fsl_enetc 0000:00:00.0: PCIe Bus Error: severity=Corrected, type=Transaction Layer, (Receiver ID)
      fsl_enetc 0000:00:00.0:   device [1957:e100] error status/mask=00004000/00000000
      fsl_enetc 0000:00:00.0:    [14] CorrIntErr
      fsl_enetc 0000:00:00.1: PCIe Bus Error: severity=Corrected, type=Transaction Layer, (Receiver ID)
      fsl_enetc 0000:00:00.1:   device [1957:e100] error status/mask=00004000/00000000
      fsl_enetc 0000:00:00.1:    [14] CorrIntErr
      
      Further investigating the port correctable memory error detect register
      (PCMEDR) shows that these AER errors have an associated SOURCE_ID of 6
      (RFS/RSS):
      
      $ devmem 0x1f8010e10 32
      0xC0000006
      $ devmem 0x1f8050e10 32
      0xC0000006
      
      Discussion with the hardware design engineers reveals that on LS1028A,
      the hardware does not do initialization of that RFS/RSS memory, and that
      software should clear/initialize the entire table before starting to
      operate. That comes as a bit of a surprise, since the driver does not do
      initialization of the RFS memory. Also, the initialization of the
      Receive Side Scaling is done only partially.
      
      Even though the entire ENETC IP has a single shared flow steering
      memory, the flow steering service should returns matches only for TCAM
      entries that are within the range of the Station Interface that is doing
      the search. Therefore, it should be sufficient for a Station Interface
      to initialize all of its own entries in order to avoid any ECC errors,
      and only the Station Interfaces in use should need initialization.
      
      There are Physical Station Interfaces associated with PCIe PFs and
      Virtual Station Interfaces associated with PCIe VFs. We let the PF
      driver initialize the entire port's memory, which includes the RFS
      entries which are going to be used by the VF.
      Reported-by: NMichael Walle <michael@walle.cc>
      Fixes: d4fd0404 ("enetc: Introduce basic PF and VF ENETC ethernet drivers")
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Tested-by: NMichael Walle <michael@walle.cc>
      Reviewed-by: NJesse Brandeburg <jesse.brandeburg@intel.com>
      Link: https://lore.kernel.org/r/20210204134511.2640309-1-vladimir.oltean@nxp.comSigned-off-by: NJakub Kicinski <kuba@kernel.org>
      07bf34a5
  9. 06 12月, 2020 1 次提交
  10. 05 11月, 2020 1 次提交
  11. 12 10月, 2020 3 次提交
  12. 12 9月, 2020 1 次提交
  13. 23 7月, 2020 2 次提交
    • C
      enetc: Remove the mdio bus on PF probe bailout · 26cb7085
      Claudiu Manoil 提交于
      For ENETC ports that register an external MDIO bus,
      the bus doesn't get removed on the error bailout path
      of enetc_pf_probe().
      
      This issue became much more visible after recent:
      commit 07095c02 ("net: enetc: Use DT protocol information to set up the ports")
      Before this commit, one could make probing fail on the error
      path only by having register_netdev() fail, which is unlikely.
      But after this commit, because it moved the enetc_of_phy_get()
      call up in the probing sequence, now we can trigger an mdiobus_free()
      bug just by forcing enetc_alloc_msix() to return error, i.e. with the
      'pci=nomsi' kernel bootarg (since ENETC relies on MSI support to work),
      as the calltrace below shows:
      
      kernel BUG at /home/eiz/work/enetc/net/drivers/net/phy/mdio_bus.c:648!
      Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
      [...]
      Hardware name: LS1028A RDB Board (DT)
      pstate: 80000005 (Nzcv daif -PAN -UAO BTYPE=--)
      pc : mdiobus_free+0x50/0x58
      lr : devm_mdiobus_free+0x14/0x20
      [...]
      Call trace:
       mdiobus_free+0x50/0x58
       devm_mdiobus_free+0x14/0x20
       release_nodes+0x138/0x228
       devres_release_all+0x38/0x60
       really_probe+0x1c8/0x368
       driver_probe_device+0x5c/0xc0
       device_driver_attach+0x74/0x80
       __driver_attach+0x8c/0xd8
       bus_for_each_dev+0x7c/0xd8
       driver_attach+0x24/0x30
       bus_add_driver+0x154/0x200
       driver_register+0x64/0x120
       __pci_register_driver+0x44/0x50
       enetc_pf_driver_init+0x24/0x30
       do_one_initcall+0x60/0x1c0
       kernel_init_freeable+0x1fc/0x274
       kernel_init+0x14/0x110
       ret_from_fork+0x10/0x34
      
      Fixes: ebfcb23d ("enetc: Add ENETC PF level external MDIO support")
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      26cb7085
    • C
      enetc: Remove the imdio bus on PF probe bailout · c6dd6488
      Claudiu Manoil 提交于
      enetc_imdio_remove() is missing from the enetc_pf_probe()
      bailout path. Not surprisingly because enetc_setup_serdes()
      is registering the imdio bus for internal purposes, and it's
      not obvious that enetc_imdio_remove() currently performs the
      teardown of enetc_setup_serdes().
      To fix this, define enetc_teardown_serdes() to wrap
      enetc_imdio_remove() (improve code maintenance) and call it
      on bailout and remove paths.
      
      Fixes: 975d183e ("net: enetc: Initialize SerDes for SGMII and USXGMII protocols")
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c6dd6488
  14. 20 7月, 2020 2 次提交
  15. 20 6月, 2020 1 次提交
    • C
      enetc: Fix HW_VLAN_CTAG_TX|RX toggling · 9deba33f
      Claudiu Manoil 提交于
      VLAN tag insertion/extraction offload is correctly
      activated at probe time but deactivation of this feature
      (i.e. via ethtool) is broken.  Toggling works only for
      Tx/Rx ring 0 of a PF, and is ignored for the other rings,
      including the VF rings.
      To fix this, the existing VLAN offload toggling code
      was extended to all the rings assigned to a netdevice,
      instead of the default ring 0 (likely a leftover from the
      early validation days of this feature).  And the code was
      moved to the common set_features() function to fix toggling
      for the VF driver too.
      
      Fixes: d4fd0404 ("enetc: Introduce basic PF and VF ENETC ethernet drivers")
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      9deba33f
  16. 02 5月, 2020 2 次提交
    • P
      net: enetc: add tc flower psfp offload driver · 888ae5a3
      Po Liu 提交于
      This patch is to add tc flower offload for the enetc IEEE 802.1Qci(PSFP)
      function. There are four main feature parts to implement the flow
      policing and filtering for ingress flow with IEEE 802.1Qci features.
      They are stream identify(this is defined in the P802.1cb exactly but
      needed for 802.1Qci), stream filtering, stream gate and flow metering.
      Each function block includes many entries by index to assign parameters.
      So for one frame would be filtered by stream identify first, then
      flow into stream filter block by the same handle between stream identify
      and stream filtering. Then flow into stream gate control which assigned
      by the stream filtering entry. And then policing by the gate and limited
      by the max sdu in the filter block(optional). At last, policing by the
      flow metering block, index choosing at the fitering block.
      So you can see that each entry of block may link to many upper entries
      since they can be assigned same index means more streams want to share
      the same feature in the stream filtering or stream gate or flow
      metering.
      To implement such features, each stream filtered by source/destination
      mac address, some stream maybe also plus the vlan id value would be
      treated as one flow chain. This would be identified by the chain_index
      which already in the tc filter concept. Driver would maintain this chain
      and also with gate modules. The stream filter entry create by the gate
      index and flow meter(optional) entry id and also one priority value.
      Offloading only transfer the gate action and flow filtering parameters.
      Driver would create (or search same gate id and flow meter id and
       priority) one stream filter entry to set to the hardware. So stream
      filtering do not need transfer by the action offloading.
      This architecture is same with tc filter and actions relationship. tc
      filter maintain the list for each flow feature by keys. And actions
      maintain by the action list.
      
      Below showing a example commands by tc:
      > tc qdisc add dev eth0 ingress
      > ip link set eth0 address 10:00:80:00:00:00
      > tc filter add dev eth0 parent ffff: protocol ip chain 11 \
      	flower skip_sw dst_mac 10:00:80:00:00:00 \
      	action gate index 10 \
      	sched-entry open 200000000 1 8000000 \
      	sched-entry close 100000000 -1 -1
      
      Command means to set the dst_mac 10:00:80:00:00:00 to index 11 of stream
      identify module. Then setting the gate index 10 of stream gate module.
      Keep the gate open for 200ms and limit the traffic volume to 8MB in this
      sched-entry. Then direct the frames to the ingress queue 1.
      Signed-off-by: NPo Liu <Po.Liu@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      888ae5a3
    • P
      net: enetc: add hw tc hw offload features for PSPF capability · 79e49982
      Po Liu 提交于
      This patch is to let ethtool enable/disable the tc flower offload
      features. Hardware ENETC has the feature of PSFP which is for per-stream
      policing. When enable the tc hw offloading feature, driver would enable
      the IEEE 802.1Qci feature. It is only set the register enable bit for
      this feature not enable for any entry of per stream filtering and stream
      gate or stream identify but get how much capabilities for each feature.
      Signed-off-by: NPo Liu <Po.Liu@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      79e49982
  17. 19 4月, 2020 1 次提交
    • V
      enetc: permit configuration of rx-vlan-filter with ethtool · 7070eea5
      Vladimir Oltean 提交于
      Each ENETC station interface (SI) has a VLAN filter list and a port
      flag (PSIPVMR) by which it can be put in "VLAN promiscuous" mode, which
      enables the reception of VLAN-tagged traffic even if it is not in the
      VLAN filtering list.
      
      Currently the handling of this setting works like this: the port starts
      off as VLAN promiscuous, then it switches to enabling VLAN filtering as
      soon as the first VLAN is installed in its filter via
      .ndo_vlan_rx_add_vid. In practice that does not work out very well,
      because more often than not, the first VLAN to be installed is out of
      the control of the user: the 8021q module, if loaded, adds its rule for
      802.1p (VID 0) traffic upon bringing the interface up.
      
      What the user is currently seeing in ethtool is this:
      ethtool -k eno2
      rx-vlan-filter: on [fixed]
      
      which doesn't match the intention of the code, but the practical reality
      of having the 8021q module install its VID which has the side-effect of
      turning on VLAN filtering in this driver. All in all, a slightly
      confusing experience.
      
      So instead of letting this driver switch the VLAN filtering state by
      itself, just wire it up with the rx-vlan-filter feature from ethtool,
      and let it be user-configurable just through that knob, except for one
      case, see below.
      
      In promiscuous mode, it is more intuitive that all traffic is received,
      including VLAN tagged traffic. It appears that it is necessary to set
      the flag in PSIPVMR for that to be the case, so VLAN promiscuous mode is
      also temporarily enabled. On exit from promiscuous mode, the setting
      made by ethtool is restored.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7070eea5
  18. 24 3月, 2020 1 次提交
  19. 11 3月, 2020 1 次提交
  20. 04 3月, 2020 1 次提交
  21. 06 1月, 2020 1 次提交
    • C
      enetc: Make MDIO accessors more generic and export to include/linux/fsl · 6517798d
      Claudiu Manoil 提交于
      Within the LS1028A SoC, the register map for the ENETC MDIO controller
      is instantiated a few times: for the central (external) MDIO controller,
      for the internal bus of each standalone ENETC port, and for the internal
      bus of the Felix switch.
      
      Refactoring is needed to support multiple MDIO buses from multiple
      drivers. The enetc_hw structure is made an opaque type and a smaller
      enetc_mdio_priv is created.
      
      'mdio_base' - MDIO registers base address - is being parameterized, to
      be able to work with different MDIO register bases.
      
      The ENETC MDIO bus operations are exported from the fsl-enetc-mdio
      kernel object, the same that registers the central MDIO controller (the
      dedicated PF). The ENETC main driver has been changed to select it, and
      use its exported helpers to further register its private MDIO bus. The
      DSA Felix driver will do the same.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      6517798d
  22. 17 11月, 2019 1 次提交
  23. 05 11月, 2019 1 次提交
    • A
      net: of_get_phy_mode: Change API to solve int/unit warnings · 0c65b2b9
      Andrew Lunn 提交于
      Before this change of_get_phy_mode() returned an enum,
      phy_interface_t. On error, -ENODEV etc, is returned. If the result of
      the function is stored in a variable of type phy_interface_t, and the
      compiler has decided to represent this as an unsigned int, comparision
      with -ENODEV etc, is a signed vs unsigned comparision.
      
      Fix this problem by changing the API. Make the function return an
      error, or 0 on success, and pass a pointer, of type phy_interface_t,
      where the phy mode should be stored.
      
      v2:
      Return with *interface set to PHY_INTERFACE_MODE_NA on error.
      Add error checks to all users of of_get_phy_mode()
      Fixup a few reverse christmas tree errors
      Fixup a few slightly malformed reverse christmas trees
      
      v3:
      Fix 0-day reported errors.
      Reported-by: NDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: NAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      0c65b2b9
  24. 27 9月, 2019 1 次提交
  25. 03 8月, 2019 1 次提交
    • C
      enetc: Add mdio bus driver for the PCIe MDIO endpoint · 231ece36
      Claudiu Manoil 提交于
      ENETC ports can manage the MDIO bus via local register
      interface.  However there's also a centralized way
      to manage the MDIO bus, via the MDIO PCIe endpoint
      device integrated by the same root complex that also
      integrates the ENETC ports (eth controllers).
      
      Depending on board design and use case, centralized
      access to MDIO may be better than using local ENETC
      port registers.  For instance, on the LS1028A QDS board
      where MDIO muxing is required.  Also, the LS1028A on-chip
      switch doesn't have a local MDIO register interface.
      
      The current patch registers the above PCIe endpoint as a
      separate MDIO bus and provides a driver for it by re-using
      the code used for local MDIO access.  It also allows the
      ENETC port PHYs to be managed by this driver if the local
      "mdio" node is missing from the ENETC port node.
      Signed-off-by: NClaudiu Manoil <claudiu.manoil@nxp.com>
      Reviewed-by: NAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      231ece36