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

source code of linux/drivers/media/usb/ttusb-dec/ttusb_dec.c