blob: ec1c51119637e93160e82a069dece9f76303877c [file] [log] [blame]
Henry Ptasinskia9533e72010-09-08 21:04:42 -07001/*
2 * Copyright (c) 2010 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef _linux_osl_h_
18#define _linux_osl_h_
19
Arend van Spriel3be727c2010-11-23 22:20:30 +010020#include <linux/skbuff.h>
Henry Ptasinskia9533e72010-09-08 21:04:42 -070021
Brett Rudleye69284f2010-11-16 15:45:48 -080022extern struct osl_info *osl_attach(void *pdev, uint bustype);
23extern void osl_detach(struct osl_info *osh);
Henry Ptasinskia9533e72010-09-08 21:04:42 -070024
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -070025extern u32 g_assert_type;
Henry Ptasinskia9533e72010-09-08 21:04:42 -070026
27#if defined(BCMDBG_ASSERT)
28#define ASSERT(exp) \
29 do { if (!(exp)) osl_assert(#exp, __FILE__, __LINE__); } while (0)
30extern void osl_assert(char *exp, char *file, int line);
31#else
Henry Ptasinskia9533e72010-09-08 21:04:42 -070032#define ASSERT(exp) do {} while (0)
Brett Rudleyc53d2012010-11-30 15:22:15 -080033#endif /* defined(BCMDBG_ASSERT) */
Henry Ptasinskia9533e72010-09-08 21:04:42 -070034
Henry Ptasinskia9533e72010-09-08 21:04:42 -070035/* PCI device bus # and slot # */
36#define OSL_PCI_BUS(osh) osl_pci_bus(osh)
37#define OSL_PCI_SLOT(osh) osl_pci_slot(osh)
Brett Rudleye69284f2010-11-16 15:45:48 -080038extern uint osl_pci_bus(struct osl_info *osh);
39extern uint osl_pci_slot(struct osl_info *osh);
Henry Ptasinskia9533e72010-09-08 21:04:42 -070040
Henry Ptasinskia9533e72010-09-08 21:04:42 -070041#define BUS_SWAP32(v) (v)
42
Brett Rudleye69284f2010-11-16 15:45:48 -080043extern void *osl_dma_alloc_consistent(struct osl_info *osh, uint size,
44 u16 align, uint *tot, unsigned long *pap);
Brett Rudley40e5c962010-10-08 13:57:13 -070045
46#ifdef BRCM_FULLMAC
47#define DMA_ALLOC_CONSISTENT(osh, size, pap, dmah, alignbits) \
48 osl_dma_alloc_consistent((osh), (size), (0), (tot), (pap))
49#else
50#define DMA_ALLOC_CONSISTENT(osh, size, align, tot, pap, dmah) \
51 osl_dma_alloc_consistent((osh), (size), (align), (tot), (pap))
52#endif /* BRCM_FULLMAC */
53
Henry Ptasinskicf2b4482010-09-20 22:33:12 -070054#define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
55 osl_dma_free_consistent((osh), (void *)(va), (size), (pa))
Brett Rudleye69284f2010-11-16 15:45:48 -080056extern void osl_dma_free_consistent(struct osl_info *osh, void *va,
57 uint size, unsigned long pa);
Henry Ptasinskia9533e72010-09-08 21:04:42 -070058
59/* map/unmap direction */
60#define DMA_TX 1 /* TX direction for DMA */
61#define DMA_RX 2 /* RX direction for DMA */
62
63/* map/unmap shared (dma-able) memory */
64#define DMA_MAP(osh, va, size, direction, p, dmah) \
65 osl_dma_map((osh), (va), (size), (direction))
66#define DMA_UNMAP(osh, pa, size, direction, p, dmah) \
67 osl_dma_unmap((osh), (pa), (size), (direction))
Brett Rudleye69284f2010-11-16 15:45:48 -080068extern uint osl_dma_map(struct osl_info *osh, void *va, uint size,
69 int direction);
70extern void osl_dma_unmap(struct osl_info *osh, uint pa, uint size,
71 int direction);
Henry Ptasinskia9533e72010-09-08 21:04:42 -070072
Henry Ptasinskia9533e72010-09-08 21:04:42 -070073/* register access macros */
74#if defined(BCMSDIO)
Brett Rudley33279892010-10-01 18:03:27 -070075#ifdef BRCM_FULLMAC
Henry Ptasinskia9533e72010-09-08 21:04:42 -070076#include <bcmsdh.h>
Brett Rudley33279892010-10-01 18:03:27 -070077#endif
Greg Kroah-Hartmanf024c482010-10-21 10:50:21 -070078#define OSL_WRITE_REG(osh, r, v) (bcmsdh_reg_write(NULL, (unsigned long)(r), sizeof(*(r)), (v)))
79#define OSL_READ_REG(osh, r) (bcmsdh_reg_read(NULL, (unsigned long)(r), sizeof(*(r))))
Henry Ptasinskia9533e72010-09-08 21:04:42 -070080#endif
81
82#if defined(BCMSDIO)
Brett Rudleye6a12a02010-11-16 13:16:59 -080083#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) \
84 if (((struct osl_pubinfo *)(osh))->mmbus) \
Henry Ptasinskia9533e72010-09-08 21:04:42 -070085 mmap_op else bus_op
Brett Rudleye6a12a02010-11-16 13:16:59 -080086#define SELECT_BUS_READ(osh, mmap_op, bus_op) \
87 (((struct osl_pubinfo *)(osh))->mmbus) ? mmap_op : bus_op
Henry Ptasinskia9533e72010-09-08 21:04:42 -070088#else
89#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) mmap_op
90#define SELECT_BUS_READ(osh, mmap_op, bus_op) mmap_op
91#endif
92
Henry Ptasinskia9533e72010-09-08 21:04:42 -070093/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
94#define PKTBUFSZ 2048 /* largest reasonable packet buffer, driver uses for ethernet MTU */
95
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -070096#define OSL_SYSUPTIME() ((u32)jiffies * (1000 / HZ))
Henry Ptasinskia9533e72010-09-08 21:04:42 -070097#define printf(fmt, args...) printk(fmt , ## args)
Brett Rudley33279892010-10-01 18:03:27 -070098#ifdef BRCM_FULLMAC
Henry Ptasinskia9533e72010-09-08 21:04:42 -070099#include <linux/kernel.h> /* for vsn/printf's */
100#include <linux/string.h> /* for mem*, str* */
Brett Rudley33279892010-10-01 18:03:27 -0700101#endif
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700102/* bcopy's: Linux kernel doesn't provide these (anymore) */
103#define bcopy(src, dst, len) memcpy((dst), (src), (len))
104#define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700105
106/* register access macros */
107#if defined(OSLREGOPS)
108#else
109#ifndef IL_BIGENDIAN
110#ifndef __mips__
111#define R_REG(osh, r) (\
Greg Kroah-Hartmande9bca62010-10-05 10:23:40 -0700112 SELECT_BUS_READ(osh, sizeof(*(r)) == sizeof(u8) ? readb((volatile u8*)(r)) : \
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700113 sizeof(*(r)) == sizeof(u16) ? readw((volatile u16*)(r)) : \
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700114 readl((volatile u32*)(r)), OSL_READ_REG(osh, r)) \
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700115)
116#else /* __mips__ */
117#define R_REG(osh, r) (\
118 SELECT_BUS_READ(osh, \
119 ({ \
120 __typeof(*(r)) __osl_v; \
121 __asm__ __volatile__("sync"); \
122 switch (sizeof(*(r))) { \
Greg Kroah-Hartmande9bca62010-10-05 10:23:40 -0700123 case sizeof(u8): \
124 __osl_v = readb((volatile u8*)(r)); \
Jason Cooper62145822010-09-14 09:45:34 -0400125 break; \
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700126 case sizeof(u16): \
127 __osl_v = readw((volatile u16*)(r)); \
Jason Cooper62145822010-09-14 09:45:34 -0400128 break; \
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700129 case sizeof(u32): \
Jason Cooper62145822010-09-14 09:45:34 -0400130 __osl_v = \
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700131 readl((volatile u32*)(r)); \
Jason Cooper62145822010-09-14 09:45:34 -0400132 break; \
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700133 } \
134 __asm__ __volatile__("sync"); \
135 __osl_v; \
136 }), \
137 ({ \
138 __typeof(*(r)) __osl_v; \
139 __asm__ __volatile__("sync"); \
140 __osl_v = OSL_READ_REG(osh, r); \
141 __asm__ __volatile__("sync"); \
142 __osl_v; \
143 })) \
144)
145#endif /* __mips__ */
146
147#define W_REG(osh, r, v) do { \
148 SELECT_BUS_WRITE(osh, \
149 switch (sizeof(*(r))) { \
Greg Kroah-Hartmande9bca62010-10-05 10:23:40 -0700150 case sizeof(u8): \
151 writeb((u8)(v), (volatile u8*)(r)); break; \
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700152 case sizeof(u16): \
153 writew((u16)(v), (volatile u16*)(r)); break; \
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700154 case sizeof(u32): \
155 writel((u32)(v), (volatile u32*)(r)); break; \
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700156 }, \
157 (OSL_WRITE_REG(osh, r, v))); \
158 } while (0)
159#else /* IL_BIGENDIAN */
160#define R_REG(osh, r) (\
161 SELECT_BUS_READ(osh, \
162 ({ \
163 __typeof(*(r)) __osl_v; \
164 switch (sizeof(*(r))) { \
Greg Kroah-Hartmande9bca62010-10-05 10:23:40 -0700165 case sizeof(u8): \
Jason Cooper62145822010-09-14 09:45:34 -0400166 __osl_v = \
Greg Kroah-Hartman3acf41c2010-10-12 13:18:17 -0700167 readb((volatile u8*)((r)^3)); \
Jason Cooper62145822010-09-14 09:45:34 -0400168 break; \
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700169 case sizeof(u16): \
Jason Cooper62145822010-09-14 09:45:34 -0400170 __osl_v = \
Greg Kroah-Hartman3acf41c2010-10-12 13:18:17 -0700171 readw((volatile u16*)((r)^2)); \
Jason Cooper62145822010-09-14 09:45:34 -0400172 break; \
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700173 case sizeof(u32): \
174 __osl_v = readl((volatile u32*)(r)); \
Jason Cooper62145822010-09-14 09:45:34 -0400175 break; \
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700176 } \
177 __osl_v; \
178 }), \
179 OSL_READ_REG(osh, r)) \
180)
181#define W_REG(osh, r, v) do { \
182 SELECT_BUS_WRITE(osh, \
183 switch (sizeof(*(r))) { \
Greg Kroah-Hartmande9bca62010-10-05 10:23:40 -0700184 case sizeof(u8): \
185 writeb((u8)(v), \
Greg Kroah-Hartman3acf41c2010-10-12 13:18:17 -0700186 (volatile u8*)((r)^3)); break; \
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700187 case sizeof(u16): \
188 writew((u16)(v), \
Greg Kroah-Hartman3acf41c2010-10-12 13:18:17 -0700189 (volatile u16*)((r)^2)); break; \
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700190 case sizeof(u32): \
191 writel((u32)(v), \
192 (volatile u32*)(r)); break; \
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700193 }, \
194 (OSL_WRITE_REG(osh, r, v))); \
195 } while (0)
196#endif /* IL_BIGENDIAN */
197
198#endif /* OSLREGOPS */
199
200#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
201#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
202
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700203#define bcopy(src, dst, len) memcpy((dst), (src), (len))
204#define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700205
206/* uncached/cached virtual address */
207#ifdef __mips__
208#include <asm/addrspace.h>
209#define OSL_UNCACHED(va) ((void *)KSEG1ADDR((va)))
210#define OSL_CACHED(va) ((void *)KSEG0ADDR((va)))
211#else
212#define OSL_UNCACHED(va) ((void *)va)
213#define OSL_CACHED(va) ((void *)va)
214#endif /* mips */
215
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700216/* map/unmap physical to virtual I/O */
217#if !defined(CONFIG_MMC_MSM7X00A)
218#define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
219#else
220#define REG_MAP(pa, size) (void *)(0)
221#endif /* !defined(CONFIG_MMC_MSM7X00A */
222#define REG_UNMAP(va) iounmap((va))
223
Jason Cooper0d706ef2010-09-14 09:45:39 -0400224#define R_SM(r) (*(r))
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700225#define W_SM(r, v) (*(r) = (v))
226#define BZERO_SM(r, len) memset((r), '\0', (len))
227
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700228/* packet primitives */
Arend van Spriel54991ad2010-11-23 14:06:24 +0100229#define PKTGET(osh, len, send) osl_pktget((osh), (len))
230#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send))
Arend van Spriel3be727c2010-11-23 22:20:30 +0100231
Brett Rudleye69284f2010-11-16 15:45:48 -0800232extern void *osl_pktget(struct osl_info *osh, uint len);
233extern void osl_pktfree(struct osl_info *osh, void *skb, bool send);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700234
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700235#ifdef BRCM_FULLMAC
Greg Kroah-Hartman2d956e22010-10-05 09:40:02 -0700236static inline void *
Brett Rudleye6a12a02010-11-16 13:16:59 -0800237osl_pkt_frmnative(struct osl_pubinfo *osh, struct sk_buff *skb)
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700238{
239 struct sk_buff *nskb;
240
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700241 for (nskb = skb; nskb; nskb = nskb->next)
242 osh->pktalloced++;
243
244 return (void *)skb;
245}
246#define PKTFRMNATIVE(osh, skb) \
Brett Rudleye6a12a02010-11-16 13:16:59 -0800247 osl_pkt_frmnative(((struct osl_pubinfo *)osh), (struct sk_buff*)(skb))
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700248
Greg Kroah-Hartman2d956e22010-10-05 09:40:02 -0700249static inline struct sk_buff *
Brett Rudleye6a12a02010-11-16 13:16:59 -0800250osl_pkt_tonative(struct osl_pubinfo *osh, void *pkt)
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700251{
252 struct sk_buff *nskb;
253
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700254 for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next)
255 osh->pktalloced--;
256
257 return (struct sk_buff *)pkt;
258}
259#define PKTTONATIVE(osh, pkt) \
Brett Rudleye6a12a02010-11-16 13:16:59 -0800260 osl_pkt_tonative((struct osl_pubinfo *)(osh), (pkt))
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700261#else /* !BRCM_FULLMAC */
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700262#define PKTSETSKIPCT(osh, skb)
263#define PKTCLRSKIPCT(osh, skb)
264#define PKTSKIPCT(osh, skb)
Henry Ptasinskicf2b4482010-09-20 22:33:12 -0700265#endif /* BRCM_FULLMAC */
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700266
Greg Kroah-Hartman1a3bf742010-10-07 16:34:51 -0700267#define PKTSUMNEEDED(skb) (((struct sk_buff *)(skb))->ip_summed == CHECKSUM_PARTIAL)
Jason Cooper39dcff32010-09-14 09:45:41 -0400268#define PKTSETSUMGOOD(skb, x) (((struct sk_buff *)(skb))->ip_summed = \
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700269 ((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
270/* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700271
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700272#endif /* _linux_osl_h_ */