aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorLuciano Coelho <coelho@ti.com>2011-05-02 05:37:33 -0400
committerLuciano Coelho <coelho@ti.com>2011-05-02 05:46:40 -0400
commit25eaea30cd7b009ba2ca693708330d2f395cbc4d (patch)
tree1bdd81bf897ce181e644c380bfaed9a4e205849a /drivers/net/wireless
parent2d66bee7fbd38d28e9ed12f45b8e9db8e6aa0c49 (diff)
Revert "wl12xx: support FW TX inactivity triggers"
This reverts commit 47684808fd89d6809c0886e06f8ac324252499d8. Conflicts: drivers/net/wireless/wl12xx/conf.h drivers/net/wireless/wl12xx/main.c
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/wl12xx/acx.c34
-rw-r--r--drivers/net/wireless/wl12xx/acx.h12
-rw-r--r--drivers/net/wireless/wl12xx/boot.c6
-rw-r--r--drivers/net/wireless/wl12xx/cmd.c2
-rw-r--r--drivers/net/wireless/wl12xx/conf.h12
-rw-r--r--drivers/net/wireless/wl12xx/event.c47
-rw-r--r--drivers/net/wireless/wl12xx/event.h12
-rw-r--r--drivers/net/wireless/wl12xx/init.c6
-rw-r--r--drivers/net/wireless/wl12xx/main.c10
-rw-r--r--drivers/net/wireless/wl12xx/wl12xx.h1
10 files changed, 17 insertions, 125 deletions
diff --git a/drivers/net/wireless/wl12xx/acx.c b/drivers/net/wireless/wl12xx/acx.c
index ec0156b3e276..c6ee530e5bf7 100644
--- a/drivers/net/wireless/wl12xx/acx.c
+++ b/drivers/net/wireless/wl12xx/acx.c
@@ -1577,46 +1577,22 @@ out:
1577 return ret; 1577 return ret;
1578} 1578}
1579 1579
1580int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) 1580int wl1271_acx_max_tx_retry(struct wl1271 *wl)
1581{ 1581{
1582 struct wl1271_acx_ap_max_tx_retry *acx = NULL; 1582 struct wl1271_acx_max_tx_retry *acx = NULL;
1583 int ret; 1583 int ret;
1584 1584
1585 wl1271_debug(DEBUG_ACX, "acx ap max tx retry"); 1585 wl1271_debug(DEBUG_ACX, "acx max tx retry");
1586 1586
1587 acx = kzalloc(sizeof(*acx), GFP_KERNEL); 1587 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
1588 if (!acx) 1588 if (!acx)
1589 return -ENOMEM; 1589 return -ENOMEM;
1590 1590
1591 acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries); 1591 acx->max_tx_retry = cpu_to_le16(wl->conf.tx.ap_max_tx_retries);
1592 1592
1593 ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx)); 1593 ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx));
1594 if (ret < 0) { 1594 if (ret < 0) {
1595 wl1271_warning("acx ap max tx retry failed: %d", ret); 1595 wl1271_warning("acx max tx retry failed: %d", ret);
1596 goto out;
1597 }
1598
1599out:
1600 kfree(acx);
1601 return ret;
1602}
1603
1604int wl1271_acx_sta_max_tx_retry(struct wl1271 *wl)
1605{
1606 struct wl1271_acx_sta_max_tx_retry *acx = NULL;
1607 int ret;
1608
1609 wl1271_debug(DEBUG_ACX, "acx sta max tx retry");
1610
1611 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
1612 if (!acx)
1613 return -ENOMEM;
1614
1615 acx->max_tx_retry = wl->conf.tx.max_tx_retries;
1616
1617 ret = wl1271_cmd_configure(wl, ACX_CONS_TX_FAILURE, acx, sizeof(*acx));
1618 if (ret < 0) {
1619 wl1271_warning("acx sta max tx retry failed: %d", ret);
1620 goto out; 1596 goto out;
1621 } 1597 }
1622 1598
diff --git a/drivers/net/wireless/wl12xx/acx.h b/drivers/net/wireless/wl12xx/acx.h
index 75338f9947cf..9a895e3cc613 100644
--- a/drivers/net/wireless/wl12xx/acx.h
+++ b/drivers/net/wireless/wl12xx/acx.h
@@ -1153,7 +1153,7 @@ struct wl1271_acx_fw_tsf_information {
1153 u8 padding[3]; 1153 u8 padding[3];
1154} __packed; 1154} __packed;
1155 1155
1156struct wl1271_acx_ap_max_tx_retry { 1156struct wl1271_acx_max_tx_retry {
1157 struct acx_header header; 1157 struct acx_header header;
1158 1158
1159 /* 1159 /*
@@ -1164,13 +1164,6 @@ struct wl1271_acx_ap_max_tx_retry {
1164 u8 padding_1[2]; 1164 u8 padding_1[2];
1165} __packed; 1165} __packed;
1166 1166
1167struct wl1271_acx_sta_max_tx_retry {
1168 struct acx_header header;
1169
1170 u8 max_tx_retry;
1171 u8 padding_1[3];
1172} __packed;
1173
1174struct wl1271_acx_config_ps { 1167struct wl1271_acx_config_ps {
1175 struct acx_header header; 1168 struct acx_header header;
1176 1169
@@ -1391,8 +1384,7 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl,
1391int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, 1384int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn,
1392 bool enable); 1385 bool enable);
1393int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); 1386int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime);
1394int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl); 1387int wl1271_acx_max_tx_retry(struct wl1271 *wl);
1395int wl1271_acx_sta_max_tx_retry(struct wl1271 *wl);
1396int wl1271_acx_config_ps(struct wl1271 *wl); 1388int wl1271_acx_config_ps(struct wl1271 *wl);
1397int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); 1389int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr);
1398int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable); 1390int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable);
diff --git a/drivers/net/wireless/wl12xx/boot.c b/drivers/net/wireless/wl12xx/boot.c
index d263ebb6f974..2b0cf85788b3 100644
--- a/drivers/net/wireless/wl12xx/boot.c
+++ b/drivers/net/wireless/wl12xx/boot.c
@@ -478,12 +478,10 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
478 DISCONNECT_EVENT_COMPLETE_ID | 478 DISCONNECT_EVENT_COMPLETE_ID |
479 RSSI_SNR_TRIGGER_0_EVENT_ID | 479 RSSI_SNR_TRIGGER_0_EVENT_ID |
480 PSPOLL_DELIVERY_FAILURE_EVENT_ID | 480 PSPOLL_DELIVERY_FAILURE_EVENT_ID |
481 SOFT_GEMINI_SENSE_EVENT_ID | 481 SOFT_GEMINI_SENSE_EVENT_ID;
482 MAX_TX_RETRY_EVENT_ID;
483 482
484 if (wl->bss_type == BSS_TYPE_AP_BSS) 483 if (wl->bss_type == BSS_TYPE_AP_BSS)
485 wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID | 484 wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID;
486 INACTIVE_STA_EVENT_ID;
487 else 485 else
488 wl->event_mask |= DUMMY_PACKET_EVENT_ID; 486 wl->event_mask |= DUMMY_PACKET_EVENT_ID;
489 487
diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c
index d8596ae3a64f..2116a376c3f3 100644
--- a/drivers/net/wireless/wl12xx/cmd.c
+++ b/drivers/net/wireless/wl12xx/cmd.c
@@ -1080,7 +1080,7 @@ int wl1271_cmd_start_bss(struct wl1271 *wl)
1080 1080
1081 memcpy(cmd->bssid, bss_conf->bssid, ETH_ALEN); 1081 memcpy(cmd->bssid, bss_conf->bssid, ETH_ALEN);
1082 1082
1083 cmd->aging_period = cpu_to_le16(wl->conf.tx.ap_aging_period); 1083 cmd->aging_period = cpu_to_le16(WL1271_AP_DEF_INACTIV_SEC);
1084 cmd->bss_index = WL1271_AP_BSS_INDEX; 1084 cmd->bss_index = WL1271_AP_BSS_INDEX;
1085 cmd->global_hlid = WL1271_AP_GLOBAL_HLID; 1085 cmd->global_hlid = WL1271_AP_GLOBAL_HLID;
1086 cmd->broadcast_hlid = WL1271_AP_BROADCAST_HLID; 1086 cmd->broadcast_hlid = WL1271_AP_BROADCAST_HLID;
diff --git a/drivers/net/wireless/wl12xx/conf.h b/drivers/net/wireless/wl12xx/conf.h
index c0045f0b8b4e..1f947368f9ee 100644
--- a/drivers/net/wireless/wl12xx/conf.h
+++ b/drivers/net/wireless/wl12xx/conf.h
@@ -711,18 +711,10 @@ struct conf_tx_settings {
711 struct conf_tx_ac_category ac_conf[CONF_TX_MAX_AC_COUNT]; 711 struct conf_tx_ac_category ac_conf[CONF_TX_MAX_AC_COUNT];
712 712
713 /* 713 /*
714 * Allow this number of TX retries to a connected station/AP before an 714 * AP-mode - allow this number of TX retries to a station before an
715 * event is triggered from FW. 715 * event is triggered from FW.
716 * In AP-mode the hlids of unreachable stations are given in the
717 * "sta_tx_retry_exceeded" member in the event mailbox.
718 */ 716 */
719 u8 max_tx_retries; 717 u16 ap_max_tx_retries;
720
721 /*
722 * AP-mode - after this number of seconds a connected station is
723 * considered inactive.
724 */
725 u16 ap_aging_period;
726 718
727 /* 719 /*
728 * Configuration for TID parameters. 720 * Configuration for TID parameters.
diff --git a/drivers/net/wireless/wl12xx/event.c b/drivers/net/wireless/wl12xx/event.c
index d7be3aec6fc3..ae69330e807c 100644
--- a/drivers/net/wireless/wl12xx/event.c
+++ b/drivers/net/wireless/wl12xx/event.c
@@ -174,8 +174,6 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
174 u32 vector; 174 u32 vector;
175 bool beacon_loss = false; 175 bool beacon_loss = false;
176 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS); 176 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
177 bool disconnect_sta = false;
178 unsigned long sta_bitmap = 0;
179 177
180 wl1271_event_mbox_dump(mbox); 178 wl1271_event_mbox_dump(mbox);
181 179
@@ -237,54 +235,9 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
237 wl1271_tx_dummy_packet(wl); 235 wl1271_tx_dummy_packet(wl);
238 } 236 }
239 237
240 /*
241 * "TX retries exceeded" has a different meaning according to mode.
242 * In AP mode the offending station is disconnected. In STA mode we
243 * report connection loss.
244 */
245 if (vector & MAX_TX_RETRY_EVENT_ID) {
246 wl1271_debug(DEBUG_EVENT, "MAX_TX_RETRY_EVENT_ID");
247 if (is_ap) {
248 sta_bitmap |= le16_to_cpu(mbox->sta_tx_retry_exceeded);
249 disconnect_sta = true;
250 } else {
251 beacon_loss = true;
252 }
253 }
254
255 if ((vector & INACTIVE_STA_EVENT_ID) && is_ap) {
256 wl1271_debug(DEBUG_EVENT, "INACTIVE_STA_EVENT_ID");
257 sta_bitmap |= le16_to_cpu(mbox->sta_aging_status);
258 disconnect_sta = true;
259 }
260
261 if (wl->vif && beacon_loss) 238 if (wl->vif && beacon_loss)
262 ieee80211_connection_loss(wl->vif); 239 ieee80211_connection_loss(wl->vif);
263 240
264 if (is_ap && disconnect_sta) {
265 u32 num_packets = wl->conf.tx.max_tx_retries;
266 struct ieee80211_sta *sta;
267 const u8 *addr;
268 int h;
269
270 for (h = find_first_bit(&sta_bitmap, AP_MAX_LINKS);
271 h < AP_MAX_LINKS;
272 h = find_next_bit(&sta_bitmap, AP_MAX_LINKS, h+1)) {
273 if (!wl1271_is_active_sta(wl, h))
274 continue;
275
276 addr = wl->links[h].addr;
277
278 rcu_read_lock();
279 sta = ieee80211_find_sta(wl->vif, addr);
280 if (sta) {
281 wl1271_debug(DEBUG_EVENT, "remove sta %d", h);
282 ieee80211_report_low_ack(sta, num_packets);
283 }
284 rcu_read_unlock();
285 }
286 }
287
288 return 0; 241 return 0;
289} 242}
290 243
diff --git a/drivers/net/wireless/wl12xx/event.h b/drivers/net/wireless/wl12xx/event.h
index 7ae5a0821241..b6cf06e565a4 100644
--- a/drivers/net/wireless/wl12xx/event.h
+++ b/drivers/net/wireless/wl12xx/event.h
@@ -58,16 +58,13 @@ enum {
58 CHANNEL_SWITCH_COMPLETE_EVENT_ID = BIT(17), 58 CHANNEL_SWITCH_COMPLETE_EVENT_ID = BIT(17),
59 BSS_LOSE_EVENT_ID = BIT(18), 59 BSS_LOSE_EVENT_ID = BIT(18),
60 REGAINED_BSS_EVENT_ID = BIT(19), 60 REGAINED_BSS_EVENT_ID = BIT(19),
61 MAX_TX_RETRY_EVENT_ID = BIT(20), 61 ROAMING_TRIGGER_MAX_TX_RETRY_EVENT_ID = BIT(20),
62 /* STA: dummy paket for dynamic mem blocks */ 62 /* STA: dummy paket for dynamic mem blocks */
63 DUMMY_PACKET_EVENT_ID = BIT(21), 63 DUMMY_PACKET_EVENT_ID = BIT(21),
64 /* AP: STA remove complete */ 64 /* AP: STA remove complete */
65 STA_REMOVE_COMPLETE_EVENT_ID = BIT(21), 65 STA_REMOVE_COMPLETE_EVENT_ID = BIT(21),
66 SOFT_GEMINI_SENSE_EVENT_ID = BIT(22), 66 SOFT_GEMINI_SENSE_EVENT_ID = BIT(22),
67 /* STA: SG prediction */
68 SOFT_GEMINI_PREDICTION_EVENT_ID = BIT(23), 67 SOFT_GEMINI_PREDICTION_EVENT_ID = BIT(23),
69 /* AP: Inactive STA */
70 INACTIVE_STA_EVENT_ID = BIT(23),
71 SOFT_GEMINI_AVALANCHE_EVENT_ID = BIT(24), 68 SOFT_GEMINI_AVALANCHE_EVENT_ID = BIT(24),
72 PLT_RX_CALIBRATION_COMPLETE_EVENT_ID = BIT(25), 69 PLT_RX_CALIBRATION_COMPLETE_EVENT_ID = BIT(25),
73 DBG_EVENT_ID = BIT(26), 70 DBG_EVENT_ID = BIT(26),
@@ -122,11 +119,7 @@ struct event_mailbox {
122 119
123 /* AP FW only */ 120 /* AP FW only */
124 u8 hlid_removed; 121 u8 hlid_removed;
125
126 /* a bitmap of hlids for stations that have been inactive too long */
127 __le16 sta_aging_status; 122 __le16 sta_aging_status;
128
129 /* a bitmap of hlids for stations which didn't respond to TX */
130 __le16 sta_tx_retry_exceeded; 123 __le16 sta_tx_retry_exceeded;
131 124
132 u8 reserved_5[24]; 125 u8 reserved_5[24];
@@ -137,7 +130,4 @@ void wl1271_event_mbox_config(struct wl1271 *wl);
137int wl1271_event_handle(struct wl1271 *wl, u8 mbox); 130int wl1271_event_handle(struct wl1271 *wl, u8 mbox);
138void wl1271_pspoll_work(struct work_struct *work); 131void wl1271_pspoll_work(struct work_struct *work);
139 132
140/* Functions from main.c */
141bool wl1271_is_active_sta(struct wl1271 *wl, u8 hlid);
142
143#endif 133#endif
diff --git a/drivers/net/wireless/wl12xx/init.c b/drivers/net/wireless/wl12xx/init.c
index b1242a6de27b..a8f4f156c055 100644
--- a/drivers/net/wireless/wl12xx/init.c
+++ b/drivers/net/wireless/wl12xx/init.c
@@ -378,10 +378,6 @@ static int wl1271_sta_hw_init(struct wl1271 *wl)
378 if (ret < 0) 378 if (ret < 0)
379 return ret; 379 return ret;
380 380
381 ret = wl1271_acx_sta_max_tx_retry(wl);
382 if (ret < 0)
383 return ret;
384
385 ret = wl1271_acx_sta_mem_cfg(wl); 381 ret = wl1271_acx_sta_mem_cfg(wl);
386 if (ret < 0) 382 if (ret < 0)
387 return ret; 383 return ret;
@@ -432,7 +428,7 @@ static int wl1271_ap_hw_init(struct wl1271 *wl)
432 if (ret < 0) 428 if (ret < 0)
433 return ret; 429 return ret;
434 430
435 ret = wl1271_acx_ap_max_tx_retry(wl); 431 ret = wl1271_acx_max_tx_retry(wl);
436 if (ret < 0) 432 if (ret < 0)
437 return ret; 433 return ret;
438 434
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
index 6dd42c987663..6dab6f0c91bc 100644
--- a/drivers/net/wireless/wl12xx/main.c
+++ b/drivers/net/wireless/wl12xx/main.c
@@ -209,8 +209,7 @@ static struct conf_drv_settings default_conf = {
209 .tx_op_limit = 1504, 209 .tx_op_limit = 1504,
210 }, 210 },
211 }, 211 },
212 .max_tx_retries = 100, 212 .ap_max_tx_retries = 100,
213 .ap_aging_period = 300,
214 .tid_conf_count = 4, 213 .tid_conf_count = 4,
215 .tid_conf = { 214 .tid_conf = {
216 [CONF_TX_AC_BE] = { 215 [CONF_TX_AC_BE] = {
@@ -3021,12 +3020,6 @@ static void wl1271_free_sta(struct wl1271 *wl, u8 hlid)
3021 __clear_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map); 3020 __clear_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
3022} 3021}
3023 3022
3024bool wl1271_is_active_sta(struct wl1271 *wl, u8 hlid)
3025{
3026 int id = hlid - WL1271_AP_STA_HLID_START;
3027 return test_bit(id, wl->ap_hlid_map);
3028}
3029
3030static int wl1271_op_sta_add(struct ieee80211_hw *hw, 3023static int wl1271_op_sta_add(struct ieee80211_hw *hw,
3031 struct ieee80211_vif *vif, 3024 struct ieee80211_vif *vif,
3032 struct ieee80211_sta *sta) 3025 struct ieee80211_sta *sta)
@@ -3632,6 +3625,7 @@ int wl1271_init_ieee80211(struct wl1271 *wl)
3632 IEEE80211_HW_HAS_RATE_CONTROL | 3625 IEEE80211_HW_HAS_RATE_CONTROL |
3633 IEEE80211_HW_CONNECTION_MONITOR | 3626 IEEE80211_HW_CONNECTION_MONITOR |
3634 IEEE80211_HW_SUPPORTS_CQM_RSSI | 3627 IEEE80211_HW_SUPPORTS_CQM_RSSI |
3628 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3635 IEEE80211_HW_AP_LINK_PS; 3629 IEEE80211_HW_AP_LINK_PS;
3636 3630
3637 wl->hw->wiphy->cipher_suites = cipher_suites; 3631 wl->hw->wiphy->cipher_suites = cipher_suites;
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h
index f3de96212b96..b7601438ecac 100644
--- a/drivers/net/wireless/wl12xx/wl12xx.h
+++ b/drivers/net/wireless/wl12xx/wl12xx.h
@@ -172,6 +172,7 @@ extern u32 wl12xx_debug_level;
172#define WL1271_PS_STA_MAX_BLOCKS (2 * 9) 172#define WL1271_PS_STA_MAX_BLOCKS (2 * 9)
173 173
174#define WL1271_AP_BSS_INDEX 0 174#define WL1271_AP_BSS_INDEX 0
175#define WL1271_AP_DEF_INACTIV_SEC 300
175#define WL1271_AP_DEF_BEACON_EXP 20 176#define WL1271_AP_DEF_BEACON_EXP 20
176 177
177#define ACX_TX_DESCRIPTORS 32 178#define ACX_TX_DESCRIPTORS 32