aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ti/wl18xx/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ti/wl18xx/main.c')
-rw-r--r--drivers/net/wireless/ti/wl18xx/main.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index 8e562610bf16..717c4f5a02c2 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -378,6 +378,7 @@ static struct wlcore_conf wl18xx_conf = {
378 .keep_alive_interval = 55000, 378 .keep_alive_interval = 55000,
379 .max_listen_interval = 20, 379 .max_listen_interval = 20,
380 .sta_sleep_auth = WL1271_PSM_ILLEGAL, 380 .sta_sleep_auth = WL1271_PSM_ILLEGAL,
381 .suspend_rx_ba_activity = 0,
381 }, 382 },
382 .itrim = { 383 .itrim = {
383 .enable = false, 384 .enable = false,
@@ -567,6 +568,12 @@ static struct wl18xx_priv_conf wl18xx_default_priv_conf = {
567 .high_power_val_2nd = 0xff, 568 .high_power_val_2nd = 0xff,
568 .tx_rf_margin = 1, 569 .tx_rf_margin = 1,
569 }, 570 },
571 .ap_sleep = { /* disabled by default */
572 .idle_duty_cycle = 0,
573 .connected_duty_cycle = 0,
574 .max_stations_thresh = 0,
575 .idle_conn_thresh = 0,
576 },
570}; 577};
571 578
572static const struct wlcore_partition_set wl18xx_ptable[PART_TABLE_LEN] = { 579static const struct wlcore_partition_set wl18xx_ptable[PART_TABLE_LEN] = {
@@ -648,7 +655,7 @@ static const struct wl18xx_clk_cfg wl18xx_clk_table[NUM_CLOCK_CONFIGS] = {
648}; 655};
649 656
650/* TODO: maybe move to a new header file? */ 657/* TODO: maybe move to a new header file? */
651#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-3.bin" 658#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-4.bin"
652 659
653static int wl18xx_identify_chip(struct wl1271 *wl) 660static int wl18xx_identify_chip(struct wl1271 *wl)
654{ 661{
@@ -983,6 +990,7 @@ static int wl18xx_boot(struct wl1271 *wl)
983 990
984 wl->event_mask = BSS_LOSS_EVENT_ID | 991 wl->event_mask = BSS_LOSS_EVENT_ID |
985 SCAN_COMPLETE_EVENT_ID | 992 SCAN_COMPLETE_EVENT_ID |
993 RADAR_DETECTED_EVENT_ID |
986 RSSI_SNR_TRIGGER_0_EVENT_ID | 994 RSSI_SNR_TRIGGER_0_EVENT_ID |
987 PERIODIC_SCAN_COMPLETE_EVENT_ID | 995 PERIODIC_SCAN_COMPLETE_EVENT_ID |
988 PERIODIC_SCAN_REPORT_EVENT_ID | 996 PERIODIC_SCAN_REPORT_EVENT_ID |
@@ -1559,26 +1567,19 @@ static u32 wl18xx_pre_pkt_send(struct wl1271 *wl,
1559} 1567}
1560 1568
1561static void wl18xx_sta_rc_update(struct wl1271 *wl, 1569static void wl18xx_sta_rc_update(struct wl1271 *wl,
1562 struct wl12xx_vif *wlvif, 1570 struct wl12xx_vif *wlvif)
1563 struct ieee80211_sta *sta,
1564 u32 changed)
1565{ 1571{
1566 bool wide = sta->bandwidth >= IEEE80211_STA_RX_BW_40; 1572 bool wide = wlvif->rc_update_bw >= IEEE80211_STA_RX_BW_40;
1567 1573
1568 wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update wide %d", wide); 1574 wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update wide %d", wide);
1569 1575
1570 if (!(changed & IEEE80211_RC_BW_CHANGED))
1571 return;
1572
1573 mutex_lock(&wl->mutex);
1574
1575 /* sanity */ 1576 /* sanity */
1576 if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS)) 1577 if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS))
1577 goto out; 1578 return;
1578 1579
1579 /* ignore the change before association */ 1580 /* ignore the change before association */
1580 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 1581 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1581 goto out; 1582 return;
1582 1583
1583 /* 1584 /*
1584 * If we started out as wide, we can change the operation mode. If we 1585 * If we started out as wide, we can change the operation mode. If we
@@ -1589,9 +1590,6 @@ static void wl18xx_sta_rc_update(struct wl1271 *wl,
1589 wl18xx_acx_peer_ht_operation_mode(wl, wlvif->sta.hlid, wide); 1590 wl18xx_acx_peer_ht_operation_mode(wl, wlvif->sta.hlid, wide);
1590 else 1591 else
1591 ieee80211_connection_loss(wl12xx_wlvif_to_vif(wlvif)); 1592 ieee80211_connection_loss(wl12xx_wlvif_to_vif(wlvif));
1592
1593out:
1594 mutex_unlock(&wl->mutex);
1595} 1593}
1596 1594
1597static int wl18xx_set_peer_cap(struct wl1271 *wl, 1595static int wl18xx_set_peer_cap(struct wl1271 *wl,
@@ -1703,6 +1701,11 @@ static struct wlcore_ops wl18xx_ops = {
1703 .smart_config_start = wl18xx_cmd_smart_config_start, 1701 .smart_config_start = wl18xx_cmd_smart_config_start,
1704 .smart_config_stop = wl18xx_cmd_smart_config_stop, 1702 .smart_config_stop = wl18xx_cmd_smart_config_stop,
1705 .smart_config_set_group_key = wl18xx_cmd_smart_config_set_group_key, 1703 .smart_config_set_group_key = wl18xx_cmd_smart_config_set_group_key,
1704 .interrupt_notify = wl18xx_acx_interrupt_notify_config,
1705 .rx_ba_filter = wl18xx_acx_rx_ba_filter,
1706 .ap_sleep = wl18xx_acx_ap_sleep,
1707 .set_cac = wl18xx_cmd_set_cac,
1708 .dfs_master_restart = wl18xx_cmd_dfs_master_restart,
1706}; 1709};
1707 1710
1708/* HT cap appropriate for wide channels in 2Ghz */ 1711/* HT cap appropriate for wide channels in 2Ghz */
@@ -1796,6 +1799,10 @@ wl18xx_iface_combinations[] = {
1796 .limits = wl18xx_iface_ap_limits, 1799 .limits = wl18xx_iface_ap_limits,
1797 .n_limits = ARRAY_SIZE(wl18xx_iface_ap_limits), 1800 .n_limits = ARRAY_SIZE(wl18xx_iface_ap_limits),
1798 .num_different_channels = 1, 1801 .num_different_channels = 1,
1802 .radar_detect_widths = BIT(NL80211_CHAN_NO_HT) |
1803 BIT(NL80211_CHAN_HT20) |
1804 BIT(NL80211_CHAN_HT40MINUS) |
1805 BIT(NL80211_CHAN_HT40PLUS),
1799 } 1806 }
1800}; 1807};
1801 1808