hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/usb/serial/opticon.c
....@@ -41,6 +41,9 @@
4141 bool rts;
4242 bool cts;
4343 int outstanding_urbs;
44
+ int outstanding_bytes;
45
+
46
+ struct usb_anchor anchor;
4447 };
4548
4649
....@@ -149,6 +152,15 @@
149152 return res;
150153 }
151154
155
+static void opticon_close(struct usb_serial_port *port)
156
+{
157
+ struct opticon_private *priv = usb_get_serial_port_data(port);
158
+
159
+ usb_kill_anchored_urbs(&priv->anchor);
160
+
161
+ usb_serial_generic_close(port);
162
+}
163
+
152164 static void opticon_write_control_callback(struct urb *urb)
153165 {
154166 struct usb_serial_port *port = urb->context;
....@@ -169,6 +181,7 @@
169181
170182 spin_lock_irqsave(&priv->lock, flags);
171183 --priv->outstanding_urbs;
184
+ priv->outstanding_bytes -= urb->transfer_buffer_length;
172185 spin_unlock_irqrestore(&priv->lock, flags);
173186
174187 usb_serial_port_softint(port);
....@@ -182,8 +195,8 @@
182195 struct urb *urb;
183196 unsigned char *buffer;
184197 unsigned long flags;
185
- int status;
186198 struct usb_ctrlrequest *dr;
199
+ int ret = -ENOMEM;
187200
188201 spin_lock_irqsave(&priv->lock, flags);
189202 if (priv->outstanding_urbs > URB_UPPER_LIMIT) {
....@@ -192,19 +205,16 @@
192205 return 0;
193206 }
194207 priv->outstanding_urbs++;
208
+ priv->outstanding_bytes += count;
195209 spin_unlock_irqrestore(&priv->lock, flags);
196210
197211 buffer = kmalloc(count, GFP_ATOMIC);
198
- if (!buffer) {
199
- count = -ENOMEM;
212
+ if (!buffer)
200213 goto error_no_buffer;
201
- }
202214
203215 urb = usb_alloc_urb(0, GFP_ATOMIC);
204
- if (!urb) {
205
- count = -ENOMEM;
216
+ if (!urb)
206217 goto error_no_urb;
207
- }
208218
209219 memcpy(buffer, buf, count);
210220
....@@ -213,10 +223,8 @@
213223 /* The connected devices do not have a bulk write endpoint,
214224 * to transmit data to de barcode device the control endpoint is used */
215225 dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
216
- if (!dr) {
217
- count = -ENOMEM;
226
+ if (!dr)
218227 goto error_no_dr;
219
- }
220228
221229 dr->bRequestType = USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT;
222230 dr->bRequest = 0x01;
....@@ -229,13 +237,13 @@
229237 (unsigned char *)dr, buffer, count,
230238 opticon_write_control_callback, port);
231239
240
+ usb_anchor_urb(urb, &priv->anchor);
241
+
232242 /* send it down the pipe */
233
- status = usb_submit_urb(urb, GFP_ATOMIC);
234
- if (status) {
235
- dev_err(&port->dev,
236
- "%s - usb_submit_urb(write endpoint) failed status = %d\n",
237
- __func__, status);
238
- count = status;
243
+ ret = usb_submit_urb(urb, GFP_ATOMIC);
244
+ if (ret) {
245
+ dev_err(&port->dev, "failed to submit write urb: %d\n", ret);
246
+ usb_unanchor_urb(urb);
239247 goto error;
240248 }
241249
....@@ -253,8 +261,10 @@
253261 error_no_buffer:
254262 spin_lock_irqsave(&priv->lock, flags);
255263 --priv->outstanding_urbs;
264
+ priv->outstanding_bytes -= count;
256265 spin_unlock_irqrestore(&priv->lock, flags);
257
- return count;
266
+
267
+ return ret;
258268 }
259269
260270 static int opticon_write_room(struct tty_struct *tty)
....@@ -277,6 +287,20 @@
277287 spin_unlock_irqrestore(&priv->lock, flags);
278288
279289 return 2048;
290
+}
291
+
292
+static int opticon_chars_in_buffer(struct tty_struct *tty)
293
+{
294
+ struct usb_serial_port *port = tty->driver_data;
295
+ struct opticon_private *priv = usb_get_serial_port_data(port);
296
+ unsigned long flags;
297
+ int count;
298
+
299
+ spin_lock_irqsave(&priv->lock, flags);
300
+ count = priv->outstanding_bytes;
301
+ spin_unlock_irqrestore(&priv->lock, flags);
302
+
303
+ return count;
280304 }
281305
282306 static int opticon_tiocmget(struct tty_struct *tty)
....@@ -328,40 +352,21 @@
328352 return 0;
329353 }
330354
331
-static int get_serial_info(struct usb_serial_port *port,
332
- struct serial_struct __user *serial)
333
-{
334
- struct serial_struct tmp;
335
-
336
- memset(&tmp, 0x00, sizeof(tmp));
337
-
338
- /* fake emulate a 16550 uart to make userspace code happy */
339
- tmp.type = PORT_16550A;
340
- tmp.line = port->minor;
341
- tmp.port = 0;
342
- tmp.irq = 0;
343
- tmp.xmit_fifo_size = 1024;
344
- tmp.baud_base = 9600;
345
- tmp.close_delay = 5*HZ;
346
- tmp.closing_wait = 30*HZ;
347
-
348
- if (copy_to_user(serial, &tmp, sizeof(*serial)))
349
- return -EFAULT;
350
- return 0;
351
-}
352
-
353
-static int opticon_ioctl(struct tty_struct *tty,
354
- unsigned int cmd, unsigned long arg)
355
+static int get_serial_info(struct tty_struct *tty,
356
+ struct serial_struct *ss)
355357 {
356358 struct usb_serial_port *port = tty->driver_data;
357359
358
- switch (cmd) {
359
- case TIOCGSERIAL:
360
- return get_serial_info(port,
361
- (struct serial_struct __user *)arg);
362
- }
363
-
364
- return -ENOIOCTLCMD;
360
+ /* fake emulate a 16550 uart to make userspace code happy */
361
+ ss->type = PORT_16550A;
362
+ ss->line = port->minor;
363
+ ss->port = 0;
364
+ ss->irq = 0;
365
+ ss->xmit_fifo_size = 1024;
366
+ ss->baud_base = 9600;
367
+ ss->close_delay = 5*HZ;
368
+ ss->closing_wait = 30*HZ;
369
+ return 0;
365370 }
366371
367372 static int opticon_port_probe(struct usb_serial_port *port)
....@@ -373,6 +378,7 @@
373378 return -ENOMEM;
374379
375380 spin_lock_init(&priv->lock);
381
+ init_usb_anchor(&priv->anchor);
376382
377383 usb_set_serial_port_data(port, priv);
378384
....@@ -400,11 +406,13 @@
400406 .port_probe = opticon_port_probe,
401407 .port_remove = opticon_port_remove,
402408 .open = opticon_open,
409
+ .close = opticon_close,
403410 .write = opticon_write,
404411 .write_room = opticon_write_room,
412
+ .chars_in_buffer = opticon_chars_in_buffer,
405413 .throttle = usb_serial_generic_throttle,
406414 .unthrottle = usb_serial_generic_unthrottle,
407
- .ioctl = opticon_ioctl,
415
+ .get_serial = get_serial_info,
408416 .tiocmget = opticon_tiocmget,
409417 .tiocmset = opticon_tiocmset,
410418 .process_read_urb = opticon_process_read_urb,