Broadcom SDK and wireless driver: another attempt to update to ver. 5.10.147.0
[tomato.git] / release / src-rt / shared / cfe_osl.c
blobaf9d6f197ae57978ad0311bb0f4a397e19d0f803
1 /*
2 * CFE OS Independent Layer
4 * Copyright (C) 2009, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
8 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
9 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
10 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
12 * $Id: cfe_osl.c,v 1.18.194.2 2009/07/14 20:29:48 Exp $
15 #include <typedefs.h>
16 #include <bcmdefs.h>
17 #include <osl.h>
19 /* Global ASSERT type */
20 uint32 g_assert_type = 0;
22 osl_t *
23 osl_attach(void *pdev)
25 osl_t *osh;
27 osh = (osl_t *)KMALLOC(sizeof(osl_t), 0);
28 ASSERT(osh);
30 bzero(osh, sizeof(osl_t));
31 osh->pdev = pdev;
32 return osh;
35 void
36 osl_detach(osl_t *osh)
38 if (osh == NULL)
39 return;
40 KFREE((void*) KERNADDR(PHYSADDR((ulong)osh)));
43 struct lbuf *
44 osl_pktget(uint len)
46 uchar *buf;
47 struct lbuf *lb;
49 ASSERT(len <= LBDATASZ);
51 if (!(buf = KMALLOC(LBUFSZ, 0)))
52 return NULL;
54 lb = (struct lbuf *) &buf[LBDATASZ];
55 bzero(lb, sizeof(struct lbuf));
56 lb->head = lb->data = buf;
57 lb->end = buf + len;
58 lb->len = len;
59 lb->tail = lb->data + len;
60 return lb;
63 void
64 osl_pktfree(osl_t *osh, struct lbuf *lb, bool send)
66 struct lbuf *next;
68 if (send && osh->tx_fn)
69 osh->tx_fn(osh->tx_ctx, lb, 0);
71 for (; lb; lb = next) {
72 ASSERT(!lb->link);
73 next = lb->next;
74 KFREE((void *) KERNADDR(PHYSADDR((ulong) lb->head)));
78 struct lbuf *
79 osl_pktdup(struct lbuf *lb)
81 struct lbuf *dup;
83 if (!(dup = osl_pktget(lb->len)))
84 return NULL;
86 bcopy(lb->data, dup->data, lb->len);
87 ASSERT(!lb->link);
88 return dup;
91 void
92 osl_pktsetlen(struct lbuf *lb, uint len)
94 ASSERT((lb->data + len) <= lb->end);
96 lb->len = len;
97 lb->tail = lb->data + len;
100 uchar *
101 osl_pktpush(struct lbuf *lb, uint bytes)
103 ASSERT((lb->data - bytes) >= lb->head);
105 lb->data -= bytes;
106 lb->len += bytes;
108 return lb->data;
111 uchar *
112 osl_pktpull(struct lbuf *lb, uint bytes)
114 ASSERT((lb->data + bytes) <= lb->end);
115 ASSERT(lb->len >= bytes);
117 lb->data += bytes;
118 lb->len -= bytes;
120 return lb->data;
123 void *
124 osl_dma_alloc_consistent(uint size, ulong *pap)
126 void *buf;
128 if (!(buf = KMALLOC(size, DMA_CONSISTENT_ALIGN)))
129 return NULL;
131 *((ulong *) pap) = PHYSADDR((ulong) buf);
133 cfe_flushcache(CFE_CACHE_FLUSH_D);
135 return (void *) UNCADDR((ulong) buf);
138 void
139 osl_dma_free_consistent(void *va)
141 KFREE((void *) KERNADDR(PHYSADDR((ulong) va)));
144 #ifdef BCMDBG_ASSERT
145 void
146 osl_assert(char *exp, char *file, int line)
148 printf("assertion \"%s\" failed: file \"%s\", line %d\n", exp, file, line);
149 *((int *) 0) = 0;
151 #endif /* BCMDBG_ASSERT */
154 osl_busprobe(uint32 *val, uint32 addr)
156 *val = R_REG(NULL, (volatile uint32 *) addr);
158 return 0;
161 /* translate bcmerros */
163 osl_error(int bcmerror)
165 if (bcmerror)
166 return -1;
167 else
168 return 0;
171 /* Converts a OS packet to driver packet.
172 * The original packet data is copied to the new driver packet
174 void
175 osl_pkt_frmnative(iocb_buffer_t *buffer, struct lbuf *lb)
177 bcopy(buffer->buf_ptr, PKTDATA(NULL, lb), buffer->buf_length);
180 /* Converts a driver packet into OS packet.
181 * The data is copied to the OS packet
183 void
184 osl_pkt_tonative(struct lbuf* lb, iocb_buffer_t *buffer)
186 bcopy(PKTDATA(NULL, lb), buffer->buf_ptr, PKTLEN(NULL, lb));
187 buffer->buf_retlen = PKTLEN(NULL, lb);
189 /* RFC894: Minimum length of IP over Ethernet packet is 46 octets */
190 if (buffer->buf_retlen < 60) {
191 bzero(buffer->buf_ptr + buffer->buf_retlen, 60 - buffer->buf_retlen);
192 buffer->buf_retlen = 60;