#define WL_ERROR_ON()          (brcm_msg_level & LOG_ERROR_VAL)
 
-/* register access macros */
+/*
+ * Register access macros.
+ *
+ * These macro's take a pointer to the address to read as one of their
+ * arguments. The macro itself deduces the size of the IO transaction (u8, u16
+ * or u32). Advantage of this approach in combination with using a struct to
+ * define the registers in a register block, is that access size and access
+ * location are defined in only one spot. This reduces the risk of the
+ * programmer trying to use an unsupported transaction size on a register.
+ *
+ * For big endian operation, a byte swap has to be done. Eg, when attempting
+ * to read byte address 0, byte 3 should be read. This is accomplished
+ * using an xor ('^') operator.
+ */
+
 #ifndef __BIG_ENDIAN
-#ifndef __mips__
-#define R_REG(r) \
-       ({\
-               sizeof(*(r)) == sizeof(u8) ? \
-               readb((u8 *)(r)) : \
-               sizeof(*(r)) == sizeof(u16) ? readw((u16 *)(r)) : \
-               readl((u32 *)(r)); \
-       })
-#else                          /* __mips__ */
-#define R_REG(r) \
-       ({ \
-               __typeof(*(r)) __osl_v; \
-               __asm__ __volatile__("sync"); \
-               switch (sizeof(*(r))) { \
-               case sizeof(u8): \
-                       __osl_v = readb((u8 *)(r)); \
-                       break; \
-               case sizeof(u16): \
-                       __osl_v = readw((u16 *)(r)); \
-                       break; \
-               case sizeof(u32): \
-                       __osl_v = \
-                       readl((u32 *)(r)); \
-                       break; \
-               } \
-               __asm__ __volatile__("sync"); \
-               __osl_v; \
-       })
-#endif                         /* __mips__ */
+#define SWP2(r)        (r)
+#define SWP3(r) (r)
+#else
+#define SWP2(r)        ((unsigned long)(r)^2)
+#define SWP3(r)        ((unsigned long)(r)^3)
+#endif /* __BIG_ENDIAN */
 
-#define W_REG(r, v) do { \
-               switch (sizeof(*(r))) { \
-               case sizeof(u8): \
-                       writeb((u8)(v), (u8 *)(r)); break; \
-               case sizeof(u16): \
-                       writew((u16)(v), (u16 *)(r)); break; \
-               case sizeof(u32): \
-                       writel((u32)(v), (u32 *)(r)); break; \
-               }; \
-       } while (0)
-#else                          /* __BIG_ENDIAN */
 #define R_REG(r) \
        ({ \
                __typeof(*(r)) __osl_v; \
                switch (sizeof(*(r))) { \
                case sizeof(u8): \
-                       __osl_v = \
-                       readb((u8 *)((unsigned long)(r)^3)); \
+                       __osl_v = readb((u8 *)(SWP3(r))); \
                        break; \
                case sizeof(u16): \
-                       __osl_v = \
-                       readw((u16 *)((unsigned long)(r)^2)); \
+                       __osl_v = readw((u16 *)(SWP2(r))); \
                        break; \
                case sizeof(u32): \
                        __osl_v = readl((u32 *)(r)); \
 #define W_REG(r, v) do { \
                switch (sizeof(*(r))) { \
                case sizeof(u8):        \
-                       writeb((u8)(v), \
-                       (u8 *)((unsigned long)(r)^3)); break; \
+                       writeb((u8)(v), (u8 *)(SWP3(r))); \
+                       break; \
                case sizeof(u16):       \
-                       writew((u16)(v), \
-                       (u16 *)((unsigned long)(r)^2)); break; \
+                       writew((u16)(v), (u16 *)(SWP2(r))); \
+                       break; \
                case sizeof(u32):       \
-                       writel((u32)(v), \
-                       (u32 *)(r)); break; \
+                       writel((u32)(v), (u32 *)(r)); \
+                       break; \
                } \
        } while (0)
-#endif                         /* __BIG_ENDIAN */
 
 #ifdef __mips__
 /*