dvb_frontend.c revision e23d9ae343f9d196382ab213612d76126f9c99af
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;
109	struct dvb_fe_events events;
110	struct semaphore sem;
111	struct list_head list_head;
112	wait_queue_head_t wait_queue;
113	struct task_struct *thread;
114	unsigned long release_jiffies;
115	unsigned int exit;
116	unsigned int wakeup;
117	fe_status_t status;
118	unsigned long tune_mode_flags;
119	unsigned int delay;
120	unsigned int reinitialise;
121	int tone;
122	int voltage;
123
124	/* swzigzag values */
125	unsigned int state;
126	unsigned int bending;
127	int lnb_drift;
128	unsigned int inversion;
129	unsigned int auto_step;
130	unsigned int auto_sub_step;
131	unsigned int started_auto_step;
132	unsigned int min_delay;
133	unsigned int max_drift;
134	unsigned int step_size;
135	int quality;
136	unsigned int check_wrapped;
137	enum dvbfe_search algo_status;
138};
139
140static void dvb_frontend_wakeup(struct dvb_frontend *fe);
141
142static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
143{
144	struct dvb_frontend_private *fepriv = fe->frontend_priv;
145	struct dvb_fe_events *events = &fepriv->events;
146	struct dvb_frontend_event *e;
147	int wp;
148
149	dprintk ("%s\n", __func__);
150
151	if (mutex_lock_interruptible (&events->mtx))
152		return;
153
154	wp = (events->eventw + 1) % MAX_EVENT;
155
156	if (wp == events->eventr) {
157		events->overflow = 1;
158		events->eventr = (events->eventr + 1) % MAX_EVENT;
159	}
160
161	e = &events->events[events->eventw];
162
163	memcpy (&e->parameters, &fepriv->parameters,
164		sizeof (struct dvb_frontend_parameters));
165
166	if (status & FE_HAS_LOCK)
167		if (fe->ops.get_frontend)
168			fe->ops.get_frontend(fe, &e->parameters);
169
170	events->eventw = wp;
171
172	mutex_unlock(&events->mtx);
173
174	e->status = status;
175
176	wake_up_interruptible (&events->wait_queue);
177}
178
179static int dvb_frontend_get_event(struct dvb_frontend *fe,
180			    struct dvb_frontend_event *event, int flags)
181{
182	struct dvb_frontend_private *fepriv = fe->frontend_priv;
183	struct dvb_fe_events *events = &fepriv->events;
184
185	dprintk ("%s\n", __func__);
186
187	if (events->overflow) {
188		events->overflow = 0;
189		return -EOVERFLOW;
190	}
191
192	if (events->eventw == events->eventr) {
193		int ret;
194
195		if (flags & O_NONBLOCK)
196			return -EWOULDBLOCK;
197
198		up(&fepriv->sem);
199
200		ret = wait_event_interruptible (events->wait_queue,
201						events->eventw != events->eventr);
202
203		if (down_interruptible (&fepriv->sem))
204			return -ERESTARTSYS;
205
206		if (ret < 0)
207			return ret;
208	}
209
210	if (mutex_lock_interruptible (&events->mtx))
211		return -ERESTARTSYS;
212
213	memcpy (event, &events->events[events->eventr],
214		sizeof(struct dvb_frontend_event));
215
216	events->eventr = (events->eventr + 1) % MAX_EVENT;
217
218	mutex_unlock(&events->mtx);
219
220	return 0;
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.inversion;
281	u32 original_frequency = fepriv->parameters.frequency;
282
283	/* are we using autoinversion? */
284	autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
285			 (fepriv->parameters.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.frequency += fepriv->lnb_drift;
352	if (autoinversion)
353		fepriv->parameters.inversion = fepriv->inversion;
354	if (fe->ops.set_frontend)
355		fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters);
356	if (fe_set_err < 0) {
357		fepriv->state = FESTATE_ERROR;
358		return fe_set_err;
359	}
360
361	fepriv->parameters.frequency = original_frequency;
362	fepriv->parameters.inversion = original_inversion;
363
364	fepriv->auto_sub_step++;
365	return 0;
366}
367
368static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
369{
370	fe_status_t s = 0;
371	int retval = 0;
372	struct dvb_frontend_private *fepriv = fe->frontend_priv;
373
374	/* if we've got no parameters, just keep idling */
375	if (fepriv->state & FESTATE_IDLE) {
376		fepriv->delay = 3*HZ;
377		fepriv->quality = 0;
378		return;
379	}
380
381	/* in SCAN mode, we just set the frontend when asked and leave it alone */
382	if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
383		if (fepriv->state & FESTATE_RETUNE) {
384			if (fe->ops.set_frontend)
385				retval = fe->ops.set_frontend(fe,
386							&fepriv->parameters);
387			if (retval < 0)
388				fepriv->state = FESTATE_ERROR;
389			else
390				fepriv->state = FESTATE_TUNED;
391		}
392		fepriv->delay = 3*HZ;
393		fepriv->quality = 0;
394		return;
395	}
396
397	/* get the frontend status */
398	if (fepriv->state & FESTATE_RETUNE) {
399		s = 0;
400	} else {
401		if (fe->ops.read_status)
402			fe->ops.read_status(fe, &s);
403		if (s != fepriv->status) {
404			dvb_frontend_add_event(fe, s);
405			fepriv->status = s;
406		}
407	}
408
409	/* if we're not tuned, and we have a lock, move to the TUNED state */
410	if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
411		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
412		fepriv->state = FESTATE_TUNED;
413
414		/* if we're tuned, then we have determined the correct inversion */
415		if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
416		    (fepriv->parameters.inversion == INVERSION_AUTO)) {
417			fepriv->parameters.inversion = fepriv->inversion;
418		}
419		return;
420	}
421
422	/* if we are tuned already, check we're still locked */
423	if (fepriv->state & FESTATE_TUNED) {
424		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
425
426		/* we're tuned, and the lock is still good... */
427		if (s & FE_HAS_LOCK) {
428			return;
429		} else { /* if we _WERE_ tuned, but now don't have a lock */
430			fepriv->state = FESTATE_ZIGZAG_FAST;
431			fepriv->started_auto_step = fepriv->auto_step;
432			fepriv->check_wrapped = 0;
433		}
434	}
435
436	/* don't actually do anything if we're in the LOSTLOCK state,
437	 * the frontend is set to FE_CAN_RECOVER, and the max_drift is 0 */
438	if ((fepriv->state & FESTATE_LOSTLOCK) &&
439	    (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
440		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
441		return;
442	}
443
444	/* don't do anything if we're in the DISEQC state, since this
445	 * might be someone with a motorized dish controlled by DISEQC.
446	 * If its actually a re-tune, there will be a SET_FRONTEND soon enough.	*/
447	if (fepriv->state & FESTATE_DISEQC) {
448		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
449		return;
450	}
451
452	/* if we're in the RETUNE state, set everything up for a brand
453	 * new scan, keeping the current inversion setting, as the next
454	 * tune is _very_ likely to require the same */
455	if (fepriv->state & FESTATE_RETUNE) {
456		fepriv->lnb_drift = 0;
457		fepriv->auto_step = 0;
458		fepriv->auto_sub_step = 0;
459		fepriv->started_auto_step = 0;
460		fepriv->check_wrapped = 0;
461	}
462
463	/* fast zigzag. */
464	if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
465		fepriv->delay = fepriv->min_delay;
466
467		/* perform a tune */
468		retval = dvb_frontend_swzigzag_autotune(fe,
469							fepriv->check_wrapped);
470		if (retval < 0) {
471			return;
472		} else if (retval) {
473			/* OK, if we've run out of trials at the fast speed.
474			 * Drop back to slow for the _next_ attempt */
475			fepriv->state = FESTATE_SEARCHING_SLOW;
476			fepriv->started_auto_step = fepriv->auto_step;
477			return;
478		}
479		fepriv->check_wrapped = 1;
480
481		/* if we've just retuned, enter the ZIGZAG_FAST state.
482		 * This ensures we cannot return from an
483		 * FE_SET_FRONTEND ioctl before the first frontend tune
484		 * occurs */
485		if (fepriv->state & FESTATE_RETUNE) {
486			fepriv->state = FESTATE_TUNING_FAST;
487		}
488	}
489
490	/* slow zigzag */
491	if (fepriv->state & FESTATE_SEARCHING_SLOW) {
492		dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
493
494		/* Note: don't bother checking for wrapping; we stay in this
495		 * state until we get a lock */
496		dvb_frontend_swzigzag_autotune(fe, 0);
497	}
498}
499
500static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
501{
502	struct dvb_frontend_private *fepriv = fe->frontend_priv;
503
504	if (fepriv->exit != DVB_FE_NO_EXIT)
505		return 1;
506
507	if (fepriv->dvbdev->writers == 1)
508		if (time_after(jiffies, fepriv->release_jiffies +
509				  dvb_shutdown_timeout * HZ))
510			return 1;
511
512	return 0;
513}
514
515static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
516{
517	struct dvb_frontend_private *fepriv = fe->frontend_priv;
518
519	if (fepriv->wakeup) {
520		fepriv->wakeup = 0;
521		return 1;
522	}
523	return dvb_frontend_is_exiting(fe);
524}
525
526static void dvb_frontend_wakeup(struct dvb_frontend *fe)
527{
528	struct dvb_frontend_private *fepriv = fe->frontend_priv;
529
530	fepriv->wakeup = 1;
531	wake_up_interruptible(&fepriv->wait_queue);
532}
533
534static int dvb_frontend_thread(void *data)
535{
536	struct dvb_frontend *fe = data;
537	struct dvb_frontend_private *fepriv = fe->frontend_priv;
538	unsigned long timeout;
539	fe_status_t s;
540	enum dvbfe_algo algo;
541
542	struct dvb_frontend_parameters *params;
543
544	dprintk("%s\n", __func__);
545
546	fepriv->check_wrapped = 0;
547	fepriv->quality = 0;
548	fepriv->delay = 3*HZ;
549	fepriv->status = 0;
550	fepriv->wakeup = 0;
551	fepriv->reinitialise = 0;
552
553	dvb_frontend_init(fe);
554
555	set_freezable();
556	while (1) {
557		up(&fepriv->sem);	    /* is locked when we enter the thread... */
558restart:
559		timeout = wait_event_interruptible_timeout(fepriv->wait_queue,
560			dvb_frontend_should_wakeup(fe) || kthread_should_stop()
561				|| freezing(current),
562			fepriv->delay);
563
564		if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
565			/* got signal or quitting */
566			fepriv->exit = DVB_FE_NORMAL_EXIT;
567			break;
568		}
569
570		if (try_to_freeze())
571			goto restart;
572
573		if (down_interruptible(&fepriv->sem))
574			break;
575
576		if (fepriv->reinitialise) {
577			dvb_frontend_init(fe);
578			if (fepriv->tone != -1) {
579				fe->ops.set_tone(fe, fepriv->tone);
580			}
581			if (fepriv->voltage != -1) {
582				fe->ops.set_voltage(fe, fepriv->voltage);
583			}
584			fepriv->reinitialise = 0;
585		}
586
587		/* do an iteration of the tuning loop */
588		if (fe->ops.get_frontend_algo) {
589			algo = fe->ops.get_frontend_algo(fe);
590			switch (algo) {
591			case DVBFE_ALGO_HW:
592				dprintk("%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
593				params = NULL; /* have we been asked to RETUNE ? */
594
595				if (fepriv->state & FESTATE_RETUNE) {
596					dprintk("%s: Retune requested, FESTATE_RETUNE\n", __func__);
597					params = &fepriv->parameters;
598					fepriv->state = FESTATE_TUNED;
599				}
600
601				if (fe->ops.tune)
602					fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
603
604				if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
605					dprintk("%s: state changed, adding current state\n", __func__);
606					dvb_frontend_add_event(fe, s);
607					fepriv->status = s;
608				}
609				break;
610			case DVBFE_ALGO_SW:
611				dprintk("%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
612				dvb_frontend_swzigzag(fe);
613				break;
614			case DVBFE_ALGO_CUSTOM:
615				params = NULL; /* have we been asked to RETUNE ?	*/
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					params = &fepriv->parameters;
620					fepriv->state = FESTATE_TUNED;
621				}
622				/* Case where we are going to search for a carrier
623				 * User asked us to retune again for some reason, possibly
624				 * requesting a search with a new set of parameters
625				 */
626				if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
627					if (fe->ops.search) {
628						fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters);
629						/* We did do a search as was requested, the flags are
630						 * now unset as well and has the flags wrt to search.
631						 */
632					} else {
633						fepriv->algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN;
634					}
635				}
636				/* Track the carrier if the search was successful */
637				if (fepriv->algo_status == DVBFE_ALGO_SEARCH_SUCCESS) {
638					if (fe->ops.track)
639						fe->ops.track(fe, &fepriv->parameters);
640				} else {
641					fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
642					fepriv->delay = HZ / 2;
643				}
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	int i;
864
865	memset(&(fe->dtv_property_cache), 0,
866			sizeof(struct dtv_frontend_properties));
867
868	fe->dtv_property_cache.state = DTV_CLEAR;
869	fe->dtv_property_cache.delivery_system = SYS_UNDEFINED;
870	fe->dtv_property_cache.inversion = INVERSION_AUTO;
871	fe->dtv_property_cache.fec_inner = FEC_AUTO;
872	fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
873	fe->dtv_property_cache.bandwidth_hz = BANDWIDTH_AUTO;
874	fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
875	fe->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
876	fe->dtv_property_cache.symbol_rate = QAM_AUTO;
877	fe->dtv_property_cache.code_rate_HP = FEC_AUTO;
878	fe->dtv_property_cache.code_rate_LP = FEC_AUTO;
879
880	fe->dtv_property_cache.isdbt_partial_reception = -1;
881	fe->dtv_property_cache.isdbt_sb_mode = -1;
882	fe->dtv_property_cache.isdbt_sb_subchannel = -1;
883	fe->dtv_property_cache.isdbt_sb_segment_idx = -1;
884	fe->dtv_property_cache.isdbt_sb_segment_count = -1;
885	fe->dtv_property_cache.isdbt_layer_enabled = 0x7;
886	for (i = 0; i < 3; i++) {
887		fe->dtv_property_cache.layer[i].fec = FEC_AUTO;
888		fe->dtv_property_cache.layer[i].modulation = QAM_AUTO;
889		fe->dtv_property_cache.layer[i].interleaving = -1;
890		fe->dtv_property_cache.layer[i].segment_count = -1;
891	}
892
893	return 0;
894}
895
896#define _DTV_CMD(n, s, b) \
897[n] = { \
898	.name = #n, \
899	.cmd  = n, \
900	.set  = s,\
901	.buffer = b \
902}
903
904static struct dtv_cmds_h dtv_cmds[] = {
905	_DTV_CMD(DTV_TUNE, 1, 0),
906	_DTV_CMD(DTV_CLEAR, 1, 0),
907
908	/* Set */
909	_DTV_CMD(DTV_FREQUENCY, 1, 0),
910	_DTV_CMD(DTV_BANDWIDTH_HZ, 1, 0),
911	_DTV_CMD(DTV_MODULATION, 1, 0),
912	_DTV_CMD(DTV_INVERSION, 1, 0),
913	_DTV_CMD(DTV_DISEQC_MASTER, 1, 1),
914	_DTV_CMD(DTV_SYMBOL_RATE, 1, 0),
915	_DTV_CMD(DTV_INNER_FEC, 1, 0),
916	_DTV_CMD(DTV_VOLTAGE, 1, 0),
917	_DTV_CMD(DTV_TONE, 1, 0),
918	_DTV_CMD(DTV_PILOT, 1, 0),
919	_DTV_CMD(DTV_ROLLOFF, 1, 0),
920	_DTV_CMD(DTV_DELIVERY_SYSTEM, 1, 0),
921	_DTV_CMD(DTV_HIERARCHY, 1, 0),
922	_DTV_CMD(DTV_CODE_RATE_HP, 1, 0),
923	_DTV_CMD(DTV_CODE_RATE_LP, 1, 0),
924	_DTV_CMD(DTV_GUARD_INTERVAL, 1, 0),
925	_DTV_CMD(DTV_TRANSMISSION_MODE, 1, 0),
926
927	_DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0),
928	_DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0),
929	_DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 1, 0),
930	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 1, 0),
931	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 1, 0),
932	_DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 1, 0),
933	_DTV_CMD(DTV_ISDBT_LAYERA_FEC, 1, 0),
934	_DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 1, 0),
935	_DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 1, 0),
936	_DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 1, 0),
937	_DTV_CMD(DTV_ISDBT_LAYERB_FEC, 1, 0),
938	_DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 1, 0),
939	_DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 1, 0),
940	_DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 1, 0),
941	_DTV_CMD(DTV_ISDBT_LAYERC_FEC, 1, 0),
942	_DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 1, 0),
943	_DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 1, 0),
944	_DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 1, 0),
945
946	_DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 0, 0),
947	_DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 0, 0),
948	_DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 0, 0),
949	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 0, 0),
950	_DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 0, 0),
951	_DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 0, 0),
952	_DTV_CMD(DTV_ISDBT_LAYERA_FEC, 0, 0),
953	_DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 0, 0),
954	_DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 0, 0),
955	_DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 0, 0),
956	_DTV_CMD(DTV_ISDBT_LAYERB_FEC, 0, 0),
957	_DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 0, 0),
958	_DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 0, 0),
959	_DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 0, 0),
960	_DTV_CMD(DTV_ISDBT_LAYERC_FEC, 0, 0),
961	_DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 0, 0),
962	_DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 0, 0),
963	_DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 0, 0),
964
965	_DTV_CMD(DTV_ISDBS_TS_ID, 1, 0),
966
967	/* Get */
968	_DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
969	_DTV_CMD(DTV_API_VERSION, 0, 0),
970	_DTV_CMD(DTV_CODE_RATE_HP, 0, 0),
971	_DTV_CMD(DTV_CODE_RATE_LP, 0, 0),
972	_DTV_CMD(DTV_GUARD_INTERVAL, 0, 0),
973	_DTV_CMD(DTV_TRANSMISSION_MODE, 0, 0),
974	_DTV_CMD(DTV_HIERARCHY, 0, 0),
975};
976
977static void dtv_property_dump(struct dtv_property *tvp)
978{
979	int i;
980
981	if (tvp->cmd <= 0 || tvp->cmd > DTV_MAX_COMMAND) {
982		printk(KERN_WARNING "%s: tvp.cmd = 0x%08x undefined\n",
983			__func__, tvp->cmd);
984		return;
985	}
986
987	dprintk("%s() tvp.cmd    = 0x%08x (%s)\n"
988		,__func__
989		,tvp->cmd
990		,dtv_cmds[ tvp->cmd ].name);
991
992	if(dtv_cmds[ tvp->cmd ].buffer) {
993
994		dprintk("%s() tvp.u.buffer.len = 0x%02x\n"
995			,__func__
996			,tvp->u.buffer.len);
997
998		for(i = 0; i < tvp->u.buffer.len; i++)
999			dprintk("%s() tvp.u.buffer.data[0x%02x] = 0x%02x\n"
1000				,__func__
1001				,i
1002				,tvp->u.buffer.data[i]);
1003
1004	} else
1005		dprintk("%s() tvp.u.data = 0x%08x\n", __func__, tvp->u.data);
1006}
1007
1008static int is_legacy_delivery_system(fe_delivery_system_t s)
1009{
1010	if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_AC) ||
1011	   (s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS) ||
1012	   (s == SYS_ATSC))
1013		return 1;
1014
1015	return 0;
1016}
1017
1018/* Synchronise the legacy tuning parameters into the cache, so that demodulator
1019 * drivers can use a single set_frontend tuning function, regardless of whether
1020 * it's being used for the legacy or new API, reducing code and complexity.
1021 */
1022static void dtv_property_cache_sync(struct dvb_frontend *fe,
1023				    struct dvb_frontend_parameters *p)
1024{
1025	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1026
1027	c->frequency = p->frequency;
1028	c->inversion = p->inversion;
1029
1030	switch (fe->ops.info.type) {
1031	case FE_QPSK:
1032		c->modulation = QPSK;   /* implied for DVB-S in legacy API */
1033		c->rolloff = ROLLOFF_35;/* implied for DVB-S */
1034		c->symbol_rate = p->u.qpsk.symbol_rate;
1035		c->fec_inner = p->u.qpsk.fec_inner;
1036		c->delivery_system = SYS_DVBS;
1037		break;
1038	case FE_QAM:
1039		c->symbol_rate = p->u.qam.symbol_rate;
1040		c->fec_inner = p->u.qam.fec_inner;
1041		c->modulation = p->u.qam.modulation;
1042		c->delivery_system = SYS_DVBC_ANNEX_AC;
1043		break;
1044	case FE_OFDM:
1045		if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ)
1046			c->bandwidth_hz = 6000000;
1047		else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ)
1048			c->bandwidth_hz = 7000000;
1049		else if (p->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
1050			c->bandwidth_hz = 8000000;
1051		else
1052			/* Including BANDWIDTH_AUTO */
1053			c->bandwidth_hz = 0;
1054		c->code_rate_HP = p->u.ofdm.code_rate_HP;
1055		c->code_rate_LP = p->u.ofdm.code_rate_LP;
1056		c->modulation = p->u.ofdm.constellation;
1057		c->transmission_mode = p->u.ofdm.transmission_mode;
1058		c->guard_interval = p->u.ofdm.guard_interval;
1059		c->hierarchy = p->u.ofdm.hierarchy_information;
1060		c->delivery_system = SYS_DVBT;
1061		break;
1062	case FE_ATSC:
1063		c->modulation = p->u.vsb.modulation;
1064		if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
1065			c->delivery_system = SYS_ATSC;
1066		else
1067			c->delivery_system = SYS_DVBC_ANNEX_B;
1068		break;
1069	}
1070}
1071
1072/* Ensure the cached values are set correctly in the frontend
1073 * legacy tuning structures, for the advanced tuning API.
1074 */
1075static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
1076{
1077	const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1078	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1079	struct dvb_frontend_parameters *p = &fepriv->parameters;
1080
1081	p->frequency = c->frequency;
1082	p->inversion = c->inversion;
1083
1084	switch (fe->ops.info.type) {
1085	case FE_QPSK:
1086		dprintk("%s() Preparing QPSK req\n", __func__);
1087		p->u.qpsk.symbol_rate = c->symbol_rate;
1088		p->u.qpsk.fec_inner = c->fec_inner;
1089		break;
1090	case FE_QAM:
1091		dprintk("%s() Preparing QAM req\n", __func__);
1092		p->u.qam.symbol_rate = c->symbol_rate;
1093		p->u.qam.fec_inner = c->fec_inner;
1094		p->u.qam.modulation = c->modulation;
1095		break;
1096	case FE_OFDM:
1097		dprintk("%s() Preparing OFDM req\n", __func__);
1098		if (c->bandwidth_hz == 6000000)
1099			p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1100		else if (c->bandwidth_hz == 7000000)
1101			p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1102		else if (c->bandwidth_hz == 8000000)
1103			p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1104		else
1105			p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1106		p->u.ofdm.code_rate_HP = c->code_rate_HP;
1107		p->u.ofdm.code_rate_LP = c->code_rate_LP;
1108		p->u.ofdm.constellation = c->modulation;
1109		p->u.ofdm.transmission_mode = c->transmission_mode;
1110		p->u.ofdm.guard_interval = c->guard_interval;
1111		p->u.ofdm.hierarchy_information = c->hierarchy;
1112		break;
1113	case FE_ATSC:
1114		dprintk("%s() Preparing VSB req\n", __func__);
1115		p->u.vsb.modulation = c->modulation;
1116		break;
1117	}
1118}
1119
1120/* Ensure the cached values are set correctly in the frontend
1121 * legacy tuning structures, for the legacy tuning API.
1122 */
1123static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
1124{
1125	const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1126	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1127	struct dvb_frontend_parameters *p = &fepriv->parameters;
1128
1129	p->frequency = c->frequency;
1130	p->inversion = c->inversion;
1131
1132	switch(c->modulation) {
1133	case PSK_8:
1134	case APSK_16:
1135	case APSK_32:
1136	case QPSK:
1137		p->u.qpsk.symbol_rate = c->symbol_rate;
1138		p->u.qpsk.fec_inner = c->fec_inner;
1139		break;
1140	default:
1141		break;
1142	}
1143
1144	/* Fake out a generic DVB-T request so we pass validation in the ioctl */
1145	if ((c->delivery_system == SYS_ISDBT) ||
1146	    (c->delivery_system == SYS_DVBT2)) {
1147		p->u.ofdm.constellation = QAM_AUTO;
1148		p->u.ofdm.code_rate_HP = FEC_AUTO;
1149		p->u.ofdm.code_rate_LP = FEC_AUTO;
1150		p->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
1151		p->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
1152		p->u.ofdm.hierarchy_information = HIERARCHY_AUTO;
1153		if (c->bandwidth_hz == 8000000)
1154			p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1155		else if (c->bandwidth_hz == 7000000)
1156			p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1157		else if (c->bandwidth_hz == 6000000)
1158			p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1159		else
1160			p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1161	}
1162}
1163
1164static void dtv_property_cache_submit(struct dvb_frontend *fe)
1165{
1166	const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1167
1168	/* For legacy delivery systems we don't need the delivery_system to
1169	 * be specified, but we populate the older structures from the cache
1170	 * so we can call set_frontend on older drivers.
1171	 */
1172	if(is_legacy_delivery_system(c->delivery_system)) {
1173
1174		dprintk("%s() legacy, modulation = %d\n", __func__, c->modulation);
1175		dtv_property_legacy_params_sync(fe);
1176
1177	} else {
1178		dprintk("%s() adv, modulation = %d\n", __func__, c->modulation);
1179
1180		/* For advanced delivery systems / modulation types ...
1181		 * we seed the lecacy dvb_frontend_parameters structure
1182		 * so that the sanity checking code later in the IOCTL processing
1183		 * can validate our basic frequency ranges, symbolrates, modulation
1184		 * etc.
1185		 */
1186		dtv_property_adv_params_sync(fe);
1187	}
1188}
1189
1190static int dvb_frontend_ioctl_legacy(struct file *file,
1191			unsigned int cmd, void *parg);
1192static int dvb_frontend_ioctl_properties(struct file *file,
1193			unsigned int cmd, void *parg);
1194
1195static int dtv_property_process_get(struct dvb_frontend *fe,
1196				    struct dtv_property *tvp,
1197				    struct file *file)
1198{
1199	int r;
1200
1201	switch(tvp->cmd) {
1202	case DTV_FREQUENCY:
1203		tvp->u.data = fe->dtv_property_cache.frequency;
1204		break;
1205	case DTV_MODULATION:
1206		tvp->u.data = fe->dtv_property_cache.modulation;
1207		break;
1208	case DTV_BANDWIDTH_HZ:
1209		tvp->u.data = fe->dtv_property_cache.bandwidth_hz;
1210		break;
1211	case DTV_INVERSION:
1212		tvp->u.data = fe->dtv_property_cache.inversion;
1213		break;
1214	case DTV_SYMBOL_RATE:
1215		tvp->u.data = fe->dtv_property_cache.symbol_rate;
1216		break;
1217	case DTV_INNER_FEC:
1218		tvp->u.data = fe->dtv_property_cache.fec_inner;
1219		break;
1220	case DTV_PILOT:
1221		tvp->u.data = fe->dtv_property_cache.pilot;
1222		break;
1223	case DTV_ROLLOFF:
1224		tvp->u.data = fe->dtv_property_cache.rolloff;
1225		break;
1226	case DTV_DELIVERY_SYSTEM:
1227		tvp->u.data = fe->dtv_property_cache.delivery_system;
1228		break;
1229	case DTV_VOLTAGE:
1230		tvp->u.data = fe->dtv_property_cache.voltage;
1231		break;
1232	case DTV_TONE:
1233		tvp->u.data = fe->dtv_property_cache.sectone;
1234		break;
1235	case DTV_API_VERSION:
1236		tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
1237		break;
1238	case DTV_CODE_RATE_HP:
1239		tvp->u.data = fe->dtv_property_cache.code_rate_HP;
1240		break;
1241	case DTV_CODE_RATE_LP:
1242		tvp->u.data = fe->dtv_property_cache.code_rate_LP;
1243		break;
1244	case DTV_GUARD_INTERVAL:
1245		tvp->u.data = fe->dtv_property_cache.guard_interval;
1246		break;
1247	case DTV_TRANSMISSION_MODE:
1248		tvp->u.data = fe->dtv_property_cache.transmission_mode;
1249		break;
1250	case DTV_HIERARCHY:
1251		tvp->u.data = fe->dtv_property_cache.hierarchy;
1252		break;
1253
1254	/* ISDB-T Support here */
1255	case DTV_ISDBT_PARTIAL_RECEPTION:
1256		tvp->u.data = fe->dtv_property_cache.isdbt_partial_reception;
1257		break;
1258	case DTV_ISDBT_SOUND_BROADCASTING:
1259		tvp->u.data = fe->dtv_property_cache.isdbt_sb_mode;
1260		break;
1261	case DTV_ISDBT_SB_SUBCHANNEL_ID:
1262		tvp->u.data = fe->dtv_property_cache.isdbt_sb_subchannel;
1263		break;
1264	case DTV_ISDBT_SB_SEGMENT_IDX:
1265		tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_idx;
1266		break;
1267	case DTV_ISDBT_SB_SEGMENT_COUNT:
1268		tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_count;
1269		break;
1270	case DTV_ISDBT_LAYER_ENABLED:
1271		tvp->u.data = fe->dtv_property_cache.isdbt_layer_enabled;
1272		break;
1273	case DTV_ISDBT_LAYERA_FEC:
1274		tvp->u.data = fe->dtv_property_cache.layer[0].fec;
1275		break;
1276	case DTV_ISDBT_LAYERA_MODULATION:
1277		tvp->u.data = fe->dtv_property_cache.layer[0].modulation;
1278		break;
1279	case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1280		tvp->u.data = fe->dtv_property_cache.layer[0].segment_count;
1281		break;
1282	case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1283		tvp->u.data = fe->dtv_property_cache.layer[0].interleaving;
1284		break;
1285	case DTV_ISDBT_LAYERB_FEC:
1286		tvp->u.data = fe->dtv_property_cache.layer[1].fec;
1287		break;
1288	case DTV_ISDBT_LAYERB_MODULATION:
1289		tvp->u.data = fe->dtv_property_cache.layer[1].modulation;
1290		break;
1291	case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1292		tvp->u.data = fe->dtv_property_cache.layer[1].segment_count;
1293		break;
1294	case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1295		tvp->u.data = fe->dtv_property_cache.layer[1].interleaving;
1296		break;
1297	case DTV_ISDBT_LAYERC_FEC:
1298		tvp->u.data = fe->dtv_property_cache.layer[2].fec;
1299		break;
1300	case DTV_ISDBT_LAYERC_MODULATION:
1301		tvp->u.data = fe->dtv_property_cache.layer[2].modulation;
1302		break;
1303	case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1304		tvp->u.data = fe->dtv_property_cache.layer[2].segment_count;
1305		break;
1306	case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1307		tvp->u.data = fe->dtv_property_cache.layer[2].interleaving;
1308		break;
1309	case DTV_ISDBS_TS_ID:
1310		tvp->u.data = fe->dtv_property_cache.isdbs_ts_id;
1311		break;
1312	case DTV_DVBT2_PLP_ID:
1313		tvp->u.data = fe->dtv_property_cache.dvbt2_plp_id;
1314		break;
1315	default:
1316		return -EINVAL;
1317	}
1318
1319	/* Allow the frontend to override outgoing properties */
1320	if (fe->ops.get_property) {
1321		r = fe->ops.get_property(fe, tvp);
1322		if (r < 0)
1323			return r;
1324	}
1325
1326	dtv_property_dump(tvp);
1327
1328	return 0;
1329}
1330
1331static int dtv_property_process_set(struct dvb_frontend *fe,
1332				    struct dtv_property *tvp,
1333				    struct file *file)
1334{
1335	int r = 0;
1336	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1337	dtv_property_dump(tvp);
1338
1339	/* Allow the frontend to validate incoming properties */
1340	if (fe->ops.set_property) {
1341		r = fe->ops.set_property(fe, tvp);
1342		if (r < 0)
1343			return r;
1344	}
1345
1346	switch(tvp->cmd) {
1347	case DTV_CLEAR:
1348		/* Reset a cache of data specific to the frontend here. This does
1349		 * not effect hardware.
1350		 */
1351		dvb_frontend_clear_cache(fe);
1352		dprintk("%s() Flushing property cache\n", __func__);
1353		break;
1354	case DTV_TUNE:
1355		/* interpret the cache of data, build either a traditional frontend
1356		 * tunerequest so we can pass validation in the FE_SET_FRONTEND
1357		 * ioctl.
1358		 */
1359		fe->dtv_property_cache.state = tvp->cmd;
1360		dprintk("%s() Finalised property cache\n", __func__);
1361		dtv_property_cache_submit(fe);
1362
1363		r = dvb_frontend_ioctl_legacy(file, FE_SET_FRONTEND,
1364			&fepriv->parameters);
1365		break;
1366	case DTV_FREQUENCY:
1367		fe->dtv_property_cache.frequency = tvp->u.data;
1368		break;
1369	case DTV_MODULATION:
1370		fe->dtv_property_cache.modulation = tvp->u.data;
1371		break;
1372	case DTV_BANDWIDTH_HZ:
1373		fe->dtv_property_cache.bandwidth_hz = tvp->u.data;
1374		break;
1375	case DTV_INVERSION:
1376		fe->dtv_property_cache.inversion = tvp->u.data;
1377		break;
1378	case DTV_SYMBOL_RATE:
1379		fe->dtv_property_cache.symbol_rate = tvp->u.data;
1380		break;
1381	case DTV_INNER_FEC:
1382		fe->dtv_property_cache.fec_inner = tvp->u.data;
1383		break;
1384	case DTV_PILOT:
1385		fe->dtv_property_cache.pilot = tvp->u.data;
1386		break;
1387	case DTV_ROLLOFF:
1388		fe->dtv_property_cache.rolloff = tvp->u.data;
1389		break;
1390	case DTV_DELIVERY_SYSTEM:
1391		fe->dtv_property_cache.delivery_system = tvp->u.data;
1392		break;
1393	case DTV_VOLTAGE:
1394		fe->dtv_property_cache.voltage = tvp->u.data;
1395		r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE,
1396			(void *)fe->dtv_property_cache.voltage);
1397		break;
1398	case DTV_TONE:
1399		fe->dtv_property_cache.sectone = tvp->u.data;
1400		r = dvb_frontend_ioctl_legacy(file, FE_SET_TONE,
1401			(void *)fe->dtv_property_cache.sectone);
1402		break;
1403	case DTV_CODE_RATE_HP:
1404		fe->dtv_property_cache.code_rate_HP = tvp->u.data;
1405		break;
1406	case DTV_CODE_RATE_LP:
1407		fe->dtv_property_cache.code_rate_LP = tvp->u.data;
1408		break;
1409	case DTV_GUARD_INTERVAL:
1410		fe->dtv_property_cache.guard_interval = tvp->u.data;
1411		break;
1412	case DTV_TRANSMISSION_MODE:
1413		fe->dtv_property_cache.transmission_mode = tvp->u.data;
1414		break;
1415	case DTV_HIERARCHY:
1416		fe->dtv_property_cache.hierarchy = tvp->u.data;
1417		break;
1418
1419	/* ISDB-T Support here */
1420	case DTV_ISDBT_PARTIAL_RECEPTION:
1421		fe->dtv_property_cache.isdbt_partial_reception = tvp->u.data;
1422		break;
1423	case DTV_ISDBT_SOUND_BROADCASTING:
1424		fe->dtv_property_cache.isdbt_sb_mode = tvp->u.data;
1425		break;
1426	case DTV_ISDBT_SB_SUBCHANNEL_ID:
1427		fe->dtv_property_cache.isdbt_sb_subchannel = tvp->u.data;
1428		break;
1429	case DTV_ISDBT_SB_SEGMENT_IDX:
1430		fe->dtv_property_cache.isdbt_sb_segment_idx = tvp->u.data;
1431		break;
1432	case DTV_ISDBT_SB_SEGMENT_COUNT:
1433		fe->dtv_property_cache.isdbt_sb_segment_count = tvp->u.data;
1434		break;
1435	case DTV_ISDBT_LAYER_ENABLED:
1436		fe->dtv_property_cache.isdbt_layer_enabled = tvp->u.data;
1437		break;
1438	case DTV_ISDBT_LAYERA_FEC:
1439		fe->dtv_property_cache.layer[0].fec = tvp->u.data;
1440		break;
1441	case DTV_ISDBT_LAYERA_MODULATION:
1442		fe->dtv_property_cache.layer[0].modulation = tvp->u.data;
1443		break;
1444	case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1445		fe->dtv_property_cache.layer[0].segment_count = tvp->u.data;
1446		break;
1447	case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1448		fe->dtv_property_cache.layer[0].interleaving = tvp->u.data;
1449		break;
1450	case DTV_ISDBT_LAYERB_FEC:
1451		fe->dtv_property_cache.layer[1].fec = tvp->u.data;
1452		break;
1453	case DTV_ISDBT_LAYERB_MODULATION:
1454		fe->dtv_property_cache.layer[1].modulation = tvp->u.data;
1455		break;
1456	case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1457		fe->dtv_property_cache.layer[1].segment_count = tvp->u.data;
1458		break;
1459	case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1460		fe->dtv_property_cache.layer[1].interleaving = tvp->u.data;
1461		break;
1462	case DTV_ISDBT_LAYERC_FEC:
1463		fe->dtv_property_cache.layer[2].fec = tvp->u.data;
1464		break;
1465	case DTV_ISDBT_LAYERC_MODULATION:
1466		fe->dtv_property_cache.layer[2].modulation = tvp->u.data;
1467		break;
1468	case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1469		fe->dtv_property_cache.layer[2].segment_count = tvp->u.data;
1470		break;
1471	case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1472		fe->dtv_property_cache.layer[2].interleaving = tvp->u.data;
1473		break;
1474	case DTV_ISDBS_TS_ID:
1475		fe->dtv_property_cache.isdbs_ts_id = tvp->u.data;
1476		break;
1477	case DTV_DVBT2_PLP_ID:
1478		fe->dtv_property_cache.dvbt2_plp_id = tvp->u.data;
1479		break;
1480	default:
1481		return -EINVAL;
1482	}
1483
1484	return r;
1485}
1486
1487static int dvb_frontend_ioctl(struct file *file,
1488			unsigned int cmd, void *parg)
1489{
1490	struct dvb_device *dvbdev = file->private_data;
1491	struct dvb_frontend *fe = dvbdev->priv;
1492	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1493	int err = -EOPNOTSUPP;
1494
1495	dprintk("%s (%d)\n", __func__, _IOC_NR(cmd));
1496
1497	if (fepriv->exit != DVB_FE_NO_EXIT)
1498		return -ENODEV;
1499
1500	if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
1501	    (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
1502	     cmd == FE_DISEQC_RECV_SLAVE_REPLY))
1503		return -EPERM;
1504
1505	if (down_interruptible (&fepriv->sem))
1506		return -ERESTARTSYS;
1507
1508	if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
1509		err = dvb_frontend_ioctl_properties(file, cmd, parg);
1510	else {
1511		fe->dtv_property_cache.state = DTV_UNDEFINED;
1512		err = dvb_frontend_ioctl_legacy(file, cmd, parg);
1513	}
1514
1515	up(&fepriv->sem);
1516	return err;
1517}
1518
1519static int dvb_frontend_ioctl_properties(struct file *file,
1520			unsigned int cmd, void *parg)
1521{
1522	struct dvb_device *dvbdev = file->private_data;
1523	struct dvb_frontend *fe = dvbdev->priv;
1524	int err = 0;
1525
1526	struct dtv_properties *tvps = NULL;
1527	struct dtv_property *tvp = NULL;
1528	int i;
1529
1530	dprintk("%s\n", __func__);
1531
1532	if(cmd == FE_SET_PROPERTY) {
1533		tvps = (struct dtv_properties __user *)parg;
1534
1535		dprintk("%s() properties.num = %d\n", __func__, tvps->num);
1536		dprintk("%s() properties.props = %p\n", __func__, tvps->props);
1537
1538		/* Put an arbitrary limit on the number of messages that can
1539		 * be sent at once */
1540		if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1541			return -EINVAL;
1542
1543		tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1544		if (!tvp) {
1545			err = -ENOMEM;
1546			goto out;
1547		}
1548
1549		if (copy_from_user(tvp, tvps->props, tvps->num * sizeof(struct dtv_property))) {
1550			err = -EFAULT;
1551			goto out;
1552		}
1553
1554		for (i = 0; i < tvps->num; i++) {
1555			err = dtv_property_process_set(fe, tvp + i, file);
1556			if (err < 0)
1557				goto out;
1558			(tvp + i)->result = err;
1559		}
1560
1561		if(fe->dtv_property_cache.state == DTV_TUNE)
1562			dprintk("%s() Property cache is full, tuning\n", __func__);
1563
1564	} else
1565	if(cmd == FE_GET_PROPERTY) {
1566
1567		tvps = (struct dtv_properties __user *)parg;
1568
1569		dprintk("%s() properties.num = %d\n", __func__, tvps->num);
1570		dprintk("%s() properties.props = %p\n", __func__, tvps->props);
1571
1572		/* Put an arbitrary limit on the number of messages that can
1573		 * be sent at once */
1574		if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1575			return -EINVAL;
1576
1577		tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1578		if (!tvp) {
1579			err = -ENOMEM;
1580			goto out;
1581		}
1582
1583		if (copy_from_user(tvp, tvps->props, tvps->num * sizeof(struct dtv_property))) {
1584			err = -EFAULT;
1585			goto out;
1586		}
1587
1588		for (i = 0; i < tvps->num; i++) {
1589			err = dtv_property_process_get(fe, tvp + i, file);
1590			if (err < 0)
1591				goto out;
1592			(tvp + i)->result = err;
1593		}
1594
1595		if (copy_to_user(tvps->props, tvp, tvps->num * sizeof(struct dtv_property))) {
1596			err = -EFAULT;
1597			goto out;
1598		}
1599
1600	} else
1601		err = -EOPNOTSUPP;
1602
1603out:
1604	kfree(tvp);
1605	return err;
1606}
1607
1608static int dvb_frontend_ioctl_legacy(struct file *file,
1609			unsigned int cmd, void *parg)
1610{
1611	struct dvb_device *dvbdev = file->private_data;
1612	struct dvb_frontend *fe = dvbdev->priv;
1613	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1614	int cb_err, err = -EOPNOTSUPP;
1615
1616	if (fe->dvb->fe_ioctl_override) {
1617		cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
1618						    DVB_FE_IOCTL_PRE);
1619		if (cb_err < 0)
1620			return cb_err;
1621		if (cb_err > 0)
1622			return 0;
1623		/* fe_ioctl_override returning 0 allows
1624		 * dvb-core to continue handling the ioctl */
1625	}
1626
1627	switch (cmd) {
1628	case FE_GET_INFO: {
1629		struct dvb_frontend_info* info = parg;
1630		memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info));
1631		dvb_frontend_get_frequency_limits(fe, &info->frequency_min, &info->frequency_max);
1632
1633		/* Force the CAN_INVERSION_AUTO bit on. If the frontend doesn't
1634		 * do it, it is done for it. */
1635		info->caps |= FE_CAN_INVERSION_AUTO;
1636		err = 0;
1637		break;
1638	}
1639
1640	case FE_READ_STATUS: {
1641		fe_status_t* status = parg;
1642
1643		/* if retune was requested but hasn't occurred yet, prevent
1644		 * that user get signal state from previous tuning */
1645		if (fepriv->state == FESTATE_RETUNE ||
1646		    fepriv->state == FESTATE_ERROR) {
1647			err=0;
1648			*status = 0;
1649			break;
1650		}
1651
1652		if (fe->ops.read_status)
1653			err = fe->ops.read_status(fe, status);
1654		break;
1655	}
1656	case FE_READ_BER:
1657		if (fe->ops.read_ber)
1658			err = fe->ops.read_ber(fe, (__u32*) parg);
1659		break;
1660
1661	case FE_READ_SIGNAL_STRENGTH:
1662		if (fe->ops.read_signal_strength)
1663			err = fe->ops.read_signal_strength(fe, (__u16*) parg);
1664		break;
1665
1666	case FE_READ_SNR:
1667		if (fe->ops.read_snr)
1668			err = fe->ops.read_snr(fe, (__u16*) parg);
1669		break;
1670
1671	case FE_READ_UNCORRECTED_BLOCKS:
1672		if (fe->ops.read_ucblocks)
1673			err = fe->ops.read_ucblocks(fe, (__u32*) parg);
1674		break;
1675
1676
1677	case FE_DISEQC_RESET_OVERLOAD:
1678		if (fe->ops.diseqc_reset_overload) {
1679			err = fe->ops.diseqc_reset_overload(fe);
1680			fepriv->state = FESTATE_DISEQC;
1681			fepriv->status = 0;
1682		}
1683		break;
1684
1685	case FE_DISEQC_SEND_MASTER_CMD:
1686		if (fe->ops.diseqc_send_master_cmd) {
1687			err = fe->ops.diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg);
1688			fepriv->state = FESTATE_DISEQC;
1689			fepriv->status = 0;
1690		}
1691		break;
1692
1693	case FE_DISEQC_SEND_BURST:
1694		if (fe->ops.diseqc_send_burst) {
1695			err = fe->ops.diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg);
1696			fepriv->state = FESTATE_DISEQC;
1697			fepriv->status = 0;
1698		}
1699		break;
1700
1701	case FE_SET_TONE:
1702		if (fe->ops.set_tone) {
1703			err = fe->ops.set_tone(fe, (fe_sec_tone_mode_t) parg);
1704			fepriv->tone = (fe_sec_tone_mode_t) parg;
1705			fepriv->state = FESTATE_DISEQC;
1706			fepriv->status = 0;
1707		}
1708		break;
1709
1710	case FE_SET_VOLTAGE:
1711		if (fe->ops.set_voltage) {
1712			err = fe->ops.set_voltage(fe, (fe_sec_voltage_t) parg);
1713			fepriv->voltage = (fe_sec_voltage_t) parg;
1714			fepriv->state = FESTATE_DISEQC;
1715			fepriv->status = 0;
1716		}
1717		break;
1718
1719	case FE_DISHNETWORK_SEND_LEGACY_CMD:
1720		if (fe->ops.dishnetwork_send_legacy_command) {
1721			err = fe->ops.dishnetwork_send_legacy_command(fe, (unsigned long) parg);
1722			fepriv->state = FESTATE_DISEQC;
1723			fepriv->status = 0;
1724		} else if (fe->ops.set_voltage) {
1725			/*
1726			 * NOTE: This is a fallback condition.  Some frontends
1727			 * (stv0299 for instance) take longer than 8msec to
1728			 * respond to a set_voltage command.  Those switches
1729			 * need custom routines to switch properly.  For all
1730			 * other frontends, the following should work ok.
1731			 * Dish network legacy switches (as used by Dish500)
1732			 * are controlled by sending 9-bit command words
1733			 * spaced 8msec apart.
1734			 * the actual command word is switch/port dependent
1735			 * so it is up to the userspace application to send
1736			 * the right command.
1737			 * The command must always start with a '0' after
1738			 * initialization, so parg is 8 bits and does not
1739			 * include the initialization or start bit
1740			 */
1741			unsigned long swcmd = ((unsigned long) parg) << 1;
1742			struct timeval nexttime;
1743			struct timeval tv[10];
1744			int i;
1745			u8 last = 1;
1746			if (dvb_frontend_debug)
1747				printk("%s switch command: 0x%04lx\n", __func__, swcmd);
1748			do_gettimeofday(&nexttime);
1749			if (dvb_frontend_debug)
1750				memcpy(&tv[0], &nexttime, sizeof(struct timeval));
1751			/* before sending a command, initialize by sending
1752			 * a 32ms 18V to the switch
1753			 */
1754			fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
1755			dvb_frontend_sleep_until(&nexttime, 32000);
1756
1757			for (i = 0; i < 9; i++) {
1758				if (dvb_frontend_debug)
1759					do_gettimeofday(&tv[i + 1]);
1760				if ((swcmd & 0x01) != last) {
1761					/* set voltage to (last ? 13V : 18V) */
1762					fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
1763					last = (last) ? 0 : 1;
1764				}
1765				swcmd = swcmd >> 1;
1766				if (i != 8)
1767					dvb_frontend_sleep_until(&nexttime, 8000);
1768			}
1769			if (dvb_frontend_debug) {
1770				printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
1771					__func__, fe->dvb->num);
1772				for (i = 1; i < 10; i++)
1773					printk("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i]));
1774			}
1775			err = 0;
1776			fepriv->state = FESTATE_DISEQC;
1777			fepriv->status = 0;
1778		}
1779		break;
1780
1781	case FE_DISEQC_RECV_SLAVE_REPLY:
1782		if (fe->ops.diseqc_recv_slave_reply)
1783			err = fe->ops.diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
1784		break;
1785
1786	case FE_ENABLE_HIGH_LNB_VOLTAGE:
1787		if (fe->ops.enable_high_lnb_voltage)
1788			err = fe->ops.enable_high_lnb_voltage(fe, (long) parg);
1789		break;
1790
1791	case FE_SET_FRONTEND: {
1792		struct dvb_frontend_tune_settings fetunesettings;
1793
1794		if(fe->dtv_property_cache.state == DTV_TUNE) {
1795			if (dvb_frontend_check_parameters(fe, &fepriv->parameters) < 0) {
1796				err = -EINVAL;
1797				break;
1798			}
1799		} else {
1800			if (dvb_frontend_check_parameters(fe, parg) < 0) {
1801				err = -EINVAL;
1802				break;
1803			}
1804
1805			memcpy (&fepriv->parameters, parg,
1806				sizeof (struct dvb_frontend_parameters));
1807			dtv_property_cache_sync(fe, &fepriv->parameters);
1808		}
1809
1810		memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
1811		memcpy(&fetunesettings.parameters, parg,
1812		       sizeof (struct dvb_frontend_parameters));
1813
1814		/* force auto frequency inversion if requested */
1815		if (dvb_force_auto_inversion) {
1816			fepriv->parameters.inversion = INVERSION_AUTO;
1817			fetunesettings.parameters.inversion = INVERSION_AUTO;
1818		}
1819		if (fe->ops.info.type == FE_OFDM) {
1820			/* without hierarchical coding code_rate_LP is irrelevant,
1821			 * so we tolerate the otherwise invalid FEC_NONE setting */
1822			if (fepriv->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
1823			    fepriv->parameters.u.ofdm.code_rate_LP == FEC_NONE)
1824				fepriv->parameters.u.ofdm.code_rate_LP = FEC_AUTO;
1825		}
1826
1827		/* get frontend-specific tuning settings */
1828		if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
1829			fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
1830			fepriv->max_drift = fetunesettings.max_drift;
1831			fepriv->step_size = fetunesettings.step_size;
1832		} else {
1833			/* default values */
1834			switch(fe->ops.info.type) {
1835			case FE_QPSK:
1836				fepriv->min_delay = HZ/20;
1837				fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
1838				fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
1839				break;
1840
1841			case FE_QAM:
1842				fepriv->min_delay = HZ/20;
1843				fepriv->step_size = 0; /* no zigzag */
1844				fepriv->max_drift = 0;
1845				break;
1846
1847			case FE_OFDM:
1848				fepriv->min_delay = HZ/20;
1849				fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
1850				fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
1851				break;
1852			case FE_ATSC:
1853				fepriv->min_delay = HZ/20;
1854				fepriv->step_size = 0;
1855				fepriv->max_drift = 0;
1856				break;
1857			}
1858		}
1859		if (dvb_override_tune_delay > 0)
1860			fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
1861
1862		fepriv->state = FESTATE_RETUNE;
1863
1864		/* Request the search algorithm to search */
1865		fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
1866
1867		dvb_frontend_wakeup(fe);
1868		dvb_frontend_add_event(fe, 0);
1869		fepriv->status = 0;
1870		err = 0;
1871		break;
1872	}
1873
1874	case FE_GET_EVENT:
1875		err = dvb_frontend_get_event (fe, parg, file->f_flags);
1876		break;
1877
1878	case FE_GET_FRONTEND:
1879		if (fe->ops.get_frontend) {
1880			memcpy (parg, &fepriv->parameters, sizeof (struct dvb_frontend_parameters));
1881			err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg);
1882		}
1883		break;
1884
1885	case FE_SET_FRONTEND_TUNE_MODE:
1886		fepriv->tune_mode_flags = (unsigned long) parg;
1887		err = 0;
1888		break;
1889	};
1890
1891	if (fe->dvb->fe_ioctl_override) {
1892		cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
1893						    DVB_FE_IOCTL_POST);
1894		if (cb_err < 0)
1895			return cb_err;
1896	}
1897
1898	return err;
1899}
1900
1901
1902static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
1903{
1904	struct dvb_device *dvbdev = file->private_data;
1905	struct dvb_frontend *fe = dvbdev->priv;
1906	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1907
1908	dprintk ("%s\n", __func__);
1909
1910	poll_wait (file, &fepriv->events.wait_queue, wait);
1911
1912	if (fepriv->events.eventw != fepriv->events.eventr)
1913		return (POLLIN | POLLRDNORM | POLLPRI);
1914
1915	return 0;
1916}
1917
1918static int dvb_frontend_open(struct inode *inode, struct file *file)
1919{
1920	struct dvb_device *dvbdev = file->private_data;
1921	struct dvb_frontend *fe = dvbdev->priv;
1922	struct dvb_frontend_private *fepriv = fe->frontend_priv;
1923	struct dvb_adapter *adapter = fe->dvb;
1924	int ret;
1925
1926	dprintk ("%s\n", __func__);
1927	if (fepriv->exit == DVB_FE_DEVICE_REMOVED)
1928		return -ENODEV;
1929
1930	if (adapter->mfe_shared) {
1931		mutex_lock (&adapter->mfe_lock);
1932
1933		if (adapter->mfe_dvbdev == NULL)
1934			adapter->mfe_dvbdev = dvbdev;
1935
1936		else if (adapter->mfe_dvbdev != dvbdev) {
1937			struct dvb_device
1938				*mfedev = adapter->mfe_dvbdev;
1939			struct dvb_frontend
1940				*mfe = mfedev->priv;
1941			struct dvb_frontend_private
1942				*mfepriv = mfe->frontend_priv;
1943			int mferetry = (dvb_mfe_wait_time << 1);
1944
1945			mutex_unlock (&adapter->mfe_lock);
1946			while (mferetry-- && (mfedev->users != -1 ||
1947					mfepriv->thread != NULL)) {
1948				if(msleep_interruptible(500)) {
1949					if(signal_pending(current))
1950						return -EINTR;
1951				}
1952			}
1953
1954			mutex_lock (&adapter->mfe_lock);
1955			if(adapter->mfe_dvbdev != dvbdev) {
1956				mfedev = adapter->mfe_dvbdev;
1957				mfe = mfedev->priv;
1958				mfepriv = mfe->frontend_priv;
1959				if (mfedev->users != -1 ||
1960						mfepriv->thread != NULL) {
1961					mutex_unlock (&adapter->mfe_lock);
1962					return -EBUSY;
1963				}
1964				adapter->mfe_dvbdev = dvbdev;
1965			}
1966		}
1967	}
1968
1969	if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
1970		if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
1971			goto err0;
1972	}
1973
1974	if ((ret = dvb_generic_open (inode, file)) < 0)
1975		goto err1;
1976
1977	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
1978		/* normal tune mode when opened R/W */
1979		fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
1980		fepriv->tone = -1;
1981		fepriv->voltage = -1;
1982
1983		ret = dvb_frontend_start (fe);
1984		if (ret)
1985			goto err2;
1986
1987		/*  empty event queue */
1988		fepriv->events.eventr = fepriv->events.eventw = 0;
1989	}
1990
1991	if (adapter->mfe_shared)
1992		mutex_unlock (&adapter->mfe_lock);
1993	return ret;
1994
1995err2:
1996	dvb_generic_release(inode, file);
1997err1:
1998	if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
1999		fe->ops.ts_bus_ctrl(fe, 0);
2000err0:
2001	if (adapter->mfe_shared)
2002		mutex_unlock (&adapter->mfe_lock);
2003	return ret;
2004}
2005
2006static int dvb_frontend_release(struct inode *inode, struct file *file)
2007{
2008	struct dvb_device *dvbdev = file->private_data;
2009	struct dvb_frontend *fe = dvbdev->priv;
2010	struct dvb_frontend_private *fepriv = fe->frontend_priv;
2011	int ret;
2012
2013	dprintk ("%s\n", __func__);
2014
2015	if ((file->f_flags & O_ACCMODE) != O_RDONLY)
2016		fepriv->release_jiffies = jiffies;
2017
2018	ret = dvb_generic_release (inode, file);
2019
2020	if (dvbdev->users == -1) {
2021		if (fepriv->exit != DVB_FE_NO_EXIT) {
2022			fops_put(file->f_op);
2023			file->f_op = NULL;
2024			wake_up(&dvbdev->wait_queue);
2025		}
2026		if (fe->ops.ts_bus_ctrl)
2027			fe->ops.ts_bus_ctrl(fe, 0);
2028	}
2029
2030	return ret;
2031}
2032
2033static const struct file_operations dvb_frontend_fops = {
2034	.owner		= THIS_MODULE,
2035	.unlocked_ioctl	= dvb_generic_ioctl,
2036	.poll		= dvb_frontend_poll,
2037	.open		= dvb_frontend_open,
2038	.release	= dvb_frontend_release,
2039	.llseek		= noop_llseek,
2040};
2041
2042int dvb_register_frontend(struct dvb_adapter* dvb,
2043			  struct dvb_frontend* fe)
2044{
2045	struct dvb_frontend_private *fepriv;
2046	static const struct dvb_device dvbdev_template = {
2047		.users = ~0,
2048		.writers = 1,
2049		.readers = (~0)-1,
2050		.fops = &dvb_frontend_fops,
2051		.kernel_ioctl = dvb_frontend_ioctl
2052	};
2053
2054	dprintk ("%s\n", __func__);
2055
2056	if (mutex_lock_interruptible(&frontend_mutex))
2057		return -ERESTARTSYS;
2058
2059	fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
2060	if (fe->frontend_priv == NULL) {
2061		mutex_unlock(&frontend_mutex);
2062		return -ENOMEM;
2063	}
2064	fepriv = fe->frontend_priv;
2065
2066	sema_init(&fepriv->sem, 1);
2067	init_waitqueue_head (&fepriv->wait_queue);
2068	init_waitqueue_head (&fepriv->events.wait_queue);
2069	mutex_init(&fepriv->events.mtx);
2070	fe->dvb = dvb;
2071	fepriv->inversion = INVERSION_OFF;
2072
2073	printk ("DVB: registering adapter %i frontend %i (%s)...\n",
2074		fe->dvb->num,
2075		fe->id,
2076		fe->ops.info.name);
2077
2078	dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
2079			     fe, DVB_DEVICE_FRONTEND);
2080
2081	mutex_unlock(&frontend_mutex);
2082	return 0;
2083}
2084EXPORT_SYMBOL(dvb_register_frontend);
2085
2086int dvb_unregister_frontend(struct dvb_frontend* fe)
2087{
2088	struct dvb_frontend_private *fepriv = fe->frontend_priv;
2089	dprintk ("%s\n", __func__);
2090
2091	mutex_lock(&frontend_mutex);
2092	dvb_frontend_stop (fe);
2093	mutex_unlock(&frontend_mutex);
2094
2095	if (fepriv->dvbdev->users < -1)
2096		wait_event(fepriv->dvbdev->wait_queue,
2097				fepriv->dvbdev->users==-1);
2098
2099	mutex_lock(&frontend_mutex);
2100	dvb_unregister_device (fepriv->dvbdev);
2101
2102	/* fe is invalid now */
2103	kfree(fepriv);
2104	mutex_unlock(&frontend_mutex);
2105	return 0;
2106}
2107EXPORT_SYMBOL(dvb_unregister_frontend);
2108
2109#ifdef CONFIG_MEDIA_ATTACH
2110void dvb_frontend_detach(struct dvb_frontend* fe)
2111{
2112	void *ptr;
2113
2114	if (fe->ops.release_sec) {
2115		fe->ops.release_sec(fe);
2116		symbol_put_addr(fe->ops.release_sec);
2117	}
2118	if (fe->ops.tuner_ops.release) {
2119		fe->ops.tuner_ops.release(fe);
2120		symbol_put_addr(fe->ops.tuner_ops.release);
2121	}
2122	if (fe->ops.analog_ops.release) {
2123		fe->ops.analog_ops.release(fe);
2124		symbol_put_addr(fe->ops.analog_ops.release);
2125	}
2126	ptr = (void*)fe->ops.release;
2127	if (ptr) {
2128		fe->ops.release(fe);
2129		symbol_put_addr(ptr);
2130	}
2131}
2132#else
2133void dvb_frontend_detach(struct dvb_frontend* fe)
2134{
2135	if (fe->ops.release_sec)
2136		fe->ops.release_sec(fe);
2137	if (fe->ops.tuner_ops.release)
2138		fe->ops.tuner_ops.release(fe);
2139	if (fe->ops.analog_ops.release)
2140		fe->ops.analog_ops.release(fe);
2141	if (fe->ops.release)
2142		fe->ops.release(fe);
2143}
2144#endif
2145EXPORT_SYMBOL(dvb_frontend_detach);
2146