BCM WL 6.30.102.9 (r366174)
[tomato.git] / release / src-rt / shared / cfe_osl.c
blob13471e22405e9ec0d8bf0920399c5886891d1511
1 /*
2 * CFE OS Independent Layer
4 * Copyright (C) 2010, Broadcom Corporation. All Rights Reserved.
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 * $Id: cfe_osl.c,v 1.22 2009-07-10 22:43:40 Exp $
21 #include <typedefs.h>
22 #include <bcmdefs.h>
23 #include <osl.h>
24 #include <bcmutils.h>
26 /* Global ASSERT type */
27 uint32 g_assert_type = 0;
29 osl_t *
30 osl_attach(void *pdev)
32 osl_t *osh;
34 osh = (osl_t *)KMALLOC(sizeof(osl_t), 0);
35 ASSERT(osh);
37 bzero(osh, sizeof(osl_t));
38 osh->pdev = pdev;
39 return osh;
42 void
43 osl_detach(osl_t *osh)
45 if (osh == NULL)
46 return;
47 KFREE((void*) KERNADDR(PHYSADDR((ulong)osh)));
50 struct lbuf *
51 osl_pktget(uint len)
53 uchar *buf;
54 struct lbuf *lb;
56 ASSERT(len <= LBDATASZ);
58 if (!(buf = KMALLOC(LBUFSZ, 0)))
59 return NULL;
61 lb = (struct lbuf *) &buf[LBDATASZ];
62 bzero(lb, sizeof(struct lbuf));
63 lb->head = lb->data = buf;
64 lb->end = buf + len;
65 lb->len = len;
66 lb->tail = lb->data + len;
67 return lb;
70 void
71 osl_pktfree(osl_t *osh, struct lbuf *lb, bool send)
73 struct lbuf *next;
75 if (send && osh->tx_fn)
76 osh->tx_fn(osh->tx_ctx, lb, 0);
78 for (; lb; lb = next) {
79 ASSERT(!lb->link);
80 next = lb->next;
81 KFREE((void *) KERNADDR(PHYSADDR((ulong) lb->head)));
85 struct lbuf *
86 osl_pktdup(struct lbuf *lb)
88 struct lbuf *dup;
90 if (!(dup = osl_pktget(lb->len)))
91 return NULL;
93 bcopy(lb->data, dup->data, lb->len);
94 ASSERT(!lb->link);
95 return dup;
98 void
99 osl_pktsetlen(struct lbuf *lb, uint len)
101 ASSERT((lb->data + len) <= lb->end);
103 lb->len = len;
104 lb->tail = lb->data + len;
107 uchar *
108 osl_pktpush(struct lbuf *lb, uint bytes)
110 ASSERT((lb->data - bytes) >= lb->head);
112 lb->data -= bytes;
113 lb->len += bytes;
115 return lb->data;
118 uchar *
119 osl_pktpull(struct lbuf *lb, uint bytes)
121 ASSERT((lb->data + bytes) <= lb->end);
122 ASSERT(lb->len >= bytes);
124 lb->data += bytes;
125 lb->len -= bytes;
127 return lb->data;
130 void *
131 osl_dma_alloc_consistent(uint size, uint16 align_bits, uint *alloced, ulong *pap)
133 void *buf;
134 uint16 align = (1 << align_bits);
136 /* fix up the alignment requirements first */
137 if (!ISALIGNED(DMA_CONSISTENT_ALIGN, align))
138 size += align;
139 *alloced = size;
141 if (!(buf = KMALLOC(size, DMA_CONSISTENT_ALIGN)))
142 return NULL;
144 *((ulong *) pap) = PHYSADDR((ulong) buf);
146 cfe_flushcache(CFE_CACHE_FLUSH_D);
148 return (void *) UNCADDR((ulong) buf);
151 void
152 osl_dma_free_consistent(void *va)
154 KFREE((void *) KERNADDR(PHYSADDR((ulong) va)));
157 #ifdef BCMDBG_ASSERT
158 void
159 osl_assert(char *exp, char *file, int line)
161 printf("assertion \"%s\" failed: file \"%s\", line %d\n", exp, file, line);
162 *((int *) 0) = 0;
164 #endif /* BCMDBG_ASSERT */
167 osl_busprobe(uint32 *val, uint32 addr)
169 *val = R_REG(NULL, (volatile uint32 *) addr);
171 return 0;
174 /* translate bcmerros */
176 osl_error(int bcmerror)
178 if (bcmerror)
179 return -1;
180 else
181 return 0;
184 /* Converts a OS packet to driver packet.
185 * The original packet data is copied to the new driver packet
187 void
188 osl_pkt_frmnative(iocb_buffer_t *buffer, struct lbuf *lb)
190 bcopy(buffer->buf_ptr, PKTDATA(NULL, lb), buffer->buf_length);
193 /* Converts a driver packet into OS packet.
194 * The data is copied to the OS packet
196 void
197 osl_pkt_tonative(struct lbuf* lb, iocb_buffer_t *buffer)
199 bcopy(PKTDATA(NULL, lb), buffer->buf_ptr, PKTLEN(NULL, lb));
200 buffer->buf_retlen = PKTLEN(NULL, lb);
202 /* RFC894: Minimum length of IP over Ethernet packet is 46 octets */
203 if (buffer->buf_retlen < 60) {
204 bzero(buffer->buf_ptr + buffer->buf_retlen, 60 - buffer->buf_retlen);
205 buffer->buf_retlen = 60;