2 Copyright (C) 2004 - 2007 rt2x00 SourceForge Project
3 <http://rt2x00.serialmonkey.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the
17 Free Software Foundation, Inc.,
18 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 Abstract: rt2x00 ring datastructures and routines
31 * Summary of information that has been read from the
32 * RX frame descriptor.
34 struct rxdata_entry_desc {
44 * Summary of information that should be written into the
45 * descriptor for sending a TX frame.
47 struct txdata_entry_desc {
49 #define ENTRY_TXDONE 1
50 #define ENTRY_TXD_RTS_FRAME 2
51 #define ENTRY_TXD_OFDM_RATE 3
52 #define ENTRY_TXD_MORE_FRAG 4
53 #define ENTRY_TXD_REQ_TIMESTAMP 5
54 #define ENTRY_TXD_BURST 6
57 * Queue ID. ID's 0-4 are data TX rings
62 #define QUEUE_OTHER 15
83 * The data ring is a list of data entries.
84 * Each entry holds a reference to the descriptor
85 * and the data buffer. For TX rings the reference to the
86 * sk_buff of the packet being transmitted is also stored here.
93 #define ENTRY_OWNER_NIC 1
98 struct data_ring *ring;
101 * sk_buff for the packet which is being transmitted
102 * in this entry (Only used with TX related rings).
107 * Store a ieee80211_tx_status structure in each
108 * ring entry, this will optimize the txdone
111 struct ieee80211_tx_status tx_status;
114 * private pointer specific to driver.
119 * Data address for this entry.
127 * Data rings are used by the device to send and receive packets.
128 * The data_addr is the base address of the data memory.
129 * To determine at which point in the ring we are,
130 * have to use the rt2x00_ring_index_*() functions.
134 * Pointer to main rt2x00dev structure where this
137 struct rt2x00_dev *rt2x00dev;
140 * Base address for the device specific data entries.
142 struct data_entry *entry;
145 * TX queue statistic info.
147 struct ieee80211_tx_queue_stats_data stats;
150 * TX Queue parameters.
152 struct ieee80211_tx_queue_params tx_params;
155 * Base address for data ring.
167 * Size of packet and descriptor in bytes.
174 * Handlers to determine the address of the current device specific
175 * data entry, where either index or index_done points to.
177 static inline struct data_entry *rt2x00_get_data_entry(struct data_ring *ring)
179 return &ring->entry[ring->index];
182 static inline struct data_entry *rt2x00_get_data_entry_done(struct data_ring
185 return &ring->entry[ring->index_done];
191 static inline int rt2x00_get_ring_size(struct data_ring *ring)
193 return ring->stats.limit * (ring->desc_size + ring->data_size);
197 * Ring index manipulation functions.
199 static inline void rt2x00_ring_index_inc(struct data_ring *ring)
202 if (ring->index >= ring->stats.limit)
207 static inline void rt2x00_ring_index_done_inc(struct data_ring *ring)
210 if (ring->index_done >= ring->stats.limit)
211 ring->index_done = 0;
216 static inline void rt2x00_ring_index_clear(struct data_ring *ring)
219 ring->index_done = 0;
221 ring->stats.count = 0;
224 static inline int rt2x00_ring_empty(struct data_ring *ring)
226 return ring->stats.len == 0;
229 static inline int rt2x00_ring_full(struct data_ring *ring)
231 return ring->stats.len == ring->stats.limit;
234 static inline int rt2x00_ring_free(struct data_ring *ring)
236 return ring->stats.limit - ring->stats.len;
240 * TX/RX Descriptor access functions.
242 static inline void rt2x00_desc_read(__le32 *desc,
243 const u8 word, u32 *value)
245 *value = le32_to_cpu(desc[word]);
248 static inline void rt2x00_desc_write(__le32 *desc,
249 const u8 word, const u32 value)
251 desc[word] = cpu_to_le32(value);
254 #endif /* RT2X00RING_H */