linux/drivers/media/rc/mceusb.c
<<
>>
Prefs
   1/*
   2 * Driver for USB Windows Media Center Ed. eHome Infrared Transceivers
   3 *
   4 * Copyright (c) 2010-2011, Jarod Wilson <jarod@redhat.com>
   5 *
   6 * Based on the original lirc_mceusb and lirc_mceusb2 drivers, by Dan
   7 * Conti, Martin Blatter and Daniel Melander, the latter of which was
   8 * in turn also based on the lirc_atiusb driver by Paul Miller. The
   9 * two mce drivers were merged into one by Jarod Wilson, with transmit
  10 * support for the 1st-gen device added primarily by Patrick Calhoun,
  11 * with a bit of tweaks by Jarod. Debugging improvements and proper
  12 * support for what appears to be 3rd-gen hardware added by Jarod.
  13 * Initial port from lirc driver to ir-core drivery by Jarod, based
  14 * partially on a port to an earlier proposed IR infrastructure by
  15 * Jon Smirl, which included enhancements and simplifications to the
  16 * incoming IR buffer parsing routines.
  17 *
  18 * Updated in July of 2011 with the aid of Microsoft's official
  19 * remote/transceiver requirements and specification document, found at
  20 * download.microsoft.com, title
  21 * Windows-Media-Center-RC-IR-Collection-Green-Button-Specification-03-08-2011-V2.pdf
  22 *
  23 *
  24 * This program is free software; you can redistribute it and/or modify
  25 * it under the terms of the GNU General Public License as published by
  26 * the Free Software Foundation; either version 2 of the License, or
  27 * (at your option) any later version.
  28 *
  29 * This program is distributed in the hope that it will be useful,
  30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  32 * GNU General Public License for more details.
  33 *
  34 * You should have received a copy of the GNU General Public License
  35 * along with this program; if not, write to the Free Software
  36 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  37 *
  38 */
  39
  40#include <linux/device.h>
  41#include <linux/module.h>
  42#include <linux/slab.h>
  43#include <linux/usb.h>
  44#include <linux/usb/input.h>
  45#include <linux/pm_wakeup.h>
  46#include <media/rc-core.h>
  47
  48#define DRIVER_VERSION  "1.92"
  49#define DRIVER_AUTHOR   "Jarod Wilson <jarod@redhat.com>"
  50#define DRIVER_DESC     "Windows Media Center Ed. eHome Infrared Transceiver " \
  51                        "device driver"
  52#define DRIVER_NAME     "mceusb"
  53
  54#define USB_BUFLEN              32 /* USB reception buffer length */
  55#define USB_CTRL_MSG_SZ         2  /* Size of usb ctrl msg on gen1 hw */
  56#define MCE_G1_INIT_MSGS        40 /* Init messages on gen1 hw to throw out */
  57
  58/* MCE constants */
  59#define MCE_CMDBUF_SIZE         384  /* MCE Command buffer length */
  60#define MCE_TIME_UNIT           50   /* Approx 50us resolution */
  61#define MCE_CODE_LENGTH         5    /* Normal length of packet (with header) */
  62#define MCE_PACKET_SIZE         4    /* Normal length of packet (without header) */
  63#define MCE_IRDATA_HEADER       0x84 /* Actual header format is 0x80 + num_bytes */
  64#define MCE_IRDATA_TRAILER      0x80 /* End of IR data */
  65#define MCE_MAX_CHANNELS        2    /* Two transmitters, hardware dependent? */
  66#define MCE_DEFAULT_TX_MASK     0x03 /* Vals: TX1=0x01, TX2=0x02, ALL=0x03 */
  67#define MCE_PULSE_BIT           0x80 /* Pulse bit, MSB set == PULSE else SPACE */
  68#define MCE_PULSE_MASK          0x7f /* Pulse mask */
  69#define MCE_MAX_PULSE_LENGTH    0x7f /* Longest transmittable pulse symbol */
  70
  71/*
  72 * The interface between the host and the IR hardware is command-response
  73 * based. All commands and responses have a consistent format, where a lead
  74 * byte always identifies the type of data following it. The lead byte has
  75 * a port value in the 3 highest bits and a length value in the 5 lowest
  76 * bits.
  77 *
  78 * The length field is overloaded, with a value of 11111 indicating that the
  79 * following byte is a command or response code, and the length of the entire
  80 * message is determined by the code. If the length field is not 11111, then
  81 * it specifies the number of bytes of port data that follow.
  82 */
  83#define MCE_CMD                 0x1f
  84#define MCE_PORT_IR             0x4     /* (0x4 << 5) | MCE_CMD = 0x9f */
  85#define MCE_PORT_SYS            0x7     /* (0x7 << 5) | MCE_CMD = 0xff */
  86#define MCE_PORT_SER            0x6     /* 0xc0 thru 0xdf flush & 0x1f bytes */
  87#define MCE_PORT_MASK           0xe0    /* Mask out command bits */
  88
  89/* Command port headers */
  90#define MCE_CMD_PORT_IR         0x9f    /* IR-related cmd/rsp */
  91#define MCE_CMD_PORT_SYS        0xff    /* System (non-IR) device cmd/rsp */
  92
  93/* Commands that set device state  (2-4 bytes in length) */
  94#define MCE_CMD_RESET           0xfe    /* Reset device, 2 bytes */
  95#define MCE_CMD_RESUME          0xaa    /* Resume device after error, 2 bytes */
  96#define MCE_CMD_SETIRCFS        0x06    /* Set tx carrier, 4 bytes */
  97#define MCE_CMD_SETIRTIMEOUT    0x0c    /* Set timeout, 4 bytes */
  98#define MCE_CMD_SETIRTXPORTS    0x08    /* Set tx ports, 3 bytes */
  99#define MCE_CMD_SETIRRXPORTEN   0x14    /* Set rx ports, 3 bytes */
 100#define MCE_CMD_FLASHLED        0x23    /* Flash receiver LED, 2 bytes */
 101
 102/* Commands that query device state (all 2 bytes, unless noted) */
 103#define MCE_CMD_GETIRCFS        0x07    /* Get carrier */
 104#define MCE_CMD_GETIRTIMEOUT    0x0d    /* Get timeout */
 105#define MCE_CMD_GETIRTXPORTS    0x13    /* Get tx ports */
 106#define MCE_CMD_GETIRRXPORTEN   0x15    /* Get rx ports */
 107#define MCE_CMD_GETPORTSTATUS   0x11    /* Get tx port status, 3 bytes */
 108#define MCE_CMD_GETIRNUMPORTS   0x16    /* Get number of ports */
 109#define MCE_CMD_GETWAKESOURCE   0x17    /* Get wake source */
 110#define MCE_CMD_GETEMVER        0x22    /* Get emulator interface version */
 111#define MCE_CMD_GETDEVDETAILS   0x21    /* Get device details (em ver2 only) */
 112#define MCE_CMD_GETWAKESUPPORT  0x20    /* Get wake details (em ver2 only) */
 113#define MCE_CMD_GETWAKEVERSION  0x18    /* Get wake pattern (em ver2 only) */
 114
 115/* Misc commands */
 116#define MCE_CMD_NOP             0xff    /* No operation */
 117
 118/* Responses to commands (non-error cases) */
 119#define MCE_RSP_EQIRCFS         0x06    /* tx carrier, 4 bytes */
 120#define MCE_RSP_EQIRTIMEOUT     0x0c    /* rx timeout, 4 bytes */
 121#define MCE_RSP_GETWAKESOURCE   0x17    /* wake source, 3 bytes */
 122#define MCE_RSP_EQIRTXPORTS     0x08    /* tx port mask, 3 bytes */
 123#define MCE_RSP_EQIRRXPORTEN    0x14    /* rx port mask, 3 bytes */
 124#define MCE_RSP_GETPORTSTATUS   0x11    /* tx port status, 7 bytes */
 125#define MCE_RSP_EQIRRXCFCNT     0x15    /* rx carrier count, 4 bytes */
 126#define MCE_RSP_EQIRNUMPORTS    0x16    /* number of ports, 4 bytes */
 127#define MCE_RSP_EQWAKESUPPORT   0x20    /* wake capabilities, 3 bytes */
 128#define MCE_RSP_EQWAKEVERSION   0x18    /* wake pattern details, 6 bytes */
 129#define MCE_RSP_EQDEVDETAILS    0x21    /* device capabilities, 3 bytes */
 130#define MCE_RSP_EQEMVER         0x22    /* emulator interface ver, 3 bytes */
 131#define MCE_RSP_FLASHLED        0x23    /* success flashing LED, 2 bytes */
 132
 133/* Responses to error cases, must send MCE_CMD_RESUME to clear them */
 134#define MCE_RSP_CMD_ILLEGAL     0xfe    /* illegal command for port, 2 bytes */
 135#define MCE_RSP_TX_TIMEOUT      0x81    /* tx timed out, 2 bytes */
 136
 137/* Misc commands/responses not defined in the MCE remote/transceiver spec */
 138#define MCE_CMD_SIG_END         0x01    /* End of signal */
 139#define MCE_CMD_PING            0x03    /* Ping device */
 140#define MCE_CMD_UNKNOWN         0x04    /* Unknown */
 141#define MCE_CMD_UNKNOWN2        0x05    /* Unknown */
 142#define MCE_CMD_UNKNOWN3        0x09    /* Unknown */
 143#define MCE_CMD_UNKNOWN4        0x0a    /* Unknown */
 144#define MCE_CMD_G_REVISION      0x0b    /* Get hw/sw revision */
 145#define MCE_CMD_UNKNOWN5        0x0e    /* Unknown */
 146#define MCE_CMD_UNKNOWN6        0x0f    /* Unknown */
 147#define MCE_CMD_UNKNOWN8        0x19    /* Unknown */
 148#define MCE_CMD_UNKNOWN9        0x1b    /* Unknown */
 149#define MCE_CMD_NULL            0x00    /* These show up various places... */
 150
 151/* if buf[i] & MCE_PORT_MASK == 0x80 and buf[i] != MCE_CMD_PORT_IR,
 152 * then we're looking at a raw IR data sample */
 153#define MCE_COMMAND_IRDATA      0x80
 154#define MCE_PACKET_LENGTH_MASK  0x1f /* Packet length mask */
 155
 156/* general constants */
 157#define SEND_FLAG_IN_PROGRESS   1
 158#define SEND_FLAG_COMPLETE      2
 159#define RECV_FLAG_IN_PROGRESS   3
 160#define RECV_FLAG_COMPLETE      4
 161
 162#define MCEUSB_RX               1
 163#define MCEUSB_TX               2
 164
 165#define VENDOR_PHILIPS          0x0471
 166#define VENDOR_SMK              0x0609
 167#define VENDOR_TATUNG           0x1460
 168#define VENDOR_GATEWAY          0x107b
 169#define VENDOR_SHUTTLE          0x1308
 170#define VENDOR_SHUTTLE2         0x051c
 171#define VENDOR_MITSUMI          0x03ee
 172#define VENDOR_TOPSEED          0x1784
 173#define VENDOR_RICAVISION       0x179d
 174#define VENDOR_ITRON            0x195d
 175#define VENDOR_FIC              0x1509
 176#define VENDOR_LG               0x043e
 177#define VENDOR_MICROSOFT        0x045e
 178#define VENDOR_FORMOSA          0x147a
 179#define VENDOR_FINTEK           0x1934
 180#define VENDOR_PINNACLE         0x2304
 181#define VENDOR_ECS              0x1019
 182#define VENDOR_WISTRON          0x0fb8
 183#define VENDOR_COMPRO           0x185b
 184#define VENDOR_NORTHSTAR        0x04eb
 185#define VENDOR_REALTEK          0x0bda
 186#define VENDOR_TIVO             0x105a
 187#define VENDOR_CONEXANT         0x0572
 188#define VENDOR_TWISTEDMELON     0x2596
 189#define VENDOR_HAUPPAUGE        0x2040
 190#define VENDOR_PCTV             0x2013
 191
 192enum mceusb_model_type {
 193        MCE_GEN2 = 0,           /* Most boards */
 194        MCE_GEN1,
 195        MCE_GEN3,
 196        MCE_GEN2_TX_INV,
 197        POLARIS_EVK,
 198        CX_HYBRID_TV,
 199        MULTIFUNCTION,
 200        TIVO_KIT,
 201        MCE_GEN2_NO_TX,
 202        HAUPPAUGE_CX_HYBRID_TV,
 203};
 204
 205struct mceusb_model {
 206        u32 mce_gen1:1;
 207        u32 mce_gen2:1;
 208        u32 mce_gen3:1;
 209        u32 tx_mask_normal:1;
 210        u32 no_tx:1;
 211
 212        int ir_intfnum;
 213
 214        const char *rc_map;     /* Allow specify a per-board map */
 215        const char *name;       /* per-board name */
 216};
 217
 218static const struct mceusb_model mceusb_model[] = {
 219        [MCE_GEN1] = {
 220                .mce_gen1 = 1,
 221                .tx_mask_normal = 1,
 222        },
 223        [MCE_GEN2] = {
 224                .mce_gen2 = 1,
 225        },
 226        [MCE_GEN2_NO_TX] = {
 227                .mce_gen2 = 1,
 228                .no_tx = 1,
 229        },
 230        [MCE_GEN2_TX_INV] = {
 231                .mce_gen2 = 1,
 232                .tx_mask_normal = 1,
 233        },
 234        [MCE_GEN3] = {
 235                .mce_gen3 = 1,
 236                .tx_mask_normal = 1,
 237        },
 238        [POLARIS_EVK] = {
 239                /*
 240                 * In fact, the EVK is shipped without
 241                 * remotes, but we should have something handy,
 242                 * to allow testing it
 243                 */
 244                .name = "Conexant Hybrid TV (cx231xx) MCE IR",
 245        },
 246        [CX_HYBRID_TV] = {
 247                .no_tx = 1, /* tx isn't wired up at all */
 248                .name = "Conexant Hybrid TV (cx231xx) MCE IR",
 249        },
 250        [HAUPPAUGE_CX_HYBRID_TV] = {
 251                .no_tx = 1, /* eeprom says it has no tx */
 252                .name = "Conexant Hybrid TV (cx231xx) MCE IR no TX",
 253        },
 254        [MULTIFUNCTION] = {
 255                .mce_gen2 = 1,
 256                .ir_intfnum = 2,
 257        },
 258        [TIVO_KIT] = {
 259                .mce_gen2 = 1,
 260                .rc_map = RC_MAP_TIVO,
 261        },
 262};
 263
 264static struct usb_device_id mceusb_dev_table[] = {
 265        /* Original Microsoft MCE IR Transceiver (often HP-branded) */
 266        { USB_DEVICE(VENDOR_MICROSOFT, 0x006d),
 267          .driver_info = MCE_GEN1 },
 268        /* Philips Infrared Transceiver - Sahara branded */
 269        { USB_DEVICE(VENDOR_PHILIPS, 0x0608) },
 270        /* Philips Infrared Transceiver - HP branded */
 271        { USB_DEVICE(VENDOR_PHILIPS, 0x060c),
 272          .driver_info = MCE_GEN2_TX_INV },
 273        /* Philips SRM5100 */
 274        { USB_DEVICE(VENDOR_PHILIPS, 0x060d) },
 275        /* Philips Infrared Transceiver - Omaura */
 276        { USB_DEVICE(VENDOR_PHILIPS, 0x060f) },
 277        /* Philips Infrared Transceiver - Spinel plus */
 278        { USB_DEVICE(VENDOR_PHILIPS, 0x0613) },
 279        /* Philips eHome Infrared Transceiver */
 280        { USB_DEVICE(VENDOR_PHILIPS, 0x0815) },
 281        /* Philips/Spinel plus IR transceiver for ASUS */
 282        { USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
 283        /* Philips/Spinel plus IR transceiver for ASUS */
 284        { USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
 285        /* Philips IR transceiver (Dell branded) */
 286        { USB_DEVICE(VENDOR_PHILIPS, 0x2093),
 287          .driver_info = MCE_GEN2_TX_INV },
 288        /* Realtek MCE IR Receiver and card reader */
 289        { USB_DEVICE(VENDOR_REALTEK, 0x0161),
 290          .driver_info = MULTIFUNCTION },
 291        /* SMK/Toshiba G83C0004D410 */
 292        { USB_DEVICE(VENDOR_SMK, 0x031d),
 293          .driver_info = MCE_GEN2_TX_INV },
 294        /* SMK eHome Infrared Transceiver (Sony VAIO) */
 295        { USB_DEVICE(VENDOR_SMK, 0x0322),
 296          .driver_info = MCE_GEN2_TX_INV },
 297        /* bundled with Hauppauge PVR-150 */
 298        { USB_DEVICE(VENDOR_SMK, 0x0334),
 299          .driver_info = MCE_GEN2_TX_INV },
 300        /* SMK eHome Infrared Transceiver */
 301        { USB_DEVICE(VENDOR_SMK, 0x0338) },
 302        /* SMK/I-O Data GV-MC7/RCKIT Receiver */
 303        { USB_DEVICE(VENDOR_SMK, 0x0353),
 304          .driver_info = MCE_GEN2_NO_TX },
 305        /* Tatung eHome Infrared Transceiver */
 306        { USB_DEVICE(VENDOR_TATUNG, 0x9150) },
 307        /* Shuttle eHome Infrared Transceiver */
 308        { USB_DEVICE(VENDOR_SHUTTLE, 0xc001) },
 309        /* Shuttle eHome Infrared Transceiver */
 310        { USB_DEVICE(VENDOR_SHUTTLE2, 0xc001) },
 311        /* Gateway eHome Infrared Transceiver */
 312        { USB_DEVICE(VENDOR_GATEWAY, 0x3009) },
 313        /* Mitsumi */
 314        { USB_DEVICE(VENDOR_MITSUMI, 0x2501) },
 315        /* Topseed eHome Infrared Transceiver */
 316        { USB_DEVICE(VENDOR_TOPSEED, 0x0001),
 317          .driver_info = MCE_GEN2_TX_INV },
 318        /* Topseed HP eHome Infrared Transceiver */
 319        { USB_DEVICE(VENDOR_TOPSEED, 0x0006),
 320          .driver_info = MCE_GEN2_TX_INV },
 321        /* Topseed eHome Infrared Transceiver */
 322        { USB_DEVICE(VENDOR_TOPSEED, 0x0007),
 323          .driver_info = MCE_GEN2_TX_INV },
 324        /* Topseed eHome Infrared Transceiver */
 325        { USB_DEVICE(VENDOR_TOPSEED, 0x0008),
 326          .driver_info = MCE_GEN3 },
 327        /* Topseed eHome Infrared Transceiver */
 328        { USB_DEVICE(VENDOR_TOPSEED, 0x000a),
 329          .driver_info = MCE_GEN2_TX_INV },
 330        /* Topseed eHome Infrared Transceiver */
 331        { USB_DEVICE(VENDOR_TOPSEED, 0x0011),
 332          .driver_info = MCE_GEN3 },
 333        /* Ricavision internal Infrared Transceiver */
 334        { USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
 335        /* Itron ione Libra Q-11 */
 336        { USB_DEVICE(VENDOR_ITRON, 0x7002) },
 337        /* FIC eHome Infrared Transceiver */
 338        { USB_DEVICE(VENDOR_FIC, 0x9242) },
 339        /* LG eHome Infrared Transceiver */
 340        { USB_DEVICE(VENDOR_LG, 0x9803) },
 341        /* Microsoft MCE Infrared Transceiver */
 342        { USB_DEVICE(VENDOR_MICROSOFT, 0x00a0) },
 343        /* Formosa eHome Infrared Transceiver */
 344        { USB_DEVICE(VENDOR_FORMOSA, 0xe015) },
 345        /* Formosa21 / eHome Infrared Receiver */
 346        { USB_DEVICE(VENDOR_FORMOSA, 0xe016) },
 347        /* Formosa aim / Trust MCE Infrared Receiver */
 348        { USB_DEVICE(VENDOR_FORMOSA, 0xe017),
 349          .driver_info = MCE_GEN2_NO_TX },
 350        /* Formosa Industrial Computing / Beanbag Emulation Device */
 351        { USB_DEVICE(VENDOR_FORMOSA, 0xe018) },
 352        /* Formosa21 / eHome Infrared Receiver */
 353        { USB_DEVICE(VENDOR_FORMOSA, 0xe03a) },
 354        /* Formosa Industrial Computing AIM IR605/A */
 355        { USB_DEVICE(VENDOR_FORMOSA, 0xe03c) },
 356        /* Formosa Industrial Computing */
 357        { USB_DEVICE(VENDOR_FORMOSA, 0xe03e) },
 358        /* Formosa Industrial Computing */
 359        { USB_DEVICE(VENDOR_FORMOSA, 0xe042) },
 360        /* Fintek eHome Infrared Transceiver (HP branded) */
 361        { USB_DEVICE(VENDOR_FINTEK, 0x5168),
 362          .driver_info = MCE_GEN2_TX_INV },
 363        /* Fintek eHome Infrared Transceiver */
 364        { USB_DEVICE(VENDOR_FINTEK, 0x0602) },
 365        /* Fintek eHome Infrared Transceiver (in the AOpen MP45) */
 366        { USB_DEVICE(VENDOR_FINTEK, 0x0702) },
 367        /* Pinnacle Remote Kit */
 368        { USB_DEVICE(VENDOR_PINNACLE, 0x0225),
 369          .driver_info = MCE_GEN3 },
 370        /* Elitegroup Computer Systems IR */
 371        { USB_DEVICE(VENDOR_ECS, 0x0f38) },
 372        /* Wistron Corp. eHome Infrared Receiver */
 373        { USB_DEVICE(VENDOR_WISTRON, 0x0002) },
 374        /* Compro K100 */
 375        { USB_DEVICE(VENDOR_COMPRO, 0x3020) },
 376        /* Compro K100 v2 */
 377        { USB_DEVICE(VENDOR_COMPRO, 0x3082) },
 378        /* Northstar Systems, Inc. eHome Infrared Transceiver */
 379        { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) },
 380        /* TiVo PC IR Receiver */
 381        { USB_DEVICE(VENDOR_TIVO, 0x2000),
 382          .driver_info = TIVO_KIT },
 383        /* Conexant Hybrid TV "Shelby" Polaris SDK */
 384        { USB_DEVICE(VENDOR_CONEXANT, 0x58a1),
 385          .driver_info = POLARIS_EVK },
 386        /* Conexant Hybrid TV RDU253S Polaris */
 387        { USB_DEVICE(VENDOR_CONEXANT, 0x58a5),
 388          .driver_info = CX_HYBRID_TV },
 389        /* Twisted Melon Inc. - Manta Mini Receiver */
 390        { USB_DEVICE(VENDOR_TWISTEDMELON, 0x8008) },
 391        /* Twisted Melon Inc. - Manta Pico Receiver */
 392        { USB_DEVICE(VENDOR_TWISTEDMELON, 0x8016) },
 393        /* Twisted Melon Inc. - Manta Transceiver */
 394        { USB_DEVICE(VENDOR_TWISTEDMELON, 0x8042) },
 395        /* Hauppauge WINTV-HVR-HVR 930C-HD - based on cx231xx */
 396        { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb130),
 397          .driver_info = HAUPPAUGE_CX_HYBRID_TV },
 398        { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb131),
 399          .driver_info = HAUPPAUGE_CX_HYBRID_TV },
 400        { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb138),
 401          .driver_info = HAUPPAUGE_CX_HYBRID_TV },
 402        { USB_DEVICE(VENDOR_HAUPPAUGE, 0xb139),
 403          .driver_info = HAUPPAUGE_CX_HYBRID_TV },
 404        { USB_DEVICE(VENDOR_PCTV, 0x0259),
 405          .driver_info = HAUPPAUGE_CX_HYBRID_TV },
 406        { USB_DEVICE(VENDOR_PCTV, 0x025e),
 407          .driver_info = HAUPPAUGE_CX_HYBRID_TV },
 408
 409        /* Terminating entry */
 410        { }
 411};
 412
 413/* data structure for each usb transceiver */
 414struct mceusb_dev {
 415        /* ir-core bits */
 416        struct rc_dev *rc;
 417
 418        /* optional features we can enable */
 419        bool carrier_report_enabled;
 420        bool learning_enabled;
 421
 422        /* core device bits */
 423        struct device *dev;
 424
 425        /* usb */
 426        struct usb_device *usbdev;
 427        struct urb *urb_in;
 428        struct usb_endpoint_descriptor *usb_ep_out;
 429
 430        /* buffers and dma */
 431        unsigned char *buf_in;
 432        unsigned int len_in;
 433        dma_addr_t dma_in;
 434
 435        enum {
 436                CMD_HEADER = 0,
 437                SUBCMD,
 438                CMD_DATA,
 439                PARSE_IRDATA,
 440        } parser_state;
 441
 442        u8 cmd, rem;            /* Remaining IR data bytes in packet */
 443
 444        struct {
 445                u32 connected:1;
 446                u32 tx_mask_normal:1;
 447                u32 microsoft_gen1:1;
 448                u32 no_tx:1;
 449        } flags;
 450
 451        /* transmit support */
 452        int send_flags;
 453        u32 carrier;
 454        unsigned char tx_mask;
 455
 456        char name[128];
 457        char phys[64];
 458        enum mceusb_model_type model;
 459
 460        bool need_reset;        /* flag to issue a device resume cmd */
 461        u8 emver;               /* emulator interface version */
 462        u8 num_txports;         /* number of transmit ports */
 463        u8 num_rxports;         /* number of receive sensors */
 464        u8 txports_cabled;      /* bitmask of transmitters with cable */
 465        u8 rxports_active;      /* bitmask of active receive sensors */
 466};
 467
 468/* MCE Device Command Strings, generally a port and command pair */
 469static char DEVICE_RESUME[]     = {MCE_CMD_NULL, MCE_CMD_PORT_SYS,
 470                                   MCE_CMD_RESUME};
 471static char GET_REVISION[]      = {MCE_CMD_PORT_SYS, MCE_CMD_G_REVISION};
 472static char GET_EMVER[]         = {MCE_CMD_PORT_SYS, MCE_CMD_GETEMVER};
 473static char GET_WAKEVERSION[]   = {MCE_CMD_PORT_SYS, MCE_CMD_GETWAKEVERSION};
 474static char FLASH_LED[]         = {MCE_CMD_PORT_SYS, MCE_CMD_FLASHLED};
 475static char GET_UNKNOWN2[]      = {MCE_CMD_PORT_IR, MCE_CMD_UNKNOWN2};
 476static char GET_CARRIER_FREQ[]  = {MCE_CMD_PORT_IR, MCE_CMD_GETIRCFS};
 477static char GET_RX_TIMEOUT[]    = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTIMEOUT};
 478static char GET_NUM_PORTS[]     = {MCE_CMD_PORT_IR, MCE_CMD_GETIRNUMPORTS};
 479static char GET_TX_BITMASK[]    = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTXPORTS};
 480static char GET_RX_SENSOR[]     = {MCE_CMD_PORT_IR, MCE_CMD_GETIRRXPORTEN};
 481/* sub in desired values in lower byte or bytes for full command */
 482/* FIXME: make use of these for transmit.
 483static char SET_CARRIER_FREQ[]  = {MCE_CMD_PORT_IR,
 484                                   MCE_CMD_SETIRCFS, 0x00, 0x00};
 485static char SET_TX_BITMASK[]    = {MCE_CMD_PORT_IR, MCE_CMD_SETIRTXPORTS, 0x00};
 486static char SET_RX_TIMEOUT[]    = {MCE_CMD_PORT_IR,
 487                                   MCE_CMD_SETIRTIMEOUT, 0x00, 0x00};
 488static char SET_RX_SENSOR[]     = {MCE_CMD_PORT_IR,
 489                                   MCE_RSP_EQIRRXPORTEN, 0x00};
 490*/
 491
 492static int mceusb_cmd_datasize(u8 cmd, u8 subcmd)
 493{
 494        int datasize = 0;
 495
 496        switch (cmd) {
 497        case MCE_CMD_NULL:
 498                if (subcmd == MCE_CMD_PORT_SYS)
 499                        datasize = 1;
 500                break;
 501        case MCE_CMD_PORT_SYS:
 502                switch (subcmd) {
 503                case MCE_RSP_GETPORTSTATUS:
 504                        datasize = 5;
 505                        break;
 506                case MCE_RSP_EQWAKEVERSION:
 507                        datasize = 4;
 508                        break;
 509                case MCE_CMD_G_REVISION:
 510                        datasize = 2;
 511                        break;
 512                case MCE_RSP_EQWAKESUPPORT:
 513                case MCE_RSP_GETWAKESOURCE:
 514                case MCE_RSP_EQDEVDETAILS:
 515                case MCE_RSP_EQEMVER:
 516                        datasize = 1;
 517                        break;
 518                }
 519        case MCE_CMD_PORT_IR:
 520                switch (subcmd) {
 521                case MCE_CMD_UNKNOWN:
 522                case MCE_RSP_EQIRCFS:
 523                case MCE_RSP_EQIRTIMEOUT:
 524                case MCE_RSP_EQIRRXCFCNT:
 525                case MCE_RSP_EQIRNUMPORTS:
 526                        datasize = 2;
 527                        break;
 528                case MCE_CMD_SIG_END:
 529                case MCE_RSP_EQIRTXPORTS:
 530                case MCE_RSP_EQIRRXPORTEN:
 531                        datasize = 1;
 532                        break;
 533                }
 534        }
 535        return datasize;
 536}
 537
 538static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
 539                                 int offset, int len, bool out)
 540{
 541#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
 542        char *inout;
 543        u8 cmd, subcmd, data1, data2, data3, data4;
 544        struct device *dev = ir->dev;
 545        int start, skip = 0;
 546        u32 carrier, period;
 547
 548        /* skip meaningless 0xb1 0x60 header bytes on orig receiver */
 549        if (ir->flags.microsoft_gen1 && !out && !offset)
 550                skip = 2;
 551
 552        if (len <= skip)
 553                return;
 554
 555        dev_dbg(dev, "%cx data: %*ph (length=%d)",
 556                (out ? 't' : 'r'), min(len, USB_BUFLEN), buf, len);
 557
 558        inout = out ? "Request" : "Got";
 559
 560        start  = offset + skip;
 561        cmd    = buf[start] & 0xff;
 562        subcmd = buf[start + 1] & 0xff;
 563        data1  = buf[start + 2] & 0xff;
 564        data2  = buf[start + 3] & 0xff;
 565        data3  = buf[start + 4] & 0xff;
 566        data4  = buf[start + 5] & 0xff;
 567
 568        switch (cmd) {
 569        case MCE_CMD_NULL:
 570                if (subcmd == MCE_CMD_NULL)
 571                        break;
 572                if ((subcmd == MCE_CMD_PORT_SYS) &&
 573                    (data1 == MCE_CMD_RESUME))
 574                        dev_dbg(dev, "Device resume requested");
 575                else
 576                        dev_dbg(dev, "Unknown command 0x%02x 0x%02x",
 577                                 cmd, subcmd);
 578                break;
 579        case MCE_CMD_PORT_SYS:
 580                switch (subcmd) {
 581                case MCE_RSP_EQEMVER:
 582                        if (!out)
 583                                dev_dbg(dev, "Emulator interface version %x",
 584                                         data1);
 585                        break;
 586                case MCE_CMD_G_REVISION:
 587                        if (len == 2)
 588                                dev_dbg(dev, "Get hw/sw rev?");
 589                        else
 590                                dev_dbg(dev, "hw/sw rev 0x%02x 0x%02x 0x%02x 0x%02x",
 591                                         data1, data2,
 592                                         buf[start + 4], buf[start + 5]);
 593                        break;
 594                case MCE_CMD_RESUME:
 595                        dev_dbg(dev, "Device resume requested");
 596                        break;
 597                case MCE_RSP_CMD_ILLEGAL:
 598                        dev_dbg(dev, "Illegal PORT_SYS command");
 599                        break;
 600                case MCE_RSP_EQWAKEVERSION:
 601                        if (!out)
 602                                dev_dbg(dev, "Wake version, proto: 0x%02x, "
 603                                         "payload: 0x%02x, address: 0x%02x, "
 604                                         "version: 0x%02x",
 605                                         data1, data2, data3, data4);
 606                        break;
 607                case MCE_RSP_GETPORTSTATUS:
 608                        if (!out)
 609                                /* We use data1 + 1 here, to match hw labels */
 610                                dev_dbg(dev, "TX port %d: blaster is%s connected",
 611                                         data1 + 1, data4 ? " not" : "");
 612                        break;
 613                case MCE_CMD_FLASHLED:
 614                        dev_dbg(dev, "Attempting to flash LED");
 615                        break;
 616                default:
 617                        dev_dbg(dev, "Unknown command 0x%02x 0x%02x",
 618                                 cmd, subcmd);
 619                        break;
 620                }
 621                break;
 622        case MCE_CMD_PORT_IR:
 623                switch (subcmd) {
 624                case MCE_CMD_SIG_END:
 625                        dev_dbg(dev, "End of signal");
 626                        break;
 627                case MCE_CMD_PING:
 628                        dev_dbg(dev, "Ping");
 629                        break;
 630                case MCE_CMD_UNKNOWN:
 631                        dev_dbg(dev, "Resp to 9f 05 of 0x%02x 0x%02x",
 632                                 data1, data2);
 633                        break;
 634                case MCE_RSP_EQIRCFS:
 635                        period = DIV_ROUND_CLOSEST(
 636                                        (1U << data1 * 2) * (data2 + 1), 10);
 637                        if (!period)
 638                                break;
 639                        carrier = (1000 * 1000) / period;
 640                        dev_dbg(dev, "%s carrier of %u Hz (period %uus)",
 641                                 inout, carrier, period);
 642                        break;
 643                case MCE_CMD_GETIRCFS:
 644                        dev_dbg(dev, "Get carrier mode and freq");
 645                        break;
 646                case MCE_RSP_EQIRTXPORTS:
 647                        dev_dbg(dev, "%s transmit blaster mask of 0x%02x",
 648                                 inout, data1);
 649                        break;
 650                case MCE_RSP_EQIRTIMEOUT:
 651                        /* value is in units of 50us, so x*50/1000 ms */
 652                        period = ((data1 << 8) | data2) * MCE_TIME_UNIT / 1000;
 653                        dev_dbg(dev, "%s receive timeout of %d ms",
 654                                 inout, period);
 655                        break;
 656                case MCE_CMD_GETIRTIMEOUT:
 657                        dev_dbg(dev, "Get receive timeout");
 658                        break;
 659                case MCE_CMD_GETIRTXPORTS:
 660                        dev_dbg(dev, "Get transmit blaster mask");
 661                        break;
 662                case MCE_RSP_EQIRRXPORTEN:
 663                        dev_dbg(dev, "%s %s-range receive sensor in use",
 664                                 inout, data1 == 0x02 ? "short" : "long");
 665                        break;
 666                case MCE_CMD_GETIRRXPORTEN:
 667                /* aka MCE_RSP_EQIRRXCFCNT */
 668                        if (out)
 669                                dev_dbg(dev, "Get receive sensor");
 670                        else if (ir->learning_enabled)
 671                                dev_dbg(dev, "RX pulse count: %d",
 672                                         ((data1 << 8) | data2));
 673                        break;
 674                case MCE_RSP_EQIRNUMPORTS:
 675                        if (out)
 676                                break;
 677                        dev_dbg(dev, "Num TX ports: %x, num RX ports: %x",
 678                                 data1, data2);
 679                        break;
 680                case MCE_RSP_CMD_ILLEGAL:
 681                        dev_dbg(dev, "Illegal PORT_IR command");
 682                        break;
 683                default:
 684                        dev_dbg(dev, "Unknown command 0x%02x 0x%02x",
 685                                 cmd, subcmd);
 686                        break;
 687                }
 688                break;
 689        default:
 690                break;
 691        }
 692
 693        if (cmd == MCE_IRDATA_TRAILER)
 694                dev_dbg(dev, "End of raw IR data");
 695        else if ((cmd != MCE_CMD_PORT_IR) &&
 696                 ((cmd & MCE_PORT_MASK) == MCE_COMMAND_IRDATA))
 697                dev_dbg(dev, "Raw IR data, %d pulse/space samples", ir->rem);
 698#endif
 699}
 700
 701static void mce_async_callback(struct urb *urb)
 702{
 703        struct mceusb_dev *ir;
 704        int len;
 705
 706        if (!urb)
 707                return;
 708
 709        ir = urb->context;
 710
 711        switch (urb->status) {
 712        /* success */
 713        case 0:
 714                len = urb->actual_length;
 715
 716                mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true);
 717                break;
 718
 719        case -ECONNRESET:
 720        case -ENOENT:
 721        case -EILSEQ:
 722        case -ESHUTDOWN:
 723                break;
 724
 725        case -EPIPE:
 726        default:
 727                dev_err(ir->dev, "Error: request urb status = %d", urb->status);
 728                break;
 729        }
 730
 731        /* the transfer buffer and urb were allocated in mce_request_packet */
 732        kfree(urb->transfer_buffer);
 733        usb_free_urb(urb);
 734}
 735
 736/* request incoming or send outgoing usb packet - used to initialize remote */
 737static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
 738                               int size, int urb_type)
 739{
 740        int res, pipe;
 741        struct urb *async_urb;
 742        struct device *dev = ir->dev;
 743        unsigned char *async_buf;
 744
 745        if (urb_type == MCEUSB_TX) {
 746                async_urb = usb_alloc_urb(0, GFP_KERNEL);
 747                if (unlikely(!async_urb)) {
 748                        dev_err(dev, "Error, couldn't allocate urb!\n");
 749                        return;
 750                }
 751
 752                async_buf = kzalloc(size, GFP_KERNEL);
 753                if (!async_buf) {
 754                        dev_err(dev, "Error, couldn't allocate buf!\n");
 755                        usb_free_urb(async_urb);
 756                        return;
 757                }
 758
 759                /* outbound data */
 760                if (usb_endpoint_xfer_int(ir->usb_ep_out)) {
 761                        pipe = usb_sndintpipe(ir->usbdev,
 762                                         ir->usb_ep_out->bEndpointAddress);
 763                        usb_fill_int_urb(async_urb, ir->usbdev, pipe, async_buf,
 764                                         size, mce_async_callback, ir,
 765                                         ir->usb_ep_out->bInterval);
 766                } else {
 767                        pipe = usb_sndbulkpipe(ir->usbdev,
 768                                         ir->usb_ep_out->bEndpointAddress);
 769                        usb_fill_bulk_urb(async_urb, ir->usbdev, pipe,
 770                                         async_buf, size, mce_async_callback,
 771                                         ir);
 772                }
 773                memcpy(async_buf, data, size);
 774
 775        } else if (urb_type == MCEUSB_RX) {
 776                /* standard request */
 777                async_urb = ir->urb_in;
 778                ir->send_flags = RECV_FLAG_IN_PROGRESS;
 779
 780        } else {
 781                dev_err(dev, "Error! Unknown urb type %d\n", urb_type);
 782                return;
 783        }
 784
 785        dev_dbg(dev, "receive request called (size=%#x)", size);
 786
 787        async_urb->transfer_buffer_length = size;
 788        async_urb->dev = ir->usbdev;
 789
 790        res = usb_submit_urb(async_urb, GFP_ATOMIC);
 791        if (res) {
 792                dev_err(dev, "receive request FAILED! (res=%d)", res);
 793                return;
 794        }
 795        dev_dbg(dev, "receive request complete (res=%d)", res);
 796}
 797
 798static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
 799{
 800        int rsize = sizeof(DEVICE_RESUME);
 801
 802        if (ir->need_reset) {
 803                ir->need_reset = false;
 804                mce_request_packet(ir, DEVICE_RESUME, rsize, MCEUSB_TX);
 805                msleep(10);
 806        }
 807
 808        mce_request_packet(ir, data, size, MCEUSB_TX);
 809        msleep(10);
 810}
 811
 812static void mce_flush_rx_buffer(struct mceusb_dev *ir, int size)
 813{
 814        mce_request_packet(ir, NULL, size, MCEUSB_RX);
 815}
 816
 817/* Send data out the IR blaster port(s) */
 818static int mceusb_tx_ir(struct rc_dev *dev, unsigned *txbuf, unsigned count)
 819{
 820        struct mceusb_dev *ir = dev->priv;
 821        int i, length, ret = 0;
 822        int cmdcount = 0;
 823        unsigned char cmdbuf[MCE_CMDBUF_SIZE];
 824
 825        /* MCE tx init header */
 826        cmdbuf[cmdcount++] = MCE_CMD_PORT_IR;
 827        cmdbuf[cmdcount++] = MCE_CMD_SETIRTXPORTS;
 828        cmdbuf[cmdcount++] = ir->tx_mask;
 829
 830        /* Send the set TX ports command */
 831        mce_async_out(ir, cmdbuf, cmdcount);
 832        cmdcount = 0;
 833
 834        /* Generate mce packet data */
 835        for (i = 0; (i < count) && (cmdcount < MCE_CMDBUF_SIZE); i++) {
 836                txbuf[i] = txbuf[i] / MCE_TIME_UNIT;
 837
 838                do { /* loop to support long pulses/spaces > 127*50us=6.35ms */
 839
 840                        /* Insert mce packet header every 4th entry */
 841                        if ((cmdcount < MCE_CMDBUF_SIZE) &&
 842                            (cmdcount % MCE_CODE_LENGTH) == 0)
 843                                cmdbuf[cmdcount++] = MCE_IRDATA_HEADER;
 844
 845                        /* Insert mce packet data */
 846                        if (cmdcount < MCE_CMDBUF_SIZE)
 847                                cmdbuf[cmdcount++] =
 848                                        (txbuf[i] < MCE_PULSE_BIT ?
 849                                         txbuf[i] : MCE_MAX_PULSE_LENGTH) |
 850                                         (i & 1 ? 0x00 : MCE_PULSE_BIT);
 851                        else {
 852                                ret = -EINVAL;
 853                                goto out;
 854                        }
 855
 856                } while ((txbuf[i] > MCE_MAX_PULSE_LENGTH) &&
 857                         (txbuf[i] -= MCE_MAX_PULSE_LENGTH));
 858        }
 859
 860        /* Check if we have room for the empty packet at the end */
 861        if (cmdcount >= MCE_CMDBUF_SIZE) {
 862                ret = -EINVAL;
 863                goto out;
 864        }
 865
 866        /* Fix packet length in last header */
 867        length = cmdcount % MCE_CODE_LENGTH;
 868        cmdbuf[cmdcount - length] -= MCE_CODE_LENGTH - length;
 869
 870        /* All mce commands end with an empty packet (0x80) */
 871        cmdbuf[cmdcount++] = MCE_IRDATA_TRAILER;
 872
 873        /* Transmit the command to the mce device */
 874        mce_async_out(ir, cmdbuf, cmdcount);
 875
 876out:
 877        return ret ? ret : count;
 878}
 879
 880/* Sets active IR outputs -- mce devices typically have two */
 881static int mceusb_set_tx_mask(struct rc_dev *dev, u32 mask)
 882{
 883        struct mceusb_dev *ir = dev->priv;
 884
 885        if (ir->flags.tx_mask_normal)
 886                ir->tx_mask = mask;
 887        else
 888                ir->tx_mask = (mask != MCE_DEFAULT_TX_MASK ?
 889                                mask ^ MCE_DEFAULT_TX_MASK : mask) << 1;
 890
 891        return 0;
 892}
 893
 894/* Sets the send carrier frequency and mode */
 895static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
 896{
 897        struct mceusb_dev *ir = dev->priv;
 898        int clk = 10000000;
 899        int prescaler = 0, divisor = 0;
 900        unsigned char cmdbuf[4] = { MCE_CMD_PORT_IR,
 901                                    MCE_CMD_SETIRCFS, 0x00, 0x00 };
 902
 903        /* Carrier has changed */
 904        if (ir->carrier != carrier) {
 905
 906                if (carrier == 0) {
 907                        ir->carrier = carrier;
 908                        cmdbuf[2] = MCE_CMD_SIG_END;
 909                        cmdbuf[3] = MCE_IRDATA_TRAILER;
 910                        dev_dbg(ir->dev, "disabling carrier modulation");
 911                        mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
 912                        return carrier;
 913                }
 914
 915                for (prescaler = 0; prescaler < 4; ++prescaler) {
 916                        divisor = (clk >> (2 * prescaler)) / carrier;
 917                        if (divisor <= 0xff) {
 918                                ir->carrier = carrier;
 919                                cmdbuf[2] = prescaler;
 920                                cmdbuf[3] = divisor;
 921                                dev_dbg(ir->dev, "requesting %u HZ carrier",
 922                                                                carrier);
 923
 924                                /* Transmit new carrier to mce device */
 925                                mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
 926                                return carrier;
 927                        }
 928                }
 929
 930                return -EINVAL;
 931
 932        }
 933
 934        return carrier;
 935}
 936
 937/*
 938 * We don't do anything but print debug spew for many of the command bits
 939 * we receive from the hardware, but some of them are useful information
 940 * we want to store so that we can use them.
 941 */
 942static void mceusb_handle_command(struct mceusb_dev *ir, int index)
 943{
 944        u8 hi = ir->buf_in[index + 1] & 0xff;
 945        u8 lo = ir->buf_in[index + 2] & 0xff;
 946
 947        switch (ir->buf_in[index]) {
 948        /* the one and only 5-byte return value command */
 949        case MCE_RSP_GETPORTSTATUS:
 950                if ((ir->buf_in[index + 4] & 0xff) == 0x00)
 951                        ir->txports_cabled |= 1 << hi;
 952                break;
 953
 954        /* 2-byte return value commands */
 955        case MCE_RSP_EQIRTIMEOUT:
 956                ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT);
 957                break;
 958        case MCE_RSP_EQIRNUMPORTS:
 959                ir->num_txports = hi;
 960                ir->num_rxports = lo;
 961                break;
 962
 963        /* 1-byte return value commands */
 964        case MCE_RSP_EQEMVER:
 965                ir->emver = hi;
 966                break;
 967        case MCE_RSP_EQIRTXPORTS:
 968                ir->tx_mask = hi;
 969                break;
 970        case MCE_RSP_EQIRRXPORTEN:
 971                ir->learning_enabled = ((hi & 0x02) == 0x02);
 972                ir->rxports_active = hi;
 973                break;
 974        case MCE_RSP_CMD_ILLEGAL:
 975                ir->need_reset = true;
 976                break;
 977        default:
 978                break;
 979        }
 980}
 981
 982static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
 983{
 984        DEFINE_IR_RAW_EVENT(rawir);
 985        bool event = false;
 986        int i = 0;
 987
 988        /* skip meaningless 0xb1 0x60 header bytes on orig receiver */
 989        if (ir->flags.microsoft_gen1)
 990                i = 2;
 991
 992        /* if there's no data, just return now */
 993        if (buf_len <= i)
 994                return;
 995
 996        for (; i < buf_len; i++) {
 997                switch (ir->parser_state) {
 998                case SUBCMD:
 999                        ir->rem = mceusb_cmd_datasize(ir->cmd, ir->buf_in[i]);
1000                        mceusb_dev_printdata(ir, ir->buf_in, i - 1,
1001                                             ir->rem + 2, false);
1002                        mceusb_handle_command(ir, i);
1003                        ir->parser_state = CMD_DATA;
1004                        break;
1005                case PARSE_IRDATA:
1006                        ir->rem--;
1007                        init_ir_raw_event(&rawir);
1008                        rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0);
1009                        rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
1010                                         * US_TO_NS(MCE_TIME_UNIT);
1011
1012                        dev_dbg(ir->dev, "Storing %s with duration %d",
1013                                rawir.pulse ? "pulse" : "space",
1014                                rawir.duration);
1015
1016                        if (ir_raw_event_store_with_filter(ir->rc, &rawir))
1017                                event = true;
1018                        break;
1019                case CMD_DATA:
1020                        ir->rem--;
1021                        break;
1022                case CMD_HEADER:
1023                        /* decode mce packets of the form (84),AA,BB,CC,DD */
1024                        /* IR data packets can span USB messages - rem */
1025                        ir->cmd = ir->buf_in[i];
1026                        if ((ir->cmd == MCE_CMD_PORT_IR) ||
1027                            ((ir->cmd & MCE_PORT_MASK) !=
1028                             MCE_COMMAND_IRDATA)) {
1029                                ir->parser_state = SUBCMD;
1030                                continue;
1031                        }
1032                        ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK);
1033                        mceusb_dev_printdata(ir, ir->buf_in,
1034                                             i, ir->rem + 1, false);
1035                        if (ir->rem)
1036                                ir->parser_state = PARSE_IRDATA;
1037                        else
1038                                ir_raw_event_reset(ir->rc);
1039                        break;
1040                }
1041
1042                if (ir->parser_state != CMD_HEADER && !ir->rem)
1043                        ir->parser_state = CMD_HEADER;
1044        }
1045        if (event) {
1046                dev_dbg(ir->dev, "processed IR data");
1047                ir_raw_event_handle(ir->rc);
1048        }
1049}
1050
1051static void mceusb_dev_recv(struct urb *urb)
1052{
1053        struct mceusb_dev *ir;
1054        int buf_len;
1055
1056        if (!urb)
1057                return;
1058
1059        ir = urb->context;
1060        if (!ir) {
1061                usb_unlink_urb(urb);
1062                return;
1063        }
1064
1065        buf_len = urb->actual_length;
1066
1067        if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
1068                ir->send_flags = SEND_FLAG_COMPLETE;
1069                dev_dbg(ir->dev, "setup answer received %d bytes\n",
1070                        buf_len);
1071        }
1072
1073        switch (urb->status) {
1074        /* success */
1075        case 0:
1076                mceusb_process_ir_data(ir, buf_len);
1077                break;
1078
1079        case -ECONNRESET:
1080        case -ENOENT:
1081        case -EILSEQ:
1082        case -ESHUTDOWN:
1083                usb_unlink_urb(urb);
1084                return;
1085
1086        case -EPIPE:
1087        default:
1088                dev_err(ir->dev, "Error: urb status = %d", urb->status);
1089                break;
1090        }
1091
1092        usb_submit_urb(urb, GFP_ATOMIC);
1093}
1094
1095static void mceusb_get_emulator_version(struct mceusb_dev *ir)
1096{
1097        /* If we get no reply or an illegal command reply, its ver 1, says MS */
1098        ir->emver = 1;
1099        mce_async_out(ir, GET_EMVER, sizeof(GET_EMVER));
1100}
1101
1102static void mceusb_gen1_init(struct mceusb_dev *ir)
1103{
1104        int ret;
1105        struct device *dev = ir->dev;
1106        char *data;
1107
1108        data = kzalloc(USB_CTRL_MSG_SZ, GFP_KERNEL);
1109        if (!data) {
1110                dev_err(dev, "%s: memory allocation failed!", __func__);
1111                return;
1112        }
1113
1114        /*
1115         * This is a strange one. Windows issues a set address to the device
1116         * on the receive control pipe and expect a certain value pair back
1117         */
1118        ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
1119                              USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
1120                              data, USB_CTRL_MSG_SZ, HZ * 3);
1121        dev_dbg(dev, "set address - ret = %d", ret);
1122        dev_dbg(dev, "set address - data[0] = %d, data[1] = %d",
1123                                                data[0], data[1]);
1124
1125        /* set feature: bit rate 38400 bps */
1126        ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
1127                              USB_REQ_SET_FEATURE, USB_TYPE_VENDOR,
1128                              0xc04e, 0x0000, NULL, 0, HZ * 3);
1129
1130        dev_dbg(dev, "set feature - ret = %d", ret);
1131
1132        /* bRequest 4: set char length to 8 bits */
1133        ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
1134                              4, USB_TYPE_VENDOR,
1135                              0x0808, 0x0000, NULL, 0, HZ * 3);
1136        dev_dbg(dev, "set char length - retB = %d", ret);
1137
1138        /* bRequest 2: set handshaking to use DTR/DSR */
1139        ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
1140                              2, USB_TYPE_VENDOR,
1141                              0x0000, 0x0100, NULL, 0, HZ * 3);
1142        dev_dbg(dev, "set handshake  - retC = %d", ret);
1143
1144        /* device resume */
1145        mce_async_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME));
1146
1147        /* get hw/sw revision? */
1148        mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
1149
1150        kfree(data);
1151}
1152
1153static void mceusb_gen2_init(struct mceusb_dev *ir)
1154{
1155        /* device resume */
1156        mce_async_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME));
1157
1158        /* get wake version (protocol, key, address) */
1159        mce_async_out(ir, GET_WAKEVERSION, sizeof(GET_WAKEVERSION));
1160
1161        /* unknown what this one actually returns... */
1162        mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
1163}
1164
1165static void mceusb_get_parameters(struct mceusb_dev *ir)
1166{
1167        int i;
1168        unsigned char cmdbuf[3] = { MCE_CMD_PORT_SYS,
1169                                    MCE_CMD_GETPORTSTATUS, 0x00 };
1170
1171        /* defaults, if the hardware doesn't support querying */
1172        ir->num_txports = 2;
1173        ir->num_rxports = 2;
1174
1175        /* get number of tx and rx ports */
1176        mce_async_out(ir, GET_NUM_PORTS, sizeof(GET_NUM_PORTS));
1177
1178        /* get the carrier and frequency */
1179        mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
1180
1181        if (ir->num_txports && !ir->flags.no_tx)
1182                /* get the transmitter bitmask */
1183                mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
1184
1185        /* get receiver timeout value */
1186        mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
1187
1188        /* get receiver sensor setting */
1189        mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
1190
1191        for (i = 0; i < ir->num_txports; i++) {
1192                cmdbuf[2] = i;
1193                mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
1194        }
1195}
1196
1197static void mceusb_flash_led(struct mceusb_dev *ir)
1198{
1199        if (ir->emver < 2)
1200                return;
1201
1202        mce_async_out(ir, FLASH_LED, sizeof(FLASH_LED));
1203}
1204
1205static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
1206{
1207        struct usb_device *udev = ir->usbdev;
1208        struct device *dev = ir->dev;
1209        struct rc_dev *rc;
1210        int ret;
1211
1212        rc = rc_allocate_device();
1213        if (!rc) {
1214                dev_err(dev, "remote dev allocation failed");
1215                goto out;
1216        }
1217
1218        snprintf(ir->name, sizeof(ir->name), "%s (%04x:%04x)",
1219                 mceusb_model[ir->model].name ?
1220                        mceusb_model[ir->model].name :
1221                        "Media Center Ed. eHome Infrared Remote Transceiver",
1222                 le16_to_cpu(ir->usbdev->descriptor.idVendor),
1223                 le16_to_cpu(ir->usbdev->descriptor.idProduct));
1224
1225        usb_make_path(ir->usbdev, ir->phys, sizeof(ir->phys));
1226
1227        rc->input_name = ir->name;
1228        rc->input_phys = ir->phys;
1229        usb_to_input_id(ir->usbdev, &rc->input_id);
1230        rc->dev.parent = dev;
1231        rc->priv = ir;
1232        rc->driver_type = RC_DRIVER_IR_RAW;
1233        rc->allowed_protocols = RC_BIT_ALL;
1234        rc->timeout = MS_TO_NS(100);
1235        if (!ir->flags.no_tx) {
1236                rc->s_tx_mask = mceusb_set_tx_mask;
1237                rc->s_tx_carrier = mceusb_set_tx_carrier;
1238                rc->tx_ir = mceusb_tx_ir;
1239        }
1240        rc->driver_name = DRIVER_NAME;
1241
1242        switch (le16_to_cpu(udev->descriptor.idVendor)) {
1243        case VENDOR_HAUPPAUGE:
1244                rc->map_name = RC_MAP_HAUPPAUGE;
1245                break;
1246        case VENDOR_PCTV:
1247                rc->map_name = RC_MAP_PINNACLE_PCTV_HD;
1248                break;
1249        default:
1250                rc->map_name = RC_MAP_RC6_MCE;
1251        }
1252        if (mceusb_model[ir->model].rc_map)
1253                rc->map_name = mceusb_model[ir->model].rc_map;
1254
1255        ret = rc_register_device(rc);
1256        if (ret < 0) {
1257                dev_err(dev, "remote dev registration failed");
1258                goto out;
1259        }
1260
1261        return rc;
1262
1263out:
1264        rc_free_device(rc);
1265        return NULL;
1266}
1267
1268static int mceusb_dev_probe(struct usb_interface *intf,
1269                            const struct usb_device_id *id)
1270{
1271        struct usb_device *dev = interface_to_usbdev(intf);
1272        struct usb_host_interface *idesc;
1273        struct usb_endpoint_descriptor *ep = NULL;
1274        struct usb_endpoint_descriptor *ep_in = NULL;
1275        struct usb_endpoint_descriptor *ep_out = NULL;
1276        struct mceusb_dev *ir = NULL;
1277        int pipe, maxp, i;
1278        char buf[63], name[128] = "";
1279        enum mceusb_model_type model = id->driver_info;
1280        bool is_gen3;
1281        bool is_microsoft_gen1;
1282        bool tx_mask_normal;
1283        int ir_intfnum;
1284
1285        dev_dbg(&intf->dev, "%s called", __func__);
1286
1287        idesc  = intf->cur_altsetting;
1288
1289        is_gen3 = mceusb_model[model].mce_gen3;
1290        is_microsoft_gen1 = mceusb_model[model].mce_gen1;
1291        tx_mask_normal = mceusb_model[model].tx_mask_normal;
1292        ir_intfnum = mceusb_model[model].ir_intfnum;
1293
1294        /* There are multi-function devices with non-IR interfaces */
1295        if (idesc->desc.bInterfaceNumber != ir_intfnum)
1296                return -ENODEV;
1297
1298        /* step through the endpoints to find first bulk in and out endpoint */
1299        for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
1300                ep = &idesc->endpoint[i].desc;
1301
1302                if (ep_in == NULL) {
1303                        if (usb_endpoint_is_bulk_in(ep)) {
1304                                ep_in = ep;
1305                                dev_dbg(&intf->dev, "acceptable bulk inbound endpoint found\n");
1306                        } else if (usb_endpoint_is_int_in(ep)) {
1307                                ep_in = ep;
1308                                ep_in->bInterval = 1;
1309                                dev_dbg(&intf->dev, "acceptable interrupt inbound endpoint found\n");
1310                        }
1311                }
1312
1313                if (ep_out == NULL) {
1314                        if (usb_endpoint_is_bulk_out(ep)) {
1315                                ep_out = ep;
1316                                dev_dbg(&intf->dev, "acceptable bulk outbound endpoint found\n");
1317                        } else if (usb_endpoint_is_int_out(ep)) {
1318                                ep_out = ep;
1319                                ep_out->bInterval = 1;
1320                                dev_dbg(&intf->dev, "acceptable interrupt outbound endpoint found\n");
1321                        }
1322                }
1323        }
1324        if (ep_in == NULL) {
1325                dev_dbg(&intf->dev, "inbound and/or endpoint not found");
1326                return -ENODEV;
1327        }
1328
1329        if (usb_endpoint_xfer_int(ep_in))
1330                pipe = usb_rcvintpipe(dev, ep_in->bEndpointAddress);
1331        else
1332                pipe = usb_rcvbulkpipe(dev, ep_in->bEndpointAddress);
1333        maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
1334
1335        ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL);
1336        if (!ir)
1337                goto mem_alloc_fail;
1338
1339        ir->buf_in = usb_alloc_coherent(dev, maxp, GFP_ATOMIC, &ir->dma_in);
1340        if (!ir->buf_in)
1341                goto buf_in_alloc_fail;
1342
1343        ir->urb_in = usb_alloc_urb(0, GFP_KERNEL);
1344        if (!ir->urb_in)
1345                goto urb_in_alloc_fail;
1346
1347        ir->usbdev = usb_get_dev(dev);
1348        ir->dev = &intf->dev;
1349        ir->len_in = maxp;
1350        ir->flags.microsoft_gen1 = is_microsoft_gen1;
1351        ir->flags.tx_mask_normal = tx_mask_normal;
1352        ir->flags.no_tx = mceusb_model[model].no_tx;
1353        ir->model = model;
1354
1355        /* Saving usb interface data for use by the transmitter routine */
1356        ir->usb_ep_out = ep_out;
1357
1358        if (dev->descriptor.iManufacturer
1359            && usb_string(dev, dev->descriptor.iManufacturer,
1360                          buf, sizeof(buf)) > 0)
1361                strlcpy(name, buf, sizeof(name));
1362        if (dev->descriptor.iProduct
1363            && usb_string(dev, dev->descriptor.iProduct,
1364                          buf, sizeof(buf)) > 0)
1365                snprintf(name + strlen(name), sizeof(name) - strlen(name),
1366                         " %s", buf);
1367
1368        ir->rc = mceusb_init_rc_dev(ir);
1369        if (!ir->rc)
1370                goto rc_dev_fail;
1371
1372        /* wire up inbound data handler */
1373        usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
1374                                mceusb_dev_recv, ir, ep_in->bInterval);
1375        ir->urb_in->transfer_dma = ir->dma_in;
1376        ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1377
1378        /* flush buffers on the device */
1379        dev_dbg(&intf->dev, "Flushing receive buffers\n");
1380        mce_flush_rx_buffer(ir, maxp);
1381
1382        /* figure out which firmware/emulator version this hardware has */
1383        mceusb_get_emulator_version(ir);
1384
1385        /* initialize device */
1386        if (ir->flags.microsoft_gen1)
1387                mceusb_gen1_init(ir);
1388        else if (!is_gen3)
1389                mceusb_gen2_init(ir);
1390
1391        mceusb_get_parameters(ir);
1392
1393        mceusb_flash_led(ir);
1394
1395        if (!ir->flags.no_tx)
1396                mceusb_set_tx_mask(ir->rc, MCE_DEFAULT_TX_MASK);
1397
1398        usb_set_intfdata(intf, ir);
1399
1400        /* enable wake via this device */
1401        device_set_wakeup_capable(ir->dev, true);
1402        device_set_wakeup_enable(ir->dev, true);
1403
1404        dev_info(&intf->dev, "Registered %s with mce emulator interface version %x",
1405                name, ir->emver);
1406        dev_info(&intf->dev, "%x tx ports (0x%x cabled) and %x rx sensors (0x%x active)",
1407                 ir->num_txports, ir->txports_cabled,
1408                 ir->num_rxports, ir->rxports_active);
1409
1410        return 0;
1411
1412        /* Error-handling path */
1413rc_dev_fail:
1414        usb_put_dev(ir->usbdev);
1415        usb_free_urb(ir->urb_in);
1416urb_in_alloc_fail:
1417        usb_free_coherent(dev, maxp, ir->buf_in, ir->dma_in);
1418buf_in_alloc_fail:
1419        kfree(ir);
1420mem_alloc_fail:
1421        dev_err(&intf->dev, "%s: device setup failed!", __func__);
1422
1423        return -ENOMEM;
1424}
1425
1426
1427static void mceusb_dev_disconnect(struct usb_interface *intf)
1428{
1429        struct usb_device *dev = interface_to_usbdev(intf);
1430        struct mceusb_dev *ir = usb_get_intfdata(intf);
1431
1432        usb_set_intfdata(intf, NULL);
1433
1434        if (!ir)
1435                return;
1436
1437        ir->usbdev = NULL;
1438        rc_unregister_device(ir->rc);
1439        usb_kill_urb(ir->urb_in);
1440        usb_free_urb(ir->urb_in);
1441        usb_free_coherent(dev, ir->len_in, ir->buf_in, ir->dma_in);
1442        usb_put_dev(dev);
1443
1444        kfree(ir);
1445}
1446
1447static int mceusb_dev_suspend(struct usb_interface *intf, pm_message_t message)
1448{
1449        struct mceusb_dev *ir = usb_get_intfdata(intf);
1450        dev_info(ir->dev, "suspend");
1451        usb_kill_urb(ir->urb_in);
1452        return 0;
1453}
1454
1455static int mceusb_dev_resume(struct usb_interface *intf)
1456{
1457        struct mceusb_dev *ir = usb_get_intfdata(intf);
1458        dev_info(ir->dev, "resume");
1459        if (usb_submit_urb(ir->urb_in, GFP_ATOMIC))
1460                return -EIO;
1461        return 0;
1462}
1463
1464static struct usb_driver mceusb_dev_driver = {
1465        .name =         DRIVER_NAME,
1466        .probe =        mceusb_dev_probe,
1467        .disconnect =   mceusb_dev_disconnect,
1468        .suspend =      mceusb_dev_suspend,
1469        .resume =       mceusb_dev_resume,
1470        .reset_resume = mceusb_dev_resume,
1471        .id_table =     mceusb_dev_table
1472};
1473
1474module_usb_driver(mceusb_dev_driver);
1475
1476MODULE_DESCRIPTION(DRIVER_DESC);
1477MODULE_AUTHOR(DRIVER_AUTHOR);
1478MODULE_LICENSE("GPL");
1479MODULE_DEVICE_TABLE(usb, mceusb_dev_table);
1480