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