[patch 06/10] firedtv: remove unused dual subunit code from initialization

Stefan Richter stefanr at s5r6.in-berlin.de
Mon Sep 29 17:19:41 UTC 2008


No FireDTVs with more than one subunit exists, hence simplify the
initialization for the special case of one subunit.  The driver was able
to check for more than one subunit but was broken for more than two
subunits.

While we are at it, add several missing cleanups after failure, and
include a few dynamically allocated structures diretly into struct
firesat instead of allocating them separately.

Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
---
 drivers/media/dvb/firesat/avc_api.c      |   36 ---
 drivers/media/dvb/firesat/avc_api.h      |    1 
 drivers/media/dvb/firesat/firesat-ci.c   |   15 -
 drivers/media/dvb/firesat/firesat-ci.h   |    2 
 drivers/media/dvb/firesat/firesat.h      |   18 -
 drivers/media/dvb/firesat/firesat_1394.c |  214 ++++++++---------------
 drivers/media/dvb/firesat/firesat_dvb.c  |  166 +++++++----------
 drivers/media/dvb/firesat/firesat_fe.c   |   22 --
 8 files changed, 171 insertions(+), 303 deletions(-)

Index: linux/drivers/media/dvb/firesat/firesat.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat.h
+++ linux/drivers/media/dvb/firesat/firesat.h
@@ -25,6 +25,7 @@
 #include <demux.h>
 #include <dmxdev.h>
 #include <dvb_demux.h>
+#include <dvb_frontend.h>
 #include <dvb_net.h>
 #include <dvbdev.h>
 
@@ -134,13 +135,13 @@ struct firesat {
 	struct dvb_demux dvb_demux;
 
 	/* DVB bits */
-	struct dvb_adapter		*adapter;
+	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_frontend		fe;
 
 	struct dvb_device		*cadev;
 	int				ca_last_command;
@@ -162,10 +163,6 @@ struct firesat {
 	} channel[16];
 	struct mutex			demux_mutex;
 
-	/* needed by avc_api */
-	void *respfrm;
-	int resp_length;
-
 	struct unit_directory *ud;
 
 	enum model_type type;
@@ -177,6 +174,10 @@ struct firesat {
 	struct hpsb_iso *iso_handle;
 
 	struct list_head list;
+
+	/* needed by avc_api */
+	int resp_length;
+	u8 respfrm[512];
 };
 
 struct firewireheader {
@@ -222,11 +223,10 @@ struct device;
 /* firesat_dvb.c */
 int firesat_start_feed(struct dvb_demux_feed *dvbdmxfeed);
 int firesat_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
-int firesat_dvbdev_init(struct firesat *firesat, struct device *dev,
-		struct dvb_frontend *fe);
+int firesat_dvbdev_init(struct firesat *firesat, struct device *dev);
 
 /* firesat_fe.c */
-int firesat_frontend_attach(struct firesat *firesat, struct dvb_frontend *fe);
+void firesat_frontend_init(struct firesat *firesat);
 
 /* firesat_iso.c */
 int setup_iso_channel(struct firesat *firesat);
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
@@ -141,168 +141,106 @@ const char *firedtv_model_names[] = {
 
 static int firesat_probe(struct device *dev)
 {
-	struct unit_directory *ud = container_of(dev, struct unit_directory, device);
+	struct unit_directory *ud =
+			container_of(dev, struct unit_directory, device);
 	struct firesat *firesat;
-	struct dvb_frontend *fe;
 	unsigned long flags;
-	unsigned char subunitcount = 0xff, subunit;
-	struct firesat **firesats = kmalloc(sizeof (void*) * 2,GFP_KERNEL);
 	int kv_len;
 	int i;
 	char *kv_buf;
+	int err = -ENOMEM;
 
-	if (!firesats) {
-		printk("%s: couldn't allocate memory.\n", __func__);
+	firesat = kzalloc(sizeof(*firesat), GFP_KERNEL);
+	if (!firesat)
 		return -ENOMEM;
-	}
-
-//    printk(KERN_INFO "FireSAT: Detected device with GUID %08lx%04lx%04lx\n",(unsigned long)((ud->ne->guid)>>32),(unsigned long)(ud->ne->guid & 0xFFFF),(unsigned long)ud->ne->guid_vendor_id);
-	printk(KERN_INFO "%s: loading device\n", __func__);
-
-	firesats[0] = NULL;
-	firesats[1] = NULL;
 
-	ud->device.driver_data = firesats;
+	dev->driver_data = firesat;
+	firesat->ud		= ud;
+	firesat->subunit	= 0;
+	firesat->isochannel	= -1;
+	firesat->tone		= 0xff;
+	firesat->voltage	= 0xff;
+
+	mutex_init(&firesat->avc_mutex);
+	init_waitqueue_head(&firesat->avc_wait);
+	firesat->avc_reply_received = true;
+	mutex_init(&firesat->demux_mutex);
+	INIT_WORK(&firesat->remote_ctrl_work, avc_remote_ctrl_work);
+
+	/* Reading device model from ROM */
+	kv_len = (ud->model_name_kv->value.leaf.len - 2) * sizeof(quadlet_t);
+	kv_buf = kmalloc((sizeof(quadlet_t) * kv_len), GFP_KERNEL);
+	if (!kv_buf)
+		goto fail_free;
+	memcpy(kv_buf, CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv),
+	       kv_len);
+	while ((kv_buf + kv_len - 1) == '\0')
+		kv_len--;
+	kv_buf[kv_len++] = '\0';
+
+	for (i = ARRAY_SIZE(firedtv_model_names); --i;)
+		if (strcmp(kv_buf, firedtv_model_names[i]) == 0)
+			break;
+	firesat->type = i;
+	kfree(kv_buf);
+
+	INIT_LIST_HEAD(&firesat->list);
+	spin_lock_irqsave(&firesat_list_lock, flags);
+	list_add_tail(&firesat->list, &firesat_list);
+	spin_unlock_irqrestore(&firesat_list_lock, flags);
+
+	err = AVCIdentifySubunit(firesat);
+	if (err)
+		goto fail_unlist;
+
+	err = firesat_dvbdev_init(firesat, dev);
+	if (err)
+		goto fail_unlist;
 
-	for (subunit = 0; subunit < subunitcount; subunit++) {
-
-		if (!(firesat = kmalloc(sizeof (struct firesat), GFP_KERNEL)) ||
-		    !(fe = kmalloc(sizeof (struct dvb_frontend), GFP_KERNEL))) {
-
-			printk("%s: couldn't allocate memory.\n", __func__);
-			kfree(firesats);
-			return -ENOMEM;
-		}
-
-		memset(firesat, 0, sizeof (struct firesat));
-
-		firesat->ud		= ud;
-		firesat->isochannel	= -1;
-		firesat->tone		= 0xff;
-		firesat->voltage	= 0xff;
-		firesat->fe             = fe;
-
-		if (!(firesat->respfrm = kmalloc(sizeof (AVCRspFrm), GFP_KERNEL))) {
-			printk("%s: couldn't allocate memory.\n", __func__);
-			kfree(firesat);
-			return -ENOMEM;
-		}
-
-		mutex_init(&firesat->avc_mutex);
-		init_waitqueue_head(&firesat->avc_wait);
-		firesat->avc_reply_received = true;
-		mutex_init(&firesat->demux_mutex);
-		INIT_WORK(&firesat->remote_ctrl_work, avc_remote_ctrl_work);
-
-		spin_lock_irqsave(&firesat_list_lock, flags);
-		INIT_LIST_HEAD(&firesat->list);
-		list_add_tail(&firesat->list, &firesat_list);
-		spin_unlock_irqrestore(&firesat_list_lock, flags);
-
-		if (subunit == 0) {
-			firesat->subunit = 0x7; // 0x7 = don't care
-			if (AVCSubUnitInfo(firesat, &subunitcount)) {
-				printk("%s: AVC subunit info command failed.\n",__func__);
-				spin_lock_irqsave(&firesat_list_lock, flags);
-				list_del(&firesat->list);
-				spin_unlock_irqrestore(&firesat_list_lock, flags);
-				kfree(firesat);
-				return -EIO;
-			}
-		}
-
-		printk(KERN_INFO "%s: subunit count = %d\n", __func__, subunitcount);
-
-		firesat->subunit = subunit;
-
-		/* Reading device model from ROM */
-		kv_len = (ud->model_name_kv->value.leaf.len - 2) *
-			sizeof(quadlet_t);
-		kv_buf = kmalloc((sizeof(quadlet_t) * kv_len), GFP_KERNEL);
-		memcpy(kv_buf,
-			CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv),
-			kv_len);
-		while ((kv_buf + kv_len - 1) == '\0') kv_len--;
-		kv_buf[kv_len++] = '\0';
-
-		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)) {
-			printk("%s: cannot identify subunit %d\n", __func__, subunit);
-			spin_lock_irqsave(&firesat_list_lock, flags);
-			list_del(&firesat->list);
-			spin_unlock_irqrestore(&firesat_list_lock, flags);
-			kfree(firesat);
-			continue;
-		}
-
-// ----
-		/* FIXME: check for error return */
-		firesat_dvbdev_init(firesat, dev, fe);
-// ----
-		firesats[subunit] = firesat;
-	} // loop for all tuners
-
-	if (firesats[0])
-		AVCRegisterRemoteControl(firesats[0]);
+	AVCRegisterRemoteControl(firesat);
+	return 0;
 
-    return 0;
+fail_unlist:
+	spin_lock_irqsave(&firesat_list_lock, flags);
+	list_del(&firesat->list);
+	spin_unlock_irqrestore(&firesat_list_lock, flags);
+fail_free:
+	kfree(firesat);
+	return err;
 }
 
 static int firesat_remove(struct device *dev)
 {
-	struct unit_directory *ud = container_of(dev, struct unit_directory, device);
-	struct firesat **firesats = ud->device.driver_data;
-	int k;
+	struct firesat *firesat = dev->driver_data;
 	unsigned long flags;
 
-	if (firesats) {
-		for (k = 0; k < 2; k++)
-			if (firesats[k]) {
-					firesat_ca_release(firesats[k]);
-
-				dvb_unregister_frontend(firesats[k]->fe);
-				dvb_net_release(&firesats[k]->dvbnet);
-				firesats[k]->demux.dmx.close(&firesats[k]->demux.dmx);
-				firesats[k]->demux.dmx.remove_frontend(&firesats[k]->demux.dmx, &firesats[k]->frontend);
-				dvb_dmxdev_release(&firesats[k]->dmxdev);
-				dvb_dmx_release(&firesats[k]->demux);
-				dvb_unregister_adapter(firesats[k]->adapter);
-
-				spin_lock_irqsave(&firesat_list_lock, flags);
-				list_del(&firesats[k]->list);
-				spin_unlock_irqrestore(&firesat_list_lock, flags);
-
-				cancel_work_sync(&firesats[k]->remote_ctrl_work);
-
-				kfree(firesats[k]->fe);
-				kfree(firesats[k]->adapter);
-				kfree(firesats[k]->respfrm);
-				kfree(firesats[k]);
-			}
-		kfree(firesats);
-	} else
-		printk("%s: can't get firesat handle\n", __func__);
+	firesat_ca_release(firesat);
+	dvb_unregister_frontend(&firesat->fe);
+	dvb_net_release(&firesat->dvbnet);
+	firesat->demux.dmx.close(&firesat->demux.dmx);
+	firesat->demux.dmx.remove_frontend(&firesat->demux.dmx,
+					   &firesat->frontend);
+	dvb_dmxdev_release(&firesat->dmxdev);
+	dvb_dmx_release(&firesat->demux);
+	dvb_unregister_adapter(&firesat->adapter);
+
+	spin_lock_irqsave(&firesat_list_lock, flags);
+	list_del(&firesat->list);
+	spin_unlock_irqrestore(&firesat_list_lock, flags);
 
-	printk(KERN_INFO "FireSAT: Removing device with vendor id 0x%x, model id 0x%x.\n",ud->vendor_id,ud->model_id);
+	cancel_work_sync(&firesat->remote_ctrl_work);
 
+	kfree(firesat);
 	return 0;
 }
 
 static int firesat_update(struct unit_directory *ud)
 {
-	struct firesat **firesats = ud->device.driver_data;
-	int k;
+	struct firesat *firesat = ud->device.driver_data;
 
-	for (k = 0; k < 2; k++)
-		if (firesats[k] && firesats[k]->isochannel >= 0)
-			try_CMPEstablishPPconnection(firesats[k],
-						     firesats[k]->subunit,
-						     firesats[k]->isochannel);
+	if (firesat->isochannel >= 0)
+		try_CMPEstablishPPconnection(firesat, firesat->subunit,
+					     firesat->isochannel);
 	return 0;
 }
 
Index: linux/drivers/media/dvb/firesat/firesat-ci.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat-ci.c
+++ linux/drivers/media/dvb/firesat/firesat-ci.c
@@ -324,19 +324,17 @@ static struct dvb_device firesat_ca = {
 	.kernel_ioctl = firesat_ca_ioctl,
 };
 
-int firesat_ca_init(struct firesat *firesat)
+int firesat_ca_register(struct firesat *firesat)
 {
-	int err;
+	int err = -EFAULT;
 	ANTENNA_INPUT_INFO info;
 
 	if (AVCTunerStatus(firesat, &info))
 		return -EINVAL;
 
 	if (firesat_ca_ready(&info)) {
-		err = dvb_register_device(firesat->adapter,
-					      &firesat->cadev,
-					      &firesat_ca, firesat,
-					      DVB_DEVICE_CA);
+		err = dvb_register_device(&firesat->adapter, &firesat->cadev,
+					  &firesat_ca, firesat, DVB_DEVICE_CA);
 
 		if (info.CaApplicationInfo == 0)
 			printk(KERN_ERR "%s: CaApplicationInfo is not set.\n",
@@ -344,14 +342,11 @@ int firesat_ca_init(struct firesat *fire
 		if (info.CaDateTimeRequest == 1)
 			firesat_get_date_time_request(firesat);
 	}
-	else
-		err = -EFAULT;
-
 	return err;
 }
 
 void firesat_ca_release(struct firesat *firesat)
 {
 	if (firesat->cadev)
-	dvb_unregister_device(firesat->cadev);
+		dvb_unregister_device(firesat->cadev);
 }
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
@@ -206,103 +206,79 @@ int firesat_stop_feed(struct dvb_demux_f
 	return k;
 }
 
-int firesat_dvbdev_init(struct firesat *firesat,
-			struct device *dev,
-			struct dvb_frontend *fe)
+int firesat_dvbdev_init(struct firesat *firesat, struct device *dev)
 {
-	int result;
+	int err;
 
-	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*/;
-
-		firesat->demux.priv		= (void *)firesat;
-		firesat->demux.filternum	= 16;
-		firesat->demux.feednum		= 16;
-		firesat->demux.start_feed	= firesat_start_feed;
-		firesat->demux.stop_feed	= firesat_stop_feed;
-		firesat->demux.write_to_decoder	= NULL;
-
-		if ((result = dvb_dmx_init(&firesat->demux)) < 0) {
-			printk("%s: dvb_dmx_init failed: error %d\n", __func__,
-				   result);
-
-			dvb_unregister_adapter(firesat->adapter);
-
-			return result;
-		}
-
-		firesat->dmxdev.filternum	= 16;
-		firesat->dmxdev.demux		= &firesat->demux.dmx;
-		firesat->dmxdev.capabilities	= 0;
-
-		if ((result = dvb_dmxdev_init(&firesat->dmxdev, firesat->adapter)) < 0) {
-			printk("%s: dvb_dmxdev_init failed: error %d\n",
-				   __func__, result);
-
-			dvb_dmx_release(&firesat->demux);
-			dvb_unregister_adapter(firesat->adapter);
-
-			return result;
-		}
-
-		firesat->frontend.source = DMX_FRONTEND_0;
-
-		if ((result = firesat->demux.dmx.add_frontend(&firesat->demux.dmx,
-							  &firesat->frontend)) < 0) {
-			printk("%s: dvb_dmx_init failed: error %d\n", __func__,
-				   result);
-
-			dvb_dmxdev_release(&firesat->dmxdev);
-			dvb_dmx_release(&firesat->demux);
-			dvb_unregister_adapter(firesat->adapter);
-
-			return result;
-		}
-
-		if ((result = firesat->demux.dmx.connect_frontend(&firesat->demux.dmx,
-								  &firesat->frontend)) < 0) {
-			printk("%s: dvb_dmx_init failed: error %d\n", __func__,
-				   result);
-
-			firesat->demux.dmx.remove_frontend(&firesat->demux.dmx, &firesat->frontend);
-			dvb_dmxdev_release(&firesat->dmxdev);
-			dvb_dmx_release(&firesat->demux);
-			dvb_unregister_adapter(firesat->adapter);
-
-			return result;
-		}
-
-		dvb_net_init(firesat->adapter, &firesat->dvbnet, &firesat->demux.dmx);
-
-//		fe->ops = firesat_ops;
-//		fe->dvb = firesat->adapter;
-		firesat_frontend_attach(firesat, fe);
-
-		fe->sec_priv = firesat; //IMPORTANT, functions depend on this!!!
-		if ((result= dvb_register_frontend(firesat->adapter, fe)) < 0) {
-			printk("%s: dvb_register_frontend_new failed: error %d\n", __func__, result);
-			/* ### cleanup */
-			return result;
-		}
-
-			firesat_ca_init(firesat);
-
-		return 0;
+	err = DVB_REGISTER_ADAPTER(&firesat->adapter,
+				   firedtv_model_names[firesat->type],
+				   THIS_MODULE, dev, adapter_nr);
+	if (err)
+		goto fail_log;
+
+	/*DMX_TS_FILTERING | DMX_SECTION_FILTERING*/
+	firesat->demux.dmx.capabilities = 0;
+
+	firesat->demux.priv		= (void *)firesat;
+	firesat->demux.filternum	= 16;
+	firesat->demux.feednum		= 16;
+	firesat->demux.start_feed	= firesat_start_feed;
+	firesat->demux.stop_feed	= firesat_stop_feed;
+	firesat->demux.write_to_decoder	= NULL;
+
+	err = dvb_dmx_init(&firesat->demux);
+	if (err)
+		goto fail_unreg_adapter;
+
+	firesat->dmxdev.filternum	= 16;
+	firesat->dmxdev.demux		= &firesat->demux.dmx;
+	firesat->dmxdev.capabilities	= 0;
+
+	err = dvb_dmxdev_init(&firesat->dmxdev, &firesat->adapter);
+	if (err)
+		goto fail_dmx_release;
+
+	firesat->frontend.source = DMX_FRONTEND_0;
+
+	err = firesat->demux.dmx.add_frontend(&firesat->demux.dmx,
+					      &firesat->frontend);
+	if (err)
+		goto fail_dmxdev_release;
+
+	err = firesat->demux.dmx.connect_frontend(&firesat->demux.dmx,
+						  &firesat->frontend);
+	if (err)
+		goto fail_rem_frontend;
+
+	dvb_net_init(&firesat->adapter, &firesat->dvbnet, &firesat->demux.dmx);
+	firesat_frontend_init(firesat);
+
+	firesat->fe.sec_priv = firesat;
+	err = dvb_register_frontend(&firesat->adapter, &firesat->fe);
+	if (err)
+		goto fail_net_release;
+
+	err = firesat_ca_register(firesat);
+	if (err)
+		dev_info(dev, "Conditional Access Module not enabled\n");
+
+	return 0;
+
+fail_net_release:
+	dvb_net_release(&firesat->dvbnet);
+	firesat->demux.dmx.close(&firesat->demux.dmx);
+fail_rem_frontend:
+	firesat->demux.dmx.remove_frontend(&firesat->demux.dmx,
+					   &firesat->frontend);
+fail_dmxdev_release:
+	dvb_dmxdev_release(&firesat->dmxdev);
+fail_dmx_release:
+	dvb_dmx_release(&firesat->demux);
+fail_unreg_adapter:
+	dvb_unregister_adapter(&firesat->adapter);
+fail_log:
+	dev_err(dev, "DVB initialization failed\n");
+	return err;
 }
 
 
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
@@ -24,20 +24,18 @@ static int firesat_dvb_init(struct dvb_f
 {
 	int result;
 	struct firesat *firesat = fe->sec_priv;
-//	printk("fdi: 1\n");
-	firesat->isochannel = firesat->adapter->num; //<< 1 | (firesat->subunit & 0x1); // ### ask IRM
-//	printk("fdi: 2\n");
+
+	/* FIXME - allocate free channel at IRM */
+	firesat->isochannel = firesat->adapter.num;
+
 	result = try_CMPEstablishPPconnection(firesat, firesat->subunit, firesat->isochannel);
 	if (result != 0) {
 		printk(KERN_ERR "Could not establish point to point "
 		       "connection.\n");
 		return -1;
 	}
-//	printk("fdi: 3\n");
 
-	result = setup_iso_channel(firesat);
-//	printk("fdi: 4. Result was %d\n", result);
-	return result;
+	return setup_iso_channel(firesat);
 }
 
 static int firesat_sleep(struct dvb_frontend *fe)
@@ -194,7 +192,7 @@ static struct dvb_frontend_ops firesat_o
 	.set_voltage			= firesat_set_voltage,
 };
 
-int firesat_frontend_attach(struct firesat *firesat, struct dvb_frontend *fe)
+void firesat_frontend_init(struct firesat *firesat)
 {
 	switch (firesat->type) {
 	case FireSAT_DVB_S:
@@ -211,11 +209,9 @@ int firesat_frontend_attach(struct fires
 		       firesat->type);
 		firesat->frontend_info = NULL;
 	}
-	fe->ops = firesat_ops;
-	fe->ops.info = *(firesat->frontend_info);
-	fe->dvb = firesat->adapter;
-
-	return 0;
+	firesat->fe.ops = firesat_ops;
+	firesat->fe.ops.info = *(firesat->frontend_info);
+	firesat->fe.dvb = &firesat->adapter;
 }
 
 static struct dvb_frontend_info firesat_S_frontend_info = {
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
@@ -794,42 +794,6 @@ int AVCLNBControl(struct firesat *firesa
 	return 0;
 }
 
-int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount)
-{
-	AVCCmdFrm CmdFrm;
-	AVCRspFrm RspFrm;
-
-	memset(&CmdFrm, 0, sizeof(AVCCmdFrm));
-
-	CmdFrm.cts = AVC;
-	CmdFrm.ctype = STATUS;
-	CmdFrm.sutyp = 0x1f;
-	CmdFrm.suid = 0x7;
-	CmdFrm.opcode = SUBUNIT_Info;
-
-	CmdFrm.operand[0] = 0x07;
-	CmdFrm.operand[1] = 0xff;
-	CmdFrm.operand[2] = 0xff;
-	CmdFrm.operand[3] = 0xff;
-	CmdFrm.operand[4] = 0xff;
-
-	CmdFrm.length = 8;
-
-	if(AVCWrite(firesat,&CmdFrm,&RspFrm) < 0)
-		return -EIO;
-
-	if(RspFrm.resp != STABLE) {
-		printk(KERN_ERR "%s: AVCWrite returned code %d\n",
-		       __func__, RspFrm.resp);
-		return -EINVAL;
-	}
-
-	if(subunitcount)
-		*subunitcount = (RspFrm.operand[1] & 0x7) + 1;
-
-	return 0;
-}
-
 int AVCRegisterRemoteControl(struct firesat *firesat)
 {
 	AVCCmdFrm CmdFrm;
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
@@ -431,7 +431,6 @@ int AVCIdentifySubunit(struct firesat *f
 int AVCLNBControl(struct firesat *firesat, char voltage, char burst,
 		char conttone, char nrdiseq,
 		struct dvb_diseqc_master_cmd *diseqcmd);
-int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount);
 void avc_remote_ctrl_work(struct work_struct *work);
 int AVCRegisterRemoteControl(struct firesat *firesat);
 int AVCTuner_Host2Ca(struct firesat *firesat);
Index: linux/drivers/media/dvb/firesat/firesat-ci.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat-ci.h
+++ linux/drivers/media/dvb/firesat/firesat-ci.h
@@ -3,7 +3,7 @@
 
 struct firesat;
 
-int firesat_ca_init(struct firesat *firesat);
+int firesat_ca_register(struct firesat *firesat);
 void firesat_ca_release(struct firesat *firesat);
 
 #endif /* _FIREDTV_CI_H */

-- 
Stefan Richter
-=====-==--- =--= ===-=
http://arcgraph.de/sr/




More information about the devel mailing list