Hi, This patch Improve signal reception parameters monitoring using siano statistic functions. Thanks, Doron Cohen -------------- >From 0325e0559d99ccb5ac04e9edef8eb0281a410c52 Mon Sep 17 00:00:00 2001 From: Doron Cohen <doronc@xxxxxxxxxxxx> Date: Mon, 19 Sep 2011 14:43:01 +0300 Subject: [PATCH 13/21] Use get_statistics_ex instead of depracated get_statistics --- drivers/media/dvb/siano/smsdvb.c | 73 +++++++++++++++++++++----------------- 1 files changed, 40 insertions(+), 33 deletions(-) diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index b80868c..aa345ed 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c @@ -48,6 +48,7 @@ struct smsdvb_client_t { fe_status_t fe_status; struct completion tune_done; + struct completion get_stats_done; /* todo: save freq/band instead whole struct */ struct dvb_frontend_parameters fe_params; @@ -330,7 +331,7 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) is_status_update = true; break; } - case MSG_SMS_GET_STATISTICS_RES: { + case MSG_SMS_GET_STATISTICS_EX_RES: { union { struct SMSHOSTLIB_STATISTICS_ISDBT_S isdbt; struct SMSHOSTLIB_STATISTICS_DVB_S dvb; @@ -343,22 +344,20 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) is_status_update = true; switch (smscore_get_device_mode(client->coredev)) { + case SMSHOSTLIB_DEVMD_DVBT: + case SMSHOSTLIB_DEVMD_DVBH: + case SMSHOSTLIB_DEVMD_DVBT_BDA: + smsdvb_update_dvb_stats(pReceptionData, &p->dvb); + break; case SMSHOSTLIB_DEVMD_ISDBT: case SMSHOSTLIB_DEVMD_ISDBT_BDA: smsdvb_update_isdbt_stats(pReceptionData, &p->isdbt); break; default: - smsdvb_update_dvb_stats(pReceptionData, &p->dvb); - } - if (!pReceptionData->IsDemodLocked) { - pReceptionData->SNR = 0; - pReceptionData->BER = 0; - pReceptionData->BERErrorCount = 0; - pReceptionData->InBandPwr = 0; - pReceptionData->ErrorTSPackets = 0; + break; } - - complete(&client->tune_done); + is_status_update = true; + complete(&client->get_stats_done); break; } default: @@ -470,18 +469,22 @@ static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client, 0 : -ETIME; } -static int smsdvb_send_statistics_request(struct smsdvb_client_t *client) -{ - int rc; - struct SmsMsgHdr_S Msg = { MSG_SMS_GET_STATISTICS_REQ, - DVBT_BDA_CONTROL_MSG_ID, - HIF_TASK, - sizeof(struct SmsMsgHdr_S), 0 }; +static int smsdvb_get_statistics_ex(struct dvb_frontend *fe) { - rc = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), - &client->tune_done); + struct smsdvb_client_t *client = + container_of(fe, struct smsdvb_client_t, frontend); + struct SmsMsgHdr_S Msg; + + Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; + Msg.msgDstId = HIF_TASK; + Msg.msgFlags = 0; + Msg.msgType = MSG_SMS_GET_STATISTICS_EX_REQ; + Msg.msgLength = sizeof(Msg); + + smsendian_handle_tx_message((struct SmsMsgHdr_S *)&Msg); + return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), + &client->get_stats_done); - return rc; } static inline int led_feedback(struct smsdvb_client_t *client) @@ -500,7 +503,7 @@ static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) struct smsdvb_client_t *client; client = container_of(fe, struct smsdvb_client_t, frontend); - rc = smsdvb_send_statistics_request(client); + rc = smsdvb_get_statistics_ex(fe); *stat = client->fe_status; @@ -515,7 +518,7 @@ static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber) struct smsdvb_client_t *client; client = container_of(fe, struct smsdvb_client_t, frontend); - rc = smsdvb_send_statistics_request(client); + rc = smsdvb_get_statistics_ex(fe); *ber = client->reception_data.BER; @@ -531,7 +534,7 @@ static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength) struct smsdvb_client_t *client; client = container_of(fe, struct smsdvb_client_t, frontend); - rc = smsdvb_send_statistics_request(client); + rc = smsdvb_get_statistics_ex(fe); if (client->reception_data.InBandPwr < -95) *strength = 0; @@ -553,7 +556,7 @@ static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr) struct smsdvb_client_t *client; client = container_of(fe, struct smsdvb_client_t, frontend); - rc = smsdvb_send_statistics_request(client); + rc = smsdvb_get_statistics_ex(fe); *snr = client->reception_data.SNR; @@ -568,7 +571,7 @@ static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) struct smsdvb_client_t *client; client = container_of(fe, struct smsdvb_client_t, frontend); - rc = smsdvb_send_statistics_request(client); + rc = smsdvb_get_statistics_ex(fe); *ucblocks = client->reception_data.ErrorTSPackets; @@ -595,10 +598,11 @@ static int smsdvb_dvbt_set_frontend(struct dvb_frontend *fe, struct smsdvb_client_t *client = container_of(fe, struct smsdvb_client_t, frontend); - struct SmsMsgData3Args_S Msg; - + struct SmsMsgData4Args_S Msg; int ret; + sms_info("setting DVB freq to %d", p->frequency); + client->fe_status = FE_HAS_SIGNAL; client->event_fe_state = -1; client->event_unc_state = -1; @@ -611,9 +615,7 @@ static int smsdvb_dvbt_set_frontend(struct dvb_frontend *fe, Msg.xMsgHeader.msgLength = sizeof(Msg); Msg.msgData[0] = c->frequency; Msg.msgData[2] = 12000000; - - sms_info("%s: freq %d band %d", __func__, c->frequency, - c->bandwidth_hz); + Msg.msgData[3] = 0; switch (c->bandwidth_hz / 1000000) { case 8: @@ -723,9 +725,14 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe, { struct smsdvb_client_t *client = container_of(fe, struct smsdvb_client_t, frontend); - struct smscore_device_t *coredev = client->coredev; + sms_info("setting the front end"); + + client->fe_status = FE_HAS_SIGNAL; + client->event_fe_state = -1; + client->event_unc_state = -1; + - switch (smscore_get_device_mode(coredev)) { + switch (smscore_get_device_mode(client->coredev)) { case SMSHOSTLIB_DEVMD_DVBT: case SMSHOSTLIB_DEVMD_DVBT_BDA: return smsdvb_dvbt_set_frontend(fe, fep); -- 1.7.4.1 >From 0a248021a6e26209666f66eda63503e62d0bbdfa Mon Sep 17 00:00:00 2001 From: Doron Cohen <doronc@xxxxxxxxxxxx> Date: Mon, 19 Sep 2011 17:03:51 +0300 Subject: [PATCH 14/21] Bug fix - DVB statistics were wrong since get_statistics_ex is not supported for DVB --- drivers/media/dvb/siano/smscoreapi.h | 67 ++++++++++++++-- drivers/media/dvb/siano/smsdvb.c | 142 ++++++++++++++++++---------------- 2 files changed, 136 insertions(+), 73 deletions(-) diff --git a/drivers/media/dvb/siano/smscoreapi.h b/drivers/media/dvb/siano/smscoreapi.h index 4b620c9..1df2fa6 100644 --- a/drivers/media/dvb/siano/smscoreapi.h +++ b/drivers/media/dvb/siano/smscoreapi.h @@ -1323,19 +1323,72 @@ typedef struct PID_DATA_S }PID_DATA_ST; -// Statistics information returned as response for SmsHostApiGetStatisticsEx_Req for DVB applications, SMS1100 and up -typedef struct SMSHOSTLIB_STATISTICS_DVB_S +/// Statistics information returned as response for SmsHostApiGetStatistics_Req +typedef struct SMSHOSTLIB_STATISTICS_S { - // Reception - RECEPTION_STATISTICS_ST ReceptionData; + u32 Reserved; //!< Reserved + + // Common parameters + u32 IsRfLocked; //!< 0 - not locked, 1 - locked + u32 IsDemodLocked; //!< 0 - not locked, 1 - locked + u32 IsExternalLNAOn; //!< 0 - external LNA off, 1 - external LNA on + + // Reception quality + s32 SNR; //!< dB + u32 BER; //!< Post Viterbi BER [1E-5] + u32 FIB_CRC; //!< CRC errors percentage, valid only for DAB + u32 TS_PER; //!< Transport stream PER, 0xFFFFFFFF indicate N/A, valid only for DVB-T/H + u32 MFER; //!< DVB-H frame error rate in percentage, 0xFFFFFFFF indicate N/A, valid only for DVB-H + s32 RSSI; //!< dBm + s32 InBandPwr; //!< In band power in dBM + s32 CarrierOffset; //!< Carrier Offset in bin/1024 // Transmission parameters - TRANSMISSION_STATISTICS_ST TransmissionData; + u32 Frequency; //!< Frequency in Hz + u32 Bandwidth; //!< Bandwidth in MHz, valid only for DVB-T/H + u32 TransmissionMode; //!< Transmission Mode, for DAB modes 1-4, for DVB-T/H FFT mode carriers in Kilos + u32 ModemState; //!< from SMSHOSTLIB_DVB_MODEM_STATE_ET , valid only for DVB-T/H + u32 GuardInterval; //!< Guard Interval from SMSHOSTLIB_GUARD_INTERVALS_ET, valid only for DVB-T/H + u32 CodeRate; //!< Code Rate from SMSHOSTLIB_CODE_RATE_ET, valid only for DVB-T/H + u32 LPCodeRate; //!< Low Priority Code Rate from SMSHOSTLIB_CODE_RATE_ET, valid only for DVB-T/H + u32 Hierarchy; //!< Hierarchy from SMSHOSTLIB_HIERARCHY_ET, valid only for DVB-T/H + u32 Constellation; //!< Constellation from SMSHOSTLIB_CONSTELLATION_ET, valid only for DVB-T/H // Burst parameters, valid only for DVB-H - PID_DATA_ST PidData[SRVM_MAX_PID_FILTERS]; + u32 BurstSize; //!< Current burst size in bytes, valid only for DVB-H + u32 BurstDuration; //!< Current burst duration in mSec, valid only for DVB-H + u32 BurstCycleTime; //!< Current burst cycle time in mSec, valid only for DVB-H + u32 CalculatedBurstCycleTime;//!< Current burst cycle time in mSec, as calculated by demodulator, valid only for DVB-H + u32 NumOfRows; //!< Number of rows in MPE table, valid only for DVB-H + u32 NumOfPaddCols; //!< Number of padding columns in MPE table, valid only for DVB-H + u32 NumOfPunctCols; //!< Number of puncturing columns in MPE table, valid only for DVB-H + u32 ErrorTSPackets; //!< Number of erroneous transport-stream packets + u32 TotalTSPackets; //!< Total number of transport-stream packets + u32 NumOfValidMpeTlbs; //!< Number of MPE tables which do not include errors after MPE RS decoding + u32 NumOfInvalidMpeTlbs; //!< Number of MPE tables which include errors after MPE RS decoding + u32 NumOfCorrectedMpeTlbs; //!< Number of MPE tables which were corrected by MPE RS decoding + // Common params + u32 BERErrorCount; //!< Number of errornous SYNC bits. + u32 BERBitCount; //!< Total number of SYNC bits. + + // Interface information + u32 SmsToHostTxErrors; //!< Total number of transmission errors. + + // DAB/T-DMB + u32 PreBER; //!< DAB/T-DMB only: Pre Viterbi BER [1E-5] + + // DVB-H TPS parameters + u32 CellId; //!< TPS Cell ID in bits 15..0, bits 31..16 zero; if set to 0xFFFFFFFF cell_id not yet recovered + u32 DvbhSrvIndHP; //!< DVB-H service indication info, bit 1 - Time Slicing indicator, bit 0 - MPE-FEC indicator + u32 DvbhSrvIndLP; //!< DVB-H service indication info, bit 1 - Time Slicing indicator, bit 0 - MPE-FEC indicator + + u32 NumMPEReceived; //!< DVB-H, Num MPE section received + + u32 ErrorsCounter; //fw errors counter + u8 ErrorsHistory[8]; //fw errors + u32 ReservedFields[7]; //!< Reserved -} SMSHOSTLIB_STATISTICS_DVB_ST; +} SMSHOSTLIB_STATISTICS_ST; // Helper struct for ISDB-T statistics diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index aa345ed..97e1780 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c @@ -133,43 +133,56 @@ static void sms_board_dvb3_event(struct smsdvb_client_t *client, static void smsdvb_update_dvb_stats(struct RECEPTION_STATISTICS_S *pReceptionData, - struct SMSHOSTLIB_STATISTICS_DVB_S *p) + struct SMSHOSTLIB_STATISTICS_S *p) { - sms_debug("IsRfLocked = %d", p->ReceptionData.IsRfLocked); - sms_debug("IsDemodLocked = %d", p->ReceptionData.IsDemodLocked); - sms_debug("IsExternalLNAOn = %d", p->ReceptionData.IsExternalLNAOn); - sms_debug("SNR = %d", p->ReceptionData.SNR); - sms_debug("BER = %d", p->ReceptionData.BER); - sms_debug("TS_PER = %d", p->ReceptionData.TS_PER); - sms_debug("MFER = %d", p->ReceptionData.MFER); - sms_debug("RSSI = %d", p->ReceptionData.RSSI); - sms_debug("InBandPwr = %d", p->ReceptionData.InBandPwr); - sms_debug("CarrierOffset = %d", p->ReceptionData.CarrierOffset); - sms_debug("ModemState = %d", p->ReceptionData.ModemState); - sms_debug("Frequency = %d", p->TransmissionData.Frequency); - sms_debug("Bandwidth = %d", p->TransmissionData.Bandwidth); - sms_debug("TransmissionMode = %d", p->TransmissionData.TransmissionMode); - sms_debug("GuardInterval = %d", p->TransmissionData.GuardInterval); - sms_debug("CodeRate = %d", p->TransmissionData.CodeRate); - sms_debug("LPCodeRate = %d", p->TransmissionData.LPCodeRate); - sms_debug("Hierarchy = %d", p->TransmissionData.Hierarchy); - sms_debug("Constellation = %d", p->TransmissionData.Constellation); + sms_debug("IsRfLocked = %d", p->IsRfLocked); + sms_debug("IsDemodLocked = %d", p->IsDemodLocked); + sms_debug("IsExternalLNAOn = %d", p->IsExternalLNAOn); + sms_debug("SNR = %d", p->SNR); + sms_debug("BER = %d", p->BER); + sms_debug("TS_PER = %d", p->TS_PER); + sms_debug("MFER = %d", p->MFER); + sms_debug("RSSI = %d", p->RSSI); + sms_debug("InBandPwr = %d", p->InBandPwr); + sms_debug("CarrierOffset = %d", p->CarrierOffset); + sms_debug("ModemState = %d", p->ModemState); + sms_debug("Frequency = %d", p->Frequency); + sms_debug("Bandwidth = %d", p->Bandwidth); + sms_debug("TransmissionMode = %d", p->TransmissionMode); + sms_debug("GuardInterval = %d", p->GuardInterval); + sms_debug("CodeRate = %d", p->CodeRate); + sms_debug("LPCodeRate = %d", p->LPCodeRate); + sms_debug("Hierarchy = %d", p->Hierarchy); + sms_debug("Constellation = %d", p->Constellation); /* update reception data */ - pReceptionData->IsRfLocked = p->ReceptionData.IsRfLocked; - pReceptionData->IsDemodLocked = p->ReceptionData.IsDemodLocked; - pReceptionData->IsExternalLNAOn = p->ReceptionData.IsExternalLNAOn; - pReceptionData->ModemState = p->ReceptionData.ModemState; - pReceptionData->SNR = p->ReceptionData.SNR; - pReceptionData->BER = p->ReceptionData.BER; - pReceptionData->BERErrorCount = p->ReceptionData.BERErrorCount; - pReceptionData->BERBitCount = p->ReceptionData.BERBitCount; - pReceptionData->RSSI = p->ReceptionData.RSSI; + pReceptionData->IsRfLocked = p->IsRfLocked; + pReceptionData->IsDemodLocked = p->IsDemodLocked; + pReceptionData->IsExternalLNAOn = p->IsExternalLNAOn; + pReceptionData->ModemState = p->ModemState; + pReceptionData->SNR = p->SNR; + pReceptionData->BER = p->BER; + pReceptionData->BERErrorCount = p->BERErrorCount; + pReceptionData->BERBitCount = p->BERBitCount; + pReceptionData->RSSI = p->RSSI; CORRECT_STAT_RSSI(*pReceptionData); - pReceptionData->InBandPwr = p->ReceptionData.InBandPwr; - pReceptionData->CarrierOffset = p->ReceptionData.CarrierOffset; - pReceptionData->ErrorTSPackets = p->ReceptionData.ErrorTSPackets; - pReceptionData->TotalTSPackets = p->ReceptionData.TotalTSPackets; + pReceptionData->InBandPwr = p->InBandPwr; + pReceptionData->CarrierOffset = p->CarrierOffset; + pReceptionData->ErrorTSPackets = p->ErrorTSPackets; + pReceptionData->TotalTSPackets = p->TotalTSPackets; + + /* TS PER */ + if ((p->TotalTSPackets + p->ErrorTSPackets) > 0) + { + pReceptionData->TS_PER = (p->ErrorTSPackets + * 100) / (p->TotalTSPackets + + p->ErrorTSPackets); + } + else { + pReceptionData->TS_PER = 0; + } + + pReceptionData->MFER = 0; }; @@ -331,32 +344,21 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) is_status_update = true; break; } - case MSG_SMS_GET_STATISTICS_EX_RES: { - union { - struct SMSHOSTLIB_STATISTICS_ISDBT_S isdbt; - struct SMSHOSTLIB_STATISTICS_DVB_S dvb; - } *p = (void *) (phdr + 1); - struct RECEPTION_STATISTICS_S *pReceptionData = - &client->reception_data; - + case MSG_SMS_GET_STATISTICS_RES: { + struct SMSHOSTLIB_STATISTICS_S *p_dvb_stats = (void *)(pMsgData+1); + struct RECEPTION_STATISTICS_S *pReceptionData = &client->reception_data; sms_info("MSG_SMS_GET_STATISTICS_RES"); - is_status_update = true; - - switch (smscore_get_device_mode(client->coredev)) { - case SMSHOSTLIB_DEVMD_DVBT: - case SMSHOSTLIB_DEVMD_DVBH: - case SMSHOSTLIB_DEVMD_DVBT_BDA: - smsdvb_update_dvb_stats(pReceptionData, &p->dvb); - break; - case SMSHOSTLIB_DEVMD_ISDBT: - case SMSHOSTLIB_DEVMD_ISDBT_BDA: - smsdvb_update_isdbt_stats(pReceptionData, &p->isdbt); - break; - default: - break; - } + smsdvb_update_dvb_stats(pReceptionData, p_dvb_stats); + complete(&client->get_stats_done); + break; + } + case MSG_SMS_GET_STATISTICS_EX_RES: { + struct SMSHOSTLIB_STATISTICS_ISDBT_S *p_isdbt_stats = (void *)pMsgData+1; + struct RECEPTION_STATISTICS_S *pReceptionData = &client->reception_data; + sms_info("MSG_SMS_GET_STATISTICS_EX_RES"); is_status_update = true; + smsdvb_update_isdbt_stats(pReceptionData, p_isdbt_stats); complete(&client->get_stats_done); break; } @@ -371,12 +373,10 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) client->fe_status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; sms_board_dvb3_event(client, DVB3_EVENT_FE_LOCK); - if (client->reception_data.ErrorTSPackets - == 0) + if (client->reception_data.ErrorTSPackets == 0) sms_board_dvb3_event(client, DVB3_EVENT_UNC_OK); else - sms_board_dvb3_event(client, - DVB3_EVENT_UNC_ERR); + sms_board_dvb3_event(client, DVB3_EVENT_UNC_ERR); } else { if (client->reception_data.IsRfLocked) @@ -478,9 +478,19 @@ static int smsdvb_get_statistics_ex(struct dvb_frontend *fe) { Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; Msg.msgDstId = HIF_TASK; Msg.msgFlags = 0; - Msg.msgType = MSG_SMS_GET_STATISTICS_EX_REQ; Msg.msgLength = sizeof(Msg); + if (smscore_get_device_mode(client->coredev) == SMSHOSTLIB_DEVMD_DVBT || + smscore_get_device_mode(client->coredev) == SMSHOSTLIB_DEVMD_DVBT_BDA || + smscore_get_device_mode(client->coredev) == SMSHOSTLIB_DEVMD_DVBH) + { + Msg.msgType = MSG_SMS_GET_STATISTICS_REQ; + } + else + { + Msg.msgType = MSG_SMS_GET_STATISTICS_EX_REQ; + } + smsendian_handle_tx_message((struct SmsMsgHdr_S *)&Msg); return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), &client->get_stats_done); @@ -601,7 +611,7 @@ static int smsdvb_dvbt_set_frontend(struct dvb_frontend *fe, struct SmsMsgData4Args_S Msg; int ret; - sms_info("setting DVB freq to %d", p->frequency); + sms_info("setting DVB freq to %d", c->frequency); client->fe_status = FE_HAS_SIGNAL; client->event_fe_state = -1; @@ -673,11 +683,11 @@ static int smsdvb_isdbt_set_frontend(struct dvb_frontend *fe, Msg.xMsgHeader.msgFlags = 0; Msg.xMsgHeader.msgType = MSG_SMS_ISDBT_TUNE_REQ; Msg.xMsgHeader.msgLength = sizeof(Msg); - Msg.msgData[0] = p->frequency; + Msg.msgData[0] = c->frequency; if (c->isdbt_sb_segment_idx == -1) c->isdbt_sb_segment_idx = 0; - sms_info("freq %d band %d", - p->frequency, p->u.ofdm.bandwidth); + sms_info("freq %d seg %d", + c->frequency, c->isdbt_sb_segment_count); switch (c->isdbt_sb_segment_count) { case 3: @@ -731,7 +741,6 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe, client->event_fe_state = -1; client->event_unc_state = -1; - switch (smscore_get_device_mode(client->coredev)) { case SMSHOSTLIB_DEVMD_DVBT: case SMSHOSTLIB_DEVMD_DVBT_BDA: @@ -905,6 +914,7 @@ static int smsdvb_hotplug(void *coredev, struct device *device, int arrival) client->coredev = coredev; init_completion(&client->tune_done); + init_completion(&client->get_stats_done); kmutex_lock(&g_smsdvb_clientslock); -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html