AnsweredAssumed Answered

USB MIDI Gadget not working properly

Question asked by Felipe Tonello on Sep 11, 2015
Latest reply on Mar 7, 2016 by Felipe Tonello

Hi,

 

I have the following setup:

 

DSP (read sensors and read/send MIDI) <- UART -> SOC (imx6) <- USB

MIDI GADGET -> HOST

 

When the throughput from the DSP is high, thus causing the throughput

on the USB to be high as well, I get a Kernel Panic saying to increase

the coherent_pool. I've used some crazy sizes like 1M, 4M and even 8M.

Obviously when I increase, it takes longer to crash but it still

crashes.

 

I am using linux-fsl 3.14.28.

 

The BT as follows:

 

[  193.619701] ERROR: 1024 KiB atomic DMA coherent pool is too small!

[  193.619701] Please increase it with coherent_pool= kernel parameter!

[  193.632261] Unable to handle kernel NULL pointer dereference at

virtual address 00000000

[  193.640358] pgd = 80004000

[  193.643070] [00000000] *pgd=00000000

[  193.646670] Internal error: Oops: 817 [#1] PREEMPT SMP ARM

[  193.652162] Modules linked in:0d 0 :s0n2d:_5s2e.q2_2m1i

snd_seq_midi_event snd_seq_dummy snd_seq snd_soc_cs4272

snd_soc_fsl_ssi imx_pcm_dma imx_pcm_fiq snd_soc_imx_cs4272

snd_soc_core snd_compress snd_pcm_dmaengine snd_pcm snd_te

  [  193.689447] CPU: 2 PID: 16 Comm: ksoftirqd/2 Not tainted

3.14.28-1.0.0_ga+g91cf351 #1

  [  193.697285] task: ea0a5100 ti: ea0d8000 task.ti: ea0d8000

  [  193.702708] PC is at _ep_queue.isra.24+0x178/0x480

  [  193.707508] LR is at 0xc43cee80

  [  193.710657] pc : [<8039ea38>]    lr : [<c43cee80>]    psr: 600f0093

  [  193.710657] sp : ea0d9de0  ip : 6e0ea000  fp : ea0d9e1c

  [  193.722139] r10: 00005000  r9 : ea03c010  r8 : c43d05b4

  [  193.727369] r7 : 00000000  r6 : 00000004  r5 : ea03c6f4  r4 : c43d0580

  [  193.733899] r3 : c43d05bc  r2 : 00000000  r1 : 00000001  r0 : fffffff4

  [  193.740433] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM

Segment kernel

  [  193.747834] Control: 10c5387d  Table: 7aca804a  DAC: 00000015

  [  193.753585] Process ksoftirqd/2 (pid: 16, stack limit = 0xea0d8238)

  [  193.759857] Stack: (0xea0d9de0 to 0xea0da000)

  [  193.764225] 9de0: 00000001 eaa72480 a00f0013 c43d05bc ea0d9e24

00000003 ea03c6f4 a00f0013

  [  193.772413] 9e00: c43d0580 ea51a200 ea51a328 ea51a328 ea0d9e3c

ea0d9e20 8039fc30 8039e8cc

  [  193.780598] 9e20: 00000000 00000000 c4467000 c43d0580 ea0d9e7c

ea0d9e40 7f078754 8039fbe8

  [  193.788784] 9e40: ea03c6f4 ea51a2ec 80009990 6f000000 ea0d9e84

ea51a330 ea51a334 00000000

  [  193.796968] 9e60: 80718f40 00000000 ea0d8000 806d82bc ea0d9e8c

ea0d9e80 7f0787a0 7f07832c

  [  193.805153] 9e80: ea0d9ebc ea0d9e90 80031fe4 7f078798 80031f60

00000000 00000000 806dc080

  [  193.826207] 9ec0: ffffffff ea0d9f0c 04208040 806dc0c0 ffffd672

80507358 0000000a 80718f40

  [  193.834392] 9ee0: ea0d8000 806d8458 806dc080 00000002 80053c8c

ea0d8000 ea0870c0 806e9cc8

  [  193.842576] 9f00: 00000001 00000000 00000000 00000000 ea0d9f34

ea0d9f20 80032490 800321f0

  [  193.868396] 9f40: ea087140 ea0870c0 800512e0 00000000 ea0d9fac

ea0d9f60 8004a458 800512ec

  [  193.876582] 9f60: 30b80088 00000001 00000002 ea0870c0 00000000

00030003 ea0d9f78 ea0d9f78

  [  193.884766] 9f80: 00000000 00000000 ea0d9f88 ea0d9f88 ea087140

8004a384 00000000 00000000

  [  193.892952] 9fa0: 00000000 ea0d9fb0 8000ea58 8004a390 00000000

00000000 00000000 00000000

  [  193.901137] 9fc0: 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000

  [  193.909322] 9fe0: 00000000 00000000 00000000 00000000 00000013

00000000 2001a1a0 61391094

  [  193.917501] Backtrace:

  [  193.919982] [<8039e8c0>] (_ep_queue.isra.24) from [<8039fc30>]

(ep_queue+0x54/0x88)

  [  193.927643]  r10:ea51a328 r9:ea51a328 r8:ea51a200 r7:c43d0580

r6:a00f0013 r5:ea03c6f4

  [  193.935554]  r4:00000003

  [  193.938120] [<8039fbdc>] (ep_queue) from [<7f078754>]

(f_midi_transmit+0x434/0x46c [g_midi])

  [  193.946562]  r7:c43d0580 r6:c4467000 r5:00000000 r4:00000000

  [  193.952299] [<7f078320>] (f_midi_transmit [g_midi]) from

[<7f0787a0>] (f_midi_in_tasklet+0x14/0x18 [g_midi])

  [  193.962129]  r10:806d82bc r9:ea0d8000 r8:00000000 r7:80718f40

r6:00000000 r5:ea51a334

  [  193.970039]  r4:ea51a330

  [  193.972609] [<7f07878c>] (f_midi_in_tasklet [g_midi]) from

[<80031fe4>] (tasklet_hi_action+0x84/0x114)

  [  193.981928] [<80031f60>] (tasklet_hi_action) from [<8003232c>]

(__do_softirq+0x148/0x260)

  [  193.990107]  r10:40000000 r9:806dc080 r8:00000100 r7:ea0d8000

r6:806dc080 r5:00000000

  [  193.998018]  r4:00000000 r3:80031f60

  [  194.001635] [<800321e4>] (__do_softirq) from [<80032490>]

(run_ksoftirqd+0x4c/0x64)

  [  194.009294]  r10:00000000 r9:00000000 r8:00000000 r7:00000001

r6:806e9cc8 r5:ea0870c0

  [  194.017203]  r4:ea0d8000

  [  194.019773] [<80032444>] (run_ksoftirqd) from [<80051468>]

(smpboot_thread_fn+0x188/

0x278)
  [  194.028059] [<800512e0>] (smpboot_thread_fn) from [<8004a458>]
(kthread+0xd4/0xec)
  [  194.035632]  r8:00000000 r7:800512e0 r6:ea0870c0 r5:ea087140
r4:00000000 r3:ea0a5100
  [  194.043468] [<8004a384>] (kthread) from [<8000ea58>]
(ret_from_fork+0x14/0x3c)
  [  194.050695]  r7:00000000 r6:00000000 r5:8004a384 r4:ea087140
  [  194.056426] Code: e3a01001 e594203c e50b2030 e593200c (e5821000)
  [  194.062529] ---[ end trace d9e83b0561ba691e ]---
  [  194.067153] Kernel panic - not syncing: Fatal exception in interrupt

When I debug, I can see those symbols:

(gdb) list *(ep_queue)
0x803a3b00 is in ep_queue
(/home/felipe/freescale/linux-2.6-imx/drivers/usb/chipidea/udc.c:1339).
1334     *
1335     * Check usb_ep_queue()* at usb_gadget.h" for details
1336     */
1337    static int ep_queue(struct usb_ep *ep, struct usb_request *req,
1338                        gfp_t __maybe_unused gfp_flags)
1339    {
1340            struct ci_hw_ep  *hwep  = container_of(ep,  struct
ci_hw_ep, ep);
1341            int retval = 0;
1342            unsigned long flags;
1343
(gdb) list *(ep_queue+0x54)
0x803a3b54 is in ep_queue
(/home/felipe/freescale/linux-2.6-imx/include/linux/spinlock.h:358).
353             raw_spin_unlock_irq(&lock->rlock);
354     }
355
356     static inline void spin_unlock_irqrestore(spinlock_t *lock,
unsigned long flags)
357     {
358             raw_spin_unlock_irqrestore(&lock->rlock, flags);
359     }
360
361     static inline int spin_trylock_bh(spinlock_t *lock)
362     {

Any help will be very useful.

Thanks,

Felipe

Outcomes