[PATCH 1/6] Staging: unisys: channels: Cleanup sparse warnings

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

 



Clean up multiple sparse warnings mostly due to different address spaces
when accessing I/O memory.

Also, remove SignalRemoveAll(), SignalQueueHasOneElement(),
SignalQueueIsFull(), because they were never called.

Signed-off-by: Ken Cox <jkc@xxxxxxxxxx>
---
 drivers/staging/unisys/channels/channel.c    | 166 +++++++--------------------
 drivers/staging/unisys/channels/chanstub.c   |   8 +-
 drivers/staging/unisys/channels/chanstub.h   |   4 +-
 drivers/staging/unisys/include/commontypes.h |   4 +
 4 files changed, 49 insertions(+), 133 deletions(-)

diff --git a/drivers/staging/unisys/channels/channel.c b/drivers/staging/unisys/channels/channel.c
index 39ffe52..f645259 100644
--- a/drivers/staging/unisys/channels/channel.c
+++ b/drivers/staging/unisys/channels/channel.c
@@ -44,38 +44,41 @@
  * 1 if the insertion succeeds, 0 if the queue was full.
  */
 unsigned char
-visor_signal_insert(pCHANNEL_HEADER pChannel, U32 Queue, void *pSignal)
+visor_signal_insert(CHANNEL_HEADER __iomem *pChannel, U32 Queue, void *pSignal)
 {
-	void *psignal;
-	unsigned int head, tail;
-	pSIGNAL_QUEUE_HEADER pqhdr =
-	    (pSIGNAL_QUEUE_HEADER) ((char *) pChannel +
-				    pChannel->oChannelSpace) + Queue;
+	void __iomem *psignal;
+	unsigned int head, tail, nof;
+
+	SIGNAL_QUEUE_HEADER __iomem *pqhdr =
+	    (SIGNAL_QUEUE_HEADER __iomem *)
+		((char __iomem *) pChannel + readq(&pChannel->oChannelSpace))
+		+ Queue;
 
 	/* capture current head and tail */
-	head = pqhdr->Head;
-	tail = pqhdr->Tail;
+	head = readl(&pqhdr->Head);
+	tail = readl(&pqhdr->Tail);
 
 	/* queue is full if (head + 1) % n equals tail */
-	if (((head + 1) % pqhdr->MaxSignalSlots) == tail) {
-		pqhdr->NumOverflows++;
+	if (((head + 1) % readl(&pqhdr->MaxSignalSlots)) == tail) {
+		nof = readq(&pqhdr->NumOverflows) + 1;
+		writeq(nof, &pqhdr->NumOverflows);
 		return 0;
 	}
 
 	/* increment the head index */
-	head = (head + 1) % pqhdr->MaxSignalSlots;
+	head = (head + 1) % readl(&pqhdr->MaxSignalSlots);
 
 	/* copy signal to the head location from the area pointed to
 	 * by pSignal
 	 */
-	psignal =
-	    (char *) pqhdr + pqhdr->oSignalBase + (head * pqhdr->SignalSize);
-	MEMCPY(psignal, pSignal, pqhdr->SignalSize);
+	psignal = (char __iomem *)pqhdr + readq(&pqhdr->oSignalBase) +
+		(head * readl(&pqhdr->SignalSize));
+	MEMCPY_TOIO(psignal, pSignal, readl(&pqhdr->SignalSize));
 
 	VolatileBarrier();
-	pqhdr->Head = head;
+	writel(head, &pqhdr->Head);
 
-	pqhdr->NumSignalsSent++;
+	writeq(readq(&pqhdr->NumSignalsSent) + 1, &pqhdr->NumSignalsSent);
 	return 1;
 }
 EXPORT_SYMBOL_GPL(visor_signal_insert);
@@ -99,36 +102,37 @@ EXPORT_SYMBOL_GPL(visor_signal_insert);
  * 1 if the removal succeeds, 0 if the queue was empty.
  */
 unsigned char
-visor_signal_remove(pCHANNEL_HEADER pChannel, U32 Queue, void *pSignal)
+visor_signal_remove(CHANNEL_HEADER __iomem *pChannel, U32 Queue, void *pSignal)
 {
-	void *psource;
+	void __iomem *psource;
 	unsigned int head, tail;
-	pSIGNAL_QUEUE_HEADER pqhdr =
-	    (pSIGNAL_QUEUE_HEADER) ((char *) pChannel +
-				    pChannel->oChannelSpace) + Queue;
+	SIGNAL_QUEUE_HEADER __iomem *pqhdr =
+	    (SIGNAL_QUEUE_HEADER __iomem *) ((char __iomem *) pChannel +
+				    readq(&pChannel->oChannelSpace)) + Queue;
 
 	/* capture current head and tail */
-	head = pqhdr->Head;
-	tail = pqhdr->Tail;
+	head = readl(&pqhdr->Head);
+	tail = readl(&pqhdr->Tail);
 
 	/* queue is empty if the head index equals the tail index */
 	if (head == tail) {
-		pqhdr->NumEmptyCnt++;
+		writeq(readq(&pqhdr->NumEmptyCnt) + 1, &pqhdr->NumEmptyCnt);
 		return 0;
 	}
 
 	/* advance past the 'empty' front slot */
-	tail = (tail + 1) % pqhdr->MaxSignalSlots;
+	tail = (tail + 1) % readl(&pqhdr->MaxSignalSlots);
 
 	/* copy signal from tail location to the area pointed to by pSignal */
-	psource =
-	    (char *) pqhdr + pqhdr->oSignalBase + (tail * pqhdr->SignalSize);
-	MEMCPY(pSignal, psource, pqhdr->SignalSize);
+	psource = (char __iomem *) pqhdr + readq(&pqhdr->oSignalBase) +
+		(tail * readl(&pqhdr->SignalSize));
+	MEMCPY_FROMIO(pSignal, psource, readl(&pqhdr->SignalSize));
 
 	VolatileBarrier();
-	pqhdr->Tail = tail;
+	writel(tail, &pqhdr->Tail);
 
-	pqhdr->NumSignalsReceived++;
+	writeq(readq(&pqhdr->NumSignalsReceived) + 1,
+	       &pqhdr->NumSignalsReceived);
 	return 1;
 }
 EXPORT_SYMBOL_GPL(visor_signal_remove);
@@ -194,59 +198,6 @@ SignalRemoveAll(pCHANNEL_HEADER pChannel, U32 Queue, void *pSignal)
 
 /*
  * Routine Description:
- * Copies one signal from channel pChannel's nth Queue at the given position
- * at the time of the call into the memory pointed to by pSignal.
- *
- * Parameters:
- * pChannel: (IN) points to the IO Channel
- * Queue: (IN) nth Queue of the IO Channel
- * Position: (IN) nth entry in Queue of the IO Channel
- * pSignal: (IN) pointer to where the signals are to be copied
- *
- * Assumptions:
- * - pChannel and Queue are valid.
- * - pSignal points to a memory area large enough to hold queue's SignalSize
- *
- * Return value:
- * 1 if the copy succeeds, 0 if the queue was empty or Position was invalid.
- */
-unsigned char
-SignalPeek(pCHANNEL_HEADER pChannel, U32 Queue, U32 Position, void *pSignal)
-{
-	void *psignal;
-	unsigned int head, tail;
-	pSIGNAL_QUEUE_HEADER pqhdr =
-	    (pSIGNAL_QUEUE_HEADER) ((char *) pChannel +
-				    pChannel->oChannelSpace) + Queue;
-
-	head = pqhdr->Head;
-	tail = pqhdr->Tail;
-
-	/* check if Position is out of range or queue is empty */
-	if (Position >= pqhdr->MaxSignalSlots || Position == tail
-	    || head == tail)
-		return 0;
-
-	/* check if Position is between tail and head */
-	if (head > tail) {
-		if (Position > head || Position < tail)
-			return 0;
-	} else if ((Position > head) && (Position < tail))
-		return 0;
-
-	/* copy signal from Position location to the area pointed to
-	 * by pSignal
-	 */
-	psignal =
-	    (char *) pqhdr + pqhdr->oSignalBase +
-	    (Position * pqhdr->SignalSize);
-	MEMCPY(pSignal, psignal, pqhdr->SignalSize);
-
-	return 1;
-}
-
-/*
- * Routine Description:
  * Determine whether a signal queue is empty.
  *
  * Parameters:
@@ -257,51 +208,12 @@ SignalPeek(pCHANNEL_HEADER pChannel, U32 Queue, U32 Position, void *pSignal)
  * 1 if the signal queue is empty, 0 otherwise.
  */
 unsigned char
-visor_signalqueue_empty(pCHANNEL_HEADER pChannel, U32 Queue)
+visor_signalqueue_empty(CHANNEL_HEADER __iomem *pChannel, U32 Queue)
 {
-	pSIGNAL_QUEUE_HEADER pqhdr =
-	    (pSIGNAL_QUEUE_HEADER) ((char *) pChannel +
-				    pChannel->oChannelSpace) + Queue;
-	return pqhdr->Head == pqhdr->Tail;
+	SIGNAL_QUEUE_HEADER __iomem *pqhdr =
+	    (SIGNAL_QUEUE_HEADER __iomem *) ((char __iomem *) pChannel +
+				    readq(&pChannel->oChannelSpace)) + Queue;
+	return readl(&pqhdr->Head) == readl(&pqhdr->Tail);
 }
 EXPORT_SYMBOL_GPL(visor_signalqueue_empty);
 
-/*
- * Routine Description:
- * Determine whether a signal queue is empty.
- *
- * Parameters:
- * pChannel: (IN) points to the IO Channel
- * Queue: (IN) nth Queue of the IO Channel
- *
- * Return value:
- * 1 if the signal queue has 1 element, 0 otherwise.
- */
-unsigned char
-SignalQueueHasOneElement(pCHANNEL_HEADER pChannel, U32 Queue)
-{
-	pSIGNAL_QUEUE_HEADER pqhdr =
-	    (pSIGNAL_QUEUE_HEADER) ((char *) pChannel +
-				    pChannel->oChannelSpace) + Queue;
-	return ((pqhdr->Tail + 1) % pqhdr->MaxSignalSlots) == pqhdr->Head;
-}
-
-/*
- * Routine Description:
- * Determine whether a signal queue is full.
- *
- * Parameters:
- * pChannel: (IN) points to the IO Channel
- * Queue: (IN) nth Queue of the IO Channel
- *
- * Return value:
- * 1 if the signal queue is full, 0 otherwise.
- */
-unsigned char
-SignalQueueIsFull(pCHANNEL_HEADER pChannel, U32 Queue)
-{
-	pSIGNAL_QUEUE_HEADER pqhdr =
-	    (pSIGNAL_QUEUE_HEADER) ((char *) pChannel +
-				    pChannel->oChannelSpace) + Queue;
-	return ((pqhdr->Head + 1) % pqhdr->MaxSignalSlots) == pqhdr->Tail;
-}
diff --git a/drivers/staging/unisys/channels/chanstub.c b/drivers/staging/unisys/channels/chanstub.c
index 92bb52c..f504f49 100644
--- a/drivers/staging/unisys/channels/chanstub.c
+++ b/drivers/staging/unisys/channels/chanstub.c
@@ -27,19 +27,19 @@
 #include "chanstub.h"
 #include "version.h"
 
-__init int
+static __init int
 channel_mod_init(void)
 {
 	return 0;
 }
 
-__exit void
+static __exit void
 channel_mod_exit(void)
 {
 }
 
 unsigned char
-SignalInsert_withLock(pCHANNEL_HEADER pChannel, U32 Queue,
+SignalInsert_withLock(CHANNEL_HEADER __iomem *pChannel, U32 Queue,
 		      void *pSignal, spinlock_t *lock)
 {
 	unsigned char result;
@@ -51,7 +51,7 @@ SignalInsert_withLock(pCHANNEL_HEADER pChannel, U32 Queue,
 }
 
 unsigned char
-SignalRemove_withLock(pCHANNEL_HEADER pChannel, U32 Queue,
+SignalRemove_withLock(CHANNEL_HEADER __iomem *pChannel, U32 Queue,
 		      void *pSignal, spinlock_t *lock)
 {
 	unsigned char result;
diff --git a/drivers/staging/unisys/channels/chanstub.h b/drivers/staging/unisys/channels/chanstub.h
index dadd7cd..8d727de 100644
--- a/drivers/staging/unisys/channels/chanstub.h
+++ b/drivers/staging/unisys/channels/chanstub.h
@@ -15,9 +15,9 @@
 
 #ifndef __CHANSTUB_H__
 #define __CHANSTUB_H__
-unsigned char SignalInsert_withLock(pCHANNEL_HEADER pChannel, U32 Queue,
+unsigned char SignalInsert_withLock(CHANNEL_HEADER __iomem *pChannel, U32 Queue,
 				     void *pSignal, spinlock_t *lock);
-unsigned char SignalRemove_withLock(pCHANNEL_HEADER pChannel, U32 Queue,
+unsigned char SignalRemove_withLock(CHANNEL_HEADER __iomem *pChannel, U32 Queue,
 				     void *pSignal, spinlock_t *lock);
 
 #endif
diff --git a/drivers/staging/unisys/include/commontypes.h b/drivers/staging/unisys/include/commontypes.h
index ae46bed..ef12af4 100644
--- a/drivers/staging/unisys/include/commontypes.h
+++ b/drivers/staging/unisys/include/commontypes.h
@@ -23,6 +23,7 @@
 #ifdef __KERNEL__
 #include <linux/types.h>
 #include <linux/version.h>
+#include <linux/io.h>
 #else
 #include <stdint.h>
 #include <syslog.h>
@@ -72,6 +73,7 @@ typedef U64 GUEST_PHYSICAL_ADDRESS;
 
 #define MEMSET(ptr, val, len) memset(ptr, val, len)
 #define MEMCMP(m1, m2, len) memcmp(m1, m2, len)
+#define MEMCMP_IO(m1, m2, len) memcmp((void __force *)m1, m2, len)
 #define STRLEN(s) ((UINTN)strlen((const char *)s))
 #define STRCPY(d, s) (strcpy((char *)d, (const char *)s))
 
@@ -81,6 +83,8 @@ typedef U64 GUEST_PHYSICAL_ADDRESS;
 #ifdef __KERNEL__
 #define MEMORYBARRIER mb()
 #define MEMCPY(dest, src, len) memcpy(dest, src, len)
+#define MEMCPY_TOIO(dest, src, len) memcpy_toio(dest, src, len)
+#define MEMCPY_FROMIO(dest, src, len) memcpy_fromio(dest, src, len)
 
 #define CHANNEL_GUID_MISMATCH(chType, chName, field, expected, actual, fil, \
 			      lin, logCtx)				\
-- 
1.8.5.3

_______________________________________________
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