At Fri, 8 Feb 2013 18:31:43 -0800, Ian Minett wrote:
From: Ian Minett ian_minett@creativelabs.com
Base the DSP firmware transfer and communication timeouts on jiffy values.
Signed-off-by: Ian Minett ian_minett@creativelabs.com
OK, applied this one.
thanks,
Takashi
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index a4b61a9..b52f00c 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c @@ -785,7 +785,7 @@ static int chipio_send(struct hda_codec *codec, unsigned int data) { unsigned int res;
- int retry = 50;
unsigned long timeout = jiffies + msecs_to_jiffies(1000);
/* send bits of data specified by reg */ do {
@@ -793,7 +793,9 @@ static int chipio_send(struct hda_codec *codec, reg, data); if (res == VENDOR_STATUS_CHIPIO_OK) return 0;
- } while (--retry);
msleep(20);
- } while (time_before(jiffies, timeout));
- return -EIO;
}
@@ -1059,14 +1061,15 @@ static int dspio_send(struct hda_codec *codec, unsigned int reg, unsigned int data) { int res;
- int retry = 50;
unsigned long timeout = jiffies + msecs_to_jiffies(1000);
/* send bits of data specified by reg to dsp */ do { res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data); if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY)) return res;
- } while (--retry);
msleep(20);
} while (time_before(jiffies, timeout));
return -EIO;
} @@ -1298,7 +1301,6 @@ static int dspio_send_scp_message(struct hda_codec *codec, unsigned int *bytes_returned) { struct ca0132_spec *spec = codec->spec;
- int retry; int status = -1; unsigned int scp_send_size = 0; unsigned int total_size;
@@ -1345,13 +1347,13 @@ static int dspio_send_scp_message(struct hda_codec *codec, }
if (waiting_for_resp) {
memset(return_buf, 0, return_buf_size);unsigned long timeout = jiffies + msecs_to_jiffies(1000);
do { msleep(20);retry = 50;
} while (spec->wait_scp && (--retry != 0));
waiting_for_resp = false;} while (spec->wait_scp && time_before(jiffies, timeout));
if (retry != 0) {
if (!spec->wait_scp) { ret_msg = (struct scp_msg *)return_buf; memcpy(&ret_msg->hdr, &spec->scp_resp_header, 4); memcpy(&ret_msg->data, spec->scp_resp_data,
@@ -2244,7 +2246,8 @@ static int dspxfr_one_seg(struct hda_codec *codec, u32 chip_addx_remainder; unsigned int run_size_words; const struct dsp_image_seg *hci_write = NULL;
- int retry;
unsigned long timeout;
bool dma_active;
if (fls == NULL) return -EINVAL;
@@ -2362,11 +2365,17 @@ static int dspxfr_one_seg(struct hda_codec *codec, status = dspxfr_hci_write(codec, hci_write); hci_write = NULL; }
retry = 5000;
while (dsp_is_dma_active(codec, dma_chan)) {
if (--retry <= 0)
timeout = jiffies + msecs_to_jiffies(2000);
do {
dma_active = dsp_is_dma_active(codec, dma_chan);
if (!dma_active) break;
}
msleep(20);
} while (time_before(jiffies, timeout));
if (dma_active)
break;
- snd_printdd(KERN_INFO "+++++ DMA complete"); dma_set_state(dma_engine, DMA_STATE_STOP); dma_reset(dma_engine);
@@ -2683,15 +2692,15 @@ static bool dspload_is_loaded(struct hda_codec *codec)
static bool dspload_wait_loaded(struct hda_codec *codec) {
- int retry = 100;
unsigned long timeout = jiffies + msecs_to_jiffies(2000);
do {
if (dspload_is_loaded(codec)) { pr_info("ca0132 DOWNLOAD OK :-) DSP IS RUNNING.\n"); return true; }msleep(20);
- } while (--retry);
msleep(20);
} while (time_before(jiffies, timeout));
pr_err("ca0132 DOWNLOAD FAILED!!! DSP IS NOT RUNNING.\n"); return false;
-- 1.7.4.1