[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