]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/rt2x00/rt2x00queue.h
rt2x00: Increase queue size
[linux-2.6] / drivers / net / wireless / rt2x00 / rt2x00queue.h
index 303d5568470d2d61758b150985645f4172d353e8..5dd9cca3c62cf72a3cf0ce48ab9772dfa6f85ef6 100644 (file)
 /**
  * DOC: Number of entries per queue
  *
- * After research it was concluded that 12 entries in a RX and TX
- * queue would be sufficient. Although this is almost one third of
- * the amount the legacy driver allocated, the queues aren't getting
- * filled to the maximum even when working with the maximum rate.
+ * Under normal load without fragmentation 12 entries are sufficient
+ * without the queue being filled up to the maximum. When using fragmentation
+ * and the queue threshold code we need to add some additional margins to
+ * make sure the queue will never (or only under extreme load) fill up
+ * completely.
+ * Since we don't use preallocated DMA having a large number of queue entries
+ * will have only minimal impact on the memory requirements for the queue.
  */
-#define RX_ENTRIES     12
-#define TX_ENTRIES     12
+#define RX_ENTRIES     24
+#define TX_ENTRIES     24
 #define BEACON_ENTRIES 1
-#define ATIM_ENTRIES   1
+#define ATIM_ENTRIES   8
 
 /**
  * enum data_queue_qid: Queue identification
@@ -82,11 +85,12 @@ enum data_queue_qid {
 /**
  * enum skb_frame_desc_flags: Flags for &struct skb_frame_desc
  *
- * @FRAME_DESC_DRIVER_GENERATED: Frame was generated inside driver
- *     and should not be reported back to mac80211 during txdone.
+ * @SKBDESC_DMA_MAPPED_RX: &skb_dma field has been mapped for RX
+ * @SKBDESC_DMA_MAPPED_TX: &skb_dma field has been mapped for TX
  */
 enum skb_frame_desc_flags {
-       FRAME_DESC_DRIVER_GENERATED = 1 << 0,
+       SKBDESC_DMA_MAPPED_RX = (1 << 0),
+       SKBDESC_DMA_MAPPED_TX = (1 << 1),
 };
 
 /**
@@ -96,23 +100,21 @@ enum skb_frame_desc_flags {
  * this structure should not exceed the size of that array (40 bytes).
  *
  * @flags: Frame flags, see &enum skb_frame_desc_flags.
- * @data: Pointer to data part of frame (Start of ieee80211 header).
+ * @desc_len: Length of the frame descriptor.
  * @desc: Pointer to descriptor part of the frame.
  *     Note that this pointer could point to something outside
  *     of the scope of the skb->data pointer.
- * @data_len: Length of the frame data.
- * @desc_len: Length of the frame descriptor.
+ * @skb_dma: (PCI-only) the DMA address associated with the sk buffer.
  * @entry: The entry to which this sk buffer belongs.
  */
 struct skb_frame_desc {
        unsigned int flags;
 
-       unsigned short data_len;
-       unsigned short desc_len;
-
-       void *data;
+       unsigned int desc_len;
        void *desc;
 
+       dma_addr_t skb_dma;
+
        struct queue_entry *entry;
 };
 
@@ -325,6 +327,7 @@ enum queue_index {
  *     index corruption due to concurrency.
  * @count: Number of frames handled in the queue.
  * @limit: Maximum number of entries in the queue.
+ * @threshold: Minimum number of free entries before queue is kicked by force.
  * @length: Number of frames in queue.
  * @index: Index pointers to entry positions in the queue,
  *     use &enum queue_index to get a specific index field.
@@ -343,6 +346,7 @@ struct data_queue {
        spinlock_t lock;
        unsigned int count;
        unsigned short limit;
+       unsigned short threshold;
        unsigned short length;
        unsigned short index[Q_INDEX_MAX];
 
@@ -466,6 +470,15 @@ static inline int rt2x00queue_available(struct data_queue *queue)
        return queue->limit - queue->length;
 }
 
+/**
+ * rt2x00queue_threshold - Check if the queue is below threshold
+ * @queue: Queue to check.
+ */
+static inline int rt2x00queue_threshold(struct data_queue *queue)
+{
+       return rt2x00queue_available(queue) < queue->threshold;
+}
+
 /**
  * rt2x00_desc_read - Read a word from the hardware descriptor.
  * @desc: Base descriptor address