2 * CFE OS Independent Layer
4 * Copyright (C) 2009, Broadcom Corporation
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 $
19 /* Global ASSERT type */
20 uint32 g_assert_type
= 0;
23 osl_attach(void *pdev
)
27 osh
= (osl_t
*)KMALLOC(sizeof(osl_t
), 0);
30 bzero(osh
, sizeof(osl_t
));
36 osl_detach(osl_t
*osh
)
40 KFREE((void*) KERNADDR(PHYSADDR((ulong
)osh
)));
49 ASSERT(len
<= LBDATASZ
);
51 if (!(buf
= KMALLOC(LBUFSZ
, 0)))
54 lb
= (struct lbuf
*) &buf
[LBDATASZ
];
55 bzero(lb
, sizeof(struct lbuf
));
56 lb
->head
= lb
->data
= buf
;
59 lb
->tail
= lb
->data
+ len
;
64 osl_pktfree(osl_t
*osh
, struct lbuf
*lb
, bool send
)
68 if (send
&& osh
->tx_fn
)
69 osh
->tx_fn(osh
->tx_ctx
, lb
, 0);
71 for (; lb
; lb
= next
) {
74 KFREE((void *) KERNADDR(PHYSADDR((ulong
) lb
->head
)));
79 osl_pktdup(struct lbuf
*lb
)
83 if (!(dup
= osl_pktget(lb
->len
)))
86 bcopy(lb
->data
, dup
->data
, lb
->len
);
92 osl_pktsetlen(struct lbuf
*lb
, uint len
)
94 ASSERT((lb
->data
+ len
) <= lb
->end
);
97 lb
->tail
= lb
->data
+ len
;
101 osl_pktpush(struct lbuf
*lb
, uint bytes
)
103 ASSERT((lb
->data
- bytes
) >= lb
->head
);
112 osl_pktpull(struct lbuf
*lb
, uint bytes
)
114 ASSERT((lb
->data
+ bytes
) <= lb
->end
);
115 ASSERT(lb
->len
>= bytes
);
124 osl_dma_alloc_consistent(uint size
, ulong
*pap
)
128 if (!(buf
= KMALLOC(size
, DMA_CONSISTENT_ALIGN
)))
131 *((ulong
*) pap
) = PHYSADDR((ulong
) buf
);
133 cfe_flushcache(CFE_CACHE_FLUSH_D
);
135 return (void *) UNCADDR((ulong
) buf
);
139 osl_dma_free_consistent(void *va
)
141 KFREE((void *) KERNADDR(PHYSADDR((ulong
) va
)));
146 osl_assert(char *exp
, char *file
, int line
)
148 printf("assertion \"%s\" failed: file \"%s\", line %d\n", exp
, file
, line
);
151 #endif /* BCMDBG_ASSERT */
154 osl_busprobe(uint32
*val
, uint32 addr
)
156 *val
= R_REG(NULL
, (volatile uint32
*) addr
);
161 /* translate bcmerros */
163 osl_error(int bcmerror
)
171 /* Converts a OS packet to driver packet.
172 * The original packet data is copied to the new driver packet
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
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;