patch "USB: serial: option: add ZLP support for 0x1bc7/0x9010" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
USB: serial: option: add ZLP support for 0x1bc7/0x9010
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 2438c3a19dec5e98905fd3ffcc2f24716aceda6b Mon Sep 17 00:00:00 2001
From: Daniele Palmas <[email protected]>
Date: Thu, 19 Dec 2019 11:07:07 +0100
Subject: USB: serial: option: add ZLP support for 0x1bc7/0x9010
Telit FN980 flashing device 0x1bc7/0x9010 requires zero packet to be sent if out data size is is equal to the endpoint max size.
--- drivers/usb/serial/option.c | 8 ++++++++ drivers/usb/serial/usb-wwan.h | 1 + drivers/usb/serial/usb_wwan.c | 4 ++++ 3 files changed, 13 insertions(+)
drivers/usb/serial/option.c +8 -0
@@ -567,6 +567,9 @@ static void option_instat_callback(struct urb *urb);/* Interface must have two endpoints */ #define NUMEP2 BIT(16) +/* Device needs ZLP */ +#define ZLP BIT(17) +static const struct usb_device_id option_ids[] = { {USB_DEVICE (OPTION_VENDOR_ID ,OPTION_PRODUCT_COLT ) },
@@ -1198,6 +1201,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1901, 0xff), /* Telit LN940 (MBIM) */ .driver_info = NCTRL(0) }, + { USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */ + .driver_info = NCTRL(0) | ZLP }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), .driver_info = RSVD(1) },
@@ -2099,6 +2104,9 @@ static int option_attach(struct usb_serial *serial)if (!(device_flags &NCTRL (iface_desc->bInterfaceNumber))) data->use_send_setup =1 ; +if (device_flags &ZLP ) + data->use_zlp =1 ; +spin_lock_init (&data->susp_lock);usb_set_serial_data (serial, data);
drivers/usb/serial/usb-wwan.h +1 -0
@@ -38,6 +38,7 @@ struct usb_wwan_intf_private {spinlock_t susp_lock; unsigned int suspended:1; unsigned int use_send_setup:1; + unsigned int use_zlp:1;int in_flight;unsigned int open_ports;void *private;
drivers/usb/serial/usb_wwan.c +4 -0
@@ -461,6 +461,7 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, void (*callback) (struct urb *)) {struct usb_serial *serial = port->serial; +struct usb_wwan_intf_private *intfdata =usb_get_serial_data (serial);struct urb *urb; urb =usb_alloc_urb (0 ,GFP_KERNEL );/* No ISO */
@@ -471,6 +472,9 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,usb_sndbulkpipe (serial->dev, endpoint) | dir, buf, len, callback, ctx); +if (intfdata->use_zlp && dir ==USB_DIR_OUT ) + urb->transfer_flags |=URB_ZERO_PACKET ; +return urb; }
Signature · 1 line
2.24.1