1. 10 7月, 2018 2 次提交
  2. 30 4月, 2018 1 次提交
  3. 28 4月, 2018 1 次提交
    • F
      net: systemport: Correclty disambiguate driver instances · 1f3ccc3c
      Florian Fainelli 提交于
      While adding the DSA notifier, we will be sending DSA notifications with
      info->master that is going to point to a particular net_device instance.
      
      Our logic in bcm_sysport_map_queues() correctly disambiguates net_device
      instances that are not covered by our own driver, but it will not make
      sure that info->master points to a particular driver instance that we
      are interested in. In a system where e.g: two or more SYSTEMPORT
      instances are registered, this would lead in programming two or more
      times the queue mapping, completely messing with the logic which does
      the queue/port allocation and tracking.
      
      Fix this by looking at the notifier_block pointer which is unique per
      instance and allows us to go back to our driver private structure, and
      in turn to the backing net_device instance.
      
      Fixes: d1565763 ("net: systemport: Establish lower/upper queue mapping")
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Reviewed-by: NVivien Didelot <vivien.didelot@savoirfairelinux.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1f3ccc3c
  4. 24 4月, 2018 1 次提交
  5. 04 4月, 2018 1 次提交
  6. 30 3月, 2018 2 次提交
  7. 26 3月, 2018 1 次提交
  8. 16 3月, 2018 1 次提交
    • F
      net: systemport: Rewrite __bcm_sysport_tx_reclaim() · 484d802d
      Florian Fainelli 提交于
      There is no need for complex checking between the last consumed index
      and current consumed index, a simple subtraction will do.
      
      This also eliminates the possibility of a permanent transmit queue stall
      under the following conditions:
      
      - one CPU bursts ring->size worth of traffic (up to 256 buffers), to the
        point where we run out of free descriptors, so we stop the transmit
        queue at the end of bcm_sysport_xmit()
      
      - because of our locking, we have the transmit process disable
        interrupts which means we can be blocking the TX reclamation process
      
      - when TX reclamation finally runs, we will be computing the difference
        between ring->c_index (last consumed index by SW) and what the HW
        reports through its register
      
      - this register is masked with (ring->size - 1) = 0xff, which will lead
        to stripping the upper bits of the index (register is 16-bits wide)
      
      - we will be computing last_tx_cn as 0, which means there is no work to
        be done, and we never wake-up the transmit queue, leaving it
        permanently disabled
      
      A practical example is e.g: ring->c_index aka last_c_index = 12, we
      pushed 256 entries, HW consumer index = 268, we mask it with 0xff = 12,
      so last_tx_cn == 0, nothing happens.
      
      Fixes: 80105bef ("net: systemport: add Broadcom SYSTEMPORT Ethernet MAC driver")
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      484d802d
  9. 06 1月, 2018 1 次提交
  10. 03 11月, 2017 1 次提交
  11. 02 11月, 2017 1 次提交
  12. 27 10月, 2017 1 次提交
  13. 23 10月, 2017 1 次提交
    • F
      net: systemport: Guard against unmapped TX ring · e83b1715
      Florian Fainelli 提交于
      Because SYSTEMPORT is a (semi) normal network device, the stack may attempt to
      queue packets on it oustide of the DSA slave transmit path.  When that happens,
      the DSA layer has not had a chance to tag packets with the appropriate per-port
      and per-queue information, and if that happens and we don't have a port 0 queue
      0 available (e.g: on boards where this does not exist), we will hit a NULL
      pointer de-reference in bcm_sysport_select_queue().
      
      Guard against such cases by testing for the TX ring validity.
      
      Fixes: 84ff33eeb23d ("net: systemport: Establish DSA network device queue mapping")
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e83b1715
  14. 13 10月, 2017 2 次提交
    • F
      net: systemport: Turn on ACB at the SYSTEMPORT level · 723934fb
      Florian Fainelli 提交于
      Now that we have established the queue mapping between the switch port
      egress queues and the SYSTEMPORT egress queues, we can turn on Advanced
      Congestion Buffering (ACB) at the SYSTEMPORT level. This enables the
      Ethernet MAC controller to get out of band flow control information
      directly from the switch port and queue that it monitors such that its
      internal TDMA can be appropriately backpressured.
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      723934fb
    • F
      net: systemport: Establish lower/upper queue mapping · d1565763
      Florian Fainelli 提交于
      Establish a queue mapping between the DSA slave network device queues
      created that correspond to switch port queues, and the transmit queue
      that SYSTEMPORT manages.
      
      We need to configure the SYSTEMPORT transmit queue with the switch port number
      and switch port queue number in order for the switch and SYSTEMPORT hardware to
      utilize the out of band congestion notification. This hardware mechanism works
      by looking at the switch port egress queue and determines whether there is
      enough buffers for this queue, with that class of service for a successful
      transmission and if not, backpressures the SYSTEMPORT queue that is being used.
      
      For this to work, we implement a notifier which looks at the
      DSA_PORT_REGISTER event.  When DSA network devices are registered, the
      framework calls the DSA notifiers when that happens, extracts the number
      of queues for these devices and their associated port number, remembers
      that in the driver private structure and linearly maps those queues to
      TX rings/queues that we manage.
      
      This scheme works because DSA slave network deviecs always transmit
      through SYSTEMPORT so when DSA slave network devices are
      destroyed/brought down, the corresponding SYSTEMPORT queues are no
      longer used. Also, by design of the DSA framework, the master network
      device (SYSTEMPORT) is registered first.
      
      For faster lookups we use an array of up to DSA_MAX_PORTS * number of
      queues per port, and then map pointers to bcm_sysport_tx_ring such that
      our ndo_select_queue() implementation can just index into that array to
      locate the corresponding ring index.
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d1565763
  15. 19 9月, 2017 1 次提交
    • F
      net: systemport: Fix 64-bit statistics dependency · 8ecb1a29
      Florian Fainelli 提交于
      There are several problems with commit 10377ba7 ("net: systemport:
      Support 64bit statistics", first one got fixed in 7095c973 ("net:
      systemport: Fix 64-bit stats deadlock").
      
      The second problem is that this specific code updates the
      stats64.tx_{packets,bytes} from ndo_get_stats64() and that is what we
      are returning to ethtool -S. If we are not running a tool that involves
      calling ndo_get_stats64(), then we won't get updated ethtool stats.
      
      The solution to this is to update the stats from both call sites,
      factoring that into a specific function, While at it, don't just check
      the sizeof() but also the type of the statistics in order to use the
      64-bit stats seqlock.
      
      Fixes: 10377ba7 ("net: systemport: Support 64bit statistics")
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8ecb1a29
  16. 16 9月, 2017 1 次提交
    • F
      net: systemport: Fix 64-bit stats deadlock · 7095c973
      Florian Fainelli 提交于
      We can enter a deadlock situation because there is no sufficient protection
      when ndo_get_stats64() runs in process context to guard against RX or TX NAPI
      contexts running in softirq, this can lead to the following lockdep splat and
      actual deadlock was experienced as well with an iperf session in the background
      and a while loop doing ifconfig + ethtool.
      
      [    5.780350] ================================
      [    5.784679] WARNING: inconsistent lock state
      [    5.789011] 4.13.0-rc7-02179-g32fae27c725d #70 Not tainted
      [    5.794561] --------------------------------
      [    5.798890] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
      [    5.804971] swapper/0/0 [HC0[0]:SC1[1]:HE0:SE0] takes:
      [    5.810175]  (&syncp->seq#2){+.?...}, at: [<c0768a28>] bcm_sysport_tx_reclaim+0x30/0x54
      [    5.818327] {SOFTIRQ-ON-W} state was registered at:
      [    5.823278]   bcm_sysport_get_stats64+0x17c/0x258
      [    5.828053]   dev_get_stats+0x38/0xac
      [    5.831776]   rtnl_fill_stats+0x30/0x118
      [    5.835761]   rtnl_fill_ifinfo+0x538/0xe24
      [    5.839921]   rtmsg_ifinfo_build_skb+0x6c/0xd8
      [    5.844430]   rtmsg_ifinfo_event.part.5+0x14/0x44
      [    5.849201]   rtmsg_ifinfo+0x20/0x28
      [    5.852837]   register_netdevice+0x628/0x6b8
      [    5.857171]   register_netdev+0x14/0x24
      [    5.861051]   bcm_sysport_probe+0x30c/0x438
      [    5.865280]   platform_drv_probe+0x50/0xb0
      [    5.869418]   driver_probe_device+0x2e8/0x450
      [    5.873817]   __driver_attach+0x104/0x120
      [    5.877871]   bus_for_each_dev+0x7c/0xc0
      [    5.881834]   bus_add_driver+0x1b0/0x270
      [    5.885797]   driver_register+0x78/0xf4
      [    5.889675]   do_one_initcall+0x54/0x190
      [    5.893646]   kernel_init_freeable+0x144/0x1d0
      [    5.898135]   kernel_init+0x8/0x110
      [    5.901665]   ret_from_fork+0x14/0x2c
      [    5.905363] irq event stamp: 24263
      [    5.908804] hardirqs last  enabled at (24262): [<c08eecf0>] net_rx_action+0xc4/0x4e4
      [    5.916624] hardirqs last disabled at (24263): [<c0a7da00>] _raw_spin_lock_irqsave+0x1c/0x98
      [    5.925143] softirqs last  enabled at (24258): [<c022a7fc>] irq_enter+0x84/0x98
      [    5.932524] softirqs last disabled at (24259): [<c022a918>] irq_exit+0x108/0x16c
      [    5.939985]
      [    5.939985] other info that might help us debug this:
      [    5.946576]  Possible unsafe locking scenario:
      [    5.946576]
      [    5.952556]        CPU0
      [    5.955031]        ----
      [    5.957506]   lock(&syncp->seq#2);
      [    5.960955]   <Interrupt>
      [    5.963604]     lock(&syncp->seq#2);
      [    5.967227]
      [    5.967227]  *** DEADLOCK ***
      [    5.967227]
      [    5.973222] 1 lock held by swapper/0/0:
      [    5.977092]  #0:  (&(&ring->lock)->rlock){..-...}, at: [<c0768a18>] bcm_sysport_tx_reclaim+0x20/0x54
      
      So just remove the u64_stats_update_begin()/end() pair in ndo_get_stats64()
      since it does not appear to be useful for anything. No inconsistency was
      observed with either ifconfig or ethtool, global TX counts equal the sum of
      per-queue TX counts on a 32-bit architecture.
      
      Fixes: 10377ba7 ("net: systemport: Support 64bit statistics")
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7095c973
  17. 02 9月, 2017 1 次提交
  18. 30 8月, 2017 2 次提交
  19. 25 8月, 2017 2 次提交
  20. 10 8月, 2017 1 次提交
  21. 07 8月, 2017 1 次提交
    • K
      net: systemport: Support 64bit statistics · 10377ba7
      kiki good 提交于
      When using Broadcom Systemport device in 32bit Platform, ifconfig can
      only report up to 4G tx,rx status, which will be wrapped to 0 when the
      number of incoming or outgoing packets exceeds 4G, only taking
      around 2 hours in busy network environment (such as streaming).
      Therefore, it makes hard for network diagnostic tool to get reliable
      statistical result, so the patch is used to add 64bit support for
      Broadcom Systemport device in 32bit Platform.
      
      This patch provides 64bit statistics capability on both ethtool and ifconfig.
      Signed-off-by: NJianming.qiao <kiki-good@hotmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      10377ba7
  22. 16 6月, 2017 1 次提交
    • J
      networking: make skb_push & __skb_push return void pointers · d58ff351
      Johannes Berg 提交于
      It seems like a historic accident that these return unsigned char *,
      and in many places that means casts are required, more often than not.
      
      Make these functions return void * and remove all the casts across
      the tree, adding a (u8 *) cast only where the unsigned char pointer
      was used directly, all done with the following spatch:
      
          @@
          expression SKB, LEN;
          typedef u8;
          identifier fn = { skb_push, __skb_push, skb_push_rcsum };
          @@
          - *(fn(SKB, LEN))
          + *(u8 *)fn(SKB, LEN)
      
          @@
          expression E, SKB, LEN;
          identifier fn = { skb_push, __skb_push, skb_push_rcsum };
          type T;
          @@
          - E = ((T *)(fn(SKB, LEN)))
          + E = fn(SKB, LEN)
      
          @@
          expression SKB, LEN;
          identifier fn = { skb_push, __skb_push, skb_push_rcsum };
          @@
          - fn(SKB, LEN)[0]
          + *(u8 *)fn(SKB, LEN)
      
      Note that the last part there converts from push(...)[0] to the
      more idiomatic *(u8 *)push(...).
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d58ff351
  23. 02 6月, 2017 1 次提交
  24. 29 3月, 2017 1 次提交
  25. 25 3月, 2017 3 次提交
  26. 23 1月, 2017 2 次提交
    • F
      net: systemport: Add support for SYSTEMPORT Lite · 44a4524c
      Florian Fainelli 提交于
      Add supporf for the SYSTEMPORT Lite Ethernet controller, this piece of hardware
      is largely based on the full-blown SYSTEMPORT and differs in the following:
      
      - no full-blown UniMAC, instead we have the MagicPacket matching from UniMAC at
        same offset, and a GMII Interface Block (GIB) for the MAC-level stuff, since
        we are always interfaced to an Ethernet switch which is fully Ethernet compliant
        shortcuts could be made
      
      - 16 transmit queues, whose interrupts are moved into the first Level-2 interrupt
        controller bank
      
      - slight TDMA offset change (a register was inserted after TDMA_STATUS, *sigh*)
      
      - 256 RX descriptors (512 words) and 256 TX descriptors (not visible)
      
      As a consequence of these two things, update the code paths accordingly to
      differentiate the full-blown from the light version.
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      44a4524c
    • F
      net: systemport: Dynamically allocate number of TX rings · 7b78be48
      Florian Fainelli 提交于
      In preparation for adding SYSTEMPORT Lite, which has twice as less transmit
      queues than SYSTEMPORT make sure we do allocate TX rings based on the
      systemport,txq property to get an appropriate memory footprint.
      Signed-off-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7b78be48
  27. 14 1月, 2017 1 次提交
  28. 05 1月, 2017 2 次提交
  29. 30 11月, 2016 1 次提交
  30. 01 9月, 2016 1 次提交
    • J
      net: systemport: constify ethtool_ops structures · c1ab0e9c
      Julia Lawall 提交于
      Check for ethtool_ops structures that are only stored in the ethtool_ops
      field of a net_device structure or passed as the second argument to
      netdev_set_default_ethtool_ops.  These contexts are declared const, so
      ethtool_ops structures that have these properties can be declared as const
      also.
      
      The semantic patch that makes this change is as follows:
      (http://coccinelle.lip6.fr/)
      
      // <smpl>
      @r disable optional_qualifier@
      identifier i;
      position p;
      @@
      static struct ethtool_ops i@p = { ... };
      
      @ok1@
      identifier r.i;
      struct net_device e;
      position p;
      @@
      e.ethtool_ops = &i@p;
      
      @ok2@
      identifier r.i;
      expression e;
      position p;
      @@
      netdev_set_default_ethtool_ops(e, &i@p)
      
      @bad@
      position p != {r.p,ok1.p,ok2.p};
      identifier r.i;
      @@
      i@p
      
      @depends on !bad disable optional_qualifier@
      identifier r.i;
      @@
      static
      +const
       struct ethtool_ops i = { ... };
      // </smpl>
      Signed-off-by: NJulia Lawall <Julia.Lawall@lip6.fr>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c1ab0e9c
  31. 26 8月, 2016 1 次提交