From: Roland Vossen <[email protected]>

Code cleanup.

Cc: [email protected]
Cc: [email protected]
Reviewed-by: Henry Ptasinski <[email protected]>
Reviewed-by: Brett Rudley <[email protected]>
Signed-off-by: Arend van Spriel <[email protected]>
---
 drivers/staging/brcm80211/brcmsmac/hnddma.c |   11 +----------
 drivers/staging/brcm80211/include/hnddma.h  |   19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/drivers/staging/brcm80211/brcmsmac/hnddma.c 
b/drivers/staging/brcm80211/brcmsmac/hnddma.c
index 33432e6..5f11147 100644
--- a/drivers/staging/brcm80211/brcmsmac/hnddma.c
+++ b/drivers/staging/brcm80211/brcmsmac/hnddma.c
@@ -721,16 +721,7 @@ static void *_dma_rx(dma_info_t *di)
 
        len = le16_to_cpu(*(u16 *) (head->data));
        DMA_TRACE(("%s: dma_rx len %d\n", di->name, len));
-
-#if defined(__mips__)
-#define OSL_UNCACHED(va)        ((void *)KSEG1ADDR((va)))
-       if (!len) {
-               while (!(len = *(u16 *) OSL_UNCACHED(head->data)))
-                       udelay(1);
-
-               *(u16 *) (head->data) = cpu_to_le16((u16) len);
-       }
-#endif                         /* defined(__mips__) */
+       dma_spin_for_len(len, head);
 
        /* set actual length */
        pkt_len = min((di->rxoffset + len), di->rxbufsize);
diff --git a/drivers/staging/brcm80211/include/hnddma.h 
b/drivers/staging/brcm80211/include/hnddma.h
index 5d079e7..fbbcb9b 100644
--- a/drivers/staging/brcm80211/include/hnddma.h
+++ b/drivers/staging/brcm80211/include/hnddma.h
@@ -204,4 +204,23 @@ extern const di_fcn_t dma64proc;
 extern uint dma_addrwidth(si_t *sih, void *dmaregs);
 void dma_walk_packets(struct hnddma_pub *dmah, void (*callback_fnc)
                      (void *pkt, void *arg_a), void *arg_a);
+
+/*
+ * DMA(Bug) on some chips seems to declare that the packet is ready, but the
+ * packet length is not updated yet (by DMA) on the expected time.
+ * Workaround is to hold processor till DMA updates the length, and stay off
+ * the bus to allow DMA update the length in buffer
+ */
+static inline void dma_spin_for_len(uint len, struct sk_buff *head)
+{
+#if defined(__mips__)
+       if (!len) {
+               while (!(len = *(u16 *) KSEG1ADDR(head->data)))
+                       udelay(1);
+
+               *(u16 *) (head->data) = cpu_to_le16((u16) len);
+       }
+#endif                         /* defined(__mips__) */
+}
+
 #endif                         /* _hnddma_h_ */
-- 
1.7.4.1


_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to