linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c
<<
>>
Prefs
   1/*
   2 * TTUSB DEC Driver
   3 *
   4 * Copyright (C) 2003-2004 Alex Woods <linux-dvb@giblets.org>
   5 * IR support by Peter Beutner <p.beutner@gmx.net>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 *
  21 */
  22
  23#include <linux/list.h>
  24#include <linux/module.h>
  25#include <linux/pci.h>
  26#include <linux/slab.h>
  27#include <linux/spinlock.h>
  28#include <linux/usb.h>
  29#include <linux/interrupt.h>
  30#include <linux/firmware.h>
  31#include <linux/crc32.h>
  32#include <linux/init.h>
  33#include <linux/input.h>
  34
  35#include <linux/mutex.h>
  36
  37#include "dmxdev.h"
  38#include "dvb_demux.h"
  39#include "dvb_filter.h"
  40#include "dvb_frontend.h"
  41#include "dvb_net.h"
  42#include "ttusbdecfe.h"
  43
  44static int debug;
  45static int output_pva;
  46static int enable_rc;
  47
  48module_param(debug, int, 0644);
  49MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
  50module_param(output_pva, int, 0444);
  51MODULE_PARM_DESC(output_pva, "Output PVA from dvr device (default:off)");
  52module_param(enable_rc, int, 0644);
  53MODULE_PARM_DESC(enable_rc, "Turn on/off IR remote control(default: off)");
  54
  55#define dprintk if (debug) printk
  56
  57#define DRIVER_NAME             "TechnoTrend/Hauppauge DEC USB"
  58
  59#define COMMAND_PIPE            0x03
  60#define RESULT_PIPE             0x04
  61#define IN_PIPE                 0x08
  62#define OUT_PIPE                0x07
  63#define IRQ_PIPE                0x0A
  64
  65#define COMMAND_PACKET_SIZE     0x3c
  66#define ARM_PACKET_SIZE         0x1000
  67#define IRQ_PACKET_SIZE         0x8
  68
  69#define ISO_BUF_COUNT           0x04
  70#define FRAMES_PER_ISO_BUF      0x04
  71#define ISO_FRAME_SIZE          0x0380
  72
  73#define MAX_PVA_LENGTH          6144
  74
  75enum ttusb_dec_model {
  76        TTUSB_DEC2000T,
  77        TTUSB_DEC2540T,
  78        TTUSB_DEC3000S
  79};
  80
  81enum ttusb_dec_packet_type {
  82        TTUSB_DEC_PACKET_PVA,
  83        TTUSB_DEC_PACKET_SECTION,
  84        TTUSB_DEC_PACKET_EMPTY
  85};
  86
  87enum ttusb_dec_interface {
  88        TTUSB_DEC_INTERFACE_INITIAL,
  89        TTUSB_DEC_INTERFACE_IN,
  90        TTUSB_DEC_INTERFACE_OUT
  91};
  92
  93struct ttusb_dec {
  94        enum ttusb_dec_model            model;
  95        char                            *model_name;
  96        char                            *firmware_name;
  97        int                             can_playback;
  98
  99        /* DVB bits */
 100        struct dvb_adapter              adapter;
 101        struct dmxdev                   dmxdev;
 102        struct dvb_demux                demux;
 103        struct dmx_frontend             frontend;
 104        struct dvb_net                  dvb_net;
 105        struct dvb_frontend*            fe;
 106
 107        u16                     pid[DMX_PES_OTHER];
 108
 109        /* USB bits */
 110        struct usb_device               *udev;
 111        u8                              trans_count;
 112        unsigned int                    command_pipe;
 113        unsigned int                    result_pipe;
 114        unsigned int                    in_pipe;
 115        unsigned int                    out_pipe;
 116        unsigned int                    irq_pipe;
 117        enum ttusb_dec_interface        interface;
 118        struct mutex                    usb_mutex;
 119
 120        void                    *irq_buffer;
 121        struct urb              *irq_urb;
 122        dma_addr_t              irq_dma_handle;
 123        void                    *iso_buffer;
 124        dma_addr_t              iso_dma_handle;
 125        struct urb              *iso_urb[ISO_BUF_COUNT];
 126        int                     iso_stream_count;
 127        struct mutex            iso_mutex;
 128
 129        u8                              packet[MAX_PVA_LENGTH + 4];
 130        enum ttusb_dec_packet_type      packet_type;
 131        int                             packet_state;
 132        int                             packet_length;
 133        int                             packet_payload_length;
 134        u16                             next_packet_id;
 135
 136        int                             pva_stream_count;
 137        int                             filter_stream_count;
 138
 139        struct dvb_filter_pes2ts        a_pes2ts;
 140        struct dvb_filter_pes2ts        v_pes2ts;
 141
 142        u8                      v_pes[16 + MAX_PVA_LENGTH];
 143        int                     v_pes_length;
 144        int                     v_pes_postbytes;
 145
 146        struct list_head        urb_frame_list;
 147        struct tasklet_struct   urb_tasklet;
 148        spinlock_t              urb_frame_list_lock;
 149
 150        struct dvb_demux_filter *audio_filter;
 151        struct dvb_demux_filter *video_filter;
 152        struct list_head        filter_info_list;
 153        spinlock_t              filter_info_list_lock;
 154
 155        struct input_dev        *rc_input_dev;
 156        char                    rc_phys[64];
 157
 158        int                     active; /* Loaded successfully */
 159};
 160
 161struct urb_frame {
 162        u8                      data[ISO_FRAME_SIZE];
 163        int                     length;
 164        struct list_head        urb_frame_list;
 165};
 166
 167struct filter_info {
 168        u8                      stream_id;
 169        struct dvb_demux_filter *filter;
 170        struct list_head        filter_info_list;
 171};
 172
 173static u16 rc_keys[] = {
 174        KEY_POWER,
 175        KEY_MUTE,
 176        KEY_1,
 177        KEY_2,
 178        KEY_3,
 179        KEY_4,
 180        KEY_5,
 181        KEY_6,
 182        KEY_7,
 183        KEY_8,
 184        KEY_9,
 185        KEY_0,
 186        KEY_CHANNELUP,
 187        KEY_VOLUMEDOWN,
 188        KEY_OK,
 189        KEY_VOLUMEUP,
 190        KEY_CHANNELDOWN,
 191        KEY_PREVIOUS,
 192        KEY_ESC,
 193        KEY_RED,
 194        KEY_GREEN,
 195        KEY_YELLOW,
 196        KEY_BLUE,
 197        KEY_OPTION,
 198        KEY_M,
 199        KEY_RADIO
 200};
 201
 202static void ttusb_dec_set_model(struct ttusb_dec *dec,
 203                                enum ttusb_dec_model model);
 204
 205static void ttusb_dec_handle_irq( struct urb *urb)
 206{
 207        struct ttusb_dec * dec = urb->context;
 208        char *buffer = dec->irq_buffer;
 209        int retval;
 210
 211        switch(urb->status) {
 212                case 0: /*success*/
 213                        break;
 214                case -ECONNRESET:
 215                case -ENOENT:
 216                case -ESHUTDOWN:
 217                case -ETIME:
 218                        /* this urb is dead, cleanup */
 219                        dprintk("%s:urb shutting down with status: %d\n",
 220                                        __FUNCTION__, urb->status);
 221                        return;
 222                default:
 223                        dprintk("%s:nonzero status received: %d\n",
 224                                        __FUNCTION__,urb->status);
 225                        goto exit;
 226        }
 227
 228        if( (buffer[0] == 0x1) && (buffer[2] == 0x15) )  {
 229                /* IR - Event */
 230                /* this is an fact a bit too simple implementation;
 231                 * the box also reports a keyrepeat signal
 232                 * (with buffer[3] == 0x40) in an intervall of ~100ms.
 233                 * But to handle this correctly we had to imlemenent some
 234                 * kind of timer which signals a 'key up' event if no
 235                 * keyrepeat signal is recieved for lets say 200ms.
 236                 * this should/could be added later ...
 237                 * for now lets report each signal as a key down and up*/
 238                dprintk("%s:rc signal:%d\n", __FUNCTION__, buffer[4]);
 239                input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 1);
 240                input_sync(dec->rc_input_dev);
 241                input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 0);
 242                input_sync(dec->rc_input_dev);
 243        }
 244
 245exit:   retval = usb_submit_urb(urb, GFP_ATOMIC);
 246        if(retval)
 247                printk("%s - usb_commit_urb failed with result: %d\n",
 248                        __FUNCTION__, retval);
 249}
 250
 251static u16 crc16(u16 crc, const u8 *buf, size_t len)
 252{
 253        u16 tmp;
 254
 255        while (len--) {
 256                crc ^= *buf++;
 257                crc ^= (u8)crc >> 4;
 258                tmp = (u8)crc;
 259                crc ^= (tmp ^ (tmp << 1)) << 4;
 260        }
 261        return crc;
 262}
 263
 264static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
 265                                  int param_length, const u8 params[],
 266                                  int *result_length, u8 cmd_result[])
 267{
 268        int result, actual_len, i;
 269        u8 *b;
 270
 271        dprintk("%s\n", __FUNCTION__);
 272
 273        b = kmalloc(COMMAND_PACKET_SIZE + 4, GFP_KERNEL);
 274        if (!b)
 275                return -ENOMEM;
 276
 277        if ((result = mutex_lock_interruptible(&dec->usb_mutex))) {
 278                kfree(b);
 279                printk("%s: Failed to lock usb mutex.\n", __FUNCTION__);
 280                return result;
 281        }
 282
 283        b[0] = 0xaa;
 284        b[1] = ++dec->trans_count;
 285        b[2] = command;
 286        b[3] = param_length;
 287
 288        if (params)
 289                memcpy(&b[4], params, param_length);
 290
 291        if (debug) {
 292                printk("%s: command: ", __FUNCTION__);
 293                for (i = 0; i < param_length + 4; i++)
 294                        printk("0x%02X ", b[i]);
 295                printk("\n");
 296        }
 297
 298        result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
 299                              COMMAND_PACKET_SIZE + 4, &actual_len, 1000);
 300
 301        if (result) {
 302                printk("%s: command bulk message failed: error %d\n",
 303                       __FUNCTION__, result);
 304                mutex_unlock(&dec->usb_mutex);
 305                kfree(b);
 306                return result;
 307        }
 308
 309        result = usb_bulk_msg(dec->udev, dec->result_pipe, b,
 310                              COMMAND_PACKET_SIZE + 4, &actual_len, 1000);
 311
 312        if (result) {
 313                printk("%s: result bulk message failed: error %d\n",
 314                       __FUNCTION__, result);
 315                mutex_unlock(&dec->usb_mutex);
 316                kfree(b);
 317                return result;
 318        } else {
 319                if (debug) {
 320                        printk("%s: result: ", __FUNCTION__);
 321                        for (i = 0; i < actual_len; i++)
 322                                printk("0x%02X ", b[i]);
 323                        printk("\n");
 324                }
 325
 326                if (result_length)
 327                        *result_length = b[3];
 328                if (cmd_result && b[3] > 0)
 329                        memcpy(cmd_result, &b[4], b[3]);
 330
 331                mutex_unlock(&dec->usb_mutex);
 332
 333                kfree(b);
 334                return 0;
 335        }
 336}
 337
 338static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode,
 339                                    unsigned int *model, unsigned int *version)
 340{
 341        u8 c[COMMAND_PACKET_SIZE];
 342        int c_length;
 343        int result;
 344        unsigned int tmp;
 345
 346        dprintk("%s\n", __FUNCTION__);
 347
 348        result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
 349        if (result)
 350                return result;
 351
 352        if (c_length >= 0x0c) {
 353                if (mode != NULL) {
 354                        memcpy(&tmp, c, 4);
 355                        *mode = ntohl(tmp);
 356                }
 357                if (model != NULL) {
 358                        memcpy(&tmp, &c[4], 4);
 359                        *model = ntohl(tmp);
 360                }
 361                if (version != NULL) {
 362                        memcpy(&tmp, &c[8], 4);
 363                        *version = ntohl(tmp);
 364                }
 365                return 0;
 366        } else {
 367                return -1;
 368        }
 369}
 370
 371static int ttusb_dec_audio_pes2ts_cb(void *priv, unsigned char *data)
 372{
 373        struct ttusb_dec *dec = priv;
 374
 375        dec->audio_filter->feed->cb.ts(data, 188, NULL, 0,
 376                                       &dec->audio_filter->feed->feed.ts,
 377                                       DMX_OK);
 378
 379        return 0;
 380}
 381
 382static int ttusb_dec_video_pes2ts_cb(void *priv, unsigned char *data)
 383{
 384        struct ttusb_dec *dec = priv;
 385
 386        dec->video_filter->feed->cb.ts(data, 188, NULL, 0,
 387                                       &dec->video_filter->feed->feed.ts,
 388                                       DMX_OK);
 389
 390        return 0;
 391}
 392
 393static void ttusb_dec_set_pids(struct ttusb_dec *dec)
 394{
 395        u8 b[] = { 0x00, 0x00, 0x00, 0x00,
 396                   0x00, 0x00, 0xff, 0xff,
 397                   0xff, 0xff, 0xff, 0xff };
 398
 399        u16 pcr = htons(dec->pid[DMX_PES_PCR]);
 400        u16 audio = htons(dec->pid[DMX_PES_AUDIO]);
 401        u16 video = htons(dec->pid[DMX_PES_VIDEO]);
 402
 403        dprintk("%s\n", __FUNCTION__);
 404
 405        memcpy(&b[0], &pcr, 2);
 406        memcpy(&b[2], &audio, 2);
 407        memcpy(&b[4], &video, 2);
 408
 409        ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL);
 410
 411        dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO],
 412                               ttusb_dec_audio_pes2ts_cb, dec);
 413        dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
 414                               ttusb_dec_video_pes2ts_cb, dec);
 415        dec->v_pes_length = 0;
 416        dec->v_pes_postbytes = 0;
 417}
 418
 419static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length)
 420{
 421        if (length < 8) {
 422                printk("%s: packet too short - discarding\n", __FUNCTION__);
 423                return;
 424        }
 425
 426        if (length > 8 + MAX_PVA_LENGTH) {
 427                printk("%s: packet too long - discarding\n", __FUNCTION__);
 428                return;
 429        }
 430
 431        switch (pva[2]) {
 432
 433        case 0x01: {            /* VideoStream */
 434                int prebytes = pva[5] & 0x03;
 435                int postbytes = (pva[5] & 0x0c) >> 2;
 436                u16 v_pes_payload_length;
 437
 438                if (output_pva) {
 439                        dec->video_filter->feed->cb.ts(pva, length, NULL, 0,
 440                                &dec->video_filter->feed->feed.ts, DMX_OK);
 441                        return;
 442                }
 443
 444                if (dec->v_pes_postbytes > 0 &&
 445                    dec->v_pes_postbytes == prebytes) {
 446                        memcpy(&dec->v_pes[dec->v_pes_length],
 447                               &pva[12], prebytes);
 448
 449                        dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
 450                                          dec->v_pes_length + prebytes, 1);
 451                }
 452
 453                if (pva[5] & 0x10) {
 454                        dec->v_pes[7] = 0x80;
 455                        dec->v_pes[8] = 0x05;
 456
 457                        dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5);
 458                        dec->v_pes[10] = ((pva[8] & 0x3f) << 2) |
 459                                         ((pva[9] & 0xc0) >> 6);
 460                        dec->v_pes[11] = 0x01 |
 461                                         ((pva[9] & 0x3f) << 2) |
 462                                         ((pva[10] & 0x80) >> 6);
 463                        dec->v_pes[12] = ((pva[10] & 0x7f) << 1) |
 464                                         ((pva[11] & 0xc0) >> 7);
 465                        dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1);
 466
 467                        memcpy(&dec->v_pes[14], &pva[12 + prebytes],
 468                               length - 12 - prebytes);
 469                        dec->v_pes_length = 14 + length - 12 - prebytes;
 470                } else {
 471                        dec->v_pes[7] = 0x00;
 472                        dec->v_pes[8] = 0x00;
 473
 474                        memcpy(&dec->v_pes[9], &pva[8], length - 8);
 475                        dec->v_pes_length = 9 + length - 8;
 476                }
 477
 478                dec->v_pes_postbytes = postbytes;
 479
 480                if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 &&
 481                    dec->v_pes[10 + dec->v_pes[8]] == 0x00 &&
 482                    dec->v_pes[11 + dec->v_pes[8]] == 0x01)
 483                        dec->v_pes[6] = 0x84;
 484                else
 485                        dec->v_pes[6] = 0x80;
 486
 487                v_pes_payload_length = htons(dec->v_pes_length - 6 +
 488                                             postbytes);
 489                memcpy(&dec->v_pes[4], &v_pes_payload_length, 2);
 490
 491                if (postbytes == 0)
 492                        dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
 493                                          dec->v_pes_length, 1);
 494
 495                break;
 496        }
 497
 498        case 0x02:              /* MainAudioStream */
 499                if (output_pva) {
 500                        dec->audio_filter->feed->cb.ts(pva, length, NULL, 0,
 501                                &dec->audio_filter->feed->feed.ts, DMX_OK);
 502                        return;
 503                }
 504
 505                dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8,
 506                                  pva[5] & 0x10);
 507                break;
 508
 509        default:
 510                printk("%s: unknown PVA type: %02x.\n", __FUNCTION__,
 511                       pva[2]);
 512                break;
 513        }
 514}
 515
 516static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet,
 517                                     int length)
 518{
 519        struct list_head *item;
 520        struct filter_info *finfo;
 521        struct dvb_demux_filter *filter = NULL;
 522        unsigned long flags;
 523        u8 sid;
 524
 525        sid = packet[1];
 526        spin_lock_irqsave(&dec->filter_info_list_lock, flags);
 527        for (item = dec->filter_info_list.next; item != &dec->filter_info_list;
 528             item = item->next) {
 529                finfo = list_entry(item, struct filter_info, filter_info_list);
 530                if (finfo->stream_id == sid) {
 531                        filter = finfo->filter;
 532                        break;
 533                }
 534        }
 535        spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
 536
 537        if (filter)
 538                filter->feed->cb.sec(&packet[2], length - 2, NULL, 0,
 539                                     &filter->filter, DMX_OK);
 540}
 541
 542static void ttusb_dec_process_packet(struct ttusb_dec *dec)
 543{
 544        int i;
 545        u16 csum = 0;
 546        u16 packet_id;
 547
 548        if (dec->packet_length % 2) {
 549                printk("%s: odd sized packet - discarding\n", __FUNCTION__);
 550                return;
 551        }
 552
 553        for (i = 0; i < dec->packet_length; i += 2)
 554                csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]);
 555
 556        if (csum) {
 557                printk("%s: checksum failed - discarding\n", __FUNCTION__);
 558                return;
 559        }
 560
 561        packet_id = dec->packet[dec->packet_length - 4] << 8;
 562        packet_id += dec->packet[dec->packet_length - 3];
 563
 564        if ((packet_id != dec->next_packet_id) && dec->next_packet_id) {
 565                printk("%s: warning: lost packets between %u and %u\n",
 566                       __FUNCTION__, dec->next_packet_id - 1, packet_id);
 567        }
 568
 569        if (packet_id == 0xffff)
 570                dec->next_packet_id = 0x8000;
 571        else
 572                dec->next_packet_id = packet_id + 1;
 573
 574        switch (dec->packet_type) {
 575        case TTUSB_DEC_PACKET_PVA:
 576                if (dec->pva_stream_count)
 577                        ttusb_dec_process_pva(dec, dec->packet,
 578                                              dec->packet_payload_length);
 579                break;
 580
 581        case TTUSB_DEC_PACKET_SECTION:
 582                if (dec->filter_stream_count)
 583                        ttusb_dec_process_filter(dec, dec->packet,
 584                                                 dec->packet_payload_length);
 585                break;
 586
 587        case TTUSB_DEC_PACKET_EMPTY:
 588                break;
 589        }
 590}
 591
 592static void swap_bytes(u8 *b, int length)
 593{
 594        u8 c;
 595
 596        length -= length % 2;
 597        for (; length; b += 2, length -= 2) {
 598                c = *b;
 599                *b = *(b + 1);
 600                *(b + 1) = c;
 601        }
 602}
 603
 604static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b,
 605                                        int length)
 606{
 607        swap_bytes(b, length);
 608
 609        while (length) {
 610                switch (dec->packet_state) {
 611
 612                case 0:
 613                case 1:
 614                case 2:
 615                        if (*b++ == 0xaa)
 616                                dec->packet_state++;
 617                        else
 618                                dec->packet_state = 0;
 619
 620                        length--;
 621                        break;
 622
 623                case 3:
 624                        if (*b == 0x00) {
 625                                dec->packet_state++;
 626                                dec->packet_length = 0;
 627                        } else if (*b != 0xaa) {
 628                                dec->packet_state = 0;
 629                        }
 630
 631                        b++;
 632                        length--;
 633                        break;
 634
 635                case 4:
 636                        dec->packet[dec->packet_length++] = *b++;
 637
 638                        if (dec->packet_length == 2) {
 639                                if (dec->packet[0] == 'A' &&
 640                                    dec->packet[1] == 'V') {
 641                                        dec->packet_type =
 642                                                TTUSB_DEC_PACKET_PVA;
 643                                        dec->packet_state++;
 644                                } else if (dec->packet[0] == 'S') {
 645                                        dec->packet_type =
 646                                                TTUSB_DEC_PACKET_SECTION;
 647                                        dec->packet_state++;
 648                                } else if (dec->packet[0] == 0x00) {
 649                                        dec->packet_type =
 650                                                TTUSB_DEC_PACKET_EMPTY;
 651                                        dec->packet_payload_length = 2;
 652                                        dec->packet_state = 7;
 653                                } else {
 654                                        printk("%s: unknown packet type: "
 655                                               "%02x%02x\n", __FUNCTION__,
 656                                               dec->packet[0], dec->packet[1]);
 657                                        dec->packet_state = 0;
 658                                }
 659                        }
 660
 661                        length--;
 662                        break;
 663
 664                case 5:
 665                        dec->packet[dec->packet_length++] = *b++;
 666
 667                        if (dec->packet_type == TTUSB_DEC_PACKET_PVA &&
 668                            dec->packet_length == 8) {
 669                                dec->packet_state++;
 670                                dec->packet_payload_length = 8 +
 671                                        (dec->packet[6] << 8) +
 672                                        dec->packet[7];
 673                        } else if (dec->packet_type ==
 674                                        TTUSB_DEC_PACKET_SECTION &&
 675                                   dec->packet_length == 5) {
 676                                dec->packet_state++;
 677                                dec->packet_payload_length = 5 +
 678                                        ((dec->packet[3] & 0x0f) << 8) +
 679                                        dec->packet[4];
 680                        }
 681
 682                        length--;
 683                        break;
 684
 685                case 6: {
 686                        int remainder = dec->packet_payload_length -
 687                                        dec->packet_length;
 688
 689                        if (length >= remainder) {
 690                                memcpy(dec->packet + dec->packet_length,
 691                                       b, remainder);
 692                                dec->packet_length += remainder;
 693                                b += remainder;
 694                                length -= remainder;
 695                                dec->packet_state++;
 696                        } else {
 697                                memcpy(&dec->packet[dec->packet_length],
 698                                       b, length);
 699                                dec->packet_length += length;
 700                                length = 0;
 701                        }
 702
 703                        break;
 704                }
 705
 706                case 7: {
 707                        int tail = 4;
 708
 709                        dec->packet[dec->packet_length++] = *b++;
 710
 711                        if (dec->packet_type == TTUSB_DEC_PACKET_SECTION &&
 712                            dec->packet_payload_length % 2)
 713                                tail++;
 714
 715                        if (dec->packet_length ==
 716                            dec->packet_payload_length + tail) {
 717                                ttusb_dec_process_packet(dec);
 718                                dec->packet_state = 0;
 719                        }
 720
 721                        length--;
 722                        break;
 723                }
 724
 725                default:
 726                        printk("%s: illegal packet state encountered.\n",
 727                               __FUNCTION__);
 728                        dec->packet_state = 0;
 729                }
 730        }
 731}
 732
 733static void ttusb_dec_process_urb_frame_list(unsigned long data)
 734{
 735        struct ttusb_dec *dec = (struct ttusb_dec *)data;
 736        struct list_head *item;
 737        struct urb_frame *frame;
 738        unsigned long flags;
 739
 740        while (1) {
 741                spin_lock_irqsave(&dec->urb_frame_list_lock, flags);
 742                if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
 743                        frame = list_entry(item, struct urb_frame,
 744                                           urb_frame_list);
 745                        list_del(&frame->urb_frame_list);
 746                } else {
 747                        spin_unlock_irqrestore(&dec->urb_frame_list_lock,
 748                                               flags);
 749                        return;
 750                }
 751                spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags);
 752
 753                ttusb_dec_process_urb_frame(dec, frame->data, frame->length);
 754                kfree(frame);
 755        }
 756}
 757
 758static void ttusb_dec_process_urb(struct urb *urb)
 759{
 760        struct ttusb_dec *dec = urb->context;
 761
 762        if (!urb->status) {
 763                int i;
 764
 765                for (i = 0; i < FRAMES_PER_ISO_BUF; i++) {
 766                        struct usb_iso_packet_descriptor *d;
 767                        u8 *b;
 768                        int length;
 769                        struct urb_frame *frame;
 770
 771                        d = &urb->iso_frame_desc[i];
 772                        b = urb->transfer_buffer + d->offset;
 773                        length = d->actual_length;
 774
 775                        if ((frame = kmalloc(sizeof(struct urb_frame),
 776                                             GFP_ATOMIC))) {
 777                                unsigned long flags;
 778
 779                                memcpy(frame->data, b, length);
 780                                frame->length = length;
 781
 782                                spin_lock_irqsave(&dec->urb_frame_list_lock,
 783                                                     flags);
 784                                list_add_tail(&frame->urb_frame_list,
 785                                              &dec->urb_frame_list);
 786                                spin_unlock_irqrestore(&dec->urb_frame_list_lock,
 787                                                       flags);
 788
 789                                tasklet_schedule(&dec->urb_tasklet);
 790                        }
 791                }
 792        } else {
 793                 /* -ENOENT is expected when unlinking urbs */
 794                if (urb->status != -ENOENT)
 795                        dprintk("%s: urb error: %d\n", __FUNCTION__,
 796                                urb->status);
 797        }
 798
 799        if (dec->iso_stream_count)
 800                usb_submit_urb(urb, GFP_ATOMIC);
 801}
 802
 803static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
 804{
 805        int i, j, buffer_offset = 0;
 806
 807        dprintk("%s\n", __FUNCTION__);
 808
 809        for (i = 0; i < ISO_BUF_COUNT; i++) {
 810                int frame_offset = 0;
 811                struct urb *urb = dec->iso_urb[i];
 812
 813                urb->dev = dec->udev;
 814                urb->context = dec;
 815                urb->complete = ttusb_dec_process_urb;
 816                urb->pipe = dec->in_pipe;
 817                urb->transfer_flags = URB_ISO_ASAP;
 818                urb->interval = 1;
 819                urb->number_of_packets = FRAMES_PER_ISO_BUF;
 820                urb->transfer_buffer_length = ISO_FRAME_SIZE *
 821                                              FRAMES_PER_ISO_BUF;
 822                urb->transfer_buffer = dec->iso_buffer + buffer_offset;
 823                buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
 824
 825                for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
 826                        urb->iso_frame_desc[j].offset = frame_offset;
 827                        urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
 828                        frame_offset += ISO_FRAME_SIZE;
 829                }
 830        }
 831}
 832
 833static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec)
 834{
 835        int i;
 836
 837        dprintk("%s\n", __FUNCTION__);
 838
 839        if (mutex_lock_interruptible(&dec->iso_mutex))
 840                return;
 841
 842        dec->iso_stream_count--;
 843
 844        if (!dec->iso_stream_count) {
 845                for (i = 0; i < ISO_BUF_COUNT; i++)
 846                        usb_kill_urb(dec->iso_urb[i]);
 847        }
 848
 849        mutex_unlock(&dec->iso_mutex);
 850}
 851
 852/* Setting the interface of the DEC tends to take down the USB communications
 853 * for a short period, so it's important not to call this function just before
 854 * trying to talk to it.
 855 */
 856static int ttusb_dec_set_interface(struct ttusb_dec *dec,
 857                                   enum ttusb_dec_interface interface)
 858{
 859        int result = 0;
 860        u8 b[] = { 0x05 };
 861
 862        if (interface != dec->interface) {
 863                switch (interface) {
 864                case TTUSB_DEC_INTERFACE_INITIAL:
 865                        result = usb_set_interface(dec->udev, 0, 0);
 866                        break;
 867                case TTUSB_DEC_INTERFACE_IN:
 868                        result = ttusb_dec_send_command(dec, 0x80, sizeof(b),
 869                                                        b, NULL, NULL);
 870                        if (result)
 871                                return result;
 872                        result = usb_set_interface(dec->udev, 0, 8);
 873                        break;
 874                case TTUSB_DEC_INTERFACE_OUT:
 875                        result = usb_set_interface(dec->udev, 0, 1);
 876                        break;
 877                }
 878
 879                if (result)
 880                        return result;
 881
 882                dec->interface = interface;
 883        }
 884
 885        return 0;
 886}
 887
 888static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec)
 889{
 890        int i, result;
 891
 892        dprintk("%s\n", __FUNCTION__);
 893
 894        if (mutex_lock_interruptible(&dec->iso_mutex))
 895                return -EAGAIN;
 896
 897        if (!dec->iso_stream_count) {
 898                ttusb_dec_setup_urbs(dec);
 899
 900                dec->packet_state = 0;
 901                dec->v_pes_postbytes = 0;
 902                dec->next_packet_id = 0;
 903
 904                for (i = 0; i < ISO_BUF_COUNT; i++) {
 905                        if ((result = usb_submit_urb(dec->iso_urb[i],
 906                                                     GFP_ATOMIC))) {
 907                                printk("%s: failed urb submission %d: "
 908                                       "error %d\n", __FUNCTION__, i, result);
 909
 910                                while (i) {
 911                                        usb_kill_urb(dec->iso_urb[i - 1]);
 912                                        i--;
 913                                }
 914
 915                                mutex_unlock(&dec->iso_mutex);
 916                                return result;
 917                        }
 918                }
 919        }
 920
 921        dec->iso_stream_count++;
 922
 923        mutex_unlock(&dec->iso_mutex);
 924
 925        return 0;
 926}
 927
 928static int ttusb_dec_start_ts_feed(struct dvb_demux_feed *dvbdmxfeed)
 929{
 930        struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
 931        struct ttusb_dec *dec = dvbdmx->priv;
 932        u8 b0[] = { 0x05 };
 933        int result = 0;
 934
 935        dprintk("%s\n", __FUNCTION__);
 936
 937        dprintk("  ts_type:");
 938
 939        if (dvbdmxfeed->ts_type & TS_DECODER)
 940                dprintk(" TS_DECODER");
 941
 942        if (dvbdmxfeed->ts_type & TS_PACKET)
 943                dprintk(" TS_PACKET");
 944
 945        if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
 946                dprintk(" TS_PAYLOAD_ONLY");
 947
 948        dprintk("\n");
 949
 950        switch (dvbdmxfeed->pes_type) {
 951
 952        case DMX_TS_PES_VIDEO:
 953                dprintk("  pes_type: DMX_TS_PES_VIDEO\n");
 954                dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
 955                dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid;
 956                dec->video_filter = dvbdmxfeed->filter;
 957                ttusb_dec_set_pids(dec);
 958                break;
 959
 960        case DMX_TS_PES_AUDIO:
 961                dprintk("  pes_type: DMX_TS_PES_AUDIO\n");
 962                dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid;
 963                dec->audio_filter = dvbdmxfeed->filter;
 964                ttusb_dec_set_pids(dec);
 965                break;
 966
 967        case DMX_TS_PES_TELETEXT:
 968                dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid;
 969                dprintk("  pes_type: DMX_TS_PES_TELETEXT(not supported)\n");
 970                return -ENOSYS;
 971
 972        case DMX_TS_PES_PCR:
 973                dprintk("  pes_type: DMX_TS_PES_PCR\n");
 974                dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
 975                ttusb_dec_set_pids(dec);
 976                break;
 977
 978        case DMX_TS_PES_OTHER:
 979                dprintk("  pes_type: DMX_TS_PES_OTHER(not supported)\n");
 980                return -ENOSYS;
 981
 982        default:
 983                dprintk("  pes_type: unknown (%d)\n", dvbdmxfeed->pes_type);
 984                return -EINVAL;
 985
 986        }
 987
 988        result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
 989        if (result)
 990                return result;
 991
 992        dec->pva_stream_count++;
 993        return ttusb_dec_start_iso_xfer(dec);
 994}
 995
 996static int ttusb_dec_start_sec_feed(struct dvb_demux_feed *dvbdmxfeed)
 997{
 998        struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
 999        u8 b0[] = { 0x00, 0x00, 0x00, 0x01,
1000                    0x00, 0x00, 0x00, 0x00,
1001                    0x00, 0x00, 0x00, 0x00,
1002                    0x00, 0x00, 0x00, 0x00,
1003                    0x00, 0xff, 0x00, 0x00,
1004                    0x00, 0x00, 0x00, 0x00,
1005                    0x00, 0x00, 0x00, 0x00,
1006                    0x00 };
1007        u16 pid;
1008        u8 c[COMMAND_PACKET_SIZE];
1009        int c_length;
1010        int result;
1011        struct filter_info *finfo;
1012        unsigned long flags;
1013        u8 x = 1;
1014
1015        dprintk("%s\n", __FUNCTION__);
1016
1017        pid = htons(dvbdmxfeed->pid);
1018        memcpy(&b0[0], &pid, 2);
1019        memcpy(&b0[4], &x, 1);
1020        memcpy(&b0[5], &dvbdmxfeed->filter->filter.filter_value[0], 1);
1021
1022        result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0,
1023                                        &c_length, c);
1024
1025        if (!result) {
1026                if (c_length == 2) {
1027                        if (!(finfo = kmalloc(sizeof(struct filter_info),
1028                                              GFP_ATOMIC)))
1029                                return -ENOMEM;
1030
1031                        finfo->stream_id = c[1];
1032                        finfo->filter = dvbdmxfeed->filter;
1033
1034                        spin_lock_irqsave(&dec->filter_info_list_lock, flags);
1035                        list_add_tail(&finfo->filter_info_list,
1036                                      &dec->filter_info_list);
1037                        spin_unlock_irqrestore(&dec->filter_info_list_lock,
1038                                               flags);
1039
1040                        dvbdmxfeed->priv = finfo;
1041
1042                        dec->filter_stream_count++;
1043                        return ttusb_dec_start_iso_xfer(dec);
1044                }
1045
1046                return -EAGAIN;
1047        } else
1048                return result;
1049}
1050
1051static int ttusb_dec_start_feed(struct dvb_demux_feed *dvbdmxfeed)
1052{
1053        struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
1054
1055        dprintk("%s\n", __FUNCTION__);
1056
1057        if (!dvbdmx->dmx.frontend)
1058                return -EINVAL;
1059
1060        dprintk("  pid: 0x%04X\n", dvbdmxfeed->pid);
1061
1062        switch (dvbdmxfeed->type) {
1063
1064        case DMX_TYPE_TS:
1065                return ttusb_dec_start_ts_feed(dvbdmxfeed);
1066                break;
1067
1068        case DMX_TYPE_SEC:
1069                return ttusb_dec_start_sec_feed(dvbdmxfeed);
1070                break;
1071
1072        default:
1073                dprintk("  type: unknown (%d)\n", dvbdmxfeed->type);
1074                return -EINVAL;
1075
1076        }
1077}
1078
1079static int ttusb_dec_stop_ts_feed(struct dvb_demux_feed *dvbdmxfeed)
1080{
1081        struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1082        u8 b0[] = { 0x00 };
1083
1084        ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
1085
1086        dec->pva_stream_count--;
1087
1088        ttusb_dec_stop_iso_xfer(dec);
1089
1090        return 0;
1091}
1092
1093static int ttusb_dec_stop_sec_feed(struct dvb_demux_feed *dvbdmxfeed)
1094{
1095        struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1096        u8 b0[] = { 0x00, 0x00 };
1097        struct filter_info *finfo = (struct filter_info *)dvbdmxfeed->priv;
1098        unsigned long flags;
1099
1100        b0[1] = finfo->stream_id;
1101        spin_lock_irqsave(&dec->filter_info_list_lock, flags);
1102        list_del(&finfo->filter_info_list);
1103        spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
1104        kfree(finfo);
1105        ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL);
1106
1107        dec->filter_stream_count--;
1108
1109        ttusb_dec_stop_iso_xfer(dec);
1110
1111        return 0;
1112}
1113
1114static int ttusb_dec_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
1115{
1116        dprintk("%s\n", __FUNCTION__);
1117
1118        switch (dvbdmxfeed->type) {
1119        case DMX_TYPE_TS:
1120                return ttusb_dec_stop_ts_feed(dvbdmxfeed);
1121                break;
1122
1123        case DMX_TYPE_SEC:
1124                return ttusb_dec_stop_sec_feed(dvbdmxfeed);
1125                break;
1126        }
1127
1128        return 0;
1129}
1130
1131static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec)
1132{
1133        int i;
1134
1135        dprintk("%s\n", __FUNCTION__);
1136
1137        for (i = 0; i < ISO_BUF_COUNT; i++)
1138                usb_free_urb(dec->iso_urb[i]);
1139
1140        pci_free_consistent(NULL,
1141                            ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF *
1142                                              ISO_BUF_COUNT),
1143                            dec->iso_buffer, dec->iso_dma_handle);
1144}
1145
1146static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
1147{
1148        int i;
1149
1150        dprintk("%s\n", __FUNCTION__);
1151
1152        dec->iso_buffer = pci_alloc_consistent(NULL,
1153                                               ISO_FRAME_SIZE *
1154                                               (FRAMES_PER_ISO_BUF *
1155                                                ISO_BUF_COUNT),
1156                                               &dec->iso_dma_handle);
1157
1158        memset(dec->iso_buffer, 0,
1159               ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT));
1160
1161        for (i = 0; i < ISO_BUF_COUNT; i++) {
1162                struct urb *urb;
1163
1164                if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
1165                        ttusb_dec_free_iso_urbs(dec);
1166                        return -ENOMEM;
1167                }
1168
1169                dec->iso_urb[i] = urb;
1170        }
1171
1172        ttusb_dec_setup_urbs(dec);
1173
1174        return 0;
1175}
1176
1177static void ttusb_dec_init_tasklet(struct ttusb_dec *dec)
1178{
1179        spin_lock_init(&dec->urb_frame_list_lock);
1180        INIT_LIST_HEAD(&dec->urb_frame_list);
1181        tasklet_init(&dec->urb_tasklet, ttusb_dec_process_urb_frame_list,
1182                     (unsigned long)dec);
1183}
1184
1185static int ttusb_init_rc( struct ttusb_dec *dec)
1186{
1187        struct input_dev *input_dev;
1188        u8 b[] = { 0x00, 0x01 };
1189        int i;
1190        int err;
1191
1192        usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys));
1193        strlcpy(dec->rc_phys, "/input0", sizeof(dec->rc_phys));
1194
1195        input_dev = input_allocate_device();
1196        if (!input_dev)
1197                return -ENOMEM;
1198
1199        input_dev->name = "ttusb_dec remote control";
1200        input_dev->phys = dec->rc_phys;
1201        input_dev->evbit[0] = BIT_MASK(EV_KEY);
1202        input_dev->keycodesize = sizeof(u16);
1203        input_dev->keycodemax = 0x1a;
1204        input_dev->keycode = rc_keys;
1205
1206        for (i = 0; i < ARRAY_SIZE(rc_keys); i++)
1207                  set_bit(rc_keys[i], input_dev->keybit);
1208
1209        err = input_register_device(input_dev);
1210        if (err) {
1211                input_free_device(input_dev);
1212                return err;
1213        }
1214
1215        dec->rc_input_dev = input_dev;
1216        if (usb_submit_urb(dec->irq_urb, GFP_KERNEL))
1217                printk("%s: usb_submit_urb failed\n",__FUNCTION__);
1218        /* enable irq pipe */
1219        ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL);
1220
1221        return 0;
1222}
1223
1224static void ttusb_dec_init_v_pes(struct ttusb_dec *dec)
1225{
1226        dprintk("%s\n", __FUNCTION__);
1227
1228        dec->v_pes[0] = 0x00;
1229        dec->v_pes[1] = 0x00;
1230        dec->v_pes[2] = 0x01;
1231        dec->v_pes[3] = 0xe0;
1232}
1233
1234static int ttusb_dec_init_usb(struct ttusb_dec *dec)
1235{
1236        dprintk("%s\n", __FUNCTION__);
1237
1238        mutex_init(&dec->usb_mutex);
1239        mutex_init(&dec->iso_mutex);
1240
1241        dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE);
1242        dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE);
1243        dec->in_pipe = usb_rcvisocpipe(dec->udev, IN_PIPE);
1244        dec->out_pipe = usb_sndisocpipe(dec->udev, OUT_PIPE);
1245        dec->irq_pipe = usb_rcvintpipe(dec->udev, IRQ_PIPE);
1246
1247        if(enable_rc) {
1248                dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
1249                if(!dec->irq_urb) {
1250                        return -ENOMEM;
1251                }
1252                dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE,
1253                                        GFP_ATOMIC, &dec->irq_dma_handle);
1254                if(!dec->irq_buffer) {
1255                        return -ENOMEM;
1256                }
1257                usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe,
1258                                 dec->irq_buffer, IRQ_PACKET_SIZE,
1259                                 ttusb_dec_handle_irq, dec, 1);
1260                dec->irq_urb->transfer_dma = dec->irq_dma_handle;
1261                dec->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1262        }
1263
1264        return ttusb_dec_alloc_iso_urbs(dec);
1265}
1266
1267static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
1268{
1269        int i, j, actual_len, result, size, trans_count;
1270        u8 b0[] = { 0x00, 0x00, 0x00, 0x00,
1271                    0x00, 0x00, 0x00, 0x00,
1272                    0x61, 0x00 };
1273        u8 b1[] = { 0x61 };
1274        u8 *b;
1275        char idstring[21];
1276        u8 *firmware = NULL;
1277        size_t firmware_size = 0;
1278        u16 firmware_csum = 0;
1279        u16 firmware_csum_ns;
1280        u32 firmware_size_nl;
1281        u32 crc32_csum, crc32_check, tmp;
1282        const struct firmware *fw_entry = NULL;
1283
1284        dprintk("%s\n", __FUNCTION__);
1285
1286        if (request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev)) {
1287                printk(KERN_ERR "%s: Firmware (%s) unavailable.\n",
1288                       __FUNCTION__, dec->firmware_name);
1289                return 1;
1290        }
1291
1292        firmware = fw_entry->data;
1293        firmware_size = fw_entry->size;
1294
1295        if (firmware_size < 60) {
1296                printk("%s: firmware size too small for DSP code (%zu < 60).\n",
1297                        __FUNCTION__, firmware_size);
1298                release_firmware(fw_entry);
1299                return -1;
1300        }
1301
1302        /* a 32 bit checksum over the first 56 bytes of the DSP Code is stored
1303           at offset 56 of file, so use it to check if the firmware file is
1304           valid. */
1305        crc32_csum = crc32(~0L, firmware, 56) ^ ~0L;
1306        memcpy(&tmp, &firmware[56], 4);
1307        crc32_check = htonl(tmp);
1308        if (crc32_csum != crc32_check) {
1309                printk("%s: crc32 check of DSP code failed (calculated "
1310                       "0x%08x != 0x%08x in file), file invalid.\n",
1311                        __FUNCTION__, crc32_csum, crc32_check);
1312                release_firmware(fw_entry);
1313                return -1;
1314        }
1315        memcpy(idstring, &firmware[36], 20);
1316        idstring[20] = '\0';
1317        printk(KERN_INFO "ttusb_dec: found DSP code \"%s\".\n", idstring);
1318
1319        firmware_size_nl = htonl(firmware_size);
1320        memcpy(b0, &firmware_size_nl, 4);
1321        firmware_csum = crc16(~0, firmware, firmware_size) ^ ~0;
1322        firmware_csum_ns = htons(firmware_csum);
1323        memcpy(&b0[6], &firmware_csum_ns, 2);
1324
1325        result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
1326
1327        if (result) {
1328                release_firmware(fw_entry);
1329                return result;
1330        }
1331
1332        trans_count = 0;
1333        j = 0;
1334
1335        b = kmalloc(ARM_PACKET_SIZE, GFP_KERNEL);
1336        if (b == NULL) {
1337                release_firmware(fw_entry);
1338                return -ENOMEM;
1339        }
1340
1341        for (i = 0; i < firmware_size; i += COMMAND_PACKET_SIZE) {
1342                size = firmware_size - i;
1343                if (size > COMMAND_PACKET_SIZE)
1344                        size = COMMAND_PACKET_SIZE;
1345
1346                b[j + 0] = 0xaa;
1347                b[j + 1] = trans_count++;
1348                b[j + 2] = 0xf0;
1349                b[j + 3] = size;
1350                memcpy(&b[j + 4], &firmware[i], size);
1351
1352                j += COMMAND_PACKET_SIZE + 4;
1353
1354                if (j >= ARM_PACKET_SIZE) {
1355                        result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1356                                              ARM_PACKET_SIZE, &actual_len,
1357                                              100);
1358                        j = 0;
1359                } else if (size < COMMAND_PACKET_SIZE) {
1360                        result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1361                                              j - COMMAND_PACKET_SIZE + size,
1362                                              &actual_len, 100);
1363                }
1364        }
1365
1366        result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL);
1367
1368        release_firmware(fw_entry);
1369        kfree(b);
1370
1371        return result;
1372}
1373
1374static int ttusb_dec_init_stb(struct ttusb_dec *dec)
1375{
1376        int result;
1377        unsigned int mode, model, version;
1378
1379        dprintk("%s\n", __FUNCTION__);
1380
1381        result = ttusb_dec_get_stb_state(dec, &mode, &model, &version);
1382
1383        if (!result) {
1384                if (!mode) {
1385                        if (version == 0xABCDEFAB)
1386                                printk(KERN_INFO "ttusb_dec: no version "
1387                                       "info in Firmware\n");
1388                        else
1389                                printk(KERN_INFO "ttusb_dec: Firmware "
1390                                       "%x.%02x%c%c\n",
1391                                       version >> 24, (version >> 16) & 0xff,
1392                                       (version >> 8) & 0xff, version & 0xff);
1393
1394                        result = ttusb_dec_boot_dsp(dec);
1395                        if (result)
1396                                return result;
1397                        else
1398                                return 1;
1399                } else {
1400                        /* We can't trust the USB IDs that some firmwares
1401                           give the box */
1402                        switch (model) {
1403                        case 0x00070001:
1404                        case 0x00070008:
1405                        case 0x0007000c:
1406                                ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1407                                break;
1408                        case 0x00070009:
1409                        case 0x00070013:
1410                                ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1411                                break;
1412                        case 0x00070011:
1413                                ttusb_dec_set_model(dec, TTUSB_DEC2540T);
1414                                break;
1415                        default:
1416                                printk(KERN_ERR "%s: unknown model returned "
1417                                       "by firmware (%08x) - please report\n",
1418                                       __FUNCTION__, model);
1419                                return -1;
1420                                break;
1421                        }
1422
1423                        if (version >= 0x01770000)
1424                                dec->can_playback = 1;
1425
1426                        return 0;
1427                }
1428        }
1429        else
1430                return result;
1431}
1432
1433static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
1434{
1435        int result;
1436
1437        dprintk("%s\n", __FUNCTION__);
1438
1439        if ((result = dvb_register_adapter(&dec->adapter,
1440                                           dec->model_name, THIS_MODULE, &dec->udev->dev)) < 0) {
1441                printk("%s: dvb_register_adapter failed: error %d\n",
1442                       __FUNCTION__, result);
1443
1444                return result;
1445        }
1446
1447        dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
1448
1449        dec->demux.priv = (void *)dec;
1450        dec->demux.filternum = 31;
1451        dec->demux.feednum = 31;
1452        dec->demux.start_feed = ttusb_dec_start_feed;
1453        dec->demux.stop_feed = ttusb_dec_stop_feed;
1454        dec->demux.write_to_decoder = NULL;
1455
1456        if ((result = dvb_dmx_init(&dec->demux)) < 0) {
1457                printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
1458                       result);
1459
1460                dvb_unregister_adapter(&dec->adapter);
1461
1462                return result;
1463        }
1464
1465        dec->dmxdev.filternum = 32;
1466        dec->dmxdev.demux = &dec->demux.dmx;
1467        dec->dmxdev.capabilities = 0;
1468
1469        if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) {
1470                printk("%s: dvb_dmxdev_init failed: error %d\n",
1471                       __FUNCTION__, result);
1472
1473                dvb_dmx_release(&dec->demux);
1474                dvb_unregister_adapter(&dec->adapter);
1475
1476                return result;
1477        }
1478
1479        dec->frontend.source = DMX_FRONTEND_0;
1480
1481        if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx,
1482                                                  &dec->frontend)) < 0) {
1483                printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
1484                       result);
1485
1486                dvb_dmxdev_release(&dec->dmxdev);
1487                dvb_dmx_release(&dec->demux);
1488                dvb_unregister_adapter(&dec->adapter);
1489
1490                return result;
1491        }
1492
1493        if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx,
1494                                                      &dec->frontend)) < 0) {
1495                printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
1496                       result);
1497
1498                dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
1499                dvb_dmxdev_release(&dec->dmxdev);
1500                dvb_dmx_release(&dec->demux);
1501                dvb_unregister_adapter(&dec->adapter);
1502
1503                return result;
1504        }
1505
1506        dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx);
1507
1508        return 0;
1509}
1510
1511static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
1512{
1513        dprintk("%s\n", __FUNCTION__);
1514
1515        dvb_net_release(&dec->dvb_net);
1516        dec->demux.dmx.close(&dec->demux.dmx);
1517        dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
1518        dvb_dmxdev_release(&dec->dmxdev);
1519        dvb_dmx_release(&dec->demux);
1520        if (dec->fe) {
1521                dvb_unregister_frontend(dec->fe);
1522                if (dec->fe->ops.release)
1523                        dec->fe->ops.release(dec->fe);
1524        }
1525        dvb_unregister_adapter(&dec->adapter);
1526}
1527
1528static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
1529{
1530
1531        dprintk("%s\n", __FUNCTION__);
1532        /* we have to check whether the irq URB is already submitted.
1533          * As the irq is submitted after the interface is changed,
1534          * this is the best method i figured out.
1535          * Any others?*/
1536        if (dec->interface == TTUSB_DEC_INTERFACE_IN)
1537                usb_kill_urb(dec->irq_urb);
1538
1539        usb_free_urb(dec->irq_urb);
1540
1541        usb_buffer_free(dec->udev,IRQ_PACKET_SIZE,
1542                           dec->irq_buffer, dec->irq_dma_handle);
1543
1544        if (dec->rc_input_dev) {
1545                input_unregister_device(dec->rc_input_dev);
1546                dec->rc_input_dev = NULL;
1547        }
1548}
1549
1550
1551static void ttusb_dec_exit_usb(struct ttusb_dec *dec)
1552{
1553        int i;
1554
1555        dprintk("%s\n", __FUNCTION__);
1556
1557        dec->iso_stream_count = 0;
1558
1559        for (i = 0; i < ISO_BUF_COUNT; i++)
1560                usb_kill_urb(dec->iso_urb[i]);
1561
1562        ttusb_dec_free_iso_urbs(dec);
1563}
1564
1565static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec)
1566{
1567        struct list_head *item;
1568        struct urb_frame *frame;
1569
1570        tasklet_kill(&dec->urb_tasklet);
1571
1572        while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
1573                frame = list_entry(item, struct urb_frame, urb_frame_list);
1574                list_del(&frame->urb_frame_list);
1575                kfree(frame);
1576        }
1577}
1578
1579static void ttusb_dec_init_filters(struct ttusb_dec *dec)
1580{
1581        INIT_LIST_HEAD(&dec->filter_info_list);
1582        spin_lock_init(&dec->filter_info_list_lock);
1583}
1584
1585static void ttusb_dec_exit_filters(struct ttusb_dec *dec)
1586{
1587        struct list_head *item;
1588        struct filter_info *finfo;
1589
1590        while ((item = dec->filter_info_list.next) != &dec->filter_info_list) {
1591                finfo = list_entry(item, struct filter_info, filter_info_list);
1592                list_del(&finfo->filter_info_list);
1593                kfree(finfo);
1594        }
1595}
1596
1597static int fe_send_command(struct dvb_frontend* fe, const u8 command,
1598                           int param_length, const u8 params[],
1599                           int *result_length, u8 cmd_result[])
1600{
1601        struct ttusb_dec* dec = fe->dvb->priv;
1602        return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result);
1603}
1604
1605static struct ttusbdecfe_config fe_config = {
1606        .send_command = fe_send_command
1607};
1608
1609static int ttusb_dec_probe(struct usb_interface *intf,
1610                           const struct usb_device_id *id)
1611{
1612        struct usb_device *udev;
1613        struct ttusb_dec *dec;
1614
1615        dprintk("%s\n", __FUNCTION__);
1616
1617        udev = interface_to_usbdev(intf);
1618
1619        if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
1620                printk("%s: couldn't allocate memory.\n", __FUNCTION__);
1621                return -ENOMEM;
1622        }
1623
1624        usb_set_intfdata(intf, (void *)dec);
1625
1626        switch (le16_to_cpu(id->idProduct)) {
1627        case 0x1006:
1628                ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1629                break;
1630
1631        case 0x1008:
1632                ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1633                break;
1634
1635        case 0x1009:
1636                ttusb_dec_set_model(dec, TTUSB_DEC2540T);
1637                break;
1638        }
1639
1640        dec->udev = udev;
1641
1642        if (ttusb_dec_init_usb(dec))
1643                return 0;
1644        if (ttusb_dec_init_stb(dec)) {
1645                ttusb_dec_exit_usb(dec);
1646                return 0;
1647        }
1648        ttusb_dec_init_dvb(dec);
1649
1650        dec->adapter.priv = dec;
1651        switch (le16_to_cpu(id->idProduct)) {
1652        case 0x1006:
1653                dec->fe = ttusbdecfe_dvbs_attach(&fe_config);
1654                break;
1655
1656        case 0x1008:
1657        case 0x1009:
1658                dec->fe = ttusbdecfe_dvbt_attach(&fe_config);
1659                break;
1660        }
1661
1662        if (dec->fe == NULL) {
1663                printk("dvb-ttusb-dec: A frontend driver was not found for device %04x/%04x\n",
1664                       le16_to_cpu(dec->udev->descriptor.idVendor),
1665                       le16_to_cpu(dec->udev->descriptor.idProduct));
1666        } else {
1667                if (dvb_register_frontend(&dec->adapter, dec->fe)) {
1668                        printk("budget-ci: Frontend registration failed!\n");
1669                        if (dec->fe->ops.release)
1670                                dec->fe->ops.release(dec->fe);
1671                        dec->fe = NULL;
1672                }
1673        }
1674
1675        ttusb_dec_init_v_pes(dec);
1676        ttusb_dec_init_filters(dec);
1677        ttusb_dec_init_tasklet(dec);
1678
1679        dec->active = 1;
1680
1681        ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN);
1682
1683        if (enable_rc)
1684                ttusb_init_rc(dec);
1685
1686        return 0;
1687}
1688
1689static void ttusb_dec_disconnect(struct usb_interface *intf)
1690{
1691        struct ttusb_dec *dec = usb_get_intfdata(intf);
1692
1693        usb_set_intfdata(intf, NULL);
1694
1695        dprintk("%s\n", __FUNCTION__);
1696
1697        if (dec->active) {
1698                ttusb_dec_exit_tasklet(dec);
1699                ttusb_dec_exit_filters(dec);
1700                if(enable_rc)
1701                        ttusb_dec_exit_rc(dec);
1702                ttusb_dec_exit_usb(dec);
1703                ttusb_dec_exit_dvb(dec);
1704        }
1705
1706        kfree(dec);
1707}
1708
1709static void ttusb_dec_set_model(struct ttusb_dec *dec,
1710                                enum ttusb_dec_model model)
1711{
1712        dec->model = model;
1713
1714        switch (model) {
1715        case TTUSB_DEC2000T:
1716                dec->model_name = "DEC2000-t";
1717                dec->firmware_name = "dvb-ttusb-dec-2000t.fw";
1718                break;
1719
1720        case TTUSB_DEC2540T:
1721                dec->model_name = "DEC2540-t";
1722                dec->firmware_name = "dvb-ttusb-dec-2540t.fw";
1723                break;
1724
1725        case TTUSB_DEC3000S:
1726                dec->model_name = "DEC3000-s";
1727                dec->firmware_name = "dvb-ttusb-dec-3000s.fw";
1728                break;
1729        }
1730}
1731
1732static struct usb_device_id ttusb_dec_table[] = {
1733        {USB_DEVICE(0x0b48, 0x1006)},   /* DEC3000-s */
1734        /*{USB_DEVICE(0x0b48, 0x1007)},    Unconfirmed */
1735        {USB_DEVICE(0x0b48, 0x1008)},   /* DEC2000-t */
1736        {USB_DEVICE(0x0b48, 0x1009)},   /* DEC2540-t */
1737        {}
1738};
1739
1740static struct usb_driver ttusb_dec_driver = {
1741        .name           = "ttusb-dec",
1742        .probe          = ttusb_dec_probe,
1743        .disconnect     = ttusb_dec_disconnect,
1744        .id_table       = ttusb_dec_table,
1745};
1746
1747static int __init ttusb_dec_init(void)
1748{
1749        int result;
1750
1751        if ((result = usb_register(&ttusb_dec_driver)) < 0) {
1752                printk("%s: initialisation failed: error %d.\n", __FUNCTION__,
1753                       result);
1754                return result;
1755        }
1756
1757        return 0;
1758}
1759
1760static void __exit ttusb_dec_exit(void)
1761{
1762        usb_deregister(&ttusb_dec_driver);
1763}
1764
1765module_init(ttusb_dec_init);
1766module_exit(ttusb_dec_exit);
1767
1768MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org>");
1769MODULE_DESCRIPTION(DRIVER_NAME);
1770MODULE_LICENSE("GPL");
1771MODULE_DEVICE_TABLE(usb, ttusb_dec_table);
1772
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.