1. 21 5月, 2016 1 次提交
    • R
      PM / sleep: Handle failures in device_suspend_late() consistently · 3a17fb32
      Rafael J. Wysocki 提交于
      Grygorii Strashko reports:
      
       The PM runtime will be left disabled for the device if its
       .suspend_late() callback fails and async suspend is not allowed
       for this device. In this case device will not be added in
       dpm_late_early_list and dpm_resume_early() will ignore this
       device, as result PM runtime will be disabled for it forever
       (side effect: after 8 subsequent failures for the same device
       the PM runtime will be reenabled due to disable_depth overflow).
      
      To fix this problem, add devices to dpm_late_early_list regardless
      of whether or not device_suspend_late() returns errors for them.
      
      That will ensure failures in there to be handled consistently for
      all devices regardless of their async suspend/resume status.
      Reported-by: NGrygorii Strashko <grygorii.strashko@ti.com>
      Tested-by: NGrygorii Strashko <grygorii.strashko@ti.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: All applicable <stable@vger.kernel.org>
      3a17fb32
  2. 18 5月, 2016 5 次提交
  3. 17 5月, 2016 3 次提交
    • C
      ipmi: Fix the I2C address extraction from SPMI tables · 70f95b76
      Corey Minyard 提交于
      Unlike everywhere else in the IPMI specification, the I2C address
      specified in the SPMI table is not shifted to the left one bit with
      the LSB zero.  Instead it is not shifted with the MSB zero.
      Reported-by: NSanjeev <singhsan@codeaurora.org>
      Signed-off-by: NCorey Minyard <cminyard@mvista.com>
      70f95b76
    • C
      IPMI: reserve memio regions separately · 57a38f13
      Corey Minyard 提交于
      Commit d61a3ead ("[PATCH] IPMI: reserve I/O ports separately")
      changed the way I/O ports were reserved and includes this comment in
      log:
      
       Some BIOSes reserve disjoint I/O regions in their ACPI tables for the IPMI
       controller.  This causes problems when trying to register the entire I/O
       region.  Therefore we must register each I/O port separately.
      
      There is a similar problem with memio regions on an arm64 platform
      (AMD Seattle). Where I see:
      
       ipmi message handler version 39.2
       ipmi_si AMDI0300:00: probing via device tree
       ipmi_si AMDI0300:00: ipmi_si: probing via ACPI
       ipmi_si AMDI0300:00: [mem 0xe0010000] regsize 1 spacing 4 irq 23
       ipmi_si: Adding ACPI-specified kcs state machine
       IPMI System Interface driver.
       ipmi_si: Trying ACPI-specified kcs state machine at mem \
                address 0xe0010000, slave address 0x0, irq 23
       ipmi_si: Could not set up I/O space
      
      The problem is that the ACPI core registers disjoint regions for the
      platform device:
      
      e0010000-e0010000 : AMDI0300:00
      e0010004-e0010004 : AMDI0300:00
      
      and the ipmi_si driver tries to register one region e0010000-e0010004.
      
      Based on a patch from Mark Salter <msalter@redhat.com>, who also wrote
      all the above text.
      Signed-off-by: NCorey Minyard <cminyard@mvista.com>
      Tested-by: NMark Salter <msalter@redhat.com>
      57a38f13
    • C
      ipmi: Fix some minor coding style issues · 76824852
      Corey Minyard 提交于
      Signed-off-by: NCorey Minyard <cminyard@mvista.com>
      76824852
  4. 16 5月, 2016 5 次提交
  5. 14 5月, 2016 5 次提交
  6. 13 5月, 2016 5 次提交
  7. 12 5月, 2016 11 次提交
    • Y
      EDAC, mce_amd: Detect SMCA using X86_FEATURE_SMCA · a348ed83
      Yazen Ghannam 提交于
      Use X86_FEATURE_SMCA when detecting if SMCA is available instead of
      directly using CPUID 0x80000007_EBX.
      Signed-off-by: NYazen Ghannam <Yazen.Ghannam@amd.com>
      Signed-off-by: NBorislav Petkov <bp@suse.de>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Tony Luck <tony.luck@intel.com>
      Cc: linux-edac <linux-edac@vger.kernel.org>
      Link: http://lkml.kernel.org/r/1462971509-3856-7-git-send-email-bp@alien8.deSigned-off-by: NIngo Molnar <mingo@kernel.org>
      a348ed83
    • M
      bnxt_en: Add workaround to detect bad opaque in rx completion (part 2) · fa7e2812
      Michael Chan 提交于
      Add detection and recovery code when the hardware returned opaque value
      does not match the expected consumer index.  Once the issue is detected,
      we skip the processing of all RX and LRO/GRO packets.  These completion
      entries are discarded without sending the SKB to the stack and without
      producing new buffers.  The function will be reset from a workqueue.
      Signed-off-by: NMichael Chan <michael.chan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      fa7e2812
    • M
      bnxt_en: Add workaround to detect bad opaque in rx completion (part 1) · 376a5b86
      Michael Chan 提交于
      There is a rare hardware bug that can cause a bad opaque value in the RX
      or TPA completion.  When this happens, the hardware may have used the
      same buffer twice for 2 rx packets.  In addition, the driver will also
      crash later using the bad opaque as the index into the ring.
      
      The rx opaque value is predictable and is always monotonically increasing.
      The workaround is to keep track of the expected next opaque value and
      compare it with the one returned by hardware during RX and TPA start
      completions.  If they miscompare, we will not process any more RX and
      TPA completions and exit NAPI.  We will then schedule a workqueue to
      reset the function.
      
      This patch adds the logic to keep track of the next rx consumer index.
      Signed-off-by: NMichael Chan <michael.chan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      376a5b86
    • D
      qlcnic: potential NULL dereference in qlcnic_83xx_get_minidump_template() · 5f46feab
      Dan Carpenter 提交于
      If qlcnic_fw_cmd_get_minidump_temp() fails then "fw_dump->tmpl_hdr" is
      NULL or possibly freed.  It can lead to an oops later.
      
      Fixes: d01a6d3c ('qlcnic: Add support to enable capability to extend minidump for iSCSI')
      Signed-off-by: NDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      5f46feab
    • R
      intel_pstate: Clean up get_target_pstate_use_performance() · 1aa7a6e2
      Rafael J. Wysocki 提交于
      The comments and the core_busy variable name in
      get_target_pstate_use_performance() are totally confusing,
      so modify them to reflect what's going on.
      
      The results of the computations should be the same as before.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      1aa7a6e2
    • R
      intel_pstate: Use sample.core_avg_perf in get_avg_pstate() · 8edb0a6e
      Rafael J. Wysocki 提交于
      Notice that get_avg_pstate() can use sample.core_avg_perf instead of
      carrying the same division again, so make it do that.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      8edb0a6e
    • R
      intel_pstate: Clarify average performance computation · a1c9787d
      Rafael J. Wysocki 提交于
      The core_pct_busy field of struct sample actually contains the
      average performace during the last sampling period (in percent)
      and not the utilization of the core as suggested by its name
      which is confusing.
      
      For this reason, change the name of that field to core_avg_perf
      and rename the function that computes its value accordingly.
      
      Also notice that storing this value as percentage requires a costly
      integer multiplication to be carried out in a hot path, so instead
      store it as an "extended fixed point" value with more fraction bits
      and update the code using it accordingly (it is better to change the
      name of the field along with its meaning in one go than to make those
      two changes separately, as that would likely lead to more
      confusion).
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      a1c9787d
    • C
      intel_pstate: Avoid unnecessary synchronize_sched() during initialization · 4578ee7e
      Chen Yu 提交于
      Currently, in intel_pstate_clear_update_util_hook(), after
      clearing the utilization update hook, we leverage
      synchronize_sched() to deal with synchronization, which
      is a little bit time-costly because synchronize_sched()
      has to wait for all the CPUs to go through a grace period.
      
      Actually, the synchronize_sched() is not necessary if the utilization
      update hook has not been set for the given CPU yet, so make the driver
      check if that's the case and avoid the synchronize_sched() call then.
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=116371Tested-by: NTian Ye <yex.tian@intel.com>
      Signed-off-by: NChen Yu <yu.c.chen@intel.com>
      [ rjw : Rebase ]
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      4578ee7e
    • A
      cpufreq: schedutil: Make default depend on CONFIG_SMP · cfe9492f
      Arnd Bergmann 提交于
      CPU_FREQ_GOV_SCHEDUTIL gained a dependency on SMP, so now we
      get a warning if it gets selected by CPU_FREQ_DEFAULT_GOV_SCHEDUTIL
      without SMP:
      
      warning: (CPU_FREQ_DEFAULT_GOV_SCHEDUTIL) selects CPU_FREQ_GOV_SCHEDUTIL which has unmet direct dependencies (CPU_FREQ && SMP)
      
      This adds another dependency to avoid the problem.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Fixes: bf7cdff1 (cpufreq: schedutil: Make it depend on CONFIG_SMP)
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      cfe9492f
    • M
      Revert "[media] videobuf2-v4l2: Verify planes array in buffer dequeueing" · 93f0750d
      Mauro Carvalho Chehab 提交于
      This patch causes a Kernel panic when called on a DVB driver.
      
      This was also reported by David R <david@unsolicited.net>:
      
      May  7 14:47:35 server kernel: [  501.247123] BUG: unable to handle kernel NULL pointer dereference at 0000000000000004
      May  7 14:47:35 server kernel: [  501.247239] IP: [<ffffffffa0222c71>] __verify_planes_array.isra.3+0x1/0x80 [videobuf2_v4l2]
      May  7 14:47:35 server kernel: [  501.247354] PGD cae6f067 PUD ca99c067 PMD 0
      May  7 14:47:35 server kernel: [  501.247426] Oops: 0000 [#1] SMP
      May  7 14:47:35 server kernel: [  501.247482] Modules linked in: xfs tun xt_connmark xt_TCPMSS xt_tcpmss xt_owner xt_REDIRECT nf_nat_redirect xt_nat ipt_MASQUERADE nf_nat_masquerade_ipv4 ts_kmp ts_bm xt_string ipt_REJECT nf_reject_ipv4 xt_recent xt_conntrack xt_multiport xt_pkttype xt_tcpudp xt_mark nf_log_ipv4 nf_log_common xt_LOG xt_limit iptable_mangle iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_filter ip_tables ip6table_filter ip6_tables x_tables pppoe pppox dm_crypt ts2020 regmap_i2c ds3000 cx88_dvb dvb_pll cx88_vp3054_i2c mt352 videobuf2_dvb cx8800 cx8802 cx88xx pl2303 tveeprom videobuf2_dma_sg ppdev videobuf2_memops videobuf2_v4l2 videobuf2_core dvb_usb_digitv snd_hda_codec_via snd_hda_codec_hdmi snd_hda_codec_generic radeon dvb_usb snd_hda_intel amd64_edac_mod serio_raw snd_hda_codec edac_core fbcon k10temp bitblit softcursor snd_hda_core font snd_pcm_oss i2c_piix4 snd_mixer_oss tileblit drm_kms_helper syscopyarea snd_pcm snd_seq_dummy sysfillrect snd_seq_oss sysimgblt fb_sys_fops ttm snd_seq_midi r8169 snd_rawmidi drm snd_seq_midi_event e1000e snd_seq snd_seq_device snd_timer snd ptp pps_core i2c_algo_bit soundcore parport_pc ohci_pci shpchp tpm_tis tpm nfsd auth_rpcgss oid_registry hwmon_vid exportfs nfs_acl mii nfs bonding lockd grace lp sunrpc parport
      May  7 14:47:35 server kernel: [  501.249564] CPU: 1 PID: 6889 Comm: vb2-cx88[0] Not tainted 4.5.3 #3
      May  7 14:47:35 server kernel: [  501.249644] Hardware name: System manufacturer System Product Name/M4A785TD-V EVO, BIOS 0211    07/08/2009
      May  7 14:47:35 server kernel: [  501.249767] task: ffff8800aebf3600 ti: ffff8801e07a0000 task.ti: ffff8801e07a0000
      May  7 14:47:35 server kernel: [  501.249861] RIP: 0010:[<ffffffffa0222c71>]  [<ffffffffa0222c71>] __verify_planes_array.isra.3+0x1/0x80 [videobuf2_v4l2]
      May  7 14:47:35 server kernel: [  501.250002] RSP: 0018:ffff8801e07a3de8  EFLAGS: 00010086
      May  7 14:47:35 server kernel: [  501.250071] RAX: 0000000000000283 RBX: ffff880210dc5000 RCX: 0000000000000283
      May  7 14:47:35 server kernel: [  501.250161] RDX: ffffffffa0222cf0 RSI: 0000000000000000 RDI: ffff880210dc5014
      May  7 14:47:35 server kernel: [  501.250251] RBP: ffff8801e07a3df8 R08: ffff8801e07a0000 R09: 0000000000000000
      May  7 14:47:35 server kernel: [  501.250348] R10: 0000000000000000 R11: 0000000000000001 R12: ffff8800cda2a9d8
      May  7 14:47:35 server kernel: [  501.250438] R13: ffff880210dc51b8 R14: 0000000000000000 R15: ffff8800cda2a828
      May  7 14:47:35 server kernel: [  501.250528] FS:  00007f5b77fff700(0000) GS:ffff88021fc40000(0000) knlGS:00000000adaffb40
      May  7 14:47:35 server kernel: [  501.250631] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
      May  7 14:47:35 server kernel: [  501.250704] CR2: 0000000000000004 CR3: 00000000ca19d000 CR4: 00000000000006e0
      May  7 14:47:35 server kernel: [  501.250794] Stack:
      May  7 14:47:35 server kernel: [  501.250822]  ffff8801e07a3df8 ffffffffa0222cfd ffff8801e07a3e70 ffffffffa0236beb
      May  7 14:47:35 server kernel: [  501.250937]  0000000000000283 ffff8801e07a3e94 0000000000000000 0000000000000000
      May  7 14:47:35 server kernel: [  501.251051]  ffff8800aebf3600 ffffffff8108d8e0 ffff8801e07a3e38 ffff8801e07a3e38
      May  7 14:47:35 server kernel: [  501.251165] Call Trace:
      May  7 14:47:35 server kernel: [  501.251200]  [<ffffffffa0222cfd>] ? __verify_planes_array_core+0xd/0x10 [videobuf2_v4l2]
      May  7 14:47:35 server kernel: [  501.251306]  [<ffffffffa0236beb>] vb2_core_dqbuf+0x2eb/0x4c0 [videobuf2_core]
      May  7 14:47:35 server kernel: [  501.251398]  [<ffffffff8108d8e0>] ? prepare_to_wait_event+0x100/0x100
      May  7 14:47:35 server kernel: [  501.251482]  [<ffffffffa023855b>] vb2_thread+0x1cb/0x220 [videobuf2_core]
      May  7 14:47:35 server kernel: [  501.251569]  [<ffffffffa0238390>] ? vb2_core_qbuf+0x230/0x230 [videobuf2_core]
      May  7 14:47:35 server kernel: [  501.251662]  [<ffffffffa0238390>] ? vb2_core_qbuf+0x230/0x230 [videobuf2_core]
      May  7 14:47:35 server kernel: [  501.255982]  [<ffffffff8106f984>] kthread+0xc4/0xe0
      May  7 14:47:35 server kernel: [  501.260292]  [<ffffffff8106f8c0>] ? kthread_park+0x50/0x50
      May  7 14:47:35 server kernel: [  501.264615]  [<ffffffff81697a5f>] ret_from_fork+0x3f/0x70
      May  7 14:47:35 server kernel: [  501.268962]  [<ffffffff8106f8c0>] ? kthread_park+0x50/0x50
      May  7 14:47:35 server kernel: [  501.273216] Code: 0d 01 74 16 48 8b 46 28 48 8b 56 30 48 89 87 d0 01 00 00 48 89 97 d8 01 00 00 5d c3 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 55 <8b> 46 04 48 89 e5 8d 50 f7 31 c0 83 fa 01 76 02 5d c3 48 83 7e
      May  7 14:47:35 server kernel: [  501.282146] RIP  [<ffffffffa0222c71>] __verify_planes_array.isra.3+0x1/0x80 [videobuf2_v4l2]
      May  7 14:47:35 server kernel: [  501.286391]  RSP <ffff8801e07a3de8>
      May  7 14:47:35 server kernel: [  501.290619] CR2: 0000000000000004
      May  7 14:47:35 server kernel: [  501.294786] ---[ end trace b2b354153ccad110 ]---
      
      This reverts commit 2c1f6951.
      
      Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
      Cc: Hans Verkuil <hans.verkuil@cisco.com>
      Cc: stable@vger.kernel.org
      Fixes: 2c1f6951 ("[media] videobuf2-v4l2: Verify planes array in buffer dequeueing")
      Signed-off-by: NMauro Carvalho Chehab <mchehab@osg.samsung.com>
      93f0750d
    • K
      regulator: lp873x: Add support for lp873x PMIC regulators · 994aae32
      Keerthy 提交于
      The regulators set consists of 2 BUCKs and 2 LDOs. The output
      voltages are configurable and are meant to supply power to the
      main processor and other components. The ramp delay is configurable
      for both BUCKs.
      Signed-off-by: NKeerthy <j-keerthy@ti.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      994aae32
  8. 11 5月, 2016 5 次提交
    • A
      cpufreq: powernv: del_timer_sync when global and local pstate are equal · 0bc10b93
      Akshay Adiga 提交于
      When global and local pstate are equal in a powernv_target_index() call,
      we don't queue a timer. But we may have timer already queued for future.
      This could cause the timer to fire one additional time for no use.
      Signed-off-by: NAkshay Adiga <akshay.adiga@linux.vnet.ibm.com>
      Acked-by: NViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      0bc10b93
    • A
      cpufreq: powernv: Move smp_call_function_any() out of irq safe block · 1fd3ff28
      Akshay Adiga 提交于
      Fix a WARN_ON caused by smp_call_function_any() when irq is disabled,
      because of changes made in the patch ('cpufreq: powernv: Ramp-down
       global pstate slower than local-pstate')
      https://patchwork.ozlabs.org/patch/612058/
      
       WARNING: CPU: 0 PID: 4 at kernel/smp.c:291
      smp_call_function_single+0x170/0x180
      
       Call Trace:
       [c0000007f648f9f0] [c0000007f648fa90] 0xc0000007f648fa90 (unreliable)
       [c0000007f648fa30] [c0000000001430e0] smp_call_function_any+0x170/0x1c0
       [c0000007f648fa90] [c0000000007b4b00]
      powernv_cpufreq_target_index+0xe0/0x250
       [c0000007f648fb00] [c0000000007ac9dc]
      __cpufreq_driver_target+0x20c/0x3d0
       [c0000007f648fbc0] [c0000000007b1b4c] od_dbs_timer+0xcc/0x260
       [c0000007f648fc10] [c0000000007b3024] dbs_work_handler+0x54/0xa0
       [c0000007f648fc50] [c0000000000c49a8] process_one_work+0x1d8/0x590
       [c0000007f648fce0] [c0000000000c4e08] worker_thread+0xa8/0x660
       [c0000007f648fd80] [c0000000000cca88] kthread+0x108/0x130
       [c0000007f648fe30] [c0000000000095e8] ret_from_kernel_thread+0x5c/0x74
      
      - Calling smp_call_function_any() with interrupt disabled (through
       spin_lock_irqsave) could cause a deadlock, as smp_call_function_any()
       relies on the IPI to complete. This is detected in the
       smp_call_function_any() call and hence the WARN_ON.
      
      - As the spinlock (gpstates->lock) is only used to synchronize access of
       global_pstate_info  between timer irq handler and target_index calls. And
       the timer irq handler just try_locks() hence it would not cause a
       deadlock. Hence could do without making spinlocks irq safe.
      
      - As the smp_call_function_any() is a blocking call and does not access
       global_pstates_info, it could reduce the critcal section by moving
       smp_call_function_any() after giving up the lock.
      Reported-by: NAbdul Haleem <abdhalee@linux.vnet.linux.com>
      Signed-off-by: NAkshay Adiga <akshay.adiga@linux.vnet.ibm.com>
      Acked-by: NViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      1fd3ff28
    • S
      net: phylib: fix interrupts re-enablement in phy_start · 84a527a4
      Shaohui Xie 提交于
      If phy was suspended and is starting, current driver always enable
      phy's interrupts, if phy works in polling, phy can raise unexpected
      interrupt which will not be handled, the interrupt will block system
      enter suspend again. So interrupts should only be re-enabled if phy
      works in interrupt.
      Signed-off-by: NShaohui Xie <Shaohui.Xie@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      84a527a4
    • E
      net: nps_enet: bug fix - handle lost tx interrupts · 05c00d82
      Elad Kanfi 提交于
      The tx interrupt is of edge type, and in case such interrupt is triggered
      while it is masked it will not be handled even after tx interrupts are
      re-enabled in the end of NAPI poll.
      This will cause tx network to stop in the following scenario:
       * Rx is being handled, hence interrupts are masked.
       * Tx interrupt is triggered after checking if there is some tx to handle
         and before re-enabling the interrupts.
      In this situation only rx transaction will release tx requests.
      
      In order to handle the tx that was missed( if there was one ),
      a NAPI reschdule was added after enabling the interrupts.
      Signed-off-by: NElad Kanfi <eladkan@mellanox.com>
      Acked-by: NNoam Camus <noamca@mellanox.com>
      Acked-by: NGilad Ben-Yossef <giladby@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      05c00d82
    • E
      net: nps_enet: Tx handler synchronization · e5df49d5
      Elad Kanfi 提交于
      Below is a description of a possible problematic
      sequence. CPU-A is sending a frame and CPU-B handles
      the interrupt that indicates the frame was sent. CPU-B
      reads an invalid value of tx_packet_sent.
      
      	CPU-A				CPU-B
      	-----				-----
      	nps_enet_send_frame
      	.
      	.
      	tx_skb = skb
      	tx_packet_sent = true
      	order HW to start tx
      	.
      	.
      	HW complete tx
      			    ------> 	get tx complete interrupt
      					.
      					.
      					if(tx_packet_sent == true)
      						handle tx_skb
      
      	end memory transaction
      	(tx_packet_sent actually
      	 written)
      
      Furthermore there is a dependency between tx_skb and tx_packet_sent.
      There is no assurance that tx_skb contains a valid pointer at CPU B
      when it sees tx_packet_sent == true.
      
      Solution:
      
      Initialize tx_skb to NULL and use it to indicate that packet was sent,
      in this way tx_packet_sent can be removed.
      Add a write memory barrier after setting tx_skb in order to make sure
      that it is valid before HW is informed and IRQ is fired.
      
      Fixed sequence will be:
      
             CPU-A                           CPU-B
             -----                           -----
      
      	tx_skb = skb
      	wmb()
      	.
      	.
      	order HW to start tx
      	.
      	.
      	HW complete tx
      			------>		get tx complete interrupt
      					.
      					.
      					if(tx_skb != NULL)
      						handle tx_skb
      
      					tx_skb = NULL
      Signed-off-by: NElad Kanfi <eladkan@mellanox.com>
      Acked-by: NNoam Camus <noamca@mellanox.com>
      Acked-by: NGilad Ben-Yossef <giladby@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e5df49d5