1. 06 4月, 2013 1 次提交
    • M
      usb: chipidea: udc: fix memory access of shared memory on armv5 machines · a9c17430
      Michael Grzeschik 提交于
      The udc uses an shared dma memory space between hard and software. This
      memory layout is described in ci13xxx_qh and ci13xxx_td which are marked
      with the attribute ((packed)).
      
      The compiler currently does not know about the alignment of the memory
      layout, and will create strb and ldrb operations.
      
      The Datasheet of the synopsys core describes, that some operations on
      the mapped memory need to be atomic double word operations. I.e. the
      next pointer addressing in the qhead, as otherwise the hardware will
      read wrong data and totally stuck.
      
      This is also possible while working with the current active td queue,
      and preparing the td->ptr.next in software while the hardware is still
      working with the current active td which is supposed to be changed:
      
      writeb(0xde, &td->ptr.next + 0x0); /* strb */
      writeb(0xad, &td->ptr.next + 0x1); /* strb */
      
      <----- hardware reads value of td->ptr.next and get stuck!
      
      writeb(0xbe, &td->ptr.next + 0x2); /* strb */
      writeb(0xef, &td->ptr.next + 0x3); /* strb */
      
      This appeares on armv5 machines where the hardware does not support
      unaligned 32bit operations.
      
      This patch adds the attribute ((aligned(4))) to the structures to tell
      the compiler to use 32bit operations. It also adds an wmb() for the
      prepared TD data before it gets enqueued into the qhead.
      
      Cc: stable <stable@vger.kernel.org> # v3.5
      Signed-off-by: NMichael Grzeschik <m.grzeschik@pengutronix.de>
      Reviewed-by: NFelipe Balbi <balbi@ti.com>
      Signed-off-by: NAlexander Shishkin <alexander.shishkin@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a9c17430
  2. 12 5月, 2012 4 次提交