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