[patch 04/10] firedtv: use hpsb_node_read(), _write(), _lock()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



because they are simpler and treat the node generation more correctly.
While we are at it, clean up and simplify surrounding code.

Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
---
 drivers/media/dvb/firesat/avc_api.c      |  133 +++++++----------------
 drivers/media/dvb/firesat/cmp.c          |    7 -
 drivers/media/dvb/firesat/firesat.h      |   10 -
 drivers/media/dvb/firesat/firesat_1394.c |   24 +---
 drivers/media/dvb/firesat/firesat_iso.c  |    3 
 5 files changed, 58 insertions(+), 119 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
@@ -13,12 +13,13 @@
 
 #include <linux/crc32.h>
 #include <linux/delay.h>
+#include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/moduleparam.h>
 #include <linux/mutex.h>
+#include <linux/string.h>
 #include <linux/wait.h>
 #include <linux/workqueue.h>
-#include <asm/atomic.h>
 
 #include <ieee1394_transactions.h>
 #include <nodemgr.h>
@@ -35,13 +36,6 @@ static unsigned int avc_comm_debug = 0;
 module_param(avc_comm_debug, int, 0644);
 MODULE_PARM_DESC(avc_comm_debug, "debug logging level [0..2] of AV/C communication, default is 0 (no)");
 
-/* Frees an allocated packet */
-static void avc_free_packet(struct hpsb_packet *packet)
-{
-	hpsb_free_tlabel(packet);
-	hpsb_free_packet(packet);
-}
-
 static const char* get_ctype_string(__u8 ctype)
 {
 	switch(ctype)
@@ -166,75 +160,46 @@ static void log_response_frame(const AVC
 }
 
 static int __AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm,
-		      AVCRspFrm *RspFrm) {
-	struct hpsb_packet *packet;
-	struct node_entry *ne;
-	int num_tries = 0;
-	int packet_ok = 0;
-
-	ne = firesat->nodeentry;
-	if(!ne) {
-		printk(KERN_ERR "%s: lost node!\n",__func__);
-		return -EIO;
-	}
-
-	/* need all input data */
-	if(!firesat || !ne || !CmdFrm) {
-		printk(KERN_ERR "%s: missing input data!\n",__func__);
-		return -EINVAL;
-	}
+		      AVCRspFrm *RspFrm)
+{
+	int err, retry;
 
-	if (avc_comm_debug > 0) {
+	if (avc_comm_debug > 0)
 		log_command_frame(CmdFrm);
-	}
 
-	if(RspFrm)
-		atomic_set(&firesat->avc_reply_received, 0);
+	if (RspFrm)
+		firesat->avc_reply_received = false;
 
-	while (packet_ok == 0 && num_tries < 6) {
-		num_tries++;
-		packet_ok = 1;
-		packet = hpsb_make_writepacket(ne->host, ne->nodeid,
-					       COMMAND_REGISTER,
-					       (quadlet_t*)CmdFrm,
-					       CmdFrm->length);
-		hpsb_set_packet_complete_task(packet,
-					      (void (*)(void*))avc_free_packet,
-					      packet);
-		hpsb_node_fill_packet(ne, packet);
-
-		if (hpsb_send_packet(packet) < 0) {
-			avc_free_packet(packet);
-			atomic_set(&firesat->avc_reply_received, 1);
-			printk(KERN_ERR "%s: send failed!\n",__func__);
-			return -EIO;
+	for (retry = 0; retry < 6; retry++) {
+		err = hpsb_node_write(firesat->ud->ne, COMMAND_REGISTER,
+				      (quadlet_t *)CmdFrm, CmdFrm->length);
+		if (err) {
+			firesat->avc_reply_received = true;
+			dev_err(&firesat->ud->device,
+				"FCP command write failed\n");
+			return err;
 		}
 
-		if(RspFrm) {
-			// AV/C specs say that answers should be send within
-			// 150 ms so let's time out after 200 ms
-			if (wait_event_timeout(firesat->avc_wait,
-					       atomic_read(&firesat->avc_reply_received) == 1,
-					       HZ / 5) == 0) {
-				packet_ok = 0;
-			}
-			else {
-				memcpy(RspFrm, firesat->respfrm,
-				       firesat->resp_length);
-				RspFrm->length = firesat->resp_length;
-				if (avc_comm_debug > 0) {
-					log_response_frame(RspFrm);
-				}
-			}
+		if (!RspFrm)
+			return 0;
+
+		/*
+		 * AV/C specs say that answers should be sent within 150 ms.
+		 * Time out after 200 ms.
+		 */
+		if (wait_event_timeout(firesat->avc_wait,
+				       firesat->avc_reply_received,
+				       HZ / 5) != 0) {
+			memcpy(RspFrm, firesat->respfrm, firesat->resp_length);
+			RspFrm->length = firesat->resp_length;
+			if (avc_comm_debug > 0)
+				log_response_frame(RspFrm);
+
+			return 0;
 		}
 	}
-	if (packet_ok == 0) {
-		printk(KERN_ERR "%s: AV/C response timed out 6 times.\n",
-		       __func__);
-		return -ETIMEDOUT;
-	}
-
-	return 0;
+	dev_err(&firesat->ud->device, "FCP response timed out\n");
+	return -ETIMEDOUT;
 }
 
 int AVCWrite(struct firesat*firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm)
@@ -264,34 +229,22 @@ int AVCRecv(struct firesat *firesat, u8 
 					  RspFrm->operand[5]);
 			schedule_work(&firesat->remote_ctrl_work);
 		} else if (RspFrm->resp != INTERIM) {
-			printk(KERN_INFO "firedtv: remote control result = "
-			       "%d\n", RspFrm->resp);
+			dev_info(&firesat->ud->device,
+				 "remote control result = %d\n", RspFrm->resp);
 		}
 		return 0;
 	}
 
-	if(atomic_read(&firesat->avc_reply_received) == 1) {
-		printk(KERN_ERR "%s: received out-of-order AVC response, "
-		       "ignored\n",__func__);
-		return -EINVAL;
+	if (firesat->avc_reply_received) {
+		dev_err(&firesat->ud->device,
+			"received out-of-order AVC response, ignored\n");
+		return -EIO;
 	}
-//	AVCRspFrm *resp=(AVCRspFrm *)data;
-//	int k;
-
-//	printk(KERN_INFO "resp=0x%x\n",resp->resp);
-//	printk(KERN_INFO "cts=0x%x\n",resp->cts);
-//	printk(KERN_INFO "suid=0x%x\n",resp->suid);
-//	printk(KERN_INFO "sutyp=0x%x\n",resp->sutyp);
-//	printk(KERN_INFO "opcode=0x%x\n",resp->opcode);
-//	printk(KERN_INFO "length=%d\n",resp->length);
-
-//	for(k=0;k<2;k++)
-//		printk(KERN_INFO "operand[%d]=%02x\n",k,resp->operand[k]);
 
-	memcpy(firesat->respfrm,data,length);
-	firesat->resp_length=length;
+	memcpy(firesat->respfrm, data, length);
+	firesat->resp_length = length;
 
-	atomic_set(&firesat->avc_reply_received, 1);
+	firesat->avc_reply_received = true;
 	wake_up(&firesat->avc_wait);
 
 	return 0;
Index: linux/drivers/media/dvb/firesat/cmp.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/cmp.c
+++ linux/drivers/media/dvb/firesat/cmp.c
@@ -49,8 +49,7 @@ static int cmp_read(struct firesat *fire
 	if (mutex_lock_interruptible(&firesat->avc_mutex))
 		return -EINTR;
 
-	ret = hpsb_read(firesat->host, firesat->nodeentry->nodeid,
-			firesat->nodeentry->generation, addr, buf, len);
+	ret = hpsb_node_read(firesat->ud->ne, addr, buf, len);
 
 	mutex_unlock(&firesat->avc_mutex);
 	return ret;
@@ -64,9 +63,7 @@ static int cmp_lock(struct firesat *fire
 	if (mutex_lock_interruptible(&firesat->avc_mutex))
 		return -EINTR;
 
-	ret = hpsb_lock(firesat->host, firesat->nodeentry->nodeid,
-			firesat->nodeentry->generation,
-			addr, ext_tcode, data, arg);
+	ret = hpsb_node_lock(firesat->ud->ne, addr, ext_tcode, data, arg);
 
 	mutex_unlock(&firesat->avc_mutex);
 	return ret;
Index: linux/drivers/media/dvb/firesat/firesat.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat.h
+++ linux/drivers/media/dvb/firesat/firesat.h
@@ -21,7 +21,6 @@
 #include <linux/types.h>
 #include <linux/wait.h>
 #include <linux/workqueue.h>
-#include <asm/atomic.h>
 
 #include <demux.h>
 #include <dmxdev.h>
@@ -129,7 +128,7 @@ enum model_type {
 
 struct hpsb_host;
 struct hpsb_iso;
-struct node_entry;
+struct unit_directory;
 
 struct firesat {
 	struct dvb_demux dvb_demux;
@@ -149,7 +148,7 @@ struct firesat {
 
 	struct mutex			avc_mutex;
 	wait_queue_head_t		avc_wait;
-	atomic_t			avc_reply_received;
+	bool				avc_reply_received;
 	struct work_struct		remote_ctrl_work;
 
 	struct firesat_channel {
@@ -167,10 +166,7 @@ struct firesat {
 	void *respfrm;
 	int resp_length;
 
-	struct hpsb_host *host;
-	u64 guid;			/* GUID of this node */
-	u32 guid_vendor_id;		/* Top 24bits of guid */
-	struct node_entry *nodeentry;
+	struct unit_directory *ud;
 
 	enum model_type type;
 	char subunit;
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
@@ -21,7 +21,6 @@
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/types.h>
-#include <asm/atomic.h>
 
 #include <dmxdev.h>
 #include <dvb_demux.h>
@@ -98,8 +97,8 @@ static void fcp_request(struct hpsb_host
 
 		spin_lock_irqsave(&firesat_list_lock, flags);
 		list_for_each_entry(firesat_entry,&firesat_list,list) {
-			if (firesat_entry->host == host &&
-			    firesat_entry->nodeentry->nodeid == nodeid &&
+			if (firesat_entry->ud->ne->host == host &&
+			    firesat_entry->ud->ne->nodeid == nodeid &&
 			    (firesat_entry->subunit == (data[1]&0x7) ||
 			     (firesat_entry->subunit == 0 &&
 			      (data[1]&0x7) == 0x7))) {
@@ -163,10 +162,7 @@ static int firesat_probe(struct device *
 
 		memset(firesat, 0, sizeof (struct firesat));
 
-		firesat->host		= ud->ne->host;
-		firesat->guid		= ud->ne->guid;
-		firesat->guid_vendor_id = ud->ne->guid_vendor_id;
-		firesat->nodeentry	= ud->ne;
+		firesat->ud		= ud;
 		firesat->isochannel	= -1;
 		firesat->tone		= 0xff;
 		firesat->voltage	= 0xff;
@@ -180,7 +176,7 @@ static int firesat_probe(struct device *
 
 		mutex_init(&firesat->avc_mutex);
 		init_waitqueue_head(&firesat->avc_wait);
-		atomic_set(&firesat->avc_reply_received, 1);
+		firesat->avc_reply_received = true;
 		mutex_init(&firesat->demux_mutex);
 		INIT_WORK(&firesat->remote_ctrl_work, avc_remote_ctrl_work);
 
@@ -287,16 +283,12 @@ static int firesat_update(struct unit_di
 {
 	struct firesat **firesats = ud->device.driver_data;
 	int k;
-	// loop over subunits
 
 	for (k = 0; k < 2; k++)
-		if (firesats[k]) {
-			firesats[k]->nodeentry = ud->ne;
-
-			if (firesats[k]->isochannel >= 0)
-				try_CMPEstablishPPconnection(firesats[k], firesats[k]->subunit, firesats[k]->isochannel);
-		}
-
+		if (firesats[k] && firesats[k]->isochannel >= 0)
+			try_CMPEstablishPPconnection(firesats[k],
+						     firesats[k]->subunit,
+						     firesats[k]->isochannel);
 	return 0;
 }
 
Index: linux/drivers/media/dvb/firesat/firesat_iso.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat_iso.c
+++ linux/drivers/media/dvb/firesat/firesat_iso.c
@@ -18,6 +18,7 @@
 
 #include <dma.h>
 #include <iso.h>
+#include <nodemgr.h>
 
 #include "firesat.h"
 
@@ -36,7 +37,7 @@ int setup_iso_channel(struct firesat *fi
 {
 	int result;
 	firesat->iso_handle =
-		hpsb_iso_recv_init(firesat->host,
+		hpsb_iso_recv_init(firesat->ud->ne->host,
 				   256 * 200, //data_buf_size,
 				   256, //buf_packets,
 				   firesat->isochannel,

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



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux