0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #include <linux/device.h>
0026 #include <linux/module.h>
0027 #include <linux/slab.h>
0028 #include <linux/workqueue.h>
0029 #include <linux/usb.h>
0030 #include <linux/usb/input.h>
0031 #include <linux/pm_wakeup.h>
0032 #include <media/rc-core.h>
0033
0034 #define DRIVER_VERSION "1.95"
0035 #define DRIVER_AUTHOR "Jarod Wilson <jarod@redhat.com>"
0036 #define DRIVER_DESC "Windows Media Center Ed. eHome Infrared Transceiver " \
0037 "device driver"
0038 #define DRIVER_NAME "mceusb"
0039
0040 #define USB_TX_TIMEOUT 1000
0041 #define USB_CTRL_MSG_SZ 2
0042 #define MCE_G1_INIT_MSGS 40
0043
0044
0045 #define MCE_IRBUF_SIZE 128
0046 #define MCE_TIME_UNIT 50
0047 #define MCE_PACKET_SIZE 31
0048 #define MCE_IRDATA_HEADER (0x80 + MCE_PACKET_SIZE - 1)
0049
0050 #define MCE_IRDATA_TRAILER 0x80
0051 #define MCE_MAX_CHANNELS 2
0052 #define MCE_DEFAULT_TX_MASK 0x03
0053 #define MCE_PULSE_BIT 0x80
0054 #define MCE_PULSE_MASK 0x7f
0055 #define MCE_MAX_PULSE_LENGTH 0x7f
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 #define MCE_CMD 0x1f
0070 #define MCE_PORT_IR 0x4
0071 #define MCE_PORT_SYS 0x7
0072 #define MCE_PORT_SER 0x6
0073 #define MCE_PORT_MASK 0xe0
0074
0075
0076 #define MCE_CMD_PORT_IR 0x9f
0077 #define MCE_CMD_PORT_SYS 0xff
0078
0079
0080 #define MCE_CMD_RESET 0xfe
0081 #define MCE_CMD_RESUME 0xaa
0082 #define MCE_CMD_SETIRCFS 0x06
0083 #define MCE_CMD_SETIRTIMEOUT 0x0c
0084 #define MCE_CMD_SETIRTXPORTS 0x08
0085 #define MCE_CMD_SETIRRXPORTEN 0x14
0086 #define MCE_CMD_FLASHLED 0x23
0087
0088
0089 #define MCE_CMD_GETIRCFS 0x07
0090 #define MCE_CMD_GETIRTIMEOUT 0x0d
0091 #define MCE_CMD_GETIRTXPORTS 0x13
0092 #define MCE_CMD_GETIRRXPORTEN 0x15
0093 #define MCE_CMD_GETPORTSTATUS 0x11
0094 #define MCE_CMD_GETIRNUMPORTS 0x16
0095 #define MCE_CMD_GETWAKESOURCE 0x17
0096 #define MCE_CMD_GETEMVER 0x22
0097 #define MCE_CMD_GETDEVDETAILS 0x21
0098 #define MCE_CMD_GETWAKESUPPORT 0x20
0099 #define MCE_CMD_GETWAKEVERSION 0x18
0100
0101
0102 #define MCE_CMD_NOP 0xff
0103
0104
0105 #define MCE_RSP_EQIRCFS 0x06
0106 #define MCE_RSP_EQIRTIMEOUT 0x0c
0107 #define MCE_RSP_GETWAKESOURCE 0x17
0108 #define MCE_RSP_EQIRTXPORTS 0x08
0109 #define MCE_RSP_EQIRRXPORTEN 0x14
0110 #define MCE_RSP_GETPORTSTATUS 0x11
0111 #define MCE_RSP_EQIRRXCFCNT 0x15
0112 #define MCE_RSP_EQIRNUMPORTS 0x16
0113 #define MCE_RSP_EQWAKESUPPORT 0x20
0114 #define MCE_RSP_EQWAKEVERSION 0x18
0115 #define MCE_RSP_EQDEVDETAILS 0x21
0116 #define MCE_RSP_EQEMVER 0x22
0117 #define MCE_RSP_FLASHLED 0x23
0118
0119
0120 #define MCE_RSP_CMD_ILLEGAL 0xfe
0121 #define MCE_RSP_TX_TIMEOUT 0x81
0122
0123
0124 #define MCE_CMD_SIG_END 0x01
0125 #define MCE_CMD_PING 0x03
0126 #define MCE_CMD_UNKNOWN 0x04
0127 #define MCE_CMD_UNKNOWN2 0x05
0128 #define MCE_CMD_UNKNOWN3 0x09
0129 #define MCE_CMD_UNKNOWN4 0x0a
0130 #define MCE_CMD_G_REVISION 0x0b
0131 #define MCE_CMD_UNKNOWN5 0x0e
0132 #define MCE_CMD_UNKNOWN6 0x0f
0133 #define MCE_CMD_UNKNOWN8 0x19
0134 #define MCE_CMD_UNKNOWN9 0x1b
0135 #define MCE_CMD_NULL 0x00
0136
0137
0138
0139 #define MCE_COMMAND_IRDATA 0x80
0140 #define MCE_PACKET_LENGTH_MASK 0x1f
0141
0142 #define VENDOR_PHILIPS 0x0471
0143 #define VENDOR_SMK 0x0609
0144 #define VENDOR_TATUNG 0x1460
0145 #define VENDOR_GATEWAY 0x107b
0146 #define VENDOR_SHUTTLE 0x1308
0147 #define VENDOR_SHUTTLE2 0x051c
0148 #define VENDOR_MITSUMI 0x03ee
0149 #define VENDOR_TOPSEED 0x1784
0150 #define VENDOR_RICAVISION 0x179d
0151 #define VENDOR_ITRON 0x195d
0152 #define VENDOR_FIC 0x1509
0153 #define VENDOR_LG 0x043e
0154 #define VENDOR_MICROSOFT 0x045e
0155 #define VENDOR_FORMOSA 0x147a
0156 #define VENDOR_FINTEK 0x1934
0157 #define VENDOR_PINNACLE 0x2304
0158 #define VENDOR_ECS 0x1019
0159 #define VENDOR_WISTRON 0x0fb8
0160 #define VENDOR_COMPRO 0x185b
0161 #define VENDOR_NORTHSTAR 0x04eb
0162 #define VENDOR_REALTEK 0x0bda
0163 #define VENDOR_TIVO 0x105a
0164 #define VENDOR_CONEXANT 0x0572
0165 #define VENDOR_TWISTEDMELON 0x2596
0166 #define VENDOR_HAUPPAUGE 0x2040
0167 #define VENDOR_PCTV 0x2013
0168 #define VENDOR_ADAPTEC 0x03f3
0169
0170 enum mceusb_model_type {
0171 MCE_GEN2 = 0,
0172 MCE_GEN1,
0173 MCE_GEN3,
0174 MCE_GEN3_BROKEN_IRTIMEOUT,
0175 MCE_GEN2_TX_INV,
0176 MCE_GEN2_TX_INV_RX_GOOD,
0177 POLARIS_EVK,
0178 CX_HYBRID_TV,
0179 MULTIFUNCTION,
0180 TIVO_KIT,
0181 MCE_GEN2_NO_TX,
0182 HAUPPAUGE_CX_HYBRID_TV,
0183 EVROMEDIA_FULL_HYBRID_FULLHD,
0184 ASTROMETA_T2HYBRID,
0185 };
0186
0187 struct mceusb_model {
0188 u32 mce_gen1:1;
0189 u32 mce_gen2:1;
0190 u32 mce_gen3:1;
0191 u32 tx_mask_normal:1;
0192 u32 no_tx:1;
0193 u32 broken_irtimeout:1;
0194
0195
0196
0197
0198
0199
0200 u32 rx2;
0201
0202 int ir_intfnum;
0203
0204 const char *rc_map;
0205 const char *name;
0206 };
0207
0208 static const struct mceusb_model mceusb_model[] = {
0209 [MCE_GEN1] = {
0210 .mce_gen1 = 1,
0211 .tx_mask_normal = 1,
0212 .rx2 = 2,
0213 },
0214 [MCE_GEN2] = {
0215 .mce_gen2 = 1,
0216 .rx2 = 2,
0217 },
0218 [MCE_GEN2_NO_TX] = {
0219 .mce_gen2 = 1,
0220 .no_tx = 1,
0221 },
0222 [MCE_GEN2_TX_INV] = {
0223 .mce_gen2 = 1,
0224 .tx_mask_normal = 1,
0225 .rx2 = 1,
0226 },
0227 [MCE_GEN2_TX_INV_RX_GOOD] = {
0228 .mce_gen2 = 1,
0229 .tx_mask_normal = 1,
0230 .rx2 = 2,
0231 },
0232 [MCE_GEN3] = {
0233 .mce_gen3 = 1,
0234 .tx_mask_normal = 1,
0235 .rx2 = 2,
0236 },
0237 [MCE_GEN3_BROKEN_IRTIMEOUT] = {
0238 .mce_gen3 = 1,
0239 .tx_mask_normal = 1,
0240 .rx2 = 2,
0241 .broken_irtimeout = 1
0242 },
0243 [POLARIS_EVK] = {
0244
0245
0246
0247
0248
0249 .name = "Conexant Hybrid TV (cx231xx) MCE IR",
0250 .rx2 = 2,
0251 },
0252 [CX_HYBRID_TV] = {
0253 .no_tx = 1,
0254 .name = "Conexant Hybrid TV (cx231xx) MCE IR",
0255 },
0256 [HAUPPAUGE_CX_HYBRID_TV] = {
0257 .no_tx = 1,
0258 .name = "Conexant Hybrid TV (cx231xx) MCE IR no TX",
0259 },
0260 [MULTIFUNCTION] = {
0261 .mce_gen2 = 1,
0262 .ir_intfnum = 2,
0263 .rx2 = 2,
0264 },
0265 [TIVO_KIT] = {
0266 .mce_gen2 = 1,
0267 .rc_map = RC_MAP_TIVO,
0268 .rx2 = 2,
0269 },
0270 [EVROMEDIA_FULL_HYBRID_FULLHD] = {
0271 .name = "Evromedia USB Full Hybrid Full HD",
0272 .no_tx = 1,
0273 .rc_map = RC_MAP_MSI_DIGIVOX_III,
0274 },
0275 [ASTROMETA_T2HYBRID] = {
0276 .name = "Astrometa T2Hybrid",
0277 .no_tx = 1,
0278 .rc_map = RC_MAP_ASTROMETA_T2HYBRID,
0279 }
0280 };
0281
0282 static const struct usb_device_id mceusb_dev_table[] = {
0283
0284 { USB_DEVICE(VENDOR_MICROSOFT, 0x006d),
0285 .driver_info = MCE_GEN1 },
0286
0287 { USB_DEVICE(VENDOR_PHILIPS, 0x0608) },
0288
0289 { USB_DEVICE(VENDOR_PHILIPS, 0x060c),
0290 .driver_info = MCE_GEN2_TX_INV },
0291
0292 { USB_DEVICE(VENDOR_PHILIPS, 0x060d) },
0293
0294 { USB_DEVICE(VENDOR_PHILIPS, 0x060f) },
0295
0296 { USB_DEVICE(VENDOR_PHILIPS, 0x0613) },
0297
0298 { USB_DEVICE(VENDOR_PHILIPS, 0x0815) },
0299
0300 { USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
0301
0302 { USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
0303
0304 { USB_DEVICE(VENDOR_PHILIPS, 0x2093),
0305 .driver_info = MCE_GEN2_TX_INV },
0306
0307 { USB_DEVICE(VENDOR_REALTEK, 0x0161),
0308 .driver_info = MULTIFUNCTION },
0309
0310 { USB_DEVICE(VENDOR_SMK, 0x031d),
0311 .driver_info = MCE_GEN2_TX_INV_RX_GOOD },
0312
0313 { USB_DEVICE(VENDOR_SMK, 0x0322),
0314 .driver_info = MCE_GEN2_TX_INV },
0315
0316 { USB_DEVICE(VENDOR_SMK, 0x0334),
0317 .driver_info = MCE_GEN2_TX_INV },
0318
0319 { USB_DEVICE(VENDOR_SMK, 0x0338) },
0320
0321 { USB_DEVICE(VENDOR_SMK, 0x0353),
0322 .driver_info = MCE_GEN2_NO_TX },
0323
0324 { USB_DEVICE(VENDOR_SMK, 0x0357),
0325 .driver_info = MCE_GEN2_NO_TX },
0326
0327 { USB_DEVICE(VENDOR_TATUNG, 0x9150) },
0328
0329 { USB_DEVICE(VENDOR_SHUTTLE, 0xc001) },
0330
0331 { USB_DEVICE(VENDOR_SHUTTLE2, 0xc001) },
0332
0333 { USB_DEVICE(VENDOR_GATEWAY, 0x3009) },
0334
0335 { USB_DEVICE(VENDOR_MITSUMI, 0x2501) },
0336
0337 { USB_DEVICE(VENDOR_TOPSEED, 0x0001),
0338 .driver_info = MCE_GEN2_TX_INV },
0339
0340 { USB_DEVICE(VENDOR_TOPSEED, 0x0006),
0341 .driver_info = MCE_GEN2_TX_INV },
0342
0343 { USB_DEVICE(VENDOR_TOPSEED, 0x0007),
0344 .driver_info = MCE_GEN2_TX_INV },
0345
0346 { USB_DEVICE(VENDOR_TOPSEED, 0x0008),
0347 .driver_info = MCE_GEN3 },
0348
0349 { USB_DEVICE(VENDOR_TOPSEED, 0x000a),
0350 .driver_info = MCE_GEN2_TX_INV },
0351
0352 { USB_DEVICE(VENDOR_TOPSEED, 0x0011),
0353 .driver_info = MCE_GEN3_BROKEN_IRTIMEOUT },
0354
0355 { USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
0356
0357 { USB_DEVICE(VENDOR_ITRON, 0x7002) },
0358
0359 { USB_DEVICE(VENDOR_FIC, 0x9242) },
0360
0361 { USB_DEVICE(VENDOR_LG, 0x9803) },
0362
0363 { USB_DEVICE(VENDOR_MICROSOFT, 0x00a0) },
0364
0365 { USB_DEVICE(VENDOR_FORMOSA, 0xe015) },
0366
0367 { USB_DEVICE(VENDOR_FORMOSA, 0xe016) },
0368
0369 { USB_DEVICE(VENDOR_FORMOSA, 0xe017),
0370 .driver_info = MCE_GEN2_NO_TX },
0371
0372 { USB_DEVICE(VENDOR_FORMOSA, 0xe018) },
0373
0374 { USB_DEVICE(VENDOR_FORMOSA, 0xe03a) },
0375
0376 { USB_DEVICE(VENDOR_FORMOSA, 0xe03c) },
0377
0378 { USB_DEVICE(VENDOR_FORMOSA, 0xe03e) },
0379
0380 { USB_DEVICE(VENDOR_FORMOSA, 0xe042) },
0381
0382 { USB_DEVICE(VENDOR_FINTEK, 0x5168),
0383 .driver_info = MCE_GEN2_TX_INV },
0384
0385 { USB_DEVICE(VENDOR_FINTEK, 0x0602) },
0386
0387 { USB_DEVICE(VENDOR_FINTEK, 0x0702) },
0388
0389 { USB_DEVICE(VENDOR_PINNACLE, 0x0225),
0390 .driver_info = MCE_GEN3 },
0391
0392 { USB_DEVICE(VENDOR_ECS, 0x0f38) },
0393
0394 { USB_DEVICE(VENDOR_WISTRON, 0x0002) },
0395
0396 { USB_DEVICE(VENDOR_COMPRO, 0x3020) },
0397
0398 { USB_DEVICE(VENDOR_COMPRO, 0x3082) },
0399
0400 { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) },
0401
0402 { USB_DEVICE(VENDOR_TIVO, 0x2000),
0403 .driver_info = TIVO_KIT },
0404
0405 { USB_DEVICE(VENDOR_CONEXANT, 0x58a1),
0406 .driver_info = POLARIS_EVK },
0407
0408 { USB_DEVICE(VENDOR_CONEXANT, 0x58a5),
0409 .driver_info = CX_HYBRID_TV },
0410
0411 { USB_DEVICE(VENDOR_TWISTEDMELON, 0x8008) },
0412
0413 { USB_DEVICE(VENDOR_TWISTEDMELON, 0x8016) },
0414
0415 { USB_DEVICE(VENDOR_TWISTEDMELON, 0x8042) },
0416
0417 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb130),
0418 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0419 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb131),
0420 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0421 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb138),
0422 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0423 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb139),
0424 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0425
0426 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb151),
0427 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0428
0429 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb123),
0430 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0431
0432 { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb150),
0433 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0434 { USB_DEVICE(VENDOR_PCTV, 0x0259),
0435 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0436 { USB_DEVICE(VENDOR_PCTV, 0x025e),
0437 .driver_info = HAUPPAUGE_CX_HYBRID_TV },
0438
0439 { USB_DEVICE(VENDOR_ADAPTEC, 0x0094) },
0440
0441 { USB_DEVICE(0x1b80, 0xd3b2),
0442 .driver_info = EVROMEDIA_FULL_HYBRID_FULLHD },
0443
0444 { USB_DEVICE(0x15f4, 0x0135),
0445 .driver_info = ASTROMETA_T2HYBRID },
0446
0447
0448 { }
0449 };
0450
0451
0452 struct mceusb_dev {
0453
0454 struct rc_dev *rc;
0455
0456
0457 bool carrier_report_enabled;
0458 bool wideband_rx_enabled;
0459
0460
0461 struct device *dev;
0462
0463
0464 struct usb_device *usbdev;
0465 struct usb_interface *usbintf;
0466 struct urb *urb_in;
0467 unsigned int pipe_in;
0468 struct usb_endpoint_descriptor *usb_ep_out;
0469 unsigned int pipe_out;
0470
0471
0472 unsigned char *buf_in;
0473 unsigned int len_in;
0474 dma_addr_t dma_in;
0475
0476 enum {
0477 CMD_HEADER = 0,
0478 SUBCMD,
0479 CMD_DATA,
0480 PARSE_IRDATA,
0481 } parser_state;
0482
0483 u8 cmd, rem;
0484
0485 struct {
0486 u32 connected:1;
0487 u32 tx_mask_normal:1;
0488 u32 microsoft_gen1:1;
0489 u32 no_tx:1;
0490 u32 rx2;
0491 } flags;
0492
0493
0494 u32 carrier;
0495 unsigned char tx_mask;
0496
0497 char name[128];
0498 char phys[64];
0499 enum mceusb_model_type model;
0500
0501 bool need_reset;
0502 u8 emver;
0503 u8 num_txports;
0504 u8 num_rxports;
0505 u8 txports_cabled;
0506 u8 rxports_active;
0507 bool learning_active;
0508
0509
0510 u32 pulse_tunit;
0511 u32 pulse_count;
0512
0513
0514
0515
0516
0517
0518 struct work_struct kevent;
0519 unsigned long kevent_flags;
0520 # define EVENT_TX_HALT 0
0521 # define EVENT_RX_HALT 1
0522 # define EVENT_RST_PEND 31
0523 };
0524
0525
0526 static char DEVICE_RESUME[] = {MCE_CMD_NULL, MCE_CMD_PORT_SYS,
0527 MCE_CMD_RESUME};
0528 static char GET_REVISION[] = {MCE_CMD_PORT_SYS, MCE_CMD_G_REVISION};
0529 static char GET_EMVER[] = {MCE_CMD_PORT_SYS, MCE_CMD_GETEMVER};
0530 static char GET_WAKEVERSION[] = {MCE_CMD_PORT_SYS, MCE_CMD_GETWAKEVERSION};
0531 static char FLASH_LED[] = {MCE_CMD_PORT_SYS, MCE_CMD_FLASHLED};
0532 static char GET_UNKNOWN2[] = {MCE_CMD_PORT_IR, MCE_CMD_UNKNOWN2};
0533 static char GET_CARRIER_FREQ[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRCFS};
0534 static char GET_RX_TIMEOUT[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTIMEOUT};
0535 static char GET_NUM_PORTS[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRNUMPORTS};
0536 static char GET_TX_BITMASK[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTXPORTS};
0537 static char GET_RX_SENSOR[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRRXPORTEN};
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549 static int mceusb_cmd_datasize(u8 cmd, u8 subcmd)
0550 {
0551 int datasize = 0;
0552
0553 switch (cmd) {
0554 case MCE_CMD_NULL:
0555 if (subcmd == MCE_CMD_PORT_SYS)
0556 datasize = 1;
0557 break;
0558 case MCE_CMD_PORT_SYS:
0559 switch (subcmd) {
0560 case MCE_RSP_GETPORTSTATUS:
0561 datasize = 5;
0562 break;
0563 case MCE_RSP_EQWAKEVERSION:
0564 datasize = 4;
0565 break;
0566 case MCE_CMD_G_REVISION:
0567 datasize = 4;
0568 break;
0569 case MCE_RSP_EQWAKESUPPORT:
0570 case MCE_RSP_GETWAKESOURCE:
0571 case MCE_RSP_EQDEVDETAILS:
0572 case MCE_RSP_EQEMVER:
0573 datasize = 1;
0574 break;
0575 }
0576 break;
0577 case MCE_CMD_PORT_IR:
0578 switch (subcmd) {
0579 case MCE_CMD_UNKNOWN:
0580 case MCE_RSP_EQIRCFS:
0581 case MCE_RSP_EQIRTIMEOUT:
0582 case MCE_RSP_EQIRRXCFCNT:
0583 case MCE_RSP_EQIRNUMPORTS:
0584 datasize = 2;
0585 break;
0586 case MCE_CMD_SIG_END:
0587 case MCE_RSP_EQIRTXPORTS:
0588 case MCE_RSP_EQIRRXPORTEN:
0589 datasize = 1;
0590 break;
0591 }
0592 }
0593 return datasize;
0594 }
0595
0596 static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len,
0597 int offset, int len, bool out)
0598 {
0599 #if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
0600 char *inout;
0601 u8 cmd, subcmd, *data;
0602 struct device *dev = ir->dev;
0603 u32 carrier, period;
0604
0605 if (offset < 0 || offset >= buf_len)
0606 return;
0607
0608 dev_dbg(dev, "%cx data[%d]: %*ph (len=%d sz=%d)",
0609 (out ? 't' : 'r'), offset,
0610 min(len, buf_len - offset), buf + offset, len, buf_len);
0611
0612 inout = out ? "Request" : "Got";
0613
0614 cmd = buf[offset];
0615 subcmd = (offset + 1 < buf_len) ? buf[offset + 1] : 0;
0616 data = &buf[offset] + 2;
0617
0618
0619 if (ir->flags.microsoft_gen1 && !out && !offset) {
0620 dev_dbg(dev, "MCE gen 1 header");
0621 return;
0622 }
0623
0624
0625 if (cmd != MCE_CMD_PORT_IR &&
0626 (cmd & MCE_PORT_MASK) == MCE_COMMAND_IRDATA) {
0627 if (cmd == MCE_IRDATA_TRAILER)
0628 dev_dbg(dev, "End of raw IR data");
0629 else
0630 dev_dbg(dev, "Raw IR data, %d pulse/space samples",
0631 cmd & MCE_PACKET_LENGTH_MASK);
0632 return;
0633 }
0634
0635
0636 if (offset + len > buf_len)
0637 return;
0638
0639
0640 switch (cmd) {
0641 case MCE_CMD_NULL:
0642 if (subcmd == MCE_CMD_NULL)
0643 break;
0644 if ((subcmd == MCE_CMD_PORT_SYS) &&
0645 (data[0] == MCE_CMD_RESUME))
0646 dev_dbg(dev, "Device resume requested");
0647 else
0648 dev_dbg(dev, "Unknown command 0x%02x 0x%02x",
0649 cmd, subcmd);
0650 break;
0651 case MCE_CMD_PORT_SYS:
0652 switch (subcmd) {
0653 case MCE_RSP_EQEMVER:
0654 if (!out)
0655 dev_dbg(dev, "Emulator interface version %x",
0656 data[0]);
0657 break;
0658 case MCE_CMD_G_REVISION:
0659 if (len == 2)
0660 dev_dbg(dev, "Get hw/sw rev?");
0661 else
0662 dev_dbg(dev, "hw/sw rev %*ph",
0663 4, &buf[offset + 2]);
0664 break;
0665 case MCE_CMD_RESUME:
0666 dev_dbg(dev, "Device resume requested");
0667 break;
0668 case MCE_RSP_CMD_ILLEGAL:
0669 dev_dbg(dev, "Illegal PORT_SYS command");
0670 break;
0671 case MCE_RSP_EQWAKEVERSION:
0672 if (!out)
0673 dev_dbg(dev, "Wake version, proto: 0x%02x, payload: 0x%02x, address: 0x%02x, version: 0x%02x",
0674 data[0], data[1], data[2], data[3]);
0675 break;
0676 case MCE_RSP_GETPORTSTATUS:
0677 if (!out)
0678
0679 dev_dbg(dev, "TX port %d: blaster is%s connected",
0680 data[0] + 1, data[3] ? " not" : "");
0681 break;
0682 case MCE_CMD_FLASHLED:
0683 dev_dbg(dev, "Attempting to flash LED");
0684 break;
0685 default:
0686 dev_dbg(dev, "Unknown command 0x%02x 0x%02x",
0687 cmd, subcmd);
0688 break;
0689 }
0690 break;
0691 case MCE_CMD_PORT_IR:
0692 switch (subcmd) {
0693 case MCE_CMD_SIG_END:
0694 dev_dbg(dev, "End of signal");
0695 break;
0696 case MCE_CMD_PING:
0697 dev_dbg(dev, "Ping");
0698 break;
0699 case MCE_CMD_UNKNOWN:
0700 dev_dbg(dev, "Resp to 9f 05 of 0x%02x 0x%02x",
0701 data[0], data[1]);
0702 break;
0703 case MCE_RSP_EQIRCFS:
0704 if (!data[0] && !data[1]) {
0705 dev_dbg(dev, "%s: no carrier", inout);
0706 break;
0707 }
0708
0709 if (data[0] > 8)
0710 break;
0711 period = DIV_ROUND_CLOSEST((1U << data[0] * 2) *
0712 (data[1] + 1), 10);
0713 if (!period)
0714 break;
0715 carrier = USEC_PER_SEC / period;
0716 dev_dbg(dev, "%s carrier of %u Hz (period %uus)",
0717 inout, carrier, period);
0718 break;
0719 case MCE_CMD_GETIRCFS:
0720 dev_dbg(dev, "Get carrier mode and freq");
0721 break;
0722 case MCE_RSP_EQIRTXPORTS:
0723 dev_dbg(dev, "%s transmit blaster mask of 0x%02x",
0724 inout, data[0]);
0725 break;
0726 case MCE_RSP_EQIRTIMEOUT:
0727
0728 period = ((data[0] << 8) | data[1]) *
0729 MCE_TIME_UNIT / 1000;
0730 dev_dbg(dev, "%s receive timeout of %d ms",
0731 inout, period);
0732 break;
0733 case MCE_CMD_GETIRTIMEOUT:
0734 dev_dbg(dev, "Get receive timeout");
0735 break;
0736 case MCE_CMD_GETIRTXPORTS:
0737 dev_dbg(dev, "Get transmit blaster mask");
0738 break;
0739 case MCE_RSP_EQIRRXPORTEN:
0740 dev_dbg(dev, "%s %s-range receive sensor in use",
0741 inout, data[0] == 0x02 ? "short" : "long");
0742 break;
0743 case MCE_CMD_GETIRRXPORTEN:
0744
0745 if (out)
0746 dev_dbg(dev, "Get receive sensor");
0747 else
0748 dev_dbg(dev, "RX carrier cycle count: %d",
0749 ((data[0] << 8) | data[1]));
0750 break;
0751 case MCE_RSP_EQIRNUMPORTS:
0752 if (out)
0753 break;
0754 dev_dbg(dev, "Num TX ports: %x, num RX ports: %x",
0755 data[0], data[1]);
0756 break;
0757 case MCE_RSP_CMD_ILLEGAL:
0758 dev_dbg(dev, "Illegal PORT_IR command");
0759 break;
0760 case MCE_RSP_TX_TIMEOUT:
0761 dev_dbg(dev, "IR TX timeout (TX buffer underrun)");
0762 break;
0763 default:
0764 dev_dbg(dev, "Unknown command 0x%02x 0x%02x",
0765 cmd, subcmd);
0766 break;
0767 }
0768 break;
0769 default:
0770 break;
0771 }
0772 #endif
0773 }
0774
0775
0776
0777
0778
0779
0780
0781 static void mceusb_defer_kevent(struct mceusb_dev *ir, int kevent)
0782 {
0783 set_bit(kevent, &ir->kevent_flags);
0784
0785 if (test_bit(EVENT_RST_PEND, &ir->kevent_flags)) {
0786 dev_dbg(ir->dev, "kevent %d dropped pending USB Reset Device",
0787 kevent);
0788 return;
0789 }
0790
0791 if (!schedule_work(&ir->kevent))
0792 dev_dbg(ir->dev, "kevent %d already scheduled", kevent);
0793 else
0794 dev_dbg(ir->dev, "kevent %d scheduled", kevent);
0795 }
0796
0797 static void mce_write_callback(struct urb *urb)
0798 {
0799 if (!urb)
0800 return;
0801
0802 complete(urb->context);
0803 }
0804
0805
0806
0807
0808
0809
0810
0811 static int mce_write(struct mceusb_dev *ir, u8 *data, int size)
0812 {
0813 int ret;
0814 struct urb *urb;
0815 struct device *dev = ir->dev;
0816 unsigned char *buf_out;
0817 struct completion tx_done;
0818 unsigned long expire;
0819 unsigned long ret_wait;
0820
0821 mceusb_dev_printdata(ir, data, size, 0, size, true);
0822
0823 urb = usb_alloc_urb(0, GFP_KERNEL);
0824 if (unlikely(!urb)) {
0825 dev_err(dev, "Error: mce write couldn't allocate urb");
0826 return -ENOMEM;
0827 }
0828
0829 buf_out = kmalloc(size, GFP_KERNEL);
0830 if (!buf_out) {
0831 usb_free_urb(urb);
0832 return -ENOMEM;
0833 }
0834
0835 init_completion(&tx_done);
0836
0837
0838 if (usb_endpoint_xfer_int(ir->usb_ep_out))
0839 usb_fill_int_urb(urb, ir->usbdev, ir->pipe_out,
0840 buf_out, size, mce_write_callback, &tx_done,
0841 ir->usb_ep_out->bInterval);
0842 else
0843 usb_fill_bulk_urb(urb, ir->usbdev, ir->pipe_out,
0844 buf_out, size, mce_write_callback, &tx_done);
0845 memcpy(buf_out, data, size);
0846
0847 ret = usb_submit_urb(urb, GFP_KERNEL);
0848 if (ret) {
0849 dev_err(dev, "Error: mce write submit urb error = %d", ret);
0850 kfree(buf_out);
0851 usb_free_urb(urb);
0852 return ret;
0853 }
0854
0855 expire = msecs_to_jiffies(USB_TX_TIMEOUT);
0856 ret_wait = wait_for_completion_timeout(&tx_done, expire);
0857 if (!ret_wait) {
0858 dev_err(dev, "Error: mce write timed out (expire = %lu (%dms))",
0859 expire, USB_TX_TIMEOUT);
0860 usb_kill_urb(urb);
0861 ret = (urb->status == -ENOENT ? -ETIMEDOUT : urb->status);
0862 } else {
0863 ret = urb->status;
0864 }
0865 if (ret >= 0)
0866 ret = urb->actual_length;
0867
0868 switch (urb->status) {
0869
0870 case 0:
0871 break;
0872
0873 case -ECONNRESET:
0874 case -ENOENT:
0875 case -EILSEQ:
0876 case -ESHUTDOWN:
0877 break;
0878
0879 case -EPIPE:
0880 dev_err(ir->dev, "Error: mce write urb status = %d (TX HALT)",
0881 urb->status);
0882 mceusb_defer_kevent(ir, EVENT_TX_HALT);
0883 break;
0884
0885 default:
0886 dev_err(ir->dev, "Error: mce write urb status = %d",
0887 urb->status);
0888 break;
0889 }
0890
0891 dev_dbg(dev, "tx done status = %d (wait = %lu, expire = %lu (%dms), urb->actual_length = %d, urb->status = %d)",
0892 ret, ret_wait, expire, USB_TX_TIMEOUT,
0893 urb->actual_length, urb->status);
0894
0895 kfree(buf_out);
0896 usb_free_urb(urb);
0897
0898 return ret;
0899 }
0900
0901 static void mce_command_out(struct mceusb_dev *ir, u8 *data, int size)
0902 {
0903 int rsize = sizeof(DEVICE_RESUME);
0904
0905 if (ir->need_reset) {
0906 ir->need_reset = false;
0907 mce_write(ir, DEVICE_RESUME, rsize);
0908 msleep(10);
0909 }
0910
0911 mce_write(ir, data, size);
0912 msleep(10);
0913 }
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932 static int mceusb_tx_ir(struct rc_dev *dev, unsigned *txbuf, unsigned count)
0933 {
0934 struct mceusb_dev *ir = dev->priv;
0935 u8 cmdbuf[3] = { MCE_CMD_PORT_IR, MCE_CMD_SETIRTXPORTS, 0x00 };
0936 u8 irbuf[MCE_IRBUF_SIZE];
0937 int ircount = 0;
0938 unsigned int irsample;
0939 int i, length, ret;
0940
0941
0942 cmdbuf[2] = ir->tx_mask;
0943 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
0944
0945
0946 for (i = 0; i < count; i++) {
0947 irsample = txbuf[i] / MCE_TIME_UNIT;
0948
0949
0950 while (irsample > 0) {
0951
0952 if (ircount % MCE_PACKET_SIZE == 0) {
0953
0954 if (ircount >= MCE_IRBUF_SIZE - 1) {
0955
0956 ret = mce_write(ir, irbuf, ircount);
0957 if (ret < 0)
0958 return ret;
0959 ircount = 0;
0960 }
0961 irbuf[ircount++] = MCE_IRDATA_HEADER;
0962 }
0963
0964
0965 if (irsample <= MCE_MAX_PULSE_LENGTH) {
0966 irbuf[ircount] = irsample;
0967 irsample = 0;
0968 } else {
0969 irbuf[ircount] = MCE_MAX_PULSE_LENGTH;
0970 irsample -= MCE_MAX_PULSE_LENGTH;
0971 }
0972
0973
0974
0975
0976 irbuf[ircount] |= (i & 1 ? 0 : MCE_PULSE_BIT);
0977 ircount++;
0978
0979
0980 if (ircount >= MCE_IRBUF_SIZE) {
0981
0982 length = ircount % MCE_PACKET_SIZE;
0983 if (length > 0)
0984 irbuf[ircount - length] -=
0985 MCE_PACKET_SIZE - length;
0986
0987 ret = mce_write(ir, irbuf, ircount);
0988 if (ret < 0)
0989 return ret;
0990 ircount = 0;
0991 }
0992 }
0993 }
0994
0995
0996 length = ircount % MCE_PACKET_SIZE;
0997 if (length > 0)
0998 irbuf[ircount - length] -= MCE_PACKET_SIZE - length;
0999
1000
1001 irbuf[ircount++] = MCE_IRDATA_TRAILER;
1002
1003
1004 ret = mce_write(ir, irbuf, ircount);
1005 if (ret < 0)
1006 return ret;
1007
1008 return count;
1009 }
1010
1011
1012 static int mceusb_set_tx_mask(struct rc_dev *dev, u32 mask)
1013 {
1014 struct mceusb_dev *ir = dev->priv;
1015
1016
1017 int emitters = ir->num_txports ? ir->num_txports : 2;
1018
1019 if (mask >= (1 << emitters))
1020 return emitters;
1021
1022 if (ir->flags.tx_mask_normal)
1023 ir->tx_mask = mask;
1024 else
1025 ir->tx_mask = (mask != MCE_DEFAULT_TX_MASK ?
1026 mask ^ MCE_DEFAULT_TX_MASK : mask) << 1;
1027
1028 return 0;
1029 }
1030
1031
1032 static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
1033 {
1034 struct mceusb_dev *ir = dev->priv;
1035 int clk = 10000000;
1036 int prescaler = 0, divisor = 0;
1037 unsigned char cmdbuf[4] = { MCE_CMD_PORT_IR,
1038 MCE_CMD_SETIRCFS, 0x00, 0x00 };
1039
1040
1041 if (ir->carrier != carrier) {
1042
1043 if (carrier == 0) {
1044 ir->carrier = carrier;
1045 cmdbuf[2] = MCE_CMD_SIG_END;
1046 cmdbuf[3] = MCE_IRDATA_TRAILER;
1047 dev_dbg(ir->dev, "disabling carrier modulation");
1048 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1049 return 0;
1050 }
1051
1052 for (prescaler = 0; prescaler < 4; ++prescaler) {
1053 divisor = (clk >> (2 * prescaler)) / carrier;
1054 if (divisor <= 0xff) {
1055 ir->carrier = carrier;
1056 cmdbuf[2] = prescaler;
1057 cmdbuf[3] = divisor;
1058 dev_dbg(ir->dev, "requesting %u HZ carrier",
1059 carrier);
1060
1061
1062 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1063 return 0;
1064 }
1065 }
1066
1067 return -EINVAL;
1068
1069 }
1070
1071 return 0;
1072 }
1073
1074 static int mceusb_set_timeout(struct rc_dev *dev, unsigned int timeout)
1075 {
1076 u8 cmdbuf[4] = { MCE_CMD_PORT_IR, MCE_CMD_SETIRTIMEOUT, 0, 0 };
1077 struct mceusb_dev *ir = dev->priv;
1078 unsigned int units;
1079
1080 units = DIV_ROUND_CLOSEST(timeout, MCE_TIME_UNIT);
1081
1082 cmdbuf[2] = units >> 8;
1083 cmdbuf[3] = units;
1084
1085 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1086
1087
1088 mce_command_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
1089
1090 return 0;
1091 }
1092
1093
1094
1095
1096
1097
1098 static int mceusb_set_rx_wideband(struct rc_dev *dev, int enable)
1099 {
1100 struct mceusb_dev *ir = dev->priv;
1101 unsigned char cmdbuf[3] = { MCE_CMD_PORT_IR,
1102 MCE_CMD_SETIRRXPORTEN, 0x00 };
1103
1104 dev_dbg(ir->dev, "select %s-range receive sensor",
1105 enable ? "short" : "long");
1106 if (enable) {
1107 ir->wideband_rx_enabled = true;
1108 cmdbuf[2] = 2;
1109 } else {
1110 ir->wideband_rx_enabled = false;
1111 cmdbuf[2] = 1;
1112 }
1113 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1114
1115
1116 return 0;
1117 }
1118
1119
1120
1121
1122
1123
1124 static int mceusb_set_rx_carrier_report(struct rc_dev *dev, int enable)
1125 {
1126 struct mceusb_dev *ir = dev->priv;
1127 unsigned char cmdbuf[3] = { MCE_CMD_PORT_IR,
1128 MCE_CMD_SETIRRXPORTEN, 0x00 };
1129
1130 dev_dbg(ir->dev, "%s short-range receiver carrier reporting",
1131 enable ? "enable" : "disable");
1132 if (enable) {
1133 ir->carrier_report_enabled = true;
1134 if (!ir->learning_active) {
1135 cmdbuf[2] = 2;
1136 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1137 }
1138 } else {
1139 ir->carrier_report_enabled = false;
1140
1141
1142
1143
1144
1145 if (ir->learning_active && !ir->wideband_rx_enabled) {
1146 cmdbuf[2] = 1;
1147 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1148 }
1149 }
1150
1151 return 0;
1152 }
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165 static void mceusb_handle_command(struct mceusb_dev *ir, u8 *buf_in)
1166 {
1167 u8 cmd = buf_in[0];
1168 u8 subcmd = buf_in[1];
1169 u8 *hi = &buf_in[2];
1170 u8 *lo = &buf_in[3];
1171 struct ir_raw_event rawir = {};
1172 u32 carrier_cycles;
1173 u32 cycles_fix;
1174
1175 if (cmd == MCE_CMD_PORT_SYS) {
1176 switch (subcmd) {
1177
1178 case MCE_RSP_GETPORTSTATUS:
1179 if (buf_in[5] == 0 && *hi < 8)
1180 ir->txports_cabled |= 1 << *hi;
1181 break;
1182
1183
1184 case MCE_RSP_EQEMVER:
1185 ir->emver = *hi;
1186 break;
1187
1188
1189 case MCE_RSP_CMD_ILLEGAL:
1190 ir->need_reset = true;
1191 break;
1192
1193 default:
1194 break;
1195 }
1196
1197 return;
1198 }
1199
1200 if (cmd != MCE_CMD_PORT_IR)
1201 return;
1202
1203 switch (subcmd) {
1204
1205 case MCE_RSP_EQIRTIMEOUT:
1206 ir->rc->timeout = (*hi << 8 | *lo) * MCE_TIME_UNIT;
1207 break;
1208 case MCE_RSP_EQIRNUMPORTS:
1209 ir->num_txports = *hi;
1210 ir->num_rxports = *lo;
1211 break;
1212 case MCE_RSP_EQIRRXCFCNT:
1213
1214
1215
1216
1217
1218
1219
1220
1221 if (ir->carrier_report_enabled && ir->learning_active &&
1222 ir->pulse_tunit > 0) {
1223 carrier_cycles = (*hi << 8 | *lo);
1224
1225
1226
1227
1228 cycles_fix = ir->flags.rx2 == 2 ? ir->pulse_count : 0;
1229 rawir.carrier_report = 1;
1230 rawir.carrier = (1000000u / MCE_TIME_UNIT) *
1231 (carrier_cycles + cycles_fix) /
1232 ir->pulse_tunit;
1233 dev_dbg(ir->dev, "RX carrier frequency %u Hz (pulse count = %u, cycles = %u, duration = %u, rx2 = %u)",
1234 rawir.carrier, ir->pulse_count, carrier_cycles,
1235 ir->pulse_tunit, ir->flags.rx2);
1236 ir_raw_event_store(ir->rc, &rawir);
1237 }
1238 break;
1239
1240
1241 case MCE_RSP_EQIRTXPORTS:
1242 ir->tx_mask = *hi;
1243 break;
1244 case MCE_RSP_EQIRRXPORTEN:
1245 ir->learning_active = ((*hi & 0x02) == 0x02);
1246 if (ir->rxports_active != *hi) {
1247 dev_info(ir->dev, "%s-range (0x%x) receiver active",
1248 ir->learning_active ? "short" : "long", *hi);
1249 ir->rxports_active = *hi;
1250 }
1251 break;
1252
1253
1254 case MCE_RSP_CMD_ILLEGAL:
1255 case MCE_RSP_TX_TIMEOUT:
1256 ir->need_reset = true;
1257 break;
1258
1259 default:
1260 break;
1261 }
1262 }
1263
1264 static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
1265 {
1266 struct ir_raw_event rawir = {};
1267 bool event = false;
1268 int i = 0;
1269
1270
1271 if (ir->flags.microsoft_gen1)
1272 i = 2;
1273
1274
1275 if (buf_len <= i)
1276 return;
1277
1278 for (; i < buf_len; i++) {
1279 switch (ir->parser_state) {
1280 case SUBCMD:
1281 ir->rem = mceusb_cmd_datasize(ir->cmd, ir->buf_in[i]);
1282 mceusb_dev_printdata(ir, ir->buf_in, buf_len, i - 1,
1283 ir->rem + 2, false);
1284 if (i + ir->rem < buf_len)
1285 mceusb_handle_command(ir, &ir->buf_in[i - 1]);
1286 ir->parser_state = CMD_DATA;
1287 break;
1288 case PARSE_IRDATA:
1289 ir->rem--;
1290 rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0);
1291 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK);
1292 if (unlikely(!rawir.duration)) {
1293 dev_dbg(ir->dev, "nonsensical irdata %02x with duration 0",
1294 ir->buf_in[i]);
1295 break;
1296 }
1297 if (rawir.pulse) {
1298 ir->pulse_tunit += rawir.duration;
1299 ir->pulse_count++;
1300 }
1301 rawir.duration *= MCE_TIME_UNIT;
1302
1303 dev_dbg(ir->dev, "Storing %s %u us (%02x)",
1304 rawir.pulse ? "pulse" : "space",
1305 rawir.duration, ir->buf_in[i]);
1306
1307 if (ir_raw_event_store_with_filter(ir->rc, &rawir))
1308 event = true;
1309 break;
1310 case CMD_DATA:
1311 ir->rem--;
1312 break;
1313 case CMD_HEADER:
1314 ir->cmd = ir->buf_in[i];
1315 if ((ir->cmd == MCE_CMD_PORT_IR) ||
1316 ((ir->cmd & MCE_PORT_MASK) !=
1317 MCE_COMMAND_IRDATA)) {
1318
1319
1320
1321
1322 ir->parser_state = SUBCMD;
1323 continue;
1324 }
1325
1326
1327
1328
1329
1330 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK);
1331 mceusb_dev_printdata(ir, ir->buf_in, buf_len,
1332 i, ir->rem + 1, false);
1333 if (ir->rem) {
1334 ir->parser_state = PARSE_IRDATA;
1335 } else {
1336 struct ir_raw_event ev = {
1337 .timeout = 1,
1338 .duration = ir->rc->timeout
1339 };
1340
1341 if (ir_raw_event_store_with_filter(ir->rc,
1342 &ev))
1343 event = true;
1344 ir->pulse_tunit = 0;
1345 ir->pulse_count = 0;
1346 }
1347 break;
1348 }
1349
1350 if (ir->parser_state != CMD_HEADER && !ir->rem)
1351 ir->parser_state = CMD_HEADER;
1352 }
1353
1354
1355
1356
1357
1358 if (ir->parser_state != PARSE_IRDATA || !ir->rem)
1359 ir->parser_state = CMD_HEADER;
1360
1361 if (event) {
1362 dev_dbg(ir->dev, "processed IR data");
1363 ir_raw_event_handle(ir->rc);
1364 }
1365 }
1366
1367 static void mceusb_dev_recv(struct urb *urb)
1368 {
1369 struct mceusb_dev *ir;
1370
1371 if (!urb)
1372 return;
1373
1374 ir = urb->context;
1375 if (!ir) {
1376 usb_unlink_urb(urb);
1377 return;
1378 }
1379
1380 switch (urb->status) {
1381
1382 case 0:
1383 mceusb_process_ir_data(ir, urb->actual_length);
1384 break;
1385
1386 case -ECONNRESET:
1387 case -ENOENT:
1388 case -EILSEQ:
1389 case -EPROTO:
1390 case -ESHUTDOWN:
1391 usb_unlink_urb(urb);
1392 return;
1393
1394 case -EPIPE:
1395 dev_err(ir->dev, "Error: urb status = %d (RX HALT)",
1396 urb->status);
1397 mceusb_defer_kevent(ir, EVENT_RX_HALT);
1398 return;
1399
1400 default:
1401 dev_err(ir->dev, "Error: urb status = %d", urb->status);
1402 break;
1403 }
1404
1405 usb_submit_urb(urb, GFP_ATOMIC);
1406 }
1407
1408 static void mceusb_get_emulator_version(struct mceusb_dev *ir)
1409 {
1410
1411 ir->emver = 1;
1412 mce_command_out(ir, GET_EMVER, sizeof(GET_EMVER));
1413 }
1414
1415 static void mceusb_gen1_init(struct mceusb_dev *ir)
1416 {
1417 int ret;
1418 struct device *dev = ir->dev;
1419 char data[USB_CTRL_MSG_SZ];
1420
1421
1422
1423
1424
1425 ret = usb_control_msg_recv(ir->usbdev, 0, USB_REQ_SET_ADDRESS,
1426 USB_DIR_IN | USB_TYPE_VENDOR,
1427 0, 0, data, USB_CTRL_MSG_SZ, 3000,
1428 GFP_KERNEL);
1429 dev_dbg(dev, "set address - ret = %d", ret);
1430 dev_dbg(dev, "set address - data[0] = %d, data[1] = %d",
1431 data[0], data[1]);
1432
1433
1434 ret = usb_control_msg_send(ir->usbdev, 0,
1435 USB_REQ_SET_FEATURE, USB_TYPE_VENDOR,
1436 0xc04e, 0x0000, NULL, 0, 3000, GFP_KERNEL);
1437
1438 dev_dbg(dev, "set feature - ret = %d", ret);
1439
1440
1441 ret = usb_control_msg_send(ir->usbdev, 0,
1442 4, USB_TYPE_VENDOR,
1443 0x0808, 0x0000, NULL, 0, 3000, GFP_KERNEL);
1444 dev_dbg(dev, "set char length - retB = %d", ret);
1445
1446
1447 ret = usb_control_msg_send(ir->usbdev, 0,
1448 2, USB_TYPE_VENDOR,
1449 0x0000, 0x0100, NULL, 0, 3000, GFP_KERNEL);
1450 dev_dbg(dev, "set handshake - retC = %d", ret);
1451
1452
1453 mce_command_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME));
1454
1455
1456 mce_command_out(ir, GET_REVISION, sizeof(GET_REVISION));
1457 }
1458
1459 static void mceusb_gen2_init(struct mceusb_dev *ir)
1460 {
1461
1462 mce_command_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME));
1463
1464
1465 mce_command_out(ir, GET_WAKEVERSION, sizeof(GET_WAKEVERSION));
1466
1467
1468 mce_command_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
1469 }
1470
1471 static void mceusb_get_parameters(struct mceusb_dev *ir)
1472 {
1473 int i;
1474 unsigned char cmdbuf[3] = { MCE_CMD_PORT_SYS,
1475 MCE_CMD_GETPORTSTATUS, 0x00 };
1476
1477
1478 ir->num_txports = 2;
1479 ir->num_rxports = 2;
1480
1481
1482 mce_command_out(ir, GET_NUM_PORTS, sizeof(GET_NUM_PORTS));
1483
1484
1485 mce_command_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
1486
1487 if (ir->num_txports && !ir->flags.no_tx)
1488
1489 mce_command_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
1490
1491
1492 mce_command_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
1493
1494
1495 mce_command_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
1496
1497 for (i = 0; i < ir->num_txports; i++) {
1498 cmdbuf[2] = i;
1499 mce_command_out(ir, cmdbuf, sizeof(cmdbuf));
1500 }
1501 }
1502
1503 static void mceusb_flash_led(struct mceusb_dev *ir)
1504 {
1505 if (ir->emver < 2)
1506 return;
1507
1508 mce_command_out(ir, FLASH_LED, sizeof(FLASH_LED));
1509 }
1510
1511
1512
1513
1514
1515
1516
1517
1518 static void mceusb_deferred_kevent(struct work_struct *work)
1519 {
1520 struct mceusb_dev *ir =
1521 container_of(work, struct mceusb_dev, kevent);
1522 int status;
1523
1524 dev_err(ir->dev, "kevent handler called (flags 0x%lx)",
1525 ir->kevent_flags);
1526
1527 if (test_bit(EVENT_RST_PEND, &ir->kevent_flags)) {
1528 dev_err(ir->dev, "kevent handler canceled pending USB Reset Device");
1529 return;
1530 }
1531
1532 if (test_bit(EVENT_RX_HALT, &ir->kevent_flags)) {
1533 usb_unlink_urb(ir->urb_in);
1534 status = usb_clear_halt(ir->usbdev, ir->pipe_in);
1535 dev_err(ir->dev, "rx clear halt status = %d", status);
1536 if (status < 0) {
1537
1538
1539
1540
1541 dev_err(ir->dev,
1542 "stuck RX HALT state requires USB Reset Device to clear");
1543 usb_queue_reset_device(ir->usbintf);
1544 set_bit(EVENT_RST_PEND, &ir->kevent_flags);
1545 clear_bit(EVENT_RX_HALT, &ir->kevent_flags);
1546
1547
1548 clear_bit(EVENT_TX_HALT, &ir->kevent_flags);
1549 return;
1550 }
1551 clear_bit(EVENT_RX_HALT, &ir->kevent_flags);
1552 status = usb_submit_urb(ir->urb_in, GFP_KERNEL);
1553 if (status < 0) {
1554 dev_err(ir->dev, "rx unhalt submit urb error = %d",
1555 status);
1556 }
1557 }
1558
1559 if (test_bit(EVENT_TX_HALT, &ir->kevent_flags)) {
1560 status = usb_clear_halt(ir->usbdev, ir->pipe_out);
1561 dev_err(ir->dev, "tx clear halt status = %d", status);
1562 if (status < 0) {
1563
1564
1565
1566
1567 dev_err(ir->dev,
1568 "stuck TX HALT state requires USB Reset Device to clear");
1569 usb_queue_reset_device(ir->usbintf);
1570 set_bit(EVENT_RST_PEND, &ir->kevent_flags);
1571 clear_bit(EVENT_TX_HALT, &ir->kevent_flags);
1572
1573
1574 clear_bit(EVENT_RX_HALT, &ir->kevent_flags);
1575 return;
1576 }
1577 clear_bit(EVENT_TX_HALT, &ir->kevent_flags);
1578 }
1579 }
1580
1581 static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
1582 {
1583 struct usb_device *udev = ir->usbdev;
1584 struct device *dev = ir->dev;
1585 struct rc_dev *rc;
1586 int ret;
1587
1588 rc = rc_allocate_device(RC_DRIVER_IR_RAW);
1589 if (!rc) {
1590 dev_err(dev, "remote dev allocation failed");
1591 goto out;
1592 }
1593
1594 snprintf(ir->name, sizeof(ir->name), "%s (%04x:%04x)",
1595 mceusb_model[ir->model].name ?
1596 mceusb_model[ir->model].name :
1597 "Media Center Ed. eHome Infrared Remote Transceiver",
1598 le16_to_cpu(ir->usbdev->descriptor.idVendor),
1599 le16_to_cpu(ir->usbdev->descriptor.idProduct));
1600
1601 usb_make_path(ir->usbdev, ir->phys, sizeof(ir->phys));
1602
1603 rc->device_name = ir->name;
1604 rc->input_phys = ir->phys;
1605 usb_to_input_id(ir->usbdev, &rc->input_id);
1606 rc->dev.parent = dev;
1607 rc->priv = ir;
1608 rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
1609 rc->rx_resolution = MCE_TIME_UNIT;
1610 rc->min_timeout = MCE_TIME_UNIT;
1611 rc->timeout = MS_TO_US(100);
1612 if (!mceusb_model[ir->model].broken_irtimeout) {
1613 rc->s_timeout = mceusb_set_timeout;
1614 rc->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
1615 } else {
1616
1617
1618
1619
1620 rc->max_timeout = rc->timeout;
1621 }
1622 if (!ir->flags.no_tx) {
1623 rc->s_tx_mask = mceusb_set_tx_mask;
1624 rc->s_tx_carrier = mceusb_set_tx_carrier;
1625 rc->tx_ir = mceusb_tx_ir;
1626 }
1627 if (ir->flags.rx2 > 0) {
1628 rc->s_wideband_receiver = mceusb_set_rx_wideband;
1629 rc->s_carrier_report = mceusb_set_rx_carrier_report;
1630 }
1631 rc->driver_name = DRIVER_NAME;
1632
1633 switch (le16_to_cpu(udev->descriptor.idVendor)) {
1634 case VENDOR_HAUPPAUGE:
1635 rc->map_name = RC_MAP_HAUPPAUGE;
1636 break;
1637 case VENDOR_PCTV:
1638 rc->map_name = RC_MAP_PINNACLE_PCTV_HD;
1639 break;
1640 default:
1641 rc->map_name = RC_MAP_RC6_MCE;
1642 }
1643 if (mceusb_model[ir->model].rc_map)
1644 rc->map_name = mceusb_model[ir->model].rc_map;
1645
1646 ret = rc_register_device(rc);
1647 if (ret < 0) {
1648 dev_err(dev, "remote dev registration failed");
1649 goto out;
1650 }
1651
1652 return rc;
1653
1654 out:
1655 rc_free_device(rc);
1656 return NULL;
1657 }
1658
1659 static int mceusb_dev_probe(struct usb_interface *intf,
1660 const struct usb_device_id *id)
1661 {
1662 struct usb_device *dev = interface_to_usbdev(intf);
1663 struct usb_host_interface *idesc;
1664 struct usb_endpoint_descriptor *ep = NULL;
1665 struct usb_endpoint_descriptor *ep_in = NULL;
1666 struct usb_endpoint_descriptor *ep_out = NULL;
1667 struct mceusb_dev *ir = NULL;
1668 int pipe, maxp, i, res;
1669 char buf[63], name[128] = "";
1670 enum mceusb_model_type model = id->driver_info;
1671 bool is_gen3;
1672 bool is_microsoft_gen1;
1673 bool tx_mask_normal;
1674 int ir_intfnum;
1675
1676 dev_dbg(&intf->dev, "%s called", __func__);
1677
1678 idesc = intf->cur_altsetting;
1679
1680 is_gen3 = mceusb_model[model].mce_gen3;
1681 is_microsoft_gen1 = mceusb_model[model].mce_gen1;
1682 tx_mask_normal = mceusb_model[model].tx_mask_normal;
1683 ir_intfnum = mceusb_model[model].ir_intfnum;
1684
1685
1686 if (idesc->desc.bInterfaceNumber != ir_intfnum)
1687 return -ENODEV;
1688
1689
1690 for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
1691 ep = &idesc->endpoint[i].desc;
1692
1693 if (ep_in == NULL) {
1694 if (usb_endpoint_is_bulk_in(ep)) {
1695 ep_in = ep;
1696 dev_dbg(&intf->dev, "acceptable bulk inbound endpoint found\n");
1697 } else if (usb_endpoint_is_int_in(ep)) {
1698 ep_in = ep;
1699 ep_in->bInterval = 1;
1700 dev_dbg(&intf->dev, "acceptable interrupt inbound endpoint found\n");
1701 }
1702 }
1703
1704 if (ep_out == NULL) {
1705 if (usb_endpoint_is_bulk_out(ep)) {
1706 ep_out = ep;
1707 dev_dbg(&intf->dev, "acceptable bulk outbound endpoint found\n");
1708 } else if (usb_endpoint_is_int_out(ep)) {
1709 ep_out = ep;
1710 ep_out->bInterval = 1;
1711 dev_dbg(&intf->dev, "acceptable interrupt outbound endpoint found\n");
1712 }
1713 }
1714 }
1715 if (!ep_in || !ep_out) {
1716 dev_dbg(&intf->dev, "required endpoints not found\n");
1717 return -ENODEV;
1718 }
1719
1720 if (usb_endpoint_xfer_int(ep_in))
1721 pipe = usb_rcvintpipe(dev, ep_in->bEndpointAddress);
1722 else
1723 pipe = usb_rcvbulkpipe(dev, ep_in->bEndpointAddress);
1724 maxp = usb_maxpacket(dev, pipe);
1725
1726 ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL);
1727 if (!ir)
1728 goto mem_alloc_fail;
1729
1730 ir->pipe_in = pipe;
1731 ir->buf_in = usb_alloc_coherent(dev, maxp, GFP_KERNEL, &ir->dma_in);
1732 if (!ir->buf_in)
1733 goto buf_in_alloc_fail;
1734
1735 ir->urb_in = usb_alloc_urb(0, GFP_KERNEL);
1736 if (!ir->urb_in)
1737 goto urb_in_alloc_fail;
1738
1739 ir->usbintf = intf;
1740 ir->usbdev = usb_get_dev(dev);
1741 ir->dev = &intf->dev;
1742 ir->len_in = maxp;
1743 ir->flags.microsoft_gen1 = is_microsoft_gen1;
1744 ir->flags.tx_mask_normal = tx_mask_normal;
1745 ir->flags.no_tx = mceusb_model[model].no_tx;
1746 ir->flags.rx2 = mceusb_model[model].rx2;
1747 ir->model = model;
1748
1749
1750 ir->usb_ep_out = ep_out;
1751 if (usb_endpoint_xfer_int(ep_out))
1752 ir->pipe_out = usb_sndintpipe(ir->usbdev,
1753 ep_out->bEndpointAddress);
1754 else
1755 ir->pipe_out = usb_sndbulkpipe(ir->usbdev,
1756 ep_out->bEndpointAddress);
1757
1758 if (dev->descriptor.iManufacturer
1759 && usb_string(dev, dev->descriptor.iManufacturer,
1760 buf, sizeof(buf)) > 0)
1761 strscpy(name, buf, sizeof(name));
1762 if (dev->descriptor.iProduct
1763 && usb_string(dev, dev->descriptor.iProduct,
1764 buf, sizeof(buf)) > 0)
1765 snprintf(name + strlen(name), sizeof(name) - strlen(name),
1766 " %s", buf);
1767
1768
1769
1770
1771
1772 INIT_WORK(&ir->kevent, mceusb_deferred_kevent);
1773
1774 ir->rc = mceusb_init_rc_dev(ir);
1775 if (!ir->rc)
1776 goto rc_dev_fail;
1777
1778
1779 if (usb_endpoint_xfer_int(ep_in))
1780 usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
1781 mceusb_dev_recv, ir, ep_in->bInterval);
1782 else
1783 usb_fill_bulk_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
1784 mceusb_dev_recv, ir);
1785
1786 ir->urb_in->transfer_dma = ir->dma_in;
1787 ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1788
1789
1790 dev_dbg(&intf->dev, "Flushing receive buffers");
1791 res = usb_submit_urb(ir->urb_in, GFP_KERNEL);
1792 if (res)
1793 dev_err(&intf->dev, "failed to flush buffers: %d", res);
1794
1795
1796 mceusb_get_emulator_version(ir);
1797
1798
1799 if (ir->flags.microsoft_gen1)
1800 mceusb_gen1_init(ir);
1801 else if (!is_gen3)
1802 mceusb_gen2_init(ir);
1803
1804 mceusb_get_parameters(ir);
1805
1806 mceusb_flash_led(ir);
1807
1808 if (!ir->flags.no_tx)
1809 mceusb_set_tx_mask(ir->rc, MCE_DEFAULT_TX_MASK);
1810
1811 usb_set_intfdata(intf, ir);
1812
1813
1814 device_set_wakeup_capable(ir->dev, true);
1815 device_set_wakeup_enable(ir->dev, true);
1816
1817 dev_info(&intf->dev, "Registered %s with mce emulator interface version %x",
1818 name, ir->emver);
1819 dev_info(&intf->dev, "%x tx ports (0x%x cabled) and %x rx sensors (0x%x active)",
1820 ir->num_txports, ir->txports_cabled,
1821 ir->num_rxports, ir->rxports_active);
1822
1823 return 0;
1824
1825
1826 rc_dev_fail:
1827 cancel_work_sync(&ir->kevent);
1828 usb_put_dev(ir->usbdev);
1829 usb_kill_urb(ir->urb_in);
1830 usb_free_urb(ir->urb_in);
1831 urb_in_alloc_fail:
1832 usb_free_coherent(dev, maxp, ir->buf_in, ir->dma_in);
1833 buf_in_alloc_fail:
1834 kfree(ir);
1835 mem_alloc_fail:
1836 dev_err(&intf->dev, "%s: device setup failed!", __func__);
1837
1838 return -ENOMEM;
1839 }
1840
1841
1842 static void mceusb_dev_disconnect(struct usb_interface *intf)
1843 {
1844 struct usb_device *dev = interface_to_usbdev(intf);
1845 struct mceusb_dev *ir = usb_get_intfdata(intf);
1846
1847 dev_dbg(&intf->dev, "%s called", __func__);
1848
1849 usb_set_intfdata(intf, NULL);
1850
1851 if (!ir)
1852 return;
1853
1854 ir->usbdev = NULL;
1855 cancel_work_sync(&ir->kevent);
1856 rc_unregister_device(ir->rc);
1857 usb_kill_urb(ir->urb_in);
1858 usb_free_urb(ir->urb_in);
1859 usb_free_coherent(dev, ir->len_in, ir->buf_in, ir->dma_in);
1860 usb_put_dev(dev);
1861
1862 kfree(ir);
1863 }
1864
1865 static int mceusb_dev_suspend(struct usb_interface *intf, pm_message_t message)
1866 {
1867 struct mceusb_dev *ir = usb_get_intfdata(intf);
1868 dev_info(ir->dev, "suspend");
1869 usb_kill_urb(ir->urb_in);
1870 return 0;
1871 }
1872
1873 static int mceusb_dev_resume(struct usb_interface *intf)
1874 {
1875 struct mceusb_dev *ir = usb_get_intfdata(intf);
1876 dev_info(ir->dev, "resume");
1877 if (usb_submit_urb(ir->urb_in, GFP_ATOMIC))
1878 return -EIO;
1879 return 0;
1880 }
1881
1882 static struct usb_driver mceusb_dev_driver = {
1883 .name = DRIVER_NAME,
1884 .probe = mceusb_dev_probe,
1885 .disconnect = mceusb_dev_disconnect,
1886 .suspend = mceusb_dev_suspend,
1887 .resume = mceusb_dev_resume,
1888 .reset_resume = mceusb_dev_resume,
1889 .id_table = mceusb_dev_table
1890 };
1891
1892 module_usb_driver(mceusb_dev_driver);
1893
1894 MODULE_DESCRIPTION(DRIVER_DESC);
1895 MODULE_AUTHOR(DRIVER_AUTHOR);
1896 MODULE_LICENSE("GPL");
1897 MODULE_DEVICE_TABLE(usb, mceusb_dev_table);