wl1271: Clean up TX security sequence number handling
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Mon, 22 Feb 2010 06:38:40 +0000 (08:38 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 9 Mar 2010 20:03:04 +0000 (15:03 -0500)
Instead of managing the TX security sequence number as two variables, use
one 64 bit variable. This greatly simplifies the handling of the number.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Teemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1271.h
drivers/net/wireless/wl12xx/wl1271_cmd.c
drivers/net/wireless/wl12xx/wl1271_main.c
drivers/net/wireless/wl12xx/wl1271_tx.c

index 41de47caa201f1cc0dabfeb3d0ae7d164b66f552..0deb4fdf916b351896ed1b62a9975f3afe1e099e 100644 (file)
@@ -110,6 +110,9 @@ enum {
 #define WL1271_FW_NAME "wl1271-fw.bin"
 #define WL1271_NVS_NAME "wl1271-nvs.bin"
 
+#define WL1271_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff))
+#define WL1271_TX_SECURITY_HI32(s) ((u32)(((s) >> 16) & 0xffffffff))
+
 /* NVS data structure */
 #define WL1271_NVS_SECTION_SIZE                  468
 
@@ -419,8 +422,7 @@ struct wl1271 {
 
        /* Security sequence number counters */
        u8 tx_security_last_seq;
-       u16 tx_security_seq_16;
-       u32 tx_security_seq_32;
+       s64 tx_security_seq;
 
        /* FW Rx counter */
        u32 rx_counter;
index e029bf03809d81b9862e58cf742d8052340d8906..d59b3830a6a53c06d8b8baf6314f0e5770701801 100644 (file)
@@ -318,8 +318,7 @@ int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type)
 
        /* reset TX security counters */
        wl->tx_security_last_seq = 0;
-       wl->tx_security_seq_16 = 0;
-       wl->tx_security_seq_32 = 0;
+       wl->tx_security_seq = 0;
 
        ret = wl1271_cmd_send(wl, CMD_START_JOIN, join, sizeof(*join), 0);
        if (ret < 0) {
index 4c4d22acaeea0e99848367333f946313ad00c53b..f10ba847689df558ffaa4da99ef5ef74b4015b2e 100644 (file)
@@ -1020,8 +1020,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
        wl->tx_results_count = 0;
        wl->tx_packets_count = 0;
        wl->tx_security_last_seq = 0;
-       wl->tx_security_seq_16 = 0;
-       wl->tx_security_seq_32 = 0;
+       wl->tx_security_seq = 0;
        wl->time_offset = 0;
        wl->session_counter = 0;
        wl->rate_set = CONF_TX_RATE_MASK_BASIC;
@@ -1428,15 +1427,15 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                key_type = KEY_TKIP;
 
                key_conf->hw_key_idx = key_conf->keyidx;
-               tx_seq_32 = wl->tx_security_seq_32;
-               tx_seq_16 = wl->tx_security_seq_16;
+               tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
+               tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
                break;
        case ALG_CCMP:
                key_type = KEY_AES;
 
                key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
-               tx_seq_32 = wl->tx_security_seq_32;
-               tx_seq_16 = wl->tx_security_seq_16;
+               tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
+               tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
                break;
        default:
                wl1271_error("Unknown key algo 0x%x", key_conf->alg);
index d3ed63e92cf4fa5fa7ce23d938eff996de64f67c..1b11e2caabd6c89260ef2b126509b2ee01f7a130 100644 (file)
@@ -303,7 +303,6 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
 {
        struct ieee80211_tx_info *info;
        struct sk_buff *skb;
-       u16 seq;
        int id = result->id;
 
        /* check for id legality */
@@ -331,15 +330,10 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
        wl->stats.retry_count += result->ack_failures;
 
        /* update security sequence number */
-       seq = wl->tx_security_seq_16 +
-               (result->lsb_security_sequence_number -
-                wl->tx_security_last_seq);
+       wl->tx_security_seq += (result->lsb_security_sequence_number -
+                               wl->tx_security_last_seq);
        wl->tx_security_last_seq = result->lsb_security_sequence_number;
 
-       if (seq < wl->tx_security_seq_16)
-               wl->tx_security_seq_32++;
-       wl->tx_security_seq_16 = seq;
-
        /* remove private header from packet */
        skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));