aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2012-06-29 14:45:04 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-06-29 18:04:32 -0400
commit704a28e88ab6c9cfe393ae626b612cab8b46028e (patch)
tree10a368c4af41c3d66a4665458455fb9ce785848a
parent20bfe7ae089076b0af72a6d67f0298621ae90a9d (diff)
[media] drxk: prevent doing something wrong when init is not ok
If firmware is not loaded for some reason, or if it is not ready yet, it makes no sense to honour to any DVB callbacks. So, return -EAGAIN, as the error condition may be temporary. If the device doesn't initialize, either because it requires a firmware or because there's an error during init_drxk, returns -ENODEV, to indicate such error, on all DVB callbacks. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/frontends/drxk_hard.c58
-rw-r--r--drivers/media/dvb/frontends/drxk_hard.h10
2 files changed, 66 insertions, 2 deletions
diff --git a/drivers/media/dvb/frontends/drxk_hard.c b/drivers/media/dvb/frontends/drxk_hard.c
index 87cb3f02ebc..8fa28bb4708 100644
--- a/drivers/media/dvb/frontends/drxk_hard.c
+++ b/drivers/media/dvb/frontends/drxk_hard.c
@@ -2851,7 +2851,7 @@ static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2851 dprintk(1, "\n"); 2851 dprintk(1, "\n");
2852 2852
2853 if (state->m_DrxkState == DRXK_UNINITIALIZED) 2853 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2854 goto error; 2854 return 0;
2855 if (state->m_DrxkState == DRXK_POWERED_DOWN) 2855 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2856 goto error; 2856 goto error;
2857 2857
@@ -6197,6 +6197,7 @@ static int init_drxk(struct drxk_state *state)
6197 } 6197 }
6198error: 6198error:
6199 if (status < 0) { 6199 if (status < 0) {
6200 state->m_DrxkState = DRXK_NO_DEV;
6200 drxk_i2c_unlock(state); 6201 drxk_i2c_unlock(state);
6201 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__); 6202 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
6202 } 6203 }
@@ -6209,6 +6210,7 @@ static void load_firmware_cb(const struct firmware *fw,
6209{ 6210{
6210 struct drxk_state *state = context; 6211 struct drxk_state *state = context;
6211 6212
6213 dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
6212 if (!fw) { 6214 if (!fw) {
6213 printk(KERN_ERR 6215 printk(KERN_ERR
6214 "drxk: Could not load firmware file %s.\n", 6216 "drxk: Could not load firmware file %s.\n",
@@ -6250,6 +6252,12 @@ static int drxk_sleep(struct dvb_frontend *fe)
6250 struct drxk_state *state = fe->demodulator_priv; 6252 struct drxk_state *state = fe->demodulator_priv;
6251 6253
6252 dprintk(1, "\n"); 6254 dprintk(1, "\n");
6255
6256 if (state->m_DrxkState == DRXK_NO_DEV)
6257 return -ENODEV;
6258 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6259 return 0;
6260
6253 ShutDown(state); 6261 ShutDown(state);
6254 return 0; 6262 return 0;
6255} 6263}
@@ -6259,6 +6267,10 @@ static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6259 struct drxk_state *state = fe->demodulator_priv; 6267 struct drxk_state *state = fe->demodulator_priv;
6260 6268
6261 dprintk(1, "%s\n", enable ? "enable" : "disable"); 6269 dprintk(1, "%s\n", enable ? "enable" : "disable");
6270
6271 if (state->m_DrxkState == DRXK_NO_DEV)
6272 return -ENODEV;
6273
6262 return ConfigureI2CBridge(state, enable ? true : false); 6274 return ConfigureI2CBridge(state, enable ? true : false);
6263} 6275}
6264 6276
@@ -6271,6 +6283,12 @@ static int drxk_set_parameters(struct dvb_frontend *fe)
6271 6283
6272 dprintk(1, "\n"); 6284 dprintk(1, "\n");
6273 6285
6286 if (state->m_DrxkState == DRXK_NO_DEV)
6287 return -ENODEV;
6288
6289 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6290 return -EAGAIN;
6291
6274 if (!fe->ops.tuner_ops.get_if_frequency) { 6292 if (!fe->ops.tuner_ops.get_if_frequency) {
6275 printk(KERN_ERR 6293 printk(KERN_ERR
6276 "drxk: Error: get_if_frequency() not defined at tuner. Can't work without it!\n"); 6294 "drxk: Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
@@ -6324,6 +6342,12 @@ static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6324 u32 stat; 6342 u32 stat;
6325 6343
6326 dprintk(1, "\n"); 6344 dprintk(1, "\n");
6345
6346 if (state->m_DrxkState == DRXK_NO_DEV)
6347 return -ENODEV;
6348 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6349 return -EAGAIN;
6350
6327 *status = 0; 6351 *status = 0;
6328 GetLockStatus(state, &stat, 0); 6352 GetLockStatus(state, &stat, 0);
6329 if (stat == MPEG_LOCK) 6353 if (stat == MPEG_LOCK)
@@ -6337,8 +6361,15 @@ static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6337 6361
6338static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber) 6362static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6339{ 6363{
6364 struct drxk_state *state = fe->demodulator_priv;
6365
6340 dprintk(1, "\n"); 6366 dprintk(1, "\n");
6341 6367
6368 if (state->m_DrxkState == DRXK_NO_DEV)
6369 return -ENODEV;
6370 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6371 return -EAGAIN;
6372
6342 *ber = 0; 6373 *ber = 0;
6343 return 0; 6374 return 0;
6344} 6375}
@@ -6350,6 +6381,12 @@ static int drxk_read_signal_strength(struct dvb_frontend *fe,
6350 u32 val = 0; 6381 u32 val = 0;
6351 6382
6352 dprintk(1, "\n"); 6383 dprintk(1, "\n");
6384
6385 if (state->m_DrxkState == DRXK_NO_DEV)
6386 return -ENODEV;
6387 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6388 return -EAGAIN;
6389
6353 ReadIFAgc(state, &val); 6390 ReadIFAgc(state, &val);
6354 *strength = val & 0xffff; 6391 *strength = val & 0xffff;
6355 return 0; 6392 return 0;
@@ -6361,6 +6398,12 @@ static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6361 s32 snr2; 6398 s32 snr2;
6362 6399
6363 dprintk(1, "\n"); 6400 dprintk(1, "\n");
6401
6402 if (state->m_DrxkState == DRXK_NO_DEV)
6403 return -ENODEV;
6404 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6405 return -EAGAIN;
6406
6364 GetSignalToNoise(state, &snr2); 6407 GetSignalToNoise(state, &snr2);
6365 *snr = snr2 & 0xffff; 6408 *snr = snr2 & 0xffff;
6366 return 0; 6409 return 0;
@@ -6372,6 +6415,12 @@ static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6372 u16 err; 6415 u16 err;
6373 6416
6374 dprintk(1, "\n"); 6417 dprintk(1, "\n");
6418
6419 if (state->m_DrxkState == DRXK_NO_DEV)
6420 return -ENODEV;
6421 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6422 return -EAGAIN;
6423
6375 DVBTQAMGetAccPktErr(state, &err); 6424 DVBTQAMGetAccPktErr(state, &err);
6376 *ucblocks = (u32) err; 6425 *ucblocks = (u32) err;
6377 return 0; 6426 return 0;
@@ -6380,9 +6429,16 @@ static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6380static int drxk_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings 6429static int drxk_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6381 *sets) 6430 *sets)
6382{ 6431{
6432 struct drxk_state *state = fe->demodulator_priv;
6383 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 6433 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6384 6434
6385 dprintk(1, "\n"); 6435 dprintk(1, "\n");
6436
6437 if (state->m_DrxkState == DRXK_NO_DEV)
6438 return -ENODEV;
6439 if (state->m_DrxkState == DRXK_UNINITIALIZED)
6440 return -EAGAIN;
6441
6386 switch (p->delivery_system) { 6442 switch (p->delivery_system) {
6387 case SYS_DVBC_ANNEX_A: 6443 case SYS_DVBC_ANNEX_A:
6388 case SYS_DVBC_ANNEX_C: 6444 case SYS_DVBC_ANNEX_C:
diff --git a/drivers/media/dvb/frontends/drxk_hard.h b/drivers/media/dvb/frontends/drxk_hard.h
index c35ab2b3779..f4177970010 100644
--- a/drivers/media/dvb/frontends/drxk_hard.h
+++ b/drivers/media/dvb/frontends/drxk_hard.h
@@ -94,7 +94,15 @@ enum DRXPowerMode {
94 94
95 95
96enum AGC_CTRL_MODE { DRXK_AGC_CTRL_AUTO = 0, DRXK_AGC_CTRL_USER, DRXK_AGC_CTRL_OFF }; 96enum AGC_CTRL_MODE { DRXK_AGC_CTRL_AUTO = 0, DRXK_AGC_CTRL_USER, DRXK_AGC_CTRL_OFF };
97enum EDrxkState { DRXK_UNINITIALIZED = 0, DRXK_STOPPED, DRXK_DTV_STARTED, DRXK_ATV_STARTED, DRXK_POWERED_DOWN }; 97enum EDrxkState {
98 DRXK_UNINITIALIZED = 0,
99 DRXK_STOPPED,
100 DRXK_DTV_STARTED,
101 DRXK_ATV_STARTED,
102 DRXK_POWERED_DOWN,
103 DRXK_NO_DEV /* If drxk init failed */
104};
105
98enum EDrxkCoefArrayIndex { 106enum EDrxkCoefArrayIndex {
99 DRXK_COEF_IDX_MN = 0, 107 DRXK_COEF_IDX_MN = 0,
100 DRXK_COEF_IDX_FM , 108 DRXK_COEF_IDX_FM ,