Hi, I tried contacting authors of the driver mentioned in the source file and also in the MAINTAINERS file, but haven't received any reply so I am sending this to this mailing list. If I should use another one, plese advise me which one. Thanks and BR, Matej ---------- Forwarded message ---------- From: Matej Kupljen <matej.kupljen@xxxxxxxxx> Date: Thu, Oct 6, 2016 at 11:06 AM Subject: HSO driver patch To: Filip Aben <f.aben@xxxxxxxxxx>, Denis Joseph Barrow <d.barow@xxxxxxxxxx>, Jan Dumon <j.dumon@xxxxxxxxxx> Cc: * <ajb@xxxxxxxxxxxxxxxxxxx> Hi all, I found your emails in MAINTERNES file and in the source file for the driver. If you think, someone else should be contacted, please feel free to forward this mail. I am using hso driver for my 3G modem (although different manufacturer with different USB VID/PID) but I have some problems with it. It is working fine, but if you disconnect the USB connection while the data is transferring trough AT interface, we get a crash. There are two patches attached to this mail: 1.) 0001-Reverse-the-order-in-disconnect.patch This patch first sets the interface to NULL and only then starts removing the allocated resources. This is according to documentation and it is also more similar to other drivers. 2.) 0002-Stop-also-serial-queue-when-device-is-unplugged.patch Serial device was not stopped when the device got unplugged so there are continues error messages that the URB cannot be submitted. Another problem is that we can hit the WARN macro in hso_serial_open by: 1.) Plug in the USB modem 2.) Load hso.ko module 3.) Create the /dev nodes 4.) do a less -f /dev/ttyHS2 5.) unplug the USB modem 6.) Re-plug it and back 7.) Quit previous less by pressing q 8.) start less again like in 4 and you'll get [ 198.828136] ------------[ cut here ]------------ [ 198.832788] WARNING: CPU: 2 PID: 1799 at include/linux/kref.h:47 kobject_get+0x9c/0xa8() [ 198.840886] Modules linked in: hso [ 198.844337] CPU: 2 PID: 1799 Comm: less Not tainted 4.1.13-00130-g126c250-dirty #5 [ 198.851917] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) [ 198.858481] [<80017b70>] (unwind_backtrace) from [<800137d0>] (show_stack+0x10/0x14) [ 198.866246] [<800137d0>] (show_stack) from [<8063caa0>] (dump_stack+0x84/0xc4) [ 198.873492] [<8063caa0>] (dump_stack) from [<8002857c>] (warn_slowpath_common+0x84/0xb4) [ 198.881597] [<8002857c>] (warn_slowpath_common) from [<80028648>] (warn_slowpath_null+0x1c/0x24) [ 198.890398] [<80028648>] (warn_slowpath_null) from [<802533a8>] (kobject_get+0x9c/0xa8) [ 198.898420] [<802533a8>] (kobject_get) from [<80110b90>] (cdev_get+0x2c/0x4c) [ 198.905571] [<80110b90>] (cdev_get) from [<80110eb0>] (chrdev_open+0x2c/0x178) [ 198.912812] [<80110eb0>] (chrdev_open) from [<8010aff0>] (do_dentry_open+0x1d8/0x2f8) [ 198.920666] [<8010aff0>] (do_dentry_open) from [<80118958>] (do_last+0x564/0xce4) [ 198.928164] [<80118958>] (do_last) from [<8011b0fc>] (path_openat+0x80/0x5cc) [ 198.935330] [<8011b0fc>] (path_openat) from [<8011c0f8>] (do_filp_open+0x2c/0x88) [ 198.942832] [<8011c0f8>] (do_filp_open) from [<8010c36c>] (do_sys_open+0x108/0x1cc) [ 198.950508] [<8010c36c>] (do_sys_open) from [<80010140>] (ret_fast_syscall+0x0/0x60) [ 198.958292] ---[ end trace d0b32f14e1047616 ]--- If you need any more information, please do not hesitate to contact me. Thanks and BR, Matej
From f560b127ca9bb7c52106f0f83091e6c5e0e90b09 Mon Sep 17 00:00:00 2001 From: Matej Kupljen <matej.kupljen@xxxxxxxx> Date: Wed, 28 Sep 2016 18:37:23 +0200 Subject: [PATCH] Reverse the order in disconnect When the device is disconnected, we first need to set interface data to NULL and then do the freeing of resources to avoid race conditions. --- drivers/net/usb/hso.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index b0df61f..16aef06 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c @@ -3013,10 +3013,10 @@ exit: /* device removed, cleaning up */ static void hso_disconnect(struct usb_interface *interface) { - hso_free_interface(interface); - /* remove reference of our private data */ usb_set_intfdata(interface, NULL); + + hso_free_interface(interface); } static void async_get_intf(struct work_struct *data) -- 2.7.4
From 95cfca26bbcbb021e9327c03f8edf2ed0878de75 Mon Sep 17 00:00:00 2001 From: Matej Kupljen <matej.kupljen@xxxxxxxx> Date: Wed, 5 Oct 2016 13:08:31 +0200 Subject: [PATCH] Stop also serial queue when device is unplugged We need to also stop serial port when the device is unplugged, the network part is already stopped. --- drivers/net/usb/hso.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 16aef06..efd1fef 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c @@ -3157,6 +3157,7 @@ static void hso_free_interface(struct usb_interface *interface) mutex_lock(&serial->parent->mutex); serial->parent->usb_gone = 1; mutex_unlock(&serial->parent->mutex); + hso_stop_serial_device(serial->parent); cancel_work_sync(&serial_table[i]->async_put_intf); cancel_work_sync(&serial_table[i]->async_get_intf); hso_serial_tty_unregister(serial); -- 2.7.4