Deleted Added
full compact
cxgb_osdep.h (184715) cxgb_osdep.h (185162)
1/**************************************************************************
2
3Copyright (c) 2007, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8

--- 12 unchanged lines hidden (view full) ---

21CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26POSSIBILITY OF SUCH DAMAGE.
27
28
1/**************************************************************************
2
3Copyright (c) 2007, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8

--- 12 unchanged lines hidden (view full) ---

21CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26POSSIBILITY OF SUCH DAMAGE.
27
28
29$FreeBSD: head/sys/dev/cxgb/cxgb_osdep.h 184715 2008-11-06 10:35:46Z bz $
29$FreeBSD: head/sys/dev/cxgb/cxgb_osdep.h 185162 2008-11-22 05:55:56Z kmacy $
30
31***************************************************************************/
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/ctype.h>
36#include <sys/endian.h>
37#include <sys/bus.h>

--- 113 unchanged lines hidden (view full) ---

151 * TX WR
152 */
153#define TX_WR_COUNT_MAX 7 /* the maximum total number of packets that can be
154 * aggregated into a single TX WR
155 */
156
157
158#if defined(__i386__) || defined(__amd64__)
30
31***************************************************************************/
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/ctype.h>
36#include <sys/endian.h>
37#include <sys/bus.h>

--- 113 unchanged lines hidden (view full) ---

151 * TX WR
152 */
153#define TX_WR_COUNT_MAX 7 /* the maximum total number of packets that can be
154 * aggregated into a single TX WR
155 */
156
157
158#if defined(__i386__) || defined(__amd64__)
159#define mb() __asm volatile("mfence":::"memory")
160#define rmb() __asm volatile("lfence":::"memory")
161#define wmb() __asm volatile("sfence" ::: "memory")
162#define smp_mb() mb()
163
164#define L1_CACHE_BYTES 128
165static __inline
166void prefetch(void *x)
167{
168 __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
169}

--- 4 unchanged lines hidden (view full) ---

174 if (__predict_false((condition)!=0)) { \
175 log(LOG_WARNING, "BUG: warning at %s:%d/%s()\n", __FILE__, __LINE__, __FUNCTION__); \
176 kdb_backtrace(); \
177 } \
178} while (0)
179
180
181#else /* !i386 && !amd64 */
159#define smp_mb() mb()
160
161#define L1_CACHE_BYTES 128
162static __inline
163void prefetch(void *x)
164{
165 __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
166}

--- 4 unchanged lines hidden (view full) ---

171 if (__predict_false((condition)!=0)) { \
172 log(LOG_WARNING, "BUG: warning at %s:%d/%s()\n", __FILE__, __LINE__, __FUNCTION__); \
173 kdb_backtrace(); \
174 } \
175} while (0)
176
177
178#else /* !i386 && !amd64 */
182#define mb()
183#define rmb()
184#define wmb()
185#define smp_mb()
186#define prefetch(x)
187#define L1_CACHE_BYTES 32
188#endif
189
179#define smp_mb()
180#define prefetch(x)
181#define L1_CACHE_BYTES 32
182#endif
183
190struct buf_ring {
191 caddr_t *br_ring;
192 volatile uint32_t br_cons;
193 volatile uint32_t br_prod;
194 int br_size;
195 struct mtx br_lock;
196};
197
198struct buf_ring *buf_ring_alloc(int count, int flags);
199void buf_ring_free(struct buf_ring *);
200
201static __inline int
202buf_ring_count(struct buf_ring *mr)
203{
204 int size = mr->br_size;
205 uint32_t mask = size - 1;
206
207 return ((size + mr->br_prod - mr->br_cons) & mask);
208}
209
210static __inline int
211buf_ring_empty(struct buf_ring *mr)
212{
213 return (mr->br_cons == mr->br_prod);
214}
215
216static __inline int
217buf_ring_full(struct buf_ring *mr)
218{
219 uint32_t mask;
220
221 mask = mr->br_size - 1;
222 return (mr->br_cons == ((mr->br_prod + 1) & mask));
223}
224
225/*
226 * The producer and consumer are independently locked
227 * this relies on the consumer providing his own serialization
228 *
229 */
230static __inline void *
231buf_ring_dequeue(struct buf_ring *mr)
232{
233 uint32_t prod, cons, mask;
234 caddr_t *ring, m;
235
236 ring = (caddr_t *)mr->br_ring;
237 mask = mr->br_size - 1;
238 cons = mr->br_cons;
239 mb();
240 prod = mr->br_prod;
241 m = NULL;
242 if (cons != prod) {
243 m = ring[cons];
244 ring[cons] = NULL;
245 mr->br_cons = (cons + 1) & mask;
246 mb();
247 }
248 return (m);
249}
250
251#ifdef DEBUG_BUFRING
252static __inline void
253__buf_ring_scan(struct buf_ring *mr, void *m, char *file, int line)
254{
255 int i;
256
257 for (i = 0; i < mr->br_size; i++)
258 if (m == mr->br_ring[i])
259 panic("%s:%d m=%p present prod=%d cons=%d idx=%d", file,
260 line, m, mr->br_prod, mr->br_cons, i);
261}
262
263static __inline void
264buf_ring_scan(struct buf_ring *mr, void *m, char *file, int line)
265{
266 mtx_lock(&mr->br_lock);
267 __buf_ring_scan(mr, m, file, line);
268 mtx_unlock(&mr->br_lock);
269}
270
271#else
272static __inline void
273__buf_ring_scan(struct buf_ring *mr, void *m, char *file, int line)
274{
275}
276
277static __inline void
278buf_ring_scan(struct buf_ring *mr, void *m, char *file, int line)
279{
280}
281#endif
282
283static __inline int
284__buf_ring_enqueue(struct buf_ring *mr, void *m, char *file, int line)
285{
286
287 uint32_t prod, cons, mask;
288 int err;
289
290 mask = mr->br_size - 1;
291 prod = mr->br_prod;
292 mb();
293 cons = mr->br_cons;
294 __buf_ring_scan(mr, m, file, line);
295 if (((prod + 1) & mask) != cons) {
296 KASSERT(mr->br_ring[prod] == NULL, ("overwriting entry"));
297 mr->br_ring[prod] = m;
298 mb();
299 mr->br_prod = (prod + 1) & mask;
300 err = 0;
301 } else
302 err = ENOBUFS;
303
304 return (err);
305}
306
307static __inline int
308buf_ring_enqueue_(struct buf_ring *mr, void *m, char *file, int line)
309{
310 int err;
311
312 mtx_lock(&mr->br_lock);
313 err = __buf_ring_enqueue(mr, m, file, line);
314 mtx_unlock(&mr->br_lock);
315
316 return (err);
317}
318
319#define buf_ring_enqueue(mr, m) buf_ring_enqueue_((mr), (m), __FILE__, __LINE__)
320
321
322static __inline void *
323buf_ring_peek(struct buf_ring *mr)
324{
325 int prod, cons, mask;
326 caddr_t *ring, m;
327
328 ring = (caddr_t *)mr->br_ring;
329 mask = mr->br_size - 1;
330 cons = mr->br_cons;
331 prod = mr->br_prod;
332 m = NULL;
333 if (cons != prod)
334 m = ring[cons];
335
336 return (m);
337}
338
339#define DBG_RX (1 << 0)
340static const int debug_flags = DBG_RX;
341
342#ifdef DEBUG_PRINT
343#define DBG(flag, msg) do { \
344 if ((flag & debug_flags)) \
345 printf msg; \
346} while (0)

--- 155 unchanged lines hidden ---
184#define DBG_RX (1 << 0)
185static const int debug_flags = DBG_RX;
186
187#ifdef DEBUG_PRINT
188#define DBG(flag, msg) do { \
189 if ((flag & debug_flags)) \
190 printf msg; \
191} while (0)

--- 155 unchanged lines hidden ---