@@ -45,9 +45,10 @@ static int buffer_size;
45
45
static int xbof = -1 ;
46
46
47
47
static int ir_startup (struct usb_serial * serial );
48
- static int ir_open (struct tty_struct * tty , struct usb_serial_port * port );
49
- static int ir_prepare_write_buffer (struct usb_serial_port * port ,
50
- void * dest , size_t size );
48
+ static int ir_write (struct tty_struct * tty , struct usb_serial_port * port ,
49
+ const unsigned char * buf , int count );
50
+ static int ir_write_room (struct tty_struct * tty );
51
+ static void ir_write_bulk_callback (struct urb * urb );
51
52
static void ir_process_read_urb (struct urb * urb );
52
53
static void ir_set_termios (struct tty_struct * tty ,
53
54
struct usb_serial_port * port , struct ktermios * old_termios );
@@ -75,10 +76,13 @@ static struct usb_serial_driver ir_device = {
75
76
.description = "IR Dongle" ,
76
77
.id_table = ir_id_table ,
77
78
.num_ports = 1 ,
79
+ .num_bulk_in = 1 ,
80
+ .num_bulk_out = 1 ,
78
81
.set_termios = ir_set_termios ,
79
82
.attach = ir_startup ,
80
- .open = ir_open ,
81
- .prepare_write_buffer = ir_prepare_write_buffer ,
83
+ .write = ir_write ,
84
+ .write_room = ir_write_room ,
85
+ .write_bulk_callback = ir_write_bulk_callback ,
82
86
.process_read_urb = ir_process_read_urb ,
83
87
};
84
88
@@ -251,35 +255,102 @@ static int ir_startup(struct usb_serial *serial)
251
255
return 0 ;
252
256
}
253
257
254
- static int ir_open (struct tty_struct * tty , struct usb_serial_port * port )
258
+ static int ir_write (struct tty_struct * tty , struct usb_serial_port * port ,
259
+ const unsigned char * buf , int count )
255
260
{
256
- int i ;
261
+ struct urb * urb = NULL ;
262
+ unsigned long flags ;
263
+ int ret ;
257
264
258
- for ( i = 0 ; i < ARRAY_SIZE ( port -> write_urbs ); ++ i )
259
- port -> write_urbs [ i ] -> transfer_flags = URB_ZERO_PACKET ;
265
+ if ( port -> bulk_out_size == 0 )
266
+ return - EINVAL ;
260
267
261
- /* Start reading from the device */
262
- return usb_serial_generic_open (tty , port );
263
- }
268
+ if (count == 0 )
269
+ return 0 ;
264
270
265
- static int ir_prepare_write_buffer (struct usb_serial_port * port ,
266
- void * dest , size_t size )
267
- {
268
- unsigned char * buf = dest ;
269
- int count ;
271
+ count = min (count , port -> bulk_out_size - 1 );
272
+
273
+ spin_lock_irqsave (& port -> lock , flags );
274
+ if (__test_and_clear_bit (0 , & port -> write_urbs_free )) {
275
+ urb = port -> write_urbs [0 ];
276
+ port -> tx_bytes += count ;
277
+ }
278
+ spin_unlock_irqrestore (& port -> lock , flags );
279
+
280
+ if (!urb )
281
+ return 0 ;
270
282
271
283
/*
272
284
* The first byte of the packet we send to the device contains an
273
- * inbound header which indicates an additional number of BOFs and
285
+ * outbound header which indicates an additional number of BOFs and
274
286
* a baud rate change.
275
287
*
276
288
* See section 5.4.2.2 of the USB IrDA spec.
277
289
*/
278
- * buf = ir_xbof | ir_baud ;
290
+ * (u8 * )urb -> transfer_buffer = ir_xbof | ir_baud ;
291
+
292
+ memcpy (urb -> transfer_buffer + 1 , buf , count );
293
+
294
+ urb -> transfer_buffer_length = count + 1 ;
295
+ urb -> transfer_flags = URB_ZERO_PACKET ;
296
+
297
+ ret = usb_submit_urb (urb , GFP_ATOMIC );
298
+ if (ret ) {
299
+ dev_err (& port -> dev , "failed to submit write urb: %d\n" , ret );
300
+
301
+ spin_lock_irqsave (& port -> lock , flags );
302
+ __set_bit (0 , & port -> write_urbs_free );
303
+ port -> tx_bytes -= count ;
304
+ spin_unlock_irqrestore (& port -> lock , flags );
305
+
306
+ return ret ;
307
+ }
308
+
309
+ return count ;
310
+ }
311
+
312
+ static void ir_write_bulk_callback (struct urb * urb )
313
+ {
314
+ struct usb_serial_port * port = urb -> context ;
315
+ int status = urb -> status ;
316
+ unsigned long flags ;
317
+
318
+ spin_lock_irqsave (& port -> lock , flags );
319
+ __set_bit (0 , & port -> write_urbs_free );
320
+ port -> tx_bytes -= urb -> transfer_buffer_length - 1 ;
321
+ spin_unlock_irqrestore (& port -> lock , flags );
322
+
323
+ switch (status ) {
324
+ case 0 :
325
+ break ;
326
+ case - ENOENT :
327
+ case - ECONNRESET :
328
+ case - ESHUTDOWN :
329
+ dev_dbg (& port -> dev , "write urb stopped: %d\n" , status );
330
+ return ;
331
+ case - EPIPE :
332
+ dev_err (& port -> dev , "write urb stopped: %d\n" , status );
333
+ return ;
334
+ default :
335
+ dev_err (& port -> dev , "nonzero write-urb status: %d\n" , status );
336
+ break ;
337
+ }
338
+
339
+ usb_serial_port_softint (port );
340
+ }
279
341
280
- count = kfifo_out_locked (& port -> write_fifo , buf + 1 , size - 1 ,
281
- & port -> lock );
282
- return count + 1 ;
342
+ static int ir_write_room (struct tty_struct * tty )
343
+ {
344
+ struct usb_serial_port * port = tty -> driver_data ;
345
+ int count = 0 ;
346
+
347
+ if (port -> bulk_out_size == 0 )
348
+ return 0 ;
349
+
350
+ if (test_bit (0 , & port -> write_urbs_free ))
351
+ count = port -> bulk_out_size - 1 ;
352
+
353
+ return count ;
283
354
}
284
355
285
356
static void ir_process_read_urb (struct urb * urb )
@@ -304,23 +375,15 @@ static void ir_process_read_urb(struct urb *urb)
304
375
tty_flip_buffer_push (& port -> port );
305
376
}
306
377
307
- static void ir_set_termios_callback (struct urb * urb )
308
- {
309
- kfree (urb -> transfer_buffer );
310
-
311
- if (urb -> status )
312
- dev_dbg (& urb -> dev -> dev , "%s - non-zero urb status: %d\n" ,
313
- __func__ , urb -> status );
314
- }
315
-
316
378
static void ir_set_termios (struct tty_struct * tty ,
317
379
struct usb_serial_port * port , struct ktermios * old_termios )
318
380
{
319
- struct urb * urb ;
381
+ struct usb_device * udev = port -> serial -> dev ;
320
382
unsigned char * transfer_buffer ;
321
- int result ;
383
+ int actual_length ;
322
384
speed_t baud ;
323
385
int ir_baud ;
386
+ int ret ;
324
387
325
388
baud = tty_get_baud_rate (tty );
326
389
@@ -332,34 +395,34 @@ static void ir_set_termios(struct tty_struct *tty,
332
395
333
396
switch (baud ) {
334
397
case 2400 :
335
- ir_baud = USB_IRDA_BR_2400 ;
398
+ ir_baud = USB_IRDA_LS_2400 ;
336
399
break ;
337
400
case 9600 :
338
- ir_baud = USB_IRDA_BR_9600 ;
401
+ ir_baud = USB_IRDA_LS_9600 ;
339
402
break ;
340
403
case 19200 :
341
- ir_baud = USB_IRDA_BR_19200 ;
404
+ ir_baud = USB_IRDA_LS_19200 ;
342
405
break ;
343
406
case 38400 :
344
- ir_baud = USB_IRDA_BR_38400 ;
407
+ ir_baud = USB_IRDA_LS_38400 ;
345
408
break ;
346
409
case 57600 :
347
- ir_baud = USB_IRDA_BR_57600 ;
410
+ ir_baud = USB_IRDA_LS_57600 ;
348
411
break ;
349
412
case 115200 :
350
- ir_baud = USB_IRDA_BR_115200 ;
413
+ ir_baud = USB_IRDA_LS_115200 ;
351
414
break ;
352
415
case 576000 :
353
- ir_baud = USB_IRDA_BR_576000 ;
416
+ ir_baud = USB_IRDA_LS_576000 ;
354
417
break ;
355
418
case 1152000 :
356
- ir_baud = USB_IRDA_BR_1152000 ;
419
+ ir_baud = USB_IRDA_LS_1152000 ;
357
420
break ;
358
421
case 4000000 :
359
- ir_baud = USB_IRDA_BR_4000000 ;
422
+ ir_baud = USB_IRDA_LS_4000000 ;
360
423
break ;
361
424
default :
362
- ir_baud = USB_IRDA_BR_9600 ;
425
+ ir_baud = USB_IRDA_LS_9600 ;
363
426
baud = 9600 ;
364
427
}
365
428
@@ -375,42 +438,22 @@ static void ir_set_termios(struct tty_struct *tty,
375
438
/*
376
439
* send the baud change out on an "empty" data packet
377
440
*/
378
- urb = usb_alloc_urb (0 , GFP_KERNEL );
379
- if (!urb )
380
- return ;
381
-
382
441
transfer_buffer = kmalloc (1 , GFP_KERNEL );
383
442
if (!transfer_buffer )
384
- goto err_buf ;
443
+ return ;
385
444
386
445
* transfer_buffer = ir_xbof | ir_baud ;
387
446
388
- usb_fill_bulk_urb (
389
- urb ,
390
- port -> serial -> dev ,
391
- usb_sndbulkpipe (port -> serial -> dev ,
392
- port -> bulk_out_endpointAddress ),
393
- transfer_buffer ,
394
- 1 ,
395
- ir_set_termios_callback ,
396
- port );
397
-
398
- urb -> transfer_flags = URB_ZERO_PACKET ;
399
-
400
- result = usb_submit_urb (urb , GFP_KERNEL );
401
- if (result ) {
402
- dev_err (& port -> dev , "%s - failed to submit urb: %d\n" ,
403
- __func__ , result );
404
- goto err_subm ;
447
+ ret = usb_bulk_msg (udev ,
448
+ usb_sndbulkpipe (udev , port -> bulk_out_endpointAddress ),
449
+ transfer_buffer , 1 , & actual_length , 5000 );
450
+ if (ret || actual_length != 1 ) {
451
+ if (actual_length != 1 )
452
+ ret = - EIO ;
453
+ dev_err (& port -> dev , "failed to change line speed: %d\n" , ret );
405
454
}
406
455
407
- usb_free_urb (urb );
408
-
409
- return ;
410
- err_subm :
411
456
kfree (transfer_buffer );
412
- err_buf :
413
- usb_free_urb (urb );
414
457
}
415
458
416
459
static int __init ir_init (void )
0 commit comments