summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/tuners/xc5000.c40
1 files changed, 21 insertions, 19 deletions
diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c
index ab7d444bcdc..460df44aa1a 100644
--- a/drivers/media/tuners/xc5000.c
+++ b/drivers/media/tuners/xc5000.c
@@ -1101,16 +1101,17 @@ static int xc5000_get_status(struct dvb_frontend *fe, u32 *status)
static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force)
{
struct xc5000_priv *priv = fe->tuner_priv;
- int ret = 0;
+ int ret, i;
u16 pll_lock_status;
u16 fw_ck;
cancel_delayed_work(&priv->timer_sleep);
- if (force || xc5000_is_firmware_loaded(fe) != 0) {
-
-fw_retry:
+ if (!force && xc5000_is_firmware_loaded(fe) == 0)
+ return 0;
+ /* Try up to 5 times to load firmware */
+ for (i = 0; i < 5; i++) {
ret = xc5000_fwupload(fe);
if (ret != 0)
return ret;
@@ -1118,25 +1119,25 @@ fw_retry:
msleep(20);
if (priv->fw_checksum_supported) {
- if (xc5000_readreg(priv, XREG_FW_CHECKSUM, &fw_ck)
- != 0) {
+ if (xc5000_readreg(priv, XREG_FW_CHECKSUM, &fw_ck)) {
dprintk(1, "%s() FW checksum reading failed.\n",
__func__);
- goto fw_retry;
+ continue;
}
- if (fw_ck == 0) {
+ if (!fw_ck) {
dprintk(1, "%s() FW checksum failed = 0x%04x\n",
__func__, fw_ck);
- goto fw_retry;
+ continue;
}
}
/* Start the tuner self-calibration process */
- ret |= xc_initialize(priv);
-
- if (ret != 0)
- goto fw_retry;
+ ret = xc_initialize(priv);
+ if (ret) {
+ dprintk(1, "Can't request Self-callibration. Reloading firmware\n");
+ continue;
+ }
/* Wait for calibration to complete.
* We could continue but XC5000 will clock stretch subsequent
@@ -1146,15 +1147,15 @@ fw_retry:
msleep(100);
if (priv->init_status_supported) {
- if (xc5000_readreg(priv, XREG_INIT_STATUS, &fw_ck) != 0) {
+ if (xc5000_readreg(priv, XREG_INIT_STATUS, &fw_ck)) {
dprintk(1, "%s() FW failed reading init status.\n",
__func__);
- goto fw_retry;
+ continue;
}
- if (fw_ck == 0) {
+ if (!fw_ck) {
dprintk(1, "%s() FW init status failed = 0x%04x\n", __func__, fw_ck);
- goto fw_retry;
+ continue;
}
}
@@ -1164,12 +1165,13 @@ fw_retry:
if (pll_lock_status > 63) {
/* PLL is unlocked, force reload of the firmware */
printk(KERN_ERR "xc5000: PLL not running after fwload.\n");
- goto fw_retry;
+ continue;
}
}
/* Default to "CABLE" mode */
- ret |= xc_write_reg(priv, XREG_SIGNALSOURCE, XC_RF_MODE_CABLE);
+ ret = xc_write_reg(priv, XREG_SIGNALSOURCE, XC_RF_MODE_CABLE);
+ break;
}
return ret;