Re: [RFC] Add support for Sony PS2 OHCI

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, 18 Nov 2017, Fredrik Noring wrote:

> Hello USB maintainers,
> 
> I'm porting kernel support for the Sony PlayStation 2 from v2.6.35 to v4.14,
> and a part of this effort is to port the PS2 OHCI driver. USB keyboards seem
> to work quite well with v4.14, but USB mass storage devices cause kernel
> crashes.
> 
> Any help in finding the cause of this crash, as well as comments on how to
> improve this provisional driver are very much welcome. The crash trace is:
> 
> 	------------[ cut here ]------------
> 	WARNING: CPU: 0 PID: 34 at drivers/usb/core/hcd.c:1390 hcd_alloc_coherent+0x4c/0xc8
> 	Modules linked in:
> 	CPU: 0 PID: 34 Comm: usb-storage Not tainted 4.14.0+ #718
> 	Stack : 00000000 80402608 00000003 0000000b 805b3b98 805611c4 00000094 80062b8c
> 	        00000009 0000056e 81e9fc00 805b0000 00000094 10018c00 81f51b10 00000001
> 	        00000000 00000000 805b0000 00000001 0000000a 00000003 00000001 3a555043
> 	        80436790 0000000f 81f519c8 81f51990 00000000 00000000 802e544c 80517464
> 	        00000009 0000056e 81e9fc00 805b0000 00000003 ffffee7f 00000000 805b0000
> 	        ...
> 	Call Trace:
> 	[<80021104>] show_stack+0x74/0x104
> 	[<80036310>] __warn+0x114/0x11c
> 	[<800363ac>] warn_slowpath_null+0x1c/0x30
> 	[<802e544c>] hcd_alloc_coherent+0x4c/0xc8
> 	[<802e6160>] usb_hcd_map_urb_for_dma+0x524/0x580
> 	[<802e729c>] usb_hcd_submit_urb+0x7d8/0x7e0
> 	[<802e95d8>] usb_sg_wait+0x14c/0x1a0
> 	[<802fb0f0>] usb_stor_bulk_transfer_sglist.part.1+0xac/0x124
> 	[<802fb4b4>] usb_stor_bulk_srb+0x40/0x60
> 	[<802fb8a8>] usb_stor_Bulk_transport+0x160/0x37c
> 	[<802fbcec>] usb_stor_invoke_transport+0x3c/0x500
> 	[<802fd220>] usb_stor_control_thread+0x260/0x2a0
> 	[<8004ef64>] kthread+0x138/0x140
> 	[<8001b578>] ret_from_kernel_thread+0x14/0x1c
> 	---[ end trace 2be087478be6627e ]---
> 
> This particular WARN_ON_ONCE is explained here:
> 
> commit 4307a28eb0128417d9a2b9d858d2bce70ee5b383
> Author: Andrea Righi <arighi@xxxxxxxxxxx>
> Date:   Mon Jun 28 16:56:45 2010 +0200
> 
>     USB: EHCI: fix NULL pointer dererence in HCDs that use HCD_LOCAL_MEM
>     
>     If we use the HCD_LOCAL_MEM flag and dma_declare_coherent_memory() to
>     enforce the host controller's local memory utilization we also need to
>     disable native scatter-gather support, otherwise hcd_alloc_coherent() in
>     map_urb_for_dma() is called with urb->transfer_buffer == NULL, that
>     triggers a NULL pointer dereference.
>     
>     We can also consider to add a WARN_ON() and return an error code to
>     better catch this problem in the future.
>     
>     At the moment no driver seems to hit this bug, so I should
>     consider this a low-priority fix.
>     
>     Signed-off-by: Andrea Righi <arighi@xxxxxxxxxxx>
>     Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
>     Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>
> 
> I've tried to disable scatter-gather, as suggested, by:
> 
> diff --git a/drivers/usb/host/ohci-ps2.c b/drivers/usb/host/ohci-ps2.c
> index 066d6a9c7ccb..eaa099aa0740 100755
> --- a/drivers/usb/host/ohci-ps2.c
> +++ b/drivers/usb/host/ohci-ps2.c
> @@ -25,6 +25,9 @@ static int ohci_ps2_start(struct usb_hcd *hcd)
>  
>  	ohci_hcd_init(ohci);
>  	ohci_init(ohci);
> +
> +	hcd->self.sg_tablesize = 0;
> +
>  	ohci_run(ohci);
>  	hcd->state = HC_STATE_RUNNING;
>  	return 0;
> 
> With the patch above, the kernel successfully detects USB mass storage
> devices. However, it also causes another crash:
> 
> 	------------[ cut here ]------------
> 	WARNING: CPU: 0 PID: 15 at ./include/linux/dma-mapping.h:530 hcd_buffer_free+0x130/0x200
> 	Modules linked in:
> 	CPU: 0 PID: 15 Comm: kworker/0:1 Not tainted 4.14.0+ #719
> 	Workqueue: usb_hub_wq hub_event
> 	Stack : 81f3b5b8 80402608 00000003 0000000b 000000f6 805611c4 81ccc280 804f398c
> 	        802ee5e0 804fd520 00000009 00000212 00000001 10058400 81c09a38 00000001
> 	        00000000 00000000 00000000 00000003 0000000a 00000002 00000001 00000000
> 	        00000001 00003368 81c09878 81c09840 00000000 00000000 802ee5e0 804fd520
> 	        00000009 00000212 00000001 fffffff3 00000002 00000000 00000000 805b0000
> 	        ...
> 	Call Trace:
> 	[<80021104>] show_stack+0x74/0x104
> 	[<80036310>] __warn+0x114/0x11c
> 	[<800363ac>] warn_slowpath_null+0x1c/0x30
> 	[<802ee5e0>] hcd_buffer_free+0x130/0x200
> 	[<802e56ec>] usb_hcd_unmap_urb_for_dma+0x160/0x16c
> 	[<802e576c>] __usb_hcd_giveback_urb+0x54/0xf0
> 	[<802f5d64>] finish_urb+0x98/0x138
> 	[<802f716c>] ohci_work+0x14c/0x494
> 	[<802f9878>] ohci_irq+0x13c/0x2e4
> 	[<802e4e0c>] usb_hcd_irq+0x2c/0x44
> 	[<8006366c>] __handle_irq_event_percpu+0x98/0x158
> 	[<8006374c>] handle_irq_event_percpu+0x20/0x64
> 	[<800637cc>] handle_irq_event+0x3c/0x70
> 	[<80067024>] handle_level_irq+0xe4/0x120
> 	[<80062d70>] generic_handle_irq+0x28/0x38
> 	[<80409b58>] do_IRQ+0x18/0x24
> 	---[ end trace fa1f0201799de649 ]---

This is caused by a deficiency in the DMA core: dma_free_coherent()  
wants interrupts to be enabled when it is called.  I'm not sure how the
other host controller drivers cope with this.

> Please find the (provisional) patch for the PS2 OHCI driver below.

Be aware that your driver should utilize ohci_init_driver(), like
several of the other platform-specific OHCI drivers do.  Unless there's
some very good reason, new drivers should never use the old interface.

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux