00001
00038 #ifndef BUFFER_H_INCLUDED
00039 #define BUFFER_H_INCLUDED
00040
00041 #include <dma.h>
00042 #include <slist.h>
00043 #include <types.h>
00044
00061 struct buffer {
00063 void *dma_desc;
00065 dma_addr_t addr;
00067 size_t len;
00069 struct slist_node node;
00070 };
00071
00078 static inline void buffer_init_tx(struct buffer *buf,
00079 const void *data, size_t len)
00080 {
00081 buf->addr = dma_map_single(data, len, DMA_TO_DEVICE);
00082 buf->len = len;
00083 }
00084
00093 static inline void buffer_init_tx_mapped(struct buffer *buf,
00094 dma_addr_t addr, size_t len)
00095 {
00096 buf->addr = addr;
00097 buf->len = len;
00098 }
00099
00106 static inline void buffer_init_rx(struct buffer *buf, void *data, size_t len)
00107 {
00108 buf->addr = dma_map_single(data, len, DMA_FROM_DEVICE);
00109 buf->len = len;
00110 }
00111
00119 static inline void buffer_init_rx_mapped(struct buffer *buf,
00120 dma_addr_t addr, size_t len)
00121 {
00122 buf->addr = addr;
00123 buf->len = len;
00124 }
00125
00126 extern struct buffer *buffer_alloc(void);
00127 extern void buffer_free(struct buffer *buf);
00128 extern void buffer_resize(struct buffer *buf, size_t new_size);
00129
00130 extern struct buffer *buffer_dma_alloc(size_t size);
00131 extern void buffer_dma_free(struct buffer *buf, size_t size);
00132
00133 extern void buffer_pool_init(void);
00134
00143
00145 #define buf_list_entry(slnode) \
00146 slist_entry(slnode, struct buffer, node)
00147
00148 #define buf_list_peek_head(list) \
00149 slist_peek_head(list, struct buffer, node)
00150
00151 #define buf_list_peek_tail(list) \
00152 slist_peek_tail(list, struct buffer, node)
00153
00154 #define buf_list_peek_next(buf) \
00155 slist_peek_next(&(buf)->node, struct buffer, node)
00156
00157 #define buf_list_pop_head(list) \
00158 slist_pop_head(list, struct buffer, node)
00159
00161
00163
00164 #endif