[patch 07/10] firedtv: fix initialization of dvb_frontend.ops
Stefan Richter
stefanr at s5r6.in-berlin.de
Mon Sep 29 17:20:36 UTC 2008
There was a NULL pointer reference if no dvb_frontend_info was found.
Also, don't directly assign struct typed values to struct typed
variables. Instead write out assignments to individual strcut members.
This reduces module size by about 1 kB.
Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
---
drivers/media/dvb/firesat/firesat.h | 34 ++--
drivers/media/dvb/firesat/firesat_dvb.c | 3
drivers/media/dvb/firesat/firesat_fe.c | 167 ++++++++++--------------
3 files changed, 91 insertions(+), 113 deletions(-)
Index: linux/drivers/media/dvb/firesat/firesat.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat.h
+++ linux/drivers/media/dvb/firesat/firesat.h
@@ -132,25 +132,21 @@ struct hpsb_iso;
struct unit_directory;
struct firesat {
- struct dvb_demux dvb_demux;
-
- /* DVB bits */
- struct dvb_adapter adapter;
- struct dmxdev dmxdev;
- struct dvb_demux demux;
- struct dmx_frontend frontend;
- struct dvb_net dvbnet;
- struct dvb_frontend_info *frontend_info;
- struct dvb_frontend fe;
-
- struct dvb_device *cadev;
- int ca_last_command;
- int ca_time_interval;
-
- struct mutex avc_mutex;
- wait_queue_head_t avc_wait;
- bool avc_reply_received;
- struct work_struct remote_ctrl_work;
+ struct dvb_adapter adapter;
+ struct dmxdev dmxdev;
+ struct dvb_demux demux;
+ struct dmx_frontend frontend;
+ struct dvb_net dvbnet;
+ struct dvb_frontend fe;
+
+ struct dvb_device *cadev;
+ int ca_last_command;
+ int ca_time_interval;
+
+ struct mutex avc_mutex;
+ wait_queue_head_t avc_wait;
+ bool avc_reply_received;
+ struct work_struct remote_ctrl_work;
struct firesat_channel {
struct firesat *firesat;
Index: linux/drivers/media/dvb/firesat/firesat_fe.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat_fe.c
+++ linux/drivers/media/dvb/firesat/firesat_fe.c
@@ -12,6 +12,7 @@
#include <linux/errno.h>
#include <linux/kernel.h>
+#include <linux/string.h>
#include <linux/types.h>
#include <dvb_frontend.h>
@@ -22,17 +23,18 @@
static int firesat_dvb_init(struct dvb_frontend *fe)
{
- int result;
struct firesat *firesat = fe->sec_priv;
+ int err;
/* FIXME - allocate free channel at IRM */
firesat->isochannel = firesat->adapter.num;
- result = try_CMPEstablishPPconnection(firesat, firesat->subunit, firesat->isochannel);
- if (result != 0) {
+ err = try_CMPEstablishPPconnection(firesat, firesat->subunit,
+ firesat->isochannel);
+ if (err) {
printk(KERN_ERR "Could not establish point to point "
"connection.\n");
- return -1;
+ return err;
}
return setup_iso_channel(firesat);
@@ -168,105 +170,86 @@ static int firesat_get_frontend(struct d
return -EOPNOTSUPP;
}
-static struct dvb_frontend_info firesat_S_frontend_info;
-static struct dvb_frontend_info firesat_C_frontend_info;
-static struct dvb_frontend_info firesat_T_frontend_info;
-
-static struct dvb_frontend_ops firesat_ops = {
-
- .init = firesat_dvb_init,
- .sleep = firesat_sleep,
-
- .set_frontend = firesat_set_frontend,
- .get_frontend = firesat_get_frontend,
-
- .read_status = firesat_read_status,
- .read_ber = firesat_read_ber,
- .read_signal_strength = firesat_read_signal_strength,
- .read_snr = firesat_read_snr,
- .read_ucblocks = firesat_read_uncorrected_blocks,
-
- .diseqc_send_master_cmd = firesat_diseqc_send_master_cmd,
- .diseqc_send_burst = firesat_diseqc_send_burst,
- .set_tone = firesat_set_tone,
- .set_voltage = firesat_set_voltage,
-};
-
void firesat_frontend_init(struct firesat *firesat)
{
+ struct dvb_frontend_ops *ops = &firesat->fe.ops;
+ struct dvb_frontend_info *fi = &ops->info;
+
+ ops->init = firesat_dvb_init;
+ ops->sleep = firesat_sleep;
+
+ ops->set_frontend = firesat_set_frontend;
+ ops->get_frontend = firesat_get_frontend;
+
+ ops->read_status = firesat_read_status;
+ ops->read_ber = firesat_read_ber;
+ ops->read_signal_strength = firesat_read_signal_strength;
+ ops->read_snr = firesat_read_snr;
+ ops->read_ucblocks = firesat_read_uncorrected_blocks;
+
+ ops->diseqc_send_master_cmd = firesat_diseqc_send_master_cmd;
+ ops->diseqc_send_burst = firesat_diseqc_send_burst;
+ ops->set_tone = firesat_set_tone;
+ ops->set_voltage = firesat_set_voltage;
+
switch (firesat->type) {
case FireSAT_DVB_S:
- firesat->frontend_info = &firesat_S_frontend_info;
+ fi->type = FE_QPSK;
+
+ fi->frequency_min = 950000;
+ fi->frequency_max = 2150000;
+ fi->frequency_stepsize = 125;
+ fi->symbol_rate_min = 1000000;
+ fi->symbol_rate_max = 40000000;
+
+ fi->caps = FE_CAN_INVERSION_AUTO |
+ FE_CAN_FEC_1_2 |
+ FE_CAN_FEC_2_3 |
+ FE_CAN_FEC_3_4 |
+ FE_CAN_FEC_5_6 |
+ FE_CAN_FEC_7_8 |
+ FE_CAN_FEC_AUTO |
+ FE_CAN_QPSK;
break;
+
case FireSAT_DVB_C:
- firesat->frontend_info = &firesat_C_frontend_info;
+ fi->type = FE_QAM;
+
+ fi->frequency_min = 47000000;
+ fi->frequency_max = 866000000;
+ fi->frequency_stepsize = 62500;
+ fi->symbol_rate_min = 870000;
+ fi->symbol_rate_max = 6900000;
+
+ fi->caps = FE_CAN_INVERSION_AUTO |
+ FE_CAN_QAM_16 |
+ FE_CAN_QAM_32 |
+ FE_CAN_QAM_64 |
+ FE_CAN_QAM_128 |
+ FE_CAN_QAM_256 |
+ FE_CAN_QAM_AUTO;
break;
+
case FireSAT_DVB_T:
- firesat->frontend_info = &firesat_T_frontend_info;
+ fi->type = FE_OFDM;
+
+ fi->frequency_min = 49000000;
+ fi->frequency_max = 861000000;
+ fi->frequency_stepsize = 62500;
+
+ fi->caps = FE_CAN_INVERSION_AUTO |
+ FE_CAN_FEC_2_3 |
+ FE_CAN_TRANSMISSION_MODE_AUTO |
+ FE_CAN_GUARD_INTERVAL_AUTO |
+ FE_CAN_HIERARCHY_AUTO;
break;
+
default:
- printk(KERN_ERR "firedtv: no frontend for model type 0x%x\n",
+ printk(KERN_ERR "FireDTV: no frontend for model type %d\n",
firesat->type);
- firesat->frontend_info = NULL;
}
- firesat->fe.ops = firesat_ops;
- firesat->fe.ops.info = *(firesat->frontend_info);
+ strcpy(fi->name, firedtv_model_names[firesat->type]);
+
firesat->fe.dvb = &firesat->adapter;
+ firesat->fe.sec_priv = firesat;
}
-
-static struct dvb_frontend_info firesat_S_frontend_info = {
-
- .name = "FireDTV DVB-S Frontend",
- .type = FE_QPSK,
-
- .frequency_min = 950000,
- .frequency_max = 2150000,
- .frequency_stepsize = 125,
- .symbol_rate_min = 1000000,
- .symbol_rate_max = 40000000,
-
- .caps = FE_CAN_INVERSION_AUTO |
- FE_CAN_FEC_1_2 |
- FE_CAN_FEC_2_3 |
- FE_CAN_FEC_3_4 |
- FE_CAN_FEC_5_6 |
- FE_CAN_FEC_7_8 |
- FE_CAN_FEC_AUTO |
- FE_CAN_QPSK,
-};
-
-static struct dvb_frontend_info firesat_C_frontend_info = {
-
- .name = "FireDTV DVB-C Frontend",
- .type = FE_QAM,
-
- .frequency_min = 47000000,
- .frequency_max = 866000000,
- .frequency_stepsize = 62500,
- .symbol_rate_min = 870000,
- .symbol_rate_max = 6900000,
-
- .caps = FE_CAN_INVERSION_AUTO |
- FE_CAN_QAM_16 |
- FE_CAN_QAM_32 |
- FE_CAN_QAM_64 |
- FE_CAN_QAM_128 |
- FE_CAN_QAM_256 |
- FE_CAN_QAM_AUTO,
-};
-
-static struct dvb_frontend_info firesat_T_frontend_info = {
-
- .name = "FireDTV DVB-T Frontend",
- .type = FE_OFDM,
-
- .frequency_min = 49000000,
- .frequency_max = 861000000,
- .frequency_stepsize = 62500,
-
- .caps = FE_CAN_INVERSION_AUTO |
- FE_CAN_FEC_2_3 |
- FE_CAN_TRANSMISSION_MODE_AUTO |
- FE_CAN_GUARD_INTERVAL_AUTO |
- FE_CAN_HIERARCHY_AUTO,
-};
Index: linux/drivers/media/dvb/firesat/firesat_dvb.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat_dvb.c
+++ linux/drivers/media/dvb/firesat/firesat_dvb.c
@@ -251,9 +251,8 @@ int firesat_dvbdev_init(struct firesat *
goto fail_rem_frontend;
dvb_net_init(&firesat->adapter, &firesat->dvbnet, &firesat->demux.dmx);
- firesat_frontend_init(firesat);
- firesat->fe.sec_priv = firesat;
+ firesat_frontend_init(firesat);
err = dvb_register_frontend(&firesat->adapter, &firesat->fe);
if (err)
goto fail_net_release;
--
Stefan Richter
-=====-==--- =--= ===-=
http://arcgraph.de/sr/
More information about the devel
mailing list