/* * Definitions for the private skb data pool handlers. */ #ifndef _SAR_FASTSKB_H #define _SAR_FASTSKB_H #include <linux/types.h> #include <asm/system.h> //#define DATA_POOL_SIZE 64 #define DATA_POOL_SIZE 256 extern u8 *private_data_pool[DATA_POOL_SIZE]; extern int pvt_data_pool_producer; extern int pvt_data_pool_consumer; extern int enable_sar_fastskb; int flush_skb_data_bfr(void); // Get data buffer from pool static inline u8 *get_skb_data_bfr(void) { //jim add context protection to avoid... unsigned long flags; int tmp; u8 *data; if (!enable_sar_fastskb) return 0; local_irq_save(flags); tmp=(pvt_data_pool_consumer+1)&(DATA_POOL_SIZE-1); data=NULL; if (tmp!=pvt_data_pool_producer) { data = private_data_pool[tmp]; private_data_pool[tmp] = 0; pvt_data_pool_consumer = tmp; }; local_irq_restore(flags); return data; } // Return data buffer to pool static inline int put_skb_data_bfr(u8 *data) { unsigned long flags; int tmp; int rtn_val; if (!enable_sar_fastskb) return 0; local_irq_save(flags); tmp=(pvt_data_pool_producer+1)&(DATA_POOL_SIZE-1); rtn_val=0; if (tmp!=pvt_data_pool_consumer) { private_data_pool[pvt_data_pool_producer] = data; pvt_data_pool_producer = tmp; rtn_val = 1; }; local_irq_restore(flags); return rtn_val; } #endif /* _SAR_FASTSKB_H */