1. 20 11月, 2015 2 次提交
    • L
      i2c: xiic: Prevent concurrent running of the IRQ handler and __xiic_start_xfer() · d0fe5258
      Lars-Peter Clausen 提交于
      Prior to commit e6c9a037 ("i2c: xiic: Remove the disabling of
      interrupts") IRQs where disabled when the initial __xiic_start_xfer() was
      called. After the commit the interrupt is enabled while the function is
      running, this means it is possible for the interrupt to be triggered while
      the function is still running. When this happens the internal data
      structures get corrupted and undefined behavior can occur like the
      following crash:
      
      	Internal error: Oops: 17 [#1] PREEMPT SMP ARM
      	Modules linked in:
      	CPU: 0 PID: 2040 Comm: i2cdetect Not tainted 4.0.0-02856-g047a308 #10956
      	Hardware name: Xilinx Zynq Platform
      	task: ee0c9500 ti: e99a2000 task.ti: e99a2000
      	PC is at __xiic_start_xfer+0x6c4/0x7c8
      	LR is at __xiic_start_xfer+0x690/0x7c8
      	pc : [<c02bbffc>]    lr : [<c02bbfc8>]    psr: 800f0013
      	sp : e99a3da8  ip : 00000000  fp : 00000000
      	r10: 00000001  r9 : 600f0013  r8 : f0180000
      	r7 : f0180000  r6 : c064e444  r5 : 00000017  r4 : ee031010
      	r3 : 00000000  r2 : 00000000  r1 : 600f0013  r0 : 0000000f
      	Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
      	Control: 18c5387d  Table: 29a5404a  DAC: 00000015
      	Process i2cdetect (pid: 2040, stack limit = 0xe99a2210)
      	Stack: (0xe99a3da8 to 0xe99a4000)
      	3da0:                   ee031010 00000000 00000001 ee031020 ee031224 c02bc5ec
      	3dc0: ee34c604 00000000 ee0c9500 e99a3dcc e99a3dd0 e99a3dd0 e99a3dd8 c069f0e8
      	3de0: 00000000 ee031020 c064e100 ffff90bb e99a3e48 c02b6590 ee031020 00000001
      	3e00: e99a3e48 ee031020 00000000 e99a3e63 00000001 c02b6ec4 00000000 00000000
      	3e20: 00000000 c02b7320 e99a3ef0 00000000 00000000 e99e3df0 00000000 00000000
      	3e40: 00000103 2814575f 0000003e c00a0000 e99a3e85 0001003e ee0c0000 e99a3e63
      	3e60: eefd3578 c064e61c ee0c9500 c0041e04 0000056c e9a56db8 00006e5a b6f5c000
      	3e80: ee0c9548 eefd0040 00000001 eefd3540 ee0c9500 eefd39a0 c064b540 ee0c9500
      	3ea0: 00000000 ee92b000 00000000 bef4862c ee34c600 e99ecdc0 00000720 00000003
      	3ec0: e99a2000 00000000 00000000 c02b8b30 00000000 00000000 00000000 e99a3f24
      	3ee0: b6e80000 00000000 00000000 c04257e8 00000000 e99a3f24 c02b8f08 00000703
      	3f00: 00000003 c02116bc ee935300 00000000 bef4862c ee34c600 e99ecdc0 c02b91f0
      	3f20: e99ecdc0 00000720 bef4862c eeb725f8 e99ecdc0 c00c9e2c 00000003 00000003
      	3f40: ee248dc0 00000000 ee248dc8 00000002 eeb7c1a8 00000000 00000000 c00bb360
      	3f60: 00000000 00000000 00000003 ee248dc0 bef4862c e99ecdc0 e99ecdc0 00000720
      	3f80: 00000003 e99a2000 00000000 c00c9f68 00000000 00000000 b6f22000 00000036
      	3fa0: c000dfa4 c000de20 00000000 00000000 00000003 00000720 bef4862c bef4862c
      	3fc0: 00000000 00000000 b6f22000 00000036 00000000 00000000 b6f60000 00000000
      	3fe0: 00013040 bef48614 00008cab b6ecdbe6 400f0030 00000003 2f7fd821 2f7fdc21
      	[<c02bbffc>] (__xiic_start_xfer) from [<c02bc5ec>] (xiic_xfer+0x94/0x168)
      	[<c02bc5ec>] (xiic_xfer) from [<c02b6590>] (__i2c_transfer+0x4c/0x7c)
      	[<c02b6590>] (__i2c_transfer) from [<c02b6ec4>] (i2c_transfer+0x9c/0xc4)
      	[<c02b6ec4>] (i2c_transfer) from [<c02b7320>] (i2c_smbus_xfer+0x3a0/0x4ec)
      	[<c02b7320>] (i2c_smbus_xfer) from [<c02b8b30>] (i2cdev_ioctl_smbus+0xb0/0x214)
      	[<c02b8b30>] (i2cdev_ioctl_smbus) from [<c02b91f0>] (i2cdev_ioctl+0xa0/0x1d4)
      	[<c02b91f0>] (i2cdev_ioctl) from [<c00c9e2c>] (do_vfs_ioctl+0x4b0/0x5b8)
      	[<c00c9e2c>] (do_vfs_ioctl) from [<c00c9f68>] (SyS_ioctl+0x34/0x5c)
      	[<c00c9f68>] (SyS_ioctl) from [<c000de20>] (ret_fast_syscall+0x0/0x34)
      	Code: e283300c e5843210 eafffe64 e5943210 (e1d320b4)
      
      The issue can easily be reproduced by performing I2C access under high
      system load or IO load.
      
      To fix the issue protect the invocation to __xiic_start_xfer() form
      xiic_start_xfer() with the same lock that is used to protect the interrupt
      handler.
      
      Fixes: e6c9a037 ("i2c: xiic: Remove the disabling of interrupts")
      Signed-off-by: NLars-Peter Clausen <lars@metafoo.de>
      Reviewed-by: NShubhrajyoti Datta <shubhraj@xilinx.com>
      Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
      d0fe5258
    • L
      i2c: Revert "i2c: xiic: Do not reset controller before every transfer" · 9656eeeb
      Lars-Peter Clausen 提交于
      Commit d701667b ("i2c: xiic: Do not reset controller before every
      transfer") removed the reinitialization of the controller before the start
      of each transfer. Apparently this change is not safe to make and the commit
      results in random I2C bus failures.
      
      An easy way to trigger the issue is to run i2cdetect.
      
      Without the patch applied:
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      	 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
      	 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 30: -- -- -- -- -- -- -- -- UU UU -- UU 3c -- -- UU
      	 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 70: -- -- -- -- -- -- -- --
      
      With the patch applied every other or so invocation:
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      	 00:          03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
      	 10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
      	 20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
      	 30: -- -- -- -- -- -- -- -- UU UU -- UU 3c -- -- UU
      	 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      	 70: -- -- -- -- -- -- -- --
      
      So revert the commit for now.
      
      Fixes: d701667b ("i2c: xiic: Do not reset controller before every transfer")
      Signed-off-by: NLars-Peter Clausen <lars@metafoo.de>
      Acked-by: NShubhrajyoti Datta <shubhraj@xilinx.com>
      Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
      9656eeeb
  2. 10 8月, 2015 8 次提交
  3. 12 5月, 2015 1 次提交
  4. 18 11月, 2014 1 次提交
    • T
      i2c: xiic: Fix big-endian register access · 48ef3ca9
      Thomas Gessler 提交于
      The driver tried to access device registers with the (little-endian)
      iowrite/ioread functions. While this worked on little-endian machines
      (e.g. Microblaze with AXI bus), it made the driver unusable on
      big-endian machines (e.g. PPC405 with PLB).
      
      During the probe function, the driver tried to write a 32-bit reset mask
      into the reset register. This caused an error interrupt on big-endian
      systems, because the device detected an invalid (byte-swapped) reset
      mask. The result was an Oops.
      
      The patch implements an endianness detection similar to the one used in
      other Xilinx drivers like drivers/spi/spi-xilinx.c. It was tested on a
      PPC405/PLB system.
      Signed-off-by: NThomas Gessler <Thomas.Gessler@exp2.physik.uni-giessen.de>
      Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
      48ef3ca9
  5. 08 11月, 2014 1 次提交
  6. 20 10月, 2014 1 次提交
  7. 17 7月, 2014 1 次提交
    • W
      i2c: i2c-xiic: Drop class based scanning to improve bootup time · 4db5beed
      Wolfram Sang 提交于
      This driver has been flagged to drop class based instantiation. The removal
      improves boot-up time and is unneeded for embedded controllers. Users have been
      warned to switch for some time now, so we can actually do the removal. Keep the
      DEPRECATED flag, so the core can inform users that the behaviour finally
      changed now. After another transition period, this flag can go, too.
      While we are here, remove the indentation for the array setup because
      such things always break after some time.
      Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
      4db5beed
  8. 28 3月, 2014 1 次提交
  9. 25 1月, 2014 1 次提交
  10. 05 1月, 2014 3 次提交
  11. 30 10月, 2013 1 次提交
  12. 30 9月, 2013 1 次提交
  13. 23 8月, 2013 1 次提交
    • W
      i2c: move OF helpers into the core · 687b81d0
      Wolfram Sang 提交于
      I2C of helpers used to live in of_i2c.c but experience (from SPI) shows
      that it is much cleaner to have this in the core. This also removes a
      circular dependency between the helpers and the core, and so we can
      finally register child nodes in the core instead of doing this manually
      in each driver. So, fix the drivers and documentation, too.
      Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
      687b81d0
  14. 20 8月, 2013 1 次提交
  15. 24 4月, 2013 1 次提交
    • S
      i2c: xiic: must always write 16-bit words to TX_FIFO · c39e8e43
      Steven A. Falco 提交于
      The TX_FIFO register is 10 bits wide.  The lower 8 bits are the data to be
      written, while the upper two bits are flags to indicate stop/start.
      
      The driver apparently attempted to optimize write access, by only writing a
      byte in those cases where the stop/start bits are zero.  However, we have
      seen cases where the lower byte is duplicated onto the upper byte by the
      hardware, which causes inadvertent stop/starts.
      
      This patch changes the write access to the transmit FIFO to always be 16 bits
      wide.
      
      Signed off by: Steven A. Falco <sfalco@harris.com>
      Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
      Cc: stable@kernel.org
      c39e8e43
  16. 22 2月, 2013 1 次提交
  17. 23 12月, 2012 1 次提交
  18. 12 5月, 2012 1 次提交
  19. 13 1月, 2012 1 次提交
  20. 02 1月, 2012 1 次提交
  21. 27 5月, 2011 1 次提交
  22. 31 3月, 2011 1 次提交
  23. 23 3月, 2011 1 次提交
  24. 30 3月, 2010 1 次提交
    • T
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking... · 5a0e3ad6
      Tejun Heo 提交于
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
      
      percpu.h is included by sched.h and module.h and thus ends up being
      included when building most .c files.  percpu.h includes slab.h which
      in turn includes gfp.h making everything defined by the two files
      universally available and complicating inclusion dependencies.
      
      percpu.h -> slab.h dependency is about to be removed.  Prepare for
      this change by updating users of gfp and slab facilities include those
      headers directly instead of assuming availability.  As this conversion
      needs to touch large number of source files, the following script is
      used as the basis of conversion.
      
        http://userweb.kernel.org/~tj/misc/slabh-sweep.py
      
      The script does the followings.
      
      * Scan files for gfp and slab usages and update includes such that
        only the necessary includes are there.  ie. if only gfp is used,
        gfp.h, if slab is used, slab.h.
      
      * When the script inserts a new include, it looks at the include
        blocks and try to put the new include such that its order conforms
        to its surrounding.  It's put in the include block which contains
        core kernel includes, in the same order that the rest are ordered -
        alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
        doesn't seem to be any matching order.
      
      * If the script can't find a place to put a new include (mostly
        because the file doesn't have fitting include block), it prints out
        an error message indicating which .h file needs to be added to the
        file.
      
      The conversion was done in the following steps.
      
      1. The initial automatic conversion of all .c files updated slightly
         over 4000 files, deleting around 700 includes and adding ~480 gfp.h
         and ~3000 slab.h inclusions.  The script emitted errors for ~400
         files.
      
      2. Each error was manually checked.  Some didn't need the inclusion,
         some needed manual addition while adding it to implementation .h or
         embedding .c file was more appropriate for others.  This step added
         inclusions to around 150 files.
      
      3. The script was run again and the output was compared to the edits
         from #2 to make sure no file was left behind.
      
      4. Several build tests were done and a couple of problems were fixed.
         e.g. lib/decompress_*.c used malloc/free() wrappers around slab
         APIs requiring slab.h to be added manually.
      
      5. The script was run on all .h files but without automatically
         editing them as sprinkling gfp.h and slab.h inclusions around .h
         files could easily lead to inclusion dependency hell.  Most gfp.h
         inclusion directives were ignored as stuff from gfp.h was usually
         wildly available and often used in preprocessor macros.  Each
         slab.h inclusion directive was examined and added manually as
         necessary.
      
      6. percpu.h was updated not to include slab.h.
      
      7. Build test were done on the following configurations and failures
         were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
         distributed build env didn't work with gcov compiles) and a few
         more options had to be turned off depending on archs to make things
         build (like ipr on powerpc/64 which failed due to missing writeq).
      
         * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
         * powerpc and powerpc64 SMP allmodconfig
         * sparc and sparc64 SMP allmodconfig
         * ia64 SMP allmodconfig
         * s390 SMP allmodconfig
         * alpha SMP allmodconfig
         * um on x86_64 SMP allmodconfig
      
      8. percpu.h modifications were reverted so that it could be applied as
         a separate patch and serve as bisection point.
      
      Given the fact that I had only a couple of failures from tests on step
      6, I'm fairly confident about the coverage of this conversion patch.
      If there is a breakage, it's likely to be something in one of the arch
      headers which should be easily discoverable easily on most builds of
      the specific arch.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Guess-its-ok-by: NChristoph Lameter <cl@linux-foundation.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
      5a0e3ad6
  25. 15 3月, 2010 1 次提交
  26. 08 3月, 2010 1 次提交