From: Doyu Hiroshi (Nokia-D/Helsinki) <[email protected]>

Based on the following discussion:
      http://marc.info/?l=linux-omap&m=124697893724881&w=2

Signed-off-by: Hiroshi DOYU <[email protected]>
---
 drivers/dsp/bridge/pmgr/wcd.c |   60 ++++++++++++++++++++++++++--------------
 1 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/drivers/dsp/bridge/pmgr/wcd.c b/drivers/dsp/bridge/pmgr/wcd.c
index 441130c..8708c78 100644
--- a/drivers/dsp/bridge/pmgr/wcd.c
+++ b/drivers/dsp/bridge/pmgr/wcd.c
@@ -145,27 +145,45 @@
 #define MAX_STREAMS     16
 #define MAX_BUFS       64
 
-/* Following two macros should ideally have do{}while(0) */
-
-#define cp_fm_usr(dest, src, status, elements)    \
-    if (DSP_SUCCEEDED(status)) {\
-           if (unlikely(src == NULL) ||                                \
-               unlikely(copy_from_user(dest, src, elements * 
sizeof(*(dest))))) { \
-               GT_1trace(WCD_debugMask, GT_7CLASS, \
-               "copy_from_user failed, src=0x%x\n", src);  \
-               status = DSP_EPOINTER ; \
-       } \
-    }
-
-#define cp_to_usr(dest, src, status, elements)    \
-    if (DSP_SUCCEEDED(status)) {\
-           if (unlikely(dest == NULL) ||                               \
-               unlikely(copy_to_user(dest, src, elements * sizeof(*(src))))) { 
\
-               GT_1trace(WCD_debugMask, GT_7CLASS, \
-               "copy_to_user failed, dest=0x%x\n", dest); \
-               status = DSP_EPOINTER ;\
-       } \
-    }
+static inline void __cp_fm_usr(void *to, const void __user *from,
+                              DSP_STATUS *err, unsigned long bytes)
+{
+       if (DSP_FAILED(*err))
+               return;
+
+       if (unlikely(!from)) {
+               *err = DSP_EPOINTER;
+               return;
+       }
+
+       if (unlikely(copy_from_user(to, from, bytes))) {
+               GT_2trace(WCD_debugMask, GT_7CLASS,
+                         "%s failed, from=0x%08x\n", __func__, from);
+               *err = DSP_EPOINTER;
+       }
+}
+#define cp_fm_usr(to, from, err, n)                            \
+       __cp_fm_usr(to, from, &(err), (n) * sizeof(*(to)))
+
+static inline void __cp_to_usr(void __user *to, const void *from,
+                              DSP_STATUS *err, unsigned long bytes)
+{
+       if (DSP_FAILED(*err))
+               return;
+
+       if (unlikely(!to)) {
+               *err = DSP_EPOINTER;
+               return;
+       }
+
+       if (unlikely(copy_to_user(to, from, bytes))) {
+               GT_2trace(WCD_debugMask, GT_7CLASS,
+                         "%s failed, to=0x%08x\n", __func__, to);
+               *err = DSP_EPOINTER;
+       }
+}
+#define cp_to_usr(to, from, err, n)                            \
+       __cp_to_usr(to, from, &(err), (n) * sizeof(*(from)))
 
 /* Device IOCtl function pointer */
 struct WCD_Cmd {
-- 
1.6.2.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to