From patchwork Mon Feb 20 11:50:33 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gianluca Gennari X-Patchwork-Id: 10006 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1RzRlw-0001TV-PB for patchwork@linuxtv.org; Mon, 20 Feb 2012 12:51:12 +0100 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-3) with esmtp for id 1RzRlv-00011o-FL; Mon, 20 Feb 2012 12:51:12 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753185Ab2BTLvJ (ORCPT ); Mon, 20 Feb 2012 06:51:09 -0500 Received: from mail-ey0-f174.google.com ([209.85.215.174]:54421 "EHLO mail-ey0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753075Ab2BTLvH (ORCPT ); Mon, 20 Feb 2012 06:51:07 -0500 Received: by eaah12 with SMTP id h12so2160610eaa.19 for ; Mon, 20 Feb 2012 03:51:05 -0800 (PST) Received-SPF: pass (google.com: domain of gennarone@gmail.com designates 10.14.183.195 as permitted sender) client-ip=10.14.183.195; Authentication-Results: mr.google.com; spf=pass (google.com: domain of gennarone@gmail.com designates 10.14.183.195 as permitted sender) smtp.mail=gennarone@gmail.com; dkim=pass header.i=gennarone@gmail.com Received: from mr.google.com ([10.14.183.195]) by 10.14.183.195 with SMTP id q43mr10488218eem.93.1329738665706 (num_hops = 1); Mon, 20 Feb 2012 03:51:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; bh=mEj8G/rTbLLgMbCg0fumXr2bL0Kp01sDdL1dnIm6M7k=; b=YuKiCye72kdS80q/XNSMJ0HMIevPbkzIUmg2oOKbSjGIcN74kK6jFhOPcJnIAvoTkI XoXw3opbo8gM719WNlHlz6QiBhzGghWX8GSizxHpQr03jB8EGLyciEN2NGQ5ztQEbsnt DMATpRWzDIYj3ULIRKQJpNt+AmDxnI9UhDpUo= Received: by 10.14.183.195 with SMTP id q43mr8337323eem.93.1329738665635; Mon, 20 Feb 2012 03:51:05 -0800 (PST) Received: from localhost.localdomain (93-50-34-119.ip150.fastwebnet.it. [93.50.34.119]) by mx.google.com with ESMTPS id y14sm47482569eef.10.2012.02.20.03.51.03 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 20 Feb 2012 03:51:04 -0800 (PST) From: Gianluca Gennari To: linux-media@vger.kernel.org, mchehab@redhat.com Cc: doronc@siano-ms.com, Gianluca Gennari , Panagiotis Malakoudis Subject: [PATCH] smsdvb: fix get_frontend Date: Mon, 20 Feb 2012 12:50:33 +0100 Message-Id: <1329738633-12177-1-git-send-email-gennarone@gmail.com> X-Mailer: git-send-email 1.7.0.4 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.2.20.113915 X-PMX-Spam: Gauge=IIIIIIIII, Probability=9%, Report=' FORGED_FROM_GMAIL 0.1, MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_4000_4999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __FRAUD_BODY_WEBMAIL 0, __FRAUD_WEBMAIL 0, __FRAUD_WEBMAIL_FROM 0, __FROM_GMAIL 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __PHISH_SPEAR_STRUCTURE_1 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' In the get_frontend function, an internal copy of the dtv_frontend_properties struct (which is never initialized) is copied over the frontend property cache data structure, resetting everything to 0. In particular, the delivery system is reset to 0 (which is an invalid value) so the driver stops working as soon as a DVBv3 application calls the get_frontend function, giving this error: dvb_frontend_ioctl_legacy: doesn't know how to handle a DVBv3 call to delivery system 0 This patch eliminates the unused internal copy of the dtv_frontend_properties struct, and gives a proper implementation of the get_frontend function. The original author of the patch is Panagiotis Malakoudis, who also tested this new version on Ubuntu 11.10 with the latest media_build tree installed. The original patch has been used on MIPS set-top-boxes for over one year, but it was never posted on the linux-media list. I ported the code to the current media_build tree (converting it to use the dtv_frontend_properties struct) and added basic support for ISDB-T (untested). Signed-off-by: Panagiotis Malakoudis Signed-off-by: Gianluca Gennari --- drivers/media/dvb/siano/smsdvb.c | 123 +++++++++++++++++++++++++++++++++++-- 1 files changed, 116 insertions(+), 7 deletions(-) diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index 654685c..091796a 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c @@ -49,9 +49,6 @@ struct smsdvb_client_t { struct completion tune_done; - /* todo: save freq/band instead whole struct */ - struct dtv_frontend_properties fe_params; - struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb; int event_fe_state; int event_unc_state; @@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe) struct dtv_frontend_properties *fep = &fe->dtv_property_cache; struct smsdvb_client_t *client = container_of(fe, struct smsdvb_client_t, frontend); + struct smscore_device_t *coredev = client->coredev; + struct TRANSMISSION_STATISTICS_S *td = + &client->sms_stat_dvb.TransmissionData; - sms_debug(""); + switch (smscore_get_device_mode(coredev)) { + case DEVICE_MODE_DVBT: + case DEVICE_MODE_DVBT_BDA: + fep->frequency = td->Frequency; + + switch (td->Bandwidth) { + case 6: + fep->bandwidth_hz = 6000000; + break; + case 7: + fep->bandwidth_hz = 7000000; + break; + case 8: + fep->bandwidth_hz = 8000000; + break; + } + + switch (td->TransmissionMode) { + case 2: + fep->transmission_mode = TRANSMISSION_MODE_2K; + break; + case 8: + fep->transmission_mode = TRANSMISSION_MODE_8K; + } + + switch (td->GuardInterval) { + case 0: + fep->guard_interval = GUARD_INTERVAL_1_32; + break; + case 1: + fep->guard_interval = GUARD_INTERVAL_1_16; + break; + case 2: + fep->guard_interval = GUARD_INTERVAL_1_8; + break; + case 3: + fep->guard_interval = GUARD_INTERVAL_1_4; + break; + } + + switch (td->CodeRate) { + case 0: + fep->code_rate_HP = FEC_1_2; + break; + case 1: + fep->code_rate_HP = FEC_2_3; + break; + case 2: + fep->code_rate_HP = FEC_3_4; + break; + case 3: + fep->code_rate_HP = FEC_5_6; + break; + case 4: + fep->code_rate_HP = FEC_7_8; + break; + } + + switch (td->LPCodeRate) { + case 0: + fep->code_rate_LP = FEC_1_2; + break; + case 1: + fep->code_rate_LP = FEC_2_3; + break; + case 2: + fep->code_rate_LP = FEC_3_4; + break; + case 3: + fep->code_rate_LP = FEC_5_6; + break; + case 4: + fep->code_rate_LP = FEC_7_8; + break; + } + + switch (td->Constellation) { + case 0: + fep->modulation = QPSK; + break; + case 1: + fep->modulation = QAM_16; + break; + case 2: + fep->modulation = QAM_64; + break; + } + + switch (td->Hierarchy) { + case 0: + fep->hierarchy = HIERARCHY_NONE; + break; + case 1: + fep->hierarchy = HIERARCHY_1; + break; + case 2: + fep->hierarchy = HIERARCHY_2; + break; + case 3: + fep->hierarchy = HIERARCHY_4; + break; + } - /* todo: */ - memcpy(fep, &client->fe_params, - sizeof(struct dtv_frontend_properties)); + fep->inversion = INVERSION_AUTO; + break; + case DEVICE_MODE_ISDBT: + case DEVICE_MODE_ISDBT_BDA: + fep->frequency = td->Frequency; + fep->bandwidth_hz = 6000000; + /* todo: retrive the other parameters */ + break; + default: + return -EINVAL; + } return 0; }