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