1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#define __DVB_CORE__
30
31#include <linux/string.h>
32#include <linux/kernel.h>
33#include <linux/sched.h>
34#include <linux/wait.h>
35#include <linux/slab.h>
36#include <linux/poll.h>
37#include <linux/semaphore.h>
38#include <linux/module.h>
39#include <linux/list.h>
40#include <linux/freezer.h>
41#include <linux/jiffies.h>
42#include <linux/kthread.h>
43#include <asm/processor.h>
44
45#include "dvb_frontend.h"
46#include "dvbdev.h"
47#include <linux/dvb/version.h>
48
49static int dvb_frontend_debug;
50static int dvb_shutdown_timeout;
51static int dvb_force_auto_inversion;
52static int dvb_override_tune_delay;
53static int dvb_powerdown_on_sleep = 1;
54static int dvb_mfe_wait_time = 5;
55
56module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
57MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
58module_param(dvb_shutdown_timeout, int, 0644);
59MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
60module_param(dvb_force_auto_inversion, int, 0644);
61MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
62module_param(dvb_override_tune_delay, int, 0644);
63MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
64module_param(dvb_powerdown_on_sleep, int, 0644);
65MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB voltage off on sleep (default)");
66module_param(dvb_mfe_wait_time, int, 0644);
67MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)");
68
69#define FESTATE_IDLE 1
70#define FESTATE_RETUNE 2
71#define FESTATE_TUNING_FAST 4
72#define FESTATE_TUNING_SLOW 8
73#define FESTATE_TUNED 16
74#define FESTATE_ZIGZAG_FAST 32
75#define FESTATE_ZIGZAG_SLOW 64
76#define FESTATE_DISEQC 128
77#define FESTATE_ERROR 256
78#define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
79#define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
80#define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
81#define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
82
83#define FE_ALGO_HW 1
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99static DEFINE_MUTEX(frontend_mutex);
100
101struct dvb_frontend_private {
102
103
104 struct dvb_device *dvbdev;
105 struct dvb_frontend_parameters parameters_out;
106 struct dvb_fe_events events;
107 struct semaphore sem;
108 struct list_head list_head;
109 wait_queue_head_t wait_queue;
110 struct task_struct *thread;
111 unsigned long release_jiffies;
112 unsigned int wakeup;
113 fe_status_t status;
114 unsigned long tune_mode_flags;
115 unsigned int delay;
116 unsigned int reinitialise;
117 int tone;
118 int voltage;
119
120
121 unsigned int state;
122 unsigned int bending;
123 int lnb_drift;
124 unsigned int inversion;
125 unsigned int auto_step;
126 unsigned int auto_sub_step;
127 unsigned int started_auto_step;
128 unsigned int min_delay;
129 unsigned int max_drift;
130 unsigned int step_size;
131 int quality;
132 unsigned int check_wrapped;
133 enum dvbfe_search algo_status;
134};
135
136static void dvb_frontend_wakeup(struct dvb_frontend *fe);
137static int dtv_get_frontend(struct dvb_frontend *fe,
138 struct dvb_frontend_parameters *p_out);
139static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
140 struct dvb_frontend_parameters *p);
141
142static bool has_get_frontend(struct dvb_frontend *fe)
143{
144 return fe->ops.get_frontend != NULL;
145}
146
147
148
149
150
151
152enum dvbv3_emulation_type {
153 DVBV3_UNKNOWN,
154 DVBV3_QPSK,
155 DVBV3_QAM,
156 DVBV3_OFDM,
157 DVBV3_ATSC,
158};
159
160static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system)
161{
162 switch (delivery_system) {
163 case SYS_DVBC_ANNEX_A:
164 case SYS_DVBC_ANNEX_C:
165 return DVBV3_QAM;
166 case SYS_DVBS:
167 case SYS_DVBS2:
168 case SYS_TURBO:
169 case SYS_ISDBS:
170 case SYS_DSS:
171 return DVBV3_QPSK;
172 case SYS_DVBT:
173 case SYS_DVBT2:
174 case SYS_ISDBT:
175 case SYS_DTMB:
176 return DVBV3_OFDM;
177 case SYS_ATSC:
178 case SYS_ATSCMH:
179 case SYS_DVBC_ANNEX_B:
180 return DVBV3_ATSC;
181 case SYS_UNDEFINED:
182 case SYS_ISDBC:
183 case SYS_DVBH:
184 case SYS_DAB:
185 default:
186
187
188
189
190
191
192 return DVBV3_UNKNOWN;
193 }
194}
195
196static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
197{
198 struct dvb_frontend_private *fepriv = fe->frontend_priv;
199 struct dvb_fe_events *events = &fepriv->events;
200 struct dvb_frontend_event *e;
201 int wp;
202
203 dev_dbg(fe->dvb->device, "%s:\n", __func__);
204
205 if ((status & FE_HAS_LOCK) && has_get_frontend(fe))
206 dtv_get_frontend(fe, &fepriv->parameters_out);
207
208 mutex_lock(&events->mtx);
209
210 wp = (events->eventw + 1) % MAX_EVENT;
211 if (wp == events->eventr) {
212 events->overflow = 1;
213 events->eventr = (events->eventr + 1) % MAX_EVENT;
214 }
215
216 e = &events->events[events->eventw];
217 e->status = status;
218 e->parameters = fepriv->parameters_out;
219
220 events->eventw = wp;
221
222 mutex_unlock(&events->mtx);
223
224 wake_up_interruptible (&events->wait_queue);
225}
226
227static int dvb_frontend_get_event(struct dvb_frontend *fe,
228 struct dvb_frontend_event *event, int flags)
229{
230 struct dvb_frontend_private *fepriv = fe->frontend_priv;
231 struct dvb_fe_events *events = &fepriv->events;
232
233 dev_dbg(fe->dvb->device, "%s:\n", __func__);
234
235 if (events->overflow) {
236 events->overflow = 0;
237 return -EOVERFLOW;
238 }
239
240 if (events->eventw == events->eventr) {
241 int ret;
242
243 if (flags & O_NONBLOCK)
244 return -EWOULDBLOCK;
245
246 up(&fepriv->sem);
247
248 ret = wait_event_interruptible (events->wait_queue,
249 events->eventw != events->eventr);
250
251 if (down_interruptible (&fepriv->sem))
252 return -ERESTARTSYS;
253
254 if (ret < 0)
255 return ret;
256 }
257
258 mutex_lock(&events->mtx);
259 *event = events->events[events->eventr];
260 events->eventr = (events->eventr + 1) % MAX_EVENT;
261 mutex_unlock(&events->mtx);
262
263 return 0;
264}
265
266static void dvb_frontend_clear_events(struct dvb_frontend *fe)
267{
268 struct dvb_frontend_private *fepriv = fe->frontend_priv;
269 struct dvb_fe_events *events = &fepriv->events;
270
271 mutex_lock(&events->mtx);
272 events->eventr = events->eventw;
273 mutex_unlock(&events->mtx);
274}
275
276static void dvb_frontend_init(struct dvb_frontend *fe)
277{
278 dev_dbg(fe->dvb->device,
279 "%s: initialising adapter %i frontend %i (%s)...\n",
280 __func__, fe->dvb->num, fe->id, fe->ops.info.name);
281
282 if (fe->ops.init)
283 fe->ops.init(fe);
284 if (fe->ops.tuner_ops.init) {
285 if (fe->ops.i2c_gate_ctrl)
286 fe->ops.i2c_gate_ctrl(fe, 1);
287 fe->ops.tuner_ops.init(fe);
288 if (fe->ops.i2c_gate_ctrl)
289 fe->ops.i2c_gate_ctrl(fe, 0);
290 }
291}
292
293void dvb_frontend_reinitialise(struct dvb_frontend *fe)
294{
295 struct dvb_frontend_private *fepriv = fe->frontend_priv;
296
297 fepriv->reinitialise = 1;
298 dvb_frontend_wakeup(fe);
299}
300EXPORT_SYMBOL(dvb_frontend_reinitialise);
301
302static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked)
303{
304 int q2;
305 struct dvb_frontend *fe = fepriv->dvbdev->priv;
306
307 dev_dbg(fe->dvb->device, "%s:\n", __func__);
308
309 if (locked)
310 (fepriv->quality) = (fepriv->quality * 220 + 36*256) / 256;
311 else
312 (fepriv->quality) = (fepriv->quality * 220 + 0) / 256;
313
314 q2 = fepriv->quality - 128;
315 q2 *= q2;
316
317 fepriv->delay = fepriv->min_delay + q2 * HZ / (128*128);
318}
319
320
321
322
323
324
325
326
327static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
328{
329 int autoinversion;
330 int ready = 0;
331 int fe_set_err = 0;
332 struct dvb_frontend_private *fepriv = fe->frontend_priv;
333 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
334 int original_inversion = c->inversion;
335 u32 original_frequency = c->frequency;
336
337
338 autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
339 (c->inversion == INVERSION_AUTO));
340
341
342 while(!ready) {
343
344 fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size;
345
346
347 if (fepriv->lnb_drift > fepriv->max_drift) {
348 fepriv->auto_step = 0;
349 fepriv->auto_sub_step = 0;
350 fepriv->lnb_drift = 0;
351 }
352
353
354 switch(fepriv->auto_sub_step) {
355 case 0:
356
357 ready = 1;
358 break;
359
360 case 1:
361 if (!autoinversion) break;
362
363 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
364 ready = 1;
365 break;
366
367 case 2:
368 if (fepriv->lnb_drift == 0) break;
369
370 fepriv->lnb_drift = -fepriv->lnb_drift;
371 ready = 1;
372 break;
373
374 case 3:
375 if (fepriv->lnb_drift == 0) break;
376 if (!autoinversion) break;
377
378 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
379 fepriv->lnb_drift = -fepriv->lnb_drift;
380 ready = 1;
381 break;
382
383 default:
384 fepriv->auto_step++;
385 fepriv->auto_sub_step = -1;
386 break;
387 }
388
389 if (!ready) fepriv->auto_sub_step++;
390 }
391
392
393
394 if ((fepriv->auto_step == fepriv->started_auto_step) &&
395 (fepriv->auto_sub_step == 0) && check_wrapped) {
396 return 1;
397 }
398
399 dev_dbg(fe->dvb->device, "%s: drift:%i inversion:%i auto_step:%i " \
400 "auto_sub_step:%i started_auto_step:%i\n",
401 __func__, fepriv->lnb_drift, fepriv->inversion,
402 fepriv->auto_step, fepriv->auto_sub_step,
403 fepriv->started_auto_step);
404
405
406 c->frequency += fepriv->lnb_drift;
407 if (autoinversion)
408 c->inversion = fepriv->inversion;
409 tmp = *c;
410 if (fe->ops.set_frontend)
411 fe_set_err = fe->ops.set_frontend(fe);
412 *c = tmp;
413 if (fe_set_err < 0) {
414 fepriv->state = FESTATE_ERROR;
415 return fe_set_err;
416 }
417
418 c->frequency = original_frequency;
419 c->inversion = original_inversion;
420
421 fepriv->auto_sub_step++;
422 return 0;
423}
424
425static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
426{
427 fe_status_t s = 0;
428 int retval = 0;
429 struct dvb_frontend_private *fepriv = fe->frontend_priv;
430 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
431
432
433 if (fepriv->state & FESTATE_IDLE) {
434 fepriv->delay = 3*HZ;
435 fepriv->quality = 0;
436 return;
437 }
438
439
440 if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
441 if (fepriv->state & FESTATE_RETUNE) {
442 tmp = *c;
443 if (fe->ops.set_frontend)
444 retval = fe->ops.set_frontend(fe);
445 *c = tmp;
446 if (retval < 0)
447 fepriv->state = FESTATE_ERROR;
448 else
449 fepriv->state = FESTATE_TUNED;
450 }
451 fepriv->delay = 3*HZ;
452 fepriv->quality = 0;
453 return;
454 }
455
456
457 if (fepriv->state & FESTATE_RETUNE) {
458 s = 0;
459 } else {
460 if (fe->ops.read_status)
461 fe->ops.read_status(fe, &s);
462 if (s != fepriv->status) {
463 dvb_frontend_add_event(fe, s);
464 fepriv->status = s;
465 }
466 }
467
468
469 if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
470 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
471 fepriv->state = FESTATE_TUNED;
472
473
474 if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
475 (c->inversion == INVERSION_AUTO)) {
476 c->inversion = fepriv->inversion;
477 }
478 return;
479 }
480
481
482 if (fepriv->state & FESTATE_TUNED) {
483 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
484
485
486 if (s & FE_HAS_LOCK) {
487 return;
488 } else {
489 fepriv->state = FESTATE_ZIGZAG_FAST;
490 fepriv->started_auto_step = fepriv->auto_step;
491 fepriv->check_wrapped = 0;
492 }
493 }
494
495
496
497 if ((fepriv->state & FESTATE_LOSTLOCK) &&
498 (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
499 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
500 return;
501 }
502
503
504
505
506 if (fepriv->state & FESTATE_DISEQC) {
507 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
508 return;
509 }
510
511
512
513
514 if (fepriv->state & FESTATE_RETUNE) {
515 fepriv->lnb_drift = 0;
516 fepriv->auto_step = 0;
517 fepriv->auto_sub_step = 0;
518 fepriv->started_auto_step = 0;
519 fepriv->check_wrapped = 0;
520 }
521
522
523 if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
524 fepriv->delay = fepriv->min_delay;
525
526
527 retval = dvb_frontend_swzigzag_autotune(fe,
528 fepriv->check_wrapped);
529 if (retval < 0) {
530 return;
531 } else if (retval) {
532
533
534 fepriv->state = FESTATE_SEARCHING_SLOW;
535 fepriv->started_auto_step = fepriv->auto_step;
536 return;
537 }
538 fepriv->check_wrapped = 1;
539
540
541
542
543
544 if (fepriv->state & FESTATE_RETUNE) {
545 fepriv->state = FESTATE_TUNING_FAST;
546 }
547 }
548
549
550 if (fepriv->state & FESTATE_SEARCHING_SLOW) {
551 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
552
553
554
555 dvb_frontend_swzigzag_autotune(fe, 0);
556 }
557}
558
559static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
560{
561 struct dvb_frontend_private *fepriv = fe->frontend_priv;
562
563 if (fe->exit != DVB_FE_NO_EXIT)
564 return 1;
565
566 if (fepriv->dvbdev->writers == 1)
567 if (time_after_eq(jiffies, fepriv->release_jiffies +
568 dvb_shutdown_timeout * HZ))
569 return 1;
570
571 return 0;
572}
573
574static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
575{
576 struct dvb_frontend_private *fepriv = fe->frontend_priv;
577
578 if (fepriv->wakeup) {
579 fepriv->wakeup = 0;
580 return 1;
581 }
582 return dvb_frontend_is_exiting(fe);
583}
584
585static void dvb_frontend_wakeup(struct dvb_frontend *fe)
586{
587 struct dvb_frontend_private *fepriv = fe->frontend_priv;
588
589 fepriv->wakeup = 1;
590 wake_up_interruptible(&fepriv->wait_queue);
591}
592
593static int dvb_frontend_thread(void *data)
594{
595 struct dvb_frontend *fe = data;
596 struct dvb_frontend_private *fepriv = fe->frontend_priv;
597 fe_status_t s;
598 enum dvbfe_algo algo;
599
600 bool re_tune = false;
601 bool semheld = false;
602
603 dev_dbg(fe->dvb->device, "%s:\n", __func__);
604
605 fepriv->check_wrapped = 0;
606 fepriv->quality = 0;
607 fepriv->delay = 3*HZ;
608 fepriv->status = 0;
609 fepriv->wakeup = 0;
610 fepriv->reinitialise = 0;
611
612 dvb_frontend_init(fe);
613
614 set_freezable();
615 while (1) {
616 up(&fepriv->sem);
617restart:
618 wait_event_interruptible_timeout(fepriv->wait_queue,
619 dvb_frontend_should_wakeup(fe) || kthread_should_stop()
620 || freezing(current),
621 fepriv->delay);
622
623 if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
624
625 if (!down_interruptible(&fepriv->sem))
626 semheld = true;
627 fe->exit = DVB_FE_NORMAL_EXIT;
628 break;
629 }
630
631 if (try_to_freeze())
632 goto restart;
633
634 if (down_interruptible(&fepriv->sem))
635 break;
636
637 if (fepriv->reinitialise) {
638 dvb_frontend_init(fe);
639 if (fe->ops.set_tone && fepriv->tone != -1)
640 fe->ops.set_tone(fe, fepriv->tone);
641 if (fe->ops.set_voltage && fepriv->voltage != -1)
642 fe->ops.set_voltage(fe, fepriv->voltage);
643 fepriv->reinitialise = 0;
644 }
645
646
647 if (fe->ops.get_frontend_algo) {
648 algo = fe->ops.get_frontend_algo(fe);
649 switch (algo) {
650 case DVBFE_ALGO_HW:
651 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
652
653 if (fepriv->state & FESTATE_RETUNE) {
654 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTATE_RETUNE\n", __func__);
655 re_tune = true;
656 fepriv->state = FESTATE_TUNED;
657 } else {
658 re_tune = false;
659 }
660
661 if (fe->ops.tune)
662 fe->ops.tune(fe, re_tune, fepriv->tune_mode_flags, &fepriv->delay, &s);
663
664 if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
665 dev_dbg(fe->dvb->device, "%s: state changed, adding current state\n", __func__);
666 dvb_frontend_add_event(fe, s);
667 fepriv->status = s;
668 }
669 break;
670 case DVBFE_ALGO_SW:
671 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
672 dvb_frontend_swzigzag(fe);
673 break;
674 case DVBFE_ALGO_CUSTOM:
675 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
676 if (fepriv->state & FESTATE_RETUNE) {
677 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTAT_RETUNE\n", __func__);
678 fepriv->state = FESTATE_TUNED;
679 }
680
681
682
683
684 if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
685 if (fe->ops.search) {
686 fepriv->algo_status = fe->ops.search(fe);
687
688
689
690 } else {
691 fepriv->algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN;
692 }
693 }
694
695 if (fepriv->algo_status != DVBFE_ALGO_SEARCH_SUCCESS) {
696 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
697 fepriv->delay = HZ / 2;
698 }
699 dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
700 fe->ops.read_status(fe, &s);
701 if (s != fepriv->status) {
702 dvb_frontend_add_event(fe, s);
703 fepriv->status = s;
704 if (!(s & FE_HAS_LOCK)) {
705 fepriv->delay = HZ / 10;
706 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
707 } else {
708 fepriv->delay = 60 * HZ;
709 }
710 }
711 break;
712 default:
713 dev_dbg(fe->dvb->device, "%s: UNDEFINED ALGO !\n", __func__);
714 break;
715 }
716 } else {
717 dvb_frontend_swzigzag(fe);
718 }
719 }
720
721 if (dvb_powerdown_on_sleep) {
722 if (fe->ops.set_voltage)
723 fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
724 if (fe->ops.tuner_ops.sleep) {
725 if (fe->ops.i2c_gate_ctrl)
726 fe->ops.i2c_gate_ctrl(fe, 1);
727 fe->ops.tuner_ops.sleep(fe);
728 if (fe->ops.i2c_gate_ctrl)
729 fe->ops.i2c_gate_ctrl(fe, 0);
730 }
731 if (fe->ops.sleep)
732 fe->ops.sleep(fe);
733 }
734
735 fepriv->thread = NULL;
736 if (kthread_should_stop())
737 fe->exit = DVB_FE_DEVICE_REMOVED;
738 else
739 fe->exit = DVB_FE_NO_EXIT;
740 mb();
741
742 if (semheld)
743 up(&fepriv->sem);
744 dvb_frontend_wakeup(fe);
745 return 0;
746}
747
748static void dvb_frontend_stop(struct dvb_frontend *fe)
749{
750 struct dvb_frontend_private *fepriv = fe->frontend_priv;
751
752 dev_dbg(fe->dvb->device, "%s:\n", __func__);
753
754 if (fe->exit != DVB_FE_DEVICE_REMOVED)
755 fe->exit = DVB_FE_NORMAL_EXIT;
756 mb();
757
758 if (!fepriv->thread)
759 return;
760
761 kthread_stop(fepriv->thread);
762
763 sema_init(&fepriv->sem, 1);
764 fepriv->state = FESTATE_IDLE;
765
766
767 if (fepriv->thread)
768 dev_warn(fe->dvb->device,
769 "dvb_frontend_stop: warning: thread %p won't exit\n",
770 fepriv->thread);
771}
772
773s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime)
774{
775 return ((curtime.tv_usec < lasttime.tv_usec) ?
776 1000000 - lasttime.tv_usec + curtime.tv_usec :
777 curtime.tv_usec - lasttime.tv_usec);
778}
779EXPORT_SYMBOL(timeval_usec_diff);
780
781static inline void timeval_usec_add(struct timeval *curtime, u32 add_usec)
782{
783 curtime->tv_usec += add_usec;
784 if (curtime->tv_usec >= 1000000) {
785 curtime->tv_usec -= 1000000;
786 curtime->tv_sec++;
787 }
788}
789
790
791
792
793
794
795
796void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec)
797{
798 struct timeval lasttime;
799 s32 delta, newdelta;
800
801 timeval_usec_add(waketime, add_usec);
802
803 do_gettimeofday(&lasttime);
804 delta = timeval_usec_diff(lasttime, *waketime);
805 if (delta > 2500) {
806 msleep((delta - 1500) / 1000);
807 do_gettimeofday(&lasttime);
808 newdelta = timeval_usec_diff(lasttime, *waketime);
809 delta = (newdelta > delta) ? 0 : newdelta;
810 }
811 if (delta > 0)
812 udelay(delta);
813}
814EXPORT_SYMBOL(dvb_frontend_sleep_until);
815
816static int dvb_frontend_start(struct dvb_frontend *fe)
817{
818 int ret;
819 struct dvb_frontend_private *fepriv = fe->frontend_priv;
820 struct task_struct *fe_thread;
821
822 dev_dbg(fe->dvb->device, "%s:\n", __func__);
823
824 if (fepriv->thread) {
825 if (fe->exit == DVB_FE_NO_EXIT)
826 return 0;
827 else
828 dvb_frontend_stop (fe);
829 }
830
831 if (signal_pending(current))
832 return -EINTR;
833 if (down_interruptible (&fepriv->sem))
834 return -EINTR;
835
836 fepriv->state = FESTATE_IDLE;
837 fe->exit = DVB_FE_NO_EXIT;
838 fepriv->thread = NULL;
839 mb();
840
841 fe_thread = kthread_run(dvb_frontend_thread, fe,
842 "kdvb-ad-%i-fe-%i", fe->dvb->num,fe->id);
843 if (IS_ERR(fe_thread)) {
844 ret = PTR_ERR(fe_thread);
845 dev_warn(fe->dvb->device,
846 "dvb_frontend_start: failed to start kthread (%d)\n",
847 ret);
848 up(&fepriv->sem);
849 return ret;
850 }
851 fepriv->thread = fe_thread;
852 return 0;
853}
854
855static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
856 u32 *freq_min, u32 *freq_max)
857{
858 *freq_min = max(fe->ops.info.frequency_min, fe->ops.tuner_ops.info.frequency_min);
859
860 if (fe->ops.info.frequency_max == 0)
861 *freq_max = fe->ops.tuner_ops.info.frequency_max;
862 else if (fe->ops.tuner_ops.info.frequency_max == 0)
863 *freq_max = fe->ops.info.frequency_max;
864 else
865 *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max);
866
867 if (*freq_min == 0 || *freq_max == 0)
868 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n",
869 fe->dvb->num, fe->id);
870}
871
872static int dvb_frontend_check_parameters(struct dvb_frontend *fe)
873{
874 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
875 u32 freq_min;
876 u32 freq_max;
877
878
879 dvb_frontend_get_frequency_limits(fe, &freq_min, &freq_max);
880 if ((freq_min && c->frequency < freq_min) ||
881 (freq_max && c->frequency > freq_max)) {
882 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
883 fe->dvb->num, fe->id, c->frequency,
884 freq_min, freq_max);
885 return -EINVAL;
886 }
887
888
889 switch (c->delivery_system) {
890 case SYS_DVBS:
891 case SYS_DVBS2:
892 case SYS_TURBO:
893 case SYS_DVBC_ANNEX_A:
894 case SYS_DVBC_ANNEX_C:
895 if ((fe->ops.info.symbol_rate_min &&
896 c->symbol_rate < fe->ops.info.symbol_rate_min) ||
897 (fe->ops.info.symbol_rate_max &&
898 c->symbol_rate > fe->ops.info.symbol_rate_max)) {
899 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
900 fe->dvb->num, fe->id, c->symbol_rate,
901 fe->ops.info.symbol_rate_min,
902 fe->ops.info.symbol_rate_max);
903 return -EINVAL;
904 }
905 default:
906 break;
907 }
908
909 return 0;
910}
911
912static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
913{
914 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
915 int i;
916 u32 delsys;
917
918 delsys = c->delivery_system;
919 memset(c, 0, offsetof(struct dtv_frontend_properties, strength));
920 c->delivery_system = delsys;
921
922 c->state = DTV_CLEAR;
923
924 dev_dbg(fe->dvb->device, "%s: Clearing cache for delivery system %d\n",
925 __func__, c->delivery_system);
926
927 c->transmission_mode = TRANSMISSION_MODE_AUTO;
928 c->bandwidth_hz = 0;
929 c->guard_interval = GUARD_INTERVAL_AUTO;
930 c->hierarchy = HIERARCHY_AUTO;
931 c->symbol_rate = 0;
932 c->code_rate_HP = FEC_AUTO;
933 c->code_rate_LP = FEC_AUTO;
934 c->fec_inner = FEC_AUTO;
935 c->rolloff = ROLLOFF_AUTO;
936 c->voltage = SEC_VOLTAGE_OFF;
937 c->sectone = SEC_TONE_OFF;
938 c->pilot = PILOT_AUTO;
939
940 c->isdbt_partial_reception = 0;
941 c->isdbt_sb_mode = 0;
942 c->isdbt_sb_subchannel = 0;
943 c->isdbt_sb_segment_idx = 0;
944 c->isdbt_sb_segment_count = 0;
945 c->isdbt_layer_enabled = 0;
946 for (i = 0; i < 3; i++) {
947 c->layer[i].fec = FEC_AUTO;
948 c->layer[i].modulation = QAM_AUTO;
949 c->layer[i].interleaving = 0;
950 c->layer[i].segment_count = 0;
951 }
952
953 c->stream_id = NO_STREAM_ID_FILTER;
954
955 switch (c->delivery_system) {
956 case SYS_DVBS:
957 case SYS_DVBS2:
958 case SYS_TURBO:
959 c->modulation = QPSK;
960 c->rolloff = ROLLOFF_35;
961 break;
962 case SYS_ATSC:
963 c->modulation = VSB_8;
964 break;
965 case SYS_ISDBS:
966 c->symbol_rate = 28860000;
967 c->rolloff = ROLLOFF_35;
968 c->bandwidth_hz = c->symbol_rate / 100 * 135;
969 break;
970 default:
971 c->modulation = QAM_AUTO;
972 break;
973 }
974
975 c->lna = LNA_AUTO;
976
977 return 0;
978}
979
980#define _DTV_CMD(n, s, b) \
981[n] = { \
982 .name = #n, \
983 .cmd = n, \
984 .set = s,\
985 .buffer = b \
986}
987
988static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
989 _DTV_CMD(DTV_TUNE, 1, 0),
990 _DTV_CMD(DTV_CLEAR, 1, 0),
991
992
993 _DTV_CMD(DTV_FREQUENCY, 1, 0),
994 _DTV_CMD(DTV_BANDWIDTH_HZ, 1, 0),
995 _DTV_CMD(DTV_MODULATION, 1, 0),
996 _DTV_CMD(DTV_INVERSION, 1, 0),
997 _DTV_CMD(DTV_DISEQC_MASTER, 1, 1),
998 _DTV_CMD(DTV_SYMBOL_RATE, 1, 0),
999 _DTV_CMD(DTV_INNER_FEC, 1, 0),
1000 _DTV_CMD(DTV_VOLTAGE, 1, 0),
1001 _DTV_CMD(DTV_TONE, 1, 0),
1002 _DTV_CMD(DTV_PILOT, 1, 0),
1003 _DTV_CMD(DTV_ROLLOFF, 1, 0),
1004 _DTV_CMD(DTV_DELIVERY_SYSTEM, 1, 0),
1005 _DTV_CMD(DTV_HIERARCHY, 1, 0),
1006 _DTV_CMD(DTV_CODE_RATE_HP, 1, 0),
1007 _DTV_CMD(DTV_CODE_RATE_LP, 1, 0),
1008 _DTV_CMD(DTV_GUARD_INTERVAL, 1, 0),
1009 _DTV_CMD(DTV_TRANSMISSION_MODE, 1, 0),
1010 _DTV_CMD(DTV_INTERLEAVING, 1, 0),
1011
1012 _DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0),
1013 _DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0),
1014 _DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 1, 0),
1015 _DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 1, 0),
1016 _DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 1, 0),
1017 _DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 1, 0),
1018 _DTV_CMD(DTV_ISDBT_LAYERA_FEC, 1, 0),
1019 _DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 1, 0),
1020 _DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 1, 0),
1021 _DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 1, 0),
1022 _DTV_CMD(DTV_ISDBT_LAYERB_FEC, 1, 0),
1023 _DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 1, 0),
1024 _DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 1, 0),
1025 _DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 1, 0),
1026 _DTV_CMD(DTV_ISDBT_LAYERC_FEC, 1, 0),
1027 _DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 1, 0),
1028 _DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 1, 0),
1029 _DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 1, 0),
1030
1031 _DTV_CMD(DTV_STREAM_ID, 1, 0),
1032 _DTV_CMD(DTV_DVBT2_PLP_ID_LEGACY, 1, 0),
1033 _DTV_CMD(DTV_LNA, 1, 0),
1034
1035
1036 _DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
1037 _DTV_CMD(DTV_API_VERSION, 0, 0),
1038
1039 _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
1040
1041 _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
1042 _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
1043
1044 _DTV_CMD(DTV_ATSCMH_FIC_VER, 0, 0),
1045 _DTV_CMD(DTV_ATSCMH_NOG, 0, 0),
1046 _DTV_CMD(DTV_ATSCMH_TNOG, 0, 0),
1047 _DTV_CMD(DTV_ATSCMH_SGN, 0, 0),
1048 _DTV_CMD(DTV_ATSCMH_PRC, 0, 0),
1049 _DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE, 0, 0),
1050 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI, 0, 0),
1051 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC, 0, 0),
1052 _DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE, 0, 0),
1053 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_A, 0, 0),
1054 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
1055 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
1056 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
1057
1058
1059 _DTV_CMD(DTV_STAT_SIGNAL_STRENGTH, 0, 0),
1060 _DTV_CMD(DTV_STAT_CNR, 0, 0),
1061 _DTV_CMD(DTV_STAT_PRE_ERROR_BIT_COUNT, 0, 0),
1062 _DTV_CMD(DTV_STAT_PRE_TOTAL_BIT_COUNT, 0, 0),
1063 _DTV_CMD(DTV_STAT_POST_ERROR_BIT_COUNT, 0, 0),
1064 _DTV_CMD(DTV_STAT_POST_TOTAL_BIT_COUNT, 0, 0),
1065 _DTV_CMD(DTV_STAT_ERROR_BLOCK_COUNT, 0, 0),
1066 _DTV_CMD(DTV_STAT_TOTAL_BLOCK_COUNT, 0, 0),
1067};
1068
1069static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
1070{
1071 int i;
1072
1073 if (tvp->cmd <= 0 || tvp->cmd > DTV_MAX_COMMAND) {
1074 dev_warn(fe->dvb->device, "%s: tvp.cmd = 0x%08x undefined\n",
1075 __func__, tvp->cmd);
1076 return;
1077 }
1078
1079 dev_dbg(fe->dvb->device, "%s: tvp.cmd = 0x%08x (%s)\n", __func__,
1080 tvp->cmd, dtv_cmds[tvp->cmd].name);
1081
1082 if (dtv_cmds[tvp->cmd].buffer) {
1083 dev_dbg(fe->dvb->device, "%s: tvp.u.buffer.len = 0x%02x\n",
1084 __func__, tvp->u.buffer.len);
1085
1086 for(i = 0; i < tvp->u.buffer.len; i++)
1087 dev_dbg(fe->dvb->device,
1088 "%s: tvp.u.buffer.data[0x%02x] = 0x%02x\n",
1089 __func__, i, tvp->u.buffer.data[i]);
1090 } else {
1091 dev_dbg(fe->dvb->device, "%s: tvp.u.data = 0x%08x\n", __func__,
1092 tvp->u.data);
1093 }
1094}
1095
1096
1097
1098
1099
1100static int dtv_property_cache_sync(struct dvb_frontend *fe,
1101 struct dtv_frontend_properties *c,
1102 const struct dvb_frontend_parameters *p)
1103{
1104 c->frequency = p->frequency;
1105 c->inversion = p->inversion;
1106
1107 switch (dvbv3_type(c->delivery_system)) {
1108 case DVBV3_QPSK:
1109 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1110 c->symbol_rate = p->u.qpsk.symbol_rate;
1111 c->fec_inner = p->u.qpsk.fec_inner;
1112 break;
1113 case DVBV3_QAM:
1114 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1115 c->symbol_rate = p->u.qam.symbol_rate;
1116 c->fec_inner = p->u.qam.fec_inner;
1117 c->modulation = p->u.qam.modulation;
1118 break;
1119 case DVBV3_OFDM:
1120 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1121
1122 switch (p->u.ofdm.bandwidth) {
1123 case BANDWIDTH_10_MHZ:
1124 c->bandwidth_hz = 10000000;
1125 break;
1126 case BANDWIDTH_8_MHZ:
1127 c->bandwidth_hz = 8000000;
1128 break;
1129 case BANDWIDTH_7_MHZ:
1130 c->bandwidth_hz = 7000000;
1131 break;
1132 case BANDWIDTH_6_MHZ:
1133 c->bandwidth_hz = 6000000;
1134 break;
1135 case BANDWIDTH_5_MHZ:
1136 c->bandwidth_hz = 5000000;
1137 break;
1138 case BANDWIDTH_1_712_MHZ:
1139 c->bandwidth_hz = 1712000;
1140 break;
1141 case BANDWIDTH_AUTO:
1142 c->bandwidth_hz = 0;
1143 }
1144
1145 c->code_rate_HP = p->u.ofdm.code_rate_HP;
1146 c->code_rate_LP = p->u.ofdm.code_rate_LP;
1147 c->modulation = p->u.ofdm.constellation;
1148 c->transmission_mode = p->u.ofdm.transmission_mode;
1149 c->guard_interval = p->u.ofdm.guard_interval;
1150 c->hierarchy = p->u.ofdm.hierarchy_information;
1151 break;
1152 case DVBV3_ATSC:
1153 dev_dbg(fe->dvb->device, "%s: Preparing ATSC req\n", __func__);
1154 c->modulation = p->u.vsb.modulation;
1155 if (c->delivery_system == SYS_ATSCMH)
1156 break;
1157 if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
1158 c->delivery_system = SYS_ATSC;
1159 else
1160 c->delivery_system = SYS_DVBC_ANNEX_B;
1161 break;
1162 case DVBV3_UNKNOWN:
1163 dev_err(fe->dvb->device,
1164 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
1165 __func__, c->delivery_system);
1166 return -EINVAL;
1167 }
1168
1169 return 0;
1170}
1171
1172
1173
1174
1175static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
1176 struct dvb_frontend_parameters *p)
1177{
1178 const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1179
1180 p->frequency = c->frequency;
1181 p->inversion = c->inversion;
1182
1183 switch (dvbv3_type(c->delivery_system)) {
1184 case DVBV3_UNKNOWN:
1185 dev_err(fe->dvb->device,
1186 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
1187 __func__, c->delivery_system);
1188 return -EINVAL;
1189 case DVBV3_QPSK:
1190 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1191 p->u.qpsk.symbol_rate = c->symbol_rate;
1192 p->u.qpsk.fec_inner = c->fec_inner;
1193 break;
1194 case DVBV3_QAM:
1195 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1196 p->u.qam.symbol_rate = c->symbol_rate;
1197 p->u.qam.fec_inner = c->fec_inner;
1198 p->u.qam.modulation = c->modulation;
1199 break;
1200 case DVBV3_OFDM:
1201 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1202 switch (c->bandwidth_hz) {
1203 case 10000000:
1204 p->u.ofdm.bandwidth = BANDWIDTH_10_MHZ;
1205 break;
1206 case 8000000:
1207 p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1208 break;
1209 case 7000000:
1210 p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1211 break;
1212 case 6000000:
1213 p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1214 break;
1215 case 5000000:
1216 p->u.ofdm.bandwidth = BANDWIDTH_5_MHZ;
1217 break;
1218 case 1712000:
1219 p->u.ofdm.bandwidth = BANDWIDTH_1_712_MHZ;
1220 break;
1221 case 0:
1222 default:
1223 p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1224 }
1225 p->u.ofdm.code_rate_HP = c->code_rate_HP;
1226 p->u.ofdm.code_rate_LP = c->code_rate_LP;
1227 p->u.ofdm.constellation = c->modulation;
1228 p->u.ofdm.transmission_mode = c->transmission_mode;
1229 p->u.ofdm.guard_interval = c->guard_interval;
1230 p->u.ofdm.hierarchy_information = c->hierarchy;
1231 break;
1232 case DVBV3_ATSC:
1233 dev_dbg(fe->dvb->device, "%s: Preparing VSB req\n", __func__);
1234 p->u.vsb.modulation = c->modulation;
1235 break;
1236 }
1237 return 0;
1238}
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250static int dtv_get_frontend(struct dvb_frontend *fe,
1251 struct dvb_frontend_parameters *p_out)
1252{
1253 int r;
1254
1255 if (fe->ops.get_frontend) {
1256 r = fe->ops.get_frontend(fe);
1257 if (unlikely(r < 0))
1258 return r;
1259 if (p_out)
1260 dtv_property_legacy_params_sync(fe, p_out);
1261 return 0;
1262 }
1263
1264
1265 return 0;
1266}
1267
1268static int dvb_frontend_ioctl_legacy(struct file *file,
1269 unsigned int cmd, void *parg);
1270static int dvb_frontend_ioctl_properties(struct file *file,
1271 unsigned int cmd, void *parg);
1272
1273static int dtv_property_process_get(struct dvb_frontend *fe,
1274 const struct dtv_frontend_properties *c,
1275 struct dtv_property *tvp,
1276 struct file *file)
1277{
1278 int r, ncaps;
1279
1280 switch(tvp->cmd) {
1281 case DTV_ENUM_DELSYS:
1282 ncaps = 0;
1283 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1284 tvp->u.buffer.data[ncaps] = fe->ops.delsys[ncaps];
1285 ncaps++;
1286 }
1287 tvp->u.buffer.len = ncaps;
1288 break;
1289 case DTV_FREQUENCY:
1290 tvp->u.data = c->frequency;
1291 break;
1292 case DTV_MODULATION:
1293 tvp->u.data = c->modulation;
1294 break;
1295 case DTV_BANDWIDTH_HZ:
1296 tvp->u.data = c->bandwidth_hz;
1297 break;
1298 case DTV_INVERSION:
1299 tvp->u.data = c->inversion;
1300 break;
1301 case DTV_SYMBOL_RATE:
1302 tvp->u.data = c->symbol_rate;
1303 break;
1304 case DTV_INNER_FEC:
1305 tvp->u.data = c->fec_inner;
1306 break;
1307 case DTV_PILOT:
1308 tvp->u.data = c->pilot;
1309 break;
1310 case DTV_ROLLOFF:
1311 tvp->u.data = c->rolloff;
1312 break;
1313 case DTV_DELIVERY_SYSTEM:
1314 tvp->u.data = c->delivery_system;
1315 break;
1316 case DTV_VOLTAGE:
1317 tvp->u.data = c->voltage;
1318 break;
1319 case DTV_TONE:
1320 tvp->u.data = c->sectone;
1321 break;
1322 case DTV_API_VERSION:
1323 tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
1324 break;
1325 case DTV_CODE_RATE_HP:
1326 tvp->u.data = c->code_rate_HP;
1327 break;
1328 case DTV_CODE_RATE_LP:
1329 tvp->u.data = c->code_rate_LP;
1330 break;
1331 case DTV_GUARD_INTERVAL:
1332 tvp->u.data = c->guard_interval;
1333 break;
1334 case DTV_TRANSMISSION_MODE:
1335 tvp->u.data = c->transmission_mode;
1336 break;
1337 case DTV_HIERARCHY:
1338 tvp->u.data = c->hierarchy;
1339 break;
1340 case DTV_INTERLEAVING:
1341 tvp->u.data = c->interleaving;
1342 break;
1343
1344
1345 case DTV_ISDBT_PARTIAL_RECEPTION:
1346 tvp->u.data = c->isdbt_partial_reception;
1347 break;
1348 case DTV_ISDBT_SOUND_BROADCASTING:
1349 tvp->u.data = c->isdbt_sb_mode;
1350 break;
1351 case DTV_ISDBT_SB_SUBCHANNEL_ID:
1352 tvp->u.data = c->isdbt_sb_subchannel;
1353 break;
1354 case DTV_ISDBT_SB_SEGMENT_IDX:
1355 tvp->u.data = c->isdbt_sb_segment_idx;
1356 break;
1357 case DTV_ISDBT_SB_SEGMENT_COUNT:
1358 tvp->u.data = c->isdbt_sb_segment_count;
1359 break;
1360 case DTV_ISDBT_LAYER_ENABLED:
1361 tvp->u.data = c->isdbt_layer_enabled;
1362 break;
1363 case DTV_ISDBT_LAYERA_FEC:
1364 tvp->u.data = c->layer[0].fec;
1365 break;
1366 case DTV_ISDBT_LAYERA_MODULATION:
1367 tvp->u.data = c->layer[0].modulation;
1368 break;
1369 case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1370 tvp->u.data = c->layer[0].segment_count;
1371 break;
1372 case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1373 tvp->u.data = c->layer[0].interleaving;
1374 break;
1375 case DTV_ISDBT_LAYERB_FEC:
1376 tvp->u.data = c->layer[1].fec;
1377 break;
1378 case DTV_ISDBT_LAYERB_MODULATION:
1379 tvp->u.data = c->layer[1].modulation;
1380 break;
1381 case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1382 tvp->u.data = c->layer[1].segment_count;
1383 break;
1384 case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1385 tvp->u.data = c->layer[1].interleaving;
1386 break;
1387 case DTV_ISDBT_LAYERC_FEC:
1388 tvp->u.data = c->layer[2].fec;
1389 break;
1390 case DTV_ISDBT_LAYERC_MODULATION:
1391 tvp->u.data = c->layer[2].modulation;
1392 break;
1393 case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1394 tvp->u.data = c->layer[2].segment_count;
1395 break;
1396 case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1397 tvp->u.data = c->layer[2].interleaving;
1398 break;
1399
1400
1401 case DTV_STREAM_ID:
1402 case DTV_DVBT2_PLP_ID_LEGACY:
1403 tvp->u.data = c->stream_id;
1404 break;
1405
1406
1407 case DTV_ATSCMH_FIC_VER:
1408 tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
1409 break;
1410 case DTV_ATSCMH_PARADE_ID:
1411 tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
1412 break;
1413 case DTV_ATSCMH_NOG:
1414 tvp->u.data = fe->dtv_property_cache.atscmh_nog;
1415 break;
1416 case DTV_ATSCMH_TNOG:
1417 tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
1418 break;
1419 case DTV_ATSCMH_SGN:
1420 tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
1421 break;
1422 case DTV_ATSCMH_PRC:
1423 tvp->u.data = fe->dtv_property_cache.atscmh_prc;
1424 break;
1425 case DTV_ATSCMH_RS_FRAME_MODE:
1426 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
1427 break;
1428 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1429 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
1430 break;
1431 case DTV_ATSCMH_RS_CODE_MODE_PRI:
1432 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
1433 break;
1434 case DTV_ATSCMH_RS_CODE_MODE_SEC:
1435 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
1436 break;
1437 case DTV_ATSCMH_SCCC_BLOCK_MODE:
1438 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
1439 break;
1440 case DTV_ATSCMH_SCCC_CODE_MODE_A:
1441 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
1442 break;
1443 case DTV_ATSCMH_SCCC_CODE_MODE_B:
1444 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
1445 break;
1446 case DTV_ATSCMH_SCCC_CODE_MODE_C:
1447 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
1448 break;
1449 case DTV_ATSCMH_SCCC_CODE_MODE_D:
1450 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
1451 break;
1452
1453 case DTV_LNA:
1454 tvp->u.data = c->lna;
1455 break;
1456
1457
1458 case DTV_STAT_SIGNAL_STRENGTH:
1459 tvp->u.st = c->strength;
1460 break;
1461 case DTV_STAT_CNR:
1462 tvp->u.st = c->cnr;
1463 break;
1464 case DTV_STAT_PRE_ERROR_BIT_COUNT:
1465 tvp->u.st = c->pre_bit_error;
1466 break;
1467 case DTV_STAT_PRE_TOTAL_BIT_COUNT:
1468 tvp->u.st = c->pre_bit_count;
1469 break;
1470 case DTV_STAT_POST_ERROR_BIT_COUNT:
1471 tvp->u.st = c->post_bit_error;
1472 break;
1473 case DTV_STAT_POST_TOTAL_BIT_COUNT:
1474 tvp->u.st = c->post_bit_count;
1475 break;
1476 case DTV_STAT_ERROR_BLOCK_COUNT:
1477 tvp->u.st = c->block_error;
1478 break;
1479 case DTV_STAT_TOTAL_BLOCK_COUNT:
1480 tvp->u.st = c->block_count;
1481 break;
1482 default:
1483 dev_dbg(fe->dvb->device,
1484 "%s: FE property %d doesn't exist\n",
1485 __func__, tvp->cmd);
1486 return -EINVAL;
1487 }
1488
1489
1490 if (fe->ops.get_property) {
1491 r = fe->ops.get_property(fe, tvp);
1492 if (r < 0)
1493 return r;
1494 }
1495
1496 dtv_property_dump(fe, tvp);
1497
1498 return 0;
1499}
1500
1501static int dtv_set_frontend(struct dvb_frontend *fe);
1502
1503static bool is_dvbv3_delsys(u32 delsys)
1504{
1505 bool status;
1506
1507 status = (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
1508 (delsys == SYS_DVBS) || (delsys == SYS_ATSC);
1509
1510 return status;
1511}
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523static int emulate_delivery_system(struct dvb_frontend *fe, u32 delsys)
1524{
1525 int i;
1526 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1527
1528 c->delivery_system = delsys;
1529
1530
1531
1532
1533 if (c->delivery_system == SYS_ISDBT) {
1534 dev_dbg(fe->dvb->device,
1535 "%s: Using defaults for SYS_ISDBT\n",
1536 __func__);
1537
1538 if (!c->bandwidth_hz)
1539 c->bandwidth_hz = 6000000;
1540
1541 c->isdbt_partial_reception = 0;
1542 c->isdbt_sb_mode = 0;
1543 c->isdbt_sb_subchannel = 0;
1544 c->isdbt_sb_segment_idx = 0;
1545 c->isdbt_sb_segment_count = 0;
1546 c->isdbt_layer_enabled = 7;
1547 for (i = 0; i < 3; i++) {
1548 c->layer[i].fec = FEC_AUTO;
1549 c->layer[i].modulation = QAM_AUTO;
1550 c->layer[i].interleaving = 0;
1551 c->layer[i].segment_count = 0;
1552 }
1553 }
1554 dev_dbg(fe->dvb->device, "%s: change delivery system on cache to %d\n",
1555 __func__, c->delivery_system);
1556
1557 return 0;
1558}
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577static int dvbv5_set_delivery_system(struct dvb_frontend *fe,
1578 u32 desired_system)
1579{
1580 int ncaps;
1581 u32 delsys = SYS_UNDEFINED;
1582 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1583 enum dvbv3_emulation_type type;
1584
1585
1586
1587
1588
1589
1590
1591 if (desired_system == SYS_UNDEFINED)
1592 desired_system = fe->ops.delsys[0];
1593
1594
1595
1596
1597
1598
1599 ncaps = 0;
1600 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1601 if (fe->ops.delsys[ncaps] == desired_system) {
1602 c->delivery_system = desired_system;
1603 dev_dbg(fe->dvb->device,
1604 "%s: Changing delivery system to %d\n",
1605 __func__, desired_system);
1606 return 0;
1607 }
1608 ncaps++;
1609 }
1610
1611
1612
1613
1614
1615
1616
1617
1618 if (!is_dvbv3_delsys(desired_system)) {
1619 dev_dbg(fe->dvb->device,
1620 "%s: Delivery system %d not supported.\n",
1621 __func__, desired_system);
1622 return -EINVAL;
1623 }
1624
1625 type = dvbv3_type(desired_system);
1626
1627
1628
1629
1630
1631 ncaps = 0;
1632 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1633 if (dvbv3_type(fe->ops.delsys[ncaps]) == type)
1634 delsys = fe->ops.delsys[ncaps];
1635 ncaps++;
1636 }
1637
1638
1639 if (delsys == SYS_UNDEFINED) {
1640 dev_dbg(fe->dvb->device,
1641 "%s: Delivery system %d not supported on emulation mode.\n",
1642 __func__, desired_system);
1643 return -EINVAL;
1644 }
1645
1646 dev_dbg(fe->dvb->device,
1647 "%s: Using delivery system %d emulated as if it were %d\n",
1648 __func__, delsys, desired_system);
1649
1650 return emulate_delivery_system(fe, desired_system);
1651}
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681static int dvbv3_set_delivery_system(struct dvb_frontend *fe)
1682{
1683 int ncaps;
1684 u32 delsys = SYS_UNDEFINED;
1685 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1686
1687
1688 if (c->delivery_system == SYS_UNDEFINED)
1689 c->delivery_system = fe->ops.delsys[0];
1690
1691
1692
1693
1694
1695 if (is_dvbv3_delsys(c->delivery_system)) {
1696 dev_dbg(fe->dvb->device,
1697 "%s: Using delivery system to %d\n",
1698 __func__, c->delivery_system);
1699 return 0;
1700 }
1701
1702
1703
1704
1705
1706 ncaps = 0;
1707 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1708 if (dvbv3_type(fe->ops.delsys[ncaps]) != DVBV3_UNKNOWN) {
1709 delsys = fe->ops.delsys[ncaps];
1710 break;
1711 }
1712 ncaps++;
1713 }
1714 if (delsys == SYS_UNDEFINED) {
1715 dev_dbg(fe->dvb->device,
1716 "%s: Couldn't find a delivery system that works with FE_SET_FRONTEND\n",
1717 __func__);
1718 return -EINVAL;
1719 }
1720 return emulate_delivery_system(fe, delsys);
1721}
1722
1723static int dtv_property_process_set(struct dvb_frontend *fe,
1724 struct dtv_property *tvp,
1725 struct file *file)
1726{
1727 int r = 0;
1728 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1729
1730
1731 if (fe->ops.set_property) {
1732 r = fe->ops.set_property(fe, tvp);
1733 if (r < 0)
1734 return r;
1735 }
1736
1737 switch(tvp->cmd) {
1738 case DTV_CLEAR:
1739
1740
1741
1742
1743 dvb_frontend_clear_cache(fe);
1744 break;
1745 case DTV_TUNE:
1746
1747
1748
1749
1750 c->state = tvp->cmd;
1751 dev_dbg(fe->dvb->device, "%s: Finalised property cache\n",
1752 __func__);
1753
1754 r = dtv_set_frontend(fe);
1755 break;
1756 case DTV_FREQUENCY:
1757 c->frequency = tvp->u.data;
1758 break;
1759 case DTV_MODULATION:
1760 c->modulation = tvp->u.data;
1761 break;
1762 case DTV_BANDWIDTH_HZ:
1763 c->bandwidth_hz = tvp->u.data;
1764 break;
1765 case DTV_INVERSION:
1766 c->inversion = tvp->u.data;
1767 break;
1768 case DTV_SYMBOL_RATE:
1769 c->symbol_rate = tvp->u.data;
1770 break;
1771 case DTV_INNER_FEC:
1772 c->fec_inner = tvp->u.data;
1773 break;
1774 case DTV_PILOT:
1775 c->pilot = tvp->u.data;
1776 break;
1777 case DTV_ROLLOFF:
1778 c->rolloff = tvp->u.data;
1779 break;
1780 case DTV_DELIVERY_SYSTEM:
1781 r = dvbv5_set_delivery_system(fe, tvp->u.data);
1782 break;
1783 case DTV_VOLTAGE:
1784 c->voltage = tvp->u.data;
1785 r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE,
1786 (void *)c->voltage);
1787 break;
1788 case DTV_TONE:
1789 c->sectone = tvp->u.data;
1790 r = dvb_frontend_ioctl_legacy(file, FE_SET_TONE,
1791 (void *)c->sectone);
1792 break;
1793 case DTV_CODE_RATE_HP:
1794 c->code_rate_HP = tvp->u.data;
1795 break;
1796 case DTV_CODE_RATE_LP:
1797 c->code_rate_LP = tvp->u.data;
1798 break;
1799 case DTV_GUARD_INTERVAL:
1800 c->guard_interval = tvp->u.data;
1801 break;
1802 case DTV_TRANSMISSION_MODE:
1803 c->transmission_mode = tvp->u.data;
1804 break;
1805 case DTV_HIERARCHY:
1806 c->hierarchy = tvp->u.data;
1807 break;
1808 case DTV_INTERLEAVING:
1809 c->interleaving = tvp->u.data;
1810 break;
1811
1812
1813 case DTV_ISDBT_PARTIAL_RECEPTION:
1814 c->isdbt_partial_reception = tvp->u.data;
1815 break;
1816 case DTV_ISDBT_SOUND_BROADCASTING:
1817 c->isdbt_sb_mode = tvp->u.data;
1818 break;
1819 case DTV_ISDBT_SB_SUBCHANNEL_ID:
1820 c->isdbt_sb_subchannel = tvp->u.data;
1821 break;
1822 case DTV_ISDBT_SB_SEGMENT_IDX:
1823 c->isdbt_sb_segment_idx = tvp->u.data;
1824 break;
1825 case DTV_ISDBT_SB_SEGMENT_COUNT:
1826 c->isdbt_sb_segment_count = tvp->u.data;
1827 break;
1828 case DTV_ISDBT_LAYER_ENABLED:
1829 c->isdbt_layer_enabled = tvp->u.data;
1830 break;
1831 case DTV_ISDBT_LAYERA_FEC:
1832 c->layer[0].fec = tvp->u.data;
1833 break;
1834 case DTV_ISDBT_LAYERA_MODULATION:
1835 c->layer[0].modulation = tvp->u.data;
1836 break;
1837 case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1838 c->layer[0].segment_count = tvp->u.data;
1839 break;
1840 case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1841 c->layer[0].interleaving = tvp->u.data;
1842 break;
1843 case DTV_ISDBT_LAYERB_FEC:
1844 c->layer[1].fec = tvp->u.data;
1845 break;
1846 case DTV_ISDBT_LAYERB_MODULATION:
1847 c->layer[1].modulation = tvp->u.data;
1848 break;
1849 case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1850 c->layer[1].segment_count = tvp->u.data;
1851 break;
1852 case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1853 c->layer[1].interleaving = tvp->u.data;
1854 break;
1855 case DTV_ISDBT_LAYERC_FEC:
1856 c->layer[2].fec = tvp->u.data;
1857 break;
1858 case DTV_ISDBT_LAYERC_MODULATION:
1859 c->layer[2].modulation = tvp->u.data;
1860 break;
1861 case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1862 c->layer[2].segment_count = tvp->u.data;
1863 break;
1864 case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1865 c->layer[2].interleaving = tvp->u.data;
1866 break;
1867
1868
1869 case DTV_STREAM_ID:
1870 case DTV_DVBT2_PLP_ID_LEGACY:
1871 c->stream_id = tvp->u.data;
1872 break;
1873
1874
1875 case DTV_ATSCMH_PARADE_ID:
1876 fe->dtv_property_cache.atscmh_parade_id = tvp->u.data;
1877 break;
1878 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1879 fe->dtv_property_cache.atscmh_rs_frame_ensemble = tvp->u.data;
1880 break;
1881
1882 case DTV_LNA:
1883 c->lna = tvp->u.data;
1884 if (fe->ops.set_lna)
1885 r = fe->ops.set_lna(fe);
1886 if (r < 0)
1887 c->lna = LNA_AUTO;
1888 break;
1889
1890 default:
1891 return -EINVAL;
1892 }
1893
1894 return r;
1895}
1896
1897static int dvb_frontend_ioctl(struct file *file,
1898 unsigned int cmd, void *parg)
1899{
1900 struct dvb_device *dvbdev = file->private_data;
1901 struct dvb_frontend *fe = dvbdev->priv;
1902 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1903 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1904 int err = -EOPNOTSUPP;
1905
1906 dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
1907 if (down_interruptible(&fepriv->sem))
1908 return -ERESTARTSYS;
1909
1910 if (fe->exit != DVB_FE_NO_EXIT) {
1911 up(&fepriv->sem);
1912 return -ENODEV;
1913 }
1914
1915 if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
1916 (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
1917 cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
1918 up(&fepriv->sem);
1919 return -EPERM;
1920 }
1921
1922 if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
1923 err = dvb_frontend_ioctl_properties(file, cmd, parg);
1924 else {
1925 c->state = DTV_UNDEFINED;
1926 err = dvb_frontend_ioctl_legacy(file, cmd, parg);
1927 }
1928
1929 up(&fepriv->sem);
1930 return err;
1931}
1932
1933static int dvb_frontend_ioctl_properties(struct file *file,
1934 unsigned int cmd, void *parg)
1935{
1936 struct dvb_device *dvbdev = file->private_data;
1937 struct dvb_frontend *fe = dvbdev->priv;
1938 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1939 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1940 int err = 0;
1941
1942 struct dtv_properties *tvps = parg;
1943 struct dtv_property *tvp = NULL;
1944 int i;
1945
1946 dev_dbg(fe->dvb->device, "%s:\n", __func__);
1947
1948 if (cmd == FE_SET_PROPERTY) {
1949 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
1950 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
1951
1952
1953
1954 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1955 return -EINVAL;
1956
1957 tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1958 if (!tvp) {
1959 err = -ENOMEM;
1960 goto out;
1961 }
1962
1963 if (copy_from_user(tvp, (void __user *)tvps->props,
1964 tvps->num * sizeof(struct dtv_property))) {
1965 err = -EFAULT;
1966 goto out;
1967 }
1968
1969 for (i = 0; i < tvps->num; i++) {
1970 err = dtv_property_process_set(fe, tvp + i, file);
1971 if (err < 0)
1972 goto out;
1973 (tvp + i)->result = err;
1974 }
1975
1976 if (c->state == DTV_TUNE)
1977 dev_dbg(fe->dvb->device, "%s: Property cache is full, tuning\n", __func__);
1978
1979 } else if (cmd == FE_GET_PROPERTY) {
1980 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
1981 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
1982
1983
1984
1985 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1986 return -EINVAL;
1987
1988 tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1989 if (!tvp) {
1990 err = -ENOMEM;
1991 goto out;
1992 }
1993
1994 if (copy_from_user(tvp, (void __user *)tvps->props,
1995 tvps->num * sizeof(struct dtv_property))) {
1996 err = -EFAULT;
1997 goto out;
1998 }
1999
2000
2001
2002
2003
2004
2005 if (fepriv->state != FESTATE_IDLE) {
2006 err = dtv_get_frontend(fe, NULL);
2007 if (err < 0)
2008 goto out;
2009 }
2010 for (i = 0; i < tvps->num; i++) {
2011 err = dtv_property_process_get(fe, c, tvp + i, file);
2012 if (err < 0)
2013 goto out;
2014 (tvp + i)->result = err;
2015 }
2016
2017 if (copy_to_user((void __user *)tvps->props, tvp,
2018 tvps->num * sizeof(struct dtv_property))) {
2019 err = -EFAULT;
2020 goto out;
2021 }
2022
2023 } else
2024 err = -EOPNOTSUPP;
2025
2026out:
2027 kfree(tvp);
2028 return err;
2029}
2030
2031static int dtv_set_frontend(struct dvb_frontend *fe)
2032{
2033 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2034 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2035 struct dvb_frontend_tune_settings fetunesettings;
2036 u32 rolloff = 0;
2037
2038 if (dvb_frontend_check_parameters(fe) < 0)
2039 return -EINVAL;
2040
2041
2042
2043
2044
2045
2046 dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067 switch (c->delivery_system) {
2068 case SYS_ATSC:
2069 case SYS_DVBC_ANNEX_B:
2070 c->bandwidth_hz = 6000000;
2071 break;
2072 case SYS_DVBC_ANNEX_A:
2073 rolloff = 115;
2074 break;
2075 case SYS_DVBC_ANNEX_C:
2076 rolloff = 113;
2077 break;
2078 case SYS_DVBS:
2079 case SYS_TURBO:
2080 case SYS_ISDBS:
2081 rolloff = 135;
2082 break;
2083 case SYS_DVBS2:
2084 switch (c->rolloff) {
2085 case ROLLOFF_20:
2086 rolloff = 120;
2087 break;
2088 case ROLLOFF_25:
2089 rolloff = 125;
2090 break;
2091 default:
2092 case ROLLOFF_35:
2093 rolloff = 135;
2094 }
2095 break;
2096 default:
2097 break;
2098 }
2099 if (rolloff)
2100 c->bandwidth_hz = (c->symbol_rate * rolloff) / 100;
2101
2102
2103 if (dvb_force_auto_inversion)
2104 c->inversion = INVERSION_AUTO;
2105
2106
2107
2108
2109
2110 if (c->hierarchy == HIERARCHY_NONE && c->code_rate_LP == FEC_NONE)
2111 c->code_rate_LP = FEC_AUTO;
2112
2113
2114 memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
2115 if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
2116 fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
2117 fepriv->max_drift = fetunesettings.max_drift;
2118 fepriv->step_size = fetunesettings.step_size;
2119 } else {
2120
2121 switch (c->delivery_system) {
2122 case SYS_DVBS:
2123 case SYS_DVBS2:
2124 case SYS_ISDBS:
2125 case SYS_TURBO:
2126 case SYS_DVBC_ANNEX_A:
2127 case SYS_DVBC_ANNEX_C:
2128 fepriv->min_delay = HZ / 20;
2129 fepriv->step_size = c->symbol_rate / 16000;
2130 fepriv->max_drift = c->symbol_rate / 2000;
2131 break;
2132 case SYS_DVBT:
2133 case SYS_DVBT2:
2134 case SYS_ISDBT:
2135 case SYS_DTMB:
2136 fepriv->min_delay = HZ / 20;
2137 fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
2138 fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
2139 break;
2140 default:
2141
2142
2143
2144
2145 fepriv->min_delay = HZ / 20;
2146 fepriv->step_size = 0;
2147 fepriv->max_drift = 0;
2148 break;
2149 }
2150 }
2151 if (dvb_override_tune_delay > 0)
2152 fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
2153
2154 fepriv->state = FESTATE_RETUNE;
2155
2156
2157 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
2158
2159 dvb_frontend_clear_events(fe);
2160 dvb_frontend_add_event(fe, 0);
2161 dvb_frontend_wakeup(fe);
2162 fepriv->status = 0;
2163
2164 return 0;
2165}
2166
2167
2168static int dvb_frontend_ioctl_legacy(struct file *file,
2169 unsigned int cmd, void *parg)
2170{
2171 struct dvb_device *dvbdev = file->private_data;
2172 struct dvb_frontend *fe = dvbdev->priv;
2173 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2174 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2175 int err = -EOPNOTSUPP;
2176
2177 switch (cmd) {
2178 case FE_GET_INFO: {
2179 struct dvb_frontend_info* info = parg;
2180
2181 memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info));
2182 dvb_frontend_get_frequency_limits(fe, &info->frequency_min, &info->frequency_max);
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195 switch (dvbv3_type(c->delivery_system)) {
2196 case DVBV3_QPSK:
2197 info->type = FE_QPSK;
2198 break;
2199 case DVBV3_ATSC:
2200 info->type = FE_ATSC;
2201 break;
2202 case DVBV3_QAM:
2203 info->type = FE_QAM;
2204 break;
2205 case DVBV3_OFDM:
2206 info->type = FE_OFDM;
2207 break;
2208 default:
2209 dev_err(fe->dvb->device,
2210 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
2211 __func__, c->delivery_system);
2212 fe->ops.info.type = FE_OFDM;
2213 }
2214 dev_dbg(fe->dvb->device, "%s: current delivery system on cache: %d, V3 type: %d\n",
2215 __func__, c->delivery_system, fe->ops.info.type);
2216
2217
2218
2219 info->caps |= FE_CAN_INVERSION_AUTO;
2220 err = 0;
2221 break;
2222 }
2223
2224 case FE_READ_STATUS: {
2225 fe_status_t* status = parg;
2226
2227
2228
2229 if (fepriv->state == FESTATE_RETUNE ||
2230 fepriv->state == FESTATE_ERROR) {
2231 err=0;
2232 *status = 0;
2233 break;
2234 }
2235
2236 if (fe->ops.read_status)
2237 err = fe->ops.read_status(fe, status);
2238 break;
2239 }
2240
2241 case FE_READ_BER:
2242 if (fe->ops.read_ber) {
2243 if (fepriv->thread)
2244 err = fe->ops.read_ber(fe, (__u32 *) parg);
2245 else
2246 err = -EAGAIN;
2247 }
2248 break;
2249
2250 case FE_READ_SIGNAL_STRENGTH:
2251 if (fe->ops.read_signal_strength) {
2252 if (fepriv->thread)
2253 err = fe->ops.read_signal_strength(fe, (__u16 *) parg);
2254 else
2255 err = -EAGAIN;
2256 }
2257 break;
2258
2259 case FE_READ_SNR:
2260 if (fe->ops.read_snr) {
2261 if (fepriv->thread)
2262 err = fe->ops.read_snr(fe, (__u16 *) parg);
2263 else
2264 err = -EAGAIN;
2265 }
2266 break;
2267
2268 case FE_READ_UNCORRECTED_BLOCKS:
2269 if (fe->ops.read_ucblocks) {
2270 if (fepriv->thread)
2271 err = fe->ops.read_ucblocks(fe, (__u32 *) parg);
2272 else
2273 err = -EAGAIN;
2274 }
2275 break;
2276
2277 case FE_DISEQC_RESET_OVERLOAD:
2278 if (fe->ops.diseqc_reset_overload) {
2279 err = fe->ops.diseqc_reset_overload(fe);
2280 fepriv->state = FESTATE_DISEQC;
2281 fepriv->status = 0;
2282 }
2283 break;
2284
2285 case FE_DISEQC_SEND_MASTER_CMD:
2286 if (fe->ops.diseqc_send_master_cmd) {
2287 err = fe->ops.diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg);
2288 fepriv->state = FESTATE_DISEQC;
2289 fepriv->status = 0;
2290 }
2291 break;
2292
2293 case FE_DISEQC_SEND_BURST:
2294 if (fe->ops.diseqc_send_burst) {
2295 err = fe->ops.diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg);
2296 fepriv->state = FESTATE_DISEQC;
2297 fepriv->status = 0;
2298 }
2299 break;
2300
2301 case FE_SET_TONE:
2302 if (fe->ops.set_tone) {
2303 err = fe->ops.set_tone(fe, (fe_sec_tone_mode_t) parg);
2304 fepriv->tone = (fe_sec_tone_mode_t) parg;
2305 fepriv->state = FESTATE_DISEQC;
2306 fepriv->status = 0;
2307 }
2308 break;
2309
2310 case FE_SET_VOLTAGE:
2311 if (fe->ops.set_voltage) {
2312 err = fe->ops.set_voltage(fe, (fe_sec_voltage_t) parg);
2313 fepriv->voltage = (fe_sec_voltage_t) parg;
2314 fepriv->state = FESTATE_DISEQC;
2315 fepriv->status = 0;
2316 }
2317 break;
2318
2319 case FE_DISHNETWORK_SEND_LEGACY_CMD:
2320 if (fe->ops.dishnetwork_send_legacy_command) {
2321 err = fe->ops.dishnetwork_send_legacy_command(fe, (unsigned long) parg);
2322 fepriv->state = FESTATE_DISEQC;
2323 fepriv->status = 0;
2324 } else if (fe->ops.set_voltage) {
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341 unsigned long swcmd = ((unsigned long) parg) << 1;
2342 struct timeval nexttime;
2343 struct timeval tv[10];
2344 int i;
2345 u8 last = 1;
2346 if (dvb_frontend_debug)
2347 printk("%s switch command: 0x%04lx\n", __func__, swcmd);
2348 do_gettimeofday(&nexttime);
2349 if (dvb_frontend_debug)
2350 tv[0] = nexttime;
2351
2352
2353
2354 fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
2355 dvb_frontend_sleep_until(&nexttime, 32000);
2356
2357 for (i = 0; i < 9; i++) {
2358 if (dvb_frontend_debug)
2359 do_gettimeofday(&tv[i + 1]);
2360 if ((swcmd & 0x01) != last) {
2361
2362 fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
2363 last = (last) ? 0 : 1;
2364 }
2365 swcmd = swcmd >> 1;
2366 if (i != 8)
2367 dvb_frontend_sleep_until(&nexttime, 8000);
2368 }
2369 if (dvb_frontend_debug) {
2370 printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
2371 __func__, fe->dvb->num);
2372 for (i = 1; i < 10; i++)
2373 printk("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i]));
2374 }
2375 err = 0;
2376 fepriv->state = FESTATE_DISEQC;
2377 fepriv->status = 0;
2378 }
2379 break;
2380
2381 case FE_DISEQC_RECV_SLAVE_REPLY:
2382 if (fe->ops.diseqc_recv_slave_reply)
2383 err = fe->ops.diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
2384 break;
2385
2386 case FE_ENABLE_HIGH_LNB_VOLTAGE:
2387 if (fe->ops.enable_high_lnb_voltage)
2388 err = fe->ops.enable_high_lnb_voltage(fe, (long) parg);
2389 break;
2390
2391 case FE_SET_FRONTEND:
2392 err = dvbv3_set_delivery_system(fe);
2393 if (err)
2394 break;
2395
2396 err = dtv_property_cache_sync(fe, c, parg);
2397 if (err)
2398 break;
2399 err = dtv_set_frontend(fe);
2400 break;
2401 case FE_GET_EVENT:
2402 err = dvb_frontend_get_event (fe, parg, file->f_flags);
2403 break;
2404
2405 case FE_GET_FRONTEND:
2406 err = dtv_get_frontend(fe, parg);
2407 break;
2408
2409 case FE_SET_FRONTEND_TUNE_MODE:
2410 fepriv->tune_mode_flags = (unsigned long) parg;
2411 err = 0;
2412 break;
2413 }
2414
2415 return err;
2416}
2417
2418
2419static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
2420{
2421 struct dvb_device *dvbdev = file->private_data;
2422 struct dvb_frontend *fe = dvbdev->priv;
2423 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2424
2425 dev_dbg_ratelimited(fe->dvb->device, "%s:\n", __func__);
2426
2427 poll_wait (file, &fepriv->events.wait_queue, wait);
2428
2429 if (fepriv->events.eventw != fepriv->events.eventr)
2430 return (POLLIN | POLLRDNORM | POLLPRI);
2431
2432 return 0;
2433}
2434
2435static int dvb_frontend_open(struct inode *inode, struct file *file)
2436{
2437 struct dvb_device *dvbdev = file->private_data;
2438 struct dvb_frontend *fe = dvbdev->priv;
2439 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2440 struct dvb_adapter *adapter = fe->dvb;
2441 int ret;
2442
2443 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2444 if (fe->exit == DVB_FE_DEVICE_REMOVED)
2445 return -ENODEV;
2446
2447 if (adapter->mfe_shared) {
2448 mutex_lock (&adapter->mfe_lock);
2449
2450 if (adapter->mfe_dvbdev == NULL)
2451 adapter->mfe_dvbdev = dvbdev;
2452
2453 else if (adapter->mfe_dvbdev != dvbdev) {
2454 struct dvb_device
2455 *mfedev = adapter->mfe_dvbdev;
2456 struct dvb_frontend
2457 *mfe = mfedev->priv;
2458 struct dvb_frontend_private
2459 *mfepriv = mfe->frontend_priv;
2460 int mferetry = (dvb_mfe_wait_time << 1);
2461
2462 mutex_unlock (&adapter->mfe_lock);
2463 while (mferetry-- && (mfedev->users != -1 ||
2464 mfepriv->thread != NULL)) {
2465 if(msleep_interruptible(500)) {
2466 if(signal_pending(current))
2467 return -EINTR;
2468 }
2469 }
2470
2471 mutex_lock (&adapter->mfe_lock);
2472 if(adapter->mfe_dvbdev != dvbdev) {
2473 mfedev = adapter->mfe_dvbdev;
2474 mfe = mfedev->priv;
2475 mfepriv = mfe->frontend_priv;
2476 if (mfedev->users != -1 ||
2477 mfepriv->thread != NULL) {
2478 mutex_unlock (&adapter->mfe_lock);
2479 return -EBUSY;
2480 }
2481 adapter->mfe_dvbdev = dvbdev;
2482 }
2483 }
2484 }
2485
2486 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
2487 if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
2488 goto err0;
2489
2490
2491
2492
2493
2494
2495
2496 fepriv->reinitialise = 1;
2497 }
2498
2499 if ((ret = dvb_generic_open (inode, file)) < 0)
2500 goto err1;
2501
2502 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2503
2504 fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
2505 fepriv->tone = -1;
2506 fepriv->voltage = -1;
2507
2508 ret = dvb_frontend_start (fe);
2509 if (ret)
2510 goto err2;
2511
2512
2513 fepriv->events.eventr = fepriv->events.eventw = 0;
2514 }
2515
2516 if (adapter->mfe_shared)
2517 mutex_unlock (&adapter->mfe_lock);
2518 return ret;
2519
2520err2:
2521 dvb_generic_release(inode, file);
2522err1:
2523 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
2524 fe->ops.ts_bus_ctrl(fe, 0);
2525err0:
2526 if (adapter->mfe_shared)
2527 mutex_unlock (&adapter->mfe_lock);
2528 return ret;
2529}
2530
2531static int dvb_frontend_release(struct inode *inode, struct file *file)
2532{
2533 struct dvb_device *dvbdev = file->private_data;
2534 struct dvb_frontend *fe = dvbdev->priv;
2535 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2536 int ret;
2537
2538 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2539
2540 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2541 fepriv->release_jiffies = jiffies;
2542 mb();
2543 }
2544
2545 ret = dvb_generic_release (inode, file);
2546
2547 if (dvbdev->users == -1) {
2548 wake_up(&fepriv->wait_queue);
2549 if (fe->exit != DVB_FE_NO_EXIT)
2550 wake_up(&dvbdev->wait_queue);
2551 if (fe->ops.ts_bus_ctrl)
2552 fe->ops.ts_bus_ctrl(fe, 0);
2553 }
2554
2555 return ret;
2556}
2557
2558static const struct file_operations dvb_frontend_fops = {
2559 .owner = THIS_MODULE,
2560 .unlocked_ioctl = dvb_generic_ioctl,
2561 .poll = dvb_frontend_poll,
2562 .open = dvb_frontend_open,
2563 .release = dvb_frontend_release,
2564 .llseek = noop_llseek,
2565};
2566
2567int dvb_frontend_suspend(struct dvb_frontend *fe)
2568{
2569 int ret = 0;
2570
2571 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2572 fe->id);
2573
2574 if (fe->ops.tuner_ops.suspend)
2575 ret = fe->ops.tuner_ops.suspend(fe);
2576 else if (fe->ops.tuner_ops.sleep)
2577 ret = fe->ops.tuner_ops.sleep(fe);
2578
2579 if (fe->ops.sleep)
2580 ret = fe->ops.sleep(fe);
2581
2582 return ret;
2583}
2584EXPORT_SYMBOL(dvb_frontend_suspend);
2585
2586int dvb_frontend_resume(struct dvb_frontend *fe)
2587{
2588 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2589 int ret = 0;
2590
2591 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2592 fe->id);
2593
2594 fe->exit = DVB_FE_DEVICE_RESUME;
2595 if (fe->ops.init)
2596 ret = fe->ops.init(fe);
2597
2598 if (fe->ops.tuner_ops.resume)
2599 ret = fe->ops.tuner_ops.resume(fe);
2600 else if (fe->ops.tuner_ops.init)
2601 ret = fe->ops.tuner_ops.init(fe);
2602
2603 fe->exit = DVB_FE_NO_EXIT;
2604 fepriv->state = FESTATE_RETUNE;
2605 dvb_frontend_wakeup(fe);
2606
2607 return ret;
2608}
2609EXPORT_SYMBOL(dvb_frontend_resume);
2610
2611int dvb_register_frontend(struct dvb_adapter* dvb,
2612 struct dvb_frontend* fe)
2613{
2614 struct dvb_frontend_private *fepriv;
2615 static const struct dvb_device dvbdev_template = {
2616 .users = ~0,
2617 .writers = 1,
2618 .readers = (~0)-1,
2619 .fops = &dvb_frontend_fops,
2620 .kernel_ioctl = dvb_frontend_ioctl
2621 };
2622
2623 dev_dbg(dvb->device, "%s:\n", __func__);
2624
2625 if (mutex_lock_interruptible(&frontend_mutex))
2626 return -ERESTARTSYS;
2627
2628 fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
2629 if (fe->frontend_priv == NULL) {
2630 mutex_unlock(&frontend_mutex);
2631 return -ENOMEM;
2632 }
2633 fepriv = fe->frontend_priv;
2634
2635 sema_init(&fepriv->sem, 1);
2636 init_waitqueue_head (&fepriv->wait_queue);
2637 init_waitqueue_head (&fepriv->events.wait_queue);
2638 mutex_init(&fepriv->events.mtx);
2639 fe->dvb = dvb;
2640 fepriv->inversion = INVERSION_OFF;
2641
2642 dev_info(fe->dvb->device,
2643 "DVB: registering adapter %i frontend %i (%s)...\n",
2644 fe->dvb->num, fe->id, fe->ops.info.name);
2645
2646 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
2647 fe, DVB_DEVICE_FRONTEND);
2648
2649
2650
2651
2652
2653
2654 fe->dtv_property_cache.delivery_system = fe->ops.delsys[0];
2655 dvb_frontend_clear_cache(fe);
2656
2657 mutex_unlock(&frontend_mutex);
2658 return 0;
2659}
2660EXPORT_SYMBOL(dvb_register_frontend);
2661
2662int dvb_unregister_frontend(struct dvb_frontend* fe)
2663{
2664 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2665 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2666
2667 mutex_lock(&frontend_mutex);
2668 dvb_frontend_stop (fe);
2669 mutex_unlock(&frontend_mutex);
2670
2671 if (fepriv->dvbdev->users < -1)
2672 wait_event(fepriv->dvbdev->wait_queue,
2673 fepriv->dvbdev->users==-1);
2674
2675 mutex_lock(&frontend_mutex);
2676 dvb_unregister_device (fepriv->dvbdev);
2677
2678
2679 kfree(fepriv);
2680 mutex_unlock(&frontend_mutex);
2681 return 0;
2682}
2683EXPORT_SYMBOL(dvb_unregister_frontend);
2684
2685#ifdef CONFIG_MEDIA_ATTACH
2686void dvb_frontend_detach(struct dvb_frontend* fe)
2687{
2688 void *ptr;
2689
2690 if (fe->ops.release_sec) {
2691 fe->ops.release_sec(fe);
2692 dvb_detach(fe->ops.release_sec);
2693 }
2694 if (fe->ops.tuner_ops.release) {
2695 fe->ops.tuner_ops.release(fe);
2696 dvb_detach(fe->ops.tuner_ops.release);
2697 }
2698 if (fe->ops.analog_ops.release) {
2699 fe->ops.analog_ops.release(fe);
2700 dvb_detach(fe->ops.analog_ops.release);
2701 }
2702 ptr = (void*)fe->ops.release;
2703 if (ptr) {
2704 fe->ops.release(fe);
2705 dvb_detach(ptr);
2706 }
2707}
2708#else
2709void dvb_frontend_detach(struct dvb_frontend* fe)
2710{
2711 if (fe->ops.release_sec)
2712 fe->ops.release_sec(fe);
2713 if (fe->ops.tuner_ops.release)
2714 fe->ops.tuner_ops.release(fe);
2715 if (fe->ops.analog_ops.release)
2716 fe->ops.analog_ops.release(fe);
2717 if (fe->ops.release)
2718 fe->ops.release(fe);
2719}
2720#endif
2721EXPORT_SYMBOL(dvb_frontend_detach);
2722