From b0796446d67ef9db6cb6c912f77a59dd1e8ace3e Mon Sep 17 00:00:00 2001 From: Henrik Kurelid Date: Mon, 8 Dec 2008 08:40:54 +0100 Subject: [PATCH] firedtv: cleanup in avc_api Added return value checks for a number of AVC calls. Removed unused function added for test during development. Corrected a length calculating function. Added check of parameters before calling memcpy. Renamed parameter from app_info to ca_info. Added warning message for pmt_cmd=4 (close MMI). Signed-off-by: Henrik Kurelid --- drivers/media/dvb/firesat/avc_api.c | 96 +++++++++++++++++----------------- 1 files changed, 48 insertions(+), 48 deletions(-) diff --git a/drivers/media/dvb/firesat/avc_api.c b/drivers/media/dvb/firesat/avc_api.c index 3a4da73..ee856d8 100644 --- a/drivers/media/dvb/firesat/avc_api.c +++ b/drivers/media/dvb/firesat/avc_api.c @@ -666,36 +666,6 @@ void avc_remote_ctrl_work(struct work_struct *work) avc_register_remote_control(firesat); } -#if 0 /* FIXME: unused */ -int avc_tuner_host2ca(struct firesat *firesat) -{ - AVCCmdFrm CmdFrm; - AVCRspFrm RspFrm; - - memset(&CmdFrm, 0, sizeof(AVCCmdFrm)); - CmdFrm.cts = AVC; - CmdFrm.ctype = CONTROL; - CmdFrm.sutyp = 0x5; - CmdFrm.suid = firesat->subunit; - CmdFrm.opcode = VENDOR; - - CmdFrm.operand[0]=SFE_VENDOR_DE_COMPANYID_0; - CmdFrm.operand[1]=SFE_VENDOR_DE_COMPANYID_1; - CmdFrm.operand[2]=SFE_VENDOR_DE_COMPANYID_2; - CmdFrm.operand[3]=SFE_VENDOR_OPCODE_HOST2CA; - CmdFrm.operand[4] = 0; // slot - CmdFrm.operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; // ca tag - CmdFrm.operand[6] = 0; // more/last - CmdFrm.operand[7] = 0; // length - CmdFrm.length = 12; - - if (avc_write(firesat, &CmdFrm, &RspFrm) < 0) - return -EIO; - - return 0; -} -#endif - static int get_ca_object_pos(AVCRspFrm *RspFrm) { int length = 1; @@ -708,17 +678,19 @@ static int get_ca_object_pos(AVCRspFrm *RspFrm) static int get_ca_object_length(AVCRspFrm *RspFrm) { -#if 0 /* FIXME: unused */ - int size = 0; + int size; int i; - if (RspFrm->operand[7] & 0x80) + if (RspFrm->operand[7] & 0x80) { + size = 0; for (i = 0; i < (RspFrm->operand[7] & 0x7f); i++) { - size <<= 8; - size += RspFrm->operand[8 + i]; + size = (size << 8) + RspFrm->operand[8 + i]; } -#endif - return RspFrm->operand[7]; + } else { + size = RspFrm->operand[7] & 0x7f; + } + + return size; } int avc_ca_app_info(struct firesat *firesat, char *app_info, unsigned int *len) @@ -745,7 +717,10 @@ int avc_ca_app_info(struct firesat *firesat, char *app_info, unsigned int *len) if (avc_write(firesat, &CmdFrm, &RspFrm) < 0) return -EIO; - /* FIXME: check response code and validate response data */ + if (RspFrm.resp != STABLE) { + dev_err(&firesat->ud->device, "CA application info failed\n"); + return -EINVAL; + } pos = get_ca_object_pos(&RspFrm); app_info[0] = (TAG_APP_INFO >> 16) & 0xFF; @@ -753,13 +728,19 @@ int avc_ca_app_info(struct firesat *firesat, char *app_info, unsigned int *len) app_info[2] = (TAG_APP_INFO >> 0) & 0xFF; app_info[3] = 6 + RspFrm.operand[pos + 4]; app_info[4] = 0x01; + + if (RspFrm.operand[pos + 4] > 246) { + dev_err(&firesat->ud->device, "AVC response is too large to " + "fit in ca_msg.\n"); + } memcpy(&app_info[5], &RspFrm.operand[pos], 5 + RspFrm.operand[pos + 4]); + *len = app_info[3] + 4; return 0; } -int avc_ca_info(struct firesat *firesat, char *app_info, unsigned int *len) +int avc_ca_info(struct firesat *firesat, char *ca_info, unsigned int *len) { AVCCmdFrm CmdFrm; AVCRspFrm RspFrm; @@ -783,14 +764,19 @@ int avc_ca_info(struct firesat *firesat, char *app_info, unsigned int *len) if (avc_write(firesat, &CmdFrm, &RspFrm) < 0) return -EIO; + if (RspFrm.resp != STABLE) { + dev_err(&firesat->ud->device, "CA application info failed\n"); + return -EINVAL; + } + pos = get_ca_object_pos(&RspFrm); - app_info[0] = (TAG_CA_INFO >> 16) & 0xFF; - app_info[1] = (TAG_CA_INFO >> 8) & 0xFF; - app_info[2] = (TAG_CA_INFO >> 0) & 0xFF; - app_info[3] = 2; - app_info[4] = RspFrm.operand[pos + 0]; - app_info[5] = RspFrm.operand[pos + 1]; - *len = app_info[3] + 4; + ca_info[0] = (TAG_CA_INFO >> 16) & 0xFF; + ca_info[1] = (TAG_CA_INFO >> 8) & 0xFF; + ca_info[2] = (TAG_CA_INFO >> 0) & 0xFF; + ca_info[3] = 2; + ca_info[4] = RspFrm.operand[pos + 0]; + ca_info[5] = RspFrm.operand[pos + 1]; + *len = ca_info[3] + 4; return 0; } @@ -896,6 +882,10 @@ int avc_ca_pmt(struct firesat *firesat, char *msg, int length) if (pmt_cmd_id != 1 && pmt_cmd_id != 4) dev_err(&firesat->ud->device, "invalid pmt_cmd_id %d\n", pmt_cmd_id); + if (pmt_cmd_id == 4) + dev_err(&firesat->ud->device, + "WARNING: pmt_cmd_id %d, which is not " + "implemented\n", pmt_cmd_id); memcpy(&CmdFrm.operand[write_pos], &msg[read_pos], program_info_length); @@ -919,6 +909,10 @@ int avc_ca_pmt(struct firesat *firesat, char *msg, int length) dev_err(&firesat->ud->device, "invalid pmt_cmd_id %d " "at stream level\n", pmt_cmd_id); + if (pmt_cmd_id == 4) + dev_err(&firesat->ud->device, + "WARNING: pmt_cmd_id %d, which is not " + "implemented\n", pmt_cmd_id); memcpy(&CmdFrm.operand[write_pos], &msg[read_pos], es_info_length); @@ -982,7 +976,10 @@ int avc_ca_get_time_date(struct firesat *firesat, int *interval) if (avc_write(firesat, &CmdFrm, &RspFrm) < 0) return -EIO; - /* FIXME: check response code and validate response data */ + if (RspFrm.resp != STABLE) { + dev_err(&firesat->ud->device, "CA date/time failed\n"); + return -EINVAL; + } *interval = RspFrm.operand[get_ca_object_pos(&RspFrm)]; @@ -1042,7 +1039,10 @@ int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, unsigned int *len) if (avc_write(firesat, &CmdFrm, &RspFrm) < 0) return -EIO; - /* FIXME: check response code and validate response data */ + if (RspFrm.resp != ACCEPTED) { + dev_err(&firesat->ud->device, "CA MMI failed\n"); + return -EINVAL; + } *len = get_ca_object_length(&RspFrm); memcpy(mmi_object, &RspFrm.operand[get_ca_object_pos(&RspFrm)], *len); -- 1.5.4.3