hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/usb/serial/usb_wwan.c
....@@ -132,38 +132,32 @@
132132 }
133133 EXPORT_SYMBOL(usb_wwan_tiocmset);
134134
135
-static int get_serial_info(struct usb_serial_port *port,
136
- struct serial_struct __user *retinfo)
135
+int usb_wwan_get_serial_info(struct tty_struct *tty,
136
+ struct serial_struct *ss)
137137 {
138
- struct serial_struct tmp;
138
+ struct usb_serial_port *port = tty->driver_data;
139139
140
- memset(&tmp, 0, sizeof(tmp));
141
- tmp.line = port->minor;
142
- tmp.port = port->port_number;
143
- tmp.baud_base = tty_get_baud_rate(port->port.tty);
144
- tmp.close_delay = port->port.close_delay / 10;
145
- tmp.closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
140
+ ss->line = port->minor;
141
+ ss->port = port->port_number;
142
+ ss->baud_base = tty_get_baud_rate(port->port.tty);
143
+ ss->close_delay = port->port.close_delay / 10;
144
+ ss->closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
146145 ASYNC_CLOSING_WAIT_NONE :
147146 port->port.closing_wait / 10;
148
-
149
- if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
150
- return -EFAULT;
151147 return 0;
152148 }
149
+EXPORT_SYMBOL(usb_wwan_get_serial_info);
153150
154
-static int set_serial_info(struct usb_serial_port *port,
155
- struct serial_struct __user *newinfo)
151
+int usb_wwan_set_serial_info(struct tty_struct *tty,
152
+ struct serial_struct *ss)
156153 {
157
- struct serial_struct new_serial;
154
+ struct usb_serial_port *port = tty->driver_data;
158155 unsigned int closing_wait, close_delay;
159156 int retval = 0;
160157
161
- if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
162
- return -EFAULT;
163
-
164
- close_delay = new_serial.close_delay * 10;
165
- closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
166
- ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
158
+ close_delay = ss->close_delay * 10;
159
+ closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
160
+ ASYNC_CLOSING_WAIT_NONE : ss->closing_wait * 10;
167161
168162 mutex_lock(&port->port.mutex);
169163
....@@ -181,30 +175,7 @@
181175 mutex_unlock(&port->port.mutex);
182176 return retval;
183177 }
184
-
185
-int usb_wwan_ioctl(struct tty_struct *tty,
186
- unsigned int cmd, unsigned long arg)
187
-{
188
- struct usb_serial_port *port = tty->driver_data;
189
-
190
- dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd);
191
-
192
- switch (cmd) {
193
- case TIOCGSERIAL:
194
- return get_serial_info(port,
195
- (struct serial_struct __user *) arg);
196
- case TIOCSSERIAL:
197
- return set_serial_info(port,
198
- (struct serial_struct __user *) arg);
199
- default:
200
- break;
201
- }
202
-
203
- dev_dbg(&port->dev, "%s arg not supported\n", __func__);
204
-
205
- return -ENOIOCTLCMD;
206
-}
207
-EXPORT_SYMBOL(usb_wwan_ioctl);
178
+EXPORT_SYMBOL(usb_wwan_set_serial_info);
208179
209180 int usb_wwan_write(struct tty_struct *tty, struct usb_serial_port *port,
210181 const unsigned char *buf, int count)
....@@ -299,9 +270,7 @@
299270 if (status) {
300271 dev_dbg(dev, "%s: nonzero status: %d on endpoint %02x.\n",
301272 __func__, status, endpoint);
302
-
303
- /* don't resubmit on fatal errors */
304
- if (status == -ESHUTDOWN || status == -ENOENT)
273
+ if (status == -ESHUTDOWN || status == -ENOENT || status == -EPROTO)
305274 return;
306275 } else {
307276 if (urb->actual_length) {
....@@ -494,9 +463,7 @@
494463 void (*callback) (struct urb *))
495464 {
496465 struct usb_serial *serial = port->serial;
497
- struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial);
498466 struct urb *urb;
499
- struct usb_device_descriptor *desc = &serial->dev->descriptor;
500467
501468 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
502469 if (!urb)
....@@ -506,14 +473,19 @@
506473 usb_sndbulkpipe(serial->dev, endpoint) | dir,
507474 buf, len, callback, ctx);
508475
509
- if (intfdata->use_zlp && dir == USB_DIR_OUT)
510
- urb->transfer_flags |= URB_ZERO_PACKET;
511
-
476
+#if 1 //Added by Quectel for Zero Packet
512477 if (dir == USB_DIR_OUT) {
513
- if ((desc->idVendor == cpu_to_le16(0x1286) &&
514
- desc->idProduct == cpu_to_le16(0x4e3c)))
478
+ if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9090))
479
+ urb->transfer_flags |= URB_ZERO_PACKET;
480
+ if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003))
481
+ urb->transfer_flags |= URB_ZERO_PACKET;
482
+ if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215))
483
+ urb->transfer_flags |= URB_ZERO_PACKET;
484
+ if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C))
515485 urb->transfer_flags |= URB_ZERO_PACKET;
516486 }
487
+#endif
488
+
517489 return urb;
518490 }
519491