aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/wl12xx/wl1271.h6
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_cmd.c3
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_main.c11
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_tx.c10
4 files changed, 12 insertions, 18 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271.h b/drivers/net/wireless/wl12xx/wl1271.h
index 41de47caa201..0deb4fdf916b 100644
--- a/drivers/net/wireless/wl12xx/wl1271.h
+++ b/drivers/net/wireless/wl12xx/wl1271.h
@@ -110,6 +110,9 @@ enum {
110#define WL1271_FW_NAME "wl1271-fw.bin" 110#define WL1271_FW_NAME "wl1271-fw.bin"
111#define WL1271_NVS_NAME "wl1271-nvs.bin" 111#define WL1271_NVS_NAME "wl1271-nvs.bin"
112 112
113#define WL1271_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff))
114#define WL1271_TX_SECURITY_HI32(s) ((u32)(((s) >> 16) & 0xffffffff))
115
113/* NVS data structure */ 116/* NVS data structure */
114#define WL1271_NVS_SECTION_SIZE 468 117#define WL1271_NVS_SECTION_SIZE 468
115 118
@@ -419,8 +422,7 @@ struct wl1271 {
419 422
420 /* Security sequence number counters */ 423 /* Security sequence number counters */
421 u8 tx_security_last_seq; 424 u8 tx_security_last_seq;
422 u16 tx_security_seq_16; 425 s64 tx_security_seq;
423 u32 tx_security_seq_32;
424 426
425 /* FW Rx counter */ 427 /* FW Rx counter */
426 u32 rx_counter; 428 u32 rx_counter;
diff --git a/drivers/net/wireless/wl12xx/wl1271_cmd.c b/drivers/net/wireless/wl12xx/wl1271_cmd.c
index e029bf03809d..d59b3830a6a5 100644
--- a/drivers/net/wireless/wl12xx/wl1271_cmd.c
+++ b/drivers/net/wireless/wl12xx/wl1271_cmd.c
@@ -318,8 +318,7 @@ int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type)
318 318
319 /* reset TX security counters */ 319 /* reset TX security counters */
320 wl->tx_security_last_seq = 0; 320 wl->tx_security_last_seq = 0;
321 wl->tx_security_seq_16 = 0; 321 wl->tx_security_seq = 0;
322 wl->tx_security_seq_32 = 0;
323 322
324 ret = wl1271_cmd_send(wl, CMD_START_JOIN, join, sizeof(*join), 0); 323 ret = wl1271_cmd_send(wl, CMD_START_JOIN, join, sizeof(*join), 0);
325 if (ret < 0) { 324 if (ret < 0) {
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c
index 4c4d22acaeea..f10ba847689d 100644
--- a/drivers/net/wireless/wl12xx/wl1271_main.c
+++ b/drivers/net/wireless/wl12xx/wl1271_main.c
@@ -1020,8 +1020,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
1020 wl->tx_results_count = 0; 1020 wl->tx_results_count = 0;
1021 wl->tx_packets_count = 0; 1021 wl->tx_packets_count = 0;
1022 wl->tx_security_last_seq = 0; 1022 wl->tx_security_last_seq = 0;
1023 wl->tx_security_seq_16 = 0; 1023 wl->tx_security_seq = 0;
1024 wl->tx_security_seq_32 = 0;
1025 wl->time_offset = 0; 1024 wl->time_offset = 0;
1026 wl->session_counter = 0; 1025 wl->session_counter = 0;
1027 wl->rate_set = CONF_TX_RATE_MASK_BASIC; 1026 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,
1428 key_type = KEY_TKIP; 1427 key_type = KEY_TKIP;
1429 1428
1430 key_conf->hw_key_idx = key_conf->keyidx; 1429 key_conf->hw_key_idx = key_conf->keyidx;
1431 tx_seq_32 = wl->tx_security_seq_32; 1430 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1432 tx_seq_16 = wl->tx_security_seq_16; 1431 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1433 break; 1432 break;
1434 case ALG_CCMP: 1433 case ALG_CCMP:
1435 key_type = KEY_AES; 1434 key_type = KEY_AES;
1436 1435
1437 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 1436 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1438 tx_seq_32 = wl->tx_security_seq_32; 1437 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1439 tx_seq_16 = wl->tx_security_seq_16; 1438 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1440 break; 1439 break;
1441 default: 1440 default:
1442 wl1271_error("Unknown key algo 0x%x", key_conf->alg); 1441 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
diff --git a/drivers/net/wireless/wl12xx/wl1271_tx.c b/drivers/net/wireless/wl12xx/wl1271_tx.c
index d3ed63e92cf4..1b11e2caabd6 100644
--- a/drivers/net/wireless/wl12xx/wl1271_tx.c
+++ b/drivers/net/wireless/wl12xx/wl1271_tx.c
@@ -303,7 +303,6 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
303{ 303{
304 struct ieee80211_tx_info *info; 304 struct ieee80211_tx_info *info;
305 struct sk_buff *skb; 305 struct sk_buff *skb;
306 u16 seq;
307 int id = result->id; 306 int id = result->id;
308 307
309 /* check for id legality */ 308 /* check for id legality */
@@ -331,15 +330,10 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
331 wl->stats.retry_count += result->ack_failures; 330 wl->stats.retry_count += result->ack_failures;
332 331
333 /* update security sequence number */ 332 /* update security sequence number */
334 seq = wl->tx_security_seq_16 + 333 wl->tx_security_seq += (result->lsb_security_sequence_number -
335 (result->lsb_security_sequence_number - 334 wl->tx_security_last_seq);
336 wl->tx_security_last_seq);
337 wl->tx_security_last_seq = result->lsb_security_sequence_number; 335 wl->tx_security_last_seq = result->lsb_security_sequence_number;
338 336
339 if (seq < wl->tx_security_seq_16)
340 wl->tx_security_seq_32++;
341 wl->tx_security_seq_16 = seq;
342
343 /* remove private header from packet */ 337 /* remove private header from packet */
344 skb_pull(skb, sizeof(struct wl1271_tx_hw_descr)); 338 skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
345 339