@@ -41,6 +41,7 @@ struct opticon_private {
41
41
bool rts ;
42
42
bool cts ;
43
43
int outstanding_urbs ;
44
+ int outstanding_bytes ;
44
45
};
45
46
46
47
@@ -169,6 +170,7 @@ static void opticon_write_control_callback(struct urb *urb)
169
170
170
171
spin_lock_irqsave (& priv -> lock , flags );
171
172
-- priv -> outstanding_urbs ;
173
+ priv -> outstanding_bytes -= urb -> transfer_buffer_length ;
172
174
spin_unlock_irqrestore (& priv -> lock , flags );
173
175
174
176
usb_serial_port_softint (port );
@@ -182,8 +184,8 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
182
184
struct urb * urb ;
183
185
unsigned char * buffer ;
184
186
unsigned long flags ;
185
- int status ;
186
187
struct usb_ctrlrequest * dr ;
188
+ int ret = - ENOMEM ;
187
189
188
190
spin_lock_irqsave (& priv -> lock , flags );
189
191
if (priv -> outstanding_urbs > URB_UPPER_LIMIT ) {
@@ -192,19 +194,16 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
192
194
return 0 ;
193
195
}
194
196
priv -> outstanding_urbs ++ ;
197
+ priv -> outstanding_bytes += count ;
195
198
spin_unlock_irqrestore (& priv -> lock , flags );
196
199
197
200
buffer = kmalloc (count , GFP_ATOMIC );
198
- if (!buffer ) {
199
- count = - ENOMEM ;
201
+ if (!buffer )
200
202
goto error_no_buffer ;
201
- }
202
203
203
204
urb = usb_alloc_urb (0 , GFP_ATOMIC );
204
- if (!urb ) {
205
- count = - ENOMEM ;
205
+ if (!urb )
206
206
goto error_no_urb ;
207
- }
208
207
209
208
memcpy (buffer , buf , count );
210
209
@@ -213,10 +212,8 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
213
212
/* The connected devices do not have a bulk write endpoint,
214
213
* to transmit data to de barcode device the control endpoint is used */
215
214
dr = kmalloc (sizeof (struct usb_ctrlrequest ), GFP_ATOMIC );
216
- if (!dr ) {
217
- count = - ENOMEM ;
215
+ if (!dr )
218
216
goto error_no_dr ;
219
- }
220
217
221
218
dr -> bRequestType = USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT ;
222
219
dr -> bRequest = 0x01 ;
@@ -230,12 +227,9 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
230
227
opticon_write_control_callback , port );
231
228
232
229
/* 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 ;
230
+ ret = usb_submit_urb (urb , GFP_ATOMIC );
231
+ if (ret ) {
232
+ dev_err (& port -> dev , "failed to submit write urb: %d\n" , ret );
239
233
goto error ;
240
234
}
241
235
@@ -253,8 +247,10 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
253
247
error_no_buffer :
254
248
spin_lock_irqsave (& priv -> lock , flags );
255
249
-- priv -> outstanding_urbs ;
250
+ priv -> outstanding_bytes -= count ;
256
251
spin_unlock_irqrestore (& priv -> lock , flags );
257
- return count ;
252
+
253
+ return ret ;
258
254
}
259
255
260
256
static int opticon_write_room (struct tty_struct * tty )
@@ -279,6 +275,20 @@ static int opticon_write_room(struct tty_struct *tty)
279
275
return 2048 ;
280
276
}
281
277
278
+ static int opticon_chars_in_buffer (struct tty_struct * tty )
279
+ {
280
+ struct usb_serial_port * port = tty -> driver_data ;
281
+ struct opticon_private * priv = usb_get_serial_port_data (port );
282
+ unsigned long flags ;
283
+ int count ;
284
+
285
+ spin_lock_irqsave (& priv -> lock , flags );
286
+ count = priv -> outstanding_bytes ;
287
+ spin_unlock_irqrestore (& priv -> lock , flags );
288
+
289
+ return count ;
290
+ }
291
+
282
292
static int opticon_tiocmget (struct tty_struct * tty )
283
293
{
284
294
struct usb_serial_port * port = tty -> driver_data ;
@@ -383,6 +393,7 @@ static struct usb_serial_driver opticon_device = {
383
393
.open = opticon_open ,
384
394
.write = opticon_write ,
385
395
.write_room = opticon_write_room ,
396
+ .chars_in_buffer = opticon_chars_in_buffer ,
386
397
.throttle = usb_serial_generic_throttle ,
387
398
.unthrottle = usb_serial_generic_unthrottle ,
388
399
.get_serial = get_serial_info ,
0 commit comments