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 --- |