staging: brcm80211: got rid of #ifdef __mips__ by new dma_spin_for_len()
authorRoland Vossen <rvossen@broadcom.com>
Fri, 13 May 2011 09:59:25 +0000 (11:59 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 17 May 2011 19:03:50 +0000 (12:03 -0700)
Code cleanup.

Cc: devel@linuxdriverproject.org
Cc: linux-wireless@vger.kernel.org
Reviewed-by: Henry Ptasinski <henryp@broadcom.com>
Reviewed-by: Brett Rudley <brudley@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/brcm80211/brcmsmac/hnddma.c
drivers/staging/brcm80211/include/hnddma.h

index 962010f569b24589ca8f9163359c388f7871f86e..f607315f8143c83931b67cea7e4db55d06fc169a 100644 (file)
@@ -728,16 +728,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);
index 5d079e77490ee24185f545bb4f1cc75f14720787..fbbcb9b5ae622c10f479f1f2750471d4e245a9ff 100644 (file)
@@ -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_ */