Commit 18ed2860 authored by Shuah Khan's avatar Shuah Khan Committed by Mauro Carvalho Chehab

[media] media: dvb-core move fe exit flag from fepriv to fe for driver access

Some fe drivers attempt to access the device for power control from
their release routines. When release routines are called after device
is disconnected, the attempts fail. fe drivers should avoid accessing
the device, from their release interfaces when called from disconnect
path. dvb-frontend maintains exit flag to keep track when fe device is
disconnected in its private data structures. Export the flag in fe to
enable drivers to check the device status from their release interfaces.
Signed-off-by: default avatarShuah Khan <shuah.kh@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent cc5c5d20
...@@ -96,10 +96,6 @@ MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open( ...@@ -96,10 +96,6 @@ MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open(
* FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again. * FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again.
*/ */
#define DVB_FE_NO_EXIT 0
#define DVB_FE_NORMAL_EXIT 1
#define DVB_FE_DEVICE_REMOVED 2
static DEFINE_MUTEX(frontend_mutex); static DEFINE_MUTEX(frontend_mutex);
struct dvb_frontend_private { struct dvb_frontend_private {
...@@ -113,7 +109,6 @@ struct dvb_frontend_private { ...@@ -113,7 +109,6 @@ struct dvb_frontend_private {
wait_queue_head_t wait_queue; wait_queue_head_t wait_queue;
struct task_struct *thread; struct task_struct *thread;
unsigned long release_jiffies; unsigned long release_jiffies;
unsigned int exit;
unsigned int wakeup; unsigned int wakeup;
fe_status_t status; fe_status_t status;
unsigned long tune_mode_flags; unsigned long tune_mode_flags;
...@@ -565,7 +560,7 @@ static int dvb_frontend_is_exiting(struct dvb_frontend *fe) ...@@ -565,7 +560,7 @@ static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
{ {
struct dvb_frontend_private *fepriv = fe->frontend_priv; struct dvb_frontend_private *fepriv = fe->frontend_priv;
if (fepriv->exit != DVB_FE_NO_EXIT) if (fe->exit != DVB_FE_NO_EXIT)
return 1; return 1;
if (fepriv->dvbdev->writers == 1) if (fepriv->dvbdev->writers == 1)
...@@ -629,7 +624,7 @@ static int dvb_frontend_thread(void *data) ...@@ -629,7 +624,7 @@ static int dvb_frontend_thread(void *data)
/* got signal or quitting */ /* got signal or quitting */
if (!down_interruptible(&fepriv->sem)) if (!down_interruptible(&fepriv->sem))
semheld = true; semheld = true;
fepriv->exit = DVB_FE_NORMAL_EXIT; fe->exit = DVB_FE_NORMAL_EXIT;
break; break;
} }
...@@ -739,9 +734,9 @@ static int dvb_frontend_thread(void *data) ...@@ -739,9 +734,9 @@ static int dvb_frontend_thread(void *data)
fepriv->thread = NULL; fepriv->thread = NULL;
if (kthread_should_stop()) if (kthread_should_stop())
fepriv->exit = DVB_FE_DEVICE_REMOVED; fe->exit = DVB_FE_DEVICE_REMOVED;
else else
fepriv->exit = DVB_FE_NO_EXIT; fe->exit = DVB_FE_NO_EXIT;
mb(); mb();
if (semheld) if (semheld)
...@@ -756,7 +751,8 @@ static void dvb_frontend_stop(struct dvb_frontend *fe) ...@@ -756,7 +751,8 @@ static void dvb_frontend_stop(struct dvb_frontend *fe)
dev_dbg(fe->dvb->device, "%s:\n", __func__); dev_dbg(fe->dvb->device, "%s:\n", __func__);
fepriv->exit = DVB_FE_NORMAL_EXIT; if (fe->exit != DVB_FE_DEVICE_REMOVED)
fe->exit = DVB_FE_NORMAL_EXIT;
mb(); mb();
if (!fepriv->thread) if (!fepriv->thread)
...@@ -826,7 +822,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe) ...@@ -826,7 +822,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
dev_dbg(fe->dvb->device, "%s:\n", __func__); dev_dbg(fe->dvb->device, "%s:\n", __func__);
if (fepriv->thread) { if (fepriv->thread) {
if (fepriv->exit == DVB_FE_NO_EXIT) if (fe->exit == DVB_FE_NO_EXIT)
return 0; return 0;
else else
dvb_frontend_stop (fe); dvb_frontend_stop (fe);
...@@ -838,7 +834,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe) ...@@ -838,7 +834,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
return -EINTR; return -EINTR;
fepriv->state = FESTATE_IDLE; fepriv->state = FESTATE_IDLE;
fepriv->exit = DVB_FE_NO_EXIT; fe->exit = DVB_FE_NO_EXIT;
fepriv->thread = NULL; fepriv->thread = NULL;
mb(); mb();
...@@ -1906,7 +1902,7 @@ static int dvb_frontend_ioctl(struct file *file, ...@@ -1906,7 +1902,7 @@ static int dvb_frontend_ioctl(struct file *file,
if (down_interruptible(&fepriv->sem)) if (down_interruptible(&fepriv->sem))
return -ERESTARTSYS; return -ERESTARTSYS;
if (fepriv->exit != DVB_FE_NO_EXIT) { if (fe->exit != DVB_FE_NO_EXIT) {
up(&fepriv->sem); up(&fepriv->sem);
return -ENODEV; return -ENODEV;
} }
...@@ -2424,7 +2420,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) ...@@ -2424,7 +2420,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
int ret; int ret;
dev_dbg(fe->dvb->device, "%s:\n", __func__); dev_dbg(fe->dvb->device, "%s:\n", __func__);
if (fepriv->exit == DVB_FE_DEVICE_REMOVED) if (fe->exit == DVB_FE_DEVICE_REMOVED)
return -ENODEV; return -ENODEV;
if (adapter->mfe_shared) { if (adapter->mfe_shared) {
...@@ -2529,7 +2525,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) ...@@ -2529,7 +2525,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
if (dvbdev->users == -1) { if (dvbdev->users == -1) {
wake_up(&fepriv->wait_queue); wake_up(&fepriv->wait_queue);
if (fepriv->exit != DVB_FE_NO_EXIT) if (fe->exit != DVB_FE_NO_EXIT)
wake_up(&dvbdev->wait_queue); wake_up(&dvbdev->wait_queue);
if (fe->ops.ts_bus_ctrl) if (fe->ops.ts_bus_ctrl)
fe->ops.ts_bus_ctrl(fe, 0); fe->ops.ts_bus_ctrl(fe, 0);
......
...@@ -405,6 +405,10 @@ struct dtv_frontend_properties { ...@@ -405,6 +405,10 @@ struct dtv_frontend_properties {
struct dtv_fe_stats block_count; struct dtv_fe_stats block_count;
}; };
#define DVB_FE_NO_EXIT 0
#define DVB_FE_NORMAL_EXIT 1
#define DVB_FE_DEVICE_REMOVED 2
struct dvb_frontend { struct dvb_frontend {
struct dvb_frontend_ops ops; struct dvb_frontend_ops ops;
struct dvb_adapter *dvb; struct dvb_adapter *dvb;
...@@ -418,6 +422,7 @@ struct dvb_frontend { ...@@ -418,6 +422,7 @@ struct dvb_frontend {
#define DVB_FRONTEND_COMPONENT_DEMOD 1 #define DVB_FRONTEND_COMPONENT_DEMOD 1
int (*callback)(void *adapter_priv, int component, int cmd, int arg); int (*callback)(void *adapter_priv, int component, int cmd, int arg);
int id; int id;
unsigned int exit;
}; };
extern int dvb_register_frontend(struct dvb_adapter *dvb, extern int dvb_register_frontend(struct dvb_adapter *dvb,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment