wl12xx: fix Tx security sequence number handling
[pandora-kernel.git] / drivers / net / wireless / wl12xx / tx.h
index 02f07fa..7ed3c01 100644 (file)
@@ -25,7 +25,6 @@
 #ifndef __TX_H__
 #define __TX_H__
 
-#define TX_HW_BLOCK_SPARE                2
 #define TX_HW_BLOCK_SIZE                 252
 
 #define TX_HW_MGMT_PKT_LIFETIME_TU       2000
@@ -41,6 +40,7 @@
                                          BIT(8) | BIT(9))
 #define TX_HW_ATTR_LAST_WORD_PAD         (BIT(10) | BIT(11))
 #define TX_HW_ATTR_TX_CMPLT_REQ          BIT(12)
+#define TX_HW_ATTR_TX_DUMMY_REQ          BIT(13)
 
 #define TX_HW_ATTR_OFST_SAVE_RETRIES     0
 #define TX_HW_ATTR_OFST_HEADER_PAD       1
 #define WL1271_TX_ALIGN_TO 4
 #define WL1271_TKIP_IV_SPACE 4
 
+/* Used for management frames and dummy packets */
+#define WL1271_TID_MGMT 7
+
+struct wl127x_tx_mem {
+       /*
+        * Number of extra memory blocks to allocate for this packet
+        * in addition to the number of blocks derived from the packet
+        * length.
+        */
+       u8 extra_blocks;
+       /*
+        * Total number of memory blocks allocated by the host for
+        * this packet. Must be equal or greater than the actual
+        * blocks number allocated by HW.
+        */
+       u8 total_mem_blocks;
+} __packed;
+
+struct wl128x_tx_mem {
+       /*
+        * Total number of memory blocks allocated by the host for
+        * this packet.
+        */
+       u8 total_mem_blocks;
+       /*
+        * Number of extra bytes, at the end of the frame. the host
+        * uses this padding to complete each frame to integer number
+        * of SDIO blocks.
+        */
+       u8 extra_bytes;
+} __packed;
+
+/*
+ * On wl128x based devices, when TX packets are aggregated, each packet
+ * size must be aligned to the SDIO block size. The maximum block size
+ * is bounded by the type of the padded bytes field that is sent to the
+ * FW. Currently the type is u8, so the maximum block size is 256 bytes.
+ */
+#define WL12XX_BUS_BLOCK_SIZE min(512u,        \
+           (1u << (8 * sizeof(((struct wl128x_tx_mem *) 0)->extra_bytes))))
+
 struct wl1271_tx_hw_descr {
        /* Length of packet in words, including descriptor+header+data */
        __le16 length;
-       /* Number of extra memory blocks to allocate for this packet in
-          addition to the number of blocks derived from the packet length */
-       u8 extra_mem_blocks;
-       /* Total number of memory blocks allocated by the host for this packet.
-          Must be equal or greater than the actual blocks number allocated by
-          HW!! */
-       u8 total_mem_blocks;
+       union {
+               struct wl127x_tx_mem wl127x_mem;
+               struct wl128x_tx_mem wl128x_mem;
+       } __packed;
        /* Device time (in us) when the packet arrived to the driver */
        __le32 start_time;
-       /* Max delay in TUs until transmission. The last device time the
-          packet can be transmitted is: startTime+(1024*LifeTime) */
+       /*
+        * Max delay in TUs until transmission. The last device time the
+        * packet can be transmitted is: start_time + (1024 * life_time)
+        */
        __le16 life_time;
        /* Bitwise fields - see TX_ATTR... definitions above. */
        __le16 tx_attr;
@@ -110,7 +150,7 @@ struct wl1271_tx_hw_res_descr {
           (from 1st EDCA AIFS counter until TX Complete). */
        __le32 medium_delay;
        /* LS-byte of last TKIP seq-num (saved per AC for recovery). */
-       u8 lsb_security_sequence_number;
+       u8 tx_security_sequence_number_lsb;
        /* Retry count - number of transmissions without successful ACK.*/
        u8 ack_failures;
        /* The rate that succeeded getting ACK
@@ -145,7 +185,7 @@ static inline int wl1271_tx_get_queue(int queue)
 void wl1271_tx_work(struct work_struct *work);
 void wl1271_tx_work_locked(struct wl1271 *wl);
 void wl1271_tx_complete(struct wl1271 *wl);
-void wl1271_tx_reset(struct wl1271 *wl);
+void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues);
 void wl1271_tx_flush(struct wl1271 *wl);
 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
 u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set);