162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Abilis Systems Single DVB-T Receiver 462306a36Sopenharmony_ci * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> 562306a36Sopenharmony_ci * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/kernel.h> 962306a36Sopenharmony_ci#include "as102_drv.h" 1062306a36Sopenharmony_ci#include "as10x_cmd.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/** 1362306a36Sopenharmony_ci * as10x_cmd_turn_on - send turn on command to AS10x 1462306a36Sopenharmony_ci * @adap: pointer to AS10x bus adapter 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * Return 0 when no error, < 0 in case of error. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ciint as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 2162306a36Sopenharmony_ci struct as10x_cmd_t *pcmd, *prsp; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci pcmd = adap->cmd; 2462306a36Sopenharmony_ci prsp = adap->rsp; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci /* prepare command */ 2762306a36Sopenharmony_ci as10x_cmd_build(pcmd, (++adap->cmd_xid), 2862306a36Sopenharmony_ci sizeof(pcmd->body.turn_on.req)); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci /* fill command */ 3162306a36Sopenharmony_ci pcmd->body.turn_on.req.proc_id = cpu_to_le16(CONTROL_PROC_TURNON); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci /* send command */ 3462306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 3562306a36Sopenharmony_ci error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, 3662306a36Sopenharmony_ci sizeof(pcmd->body.turn_on.req) + 3762306a36Sopenharmony_ci HEADER_SIZE, 3862306a36Sopenharmony_ci (uint8_t *) prsp, 3962306a36Sopenharmony_ci sizeof(prsp->body.turn_on.rsp) + 4062306a36Sopenharmony_ci HEADER_SIZE); 4162306a36Sopenharmony_ci } 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci if (error < 0) 4462306a36Sopenharmony_ci goto out; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* parse response */ 4762306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_TURNON_RSP); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciout: 5062306a36Sopenharmony_ci return error; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/** 5462306a36Sopenharmony_ci * as10x_cmd_turn_off - send turn off command to AS10x 5562306a36Sopenharmony_ci * @adap: pointer to AS10x bus adapter 5662306a36Sopenharmony_ci * 5762306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_ciint as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 6262306a36Sopenharmony_ci struct as10x_cmd_t *pcmd, *prsp; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci pcmd = adap->cmd; 6562306a36Sopenharmony_ci prsp = adap->rsp; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* prepare command */ 6862306a36Sopenharmony_ci as10x_cmd_build(pcmd, (++adap->cmd_xid), 6962306a36Sopenharmony_ci sizeof(pcmd->body.turn_off.req)); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* fill command */ 7262306a36Sopenharmony_ci pcmd->body.turn_off.req.proc_id = cpu_to_le16(CONTROL_PROC_TURNOFF); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* send command */ 7562306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 7662306a36Sopenharmony_ci error = adap->ops->xfer_cmd( 7762306a36Sopenharmony_ci adap, (uint8_t *) pcmd, 7862306a36Sopenharmony_ci sizeof(pcmd->body.turn_off.req) + HEADER_SIZE, 7962306a36Sopenharmony_ci (uint8_t *) prsp, 8062306a36Sopenharmony_ci sizeof(prsp->body.turn_off.rsp) + HEADER_SIZE); 8162306a36Sopenharmony_ci } 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci if (error < 0) 8462306a36Sopenharmony_ci goto out; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci /* parse response */ 8762306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_TURNOFF_RSP); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciout: 9062306a36Sopenharmony_ci return error; 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/** 9462306a36Sopenharmony_ci * as10x_cmd_set_tune - send set tune command to AS10x 9562306a36Sopenharmony_ci * @adap: pointer to AS10x bus adapter 9662306a36Sopenharmony_ci * @ptune: tune parameters 9762306a36Sopenharmony_ci * 9862306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 9962306a36Sopenharmony_ci */ 10062306a36Sopenharmony_ciint as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap, 10162306a36Sopenharmony_ci struct as10x_tune_args *ptune) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 10462306a36Sopenharmony_ci struct as10x_cmd_t *preq, *prsp; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci preq = adap->cmd; 10762306a36Sopenharmony_ci prsp = adap->rsp; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci /* prepare command */ 11062306a36Sopenharmony_ci as10x_cmd_build(preq, (++adap->cmd_xid), 11162306a36Sopenharmony_ci sizeof(preq->body.set_tune.req)); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci /* fill command */ 11462306a36Sopenharmony_ci preq->body.set_tune.req.proc_id = cpu_to_le16(CONTROL_PROC_SETTUNE); 11562306a36Sopenharmony_ci preq->body.set_tune.req.args.freq = (__force __u32)cpu_to_le32(ptune->freq); 11662306a36Sopenharmony_ci preq->body.set_tune.req.args.bandwidth = ptune->bandwidth; 11762306a36Sopenharmony_ci preq->body.set_tune.req.args.hier_select = ptune->hier_select; 11862306a36Sopenharmony_ci preq->body.set_tune.req.args.modulation = ptune->modulation; 11962306a36Sopenharmony_ci preq->body.set_tune.req.args.hierarchy = ptune->hierarchy; 12062306a36Sopenharmony_ci preq->body.set_tune.req.args.interleaving_mode = 12162306a36Sopenharmony_ci ptune->interleaving_mode; 12262306a36Sopenharmony_ci preq->body.set_tune.req.args.code_rate = ptune->code_rate; 12362306a36Sopenharmony_ci preq->body.set_tune.req.args.guard_interval = ptune->guard_interval; 12462306a36Sopenharmony_ci preq->body.set_tune.req.args.transmission_mode = 12562306a36Sopenharmony_ci ptune->transmission_mode; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci /* send command */ 12862306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 12962306a36Sopenharmony_ci error = adap->ops->xfer_cmd(adap, 13062306a36Sopenharmony_ci (uint8_t *) preq, 13162306a36Sopenharmony_ci sizeof(preq->body.set_tune.req) 13262306a36Sopenharmony_ci + HEADER_SIZE, 13362306a36Sopenharmony_ci (uint8_t *) prsp, 13462306a36Sopenharmony_ci sizeof(prsp->body.set_tune.rsp) 13562306a36Sopenharmony_ci + HEADER_SIZE); 13662306a36Sopenharmony_ci } 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci if (error < 0) 13962306a36Sopenharmony_ci goto out; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* parse response */ 14262306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_SETTUNE_RSP); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ciout: 14562306a36Sopenharmony_ci return error; 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci/** 14962306a36Sopenharmony_ci * as10x_cmd_get_tune_status - send get tune status command to AS10x 15062306a36Sopenharmony_ci * @adap: pointer to AS10x bus adapter 15162306a36Sopenharmony_ci * @pstatus: pointer to updated status structure of the current tune 15262306a36Sopenharmony_ci * 15362306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 15462306a36Sopenharmony_ci */ 15562306a36Sopenharmony_ciint as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap, 15662306a36Sopenharmony_ci struct as10x_tune_status *pstatus) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 15962306a36Sopenharmony_ci struct as10x_cmd_t *preq, *prsp; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci preq = adap->cmd; 16262306a36Sopenharmony_ci prsp = adap->rsp; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci /* prepare command */ 16562306a36Sopenharmony_ci as10x_cmd_build(preq, (++adap->cmd_xid), 16662306a36Sopenharmony_ci sizeof(preq->body.get_tune_status.req)); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci /* fill command */ 16962306a36Sopenharmony_ci preq->body.get_tune_status.req.proc_id = 17062306a36Sopenharmony_ci cpu_to_le16(CONTROL_PROC_GETTUNESTAT); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* send command */ 17362306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 17462306a36Sopenharmony_ci error = adap->ops->xfer_cmd( 17562306a36Sopenharmony_ci adap, 17662306a36Sopenharmony_ci (uint8_t *) preq, 17762306a36Sopenharmony_ci sizeof(preq->body.get_tune_status.req) + HEADER_SIZE, 17862306a36Sopenharmony_ci (uint8_t *) prsp, 17962306a36Sopenharmony_ci sizeof(prsp->body.get_tune_status.rsp) + HEADER_SIZE); 18062306a36Sopenharmony_ci } 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci if (error < 0) 18362306a36Sopenharmony_ci goto out; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci /* parse response */ 18662306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_GETTUNESTAT_RSP); 18762306a36Sopenharmony_ci if (error < 0) 18862306a36Sopenharmony_ci goto out; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci /* Response OK -> get response data */ 19162306a36Sopenharmony_ci pstatus->tune_state = prsp->body.get_tune_status.rsp.sts.tune_state; 19262306a36Sopenharmony_ci pstatus->signal_strength = 19362306a36Sopenharmony_ci le16_to_cpu((__force __le16)prsp->body.get_tune_status.rsp.sts.signal_strength); 19462306a36Sopenharmony_ci pstatus->PER = le16_to_cpu((__force __le16)prsp->body.get_tune_status.rsp.sts.PER); 19562306a36Sopenharmony_ci pstatus->BER = le16_to_cpu((__force __le16)prsp->body.get_tune_status.rsp.sts.BER); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ciout: 19862306a36Sopenharmony_ci return error; 19962306a36Sopenharmony_ci} 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci/** 20262306a36Sopenharmony_ci * as10x_cmd_get_tps - send get TPS command to AS10x 20362306a36Sopenharmony_ci * @adap: pointer to AS10x handle 20462306a36Sopenharmony_ci * @ptps: pointer to TPS parameters structure 20562306a36Sopenharmony_ci * 20662306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 20762306a36Sopenharmony_ci */ 20862306a36Sopenharmony_ciint as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap, struct as10x_tps *ptps) 20962306a36Sopenharmony_ci{ 21062306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 21162306a36Sopenharmony_ci struct as10x_cmd_t *pcmd, *prsp; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci pcmd = adap->cmd; 21462306a36Sopenharmony_ci prsp = adap->rsp; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci /* prepare command */ 21762306a36Sopenharmony_ci as10x_cmd_build(pcmd, (++adap->cmd_xid), 21862306a36Sopenharmony_ci sizeof(pcmd->body.get_tps.req)); 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* fill command */ 22162306a36Sopenharmony_ci pcmd->body.get_tune_status.req.proc_id = 22262306a36Sopenharmony_ci cpu_to_le16(CONTROL_PROC_GETTPS); 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci /* send command */ 22562306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 22662306a36Sopenharmony_ci error = adap->ops->xfer_cmd(adap, 22762306a36Sopenharmony_ci (uint8_t *) pcmd, 22862306a36Sopenharmony_ci sizeof(pcmd->body.get_tps.req) + 22962306a36Sopenharmony_ci HEADER_SIZE, 23062306a36Sopenharmony_ci (uint8_t *) prsp, 23162306a36Sopenharmony_ci sizeof(prsp->body.get_tps.rsp) + 23262306a36Sopenharmony_ci HEADER_SIZE); 23362306a36Sopenharmony_ci } 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci if (error < 0) 23662306a36Sopenharmony_ci goto out; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci /* parse response */ 23962306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_GETTPS_RSP); 24062306a36Sopenharmony_ci if (error < 0) 24162306a36Sopenharmony_ci goto out; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci /* Response OK -> get response data */ 24462306a36Sopenharmony_ci ptps->modulation = prsp->body.get_tps.rsp.tps.modulation; 24562306a36Sopenharmony_ci ptps->hierarchy = prsp->body.get_tps.rsp.tps.hierarchy; 24662306a36Sopenharmony_ci ptps->interleaving_mode = prsp->body.get_tps.rsp.tps.interleaving_mode; 24762306a36Sopenharmony_ci ptps->code_rate_HP = prsp->body.get_tps.rsp.tps.code_rate_HP; 24862306a36Sopenharmony_ci ptps->code_rate_LP = prsp->body.get_tps.rsp.tps.code_rate_LP; 24962306a36Sopenharmony_ci ptps->guard_interval = prsp->body.get_tps.rsp.tps.guard_interval; 25062306a36Sopenharmony_ci ptps->transmission_mode = prsp->body.get_tps.rsp.tps.transmission_mode; 25162306a36Sopenharmony_ci ptps->DVBH_mask_HP = prsp->body.get_tps.rsp.tps.DVBH_mask_HP; 25262306a36Sopenharmony_ci ptps->DVBH_mask_LP = prsp->body.get_tps.rsp.tps.DVBH_mask_LP; 25362306a36Sopenharmony_ci ptps->cell_ID = le16_to_cpu((__force __le16)prsp->body.get_tps.rsp.tps.cell_ID); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ciout: 25662306a36Sopenharmony_ci return error; 25762306a36Sopenharmony_ci} 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/** 26062306a36Sopenharmony_ci * as10x_cmd_get_demod_stats - send get demod stats command to AS10x 26162306a36Sopenharmony_ci * @adap: pointer to AS10x bus adapter 26262306a36Sopenharmony_ci * @pdemod_stats: pointer to demod stats parameters structure 26362306a36Sopenharmony_ci * 26462306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 26562306a36Sopenharmony_ci */ 26662306a36Sopenharmony_ciint as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t *adap, 26762306a36Sopenharmony_ci struct as10x_demod_stats *pdemod_stats) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 27062306a36Sopenharmony_ci struct as10x_cmd_t *pcmd, *prsp; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci pcmd = adap->cmd; 27362306a36Sopenharmony_ci prsp = adap->rsp; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci /* prepare command */ 27662306a36Sopenharmony_ci as10x_cmd_build(pcmd, (++adap->cmd_xid), 27762306a36Sopenharmony_ci sizeof(pcmd->body.get_demod_stats.req)); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci /* fill command */ 28062306a36Sopenharmony_ci pcmd->body.get_demod_stats.req.proc_id = 28162306a36Sopenharmony_ci cpu_to_le16(CONTROL_PROC_GET_DEMOD_STATS); 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci /* send command */ 28462306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 28562306a36Sopenharmony_ci error = adap->ops->xfer_cmd(adap, 28662306a36Sopenharmony_ci (uint8_t *) pcmd, 28762306a36Sopenharmony_ci sizeof(pcmd->body.get_demod_stats.req) 28862306a36Sopenharmony_ci + HEADER_SIZE, 28962306a36Sopenharmony_ci (uint8_t *) prsp, 29062306a36Sopenharmony_ci sizeof(prsp->body.get_demod_stats.rsp) 29162306a36Sopenharmony_ci + HEADER_SIZE); 29262306a36Sopenharmony_ci } 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci if (error < 0) 29562306a36Sopenharmony_ci goto out; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci /* parse response */ 29862306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_GET_DEMOD_STATS_RSP); 29962306a36Sopenharmony_ci if (error < 0) 30062306a36Sopenharmony_ci goto out; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci /* Response OK -> get response data */ 30362306a36Sopenharmony_ci pdemod_stats->frame_count = 30462306a36Sopenharmony_ci le32_to_cpu((__force __le32)prsp->body.get_demod_stats.rsp.stats.frame_count); 30562306a36Sopenharmony_ci pdemod_stats->bad_frame_count = 30662306a36Sopenharmony_ci le32_to_cpu((__force __le32)prsp->body.get_demod_stats.rsp.stats.bad_frame_count); 30762306a36Sopenharmony_ci pdemod_stats->bytes_fixed_by_rs = 30862306a36Sopenharmony_ci le32_to_cpu((__force __le32)prsp->body.get_demod_stats.rsp.stats.bytes_fixed_by_rs); 30962306a36Sopenharmony_ci pdemod_stats->mer = 31062306a36Sopenharmony_ci le16_to_cpu((__force __le16)prsp->body.get_demod_stats.rsp.stats.mer); 31162306a36Sopenharmony_ci pdemod_stats->has_started = 31262306a36Sopenharmony_ci prsp->body.get_demod_stats.rsp.stats.has_started; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ciout: 31562306a36Sopenharmony_ci return error; 31662306a36Sopenharmony_ci} 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci/** 31962306a36Sopenharmony_ci * as10x_cmd_get_impulse_resp - send get impulse response command to AS10x 32062306a36Sopenharmony_ci * @adap: pointer to AS10x bus adapter 32162306a36Sopenharmony_ci * @is_ready: pointer to value indicating when impulse 32262306a36Sopenharmony_ci * response data is ready 32362306a36Sopenharmony_ci * 32462306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 32562306a36Sopenharmony_ci */ 32662306a36Sopenharmony_ciint as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap, 32762306a36Sopenharmony_ci uint8_t *is_ready) 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci int error = AS10X_CMD_ERROR; 33062306a36Sopenharmony_ci struct as10x_cmd_t *pcmd, *prsp; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci pcmd = adap->cmd; 33362306a36Sopenharmony_ci prsp = adap->rsp; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci /* prepare command */ 33662306a36Sopenharmony_ci as10x_cmd_build(pcmd, (++adap->cmd_xid), 33762306a36Sopenharmony_ci sizeof(pcmd->body.get_impulse_rsp.req)); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci /* fill command */ 34062306a36Sopenharmony_ci pcmd->body.get_impulse_rsp.req.proc_id = 34162306a36Sopenharmony_ci cpu_to_le16(CONTROL_PROC_GET_IMPULSE_RESP); 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci /* send command */ 34462306a36Sopenharmony_ci if (adap->ops->xfer_cmd) { 34562306a36Sopenharmony_ci error = adap->ops->xfer_cmd(adap, 34662306a36Sopenharmony_ci (uint8_t *) pcmd, 34762306a36Sopenharmony_ci sizeof(pcmd->body.get_impulse_rsp.req) 34862306a36Sopenharmony_ci + HEADER_SIZE, 34962306a36Sopenharmony_ci (uint8_t *) prsp, 35062306a36Sopenharmony_ci sizeof(prsp->body.get_impulse_rsp.rsp) 35162306a36Sopenharmony_ci + HEADER_SIZE); 35262306a36Sopenharmony_ci } 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci if (error < 0) 35562306a36Sopenharmony_ci goto out; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci /* parse response */ 35862306a36Sopenharmony_ci error = as10x_rsp_parse(prsp, CONTROL_PROC_GET_IMPULSE_RESP_RSP); 35962306a36Sopenharmony_ci if (error < 0) 36062306a36Sopenharmony_ci goto out; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci /* Response OK -> get response data */ 36362306a36Sopenharmony_ci *is_ready = prsp->body.get_impulse_rsp.rsp.is_ready; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ciout: 36662306a36Sopenharmony_ci return error; 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci/** 37062306a36Sopenharmony_ci * as10x_cmd_build - build AS10x command header 37162306a36Sopenharmony_ci * @pcmd: pointer to AS10x command buffer 37262306a36Sopenharmony_ci * @xid: sequence id of the command 37362306a36Sopenharmony_ci * @cmd_len: length of the command 37462306a36Sopenharmony_ci */ 37562306a36Sopenharmony_civoid as10x_cmd_build(struct as10x_cmd_t *pcmd, 37662306a36Sopenharmony_ci uint16_t xid, uint16_t cmd_len) 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci pcmd->header.req_id = cpu_to_le16(xid); 37962306a36Sopenharmony_ci pcmd->header.prog = cpu_to_le16(SERVICE_PROG_ID); 38062306a36Sopenharmony_ci pcmd->header.version = cpu_to_le16(SERVICE_PROG_VERSION); 38162306a36Sopenharmony_ci pcmd->header.data_len = cpu_to_le16(cmd_len); 38262306a36Sopenharmony_ci} 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci/** 38562306a36Sopenharmony_ci * as10x_rsp_parse - Parse command response 38662306a36Sopenharmony_ci * @prsp: pointer to AS10x command buffer 38762306a36Sopenharmony_ci * @proc_id: id of the command 38862306a36Sopenharmony_ci * 38962306a36Sopenharmony_ci * Return 0 on success or negative value in case of error. 39062306a36Sopenharmony_ci */ 39162306a36Sopenharmony_ciint as10x_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id) 39262306a36Sopenharmony_ci{ 39362306a36Sopenharmony_ci int error; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci /* extract command error code */ 39662306a36Sopenharmony_ci error = prsp->body.common.rsp.error; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci if ((error == 0) && 39962306a36Sopenharmony_ci (le16_to_cpu(prsp->body.common.rsp.proc_id) == proc_id)) { 40062306a36Sopenharmony_ci return 0; 40162306a36Sopenharmony_ci } 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci return AS10X_CMD_ERROR; 40462306a36Sopenharmony_ci} 405