commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=1b12e9a29b203a9a50907a8a093ed967d42c45e5
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

add L2 DCACHE disable dependency
cleanup session table mutex lock
rearrange sm_session_table structure members

Signed-off-by: Steven Miao <[email protected]>
---
 drivers/staging/icc/Kconfig         |    2 +-
 drivers/staging/icc/core/protocol.c |   41 ++++++++++++++++++----------------
 drivers/staging/icc/include/icc.h   |    6 ++--
 3 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/drivers/staging/icc/Kconfig b/drivers/staging/icc/Kconfig
index fa50dfa..c620184 100644
--- a/drivers/staging/icc/Kconfig
+++ b/drivers/staging/icc/Kconfig
@@ -4,7 +4,7 @@
 
 menuconfig ICC_DRIVER
 	bool "icc driver"
-	depends on !SMP
+	depends on !SMP && !BFIN_L2_DCACHEABLE
 	select BF561_COREB
 	help
 	  the icc driver is a device driver that control the DSP devices,
diff --git a/drivers/staging/icc/core/protocol.c b/drivers/staging/icc/core/protocol.c
index a361d68..fc41a69 100644
--- a/drivers/staging/icc/core/protocol.c
+++ b/drivers/staging/icc/core/protocol.c
@@ -476,7 +476,7 @@ sm_send_packet(sm_uint32_t session_idx, sm_uint32_t dst_ep, sm_uint32_t dst_cpu,
 		payload_buf = kzalloc(m->msg.length, GFP_KERNEL);
 		if (!payload_buf) {
 			ret = -ENOMEM;
-			goto out;
+			goto fail1;
 		}
 		sm_debug("alloc buffer %x\n", payload_buf);
 
@@ -484,12 +484,12 @@ sm_send_packet(sm_uint32_t session_idx, sm_uint32_t dst_ep, sm_uint32_t dst_cpu,
 
 		if (copy_from_user((void *)m->msg.payload, buf, m->msg.length)) {
 			ret = -EFAULT;
-			goto fail;
+			goto fail2;
 		}
 
 	} else {
 		ret = -EINVAL;
-		goto out;
+		goto fail1;
 	}
 
 	if (session->proto_ops->sendmsg) {
@@ -499,20 +499,24 @@ sm_send_packet(sm_uint32_t session_idx, sm_uint32_t dst_ep, sm_uint32_t dst_cpu,
 		ret = 0;
 	}
 	if (ret)
-		goto fail;
+		goto fail2;
 
 	sm_debug("%s: len %d type %x dst %d dstep %d src %d srcep %d\n", __func__, m->msg.length, m->msg.type, m->dst, m->msg.dst_ep, m->src, m->msg.src_ep);
 retry:
 	ret = sm_send_message_internal(&m->msg, m->dst, m->src);
-	if ((!nonblock) && (ret == -EAGAIN)) {
+	if (ret == -EAGAIN) {
+		if (nonblock)
+			goto fail2;
 		interruptible_sleep_on(&icc_info->iccq_tx_wait);
 		goto retry;
 	} else {
 		goto out;
 	}
 
-fail:
+fail2:
 	kfree(payload_buf);
+fail1:
+	kfree(m);
 out:
 	return ret;
 }
@@ -535,9 +539,7 @@ static int sm_recv_scalar(sm_uint32_t session_idx, sm_uint16_t *src_ep,
 		sm_debug("recv sleep on queue\n");
 		if (nonblock)
 			return -EAGAIN;
-		mutex_unlock(&icc_info->sessions_table->lock);
 		interruptible_sleep_on(&session->rx_wait);
-		mutex_lock(&icc_info->sessions_table->lock);
 	}
 
 	if (list_empty(&session->rx_messages)) {
@@ -545,10 +547,12 @@ static int sm_recv_scalar(sm_uint32_t session_idx, sm_uint16_t *src_ep,
 		return -EINTR;
 	}
 
+	mutex_lock(&icc_info->sessions_table->lock);
 	message = list_first_entry(&session->rx_messages, struct sm_message, next);
 	msg = &message->msg;
 
 	list_del(&message->next);
+	mutex_unlock(&icc_info->sessions_table->lock);
 
 	if (src_ep)
 		*src_ep = msg->src_ep;
@@ -607,17 +611,19 @@ static int sm_recv_packet(sm_uint32_t session_idx, sm_uint16_t *src_ep,
 		sm_debug("recv sleep on queue\n");
 		if (nonblock)
 			return -EAGAIN;
-		mutex_unlock(&icc_info->sessions_table->lock);
 		interruptible_sleep_on(&session->rx_wait);
-		mutex_lock(&icc_info->sessions_table->lock);
 	}
 
-	if (list_empty(&session->rx_messages))
+	if (list_empty(&session->rx_messages)) {
+		sm_debug("should not fail here\n");
 		return -EINTR;
+	}
 
+	mutex_lock(&icc_info->sessions_table->lock);
 	message = list_first_entry(&session->rx_messages, struct sm_message, next);
 	msg = &message->msg;
 	list_del(&message->next);
+	mutex_unlock(&icc_info->sessions_table->lock);
 
 	if (src_ep)
 		*src_ep = msg->src_ep;
@@ -650,9 +656,7 @@ static int
 sm_wait_for_connect_ack(struct sm_session *session)
 {
 	long timeout;
-	mutex_unlock(&icc_info->sessions_table->lock);
 	interruptible_sleep_on(&session->rx_wait);
-	mutex_lock(&icc_info->sessions_table->lock);
 	if (signal_pending(current)) {
 		sm_debug("signal\n");
 		return -EINTR;
@@ -671,10 +675,8 @@ static int sm_get_remote_session_active(sm_uint32_t session_idx, sm_uint32_t dst
 		return -EINVAL;
 	session->type = SP_SESSION_PACKET;
 	sm_send_session_active(session, dst_ep, dst_cpu);
-	mutex_unlock(&icc_info->sessions_table->lock);
 	wait_event_interruptible_timeout(session->rx_wait,
 				(session->flags & SM_ACTIVE), 5);
-	mutex_lock(&icc_info->sessions_table->lock);
 
 	if (session->flags & SM_ACTIVE) {
 		sm_debug("received active ack\n");
@@ -755,6 +757,8 @@ static int sm_destroy_session(sm_uint32_t session_idx)
 	session = sm_index_to_session(session_idx);
 	if (!session)
 		return -EINVAL;
+
+	mutex_lock(&icc_info->sessions_table->lock);
 	while (!list_empty(&session->rx_messages)) {
 		message = list_first_entry(&session->rx_messages,
 					struct sm_message, next);
@@ -769,6 +773,7 @@ static int sm_destroy_session(sm_uint32_t session_idx)
 		list_del(&message->next);
 		kfree(message);
 	}
+	mutex_unlock(&icc_info->sessions_table->lock);
 
 	if (session->flags == SM_CONNECT)
 		sm_send_close(session, msg->src_ep, message->src);
@@ -908,8 +913,6 @@ icc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 	buf = pkt->buf;
 	nonblock = (file->f_flags & O_NONBLOCK) | (pkt->flag & O_NONBLOCK);
 
-	sm_debug("ioctl type %x\n", type);
-	mutex_lock(&icc_info->sessions_table->lock);
 	switch (cmd) {
 	case CMD_SM_SEND:
 		if ((SM_MSG_PROTOCOL(type) == SP_SCALAR) ||
@@ -934,7 +937,6 @@ icc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		if (ret < 0) {
 			sm_debug("create session failed srcep %d\n", local_ep);
 			ret = -EINVAL;
-			break;
 		}
 		pkt->session_idx = ret;
 		break;
@@ -964,7 +966,6 @@ icc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		break;
 	}
 
-	mutex_unlock(&icc_info->sessions_table->lock);
 	if (copy_to_user((void *)arg, pkt, sizeof(struct sm_packet)))
 		ret = -EFAULT;
 	kfree(pkt);
@@ -1043,8 +1044,10 @@ static int sm_default_sendmsg(struct sm_message *message, struct sm_session *ses
 		flush_dcache_range(msg->payload, msg->payload + msg->length);
 	case SP_SCALAR:
 	case SP_SESSION_SCALAR:
+		mutex_lock(&icc_info->sessions_table->lock);
 		list_add(&message->next, &session->tx_messages);
 		session->n_uncompleted++;
+		mutex_unlock(&icc_info->sessions_table->lock);
 		break;
 	case SM_PACKET_ERROR:
 		printk("SM ERROR %08x\n", msg->payload);
diff --git a/drivers/staging/icc/include/icc.h b/drivers/staging/icc/include/icc.h
index 891a754..5b6db53 100644
--- a/drivers/staging/icc/include/icc.h
+++ b/drivers/staging/icc/include/icc.h
@@ -159,14 +159,14 @@ struct sm_session {
 #define MAX_ENDPOINTS 32
 #define MAX_SESSIONS 32
 struct sm_session_table {
-	struct sm_session sessions[MAX_ENDPOINTS];
+	struct list_head next_table;
+	struct mutex lock;
 	uint32_t	nfree;
 	uint32_t session_mask;
 	uint32_t session_pending;
 	uint32_t	bits[(MAX_ENDPOINTS - 1) / BITS_PER_LONG + 1];
-	struct list_head next_table;
-	struct mutex lock;
 	sm_uint16_t	refcnt;
+	struct sm_session sessions[MAX_ENDPOINTS];
 };
 
 struct sm_proto {
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to