@ -108,6 +108,12 @@ static int debug = 1;
static int debug ;
# endif
# define mce_dbg(dev, fmt, ...) \
do { \
if ( debug ) \
dev_info ( dev , fmt , # # __VA_ARGS__ ) ; \
} while ( 0 )
/* general constants */
# define SEND_FLAG_IN_PROGRESS 1
# define SEND_FLAG_COMPLETE 2
@ -246,6 +252,9 @@ static struct usb_device_id mceusb_dev_table[] = {
. driver_info = MCE_GEN2_TX_INV } ,
/* SMK eHome Infrared Transceiver */
{ USB_DEVICE ( VENDOR_SMK , 0x0338 ) } ,
/* SMK/I-O Data GV-MC7/RCKIT Receiver */
{ USB_DEVICE ( VENDOR_SMK , 0x0353 ) ,
. driver_info = MCE_GEN2_NO_TX } ,
/* Tatung eHome Infrared Transceiver */
{ USB_DEVICE ( VENDOR_TATUNG , 0x9150 ) } ,
/* Shuttle eHome Infrared Transceiver */
@ -606,12 +615,15 @@ static void mce_async_callback(struct urb *urb, struct pt_regs *regs)
if ( ir ) {
len = urb - > actual_length ;
dev _dbg( ir - > dev , " callback called (status=%d len=%d) \n " ,
mce _dbg( ir - > dev , " callback called (status=%d len=%d) \n " ,
urb - > status , len ) ;
mceusb_dev_printdata ( ir , urb - > transfer_buffer , 0 , len , true ) ;
}
/* the transfer buffer and urb were allocated in mce_request_packet */
kfree ( urb - > transfer_buffer ) ;
usb_free_urb ( urb ) ;
}
/* request incoming or send outgoing usb packet - used to initialize remote */
@ -655,17 +667,17 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
return ;
}
dev _dbg( dev , " receive request called (size=%#x) \n " , size ) ;
mce _dbg( dev , " receive request called (size=%#x) \n " , size ) ;
async_urb - > transfer_buffer_length = size ;
async_urb - > dev = ir - > usbdev ;
res = usb_submit_urb ( async_urb , GFP_ATOMIC ) ;
if ( res ) {
dev _dbg( dev , " receive request FAILED! (res=%d) \n " , res ) ;
mce _dbg( dev , " receive request FAILED! (res=%d) \n " , res ) ;
return ;
}
dev _dbg( dev , " receive request complete (res=%d) \n " , res ) ;
mce _dbg( dev , " receive request complete (res=%d) \n " , res ) ;
}
static void mce_async_out ( struct mceusb_dev * ir , unsigned char * data , int size )
@ -673,9 +685,9 @@ static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
mce_request_packet ( ir , data , size , MCEUSB_TX ) ;
}
static void mce_sync_in ( struct mceusb_dev * ir , unsigned char * data , int size )
static void mce_flush_rx_buffer ( struct mceusb_dev * ir , int size )
{
mce_request_packet ( ir , data , size , MCEUSB_RX ) ;
mce_request_packet ( ir , NULL , size , MCEUSB_RX ) ;
}
/* Send data out the IR blaster port(s) */
@ -794,7 +806,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
ir - > carrier = carrier ;
cmdbuf [ 2 ] = MCE_CMD_SIG_END ;
cmdbuf [ 3 ] = MCE_IRDATA_TRAILER ;
dev _dbg( ir - > dev , " %s: disabling carrier "
mce _dbg( ir - > dev , " %s: disabling carrier "
" modulation \n " , __func__ ) ;
mce_async_out ( ir , cmdbuf , sizeof ( cmdbuf ) ) ;
return carrier ;
@ -806,7 +818,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
ir - > carrier = carrier ;
cmdbuf [ 2 ] = prescaler ;
cmdbuf [ 3 ] = divisor ;
dev _dbg( ir - > dev , " %s: requesting %u HZ "
mce _dbg( ir - > dev , " %s: requesting %u HZ "
" carrier \n " , __func__ , carrier ) ;
/* Transmit new carrier to mce device */
@ -879,7 +891,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
rawir . duration = ( ir - > buf_in [ i ] & MCE_PULSE_MASK )
* US_TO_NS ( MCE_TIME_UNIT ) ;
dev _dbg( ir - > dev , " Storing %s with duration %d \n " ,
mce _dbg( ir - > dev , " Storing %s with duration %d \n " ,
rawir . pulse ? " pulse " : " space " ,
rawir . duration ) ;
@ -911,7 +923,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
if ( ir - > parser_state ! = CMD_HEADER & & ! ir - > rem )
ir - > parser_state = CMD_HEADER ;
}
dev _dbg( ir - > dev , " processed IR data, calling ir_raw_event_handle \n " ) ;
mce _dbg( ir - > dev , " processed IR data, calling ir_raw_event_handle \n " ) ;
ir_raw_event_handle ( ir - > rc ) ;
}
@ -933,7 +945,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
if ( ir - > send_flags = = RECV_FLAG_IN_PROGRESS ) {
ir - > send_flags = SEND_FLAG_COMPLETE ;
dev _dbg( ir - > dev , " setup answer received %d bytes \n " ,
mce _dbg( ir - > dev , " setup answer received %d bytes \n " ,
buf_len ) ;
}
@ -951,7 +963,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
case - EPIPE :
default :
dev _dbg( ir - > dev , " Error: urb status = %d \n " , urb - > status ) ;
mce _dbg( ir - > dev , " Error: urb status = %d \n " , urb - > status ) ;
break ;
}
@ -961,7 +973,6 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
static void mceusb_gen1_init ( struct mceusb_dev * ir )
{
int ret ;
int maxp = ir - > len_in ;
struct device * dev = ir - > dev ;
char * data ;
@ -978,8 +989,8 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
ret = usb_control_msg ( ir - > usbdev , usb_rcvctrlpipe ( ir - > usbdev , 0 ) ,
USB_REQ_SET_ADDRESS , USB_TYPE_VENDOR , 0 , 0 ,
data , USB_CTRL_MSG_SZ , HZ * 3 ) ;
dev _dbg( dev , " %s - ret = %d \n " , __func__ , ret ) ;
dev _dbg( dev , " %s - data[0] = %d, data[1] = %d \n " ,
mce _dbg( dev , " %s - ret = %d \n " , __func__ , ret ) ;
mce _dbg( dev , " %s - data[0] = %d, data[1] = %d \n " ,
__func__ , data [ 0 ] , data [ 1 ] ) ;
/* set feature: bit rate 38400 bps */
@ -987,71 +998,56 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
USB_REQ_SET_FEATURE , USB_TYPE_VENDOR ,
0xc04e , 0x0000 , NULL , 0 , HZ * 3 ) ;
dev _dbg( dev , " %s - ret = %d \n " , __func__ , ret ) ;
mce _dbg( dev , " %s - ret = %d \n " , __func__ , ret ) ;
/* bRequest 4: set char length to 8 bits */
ret = usb_control_msg ( ir - > usbdev , usb_sndctrlpipe ( ir - > usbdev , 0 ) ,
4 , USB_TYPE_VENDOR ,
0x0808 , 0x0000 , NULL , 0 , HZ * 3 ) ;
dev _dbg( dev , " %s - retB = %d \n " , __func__ , ret ) ;
mce _dbg( dev , " %s - retB = %d \n " , __func__ , ret ) ;
/* bRequest 2: set handshaking to use DTR/DSR */
ret = usb_control_msg ( ir - > usbdev , usb_sndctrlpipe ( ir - > usbdev , 0 ) ,
2 , USB_TYPE_VENDOR ,
0x0000 , 0x0100 , NULL , 0 , HZ * 3 ) ;
dev _dbg( dev , " %s - retC = %d \n " , __func__ , ret ) ;
mce _dbg( dev , " %s - retC = %d \n " , __func__ , ret ) ;
/* device reset */
mce_async_out ( ir , DEVICE_RESET , sizeof ( DEVICE_RESET ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
/* get hw/sw revision? */
mce_async_out ( ir , GET_REVISION , sizeof ( GET_REVISION ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
kfree ( data ) ;
} ;
static void mceusb_gen2_init ( struct mceusb_dev * ir )
{
int maxp = ir - > len_in ;
/* device reset */
mce_async_out ( ir , DEVICE_RESET , sizeof ( DEVICE_RESET ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
/* get hw/sw revision? */
mce_async_out ( ir , GET_REVISION , sizeof ( GET_REVISION ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
/* unknown what the next two actually return... */
mce_async_out ( ir , GET_UNKNOWN , sizeof ( GET_UNKNOWN ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
mce_async_out ( ir , GET_UNKNOWN2 , sizeof ( GET_UNKNOWN2 ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
}
static void mceusb_get_parameters ( struct mceusb_dev * ir )
{
int maxp = ir - > len_in ;
/* get the carrier and frequency */
mce_async_out ( ir , GET_CARRIER_FREQ , sizeof ( GET_CARRIER_FREQ ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
if ( ! ir - > flags . no_tx ) {
if ( ! ir - > flags . no_tx )
/* get the transmitter bitmask */
mce_async_out ( ir , GET_TX_BITMASK , sizeof ( GET_TX_BITMASK ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
}
/* get receiver timeout value */
mce_async_out ( ir , GET_RX_TIMEOUT , sizeof ( GET_RX_TIMEOUT ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
/* get receiver sensor setting */
mce_async_out ( ir , GET_RX_SENSOR , sizeof ( GET_RX_SENSOR ) ) ;
mce_sync_in ( ir , NULL , maxp ) ;
}
static struct rc_dev * mceusb_init_rc_dev ( struct mceusb_dev * ir )
@ -1122,7 +1118,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
bool tx_mask_normal ;
int ir_intfnum ;
dev _dbg( & intf - > dev , " %s called \n " , __func__ ) ;
mce _dbg( & intf - > dev , " %s called \n " , __func__ ) ;
idesc = intf - > cur_altsetting ;
@ -1150,7 +1146,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
ep_in = ep ;
ep_in - > bmAttributes = USB_ENDPOINT_XFER_INT ;
ep_in - > bInterval = 1 ;
dev _dbg( & intf - > dev , " acceptable inbound endpoint "
mce _dbg( & intf - > dev , " acceptable inbound endpoint "
" found \n " ) ;
}
@ -1165,12 +1161,12 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
ep_out = ep ;
ep_out - > bmAttributes = USB_ENDPOINT_XFER_INT ;
ep_out - > bInterval = 1 ;
dev _dbg( & intf - > dev , " acceptable outbound endpoint "
mce _dbg( & intf - > dev , " acceptable outbound endpoint "
" found \n " ) ;
}
}
if ( ep_in = = NULL ) {
dev _dbg( & intf - > dev , " inbound and/or endpoint not found \n " ) ;
mce _dbg( & intf - > dev , " inbound and/or endpoint not found \n " ) ;
return - ENODEV ;
}
@ -1215,16 +1211,16 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
if ( ! ir - > rc )
goto rc_dev_fail ;
/* flush buffers on the device */
mce_sync_in ( ir , NULL , maxp ) ;
mce_sync_in ( ir , NULL , maxp ) ;
/* wire up inbound data handler */
usb_fill_int_urb ( ir - > urb_in , dev , pipe , ir - > buf_in ,
maxp , ( usb_complete_t ) mceusb_dev_recv , ir , ep_in - > bInterval ) ;
ir - > urb_in - > transfer_dma = ir - > dma_in ;
ir - > urb_in - > transfer_flags | = URB_NO_TRANSFER_DMA_MAP ;
/* flush buffers on the device */
mce_dbg ( & intf - > dev , " Flushing receive buffers \n " ) ;
mce_flush_rx_buffer ( ir , maxp ) ;
/* initialize device */
if ( ir - > flags . microsoft_gen1 )
mceusb_gen1_init ( ir ) ;