02 Sep, 2016

10 commits

  • Add support for the Qualcomm Technologies, Inc. EMAC gigabit Ethernet
    controller.

    This driver supports the following features:
    1) Checksum offload.
    2) Interrupt coalescing support.
    3) SGMII phy.
    4) phylib interface for external phy

    Based on original work by
    Niranjana Vishwanathapura
    Gilad Avidov

    Signed-off-by: Timur Tabi
    Signed-off-by: David S. Miller

    Timur Tabi
     
  • Access the priv member of the dsa_switch structure directly, instead of
    having an unnecessary helper.

    Signed-off-by: Vivien Didelot
    Signed-off-by: David S. Miller

    Vivien Didelot
     
  • fdb dumps spanning multiple skb's currently restart from the first
    interface again for every skb. This results in unnecessary
    iterations on the already visited interfaces and their fdb
    entries. In large scale setups, we have seen this to slow
    down fdb dumps considerably. On a system with 30k macs we
    see fdb dumps spanning across more than 300 skbs.

    To fix the problem, this patch replaces the existing single fdb
    marker with three markers: netdev hash entries, netdevs and fdb
    index to continue where we left off instead of restarting from the
    first netdev. This is consistent with link dumps.

    In the process of fixing the performance issue, this patch also
    re-implements fix done by
    commit 472681d57a5d ("net: ndo_fdb_dump should report -EMSGSIZE to rtnl_fdb_dump")
    (with an internal fix from Wilson Kok) in the following ways:
    - change ndo_fdb_dump handlers to return error code instead
    of the last fdb index
    - use cb->args strictly for dump frag markers and not error codes.
    This is consistent with other dump functions.

    Below results were taken on a system with 1000 netdevs
    and 35085 fdb entries:
    before patch:
    $time bridge fdb show | wc -l
    15065

    real 1m11.791s
    user 0m0.070s
    sys 1m8.395s

    (existing code does not return all macs)

    after patch:
    $time bridge fdb show | wc -l
    35085

    real 0m2.017s
    user 0m0.113s
    sys 0m1.942s

    Signed-off-by: Roopa Prabhu
    Signed-off-by: Wilson Kok
    Signed-off-by: David S. Miller

    Roopa Prabhu
     
  • The workqueue "pegasus_workqueue" queues a single work item per pegasus
    instance and hence it doesn't require execution ordering. Hence,
    alloc_workqueue has been used to replace the deprecated
    create_singlethread_workqueue instance.

    The WQ_MEM_RECLAIM flag has been set to ensure forward progress under
    memory pressure since it's a network driver.

    Since there are fixed number of work items, explicit concurrency
    limit is unnecessary here.

    Signed-off-by: Bhaktipriya Shridhar
    Acked-by: Tejun Heo
    Acked-by: Petko Manolov
    Signed-off-by: David S. Miller

    Bhaktipriya Shridhar
     
  • alloc_ordered_workqueue() with WQ_MEM_RECLAIM set, replaces
    deprecated create_singlethread_workqueue(). This is the identity
    conversion.

    The workqueue "wq" queues multiple work items viz
    &bond->mcast_work, &nnw->work, &bond->mii_work, &bond->arp_work,
    &bond->alb_work, &bond->mii_work, &bond->ad_work, &bond->slave_arr_work
    which require strict execution ordering. Hence, an ordered dedicated
    workqueue has been used.

    Since, it is a network driver, WQ_MEM_RECLAIM has been set to
    ensure forward progress under memory pressure.

    Signed-off-by: Bhaktipriya Shridhar
    Acked-by: Tejun Heo
    Signed-off-by: David S. Miller

    Bhaktipriya Shridhar
     
  • Update the sky2 driver to pass number of packets done to NAPI.
    The driver was never updated when napi_complete_done was added.

    Signed-off-by: Stephen Hemminger
    Acked-by: Eric Dumazet
    Signed-off-by: David S. Miller

    stephen hemminger
     
  • Adds support of Synopsys 3.50a MAC IP in stmmac driver.

    Acked-by: Giuseppe Cavallaro
    Tested-by: Maxime Coquelin
    Signed-off-by: Alexandre TORGUE
    Signed-off-by: David S. Miller

    Alexandre TORGUE
     
  • stm324xx family chips support Synopsys MAC 3.510 IP.
    This patch adds settings for logical glue logic:
    -clocks
    -mode selection MII or RMII.

    Reviewed-by: Joachim Eastwood
    Acked-by: Giuseppe Cavallaro
    Tested-by: Maxime Coquelin
    Signed-off-by: Alexandre TORGUE
    Signed-off-by: David S. Miller

    Alexandre TORGUE
     
  • A bugfix for backward compatibility handling introduced undefined
    behavior for the case that of_parse_phandle() does not return
    a valid entry, as "gcc -Wmaybe-unused" reports:

    drivers/net/ethernet/apm/xgene/xgene_enet_hw.c: In function 'xgene_enet_phy_connect':
    drivers/net/ethernet/apm/xgene/xgene_enet_hw.c:776:6: error: 'phy_dev' may be used uninitialized in this function [-Werror=maybe-uninitialized]
    drivers/net/ethernet/apm/xgene/xgene_enet_hw.c: In function 'xgene_enet_mdio_config':
    drivers/net/ethernet/apm/xgene/xgene_enet_hw.c:776:6: error: 'phy_dev' may be used uninitialized in this function [-Werror=maybe-uninitialized]

    We can work around this by removing the check for zero "np", as
    of_phy_connect() will correctly handle a NULL argument so we fall
    back into the normal error handling case.

    Note that I had previously fixed another bug that resulted in the
    exact same warning, but this is a different problem that was
    introduced after my original fix.

    Signed-off-by: Arnd Bergmann
    Fixes: 03377e381bf4 ("drivers: net: xgene: Fix backward compatibility")
    Signed-off-by: David S. Miller

    Arnd Bergmann
     
  • check the coding style with checkpatch.pl and fix the warnings and errors.

    Signed-off-by: Hayes Wang
    Signed-off-by: David S. Miller

    hayeswang
     

01 Sep, 2016

29 commits

  • From: Grant Grundler

    The miii_nway_restart() causes a PHY link change activity and
    ax88772_link_reset will be called. link_reset will set
    AX_CMD_WRITE_MEDIUM_MODE register correctly.

    The asix_write_medium_mode in reset() fills in a default value to the register
    which may be different from the negotiation result. So do this first.

    Ignore the ret value since it's ignored in XXX_link_reset() functions.

    Signed-off-by: Grant Grundler
    Signed-off-by: Robert Foss
    Tested-by: Robert Foss
    Signed-off-by: David S. Miller

    Robert Foss
     
  • From: Grant Grundler

    https://lkml.org/lkml/2014/11/11/947

    Ben Hutchings is correct. IEEE 802.3 spec section "22.2.4.1.1 Reset" requires
    up to 500ms delay. Mitigate the "max" delay by polling the phy until BCM_RESET
    bit is clear.

    Signed-off-by: Grant Grundler
    Signed-off-by: Robert Foss
    Tested-by: Robert Foss
    Signed-off-by: David S. Miller

    Robert Foss
     
  • From: Allan Chou

    The change fixes AX88772x resume failure by
    - Restore incorrect AX88772A PHY registers when resetting
    - Need to stop MAC operation when suspending
    - Need to restart MII when restoring PHY

    Signed-off-by: Allan Chou
    Signed-off-by: Robert Foss
    Tested-by: Robert Foss
    Signed-off-by: David S. Miller

    Robert Foss
     
  • From: Vincent Palatin

    Check the answers from the USB stack and avoid re-sending multiple times
    the request if the device has disappeared.

    Signed-off-by: Vincent Palatin
    Signed-off-by: Robert Foss
    Tested-by: Robert Foss
    Signed-off-by: David S. Miller

    Robert Foss
     
  • From: Freddy Xin

    In order to R/W registers in suspend/resume functions, in_pm flags are
    added to some functions to determine whether the nopm version of usb
    functions is called.

    Save BMCR and ANAR PHY registers in suspend function and restore them
    in resume function.

    Reset HW in resume function to ensure the PHY works correctly.

    Signed-off-by: Freddy Xin
    Signed-off-by: Robert Foss
    Tested-by: Robert Foss
    Signed-off-by: David S. Miller

    Robert Foss
     
  • 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/)

    //
    @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 = { ... };
    //

    Suggested-by: Stephen Hemminger

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    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/)

    //
    @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 = { ... };
    //

    Suggested-by: Stephen Hemminger

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    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/)

    //
    @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 = { ... };
    //

    Suggested-by: Stephen Hemminger

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    Julia Lawall
     
  • ppp_xmit_process() already locks the xmit path. If HARD_TX_LOCK() tries
    to hold the _xmit_lock we can get lock inversion.

    [ 973.726130] ======================================================
    [ 973.727311] [ INFO: possible circular locking dependency detected ]
    [ 973.728546] 4.8.0-rc2 #1 Tainted: G O
    [ 973.728986] -------------------------------------------------------
    [ 973.728986] accel-pppd/1806 is trying to acquire lock:
    [ 973.728986] (&qdisc_xmit_lock_key){+.-...}, at: [] sch_direct_xmit+0x8d/0x221
    [ 973.728986]
    [ 973.728986] but task is already holding lock:
    [ 973.728986] (l2tp_sock){+.-...}, at: [] l2tp_xmit_skb+0x1e8/0x5d7 [l2tp_core]
    [ 973.728986]
    [ 973.728986] which lock already depends on the new lock.
    [ 973.728986]
    [ 973.728986]
    [ 973.728986] the existing dependency chain (in reverse order) is:
    [ 973.728986]
    -> #3 (l2tp_sock){+.-...}:
    [ 973.728986] [] lock_acquire+0x150/0x217
    [ 973.728986] [] _raw_spin_lock+0x2d/0x3c
    [ 973.728986] [] l2tp_xmit_skb+0x1e8/0x5d7 [l2tp_core]
    [ 973.728986] [] pppol2tp_xmit+0x1f2/0x25e [l2tp_ppp]
    [ 973.728986] [] ppp_channel_push+0xb5/0x14a [ppp_generic]
    [ 973.728986] [] ppp_write+0x104/0x11c [ppp_generic]
    [ 973.728986] [] __vfs_write+0x56/0x120
    [ 973.728986] [] vfs_write+0xbd/0x11b
    [ 973.728986] [] SyS_write+0x5e/0x96
    [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8
    [ 973.728986]
    -> #2 (&(&pch->downl)->rlock){+.-...}:
    [ 973.728986] [] lock_acquire+0x150/0x217
    [ 973.728986] [] _raw_spin_lock_bh+0x31/0x40
    [ 973.728986] [] ppp_push+0xa7/0x82d [ppp_generic]
    [ 973.728986] [] __ppp_xmit_process+0x48/0x877 [ppp_generic]
    [ 973.728986] [] ppp_xmit_process+0x4b/0xaf [ppp_generic]
    [ 973.728986] [] ppp_write+0x10e/0x11c [ppp_generic]
    [ 973.728986] [] __vfs_write+0x56/0x120
    [ 973.728986] [] vfs_write+0xbd/0x11b
    [ 973.728986] [] SyS_write+0x5e/0x96
    [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8
    [ 973.728986]
    -> #1 (&(&ppp->wlock)->rlock){+.-...}:
    [ 973.728986] [] lock_acquire+0x150/0x217
    [ 973.728986] [] _raw_spin_lock_bh+0x31/0x40
    [ 973.728986] [] __ppp_xmit_process+0x27/0x877 [ppp_generic]
    [ 973.728986] [] ppp_xmit_process+0x4b/0xaf [ppp_generic]
    [ 973.728986] [] ppp_start_xmit+0x21b/0x22a [ppp_generic]
    [ 973.728986] [] dev_hard_start_xmit+0x1a9/0x43d
    [ 973.728986] [] sch_direct_xmit+0xd6/0x221
    [ 973.728986] [] __dev_queue_xmit+0x62a/0x912
    [ 973.728986] [] dev_queue_xmit+0xb/0xd
    [ 973.728986] [] neigh_direct_output+0xc/0xe
    [ 973.728986] [] ip6_finish_output2+0x5a9/0x623
    [ 973.728986] [] ip6_output+0x15e/0x16a
    [ 973.728986] [] dst_output+0x76/0x7f
    [ 973.728986] [] mld_sendpack+0x335/0x404
    [ 973.728986] [] mld_send_initial_cr.part.21+0x99/0xa2
    [ 973.728986] [] ipv6_mc_dad_complete+0x42/0x71
    [ 973.728986] [] addrconf_dad_completed+0x1cf/0x2ea
    [ 973.728986] [] addrconf_dad_work+0x453/0x520
    [ 973.728986] [] process_one_work+0x365/0x6f0
    [ 973.728986] [] worker_thread+0x2de/0x421
    [ 973.728986] [] kthread+0x121/0x130
    [ 973.728986] [] ret_from_fork+0x1f/0x40
    [ 973.728986]
    -> #0 (&qdisc_xmit_lock_key){+.-...}:
    [ 973.728986] [] __lock_acquire+0x1118/0x1483
    [ 973.728986] [] lock_acquire+0x150/0x217
    [ 973.728986] [] _raw_spin_lock+0x2d/0x3c
    [ 973.728986] [] sch_direct_xmit+0x8d/0x221
    [ 973.728986] [] __dev_queue_xmit+0x62a/0x912
    [ 973.728986] [] dev_queue_xmit+0xb/0xd
    [ 973.728986] [] neigh_direct_output+0xc/0xe
    [ 973.728986] [] ip_finish_output2+0x5db/0x609
    [ 973.728986] [] ip_finish_output+0x152/0x15e
    [ 973.728986] [] ip_output+0x8c/0x96
    [ 973.728986] [] ip_local_out+0x41/0x4a
    [ 973.728986] [] ip_queue_xmit+0x5a5/0x609
    [ 973.728986] [] l2tp_xmit_skb+0x582/0x5d7 [l2tp_core]
    [ 973.728986] [] pppol2tp_xmit+0x1f2/0x25e [l2tp_ppp]
    [ 973.728986] [] ppp_channel_push+0xb5/0x14a [ppp_generic]
    [ 973.728986] [] ppp_write+0x104/0x11c [ppp_generic]
    [ 973.728986] [] __vfs_write+0x56/0x120
    [ 973.728986] [] vfs_write+0xbd/0x11b
    [ 973.728986] [] SyS_write+0x5e/0x96
    [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8
    [ 973.728986]
    [ 973.728986] other info that might help us debug this:
    [ 973.728986]
    [ 973.728986] Chain exists of:
    &qdisc_xmit_lock_key --> &(&pch->downl)->rlock --> l2tp_sock

    [ 973.728986] Possible unsafe locking scenario:
    [ 973.728986]
    [ 973.728986] CPU0 CPU1
    [ 973.728986] ---- ----
    [ 973.728986] lock(l2tp_sock);
    [ 973.728986] lock(&(&pch->downl)->rlock);
    [ 973.728986] lock(l2tp_sock);
    [ 973.728986] lock(&qdisc_xmit_lock_key);
    [ 973.728986]
    [ 973.728986] *** DEADLOCK ***
    [ 973.728986]
    [ 973.728986] 6 locks held by accel-pppd/1806:
    [ 973.728986] #0: (&(&pch->downl)->rlock){+.-...}, at: [] ppp_channel_push+0x56/0x14a [ppp_generic]
    [ 973.728986] #1: (l2tp_sock){+.-...}, at: [] l2tp_xmit_skb+0x1e8/0x5d7 [l2tp_core]
    [ 973.728986] #2: (rcu_read_lock){......}, at: [] rcu_lock_acquire+0x0/0x20
    [ 973.728986] #3: (rcu_read_lock_bh){......}, at: [] rcu_lock_acquire+0x0/0x20
    [ 973.728986] #4: (rcu_read_lock_bh){......}, at: [] rcu_lock_acquire+0x0/0x20
    [ 973.728986] #5: (dev->qdisc_running_key ?: &qdisc_running_key#2){+.....}, at: [] __dev_queue_xmit+0x564/0x912
    [ 973.728986]
    [ 973.728986] stack backtrace:
    [ 973.728986] CPU: 2 PID: 1806 Comm: accel-pppd Tainted: G O 4.8.0-rc2 #1
    [ 973.728986] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014
    [ 973.728986] ffff7fffffffffff ffff88003436f850 ffffffff812a20f4 ffffffff82156e30
    [ 973.728986] ffffffff82156920 ffff88003436f890 ffffffff8115c759 ffff88003344ae00
    [ 973.728986] ffff88003344b5c0 0000000000000002 0000000000000006 ffff88003344b5e8
    [ 973.728986] Call Trace:
    [ 973.728986] [] dump_stack+0x67/0x90
    [ 973.728986] [] print_circular_bug+0x22e/0x23c
    [ 973.728986] [] __lock_acquire+0x1118/0x1483
    [ 973.728986] [] lock_acquire+0x150/0x217
    [ 973.728986] [] ? lock_acquire+0x150/0x217
    [ 973.728986] [] ? sch_direct_xmit+0x8d/0x221
    [ 973.728986] [] _raw_spin_lock+0x2d/0x3c
    [ 973.728986] [] ? sch_direct_xmit+0x8d/0x221
    [ 973.728986] [] sch_direct_xmit+0x8d/0x221
    [ 973.728986] [] __dev_queue_xmit+0x62a/0x912
    [ 973.728986] [] dev_queue_xmit+0xb/0xd
    [ 973.728986] [] neigh_direct_output+0xc/0xe
    [ 973.728986] [] ip_finish_output2+0x5db/0x609
    [ 973.728986] [] ? dst_mtu+0x29/0x2e
    [ 973.728986] [] ip_finish_output+0x152/0x15e
    [ 973.728986] [] ? ip_output+0x74/0x96
    [ 973.728986] [] ip_output+0x8c/0x96
    [ 973.728986] [] ip_local_out+0x41/0x4a
    [ 973.728986] [] ip_queue_xmit+0x5a5/0x609
    [ 973.728986] [] ? udp_set_csum+0x207/0x21e
    [ 973.728986] [] l2tp_xmit_skb+0x582/0x5d7 [l2tp_core]
    [ 973.728986] [] pppol2tp_xmit+0x1f2/0x25e [l2tp_ppp]
    [ 973.728986] [] ppp_channel_push+0xb5/0x14a [ppp_generic]
    [ 973.728986] [] ppp_write+0x104/0x11c [ppp_generic]
    [ 973.728986] [] __vfs_write+0x56/0x120
    [ 973.728986] [] ? fsnotify_perm+0x27/0x95
    [ 973.728986] [] ? security_file_permission+0x4d/0x54
    [ 973.728986] [] vfs_write+0xbd/0x11b
    [ 973.728986] [] SyS_write+0x5e/0x96
    [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8
    [ 973.728986] [] ? trace_hardirqs_off_caller+0x121/0x12f

    Signed-off-by: Guillaume Nault
    Signed-off-by: David S. Miller

    Guillaume Nault
     
  • In case of misconfiguration, a virtual PPP channel might send packets
    back to their parent PPP interface. This typically happens in
    misconfigured L2TP setups, where PPP's peer IP address is set with the
    IP of the L2TP peer.
    When that happens the system hangs due to PPP trying to recursively
    lock its xmit path.

    [ 243.332155] BUG: spinlock recursion on CPU#1, accel-pppd/926
    [ 243.333272] lock: 0xffff880033d90f18, .magic: dead4ead, .owner: accel-pppd/926, .owner_cpu: 1
    [ 243.334859] CPU: 1 PID: 926 Comm: accel-pppd Not tainted 4.8.0-rc2 #1
    [ 243.336010] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014
    [ 243.336018] ffff7fffffffffff ffff8800319a77a0 ffffffff8128de85 ffff880033d90f18
    [ 243.336018] ffff880033ad8000 ffff8800319a77d8 ffffffff810ad7c0 ffffffff0000039e
    [ 243.336018] ffff880033d90f18 ffff880033d90f60 ffff880033d90f18 ffff880033d90f28
    [ 243.336018] Call Trace:
    [ 243.336018] [] dump_stack+0x4f/0x65
    [ 243.336018] [] spin_dump+0xe1/0xeb
    [ 243.336018] [] spin_bug+0x26/0x28
    [ 243.336018] [] do_raw_spin_lock+0x5c/0x160
    [ 243.336018] [] _raw_spin_lock_bh+0x35/0x3c
    [ 243.336018] [] ? ppp_push+0xa7/0x82d [ppp_generic]
    [ 243.336018] [] ppp_push+0xa7/0x82d [ppp_generic]
    [ 243.336018] [] ? do_raw_spin_unlock+0xc2/0xcc
    [ 243.336018] [] ? preempt_count_sub+0x13/0xc7
    [ 243.336018] [] ? _raw_spin_unlock_irqrestore+0x34/0x49
    [ 243.336018] [] ppp_xmit_process+0x48/0x877 [ppp_generic]
    [ 243.336018] [] ? preempt_count_sub+0x13/0xc7
    [ 243.336018] [] ? skb_queue_tail+0x71/0x7c
    [ 243.336018] [] ppp_start_xmit+0x21b/0x22a [ppp_generic]
    [ 243.336018] [] dev_hard_start_xmit+0x15e/0x32c
    [ 243.336018] [] sch_direct_xmit+0xd6/0x221
    [ 243.336018] [] __dev_queue_xmit+0x52a/0x820
    [ 243.336018] [] dev_queue_xmit+0xb/0xd
    [ 243.336018] [] neigh_direct_output+0xc/0xe
    [ 243.336018] [] ip_finish_output2+0x4d2/0x548
    [ 243.336018] [] ? dst_mtu+0x29/0x2e
    [ 243.336018] [] ip_finish_output+0x152/0x15e
    [ 243.336018] [] ? ip_output+0x74/0x96
    [ 243.336018] [] ip_output+0x8c/0x96
    [ 243.336018] [] ip_local_out+0x41/0x4a
    [ 243.336018] [] ip_queue_xmit+0x531/0x5c5
    [ 243.336018] [] ? udp_set_csum+0x207/0x21e
    [ 243.336018] [] l2tp_xmit_skb+0x582/0x5d7 [l2tp_core]
    [ 243.336018] [] pppol2tp_xmit+0x1eb/0x257 [l2tp_ppp]
    [ 243.336018] [] ppp_channel_push+0x91/0x102 [ppp_generic]
    [ 243.336018] [] ppp_write+0x104/0x11c [ppp_generic]
    [ 243.336018] [] __vfs_write+0x56/0x120
    [ 243.336018] [] ? fsnotify_perm+0x27/0x95
    [ 243.336018] [] ? security_file_permission+0x4d/0x54
    [ 243.336018] [] vfs_write+0xbd/0x11b
    [ 243.336018] [] SyS_write+0x5e/0x96
    [ 243.336018] [] entry_SYSCALL_64_fastpath+0x13/0x94

    The main entry points for sending packets over a PPP unit are the
    .write() and .ndo_start_xmit() callbacks (simplified view):

    .write(unit fd) or .ndo_start_xmit()
    \
    CALL ppp_xmit_process()
    \
    LOCK unit's xmit path (ppp->wlock)
    |
    CALL ppp_push()
    \
    LOCK channel's xmit path (chan->downl)
    |
    CALL lower layer's .start_xmit() callback
    \
    ... might recursively call .ndo_start_xmit() ...
    /
    RETURN from .start_xmit()
    |
    UNLOCK channel's xmit path
    /
    RETURN from ppp_push()
    |
    UNLOCK unit's xmit path
    /
    RETURN from ppp_xmit_process()

    Packets can also be directly sent on channels (e.g. LCP packets):

    .write(channel fd) or ppp_output_wakeup()
    \
    CALL ppp_channel_push()
    \
    LOCK channel's xmit path (chan->downl)
    |
    CALL lower layer's .start_xmit() callback
    \
    ... might call .ndo_start_xmit() ...
    /
    RETURN from .start_xmit()
    |
    UNLOCK channel's xmit path
    /
    RETURN from ppp_channel_push()

    Key points about the lower layer's .start_xmit() callback:

    * It can be called directly by a channel fd .write() or by
    ppp_output_wakeup() or indirectly by a unit fd .write() or by
    .ndo_start_xmit().

    * In any case, it's always called with chan->downl held.

    * It might route the packet back to its parent unit using
    .ndo_start_xmit() as entry point.

    This patch detects and breaks recursion in ppp_xmit_process(). This
    function is a good candidate for the task because it's called early
    enough after .ndo_start_xmit(), it's always part of the recursion
    loop and it's on the path of whatever entry point is used to send
    a packet on a PPP unit.

    Recursion detection is done using the per-cpu ppp_xmit_recursion
    variable.

    Since ppp_channel_push() too locks the channel's xmit path and calls
    the lower layer's .start_xmit() callback, we need to also increment
    ppp_xmit_recursion there. However there's no need to check for
    recursion, as it's out of the recursion loop.

    Reported-by: Feng Gao
    Signed-off-by: Guillaume Nault
    Signed-off-by: David S. Miller

    Guillaume Nault
     
  • Casting away const is bad practice. Since this is ARM specific driver
    don't have hardware actually test this.

    Having getter functions for ops is really unnecessary code bloat, but
    not going to touch that.

    Signed-off-by: Stephen Hemminger
    Signed-off-by: David S. Miller

    stephen hemminger
     
  • Add support for the MDB operations. This consists of
    loading/purging/dumping multicast addresses for a given port in the ATU.

    Signed-off-by: Vivien Didelot
    Signed-off-by: David S. Miller

    Vivien Didelot
     
  • The MDB support for the mv88e6xxx driver will be very similar to the FDB
    support, since it consists of loading/purging/dumping address to/from
    the Address Translation Unit (ATU).

    Prepare the support for MDB by making the FDB code accessing the ATU
    generic. The FDB operations now provide access to the unicast addresses
    while the MDB operations will provide access to the multicast addresses.

    Signed-off-by: Vivien Didelot
    Signed-off-by: David S. Miller

    Vivien Didelot
     
  • Add firmware download support for cn23xx device.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • This patch adds support msix interrupt for cn23xx device.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • This patch adds support for cn23xx queue manipulation.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • Adds support for initializing cn23xx device registers
    related to mac, input/output and pf global config.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • Add support for cn23xx device init and sriov queue config.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • Add support for cn23xx specific queue definitions and
    features.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • This patch adds register definitions and structures for new
    device cn23xx.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • Add support of common irq enable functionality for both
    iq(instruction queue) and oq(output queue).

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • This patch contains changes for firmware version management.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • Consolidate common functionality of various devices
    from different files into lio_core.c/octeon_console.c.

    Signed-off-by: Derek Chickles
    Signed-off-by: Satanand Burla
    Signed-off-by: Felix Manlunas
    Signed-off-by: Raghu Vatsavayi
    Signed-off-by: David S. Miller

    Raghu Vatsavayi
     
  • Signed-off-by: Geert Uytterhoeven
    Signed-off-by: David S. Miller

    Geert Uytterhoeven
     
  • 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/)

    //
    @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 = { ... };
    //

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    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/)

    //
    @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 = { ... };
    //

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    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/)

    //
    @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 = { ... };
    //

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    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/)

    //
    @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 = { ... };
    //

    Signed-off-by: Julia Lawall
    Signed-off-by: David S. Miller

    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/)

    //
    @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 = { ... };
    //

    Signed-off-by: Julia Lawall
    Acked-by: Mark Einon
    Signed-off-by: David S. Miller

    Julia Lawall
     

31 Aug, 2016

1 commit

  • The addition of the per-queue statistics introduced a harmless warning
    on all 32-bit architectures:

    drivers/net/ethernet/qlogic/qede/qede_ethtool.c: In function 'qede_get_ethtool_stats':
    drivers/net/ethernet/qlogic/qede/qede_ethtool.c:244:31: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
    buf[cnt++] = QEDE_TQSTATS_DATA(edev,
    ^
    drivers/net/ethernet/qlogic/qede/qede_ethtool.c:244:22: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
    buf[cnt++] = QEDE_TQSTATS_DATA(edev,
    ^
    This changes the cast to 'void *' to shut up the warning, which
    avoids the assumptions on the size of the pointer type.

    Signed-off-by: Arnd Bergmann
    Fixes: 68db9ec2df07 ("qede: Add support for per-queue stats.")
    Signed-off-by: David S. Miller

    Arnd Bergmann