[PATCH 3/7] firedtv: nicer registration message and some initialization fixes
Stefan Richter
stefanr at s5r6.in-berlin.de
Sun Aug 24 21:27:45 UTC 2008
Print the correct name in dvb_register_adapter().
While we are at it, replace two switch cascades by one for loop, remove
a superfluous member of struct firesat and of two unused arguments of
AVCIdentifySubunit(), and fix bogus kfree's in firesat_dvbdev_init().
Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
---
drivers/media/dvb/firesat/avc_api.c | 5 -
drivers/media/dvb/firesat/avc_api.h | 2
drivers/media/dvb/firesat/firesat.h | 11 ++-
drivers/media/dvb/firesat/firesat_1394.c | 30 +++++-----
drivers/media/dvb/firesat/firesat_dvb.c | 68 ++++-------------------
drivers/media/dvb/firesat/firesat_fe.c | 8 --
6 files changed, 40 insertions(+), 84 deletions(-)
Index: linux/drivers/media/dvb/firesat/avc_api.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/avc_api.c
+++ linux/drivers/media/dvb/firesat/avc_api.c
@@ -718,7 +718,8 @@ int AVCTuner_GetTS(struct firesat *fires
return 0;
}
-int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *transport) {
+int AVCIdentifySubunit(struct firesat *firesat)
+{
AVCCmdFrm CmdFrm;
AVCRspFrm RspFrm;
@@ -752,8 +753,6 @@ int AVCIdentifySubunit(struct firesat *f
printk(KERN_ERR "%s: Invalid response length\n", __func__);
return -EINVAL;
}
- if(systemId)
- *systemId = RspFrm.operand[7];
return 0;
}
Index: linux/drivers/media/dvb/firesat/avc_api.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/avc_api.h
+++ linux/drivers/media/dvb/firesat/avc_api.h
@@ -423,7 +423,7 @@ extern int AVCTuner_DSD(struct firesat *
extern int AVCTuner_SetPIDs(struct firesat *firesat, unsigned char pidc, u16 pid[]);
extern int AVCTuner_GetTS(struct firesat *firesat);
-extern int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *transport);
+extern int AVCIdentifySubunit(struct firesat *firesat);
extern int AVCLNBControl(struct firesat *firesat, char voltage, char burst, char conttone, char nrdiseq, struct dvb_diseqc_master_cmd *diseqcmd);
extern int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount);
extern int AVCRegisterRemoteControl(struct firesat *firesat);
Index: linux/drivers/media/dvb/firesat/firesat.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat.h
+++ linux/drivers/media/dvb/firesat/firesat.h
@@ -116,15 +116,15 @@
enum model_type {
- FireSAT_DVB_S = 1,
- FireSAT_DVB_C = 2,
- FireSAT_DVB_T = 3,
- FireSAT_DVB_S2 = 4
+ FireSAT_UNKNOWN = 0,
+ FireSAT_DVB_S = 1,
+ FireSAT_DVB_C = 2,
+ FireSAT_DVB_T = 3,
+ FireSAT_DVB_S2 = 4,
};
struct firesat {
struct dvb_demux dvb_demux;
- char *model_name;
/* DVB bits */
struct dvb_adapter *adapter;
@@ -210,6 +210,7 @@ struct CIPHeader {
};
};
+extern const char *firedtv_model_names[];
extern struct list_head firesat_list;
extern spinlock_t firesat_list_lock;
Index: linux/drivers/media/dvb/firesat/firesat_1394.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat_1394.c
+++ linux/drivers/media/dvb/firesat/firesat_1394.c
@@ -156,6 +156,14 @@ static void fcp_request(struct hpsb_host
printk("%s: received invalid fcp request, ignored\n", __func__);
}
+const char *firedtv_model_names[] = {
+ [FireSAT_UNKNOWN] = "unknown type",
+ [FireSAT_DVB_S] = "FireDTV S/CI",
+ [FireSAT_DVB_C] = "FireDTV C/CI",
+ [FireSAT_DVB_T] = "FireDTV T/CI",
+ [FireSAT_DVB_S2] = "FireDTV S2 ",
+};
+
static int firesat_probe(struct device *dev)
{
struct unit_directory *ud = container_of(dev, struct unit_directory, device);
@@ -165,6 +173,7 @@ static int firesat_probe(struct device *
unsigned char subunitcount = 0xff, subunit;
struct firesat **firesats = kmalloc(sizeof (void*) * 2,GFP_KERNEL);
int kv_len;
+ int i;
char *kv_buf;
if (!firesats) {
@@ -244,23 +253,13 @@ static int firesat_probe(struct device *
while ((kv_buf + kv_len - 1) == '\0') kv_len--;
kv_buf[kv_len++] = '\0';
- /* Determining the device model */
- if (strcmp(kv_buf, "FireDTV S/CI") == 0) {
- printk(KERN_INFO "%s: found DVB/S\n", __func__);
- firesat->type = 1;
- } else if (strcmp(kv_buf, "FireDTV C/CI") == 0) {
- printk(KERN_INFO "%s: found DVB/C\n", __func__);
- firesat->type = 2;
- } else if (strcmp(kv_buf, "FireDTV T/CI") == 0) {
- printk(KERN_INFO "%s: found DVB/T\n", __func__);
- firesat->type = 3;
- } else if (strcmp(kv_buf, "FireDTV S2 ") == 0) {
- printk(KERN_INFO "%s: found DVB/S2\n", __func__);
- firesat->type = 4;
- }
+ for (i = ARRAY_SIZE(firedtv_model_names); --i;)
+ if (strcmp(kv_buf, firedtv_model_names[i]) == 0)
+ break;
+ firesat->type = i;
kfree(kv_buf);
- if (AVCIdentifySubunit(firesat, NULL, (int*)&firesat->type)) {
+ if (AVCIdentifySubunit(firesat)) {
printk("%s: cannot identify subunit %d\n", __func__, subunit);
spin_lock_irqsave(&firesat_list_lock, flags);
list_del(&firesat->list);
@@ -270,6 +269,7 @@ static int firesat_probe(struct device *
}
// ----
+ /* FIXME: check for error return */
firesat_dvbdev_init(firesat, dev, fe);
// ----
firesats[subunit] = firesat;
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
@@ -229,60 +229,20 @@ int firesat_dvbdev_init(struct firesat *
{
int result;
-#if 0
- switch (firesat->type) {
- case FireSAT_DVB_S:
- firesat->model_name = "FireSAT DVB-S";
- firesat->frontend_info = &firesat_S_frontend_info;
- break;
- case FireSAT_DVB_C:
- firesat->model_name = "FireSAT DVB-C";
- firesat->frontend_info = &firesat_C_frontend_info;
- break;
- case FireSAT_DVB_T:
- firesat->model_name = "FireSAT DVB-T";
- firesat->frontend_info = &firesat_T_frontend_info;
- break;
- default:
- printk("%s: unknown model type 0x%x on subunit %d!\n",
- __func__, firesat->type,subunit);
- firesat->model_name = "Unknown";
- firesat->frontend_info = NULL;
- }
-#endif
-/* // ------- CRAP -----------
- if (!firesat->frontend_info) {
- spin_lock_irqsave(&firesat_list_lock, flags);
- list_del(&firesat->list);
- spin_unlock_irqrestore(&firesat_list_lock, flags);
- kfree(firesat);
- continue;
- }
-*/
- //initialising firesat->adapter before calling dvb_register_adapter
- if (!(firesat->adapter = kmalloc(sizeof (struct dvb_adapter), GFP_KERNEL))) {
- printk("%s: couldn't allocate memory.\n", __func__);
- kfree(firesat->adapter);
- kfree(firesat);
- return -ENOMEM;
- }
-
- if ((result = DVB_REGISTER_ADAPTER(firesat->adapter,
- firesat->model_name,
- THIS_MODULE,
- dev, adapter_nr)) < 0) {
-
- printk("%s: dvb_register_adapter failed: error %d\n", __func__, result);
-#if 0
- /* ### cleanup */
- spin_lock_irqsave(&firesat_list_lock, flags);
- list_del(&firesat->list);
- spin_unlock_irqrestore(&firesat_list_lock, flags);
-#endif
- kfree(firesat);
-
- return result;
- }
+ firesat->adapter = kmalloc(sizeof(*firesat->adapter), GFP_KERNEL);
+ if (!firesat->adapter) {
+ printk(KERN_ERR "firedtv: couldn't allocate memory\n");
+ return -ENOMEM;
+ }
+
+ result = DVB_REGISTER_ADAPTER(firesat->adapter,
+ firedtv_model_names[firesat->type],
+ THIS_MODULE, dev, adapter_nr);
+ if (result < 0) {
+ printk(KERN_ERR "firedtv: dvb_register_adapter failed\n");
+ kfree(firesat->adapter);
+ return result;
+ }
memset(&firesat->demux, 0, sizeof(struct dvb_demux));
firesat->demux.dmx.capabilities = 0/*DMX_TS_FILTERING | DMX_SECTION_FILTERING*/;
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
@@ -209,21 +209,17 @@ int firesat_frontend_attach(struct fires
{
switch (firesat->type) {
case FireSAT_DVB_S:
- firesat->model_name = "FireSAT DVB-S";
firesat->frontend_info = &firesat_S_frontend_info;
break;
case FireSAT_DVB_C:
- firesat->model_name = "FireSAT DVB-C";
firesat->frontend_info = &firesat_C_frontend_info;
break;
case FireSAT_DVB_T:
- firesat->model_name = "FireSAT DVB-T";
firesat->frontend_info = &firesat_T_frontend_info;
break;
default:
- printk("%s: unknown model type 0x%x !\n",
- __func__, firesat->type);
- firesat->model_name = "Unknown";
+ printk(KERN_ERR "firedtv: no frontend for model type 0x%x\n",
+ firesat->type);
firesat->frontend_info = NULL;
}
fe->ops = firesat_ops;
--
Stefan Richter
-=====-==--- =--- ==---
http://arcgraph.de/sr/
More information about the devel
mailing list