Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ttusb_dec.c
Go to the documentation of this file.
1 /*
2  * TTUSB DEC Driver
3  *
4  * Copyright (C) 2003-2004 Alex Woods <[email protected]>
5  * IR support by Peter Beutner <[email protected]>
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 
44 static int debug;
45 static int output_pva;
46 static int enable_rc;
47 
48 module_param(debug, int, 0644);
49 MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
50 module_param(output_pva, int, 0444);
51 MODULE_PARM_DESC(output_pva, "Output PVA from dvr device (default:off)");
52 module_param(enable_rc, int, 0644);
53 MODULE_PARM_DESC(enable_rc, "Turn on/off IR remote control(default: off)");
54 
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 
81 };
82 
87 };
88 
93 };
94 
95 struct ttusb_dec {
97  char *model_name;
100 
101  /* DVB bits */
103  struct dmxdev dmxdev;
104  struct dvb_demux demux;
106  struct dvb_net dvb_net;
107  struct dvb_frontend* fe;
108 
110 
111  /* USB bits */
112  struct usb_device *udev;
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;
120  struct mutex usb_mutex;
121 
122  void *irq_buffer;
123  struct urb *irq_urb;
125  void *iso_buffer;
129  struct mutex iso_mutex;
130 
137 
140 
143 
147 
151 
156 
157  struct input_dev *rc_input_dev;
158  char rc_phys[64];
159 
160  int active; /* Loaded successfully */
161 };
162 
163 struct urb_frame {
165  int length;
167 };
168 
169 struct filter_info {
173 };
174 
175 static 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,
190  KEY_OK,
191  KEY_VOLUMEUP,
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 
204 static void ttusb_dec_set_model(struct ttusb_dec *dec,
205  enum ttusb_dec_model model);
206 
207 static 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 received 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 
247 exit: 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 
253 static 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 
266 static 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 
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 
340 static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode,
341  unsigned int *model, unsigned int *version)
342 {
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 
373 static 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 
384 static 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 
395 static 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]);
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 
414  ttusb_dec_audio_pes2ts_cb, dec);
416  ttusb_dec_video_pes2ts_cb, dec);
417  dec->v_pes_length = 0;
418  dec->v_pes_postbytes = 0;
419 }
420 
421 static 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 
518 static 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];
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 
544 static 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) {
578  if (dec->pva_stream_count)
579  ttusb_dec_process_pva(dec, dec->packet,
580  dec->packet_payload_length);
581  break;
582 
584  if (dec->filter_stream_count)
585  ttusb_dec_process_filter(dec, dec->packet,
586  dec->packet_payload_length);
587  break;
588 
590  break;
591  }
592 }
593 
594 static 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 
606 static 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 =
645  dec->packet_state++;
646  } else if (dec->packet[0] == 'S') {
647  dec->packet_type =
649  dec->packet_state++;
650  } else if (dec->packet[0] == 0x00) {
651  dec->packet_type =
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 ==
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 
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 
735 static 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) {
744  if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
745  frame = list_entry(item, struct urb_frame,
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 
760 static 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 
785  flags);
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)
803 }
804 
805 static 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 *
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 
835 static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec)
836 {
837  int i;
838 
839  dprintk("%s\n", __func__);
840 
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  */
858 static int ttusb_dec_set_interface(struct ttusb_dec *dec,
860 {
861  int result = 0;
862  u8 b[] = { 0x05 };
863 
864  if (interface != dec->interface) {
865  switch (interface) {
867  result = usb_set_interface(dec->udev, 0, 0);
868  break;
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;
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 
890 static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec)
891 {
892  int i, result;
893 
894  dprintk("%s\n", __func__);
895 
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 
930 static 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 
998 static 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;
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 
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 
1053 static 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 
1081 static 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 
1095 static 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;
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 
1116 static 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 
1133 static 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 
1143  ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF *
1144  ISO_BUF_COUNT),
1145  dec->iso_buffer, dec->iso_dma_handle);
1146 }
1147 
1148 static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
1149 {
1150  int i;
1151 
1152  dprintk("%s\n", __func__);
1153 
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 
1185 static void ttusb_dec_init_tasklet(struct ttusb_dec *dec)
1186 {
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 
1193 static 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 
1232 static 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 
1242 static 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  }
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,
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 
1276 static 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 
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 
1384 static 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 
1443 static 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 
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);
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);
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);
1514 
1515  return result;
1516  }
1517 
1518  dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx);
1519 
1520  return 0;
1521 }
1522 
1523 static 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) {
1534  if (dec->fe->ops.release)
1535  dec->fe->ops.release(dec->fe);
1536  }
1538 }
1539 
1540 static 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 
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 
1563 static 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 
1577 static 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 
1591 static void ttusb_dec_init_filters(struct ttusb_dec *dec)
1592 {
1593  INIT_LIST_HEAD(&dec->filter_info_list);
1595 }
1596 
1597 static 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 
1609 static 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 
1617 static struct ttusbdecfe_config fe_config = {
1618  .send_command = fe_send_command
1619 };
1620 
1621 static 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 
1701 static 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 
1721 static 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 
1744 static 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 
1752 static 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 
1759 module_usb_driver(ttusb_dec_driver);
1760 
1761 MODULE_AUTHOR("Alex Woods <[email protected]>");
1763 MODULE_LICENSE("GPL");
1764 MODULE_DEVICE_TABLE(usb, ttusb_dec_table);