• A Sun's avatar
    media: mceusb: fix (eliminate) TX IR signal length limit · 9fc3ce31
    A Sun authored
    Fix and eliminate mceusb's IR length limit for IR signals transmitted to
    the MCE IR blaster ports.
    
    An IR signal TX exceeding 306 pulse/space samples presently causes -EINVAL
    return error. There's no such limitation nor error with the MCE device
    hardware. And valid IR signals exist with more than 400 pulse/space for the
    control of certain appliances (eg Panasonic ACXA75C00600 air conditioner).
    
    The scope of this patch is limited to the mceusb driver. There are still
    IR signal TX length and time constraints that related modules of rc core
    (eg LIRC) impose, further up the driver stack.
    
    Changes for mceusb_tx_ir():
    
    Converts and sends LIRC IR pulse/space sequence to MCE device IR
    pulse/space format.
    
    Break long length LIRC sequence into multiple (unlimited number of) parts
    for sending to the MCE device.
    Reduce kernel stack IR buffer size: 128 (was 384)
    Increase MCE IR data packet size: 31 (was 5)
    Zero time LIRC pulse/space no longer copied to MCE IR data.
    Eliminate overwriting the source/input LIRC IR data in txbuf[].
    Eliminate -EINVAL return; return number of IR samples sent (>0) or
    MCE write error code (<0).
    
    New mce_write() and mce_write_callback():
    
    Implements synchronous blocking I/O, with timeout, for writing/sending
    data to the MCE device.
    
    An unlimited multipart IR signal sent to the MCE device faster than real
    time requires flow control absent with the original mce_request_packet()
    and mce_async_callback() asynchronous I/O implementation. Also absent is
    TX error feedback.
    
    mce_write() combines and replaces mce_request_packet() and
    mce_async_callback() with conversion to synchronous I/O.
    mce_write() returns bytes sent (>0) or MCE device write error (<0).
    Debug hex dump TX data before processing.
    
    Rename mce_async_out() -> mce_command_out():
    
    The original name is misleading with underlying synchronous I/O
    implementation. Function renamed to mce_command_out().
    
    Changes in mceusb_handle_command():
    
    Add support for MCE device error case MCE_RSP_TX_TIMEOUT
    "IR TX timeout (TX buffer underrun)"
    
    Changes in mceusb_dev_printdata():
    
    Changes support test and debug of multipart TX IR.
    
    Add buffer boundary information (offset and buffer size) to TX hex dump.
    Correct TX trace bug "Raw IR data, 0 pulse/space samples"
    Add trace for MCE_RSP_TX_TIMEOUT "IR TX timeout (TX buffer underrun)"
    
    Other changes:
    
    The driver's write to USB device architecture change (async to sync I/O)
    is significant so we bump DRIVER_VERSION to "1.95" (from "1.94").
    
    Tests:
    
    $ cat -n irdata1 | head -3
         1  carrier 36000
         2  pulse 6350
         3  space 6350
    $ cat -n irdata1 | tail -3
        76  pulse 6350
        77  space 6350
        78  pulse 6350
    $ ir-ctl -s irdata1
    
    [1549021.073612] mceusb 1-1.3:1.0: requesting 36000 HZ carrier
    [1549021.073635] mceusb 1-1.3:1.0: tx data[0]: 9f 06 01 45 (len=4 sz=4)
    [1549021.073649] mceusb 1-1.3:1.0: Request carrier of 35714 Hz (period 28us)
    [1549021.073848] mceusb 1-1.3:1.0: tx done status = 4 (wait = 100, expire = 100 (1000ms), urb->actual_length = 4, urb->status = 0)
    [1549021.074689] mceusb 1-1.3:1.0: rx data[0]: 9f 06 01 45 (len=4 sz=4)
    [1549021.074701] mceusb 1-1.3:1.0: Got carrier of 35714 Hz (period 28us)
    [1549021.102023] mceusb 1-1.3:1.0: tx data[0]: 9f 08 03 (len=3 sz=3)
    [1549021.102036] mceusb 1-1.3:1.0: Request transmit blaster mask of 0x03
    [1549021.102219] mceusb 1-1.3:1.0: tx done status = 3 (wait = 100, expire = 100 (1000ms), urb->actual_length = 3, urb->status = 0)
    [1549021.131979] mceusb 1-1.3:1.0: tx data[0]: 9e ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f 9e ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f 91 ff (len=81 sz=81)
    [1549021.131992] mceusb 1-1.3:1.0: Raw IR data, 30 pulse/space samples
    [1549021.133592] mceusb 1-1.3:1.0: tx done status = 81 (wait = 100, expire = 100 (1000ms), urb->actual_length = 81, urb->status = 0)
    
    Hex dumps limited to 64 bytes.
    0xff is MCE maximum time pulse, 0x7f is MCE maximum time space.
    
    $ cat -n irdata2 | head -3
         1  carrier 36000
         2  pulse 50
         3  space 50
    $ cat -n irdata2 | tail -3
       254  pulse 50
       255  space 50
       256  pulse 50
    $ ir-ctl -s irdata2
    
    [1549306.586998] mceusb 1-1.3:1.0: tx data[0]: 9f 08 03 (len=3 sz=3)
    [1549306.587015] mceusb 1-1.3:1.0: Request transmit blaster mask of 0x03
    [1549306.587252] mceusb 1-1.3:1.0: tx done status = 3 (wait = 100, expire = 100 (1000ms), urb->actual_length = 3, urb->status = 0)
    [1549306.613275] mceusb 1-1.3:1.0: tx data[0]: 9e 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 9e 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 9e 81 (len=128 sz=128)
    [1549306.613291] mceusb 1-1.3:1.0: Raw IR data, 30 pulse/space samples
    [1549306.614837] mceusb 1-1.3:1.0: tx done status = 128 (wait = 100, expire = 100 (1000ms), urb->actual_length = 128, urb->status = 0)
    [1549306.614861] mceusb 1-1.3:1.0: tx data[0]: 9e 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 9e 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 9e 01 (len=128 sz=128)
    [1549306.614869] mceusb 1-1.3:1.0: Raw IR data, 30 pulse/space samples
    [1549306.620199] mceusb 1-1.3:1.0: tx done status = 128 (wait = 100, expire = 100 (1000ms), urb->actual_length = 128, urb->status = 0)
    [1549306.620212] mceusb 1-1.3:1.0: tx data[0]: 89 81 01 81 01 81 01 81 01 81 80 (len=11 sz=11)
    [1549306.620221] mceusb 1-1.3:1.0: Raw IR data, 9 pulse/space samples
    [1549306.633294] mceusb 1-1.3:1.0: tx done status = 11 (wait = 98, expire = 100 (1000ms), urb->actual_length = 11, urb->status = 0)
    
    Hex dumps limited to 64 bytes.
    0x81 is MCE minimum time pulse, 0x01 is MCE minimum time space.
    TX IR part 3 sz=11 shows 20msec I/O blocking delay
    (100expire - 98wait = 2jiffies)
    Signed-off-by: default avatarA Sun <as1033x@comcast.net>
    Signed-off-by: default avatarSean Young <sean@mess.org>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    9fc3ce31
mceusb.c 52.4 KB