1. 20 9月, 2014 1 次提交
    • N
      3c59x: Add dma error checking and recovery · 6f2b6a30
      Neil Horman 提交于
      Noted that 3c59x has no checks on transmit for failed DMA mappings, and no
      ability to unmap fragments when a single map fails in the middle of a transmit.
      This patch provides error checking to ensure that dma mappings work properly,
      and unrolls an skb mapping if a fragmented skb transmission has a mapping
      failure to prevent leaks.
      Signed-off-by: NNeil Horman <nhorman@tuxdriver.com>
      CC: Linux Kernel list <linux-kernel@vger.kernel.org>
      CC: "David S. Miller" <davem@davemloft.net>
      CC: Meelis Roos <mroos@linux.ee>
      Tested-by: NMeelis Roos <mroos@linux.ee>
      6f2b6a30
  2. 06 9月, 2014 1 次提交
    • N
      3c59x: avoid panic in boomerang_start_xmit when finding page address: · 98ea232c
      Neil Horman 提交于
      This bug was reported on a very old kernel (RHEL6, 2.6.32-491.el6):
      
      BUG: unable to handle kernel paging request at 00800000
      IP: [<c04107b5>] nommu_map_page+0x15/0x110
      *pdpt = 000000003454f001 *pde = 000000003f03d067
      Oops: 0000 [#1] SMP
      last sysfs file: /sys/devices/system/cpu/online
      Modules linked in: nfsd lockd nfs_acl auth_rpcgss sunrpc exportfs p4_clockmod
      ipv6 ppdev parport_pc parport microcode iTCO_wdt iTCO_vendor_support 3c59x mii
      dcdbas serio_raw snd_intel8x0 snd_ac97_codec ac97_bus snd_seq snd_seq_device
      snd_pcm snd_timer snd soundcore snd_page_alloc i2c_i801 sg lpc_ich mfd_core ext4
      jbd2 mbcache sr_mod cdrom sd_mod crc_t10dif pata_acpi ata_generic ata_piix
      radeon ttm drm_kms_helper drm i2c_algo_bit i2c_core dm_mirror dm_region_hash
      dm_log dm_mod [last unloaded: mperf]
      
      Pid: 4219, comm: nfsd Not tainted 2.6.32-491.el6.i686 #1 Dell Computer
      Corporation OptiPlex GX240               /OptiPlex GX240
      EIP: 0060:[<c04107b5>] EFLAGS: 00010246 CPU: 0
      EIP is at nommu_map_page+0x15/0x110
      EAX: 00000000 EBX: c0a83480 ECX: 00000000 EDX: 00800000
      ESI: 00000000 EDI: f70e7860 EBP: e2d09b54 ESP: e2d09b24
       DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
      Process nfsd (pid: 4219, ti=e2d08000 task=e2ceaaa0 task.ti=e2d08000)
      Stack:
       00000056 00000000 0000000e c65efd38 00000020 00000296 00000206 00000206
      <0> c050c850 c0a83480 e2cef154 00000001 e2d09ba8 f8fcd585 00000510 00000001
      <0> 00000000 00000000 f5172200 f8fdac00 0039ef8c f5277020 f70e7860 00000510
      Call Trace:
       [<c050c850>] ? page_address+0xd0/0xe0
       [<f8fcd585>] ? boomerang_start_xmit+0x3b5/0x520 [3c59x]
       [<c07b2975>] ? dev_hard_start_xmit+0xe5/0x400
       [<f9182b00>] ? ip6_output_finish+0x0/0xf0 [ipv6]
       [<c07ca053>] ? sch_direct_xmit+0x113/0x180
       [<c07d5588>] ? nf_hook_slow+0x68/0x120
       [<c07b2ea5>] ? dev_queue_xmit+0x1b5/0x290
       [<f9182b6d>] ? ip6_output_finish+0x6d/0xf0 [ipv6]
       [<f9184cb8>] ? ip6_xmit+0x3e8/0x490 [ipv6]
       [<f91ab9f9>] ? inet6_csk_xmit+0x289/0x2f0 [ipv6]
       [<c07f6451>] ? tcp_transmit_skb+0x431/0x7f0
       [<c07a403f>] ? __alloc_skb+0x4f/0x140
       [<c07f85a2>] ? tcp_write_xmit+0x1c2/0xa50
       [<c07f90b1>] ? __tcp_push_pending_frames+0x31/0xe0
       [<c07ea47a>] ? tcp_sendpage+0x44a/0x4b0
       [<c07ea030>] ? tcp_sendpage+0x0/0x4b0
       [<c079be1e>] ? kernel_sendpage+0x4e/0x90
       [<f8457bb9>] ? svc_send_common+0xc9/0x120 [sunrpc]
       [<f8457c85>] ? svc_sendto+0x75/0x1f0 [sunrpc]
       [<c060d0d9>] ? _atomic_dec_and_lock+0x59/0x90
       [<f87d55d0>] ? nfs3svc_encode_readres+0x0/0xc0 [nfsd]
       [<f845876d>] ? svc_authorise+0x2d/0x40 [sunrpc]
       [<f87d4410>] ? nfs3svc_release_fhandle+0x0/0x10 [nfsd]
       [<f8455721>] ? svc_process_common+0xf1/0x5a0 [sunrpc]
       [<f8457e86>] ? svc_tcp_sendto+0x36/0xa0 [sunrpc]
       [<f8461778>] ? svc_send+0x98/0xd0 [sunrpc]
       [<f87c698c>] ? nfsd+0xac/0x140 [nfsd]
       [<c04470e0>] ? complete+0x40/0x60
       [<f87c68e0>] ? nfsd+0x0/0x140 [nfsd]
       [<c04802ac>] ? kthread+0x7c/0xa0
       [<c0480230>] ? kthread+0x0/0xa0
       [<c0409f9f>] ? kernel_thread_helper+0x7/0x10
      Code: 8d b6 00 00 00 00 eb f8 8d b4 26 00 00 00 00 8d bc 27 00 00 00 00 55 89 e5
      83 ec 30 89 75 f8 31 f6 89 7d fc 89 c7 89 c8 89 5d f4 <8b> 1a 8b 4d 08 c1 eb 19
      c1 e3 04 8b 9b c0 29 c7 c0 83 e3 fc 29
      
      But the problem seems to still exist upstream.  It seems on 32 bit kernels
      page_address() can reutrn a NULL value in some circumstances, and the
      pci_map_single api isn't prepared to handle that (on this system it results in a
      bogus pointer deference in nommu_map_page.
      
      The fix is pretty easy, if we convert the 3c59x driver to use the more
      convieient skb_frag_dma_map api we don't need to find the virtual address of the
      page at all, and page gets mapped to the hardware properly.  Verified to fix the
      problem as described by the reporter.
      
      Applies to the net tree
      
      Change Notes:
      
      v2) Converted PCI_DMA_TODEVICE to DMA_TO_DEVICE.  Thanks Dave!
      
      v3) Actually Run git commit after making changes to v2 :)
      Signed-off-by: NNeil Horman <nhorman@tuxdriver.com>
      CC: klassert@mathematik.tu-chemnitz.de
      CC: "David S. Miller" <davem@davemloft.net>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      98ea232c
  3. 13 8月, 2014 1 次提交
  4. 25 3月, 2014 1 次提交
  5. 10 2月, 2014 1 次提交
  6. 20 12月, 2013 1 次提交
  7. 07 12月, 2013 1 次提交
  8. 12 6月, 2013 1 次提交
  9. 21 5月, 2013 1 次提交
  10. 12 5月, 2013 1 次提交
  11. 07 5月, 2013 1 次提交
  12. 09 1月, 2013 1 次提交
  13. 08 12月, 2012 1 次提交
  14. 04 12月, 2012 1 次提交
  15. 15 2月, 2012 1 次提交
  16. 07 2月, 2012 1 次提交
  17. 01 2月, 2012 1 次提交
  18. 09 11月, 2011 1 次提交
  19. 19 10月, 2011 1 次提交
  20. 31 8月, 2011 1 次提交
  21. 18 8月, 2011 1 次提交
  22. 11 8月, 2011 1 次提交
  23. 01 6月, 2011 1 次提交
  24. 19 4月, 2011 1 次提交
  25. 31 3月, 2011 1 次提交
  26. 19 11月, 2010 1 次提交
    • N
      3c59x: fix build failure on !CONFIG_PCI · d530db0d
      Namhyung Kim 提交于
      VORTEX_PCI() could return NULL so it needs to be casted before
      accessing any member of struct pci_dev. This fixes following
      build failure. Likewise VORTEX_EISA() was changed also.
      
        CC [M]  drivers/net/3c59x.o
      drivers/net/3c59x.c: In function 'acpi_set_WOL':
      drivers/net/3c59x.c:3211:39: warning: dereferencing 'void *' pointer
      drivers/net/3c59x.c:3211:39: error: request for member 'current_state' in something not a structure or union
      make[3]: *** [drivers/net/3c59x.o] Error 1
      make[2]: *** [drivers/net/3c59x.o] Error 2
      make[1]: *** [sub-make] Error 2
      make: *** [all] Error 2
      Signed-off-by: NNamhyung Kim <namhyung@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d530db0d
  27. 28 9月, 2010 1 次提交
    • J
      3c59x: fix regression from patch "Add ethtool WOL support" · 3fd6c88e
      Jan Beulich 提交于
      This patch (commit 690a1f20) added a
      new call site for acpi_set_WOL() without checking that the function is
      actually suitable to be called via
      
       vortex_set_wol+0xcd/0xe0 [3c59x]
       dev_ethtool+0xa5a/0xb70
       dev_ioctl+0x2e0/0x4b0
       T.961+0x49/0x50
       sock_ioctl+0x47/0x290
       do_vfs_ioctl+0x7f/0x340
       sys_ioctl+0x80/0xa0
       system_call_fastpath+0x16/0x1b
      
      i.e. outside of code paths run when the device is not yet enabled or
      already disabled. In particular, putting the device into D3hot is a
      pretty bad idea when it was already brought up.
      
      Furthermore, all prior callers of the function made sure they're
      actually dealing with a PCI device, while the newly added one didn't.
      
      In the same spirit, the .get_wol handler shouldn't indicate support
      for WOL for non-PCI devices.
      Signed-off-by: NJan Beulich <jbeulich@novell.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3fd6c88e
  28. 16 9月, 2010 1 次提交
    • D
      3c59x: Remove atomic context inside vortex_{set|get}_wol · 84176b7b
      Denis Kirjanov 提交于
      There is no need to use spinlocks in vortex_{set|get}_wol.
      This also fixes a bug:
      [  254.214993] 3c59x 0000:00:0d.0: PME# enabled
      [  254.215021] BUG: sleeping function called from invalid context at kernel/mutex.c:94
      [  254.215030] in_atomic(): 0, irqs_disabled(): 1, pid: 4875, name: ethtool
      [  254.215042] Pid: 4875, comm: ethtool Tainted: G        W   2.6.36-rc3+ #7
      [  254.215049] Call Trace:
      [  254.215050]  [] __might_sleep+0xb1/0xb6
      [  254.215050]  [] mutex_lock+0x17/0x30
      [  254.215050]  [] acpi_enable_wakeup_device_power+0x2b/0xb1
      [  254.215050]  [] acpi_pm_device_sleep_wake+0x42/0x7f
      [  254.215050]  [] acpi_pci_sleep_wake+0x5d/0x63
      [  254.215050]  [] platform_pci_sleep_wake+0x1d/0x20
      [  254.215050]  [] __pci_enable_wake+0x90/0xd0
      [  254.215050]  [] acpi_set_WOL+0x8e/0xf5 [3c59x]
      [  254.215050]  [] vortex_set_wol+0x4e/0x5e [3c59x]
      [  254.215050]  [] dev_ethtool+0x1cf/0xb61
      [  254.215050]  [] ? debug_mutex_free_waiter+0x45/0x4a
      [  254.215050]  [] ? __mutex_lock_common+0x204/0x20e
      [  254.215050]  [] ? __mutex_lock_slowpath+0x12/0x15
      [  254.215050]  [] ? mutex_lock+0x23/0x30
      [  254.215050]  [] dev_ioctl+0x42c/0x533
      [  254.215050]  [] ? _cond_resched+0x8/0x1c
      [  254.215050]  [] ? lock_page+0x1c/0x30
      [  254.215050]  [] ? page_address+0x15/0x7c
      [  254.215050]  [] ? filemap_fault+0x187/0x2c4
      [  254.215050]  [] sock_ioctl+0x1d4/0x1e0
      [  254.215050]  [] ? sock_ioctl+0x0/0x1e0
      [  254.215050]  [] vfs_ioctl+0x19/0x33
      [  254.215050]  [] do_vfs_ioctl+0x424/0x46f
      [  254.215050]  [] ? selinux_file_ioctl+0x3c/0x40
      [  254.215050]  [] sys_ioctl+0x40/0x5a
      [  254.215050]  [] sysenter_do_call+0x12/0x22
      
      vortex_set_wol protected with a spinlock, but nested  acpi_set_WOL acquires a mutex inside atomic context.
      Ethtool operations are already serialized by RTNL mutex, so it is safe to drop the locks.
      Signed-off-by: NDenis Kirjanov <dkirjanov@kernel.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      84176b7b
  29. 08 9月, 2010 1 次提交
    • B
      3c59x: Fix deadlock in vortex_error() · 89b12fab
      Ben Hutchings 提交于
      This fixes a bug introduced in commit
      de847272
      "3c59x: Use fine-grained locks for MII and windowed register access".
      
      vortex_interrupt() holds vp->window_lock over multiple register
      accesses to reduce locking overhead.  However it also needs to call
      vortex_error() sometimes, and that uses the regular functions for
      access to windowed registers, which will try to acquire window_lock
      again.
      
      Therefore, drop window_lock around the call to vortex_error() and set
      the window afterward reacquiring the lock.  Since vortex_error() may
      call vortex_rx(), which *does* require its caller to hold window_lock,
      lift that call up into vortex_interrupt().  This also removes the
      potential for calling vortex_rx() on a later-generation NIC.
      
      Reported-and-tested-by: Jens Schüßler <jgs@trash.net> [in Debian's 2.6.32]
      Signed-off-by: NBen Hutchings <ben@decadent.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      89b12fab
  30. 02 9月, 2010 1 次提交
    • B
      3c59x: Remove incorrect locking; correct documented lock hierarchy · 24cd804d
      Ben Hutchings 提交于
      vortex_ioctl() was grabbing vortex_private::lock around its call to
      generic_mii_ioctl().  This is no longer necessary since there are more
      specific locks which the mdio_{read,write}() functions will obtain.
      Worse, those functions do not save and restore IRQ flags when locking
      the MII state, so interrupts will be enabled when generic_mii_ioctl()
      returns.
      
      Since there is currently no need for any function to call
      mdio_{read,write}() while holding another spinlock, do not change them
      to save and restore IRQ flags but remove the specification of ordering
      between vortex_private::lock and vortex_private::mii_lock.
      Signed-off-by: NBen Hutchings <ben@decadent.org.uk>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      24cd804d
  31. 26 8月, 2010 1 次提交
  32. 24 8月, 2010 1 次提交
    • N
      3c59x: Fix deadlock between boomerang_interrupt and boomerang_start_tx · aa25ab7d
      Neil Horman 提交于
      If netconsole is in use, there is a possibility for deadlock in 3c59x between
      boomerang_interrupt and boomerang_start_xmit.  Both routines take the vp->lock,
      and if netconsole is in use, a pr_* call from the boomerang_interrupt routine
      will result in the netconsole code attempting to trnasmit an skb, which can try
      to take the same spin lock, resulting in deadlock.
      
      The fix is pretty straightforward.  This patch allocats a bit in the 3c59x
      private structure to indicate that its handling an interrupt.  If we get into
      the transmit routine and that bit is set, we can be sure that we have recursed
      and will deadlock if we continue, so instead we just return NETDEV_TX_BUSY, so
      the stack requeues the skb to try again later.
      Signed-off-by: NNeil Horman <nhorman@tuxdriver.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      aa25ab7d
  33. 26 7月, 2010 1 次提交
  34. 24 7月, 2010 2 次提交
  35. 23 7月, 2010 1 次提交
  36. 30 6月, 2010 1 次提交
  37. 29 6月, 2010 1 次提交
    • B
      3c59x: Specify window explicitly for access to windowed registers · a095cfc4
      Ben Hutchings 提交于
      Currently much of the code assumes that a specific window has been
      selected, while a few functions save and restore the window.  This
      makes it impossible to introduce fine-grained locking.
      
      Make those assumptions explicit by introducing wrapper functions
      to set the window and read/write a register.  Use these everywhere
      except vortex_interrupt(), vortex_start_xmit() and vortex_rx().
      These set the window just once, or not at all in the case of
      vortex_rx() as it should always be called from vortex_interrupt().
      
      Cache the current window in struct vortex_private to avoid
      unnecessary hardware writes.
      Signed-off-by: NBen Hutchings <ben@decadent.org.uk>
      Tested-by: Arne Nordmark <nordmark@mech.kth.se> [against 2.6.32]
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a095cfc4
  38. 14 5月, 2010 1 次提交
    • J
      drivers/net: Remove unnecessary returns from void function()s · a4b77097
      Joe Perches 提交于
      This patch removes from drivers/net/ all the unnecessary
      return; statements that precede the last closing brace of
      void functions.
      
      It does not remove the returns that are immediately
      preceded by a label as gcc doesn't like that.
      
      It also does not remove null void functions with return.
      
      Done via:
      $ grep -rP --include=*.[ch] -l "return;\n}" net/ | \
        xargs perl -i -e 'local $/ ; while (<>) { s/\n[ \t\n]+return;\n}/\n}/g; print; }'
      
      with some cleanups by hand.
      
      Compile tested x86 allmodconfig only.
      Signed-off-by: NJoe Perches <joe@perches.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a4b77097
  39. 10 5月, 2010 1 次提交