dvb_frontend.c revision b9d5efcceb6b34ee20111b62cf7be61ae79af4e9
1/*
2 * dvb_frontend.c: DVB frontend tuning interface/thread
3 *
4 *
5 * Copyright (C) 1999-2001 Ralph  Metzler
6 *			   Marcus Metzler
7 *			   Holger Waechtler
8 *				      for convergence integrated media GmbH
9 *
10 * Copyright (C) 2004 Andrew de Quincey (tuning thread cleanup)
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
26 */
27
28#include <linux/string.h>
29#include <linux/kernel.h>
30#include <linux/sched.h>
31#include <linux/wait.h>
32#include <linux/slab.h>
33#include <linux/poll.h>
34#include <linux/semaphore.h>
35#include <linux/module.h>
36#include <linux/list.h>
37#include <linux/freezer.h>
38#include <linux/jiffies.h>
39#include <linux/kthread.h>
40#include <asm/processor.h>
41
42#include "dvb_frontend.h"
43#include "dvbdev.h"
44#include <linux/dvb/version.h>
45
46static int dvb_frontend_debug;
47static int dvb_shutdown_timeout;
48static int dvb_force_auto_inversion;
49static int dvb_override_tune_delay;
50static int dvb_powerdown_on_sleep = 1;
51static int dvb_mfe_wait_time = 5;
52
53module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
54MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
55module_param(dvb_shutdown_timeout, int, 0644);
56MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
57module_param(dvb_force_auto_inversion, int, 0644);
58MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
59module_param(dvb_override_tune_delay, int, 0644);
60MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
61module_param(dvb_powerdown_on_sleep, int, 0644);
62MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB voltage off on sleep (default)");
63module_param(dvb_mfe_wait_time, int, 0644);
64MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)");
65
66#define dprintk if (dvb_frontend_debug) printk
67
68#define FESTATE_IDLE 1
69#define FESTATE_RETUNE 2
70#define FESTATE_TUNING_FAST 4
71#define FESTATE_TUNING_SLOW 8
72#define FESTATE_TUNED 16
73#define FESTATE_ZIGZAG_FAST 32
74#define FESTATE_ZIGZAG_SLOW 64
75#define FESTATE_DISEQC 128
76#define FESTATE_ERROR 256
77#define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
78#define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
79#define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
80#define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
81
82#define FE_ALGO_HW		1
83/*
84 * FESTATE_IDLE. No tuning parameters have been supplied and the loop is idling.
85 * FESTATE_RETUNE. Parameters have been supplied, but we have not yet performed the first tune.
86 * FESTATE_TUNING_FAST. Tuning parameters have been supplied and fast zigzag scan is in progress.
87 * FESTATE_TUNING_SLOW. Tuning parameters have been supplied. Fast zigzag failed, so we're trying again, but slower.
88 * FESTATE_TUNED. The frontend has successfully locked on.
89 * FESTATE_ZIGZAG_FAST. The lock has been lost, and a fast zigzag has been initiated to try and regain it.
90 * FESTATE_ZIGZAG_SLOW. The lock has been lost. Fast zigzag has been failed, so we're trying again, but slower.
91 * FESTATE_DISEQC. A DISEQC command has just been issued.
92 * FESTATE_WAITFORLOCK. When we're waiting for a lock.
93 * FESTATE_SEARCHING_FAST. When we're searching for a signal using a fast zigzag scan.
94 * FESTATE_SEARCHING_SLOW. When we're searching for a signal using a slow zigzag scan.
95 * FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again.
96 */
97
98#define DVB_FE_NO_EXIT	0
99#define DVB_FE_NORMAL_EXIT	1
100#define DVB_FE_DEVICE_REMOVED	2
101
102static DEFINE_MUTEX(frontend_mutex);
103
104struct dvb_frontend_private {
105
106	/* thread/frontend values */
107	struct dvb_device *dvbdev;
108	struct dvb_frontend_parameters parameters_in;
109	struct dvb_frontend_parameters parameters_out;
110	struct dvb_fe_events events;
111	struct semaphore sem;
112	struct list_head list_head;
113	wait_queue_head_t wait_queue;
114	struct task_struct *thread;
115	unsigned long release_jiffies;
116	unsigned int exit;
117	unsigned int wakeup;
118	fe_status_t status;
119	unsigned long tune_mode_flags;
120	unsigned int delay;
121	unsigned int reinitialise;
122	int tone;
123	int voltage;
124
125	/* swzigzag values */
126	unsigned int state;
127	unsigned int bending;
128	int lnb_drift;
129	unsigned int inversion;
130	unsigned int auto_step;
131	unsigned int auto_sub_step;
132	unsigned int started_auto_step;
133	unsigned int min_delay;
134	unsigned int max_drift;
135	unsigned int step_size;
136	int quality;
137	unsigned int check_wrapped;
138	enum dvbfe_search algo_status;
139};
140
141static void dvb_frontend_wakeup(struct dvb_frontend *fe);
142
143static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
144{
145	struct dvb_frontend_private *fepriv = fe->frontend_priv;
146	struct dvb_fe_events *events = &fepriv->events;
147	struct dvb_frontend_event *e;
148	int wp;
149
150	dprintk ("%s\n", __func__);
151
152	if ((status & FE_HAS_LOCK) && fe->ops.get_frontend)
153		fe->ops.get_frontend(fe, &fepriv->parameters_out);
154
155	mutex_lock(&events->mtx);
156
157	wp = (events->eventw + 1) % MAX_EVENT;
158	if (wp == events->eventr) {
159		events->overflow = 1;
160		events->eventr = (events->eventr + 1) % MAX_EVENT;
161	}
162
163	e = &events->events[events->eventw];
164	e->status = status;
165	e->parameters = fepriv->parameters_out;
166
167	events->eventw = wp;
168
169	mutex_unlock(&events->mtx);
170
171	wake_up_interruptible (&events->wait_queue);
172}
173
174static int dvb_frontend_get_event(struct dvb_frontend *fe,
175			    struct dvb_frontend_event *event, int flags)
176{
177	struct dvb_frontend_private *fepriv = fe->frontend_priv;
178	struct dvb_fe_events *events = &fepriv->events;
179
180	dprintk ("%s\n", __func__);
181
182	if (events->overflow) {
183		events->overflow = 0;
184		return -EOVERFLOW;
185	}
186
187	if (events->eventw == events->eventr) {
188		int ret;
189
190		if (flags & O_NONBLOCK)
191			return -EWOULDBLOCK;
192
193		up(&fepriv->sem);
194
195		ret = wait_event_interruptible (events->wait_queue,
196						events->eventw != events->eventr);
197
198		if (down_interruptible (&fepriv->sem))
199			return -ERESTARTSYS;
200
201		if (ret < 0)
202			return ret;
203	}
204
205	mutex_lock(&events->mtx);
206	*event = events->events[events->eventr];
207	events->eventr = (events->eventr + 1) % MAX_EVENT;
208	mutex_unlock(&events->mtx);
209
210	return 0;
211}
212
213static void dvb_frontend_clear_events(struct dvb_frontend *fe)
214{
215	struct dvb_frontend_private *fepriv = fe->frontend_priv;
216	struct dvb_fe_events *events = &fepriv->events;
217
218	mutex_lock(&events->mtx);
219	events->eventr = events->eventw;
220	mutex_unlock(&events->mtx);
221}
222
223static void dvb_frontend_init(struct dvb_frontend *fe)
224{
225	dprintk ("DVB: initialising adapter %i frontend %i (%s)...\n",
226		 fe->dvb->num,
227		 fe->id,
228		 fe->ops.info.name);
229
230	if (fe->ops.init)
231		fe->ops.init(fe);
232	if (fe->ops.tuner_ops.init) {
233		if (fe->ops.i2c_gate_ctrl)
234			fe->ops.i2c_gate_ctrl(fe, 1);
235		fe->ops.tuner_ops.init(fe);
236		if (fe->ops.i2c_gate_ctrl)
237			fe->ops.i2c_gate_ctrl(fe, 0);
238	}
239}
240
241void dvb_frontend_reinitialise(struct dvb_frontend *fe)
242{
243	struct dvb_frontend_private *fepriv = fe->frontend_priv;
244
245	fepriv->reinitialise = 1;
246	dvb_frontend_wakeup(fe);
247}
248EXPORT_SYMBOL(dvb_frontend_reinitialise);
249
250static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked)
251{
252	int q2;
253
254	dprintk ("%s\n", __func__);
255
256	if (locked)
257		(fepriv->quality) = (fepriv->quality * 220 + 36*256) / 256;
258	else
259		(fepriv->quality) = (fepriv->quality * 220 + 0) / 256;
260
261	q2 = fepriv->quality - 128;
262	q2 *= q2;
263
264	fepriv->delay = fepriv->min_delay + q2 * HZ / (128*128);
265}
266
267/**
268 * Performs automatic twiddling of frontend parameters.
269 *
270 * @param fe The frontend concerned.
271 * @param check_wrapped Checks if an iteration has completed. DO NOT SET ON THE FIRST ATTEMPT
272 * @returns Number of complete iterations that have been performed.
273 */
274static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
275{
276	int autoinversion;
277	int ready = 0;
278	int fe_set_err = 0;
279	struct dvb_frontend_private *fepriv = fe->frontend_priv;
280	int original_inversion = fepriv->parameters_in.inversion;
281	u32 original_frequency = fepriv->parameters_in.frequency;
282
283	/* are we using autoinversion? */
284	autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
285			 (fepriv->parameters_in.inversion == INVERSION_AUTO));
286
287	/* setup parameters correctly */
288	while(!ready) {
289		/* calculate the lnb_drift */
290		fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size;
291
292		/* wrap the auto_step if we've exceeded the maximum drift */
293		if (fepriv->lnb_drift > fepriv->max_drift) {
294			fepriv->auto_step = 0;
295			fepriv->auto_sub_step = 0;
296			fepriv->lnb_drift = 0;
297		}
298
299		/* perform inversion and +/- zigzag */
300		switch(fepriv->auto_sub_step) {
301		case 0:
302			/* try with the current inversion and current drift setting */
303			ready = 1;
304			break;
305
306		case 1:
307			if (!autoinversion) break;
308
309			fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
310			ready = 1;
311			break;
312
313		case 2:
314			if (fepriv->lnb_drift == 0) break;
315
316			fepriv->lnb_drift = -fepriv->lnb_drift;
317			ready = 1;
318			break;
319
320		case 3:
321			if (fepriv->lnb_drift == 0) break;
322			if (!autoinversion) break;
323
324			fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
325			fepriv->lnb_drift = -fepriv->lnb_drift;
326			ready = 1;
327			break;
328
329		default:
330			fepriv->auto_step++;
331			fepriv->auto_sub_step = -1; /* it'll be incremented to 0 in a moment */
332			break;
333		}
334
335		if (!ready) fepriv->auto_sub_step++;
336	}
337
338	/* if this attempt would hit where we started, indicate a complete
339	 * iteration has occurred */
340	if ((fepriv->auto_step == fepriv->started_auto_step) &&
341	    (fepriv->auto_sub_step == 0) && check_wrapped) {
342		return 1;
343	}
344
345	dprintk("%s: drift:%i inversion:%i auto_step:%i "
346		"auto_sub_step:%i started_auto_step:%i\n",
347		__func__, fepriv->lnb_drift, fepriv->inversion,
348		fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
349
350	/* set the frontend itself */
351	fepriv->parameters_in.frequency += fepriv->lnb_drift;
352	if (autoinversion)
353		fepriv->parameters_in.inversion = fepriv->inversion;
354	if (fe->ops.set_frontend)
355		fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters_in);
356	fepriv->parameters_out = fepriv->parameters_in;
357	if (fe_set_err < 0) {
358		fepriv->state = FESTATE_ERROR;
359		return fe_set_err;
360	}
361
362	fepriv->parameters_in.frequency = original_frequency;
363	fepriv->parameters_in.inversion = original_inversion;
364
365	fepriv->auto_sub_step++;
366	return 0;
367}
368
369static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
370{
371	fe_status_t s = 0;
372	int retval = 0;
373	struct dvb_frontend_private *fepriv = fe->frontend_priv;
374
375	/* if we've got no parameters, just keep idling */
376	if (fepriv->state & FESTATE_IDLE) {
377		fepriv->delay = 3*HZ;
378		fepriv->quality = 0;
379		return;
380	}
381
382	/* in SCAN mode, we just set the frontend when asked and leave it alone */
383	if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
384		if (fepriv->state & FESTATE_RETUNE) {
385			if (fe->ops.set_frontend)
386				retval = fe->ops.set_frontend(fe,
387							&fepriv->parameters_in);
388			fepriv->parameters_out = fepriv->parameters_in;
389			if (retval < 0)
390				fepriv->state = FESTATE_ERROR;
391			else
392				fepriv->state = FESTATE_TUNED;
393		}
394		fepriv->delay = 3*HZ;
395		fepriv->quality = 0;
396		return;
397	}
398
399	/* get the frontend status */
400	if (fepriv->state & FESTATE_RETUNE) {
401		s = 0;
402	} else {
403		if (fe->ops.read_status)
404			fe->ops.read_status(fe, &s);
405		if (s != fepriv->status) {
406			dvb_frontend_add_event(fe, s);
407			fepriv->status = s;
408		}
409	}
410
411	/* if we're not tuned, and we have a lock, move to the TUNED state */
412	if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
413		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
414		fepriv->state = FESTATE_TUNED;
415
416		/* if we're tuned, then we have determined the correct inversion */
417		if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
418		    (fepriv->parameters_in.inversion == INVERSION_AUTO)) {
419			fepriv->parameters_in.inversion = fepriv->inversion;
420		}
421		return;
422	}
423
424	/* if we are tuned already, check we're still locked */
425	if (fepriv->state & FESTATE_TUNED) {
426		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
427
428		/* we're tuned, and the lock is still good... */
429		if (s & FE_HAS_LOCK) {
430			return;
431		} else { /* if we _WERE_ tuned, but now don't have a lock */
432			fepriv->state = FESTATE_ZIGZAG_FAST;
433			fepriv->started_auto_step = fepriv->auto_step;
434			fepriv->check_wrapped = 0;
435		}
436	}
437
438	/* don't actually do anything if we're in the LOSTLOCK state,
439	 * the frontend is set to FE_CAN_RECOVER, and the max_drift is 0 */
440	if ((fepriv->state & FESTATE_LOSTLOCK) &&
441	    (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
442		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
443		return;
444	}
445
446	/* don't do anything if we're in the DISEQC state, since this
447	 * might be someone with a motorized dish controlled by DISEQC.
448	 * If its actually a re-tune, there will be a SET_FRONTEND soon enough.	*/
449	if (fepriv->state & FESTATE_DISEQC) {
450		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
451		return;
452	}
453
454	/* if we're in the RETUNE state, set everything up for a brand
455	 * new scan, keeping the current inversion setting, as the next
456	 * tune is _very_ likely to require the same */
457	if (fepriv->state & FESTATE_RETUNE) {
458		fepriv->lnb_drift = 0;
459		fepriv->auto_step = 0;
460		fepriv->auto_sub_step = 0;
461		fepriv->started_auto_step = 0;
462		fepriv->check_wrapped = 0;
463	}
464
465	/* fast zigzag. */
466	if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
467		fepriv->delay = fepriv->min_delay;
468
469		/* perform a tune */
470		retval = dvb_frontend_swzigzag_autotune(fe,
471							fepriv->check_wrapped);
472		if (retval < 0) {
473			return;
474		} else if (retval) {
475			/* OK, if we've run out of trials at the fast speed.
476			 * Drop back to slow for the _next_ attempt */
477			fepriv->state = FESTATE_SEARCHING_SLOW;
478			fepriv->started_auto_step = fepriv->auto_step;
479			return;
480		}
481		fepriv->check_wrapped = 1;
482
483		/* if we've just retuned, enter the ZIGZAG_FAST state.
484		 * This ensures we cannot return from an
485		 * FE_SET_FRONTEND ioctl before the first frontend tune
486		 * occurs */
487		if (fepriv->state & FESTATE_RETUNE) {
488			fepriv->state = FESTATE_TUNING_FAST;
489		}
490	}
491
492	/* slow zigzag */
493	if (fepriv->state & FESTATE_SEARCHING_SLOW) {
494		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
495
496		/* Note: don't bother checking for wrapping; we stay in this
497		 * state until we get a lock */
498		dvb_frontend_swzigzag_autotune(fe, 0);
499	}
500}
501
502static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
503{
504	struct dvb_frontend_private *fepriv = fe->frontend_priv;
505
506	if (fepriv->exit != DVB_FE_NO_EXIT)
507		return 1;
508
509	if (fepriv->dvbdev->writers == 1)
510		if (time_after_eq(jiffies, fepriv->release_jiffies +
511				  dvb_shutdown_timeout * HZ))
512			return 1;
513
514	return 0;
515}
516
517static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
518{
519	struct dvb_frontend_private *fepriv = fe->frontend_priv;
520
521	if (fepriv->wakeup) {
522		fepriv->wakeup = 0;
523		return 1;
524	}
525	return dvb_frontend_is_exiting(fe);
526}
527
528static void dvb_frontend_wakeup(struct dvb_frontend *fe)
529{
530	struct dvb_frontend_private *fepriv = fe->frontend_priv;
531
532	fepriv->wakeup = 1;
533	wake_up_interruptible(&fepriv->wait_queue);
534}
535
536static int dvb_frontend_thread(void *data)
537{
538	struct dvb_frontend *fe = data;
539	struct dvb_frontend_private *fepriv = fe->frontend_priv;
540	fe_status_t s;
541	enum dvbfe_algo algo;
542
543	struct dvb_frontend_parameters *params;
544
545	dprintk("%s\n", __func__);
546
547	fepriv->check_wrapped = 0;
548	fepriv->quality = 0;
549	fepriv->delay = 3*HZ;
550	fepriv->status = 0;
551	fepriv->wakeup = 0;
552	fepriv->reinitialise = 0;
553
554	dvb_frontend_init(fe);
555
556	set_freezable();
557	while (1) {
558		up(&fepriv->sem);	    /* is locked when we enter the thread... */
559restart:
560		wait_event_interruptible_timeout(fepriv->wait_queue,
561			dvb_frontend_should_wakeup(fe) || kthread_should_stop()
562				|| freezing(current),
563			fepriv->delay);
564
565		if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
566			/* got signal or quitting */
567			fepriv->exit = DVB_FE_NORMAL_EXIT;
568			break;
569		}
570
571		if (try_to_freeze())
572			goto restart;
573
574		if (down_interruptible(&fepriv->sem))
575			break;
576
577		if (fepriv->reinitialise) {
578			dvb_frontend_init(fe);
579			if (fe->ops.set_tone && fepriv->tone != -1)
580				fe->ops.set_tone(fe, fepriv->tone);
581			if (fe->ops.set_voltage && fepriv->voltage != -1)
582				fe->ops.set_voltage(fe, fepriv->voltage);
583			fepriv->reinitialise = 0;
584		}
585
586		/* do an iteration of the tuning loop */
587		if (fe->ops.get_frontend_algo) {
588			algo = fe->ops.get_frontend_algo(fe);
589			switch (algo) {
590			case DVBFE_ALGO_HW:
591				dprintk("%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
592				params = NULL; /* have we been asked to RETUNE ? */
593
594				if (fepriv->state & FESTATE_RETUNE) {
595					dprintk("%s: Retune requested, FESTATE_RETUNE\n", __func__);
596					params = &fepriv->parameters_in;
597					fepriv->state = FESTATE_TUNED;
598				}
599
600				if (fe->ops.tune)
601					fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
602				if (params)
603					fepriv->parameters_out = *params;
604
605				if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
606					dprintk("%s: state changed, adding current state\n", __func__);
607					dvb_frontend_add_event(fe, s);
608					fepriv->status = s;
609				}
610				break;
611			case DVBFE_ALGO_SW:
612				dprintk("%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
613				dvb_frontend_swzigzag(fe);
614				break;
615			case DVBFE_ALGO_CUSTOM:
616				dprintk("%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
617				if (fepriv->state & FESTATE_RETUNE) {
618					dprintk("%s: Retune requested, FESTAT_RETUNE\n", __func__);
619					fepriv->state = FESTATE_TUNED;
620				}
621				/* Case where we are going to search for a carrier
622				 * User asked us to retune again for some reason, possibly
623				 * requesting a search with a new set of parameters
624				 */
625				if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
626					if (fe->ops.search) {
627						fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters_in);
628						/* We did do a search as was requested, the flags are
629						 * now unset as well and has the flags wrt to search.
630						 */
631					} else {
632						fepriv->algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN;
633					}
634				}
635				/* Track the carrier if the search was successful */
636				if (fepriv->algo_status == DVBFE_ALGO_SEARCH_SUCCESS) {
637					if (fe->ops.track)
638						fe->ops.track(fe, &fepriv->parameters_in);
639				} else {
640					fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
641					fepriv->delay = HZ / 2;
642				}
643				fepriv->parameters_out = fepriv->parameters_in;
644				fe->ops.read_status(fe, &s);
645				if (s != fepriv->status) {
646					dvb_frontend_add_event(fe, s); /* update event list */
647					fepriv->status = s;
648					if (!(s & FE_HAS_LOCK)) {
649						fepriv->delay = HZ / 10;
650						fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
651					} else {
652						fepriv->delay = 60 * HZ;
653					}
654				}
655				break;
656			default:
657				dprintk("%s: UNDEFINED ALGO !\n", __func__);
658				break;
659			}
660		} else {
661			dvb_frontend_swzigzag(fe);
662		}
663	}
664
665	if (dvb_powerdown_on_sleep) {
666		if (fe->ops.set_voltage)
667			fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
668		if (fe->ops.tuner_ops.sleep) {
669			if (fe->ops.i2c_gate_ctrl)
670				fe->ops.i2c_gate_ctrl(fe, 1);
671			fe->ops.tuner_ops.sleep(fe);
672			if (fe->ops.i2c_gate_ctrl)
673				fe->ops.i2c_gate_ctrl(fe, 0);
674		}
675		if (fe->ops.sleep)
676			fe->ops.sleep(fe);
677	}
678
679	fepriv->thread = NULL;
680	if (kthread_should_stop())
681		fepriv->exit = DVB_FE_DEVICE_REMOVED;
682	else
683		fepriv->exit = DVB_FE_NO_EXIT;
684	mb();
685
686	dvb_frontend_wakeup(fe);
687	return 0;
688}
689
690static void dvb_frontend_stop(struct dvb_frontend *fe)
691{
692	struct dvb_frontend_private *fepriv = fe->frontend_priv;
693
694	dprintk ("%s\n", __func__);
695
696	fepriv->exit = DVB_FE_NORMAL_EXIT;
697	mb();
698
699	if (!fepriv->thread)
700		return;
701
702	kthread_stop(fepriv->thread);
703
704	sema_init(&fepriv->sem, 1);
705	fepriv->state = FESTATE_IDLE;
706
707	/* paranoia check in case a signal arrived */
708	if (fepriv->thread)
709		printk("dvb_frontend_stop: warning: thread %p won't exit\n",
710				fepriv->thread);
711}
712
713s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime)
714{
715	return ((curtime.tv_usec < lasttime.tv_usec) ?
716		1000000 - lasttime.tv_usec + curtime.tv_usec :
717		curtime.tv_usec - lasttime.tv_usec);
718}
719EXPORT_SYMBOL(timeval_usec_diff);
720
721static inline void timeval_usec_add(struct timeval *curtime, u32 add_usec)
722{
723	curtime->tv_usec += add_usec;
724	if (curtime->tv_usec >= 1000000) {
725		curtime->tv_usec -= 1000000;
726		curtime->tv_sec++;
727	}
728}
729
730/*
731 * Sleep until gettimeofday() > waketime + add_usec
732 * This needs to be as precise as possible, but as the delay is
733 * usually between 2ms and 32ms, it is done using a scheduled msleep
734 * followed by usleep (normally a busy-wait loop) for the remainder
735 */
736void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec)
737{
738	struct timeval lasttime;
739	s32 delta, newdelta;
740
741	timeval_usec_add(waketime, add_usec);
742
743	do_gettimeofday(&lasttime);
744	delta = timeval_usec_diff(lasttime, *waketime);
745	if (delta > 2500) {
746		msleep((delta - 1500) / 1000);
747		do_gettimeofday(&lasttime);
748		newdelta = timeval_usec_diff(lasttime, *waketime);
749		delta = (newdelta > delta) ? 0 : newdelta;
750	}
751	if (delta > 0)
752		udelay(delta);
753}
754EXPORT_SYMBOL(dvb_frontend_sleep_until);
755
756static int dvb_frontend_start(struct dvb_frontend *fe)
757{
758	int ret;
759	struct dvb_frontend_private *fepriv = fe->frontend_priv;
760	struct task_struct *fe_thread;
761
762	dprintk ("%s\n", __func__);
763
764	if (fepriv->thread) {
765		if (fepriv->exit == DVB_FE_NO_EXIT)
766			return 0;
767		else
768			dvb_frontend_stop (fe);
769	}
770
771	if (signal_pending(current))
772		return -EINTR;
773	if (down_interruptible (&fepriv->sem))
774		return -EINTR;
775
776	fepriv->state = FESTATE_IDLE;
777	fepriv->exit = DVB_FE_NO_EXIT;
778	fepriv->thread = NULL;
779	mb();
780
781	fe_thread = kthread_run(dvb_frontend_thread, fe,
782		"kdvb-ad-%i-fe-%i", fe->dvb->num,fe->id);
783	if (IS_ERR(fe_thread)) {
784		ret = PTR_ERR(fe_thread);
785		printk("dvb_frontend_start: failed to start kthread (%d)\n", ret);
786		up(&fepriv->sem);
787		return ret;
788	}
789	fepriv->thread = fe_thread;
790	return 0;
791}
792
793static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
794					u32 *freq_min, u32 *freq_max)
795{
796	*freq_min = max(fe->ops.info.frequency_min, fe->ops.tuner_ops.info.frequency_min);
797
798	if (fe->ops.info.frequency_max == 0)
799		*freq_max = fe->ops.tuner_ops.info.frequency_max;
800	else if (fe->ops.tuner_ops.info.frequency_max == 0)
801		*freq_max = fe->ops.info.frequency_max;
802	else
803		*freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max);
804
805	if (*freq_min == 0 || *freq_max == 0)
806		printk(KERN_WARNING "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n",
807		       fe->dvb->num,fe->id);
808}
809
810static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
811				struct dvb_frontend_parameters *parms)
812{
813	u32 freq_min;
814	u32 freq_max;
815
816	/* range check: frequency */
817	dvb_frontend_get_frequency_limits(fe, &freq_min, &freq_max);
818	if ((freq_min && parms->frequency < freq_min) ||
819	    (freq_max && parms->frequency > freq_max)) {
820		printk(KERN_WARNING "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
821		       fe->dvb->num, fe->id, parms->frequency, freq_min, freq_max);
822		return -EINVAL;
823	}
824
825	/* range check: symbol rate */
826	if (fe->ops.info.type == FE_QPSK) {
827		if ((fe->ops.info.symbol_rate_min &&
828		     parms->u.qpsk.symbol_rate < fe->ops.info.symbol_rate_min) ||
829		    (fe->ops.info.symbol_rate_max &&
830		     parms->u.qpsk.symbol_rate > fe->ops.info.symbol_rate_max)) {
831			printk(KERN_WARNING "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
832			       fe->dvb->num, fe->id, parms->u.qpsk.symbol_rate,
833			       fe->ops.info.symbol_rate_min, fe->ops.info.symbol_rate_max);
834			return -EINVAL;
835		}
836
837	} else if (fe->ops.info.type == FE_QAM) {
838		if ((fe->ops.info.symbol_rate_min &&
839		     parms->u.qam.symbol_rate < fe->ops.info.symbol_rate_min) ||
840		    (fe->ops.info.symbol_rate_max &&
841		     parms->u.qam.symbol_rate > fe->ops.info.symbol_rate_max)) {
842			printk(KERN_WARNING "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
843			       fe->dvb->num, fe->id, parms->u.qam.symbol_rate,
844			       fe->ops.info.symbol_rate_min, fe->ops.info.symbol_rate_max);
845			return -EINVAL;
846		}
847	}
848
849	/* check for supported modulation */
850	if (fe->ops.info.type == FE_QAM &&
851	    (parms->u.qam.modulation > QAM_AUTO ||
852	     !((1 << (parms->u.qam.modulation + 10)) & fe->ops.info.caps))) {
853		printk(KERN_WARNING "DVB: adapter %i frontend %i modulation %u not supported\n",
854		       fe->dvb->num, fe->id, parms->u.qam.modulation);
855			return -EINVAL;
856	}
857
858	return 0;
859}
860
861static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
862{
863	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
864	int i;
865
866	memset(c, 0, sizeof(struct dtv_frontend_properties));
867
868	c->state = DTV_CLEAR;
869	c->delivery_system = SYS_UNDEFINED;
870	c->inversion = INVERSION_AUTO;
871	c->fec_inner = FEC_AUTO;
872	c->transmission_mode = TRANSMISSION_MODE_AUTO;
873	c->bandwidth_hz = BANDWIDTH_AUTO;
874	c->guard_interval = GUARD_INTERVAL_AUTO;
875	c->hierarchy = HIERARCHY_AUTO;
876	c->symbol_rate = QAM_AUTO;
877	c->code_rate_HP = FEC_AUTO;
878	c->code_rate_LP = FEC_AUTO;
879	c->rolloff = ROLLOFF_AUTO;
880
881	c->isdbt_partial_reception = -1;
882	c->isdbt_sb_mode = -1;
883	c->isdbt_sb_subchannel = -1;
884	c->isdbt_sb_segment_idx = -1;
885	c->isdbt_sb_segment_count = -1;
886	c->isdbt_layer_enabled = 0x7;
887	for (i = 0; i < 3; i++) {
888		c->layer[i].fec = FEC_AUTO;
889		c->layer[i].modulation = QAM_AUTO;
890		c->layer[i].interleaving = -1;
891		c->layer[i].segment_count = -1;
892	}
893
894	return 0;
895}
896
897#define _DTV_CMD(n, s, b) \
898[n] = { \
899	.name = #n, \
900	.cmd  = n, \
901	.set  = s,\
902	.buffer = b \
903}
904
905static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
906	_DTV_CMD(DTV_TUNE, 1, 0),
907	_DTV_CMD(DTV_CLEAR, 1, 0),
908
909	/* Set */
910	_DTV_CMD(DTV_FREQUENCY, 1, 0),
911	_DTV_CMD(DTV_BANDWIDTH_HZ, 1, 0),
912	_DTV_CMD(DTV_MODULATION, 1, 0),
913	_DTV_CMD(DTV_INVERSION, 1, 0),
914	_DTV_CMD(DTV_DISEQC_MASTER, 1, 1),
915	_DTV_CMD(DTV_SYMBOL_RATE, 1, 0),
916	_DTV_CMD(DTV_INNER_FEC, 1, 0),
917	_DTV_CMD(DTV_VOLTAGE, 1, 0),
918	_DTV_CMD(DTV_TONE, 1, 0),
919	_DTV_CMD(DTV_PILOT, 1, 0),
920	_DTV_CMD(DTV_ROLLOFF, 1, 0),
921	_DTV_CMD(DTV_DELIVERY_SYSTEM, 1, 0),
922	_DTV_CMD(DTV_HIERARCHY, 1, 0),
923	_DTV_CMD(DTV_CODE_RATE_HP, 1, 0),
924	_DTV_CMD(DTV_CODE_RATE_LP, 1, 0),
925	_DTV_CMD(DTV_GUARD_INTERVAL, 1, 0),
926	_DTV_CMD(DTV_TRANSMISSION_MODE, 1, 0),
927
928	_DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0),
929	_DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0),
930	_DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 1, 0),
931	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 1, 0),
932	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 1, 0),
933	_DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 1, 0),
934	_DTV_CMD(DTV_ISDBT_LAYERA_FEC, 1, 0),
935	_DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 1, 0),
936	_DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 1, 0),
937	_DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 1, 0),
938	_DTV_CMD(DTV_ISDBT_LAYERB_FEC, 1, 0),
939	_DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 1, 0),
940	_DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 1, 0),
941	_DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 1, 0),
942	_DTV_CMD(DTV_ISDBT_LAYERC_FEC, 1, 0),
943	_DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 1, 0),
944	_DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 1, 0),
945	_DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 1, 0),
946
947	_DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 0, 0),
948	_DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 0, 0),
949	_DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 0, 0),
950	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 0, 0),
951	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 0, 0),
952	_DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 0, 0),
953	_DTV_CMD(DTV_ISDBT_LAYERA_FEC, 0, 0),
954	_DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 0, 0),
955	_DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 0, 0),
956	_DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 0, 0),
957	_DTV_CMD(DTV_ISDBT_LAYERB_FEC, 0, 0),
958	_DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 0, 0),
959	_DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 0, 0),
960	_DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 0, 0),
961	_DTV_CMD(DTV_ISDBT_LAYERC_FEC, 0, 0),
962	_DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 0, 0),
963	_DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 0, 0),
964	_DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 0, 0),
965
966	_DTV_CMD(DTV_ISDBS_TS_ID, 1, 0),
967	_DTV_CMD(DTV_DVBT2_PLP_ID, 1, 0),
968
969	/* Get */
970	_DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
971	_DTV_CMD(DTV_API_VERSION, 0, 0),
972	_DTV_CMD(DTV_CODE_RATE_HP, 0, 0),
973	_DTV_CMD(DTV_CODE_RATE_LP, 0, 0),
974	_DTV_CMD(DTV_GUARD_INTERVAL, 0, 0),
975	_DTV_CMD(DTV_TRANSMISSION_MODE, 0, 0),
976	_DTV_CMD(DTV_HIERARCHY, 0, 0),
977
978	_DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
979};
980
981static void dtv_property_dump(struct dtv_property *tvp)
982{
983	int i;
984
985	if (tvp->cmd <= 0 || tvp->cmd > DTV_MAX_COMMAND) {
986		printk(KERN_WARNING "%s: tvp.cmd = 0x%08x undefined\n",
987			__func__, tvp->cmd);
988		return;
989	}
990
991	dprintk("%s() tvp.cmd    = 0x%08x (%s)\n"
992		,__func__
993		,tvp->cmd
994		,dtv_cmds[ tvp->cmd ].name);
995
996	if(dtv_cmds[ tvp->cmd ].buffer) {
997
998		dprintk("%s() tvp.u.buffer.len = 0x%02x\n"
999			,__func__
1000			,tvp->u.buffer.len);
1001
1002		for(i = 0; i < tvp->u.buffer.len; i++)
1003			dprintk("%s() tvp.u.buffer.data[0x%02x] = 0x%02x\n"
1004				,__func__
1005				,i
1006				,tvp->u.buffer.data[i]);
1007
1008	} else
1009		dprintk("%s() tvp.u.data = 0x%08x\n", __func__, tvp->u.data);
1010}
1011
1012static int is_legacy_delivery_system(fe_delivery_system_t s)
1013{
1014	if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_A) ||
1015	   (s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS) ||
1016	   (s == SYS_ATSC))
1017		return 1;
1018
1019	return 0;
1020}
1021
1022/* Initialize the cache with some default values derived from the
1023 * legacy frontend_info structure.
1024 */
1025static void dtv_property_cache_init(struct dvb_frontend *fe,
1026				    struct dtv_frontend_properties *c)
1027{
1028	switch (fe->ops.info.type) {
1029	case FE_QPSK:
1030		c->modulation = QPSK;   /* implied for DVB-S in legacy API */
1031		c->rolloff = ROLLOFF_35;/* implied for DVB-S */
1032		c->delivery_system = SYS_DVBS;
1033		break;
1034	case FE_QAM:
1035		c->delivery_system = SYS_DVBC_ANNEX_A;
1036		break;
1037	case FE_OFDM:
1038		c->delivery_system = SYS_DVBT;
1039		break;
1040	case FE_ATSC:
1041		break;
1042	}
1043}
1044
1045/* Synchronise the legacy tuning parameters into the cache, so that demodulator
1046 * drivers can use a single set_frontend tuning function, regardless of whether
1047 * it's being used for the legacy or new API, reducing code and complexity.
1048 */
1049static void dtv_property_cache_sync(struct dvb_frontend *fe,
1050				    struct dtv_frontend_properties *c,
1051				    const struct dvb_frontend_parameters *p)
1052{
1053	c->frequency = p->frequency;
1054	c->inversion = p->inversion;
1055
1056	switch (fe->ops.info.type) {
1057	case FE_QPSK:
1058		c->symbol_rate = p->u.qpsk.symbol_rate;
1059		c->fec_inner = p->u.qpsk.fec_inner;
1060		break;
1061	case FE_QAM:
1062		c->symbol_rate = p->u.qam.symbol_rate;
1063		c->fec_inner = p->u.qam.fec_inner;
1064		c->modulation = p->u.qam.modulation;
1065		break;
1066	case FE_OFDM:
1067		if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ)
1068			c->bandwidth_hz = 6000000;
1069		else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ)
1070			c->bandwidth_hz = 7000000;
1071		else if (p->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
1072			c->bandwidth_hz = 8000000;
1073		else
1074			/* Including BANDWIDTH_AUTO */
1075			c->bandwidth_hz = 0;
1076		c->code_rate_HP = p->u.ofdm.code_rate_HP;
1077		c->code_rate_LP = p->u.ofdm.code_rate_LP;
1078		c->modulation = p->u.ofdm.constellation;
1079		c->transmission_mode = p->u.ofdm.transmission_mode;
1080		c->guard_interval = p->u.ofdm.guard_interval;
1081		c->hierarchy = p->u.ofdm.hierarchy_information;
1082		break;
1083	case FE_ATSC:
1084		c->modulation = p->u.vsb.modulation;
1085		if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
1086			c->delivery_system = SYS_ATSC;
1087		else
1088			c->delivery_system = SYS_DVBC_ANNEX_B;
1089		break;
1090	}
1091}
1092
1093/* Ensure the cached values are set correctly in the frontend
1094 * legacy tuning structures, for the advanced tuning API.
1095 */
1096static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
1097{
1098	const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1099	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1100	struct dvb_frontend_parameters *p = &fepriv->parameters_in;
1101
1102	p->frequency = c->frequency;
1103	p->inversion = c->inversion;
1104
1105	switch (fe->ops.info.type) {
1106	case FE_QPSK:
1107		dprintk("%s() Preparing QPSK req\n", __func__);
1108		p->u.qpsk.symbol_rate = c->symbol_rate;
1109		p->u.qpsk.fec_inner = c->fec_inner;
1110		break;
1111	case FE_QAM:
1112		dprintk("%s() Preparing QAM req\n", __func__);
1113		p->u.qam.symbol_rate = c->symbol_rate;
1114		p->u.qam.fec_inner = c->fec_inner;
1115		p->u.qam.modulation = c->modulation;
1116		break;
1117	case FE_OFDM:
1118		dprintk("%s() Preparing OFDM req\n", __func__);
1119		if (c->bandwidth_hz == 6000000)
1120			p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1121		else if (c->bandwidth_hz == 7000000)
1122			p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1123		else if (c->bandwidth_hz == 8000000)
1124			p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1125		else
1126			p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1127		p->u.ofdm.code_rate_HP = c->code_rate_HP;
1128		p->u.ofdm.code_rate_LP = c->code_rate_LP;
1129		p->u.ofdm.constellation = c->modulation;
1130		p->u.ofdm.transmission_mode = c->transmission_mode;
1131		p->u.ofdm.guard_interval = c->guard_interval;
1132		p->u.ofdm.hierarchy_information = c->hierarchy;
1133		break;
1134	case FE_ATSC:
1135		dprintk("%s() Preparing VSB req\n", __func__);
1136		p->u.vsb.modulation = c->modulation;
1137		break;
1138	}
1139}
1140
1141/* Ensure the cached values are set correctly in the frontend
1142 * legacy tuning structures, for the legacy tuning API.
1143 */
1144static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
1145{
1146	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1147	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1148	struct dvb_frontend_parameters *p = &fepriv->parameters_in;
1149	u32 rolloff = 0;
1150
1151	p->frequency = c->frequency;
1152	p->inversion = c->inversion;
1153
1154	if (c->delivery_system == SYS_DSS ||
1155	    c->delivery_system == SYS_DVBS ||
1156	    c->delivery_system == SYS_DVBS2 ||
1157	    c->delivery_system == SYS_ISDBS ||
1158	    c->delivery_system == SYS_TURBO) {
1159		p->u.qpsk.symbol_rate = c->symbol_rate;
1160		p->u.qpsk.fec_inner = c->fec_inner;
1161	}
1162
1163	/* Fake out a generic DVB-T request so we pass validation in the ioctl */
1164	if ((c->delivery_system == SYS_ISDBT) ||
1165	    (c->delivery_system == SYS_DVBT2)) {
1166		p->u.ofdm.constellation = QAM_AUTO;
1167		p->u.ofdm.code_rate_HP = FEC_AUTO;
1168		p->u.ofdm.code_rate_LP = FEC_AUTO;
1169		p->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
1170		p->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
1171		p->u.ofdm.hierarchy_information = HIERARCHY_AUTO;
1172		if (c->bandwidth_hz == 8000000)
1173			p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1174		else if (c->bandwidth_hz == 7000000)
1175			p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1176		else if (c->bandwidth_hz == 6000000)
1177			p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1178		else
1179			p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1180	}
1181
1182	/*
1183	 * On DVB-C, the bandwidth is a function of roll-off and symbol rate.
1184	 * The bandwidth is required for DVB-C tuners, in order to avoid
1185	 * inter-channel noise. Instead of estimating the minimal required
1186	 * bandwidth on every single driver, calculates it here and fills
1187	 * it at the cache bandwidth parameter.
1188	 * While not officially supported, a side effect of handling it at
1189	 * the cache level is that a program could retrieve the bandwidth
1190	 * via DTV_BANDWIDTH_HZ, wich may be useful for test programs.
1191	 */
1192	if (c->delivery_system == SYS_DVBC_ANNEX_A)
1193		rolloff = 115;
1194	if (c->delivery_system == SYS_DVBC_ANNEX_C)
1195		rolloff = 113;
1196	if (rolloff)
1197		c->bandwidth_hz = (c->symbol_rate * rolloff) / 100;
1198}
1199
1200static void dtv_property_cache_submit(struct dvb_frontend *fe)
1201{
1202	const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1203
1204	/* For legacy delivery systems we don't need the delivery_system to
1205	 * be specified, but we populate the older structures from the cache
1206	 * so we can call set_frontend on older drivers.
1207	 */
1208	if(is_legacy_delivery_system(c->delivery_system)) {
1209
1210		dprintk("%s() legacy, modulation = %d\n", __func__, c->modulation);
1211		dtv_property_legacy_params_sync(fe);
1212
1213	} else {
1214		dprintk("%s() adv, modulation = %d\n", __func__, c->modulation);
1215
1216		/* For advanced delivery systems / modulation types ...
1217		 * we seed the lecacy dvb_frontend_parameters structure
1218		 * so that the sanity checking code later in the IOCTL processing
1219		 * can validate our basic frequency ranges, symbolrates, modulation
1220		 * etc.
1221		 */
1222		dtv_property_adv_params_sync(fe);
1223	}
1224}
1225
1226static int dvb_frontend_ioctl_legacy(struct file *file,
1227			unsigned int cmd, void *parg);
1228static int dvb_frontend_ioctl_properties(struct file *file,
1229			unsigned int cmd, void *parg);
1230
1231static void dtv_set_default_delivery_caps(const struct dvb_frontend *fe, struct dtv_property *p)
1232{
1233	const struct dvb_frontend_info *info = &fe->ops.info;
1234	u32 ncaps = 0;
1235
1236	switch (info->type) {
1237	case FE_QPSK:
1238		p->u.buffer.data[ncaps++] = SYS_DVBS;
1239		if (info->caps & FE_CAN_2G_MODULATION)
1240			p->u.buffer.data[ncaps++] = SYS_DVBS2;
1241		if (info->caps & FE_CAN_TURBO_FEC)
1242			p->u.buffer.data[ncaps++] = SYS_TURBO;
1243		break;
1244	case FE_QAM:
1245		p->u.buffer.data[ncaps++] = SYS_DVBC_ANNEX_AC;
1246		break;
1247	case FE_OFDM:
1248		p->u.buffer.data[ncaps++] = SYS_DVBT;
1249		if (info->caps & FE_CAN_2G_MODULATION)
1250			p->u.buffer.data[ncaps++] = SYS_DVBT2;
1251		break;
1252	case FE_ATSC:
1253		if (info->caps & (FE_CAN_8VSB | FE_CAN_16VSB))
1254			p->u.buffer.data[ncaps++] = SYS_ATSC;
1255		if (info->caps & (FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256))
1256			p->u.buffer.data[ncaps++] = SYS_DVBC_ANNEX_B;
1257		break;
1258	}
1259	p->u.buffer.len = ncaps;
1260}
1261
1262static int dtv_property_process_get(struct dvb_frontend *fe,
1263				    struct dtv_property *tvp,
1264				    struct file *file)
1265{
1266	const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1267	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1268	struct dtv_frontend_properties cdetected;
1269	int r;
1270
1271	/*
1272	 * If the driver implements a get_frontend function, then convert
1273	 * detected parameters to S2API properties.
1274	 */
1275	if (fe->ops.get_frontend) {
1276		cdetected = *c;
1277		dtv_property_cache_sync(fe, &cdetected, &fepriv->parameters_out);
1278		c = &cdetected;
1279	}
1280
1281	switch(tvp->cmd) {
1282	case DTV_ENUM_DELSYS:
1283		dtv_set_default_delivery_caps(fe, tvp);
1284		break;
1285	case DTV_FREQUENCY:
1286		tvp->u.data = c->frequency;
1287		break;
1288	case DTV_MODULATION:
1289		tvp->u.data = c->modulation;
1290		break;
1291	case DTV_BANDWIDTH_HZ:
1292		tvp->u.data = c->bandwidth_hz;
1293		break;
1294	case DTV_INVERSION:
1295		tvp->u.data = c->inversion;
1296		break;
1297	case DTV_SYMBOL_RATE:
1298		tvp->u.data = c->symbol_rate;
1299		break;
1300	case DTV_INNER_FEC:
1301		tvp->u.data = c->fec_inner;
1302		break;
1303	case DTV_PILOT:
1304		tvp->u.data = c->pilot;
1305		break;
1306	case DTV_ROLLOFF:
1307		tvp->u.data = c->rolloff;
1308		break;
1309	case DTV_DELIVERY_SYSTEM:
1310		tvp->u.data = c->delivery_system;
1311		break;
1312	case DTV_VOLTAGE:
1313		tvp->u.data = c->voltage;
1314		break;
1315	case DTV_TONE:
1316		tvp->u.data = c->sectone;
1317		break;
1318	case DTV_API_VERSION:
1319		tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
1320		break;
1321	case DTV_CODE_RATE_HP:
1322		tvp->u.data = c->code_rate_HP;
1323		break;
1324	case DTV_CODE_RATE_LP:
1325		tvp->u.data = c->code_rate_LP;
1326		break;
1327	case DTV_GUARD_INTERVAL:
1328		tvp->u.data = c->guard_interval;
1329		break;
1330	case DTV_TRANSMISSION_MODE:
1331		tvp->u.data = c->transmission_mode;
1332		break;
1333	case DTV_HIERARCHY:
1334		tvp->u.data = c->hierarchy;
1335		break;
1336
1337	/* ISDB-T Support here */
1338	case DTV_ISDBT_PARTIAL_RECEPTION:
1339		tvp->u.data = c->isdbt_partial_reception;
1340		break;
1341	case DTV_ISDBT_SOUND_BROADCASTING:
1342		tvp->u.data = c->isdbt_sb_mode;
1343		break;
1344	case DTV_ISDBT_SB_SUBCHANNEL_ID:
1345		tvp->u.data = c->isdbt_sb_subchannel;
1346		break;
1347	case DTV_ISDBT_SB_SEGMENT_IDX:
1348		tvp->u.data = c->isdbt_sb_segment_idx;
1349		break;
1350	case DTV_ISDBT_SB_SEGMENT_COUNT:
1351		tvp->u.data = c->isdbt_sb_segment_count;
1352		break;
1353	case DTV_ISDBT_LAYER_ENABLED:
1354		tvp->u.data = c->isdbt_layer_enabled;
1355		break;
1356	case DTV_ISDBT_LAYERA_FEC:
1357		tvp->u.data = c->layer[0].fec;
1358		break;
1359	case DTV_ISDBT_LAYERA_MODULATION:
1360		tvp->u.data = c->layer[0].modulation;
1361		break;
1362	case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1363		tvp->u.data = c->layer[0].segment_count;
1364		break;
1365	case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1366		tvp->u.data = c->layer[0].interleaving;
1367		break;
1368	case DTV_ISDBT_LAYERB_FEC:
1369		tvp->u.data = c->layer[1].fec;
1370		break;
1371	case DTV_ISDBT_LAYERB_MODULATION:
1372		tvp->u.data = c->layer[1].modulation;
1373		break;
1374	case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1375		tvp->u.data = c->layer[1].segment_count;
1376		break;
1377	case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1378		tvp->u.data = c->layer[1].interleaving;
1379		break;
1380	case DTV_ISDBT_LAYERC_FEC:
1381		tvp->u.data = c->layer[2].fec;
1382		break;
1383	case DTV_ISDBT_LAYERC_MODULATION:
1384		tvp->u.data = c->layer[2].modulation;
1385		break;
1386	case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1387		tvp->u.data = c->layer[2].segment_count;
1388		break;
1389	case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1390		tvp->u.data = c->layer[2].interleaving;
1391		break;
1392	case DTV_ISDBS_TS_ID:
1393		tvp->u.data = c->isdbs_ts_id;
1394		break;
1395	case DTV_DVBT2_PLP_ID:
1396		tvp->u.data = c->dvbt2_plp_id;
1397		break;
1398	default:
1399		return -EINVAL;
1400	}
1401
1402	/* Allow the frontend to override outgoing properties */
1403	if (fe->ops.get_property) {
1404		r = fe->ops.get_property(fe, tvp);
1405		if (r < 0)
1406			return r;
1407	}
1408
1409	dtv_property_dump(tvp);
1410
1411	return 0;
1412}
1413
1414static int dtv_property_process_set(struct dvb_frontend *fe,
1415				    struct dtv_property *tvp,
1416				    struct file *file)
1417{
1418	int r = 0;
1419	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1420	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1421	dtv_property_dump(tvp);
1422
1423	/* Allow the frontend to validate incoming properties */
1424	if (fe->ops.set_property) {
1425		r = fe->ops.set_property(fe, tvp);
1426		if (r < 0)
1427			return r;
1428	}
1429
1430	switch(tvp->cmd) {
1431	case DTV_CLEAR:
1432		/* Reset a cache of data specific to the frontend here. This does
1433		 * not effect hardware.
1434		 */
1435		dvb_frontend_clear_cache(fe);
1436		dprintk("%s() Flushing property cache\n", __func__);
1437		break;
1438	case DTV_TUNE:
1439		/* interpret the cache of data, build either a traditional frontend
1440		 * tunerequest so we can pass validation in the FE_SET_FRONTEND
1441		 * ioctl.
1442		 */
1443		c->state = tvp->cmd;
1444		dprintk("%s() Finalised property cache\n", __func__);
1445		dtv_property_cache_submit(fe);
1446
1447		r = dvb_frontend_ioctl_legacy(file, FE_SET_FRONTEND,
1448			&fepriv->parameters_in);
1449		break;
1450	case DTV_FREQUENCY:
1451		c->frequency = tvp->u.data;
1452		break;
1453	case DTV_MODULATION:
1454		c->modulation = tvp->u.data;
1455		break;
1456	case DTV_BANDWIDTH_HZ:
1457		c->bandwidth_hz = tvp->u.data;
1458		break;
1459	case DTV_INVERSION:
1460		c->inversion = tvp->u.data;
1461		break;
1462	case DTV_SYMBOL_RATE:
1463		c->symbol_rate = tvp->u.data;
1464		break;
1465	case DTV_INNER_FEC:
1466		c->fec_inner = tvp->u.data;
1467		break;
1468	case DTV_PILOT:
1469		c->pilot = tvp->u.data;
1470		break;
1471	case DTV_ROLLOFF:
1472		c->rolloff = tvp->u.data;
1473		break;
1474	case DTV_DELIVERY_SYSTEM:
1475		c->delivery_system = tvp->u.data;
1476		break;
1477	case DTV_VOLTAGE:
1478		c->voltage = tvp->u.data;
1479		r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE,
1480			(void *)c->voltage);
1481		break;
1482	case DTV_TONE:
1483		c->sectone = tvp->u.data;
1484		r = dvb_frontend_ioctl_legacy(file, FE_SET_TONE,
1485			(void *)c->sectone);
1486		break;
1487	case DTV_CODE_RATE_HP:
1488		c->code_rate_HP = tvp->u.data;
1489		break;
1490	case DTV_CODE_RATE_LP:
1491		c->code_rate_LP = tvp->u.data;
1492		break;
1493	case DTV_GUARD_INTERVAL:
1494		c->guard_interval = tvp->u.data;
1495		break;
1496	case DTV_TRANSMISSION_MODE:
1497		c->transmission_mode = tvp->u.data;
1498		break;
1499	case DTV_HIERARCHY:
1500		c->hierarchy = tvp->u.data;
1501		break;
1502
1503	/* ISDB-T Support here */
1504	case DTV_ISDBT_PARTIAL_RECEPTION:
1505		c->isdbt_partial_reception = tvp->u.data;
1506		break;
1507	case DTV_ISDBT_SOUND_BROADCASTING:
1508		c->isdbt_sb_mode = tvp->u.data;
1509		break;
1510	case DTV_ISDBT_SB_SUBCHANNEL_ID:
1511		c->isdbt_sb_subchannel = tvp->u.data;
1512		break;
1513	case DTV_ISDBT_SB_SEGMENT_IDX:
1514		c->isdbt_sb_segment_idx = tvp->u.data;
1515		break;
1516	case DTV_ISDBT_SB_SEGMENT_COUNT:
1517		c->isdbt_sb_segment_count = tvp->u.data;
1518		break;
1519	case DTV_ISDBT_LAYER_ENABLED:
1520		c->isdbt_layer_enabled = tvp->u.data;
1521		break;
1522	case DTV_ISDBT_LAYERA_FEC:
1523		c->layer[0].fec = tvp->u.data;
1524		break;
1525	case DTV_ISDBT_LAYERA_MODULATION:
1526		c->layer[0].modulation = tvp->u.data;
1527		break;
1528	case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1529		c->layer[0].segment_count = tvp->u.data;
1530		break;
1531	case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1532		c->layer[0].interleaving = tvp->u.data;
1533		break;
1534	case DTV_ISDBT_LAYERB_FEC:
1535		c->layer[1].fec = tvp->u.data;
1536		break;
1537	case DTV_ISDBT_LAYERB_MODULATION:
1538		c->layer[1].modulation = tvp->u.data;
1539		break;
1540	case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1541		c->layer[1].segment_count = tvp->u.data;
1542		break;
1543	case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1544		c->layer[1].interleaving = tvp->u.data;
1545		break;
1546	case DTV_ISDBT_LAYERC_FEC:
1547		c->layer[2].fec = tvp->u.data;
1548		break;
1549	case DTV_ISDBT_LAYERC_MODULATION:
1550		c->layer[2].modulation = tvp->u.data;
1551		break;
1552	case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1553		c->layer[2].segment_count = tvp->u.data;
1554		break;
1555	case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1556		c->layer[2].interleaving = tvp->u.data;
1557		break;
1558	case DTV_ISDBS_TS_ID:
1559		c->isdbs_ts_id = tvp->u.data;
1560		break;
1561	case DTV_DVBT2_PLP_ID:
1562		c->dvbt2_plp_id = tvp->u.data;
1563		break;
1564	default:
1565		return -EINVAL;
1566	}
1567
1568	return r;
1569}
1570
1571static int dvb_frontend_ioctl(struct file *file,
1572			unsigned int cmd, void *parg)
1573{
1574	struct dvb_device *dvbdev = file->private_data;
1575	struct dvb_frontend *fe = dvbdev->priv;
1576	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1577	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1578	int err = -EOPNOTSUPP;
1579
1580	dprintk("%s (%d)\n", __func__, _IOC_NR(cmd));
1581
1582	if (fepriv->exit != DVB_FE_NO_EXIT)
1583		return -ENODEV;
1584
1585	if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
1586	    (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
1587	     cmd == FE_DISEQC_RECV_SLAVE_REPLY))
1588		return -EPERM;
1589
1590	if (down_interruptible (&fepriv->sem))
1591		return -ERESTARTSYS;
1592
1593	if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
1594		err = dvb_frontend_ioctl_properties(file, cmd, parg);
1595	else {
1596		c->state = DTV_UNDEFINED;
1597		err = dvb_frontend_ioctl_legacy(file, cmd, parg);
1598	}
1599
1600	up(&fepriv->sem);
1601	return err;
1602}
1603
1604static int dvb_frontend_ioctl_properties(struct file *file,
1605			unsigned int cmd, void *parg)
1606{
1607	struct dvb_device *dvbdev = file->private_data;
1608	struct dvb_frontend *fe = dvbdev->priv;
1609	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1610	int err = 0;
1611
1612	struct dtv_properties *tvps = NULL;
1613	struct dtv_property *tvp = NULL;
1614	int i;
1615
1616	dprintk("%s\n", __func__);
1617
1618	if(cmd == FE_SET_PROPERTY) {
1619		tvps = (struct dtv_properties __user *)parg;
1620
1621		dprintk("%s() properties.num = %d\n", __func__, tvps->num);
1622		dprintk("%s() properties.props = %p\n", __func__, tvps->props);
1623
1624		/* Put an arbitrary limit on the number of messages that can
1625		 * be sent at once */
1626		if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1627			return -EINVAL;
1628
1629		tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1630		if (!tvp) {
1631			err = -ENOMEM;
1632			goto out;
1633		}
1634
1635		if (copy_from_user(tvp, tvps->props, tvps->num * sizeof(struct dtv_property))) {
1636			err = -EFAULT;
1637			goto out;
1638		}
1639
1640		for (i = 0; i < tvps->num; i++) {
1641			err = dtv_property_process_set(fe, tvp + i, file);
1642			if (err < 0)
1643				goto out;
1644			(tvp + i)->result = err;
1645		}
1646
1647		if (c->state == DTV_TUNE)
1648			dprintk("%s() Property cache is full, tuning\n", __func__);
1649
1650	} else
1651	if(cmd == FE_GET_PROPERTY) {
1652
1653		tvps = (struct dtv_properties __user *)parg;
1654
1655		dprintk("%s() properties.num = %d\n", __func__, tvps->num);
1656		dprintk("%s() properties.props = %p\n", __func__, tvps->props);
1657
1658		/* Put an arbitrary limit on the number of messages that can
1659		 * be sent at once */
1660		if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1661			return -EINVAL;
1662
1663		tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1664		if (!tvp) {
1665			err = -ENOMEM;
1666			goto out;
1667		}
1668
1669		if (copy_from_user(tvp, tvps->props, tvps->num * sizeof(struct dtv_property))) {
1670			err = -EFAULT;
1671			goto out;
1672		}
1673
1674		for (i = 0; i < tvps->num; i++) {
1675			err = dtv_property_process_get(fe, tvp + i, file);
1676			if (err < 0)
1677				goto out;
1678			(tvp + i)->result = err;
1679		}
1680
1681		if (copy_to_user(tvps->props, tvp, tvps->num * sizeof(struct dtv_property))) {
1682			err = -EFAULT;
1683			goto out;
1684		}
1685
1686	} else
1687		err = -EOPNOTSUPP;
1688
1689out:
1690	kfree(tvp);
1691	return err;
1692}
1693
1694static int dvb_frontend_ioctl_legacy(struct file *file,
1695			unsigned int cmd, void *parg)
1696{
1697	struct dvb_device *dvbdev = file->private_data;
1698	struct dvb_frontend *fe = dvbdev->priv;
1699	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1700	int cb_err, err = -EOPNOTSUPP;
1701
1702	if (fe->dvb->fe_ioctl_override) {
1703		cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
1704						    DVB_FE_IOCTL_PRE);
1705		if (cb_err < 0)
1706			return cb_err;
1707		if (cb_err > 0)
1708			return 0;
1709		/* fe_ioctl_override returning 0 allows
1710		 * dvb-core to continue handling the ioctl */
1711	}
1712
1713	switch (cmd) {
1714	case FE_GET_INFO: {
1715		struct dvb_frontend_info* info = parg;
1716		memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info));
1717		dvb_frontend_get_frequency_limits(fe, &info->frequency_min, &info->frequency_max);
1718
1719		/* Force the CAN_INVERSION_AUTO bit on. If the frontend doesn't
1720		 * do it, it is done for it. */
1721		info->caps |= FE_CAN_INVERSION_AUTO;
1722		err = 0;
1723		break;
1724	}
1725
1726	case FE_READ_STATUS: {
1727		fe_status_t* status = parg;
1728
1729		/* if retune was requested but hasn't occurred yet, prevent
1730		 * that user get signal state from previous tuning */
1731		if (fepriv->state == FESTATE_RETUNE ||
1732		    fepriv->state == FESTATE_ERROR) {
1733			err=0;
1734			*status = 0;
1735			break;
1736		}
1737
1738		if (fe->ops.read_status)
1739			err = fe->ops.read_status(fe, status);
1740		break;
1741	}
1742	case FE_READ_BER:
1743		if (fe->ops.read_ber)
1744			err = fe->ops.read_ber(fe, (__u32*) parg);
1745		break;
1746
1747	case FE_READ_SIGNAL_STRENGTH:
1748		if (fe->ops.read_signal_strength)
1749			err = fe->ops.read_signal_strength(fe, (__u16*) parg);
1750		break;
1751
1752	case FE_READ_SNR:
1753		if (fe->ops.read_snr)
1754			err = fe->ops.read_snr(fe, (__u16*) parg);
1755		break;
1756
1757	case FE_READ_UNCORRECTED_BLOCKS:
1758		if (fe->ops.read_ucblocks)
1759			err = fe->ops.read_ucblocks(fe, (__u32*) parg);
1760		break;
1761
1762
1763	case FE_DISEQC_RESET_OVERLOAD:
1764		if (fe->ops.diseqc_reset_overload) {
1765			err = fe->ops.diseqc_reset_overload(fe);
1766			fepriv->state = FESTATE_DISEQC;
1767			fepriv->status = 0;
1768		}
1769		break;
1770
1771	case FE_DISEQC_SEND_MASTER_CMD:
1772		if (fe->ops.diseqc_send_master_cmd) {
1773			err = fe->ops.diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg);
1774			fepriv->state = FESTATE_DISEQC;
1775			fepriv->status = 0;
1776		}
1777		break;
1778
1779	case FE_DISEQC_SEND_BURST:
1780		if (fe->ops.diseqc_send_burst) {
1781			err = fe->ops.diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg);
1782			fepriv->state = FESTATE_DISEQC;
1783			fepriv->status = 0;
1784		}
1785		break;
1786
1787	case FE_SET_TONE:
1788		if (fe->ops.set_tone) {
1789			err = fe->ops.set_tone(fe, (fe_sec_tone_mode_t) parg);
1790			fepriv->tone = (fe_sec_tone_mode_t) parg;
1791			fepriv->state = FESTATE_DISEQC;
1792			fepriv->status = 0;
1793		}
1794		break;
1795
1796	case FE_SET_VOLTAGE:
1797		if (fe->ops.set_voltage) {
1798			err = fe->ops.set_voltage(fe, (fe_sec_voltage_t) parg);
1799			fepriv->voltage = (fe_sec_voltage_t) parg;
1800			fepriv->state = FESTATE_DISEQC;
1801			fepriv->status = 0;
1802		}
1803		break;
1804
1805	case FE_DISHNETWORK_SEND_LEGACY_CMD:
1806		if (fe->ops.dishnetwork_send_legacy_command) {
1807			err = fe->ops.dishnetwork_send_legacy_command(fe, (unsigned long) parg);
1808			fepriv->state = FESTATE_DISEQC;
1809			fepriv->status = 0;
1810		} else if (fe->ops.set_voltage) {
1811			/*
1812			 * NOTE: This is a fallback condition.  Some frontends
1813			 * (stv0299 for instance) take longer than 8msec to
1814			 * respond to a set_voltage command.  Those switches
1815			 * need custom routines to switch properly.  For all
1816			 * other frontends, the following should work ok.
1817			 * Dish network legacy switches (as used by Dish500)
1818			 * are controlled by sending 9-bit command words
1819			 * spaced 8msec apart.
1820			 * the actual command word is switch/port dependent
1821			 * so it is up to the userspace application to send
1822			 * the right command.
1823			 * The command must always start with a '0' after
1824			 * initialization, so parg is 8 bits and does not
1825			 * include the initialization or start bit
1826			 */
1827			unsigned long swcmd = ((unsigned long) parg) << 1;
1828			struct timeval nexttime;
1829			struct timeval tv[10];
1830			int i;
1831			u8 last = 1;
1832			if (dvb_frontend_debug)
1833				printk("%s switch command: 0x%04lx\n", __func__, swcmd);
1834			do_gettimeofday(&nexttime);
1835			if (dvb_frontend_debug)
1836				memcpy(&tv[0], &nexttime, sizeof(struct timeval));
1837			/* before sending a command, initialize by sending
1838			 * a 32ms 18V to the switch
1839			 */
1840			fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
1841			dvb_frontend_sleep_until(&nexttime, 32000);
1842
1843			for (i = 0; i < 9; i++) {
1844				if (dvb_frontend_debug)
1845					do_gettimeofday(&tv[i + 1]);
1846				if ((swcmd & 0x01) != last) {
1847					/* set voltage to (last ? 13V : 18V) */
1848					fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
1849					last = (last) ? 0 : 1;
1850				}
1851				swcmd = swcmd >> 1;
1852				if (i != 8)
1853					dvb_frontend_sleep_until(&nexttime, 8000);
1854			}
1855			if (dvb_frontend_debug) {
1856				printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
1857					__func__, fe->dvb->num);
1858				for (i = 1; i < 10; i++)
1859					printk("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i]));
1860			}
1861			err = 0;
1862			fepriv->state = FESTATE_DISEQC;
1863			fepriv->status = 0;
1864		}
1865		break;
1866
1867	case FE_DISEQC_RECV_SLAVE_REPLY:
1868		if (fe->ops.diseqc_recv_slave_reply)
1869			err = fe->ops.diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
1870		break;
1871
1872	case FE_ENABLE_HIGH_LNB_VOLTAGE:
1873		if (fe->ops.enable_high_lnb_voltage)
1874			err = fe->ops.enable_high_lnb_voltage(fe, (long) parg);
1875		break;
1876
1877	case FE_SET_FRONTEND: {
1878		struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1879		struct dvb_frontend_tune_settings fetunesettings;
1880
1881		if (c->state == DTV_TUNE) {
1882			if (dvb_frontend_check_parameters(fe, &fepriv->parameters_in) < 0) {
1883				err = -EINVAL;
1884				break;
1885			}
1886		} else {
1887			if (dvb_frontend_check_parameters(fe, parg) < 0) {
1888				err = -EINVAL;
1889				break;
1890			}
1891
1892			memcpy (&fepriv->parameters_in, parg,
1893				sizeof (struct dvb_frontend_parameters));
1894			dtv_property_cache_init(fe, c);
1895			dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
1896		}
1897
1898		/*
1899		 * Initialize output parameters to match the values given by
1900		 * the user. FE_SET_FRONTEND triggers an initial frontend event
1901		 * with status = 0, which copies output parameters to userspace.
1902		 */
1903		fepriv->parameters_out = fepriv->parameters_in;
1904
1905		memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
1906		memcpy(&fetunesettings.parameters, parg,
1907		       sizeof (struct dvb_frontend_parameters));
1908
1909		/* force auto frequency inversion if requested */
1910		if (dvb_force_auto_inversion) {
1911			fepriv->parameters_in.inversion = INVERSION_AUTO;
1912			fetunesettings.parameters.inversion = INVERSION_AUTO;
1913		}
1914		if (fe->ops.info.type == FE_OFDM) {
1915			/* without hierarchical coding code_rate_LP is irrelevant,
1916			 * so we tolerate the otherwise invalid FEC_NONE setting */
1917			if (fepriv->parameters_in.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
1918			    fepriv->parameters_in.u.ofdm.code_rate_LP == FEC_NONE)
1919				fepriv->parameters_in.u.ofdm.code_rate_LP = FEC_AUTO;
1920		}
1921
1922		/* get frontend-specific tuning settings */
1923		if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
1924			fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
1925			fepriv->max_drift = fetunesettings.max_drift;
1926			fepriv->step_size = fetunesettings.step_size;
1927		} else {
1928			/* default values */
1929			switch(fe->ops.info.type) {
1930			case FE_QPSK:
1931				fepriv->min_delay = HZ/20;
1932				fepriv->step_size = fepriv->parameters_in.u.qpsk.symbol_rate / 16000;
1933				fepriv->max_drift = fepriv->parameters_in.u.qpsk.symbol_rate / 2000;
1934				break;
1935
1936			case FE_QAM:
1937				fepriv->min_delay = HZ/20;
1938				fepriv->step_size = 0; /* no zigzag */
1939				fepriv->max_drift = 0;
1940				break;
1941
1942			case FE_OFDM:
1943				fepriv->min_delay = HZ/20;
1944				fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
1945				fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
1946				break;
1947			case FE_ATSC:
1948				fepriv->min_delay = HZ/20;
1949				fepriv->step_size = 0;
1950				fepriv->max_drift = 0;
1951				break;
1952			}
1953		}
1954		if (dvb_override_tune_delay > 0)
1955			fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
1956
1957		fepriv->state = FESTATE_RETUNE;
1958
1959		/* Request the search algorithm to search */
1960		fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
1961
1962		dvb_frontend_clear_events(fe);
1963		dvb_frontend_add_event(fe, 0);
1964		dvb_frontend_wakeup(fe);
1965		fepriv->status = 0;
1966		err = 0;
1967		break;
1968	}
1969
1970	case FE_GET_EVENT:
1971		err = dvb_frontend_get_event (fe, parg, file->f_flags);
1972		break;
1973
1974	case FE_GET_FRONTEND:
1975		if (fe->ops.get_frontend) {
1976			err = fe->ops.get_frontend(fe, &fepriv->parameters_out);
1977			memcpy(parg, &fepriv->parameters_out, sizeof(struct dvb_frontend_parameters));
1978		}
1979		break;
1980
1981	case FE_SET_FRONTEND_TUNE_MODE:
1982		fepriv->tune_mode_flags = (unsigned long) parg;
1983		err = 0;
1984		break;
1985	};
1986
1987	if (fe->dvb->fe_ioctl_override) {
1988		cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
1989						    DVB_FE_IOCTL_POST);
1990		if (cb_err < 0)
1991			return cb_err;
1992	}
1993
1994	return err;
1995}
1996
1997
1998static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
1999{
2000	struct dvb_device *dvbdev = file->private_data;
2001	struct dvb_frontend *fe = dvbdev->priv;
2002	struct dvb_frontend_private *fepriv = fe->frontend_priv;
2003
2004	dprintk ("%s\n", __func__);
2005
2006	poll_wait (file, &fepriv->events.wait_queue, wait);
2007
2008	if (fepriv->events.eventw != fepriv->events.eventr)
2009		return (POLLIN | POLLRDNORM | POLLPRI);
2010
2011	return 0;
2012}
2013
2014static int dvb_frontend_open(struct inode *inode, struct file *file)
2015{
2016	struct dvb_device *dvbdev = file->private_data;
2017	struct dvb_frontend *fe = dvbdev->priv;
2018	struct dvb_frontend_private *fepriv = fe->frontend_priv;
2019	struct dvb_adapter *adapter = fe->dvb;
2020	int ret;
2021
2022	dprintk ("%s\n", __func__);
2023	if (fepriv->exit == DVB_FE_DEVICE_REMOVED)
2024		return -ENODEV;
2025
2026	if (adapter->mfe_shared) {
2027		mutex_lock (&adapter->mfe_lock);
2028
2029		if (adapter->mfe_dvbdev == NULL)
2030			adapter->mfe_dvbdev = dvbdev;
2031
2032		else if (adapter->mfe_dvbdev != dvbdev) {
2033			struct dvb_device
2034				*mfedev = adapter->mfe_dvbdev;
2035			struct dvb_frontend
2036				*mfe = mfedev->priv;
2037			struct dvb_frontend_private
2038				*mfepriv = mfe->frontend_priv;
2039			int mferetry = (dvb_mfe_wait_time << 1);
2040
2041			mutex_unlock (&adapter->mfe_lock);
2042			while (mferetry-- && (mfedev->users != -1 ||
2043					mfepriv->thread != NULL)) {
2044				if(msleep_interruptible(500)) {
2045					if(signal_pending(current))
2046						return -EINTR;
2047				}
2048			}
2049
2050			mutex_lock (&adapter->mfe_lock);
2051			if(adapter->mfe_dvbdev != dvbdev) {
2052				mfedev = adapter->mfe_dvbdev;
2053				mfe = mfedev->priv;
2054				mfepriv = mfe->frontend_priv;
2055				if (mfedev->users != -1 ||
2056						mfepriv->thread != NULL) {
2057					mutex_unlock (&adapter->mfe_lock);
2058					return -EBUSY;
2059				}
2060				adapter->mfe_dvbdev = dvbdev;
2061			}
2062		}
2063	}
2064
2065	if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
2066		if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
2067			goto err0;
2068
2069		/* If we took control of the bus, we need to force
2070		   reinitialization.  This is because many ts_bus_ctrl()
2071		   functions strobe the RESET pin on the demod, and if the
2072		   frontend thread already exists then the dvb_init() routine
2073		   won't get called (which is what usually does initial
2074		   register configuration). */
2075		fepriv->reinitialise = 1;
2076	}
2077
2078	if ((ret = dvb_generic_open (inode, file)) < 0)
2079		goto err1;
2080
2081	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2082		/* normal tune mode when opened R/W */
2083		fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
2084		fepriv->tone = -1;
2085		fepriv->voltage = -1;
2086
2087		ret = dvb_frontend_start (fe);
2088		if (ret)
2089			goto err2;
2090
2091		/*  empty event queue */
2092		fepriv->events.eventr = fepriv->events.eventw = 0;
2093	}
2094
2095	if (adapter->mfe_shared)
2096		mutex_unlock (&adapter->mfe_lock);
2097	return ret;
2098
2099err2:
2100	dvb_generic_release(inode, file);
2101err1:
2102	if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
2103		fe->ops.ts_bus_ctrl(fe, 0);
2104err0:
2105	if (adapter->mfe_shared)
2106		mutex_unlock (&adapter->mfe_lock);
2107	return ret;
2108}
2109
2110static int dvb_frontend_release(struct inode *inode, struct file *file)
2111{
2112	struct dvb_device *dvbdev = file->private_data;
2113	struct dvb_frontend *fe = dvbdev->priv;
2114	struct dvb_frontend_private *fepriv = fe->frontend_priv;
2115	int ret;
2116
2117	dprintk ("%s\n", __func__);
2118
2119	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2120		fepriv->release_jiffies = jiffies;
2121		mb();
2122	}
2123
2124	ret = dvb_generic_release (inode, file);
2125
2126	if (dvbdev->users == -1) {
2127		wake_up(&fepriv->wait_queue);
2128		if (fepriv->exit != DVB_FE_NO_EXIT) {
2129			fops_put(file->f_op);
2130			file->f_op = NULL;
2131			wake_up(&dvbdev->wait_queue);
2132		}
2133		if (fe->ops.ts_bus_ctrl)
2134			fe->ops.ts_bus_ctrl(fe, 0);
2135	}
2136
2137	return ret;
2138}
2139
2140static const struct file_operations dvb_frontend_fops = {
2141	.owner		= THIS_MODULE,
2142	.unlocked_ioctl	= dvb_generic_ioctl,
2143	.poll		= dvb_frontend_poll,
2144	.open		= dvb_frontend_open,
2145	.release	= dvb_frontend_release,
2146	.llseek		= noop_llseek,
2147};
2148
2149int dvb_register_frontend(struct dvb_adapter* dvb,
2150			  struct dvb_frontend* fe)
2151{
2152	struct dvb_frontend_private *fepriv;
2153	static const struct dvb_device dvbdev_template = {
2154		.users = ~0,
2155		.writers = 1,
2156		.readers = (~0)-1,
2157		.fops = &dvb_frontend_fops,
2158		.kernel_ioctl = dvb_frontend_ioctl
2159	};
2160
2161	dprintk ("%s\n", __func__);
2162
2163	if (mutex_lock_interruptible(&frontend_mutex))
2164		return -ERESTARTSYS;
2165
2166	fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
2167	if (fe->frontend_priv == NULL) {
2168		mutex_unlock(&frontend_mutex);
2169		return -ENOMEM;
2170	}
2171	fepriv = fe->frontend_priv;
2172
2173	sema_init(&fepriv->sem, 1);
2174	init_waitqueue_head (&fepriv->wait_queue);
2175	init_waitqueue_head (&fepriv->events.wait_queue);
2176	mutex_init(&fepriv->events.mtx);
2177	fe->dvb = dvb;
2178	fepriv->inversion = INVERSION_OFF;
2179
2180	printk ("DVB: registering adapter %i frontend %i (%s)...\n",
2181		fe->dvb->num,
2182		fe->id,
2183		fe->ops.info.name);
2184
2185	dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
2186			     fe, DVB_DEVICE_FRONTEND);
2187
2188	mutex_unlock(&frontend_mutex);
2189	return 0;
2190}
2191EXPORT_SYMBOL(dvb_register_frontend);
2192
2193int dvb_unregister_frontend(struct dvb_frontend* fe)
2194{
2195	struct dvb_frontend_private *fepriv = fe->frontend_priv;
2196	dprintk ("%s\n", __func__);
2197
2198	mutex_lock(&frontend_mutex);
2199	dvb_frontend_stop (fe);
2200	mutex_unlock(&frontend_mutex);
2201
2202	if (fepriv->dvbdev->users < -1)
2203		wait_event(fepriv->dvbdev->wait_queue,
2204				fepriv->dvbdev->users==-1);
2205
2206	mutex_lock(&frontend_mutex);
2207	dvb_unregister_device (fepriv->dvbdev);
2208
2209	/* fe is invalid now */
2210	kfree(fepriv);
2211	mutex_unlock(&frontend_mutex);
2212	return 0;
2213}
2214EXPORT_SYMBOL(dvb_unregister_frontend);
2215
2216#ifdef CONFIG_MEDIA_ATTACH
2217void dvb_frontend_detach(struct dvb_frontend* fe)
2218{
2219	void *ptr;
2220
2221	if (fe->ops.release_sec) {
2222		fe->ops.release_sec(fe);
2223		symbol_put_addr(fe->ops.release_sec);
2224	}
2225	if (fe->ops.tuner_ops.release) {
2226		fe->ops.tuner_ops.release(fe);
2227		symbol_put_addr(fe->ops.tuner_ops.release);
2228	}
2229	if (fe->ops.analog_ops.release) {
2230		fe->ops.analog_ops.release(fe);
2231		symbol_put_addr(fe->ops.analog_ops.release);
2232	}
2233	ptr = (void*)fe->ops.release;
2234	if (ptr) {
2235		fe->ops.release(fe);
2236		symbol_put_addr(ptr);
2237	}
2238}
2239#else
2240void dvb_frontend_detach(struct dvb_frontend* fe)
2241{
2242	if (fe->ops.release_sec)
2243		fe->ops.release_sec(fe);
2244	if (fe->ops.tuner_ops.release)
2245		fe->ops.tuner_ops.release(fe);
2246	if (fe->ops.analog_ops.release)
2247		fe->ops.analog_ops.release(fe);
2248	if (fe->ops.release)
2249		fe->ops.release(fe);
2250}
2251#endif
2252EXPORT_SYMBOL(dvb_frontend_detach);
2253