[PATCH 17/29] staging: most: refactor channel structure

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

 



The struct most_c_obj has the same set of attributes for each of two AIMs.
This patch cleans up the code by introducing the new struct most_c_aim_obj
hat contains those fields.

Signed-off-by: Christian Gromm <christian.gromm@xxxxxxxxxxxxx>
---
 drivers/staging/most/mostcore/core.c |  108 +++++++++++++++++-----------------
 1 file changed, 55 insertions(+), 53 deletions(-)

diff --git a/drivers/staging/most/mostcore/core.c b/drivers/staging/most/mostcore/core.c
index 4dfa001..ee6deb8 100644
--- a/drivers/staging/most/mostcore/core.c
+++ b/drivers/staging/most/mostcore/core.c
@@ -38,6 +38,12 @@ static struct ida mdev_id;
 static int modref;
 static int dummy_num_buffers;
 
+struct most_c_aim_obj {
+	struct most_aim *ptr;
+	int refs;
+	int num_buffers;
+};
+
 struct most_c_obj {
 	struct kobject kobj;
 	struct completion cleanup;
@@ -56,12 +62,8 @@ struct most_c_obj {
 	spinlock_t fifo_lock;
 	struct list_head halt_fifo;
 	struct list_head list;
-	struct most_aim *first_aim;
-	struct most_aim *second_aim;
-	int first_aim_refs;
-	int second_aim_refs;
-	int first_num_buffers;
-	int second_num_buffers;
+	struct most_c_aim_obj aim0;
+	struct most_c_aim_obj aim1;
 	struct list_head trash_fifo;
 	struct task_struct *hdm_enqueue_task;
 	struct mutex stop_task_mutex;
@@ -557,12 +559,12 @@ create_most_c_obj(const char *name, struct kobject *parent)
  */
 static void destroy_most_c_obj(struct most_c_obj *c)
 {
-	if (c->first_aim)
-		c->first_aim->disconnect_channel(c->iface, c->channel_id);
-	if (c->second_aim)
-		c->second_aim->disconnect_channel(c->iface, c->channel_id);
-	c->first_aim = NULL;
-	c->second_aim = NULL;
+	if (c->aim0.ptr)
+		c->aim0.ptr->disconnect_channel(c->iface, c->channel_id);
+	if (c->aim1.ptr)
+		c->aim1.ptr->disconnect_channel(c->iface, c->channel_id);
+	c->aim0.ptr = NULL;
+	c->aim1.ptr = NULL;
 
 	mutex_lock(&deregister_mutex);
 	flush_trash_fifo(c);
@@ -994,10 +996,10 @@ static ssize_t store_add_link(struct most_aim_obj *aim_obj,
 	if (IS_ERR(c))
 		return -ENODEV;
 
-	if (!c->first_aim)
-		aim_ptr = &c->first_aim;
-	else if (!c->second_aim)
-		aim_ptr = &c->second_aim;
+	if (!c->aim0.ptr)
+		aim_ptr = &c->aim0.ptr;
+	else if (!c->aim1.ptr)
+		aim_ptr = &c->aim1.ptr;
 	else
 		return -ENOSPC;
 
@@ -1051,10 +1053,10 @@ static ssize_t store_remove_link(struct most_aim_obj *aim_obj,
 	if (IS_ERR(c))
 		return -ENODEV;
 
-	if (c->first_aim == aim_obj->driver)
-		c->first_aim = NULL;
-	if (c->second_aim == aim_obj->driver)
-		c->second_aim = NULL;
+	if (c->aim0.ptr == aim_obj->driver)
+		c->aim0.ptr = NULL;
+	if (c->aim1.ptr == aim_obj->driver)
+		c->aim1.ptr = NULL;
 	if (aim_obj->driver->disconnect_channel(c->iface, c->channel_id))
 		return -EIO;
 	return len;
@@ -1240,11 +1242,11 @@ static void arm_mbo(struct mbo *mbo)
 	list_add_tail(&mbo->list, &c->fifo);
 	spin_unlock_irqrestore(&c->fifo_lock, flags);
 
-	if (c->first_aim_refs && c->first_aim->tx_completion)
-		c->first_aim->tx_completion(c->iface, c->channel_id);
+	if (c->aim0.refs && c->aim0.ptr->tx_completion)
+		c->aim0.ptr->tx_completion(c->iface, c->channel_id);
 
-	if (c->second_aim_refs && c->second_aim->tx_completion)
-		c->second_aim->tx_completion(c->iface, c->channel_id);
+	if (c->aim1.refs && c->aim1.ptr->tx_completion)
+		c->aim1.ptr->tx_completion(c->iface, c->channel_id);
 }
 
 /**
@@ -1401,15 +1403,15 @@ struct mbo *most_get_mbo(struct most_interface *iface, int id,
 	if (unlikely(!c))
 		return NULL;
 
-	if (c->first_aim_refs && c->second_aim_refs &&
-	    ((aim == c->first_aim && c->first_num_buffers <= 0) ||
-	     (aim == c->second_aim && c->second_num_buffers <= 0)))
+	if (c->aim0.refs && c->aim1.refs &&
+	    ((aim == c->aim0.ptr && c->aim0.num_buffers <= 0) ||
+	     (aim == c->aim1.ptr && c->aim1.num_buffers <= 0)))
 		return NULL;
 
-	if (aim == c->first_aim)
-		num_buffers_ptr = &c->first_num_buffers;
-	else if (aim == c->second_aim)
-		num_buffers_ptr = &c->second_num_buffers;
+	if (aim == c->aim0.ptr)
+		num_buffers_ptr = &c->aim0.num_buffers;
+	else if (aim == c->aim1.ptr)
+		num_buffers_ptr = &c->aim1.num_buffers;
 	else
 		num_buffers_ptr = &dummy_num_buffers;
 
@@ -1485,12 +1487,12 @@ static void most_read_completion(struct mbo *mbo)
 		c->is_starving = 1;
 	}
 
-	if (c->first_aim_refs && c->first_aim->rx_completion &&
-	    c->first_aim->rx_completion(mbo) == 0)
+	if (c->aim0.refs && c->aim0.ptr->rx_completion &&
+	    c->aim0.ptr->rx_completion(mbo) == 0)
 		return;
 
-	if (c->second_aim_refs && c->second_aim->rx_completion &&
-	    c->second_aim->rx_completion(mbo) == 0)
+	if (c->aim1.refs && c->aim1.ptr->rx_completion &&
+	    c->aim1.ptr->rx_completion(mbo) == 0)
 		return;
 
 	most_put_mbo(mbo);
@@ -1517,7 +1519,7 @@ int most_start_channel(struct most_interface *iface, int id,
 		return -EINVAL;
 
 	mutex_lock(&c->start_mutex);
-	if (c->first_aim_refs + c->second_aim_refs > 0)
+	if (c->aim0.refs + c->aim1.refs > 0)
 		goto out; /* already started by other aim */
 
 	if (!try_module_get(iface->mod)) {
@@ -1553,15 +1555,15 @@ int most_start_channel(struct most_interface *iface, int id,
 		goto error;
 
 	c->is_starving = 0;
-	c->first_num_buffers = c->cfg.num_buffers / 2;
-	c->second_num_buffers = c->cfg.num_buffers - c->first_num_buffers;
+	c->aim0.num_buffers = c->cfg.num_buffers / 2;
+	c->aim1.num_buffers = c->cfg.num_buffers - c->aim0.num_buffers;
 	atomic_set(&c->mbo_ref, num_buffer);
 
 out:
-	if (aim == c->first_aim)
-		c->first_aim_refs++;
-	if (aim == c->second_aim)
-		c->second_aim_refs++;
+	if (aim == c->aim0.ptr)
+		c->aim0.refs++;
+	if (aim == c->aim1.ptr)
+		c->aim1.refs++;
 	mutex_unlock(&c->start_mutex);
 	return 0;
 
@@ -1593,7 +1595,7 @@ int most_stop_channel(struct most_interface *iface, int id,
 		return -EINVAL;
 
 	mutex_lock(&c->start_mutex);
-	if (c->first_aim_refs + c->second_aim_refs >= 2)
+	if (c->aim0.refs + c->aim1.refs >= 2)
 		goto out;
 
 	mutex_lock(&c->stop_task_mutex);
@@ -1637,10 +1639,10 @@ int most_stop_channel(struct most_interface *iface, int id,
 	c->is_poisoned = false;
 
 out:
-	if (aim == c->first_aim)
-		c->first_aim_refs--;
-	if (aim == c->second_aim)
-		c->second_aim_refs--;
+	if (aim == c->aim0.ptr)
+		c->aim0.refs--;
+	if (aim == c->aim1.ptr)
+		c->aim1.refs--;
 	mutex_unlock(&c->start_mutex);
 	return 0;
 }
@@ -1694,13 +1696,13 @@ int most_deregister_aim(struct most_aim *aim)
 	}
 	list_for_each_entry_safe(i, i_tmp, &instance_list, list) {
 		list_for_each_entry_safe(c, tmp, &i->channel_list, list) {
-			if (c->first_aim == aim || c->second_aim == aim)
+			if (c->aim0.ptr == aim || c->aim1.ptr == aim)
 				aim->disconnect_channel(
 					c->iface, c->channel_id);
-			if (c->first_aim == aim)
-				c->first_aim = NULL;
-			if (c->second_aim == aim)
-				c->second_aim = NULL;
+			if (c->aim0.ptr == aim)
+				c->aim0.ptr = NULL;
+			if (c->aim1.ptr == aim)
+				c->aim1.ptr = NULL;
 		}
 	}
 	list_del(&aim_obj->list);
@@ -1834,7 +1836,7 @@ void most_deregister_interface(struct most_interface *iface)
 	}
 
 	list_for_each_entry(c, &i->channel_list, list) {
-		if (c->first_aim_refs + c->second_aim_refs <= 0)
+		if (c->aim0.refs + c->aim1.refs <= 0)
 			continue;
 
 		mutex_lock(&c->stop_task_mutex);
-- 
1.7.9.5

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[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