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(dec->rc_input_dev, rc_keys[index - 1], 1);
288			input_sync(dec->rc_input_dev);
289			input_report_key(dec->rc_input_dev, rc_keys[index - 1], 0);
290			input_sync(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(dec->udev, dec->command_pipe, b,
347			      COMMAND_PACKET_SIZE + 4, &actual_len, 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(dec->udev, dec->result_pipe, b,
356			      COMMAND_PACKET_SIZE + 4, &actual_len, 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(&dec->usb_mutex);
376err_free:
377	kfree(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, 0x08, 0, NULL, &c_length, 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, 0x50, sizeof(b), b, NULL, NULL);
451
452	dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO],
453			       ttusb_dec_audio_pes2ts_cb, dec);
454	dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
455			       ttusb_dec_video_pes2ts_cb, 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(&dec->v_pes2ts, dec->v_pes,
491					  dec->v_pes_length + prebytes, 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(&dec->v_pes2ts, dec->v_pes,
534					  dec->v_pes_length, 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(&dec->a_pes2ts, &pva[8], length - 8,
547				  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(&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, dec->packet,
619					      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, dec->packet,
625						 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(&frame->urb_frame_list);
782		} else {
783			spin_unlock_irqrestore(&dec->urb_frame_list_lock,
784					       flags);
785			return;
786		}
787		spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags);
788
789		ttusb_dec_process_urb_frame(dec, frame->data, frame->length);
790		kfree(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(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(&frame->urb_frame_list,
821					      &dec->urb_frame_list);
822				spin_unlock_irqrestore(&dec->urb_frame_list_lock,
823						       flags);
824
825				tasklet_schedule(&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(dec->iso_urb[i]);
883	}
884
885	mutex_unlock(&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(dec->udev, 0, 0);
902			break;
903		case TTUSB_DEC_INTERFACE_IN:
904			result = ttusb_dec_send_command(dec, 0x80, sizeof(b),
905							b, NULL, NULL);
906			if (result)
907				return result;
908			result = usb_set_interface(dec->udev, 0, 8);
909			break;
910		case TTUSB_DEC_INTERFACE_OUT:
911			result = usb_set_interface(dec->udev, 0, 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(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(dec->iso_urb[i - 1]);
948					i--;
949				}
950
951				mutex_unlock(&dec->iso_mutex);
952				return result;
953			}
954		}
955	}
956
957	dec->iso_stream_count++;
958
959	mutex_unlock(&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, 0x80, sizeof(b0), 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, 0x60, sizeof(b0), b0,
1059					&c_length, c);
1060
1061	if (!result) {
1062		if (c_length == 2) {
1063			if (!(finfo = kmalloc(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(&finfo->filter_info_list,
1072				      &dec->filter_info_list);
1073			spin_unlock_irqrestore(&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, 0x81, sizeof(b0), 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(&finfo->filter_info_list);
1137	spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
1138	kfree(finfo);
1139	ttusb_dec_send_command(dec, 0x62, sizeof(b0), 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(dec->iso_urb[i]);
1171	kfree(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(&dec->urb_frame_list);
1205	tasklet_setup(&dec->urb_tasklet, 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(dec->udev, dec->rc_phys, sizeof(dec->rc_phys));
1216	strlcat(dec->rc_phys, "/input0", 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(rc_keys[i], input_dev->keybit);
1231
1232	err = input_register_device(input_dev);
1233	if (err) {
1234		input_free_device(input_dev);
1235		return err;
1236	}
1237
1238	dec->rc_input_dev = input_dev;
1239	if (usb_submit_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,0xb0,sizeof(b),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(0, GFP_KERNEL);
1274		if(!dec->irq_urb) {
1275			return -ENOMEM;
1276		}
1277		dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE,
1278					GFP_KERNEL, &dec->irq_dma_handle);
1279		if(!dec->irq_buffer) {
1280			usb_free_urb(dec->irq_urb);
1281			return -ENOMEM;
1282		}
1283		usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe,
1284				 dec->irq_buffer, IRQ_PACKET_SIZE,
1285				 ttusb_dec_handle_irq, dec, 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(dec->irq_urb);
1293		usb_free_coherent(dec->udev, IRQ_PACKET_SIZE,
1294				  dec->irq_buffer, 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_entry, dec->firmware_name, &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_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_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(~0, firmware, 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, 0x41, sizeof(b0), b0, NULL, NULL);
1359
1360	if (result) {
1361		release_firmware(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_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(dec->udev, dec->command_pipe, b,
1389					      ARM_PACKET_SIZE, &actual_len,
1390					      100);
1391			j = 0;
1392		} else if (size < COMMAND_PACKET_SIZE) {
1393			result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1394					      j - COMMAND_PACKET_SIZE + size,
1395					      &actual_len, 100);
1396		}
1397	}
1398
1399	result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL);
1400
1401	release_firmware(fw_entry);
1402	kfree(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, &model, &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, TTUSB_DEC3000S);
1437			break;
1438		case 0x00070009:
1439		case 0x00070013:
1440			ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1441			break;
1442		case 0x00070011:
1443			ttusb_dec_set_model(dec, 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(&dec->adapter,
1463					   dec->model_name, THIS_MODULE,
1464					   &dec->udev->dev,
1465					   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(&dec->demux)) < 0) {
1482		printk("%s: dvb_dmx_init failed: error %d\n", __func__,
1483		       result);
1484
1485		dvb_unregister_adapter(&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(&dec->dmxdev, &dec->adapter)) < 0) {
1495		printk("%s: dvb_dmxdev_init failed: error %d\n",
1496		       __func__, result);
1497
1498		dvb_dmx_release(&dec->demux);
1499		dvb_unregister_adapter(&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(&dec->dmxdev);
1512		dvb_dmx_release(&dec->demux);
1513		dvb_unregister_adapter(&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(&dec->dmxdev);
1525		dvb_dmx_release(&dec->demux);
1526		dvb_unregister_adapter(&dec->adapter);
1527
1528		return result;
1529	}
1530
1531	dvb_net_init(&dec->adapter, &dec->dvb_net, &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(&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(&dec->dmxdev);
1544	dvb_dmx_release(&dec->demux);
1545	if (dec->fe) {
1546		dvb_unregister_frontend(dec->fe);
1547		dvb_frontend_detach(dec->fe);
1548	}
1549	dvb_unregister_adapter(&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(dec->irq_urb);
1576
1577		usb_free_urb(dec->irq_urb);
1578
1579		usb_free_coherent(dec->udev, IRQ_PACKET_SIZE,
1580				  dec->irq_buffer, 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(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(&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(&frame->urb_frame_list);
1601		kfree(frame);
1602	}
1603}
1604
1605static void ttusb_dec_init_filters(struct ttusb_dec *dec)
1606{
1607	INIT_LIST_HEAD(&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(&finfo->filter_info_list);
1619		kfree(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(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, (void *)dec);
1652
1653	switch (id->idProduct) {
1654	case 0x1006:
1655		ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1656		break;
1657
1658	case 0x1008:
1659		ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1660		break;
1661
1662	case 0x1009:
1663		ttusb_dec_set_model(dec, 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(&fe_config);
1683		break;
1684
1685	case 0x1008:
1686	case 0x1009:
1687		dec->fe = ttusbdecfe_dvbt_attach(&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(&dec->adapter, 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, 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(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(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