diff options
Diffstat (limited to 'drivers/net/wireless/ath')
84 files changed, 7731 insertions, 7281 deletions
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h index c54b7d37bff..6169fbd23ed 100644 --- a/drivers/net/wireless/ath/ath.h +++ b/drivers/net/wireless/ath/ath.h @@ -143,6 +143,7 @@ struct ath_common {  	u32 keymax;  	DECLARE_BITMAP(keymap, ATH_KEYMAX);  	DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX); +	DECLARE_BITMAP(ccmp_keymap, ATH_KEYMAX);  	enum ath_crypt_caps crypt_caps;  	unsigned int clockrate; @@ -215,6 +216,7 @@ void ath_printk(const char *level, const struct ath_common *common,   *	used exclusively for WLAN-BT coexistence starting from   *	AR9462.   * @ATH_DBG_DFS: radar datection + * @ATH_DBG_WOW: Wake on Wireless   * @ATH_DBG_ANY: enable all debugging   *   * The debug level is used to control the amount and type of debugging output @@ -242,6 +244,7 @@ enum ATH_DEBUG {  	ATH_DBG_BSTUCK		= 0x00008000,  	ATH_DBG_MCI		= 0x00010000,  	ATH_DBG_DFS		= 0x00020000, +	ATH_DBG_WOW		= 0x00040000,  	ATH_DBG_ANY		= 0xffffffff  }; diff --git a/drivers/net/wireless/ath/ath5k/Kconfig b/drivers/net/wireless/ath/ath5k/Kconfig index e18a9aa7b6c..338c5c42357 100644 --- a/drivers/net/wireless/ath/ath5k/Kconfig +++ b/drivers/net/wireless/ath/ath5k/Kconfig @@ -64,3 +64,11 @@ config ATH5K_PCI  	---help---  	  This adds support for PCI type chipsets of the 5xxx Atheros  	  family. + +config ATH5K_TEST_CHANNELS +	bool "Enables testing channels on ath5k" +	depends on ATH5K && CFG80211_CERTIFICATION_ONUS +	---help--- +	  This enables non-standard IEEE 802.11 channels on ath5k, which +	  can be used for research purposes. This option should be disabled +	  unless doing research. diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 0ba81a66061..8c4c040a47b 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -74,10 +74,6 @@ bool ath5k_modparam_nohwcrypt;  module_param_named(nohwcrypt, ath5k_modparam_nohwcrypt, bool, S_IRUGO);  MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); -static bool modparam_all_channels; -module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO); -MODULE_PARM_DESC(all_channels, "Expose all channels the device can use."); -  static bool modparam_fastchanswitch;  module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO);  MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios."); @@ -258,8 +254,15 @@ static int ath5k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *re  \********************/  /* - * Returns true for the channel numbers used without all_channels modparam. + * Returns true for the channel numbers used.   */ +#ifdef CONFIG_ATH5K_TEST_CHANNELS +static bool ath5k_is_standard_channel(short chan, enum ieee80211_band band) +{ +	return true; +} + +#else  static bool ath5k_is_standard_channel(short chan, enum ieee80211_band band)  {  	if (band == IEEE80211_BAND_2GHZ && chan <= 14) @@ -276,6 +279,7 @@ static bool ath5k_is_standard_channel(short chan, enum ieee80211_band band)  		/* 802.11j 4.9GHz (20MHz) */  		(chan == 184 || chan == 188 || chan == 192 || chan == 196));  } +#endif  static unsigned int  ath5k_setup_channels(struct ath5k_hw *ah, struct ieee80211_channel *channels, @@ -316,8 +320,7 @@ ath5k_setup_channels(struct ath5k_hw *ah, struct ieee80211_channel *channels,  		if (!ath5k_channel_ok(ah, &channels[count]))  			continue; -		if (!modparam_all_channels && -		    !ath5k_is_standard_channel(ch, band)) +		if (!ath5k_is_standard_channel(ch, band))  			continue;  		count++; @@ -1045,11 +1048,11 @@ ath5k_drain_tx_buffs(struct ath5k_hw *ah)  				ath5k_txbuf_free_skb(ah, bf); -				spin_lock_bh(&ah->txbuflock); +				spin_lock(&ah->txbuflock);  				list_move_tail(&bf->list, &ah->txbuf);  				ah->txbuf_len++;  				txq->txq_len--; -				spin_unlock_bh(&ah->txbuflock); +				spin_unlock(&ah->txbuflock);  			}  			txq->link = NULL;  			txq->txq_poll_mark = false; @@ -2415,6 +2418,22 @@ ath5k_tx_complete_poll_work(struct work_struct *work)  * Initialization routines *  \*************************/ +static const struct ieee80211_iface_limit if_limits[] = { +	{ .max = 2048,	.types = BIT(NL80211_IFTYPE_STATION) }, +	{ .max = 4,	.types = +#ifdef CONFIG_MAC80211_MESH +				 BIT(NL80211_IFTYPE_MESH_POINT) | +#endif +				 BIT(NL80211_IFTYPE_AP) }, +}; + +static const struct ieee80211_iface_combination if_comb = { +	.limits = if_limits, +	.n_limits = ARRAY_SIZE(if_limits), +	.max_interfaces = 2048, +	.num_different_channels = 1, +}; +  int __devinit  ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)  { @@ -2436,6 +2455,9 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)  		BIT(NL80211_IFTYPE_ADHOC) |  		BIT(NL80211_IFTYPE_MESH_POINT); +	hw->wiphy->iface_combinations = &if_comb; +	hw->wiphy->n_iface_combinations = 1; +  	/* SW support for IBSS_RSN is provided by mac80211 */  	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c index 22b80af0f47..260e7dc7f75 100644 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c @@ -594,7 +594,7 @@ ath5k_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,  	qi.tqi_aifs = params->aifs;  	qi.tqi_cw_min = params->cw_min;  	qi.tqi_cw_max = params->cw_max; -	qi.tqi_burst_time = params->txop; +	qi.tqi_burst_time = params->txop * 32;  	ATH5K_DBG(ah, ATH5K_DEBUG_ANY,  		  "Configure tx [queue %d],  " diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c index b869a358ce4..86aeef4b9d7 100644 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c @@ -53,6 +53,11 @@  #define DEFAULT_BG_SCAN_PERIOD 60 +struct ath6kl_cfg80211_match_probe_ssid { +	struct cfg80211_ssid ssid; +	u8 flag; +}; +  static struct ieee80211_rate ath6kl_rates[] = {  	RATETAB_ENT(10, 0x1, 0),  	RATETAB_ENT(20, 0x2, 0), @@ -576,6 +581,9 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,  	vif->nw_type = vif->next_mode; +	/* enable enhanced bmiss detection if applicable */ +	ath6kl_cfg80211_sta_bmiss_enhance(vif, true); +  	if (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)  		nw_subtype = SUBTYPE_P2PCLIENT; @@ -852,20 +860,6 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,  		}  	} -	/* -	 * Send a disconnect command to target when a disconnect event is -	 * received with reason code other than 3 (DISCONNECT_CMD - disconnect -	 * request from host) to make the firmware stop trying to connect even -	 * after giving disconnect event. There will be one more disconnect -	 * event for this disconnect command with reason code DISCONNECT_CMD -	 * which will be notified to cfg80211. -	 */ - -	if (reason != DISCONNECT_CMD) { -		ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx); -		return; -	} -  	clear_bit(CONNECT_PEND, &vif->flags);  	if (vif->sme_state == SME_CONNECTING) { @@ -875,32 +869,96 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,  					WLAN_STATUS_UNSPECIFIED_FAILURE,  					GFP_KERNEL);  	} else if (vif->sme_state == SME_CONNECTED) { -		cfg80211_disconnected(vif->ndev, reason, +		cfg80211_disconnected(vif->ndev, proto_reason,  				      NULL, 0, GFP_KERNEL);  	}  	vif->sme_state = SME_DISCONNECTED; + +	/* +	 * Send a disconnect command to target when a disconnect event is +	 * received with reason code other than 3 (DISCONNECT_CMD - disconnect +	 * request from host) to make the firmware stop trying to connect even +	 * after giving disconnect event. There will be one more disconnect +	 * event for this disconnect command with reason code DISCONNECT_CMD +	 * which won't be notified to cfg80211. +	 */ +	if (reason != DISCONNECT_CMD) +		ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx);  }  static int ath6kl_set_probed_ssids(struct ath6kl *ar,  				   struct ath6kl_vif *vif, -				   struct cfg80211_ssid *ssids, int n_ssids) +				   struct cfg80211_ssid *ssids, int n_ssids, +				   struct cfg80211_match_set *match_set, +				   int n_match_ssid)  { -	u8 i; +	u8 i, j, index_to_add, ssid_found = false; +	struct ath6kl_cfg80211_match_probe_ssid ssid_list[MAX_PROBED_SSIDS]; + +	memset(ssid_list, 0, sizeof(ssid_list)); -	if (n_ssids > MAX_PROBED_SSID_INDEX) +	if (n_ssids > MAX_PROBED_SSIDS || +	    n_match_ssid > MAX_PROBED_SSIDS)  		return -EINVAL;  	for (i = 0; i < n_ssids; i++) { +		memcpy(ssid_list[i].ssid.ssid, +		       ssids[i].ssid, +		       ssids[i].ssid_len); +		ssid_list[i].ssid.ssid_len = ssids[i].ssid_len; + +		if (ssids[i].ssid_len) +			ssid_list[i].flag = SPECIFIC_SSID_FLAG; +		else +			ssid_list[i].flag = ANY_SSID_FLAG; + +		if (n_match_ssid == 0) +			ssid_list[i].flag |= MATCH_SSID_FLAG; +	} + +	index_to_add = i; + +	for (i = 0; i < n_match_ssid; i++) { +		ssid_found = false; + +		for (j = 0; j < n_ssids; j++) { +			if ((match_set[i].ssid.ssid_len == +			     ssid_list[j].ssid.ssid_len) && +			    (!memcmp(ssid_list[j].ssid.ssid, +				     match_set[i].ssid.ssid, +				     match_set[i].ssid.ssid_len))) { +				ssid_list[j].flag |= MATCH_SSID_FLAG; +				ssid_found = true; +				break; +			} +		} + +		if (ssid_found) +			continue; + +		if (index_to_add >= MAX_PROBED_SSIDS) +			continue; + +		ssid_list[index_to_add].ssid.ssid_len = +			match_set[i].ssid.ssid_len; +		memcpy(ssid_list[index_to_add].ssid.ssid, +		       match_set[i].ssid.ssid, +		       match_set[i].ssid.ssid_len); +		ssid_list[index_to_add].flag |= MATCH_SSID_FLAG; +		index_to_add++; +	} + +	for (i = 0; i < index_to_add; i++) {  		ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, -					  ssids[i].ssid_len ? -					  SPECIFIC_SSID_FLAG : ANY_SSID_FLAG, -					  ssids[i].ssid_len, -					  ssids[i].ssid); +					  ssid_list[i].flag, +					  ssid_list[i].ssid.ssid_len, +					  ssid_list[i].ssid.ssid); +  	}  	/* Make sure no old entries are left behind */ -	for (i = n_ssids; i < MAX_PROBED_SSID_INDEX; i++) { +	for (i = index_to_add; i < MAX_PROBED_SSIDS; i++) {  		ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i,  					  DISABLE_SSID_FLAG, 0, NULL);  	} @@ -908,11 +966,11 @@ static int ath6kl_set_probed_ssids(struct ath6kl *ar,  	return 0;  } -static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, +static int ath6kl_cfg80211_scan(struct wiphy *wiphy,  				struct cfg80211_scan_request *request)  { -	struct ath6kl *ar = ath6kl_priv(ndev); -	struct ath6kl_vif *vif = netdev_priv(ndev); +	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(request->wdev); +	struct ath6kl *ar = ath6kl_priv(vif->ndev);  	s8 n_channels = 0;  	u16 *channels = NULL;  	int ret = 0; @@ -934,7 +992,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,  	}  	ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, -				      request->n_ssids); +				      request->n_ssids, NULL, 0);  	if (ret < 0)  		return ret; @@ -943,7 +1001,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,  				       WMI_FRAME_PROBE_REQ,  				       request->ie, request->ie_len);  	if (ret) { -		ath6kl_err("failed to set Probe Request appie for scan"); +		ath6kl_err("failed to set Probe Request appie for scan\n");  		return ret;  	} @@ -1429,14 +1487,14 @@ static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,  	return 0;  } -static struct net_device *ath6kl_cfg80211_add_iface(struct wiphy *wiphy, -						    char *name, -						    enum nl80211_iftype type, -						    u32 *flags, -						    struct vif_params *params) +static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy, +						      char *name, +						      enum nl80211_iftype type, +						      u32 *flags, +						      struct vif_params *params)  {  	struct ath6kl *ar = wiphy_priv(wiphy); -	struct net_device *ndev; +	struct wireless_dev *wdev;  	u8 if_idx, nw_type;  	if (ar->num_vif == ar->vif_max) { @@ -1449,20 +1507,20 @@ static struct net_device *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,  		return ERR_PTR(-EINVAL);  	} -	ndev = ath6kl_interface_add(ar, name, type, if_idx, nw_type); -	if (!ndev) +	wdev = ath6kl_interface_add(ar, name, type, if_idx, nw_type); +	if (!wdev)  		return ERR_PTR(-ENOMEM);  	ar->num_vif++; -	return ndev; +	return wdev;  }  static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy, -				     struct net_device *ndev) +				     struct wireless_dev *wdev)  {  	struct ath6kl *ar = wiphy_priv(wiphy); -	struct ath6kl_vif *vif = netdev_priv(ndev); +	struct ath6kl_vif *vif = netdev_priv(wdev->netdev);  	spin_lock_bh(&ar->list_lock);  	list_del(&vif->list); @@ -1512,6 +1570,9 @@ static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,  		}  	} +	/* need to clean up enhanced bmiss detection fw state */ +	ath6kl_cfg80211_sta_bmiss_enhance(vif, false); +  set_iface_type:  	switch (type) {  	case NL80211_IFTYPE_STATION: @@ -2074,7 +2135,9 @@ static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)  	if (wow && (wow->n_patterns > WOW_MAX_FILTERS_PER_LIST))  		return -EINVAL; -	if (!test_bit(NETDEV_MCAST_ALL_ON, &vif->flags)) { +	if (!test_bit(NETDEV_MCAST_ALL_ON, &vif->flags) && +	    test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, +		     ar->fw_capabilities)) {  		ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi,  						vif->fw_vif_idx, false);  		if (ret) @@ -2209,7 +2272,9 @@ static int ath6kl_wow_resume(struct ath6kl *ar)  	ar->state = ATH6KL_STATE_ON; -	if (!test_bit(NETDEV_MCAST_ALL_OFF, &vif->flags)) { +	if (!test_bit(NETDEV_MCAST_ALL_OFF, &vif->flags) && +	    test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, +		     ar->fw_capabilities)) {  		ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi,  					vif->fw_vif_idx, true);  		if (ret) @@ -2475,7 +2540,7 @@ void ath6kl_check_wow_status(struct ath6kl *ar)  static int ath6kl_set_htcap(struct ath6kl_vif *vif, enum ieee80211_band band,  			    bool ht_enable)  { -	struct ath6kl_htcap *htcap = &vif->htcap; +	struct ath6kl_htcap *htcap = &vif->htcap[band];  	if (htcap->ht_enable == ht_enable)  		return 0; @@ -2585,33 +2650,28 @@ static int ath6kl_set_ies(struct ath6kl_vif *vif,  	return 0;  } -static int ath6kl_set_channel(struct wiphy *wiphy, struct net_device *dev, -			      struct ieee80211_channel *chan, -			      enum nl80211_channel_type channel_type) +void ath6kl_cfg80211_sta_bmiss_enhance(struct ath6kl_vif *vif, bool enable)  { -	struct ath6kl_vif *vif; +	int err; -	/* -	 * 'dev' could be NULL if a channel change is required for the hardware -	 * device itself, instead of a particular VIF. -	 * -	 * FIXME: To be handled properly when monitor mode is supported. -	 */ -	if (!dev) -		return -EBUSY; +	if (WARN_ON(!test_bit(WMI_READY, &vif->ar->flag))) +		return; -	vif = netdev_priv(dev); +	if (vif->nw_type != INFRA_NETWORK) +		return; -	if (!ath6kl_cfg80211_ready(vif)) -		return -EIO; +	if (!test_bit(ATH6KL_FW_CAPABILITY_BMISS_ENHANCE, +		      vif->ar->fw_capabilities)) +		return; -	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: center_freq=%u hw_value=%u\n", -		   __func__, chan->center_freq, chan->hw_value); -	vif->next_chan = chan->center_freq; -	vif->next_ch_type = channel_type; -	vif->next_ch_band = chan->band; +	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s fw bmiss enhance\n", +		   enable ? "enable" : "disable"); -	return 0; +	err = ath6kl_wmi_sta_bmiss_enhance_cmd(vif->ar->wmi, +					       vif->fw_vif_idx, enable); +	if (err) +		ath6kl_err("failed to %s enhanced bmiss detection: %d\n", +			   enable ? "enable" : "disable", err);  }  static int ath6kl_get_rsn_capab(struct cfg80211_beacon_data *beacon, @@ -2694,9 +2754,15 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,  	/* TODO:  	 * info->interval -	 * info->dtim_period  	 */ +	ret = ath6kl_wmi_ap_set_dtim_cmd(ar->wmi, vif->fw_vif_idx, +					 info->dtim_period); + +	/* ignore error, just print a warning and continue normally */ +	if (ret) +		ath6kl_warn("Failed to set dtim_period in beacon: %d\n", ret); +  	if (info->beacon.head == NULL)  		return -EINVAL;  	mgmt = (struct ieee80211_mgmt *) info->beacon.head; @@ -2791,7 +2857,7 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,  	p.ssid_len = vif->ssid_len;  	memcpy(p.ssid, vif->ssid, vif->ssid_len);  	p.dot11_auth_mode = vif->dot11_auth_mode; -	p.ch = cpu_to_le16(vif->next_chan); +	p.ch = cpu_to_le16(info->channel->center_freq);  	/* Enable uAPSD support by default */  	res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true); @@ -2815,8 +2881,8 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,  			return res;  	} -	if (ath6kl_set_htcap(vif, vif->next_ch_band, -			     vif->next_ch_type != NL80211_CHAN_NO_HT)) +	if (ath6kl_set_htcap(vif, info->channel->band, +			     info->channel_type != NL80211_CHAN_NO_HT))  		return -EIO;  	/* @@ -2909,14 +2975,14 @@ static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,  }  static int ath6kl_remain_on_channel(struct wiphy *wiphy, -				    struct net_device *dev, +				    struct wireless_dev *wdev,  				    struct ieee80211_channel *chan,  				    enum nl80211_channel_type channel_type,  				    unsigned int duration,  				    u64 *cookie)  { -	struct ath6kl *ar = ath6kl_priv(dev); -	struct ath6kl_vif *vif = netdev_priv(dev); +	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); +	struct ath6kl *ar = ath6kl_priv(vif->ndev);  	u32 id;  	/* TODO: if already pending or ongoing remain-on-channel, @@ -2933,11 +2999,11 @@ static int ath6kl_remain_on_channel(struct wiphy *wiphy,  }  static int ath6kl_cancel_remain_on_channel(struct wiphy *wiphy, -					   struct net_device *dev, +					   struct wireless_dev *wdev,  					   u64 cookie)  { -	struct ath6kl *ar = ath6kl_priv(dev); -	struct ath6kl_vif *vif = netdev_priv(dev); +	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); +	struct ath6kl *ar = ath6kl_priv(vif->ndev);  	if (cookie != vif->last_roc_id)  		return -ENOENT; @@ -3068,15 +3134,15 @@ static bool ath6kl_is_p2p_go_ssid(const u8 *buf, size_t len)  	return false;  } -static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct net_device *dev, +static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,  			  struct ieee80211_channel *chan, bool offchan,  			  enum nl80211_channel_type channel_type,  			  bool channel_type_valid, unsigned int wait,  			  const u8 *buf, size_t len, bool no_cck,  			  bool dont_wait_for_ack, u64 *cookie)  { -	struct ath6kl *ar = ath6kl_priv(dev); -	struct ath6kl_vif *vif = netdev_priv(dev); +	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); +	struct ath6kl *ar = ath6kl_priv(vif->ndev);  	u32 id;  	const struct ieee80211_mgmt *mgmt;  	bool more_data, queued; @@ -3121,10 +3187,10 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,  }  static void ath6kl_mgmt_frame_register(struct wiphy *wiphy, -				       struct net_device *dev, +				       struct wireless_dev *wdev,  				       u16 frame_type, bool reg)  { -	struct ath6kl_vif *vif = netdev_priv(dev); +	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);  	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: frame_type=0x%x reg=%d\n",  		   __func__, frame_type, reg); @@ -3160,10 +3226,24 @@ static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,  	ath6kl_cfg80211_scan_complete_event(vif, true);  	ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, -				      request->n_ssids); +				      request->n_ssids, +				      request->match_sets, +				      request->n_match_sets);  	if (ret < 0)  		return ret; +	if (!request->n_match_sets) { +		ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, +					       ALL_BSS_FILTER, 0); +		if (ret < 0) +			return ret; +	} else { +		 ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, +						MATCHED_SSID_FILTER, 0); +		if (ret < 0) +			return ret; +	} +  	/* fw uses seconds, also make sure that it's >0 */  	interval = max_t(u16, 1, request->interval / 1000); @@ -3185,7 +3265,7 @@ static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,  				       WMI_FRAME_PROBE_REQ,  				       request->ie, request->ie_len);  	if (ret) { -		ath6kl_warn("Failed to set probe request IE for scheduled scan: %d", +		ath6kl_warn("Failed to set probe request IE for scheduled scan: %d\n",  			    ret);  		return ret;  	} @@ -3217,6 +3297,18 @@ static int ath6kl_cfg80211_sscan_stop(struct wiphy *wiphy,  	return 0;  } +static int ath6kl_cfg80211_set_bitrate(struct wiphy *wiphy, +				       struct net_device *dev, +				       const u8 *addr, +				       const struct cfg80211_bitrate_mask *mask) +{ +	struct ath6kl *ar = ath6kl_priv(dev); +	struct ath6kl_vif *vif = netdev_priv(dev); + +	return ath6kl_wmi_set_bitrate_mask(ar->wmi, vif->fw_vif_idx, +					   mask); +} +  static const struct ieee80211_txrx_stypes  ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = {  	[NL80211_IFTYPE_STATION] = { @@ -3271,7 +3363,6 @@ static struct cfg80211_ops ath6kl_cfg80211_ops = {  	.suspend = __ath6kl_cfg80211_suspend,  	.resume = __ath6kl_cfg80211_resume,  #endif -	.set_channel = ath6kl_set_channel,  	.start_ap = ath6kl_start_ap,  	.change_beacon = ath6kl_change_beacon,  	.stop_ap = ath6kl_stop_ap, @@ -3283,6 +3374,7 @@ static struct cfg80211_ops ath6kl_cfg80211_ops = {  	.mgmt_frame_register = ath6kl_mgmt_frame_register,  	.sched_scan_start = ath6kl_cfg80211_sscan_start,  	.sched_scan_stop = ath6kl_cfg80211_sscan_stop, +	.set_bitrate_mask = ath6kl_cfg80211_set_bitrate,  };  void ath6kl_cfg80211_stop(struct ath6kl_vif *vif) @@ -3385,9 +3477,9 @@ void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)  	ar->num_vif--;  } -struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name, -					enum nl80211_iftype type, u8 fw_vif_idx, -					u8 nw_type) +struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, char *name, +					  enum nl80211_iftype type, +					  u8 fw_vif_idx, u8 nw_type)  {  	struct net_device *ndev;  	struct ath6kl_vif *vif; @@ -3410,7 +3502,8 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,  	vif->listen_intvl_t = ATH6KL_DEFAULT_LISTEN_INTVAL;  	vif->bmiss_time_t = ATH6KL_DEFAULT_BMISS_TIME;  	vif->bg_scan_period = 0; -	vif->htcap.ht_enable = true; +	vif->htcap[IEEE80211_BAND_2GHZ].ht_enable = true; +	vif->htcap[IEEE80211_BAND_5GHZ].ht_enable = true;  	memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);  	if (fw_vif_idx != 0) @@ -3440,7 +3533,7 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,  	list_add_tail(&vif->list, &ar->vif_list);  	spin_unlock_bh(&ar->list_lock); -	return ndev; +	return &vif->wdev;  err:  	aggr_module_destroy(vif->aggr_cntxt); @@ -3470,7 +3563,13 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)  	}  	/* max num of ssids that can be probed during scanning */ -	wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX; +	wiphy->max_scan_ssids = MAX_PROBED_SSIDS; + +	/* max num of ssids that can be matched after scan */ +	if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN_MATCH_LIST, +		     ar->fw_capabilities)) +		wiphy->max_match_sets = MAX_PROBED_SSIDS; +  	wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */  	switch (ar->hw.cap) {  	case WMI_11AN_CAP: @@ -3507,6 +3606,17 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)  		ath6kl_band_5ghz.ht_cap.cap = 0;  		ath6kl_band_5ghz.ht_cap.ht_supported = false;  	} + +	if (ar->hw.flags & ATH6KL_HW_FLAG_64BIT_RATES) { +		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff; +		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff; +		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[1] = 0xff; +		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[1] = 0xff; +	} else { +		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff; +		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff; +	} +  	if (band_2gig)  		wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;  	if (band_5gig) @@ -3517,6 +3627,7 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)  	wiphy->cipher_suites = cipher_suites;  	wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); +#ifdef CONFIG_PM  	wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |  			      WIPHY_WOWLAN_DISCONNECT |  			      WIPHY_WOWLAN_GTK_REKEY_FAILURE  | @@ -3526,8 +3637,9 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)  	wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;  	wiphy->wowlan.pattern_min_len = 1;  	wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE; +#endif -	wiphy->max_sched_scan_ssids = MAX_PROBED_SSID_INDEX; +	wiphy->max_sched_scan_ssids = MAX_PROBED_SSIDS;  	ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM |  			    WIPHY_FLAG_HAVE_AP_SME | diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.h b/drivers/net/wireless/ath/ath6kl/cfg80211.h index 5ea8cbb79f4..56b1ebe7981 100644 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.h +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.h @@ -25,9 +25,9 @@ enum ath6kl_cfg_suspend_mode {  	ATH6KL_CFG_SUSPEND_SCHED_SCAN,  }; -struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name, -					enum nl80211_iftype type, -					u8 fw_vif_idx, u8 nw_type); +struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, char *name, +					  enum nl80211_iftype type, +					  u8 fw_vif_idx, u8 nw_type);  void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,  				      enum wmi_phy_mode mode);  void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted); @@ -62,5 +62,7 @@ void ath6kl_cfg80211_cleanup(struct ath6kl *ar);  struct ath6kl *ath6kl_cfg80211_create(void);  void ath6kl_cfg80211_destroy(struct ath6kl *ar); +/* TODO: remove this once ath6kl_vif_cleanup() is moved to cfg80211.c */ +void ath6kl_cfg80211_sta_bmiss_enhance(struct ath6kl_vif *vif, bool enable);  #endif /* ATH6KL_CFG80211_H */ diff --git a/drivers/net/wireless/ath/ath6kl/core.c b/drivers/net/wireless/ath/ath6kl/core.c index fdb3b1decc7..82c4dd2a960 100644 --- a/drivers/net/wireless/ath/ath6kl/core.c +++ b/drivers/net/wireless/ath/ath6kl/core.c @@ -56,7 +56,7 @@ EXPORT_SYMBOL(ath6kl_core_rx_complete);  int ath6kl_core_init(struct ath6kl *ar, enum ath6kl_htc_type htc_type)  {  	struct ath6kl_bmi_target_info targ_info; -	struct net_device *ndev; +	struct wireless_dev *wdev;  	int ret = 0, i;  	switch (htc_type) { @@ -187,12 +187,12 @@ int ath6kl_core_init(struct ath6kl *ar, enum ath6kl_htc_type htc_type)  	rtnl_lock();  	/* Add an initial station interface */ -	ndev = ath6kl_interface_add(ar, "wlan%d", NL80211_IFTYPE_STATION, 0, +	wdev = ath6kl_interface_add(ar, "wlan%d", NL80211_IFTYPE_STATION, 0,  				    INFRA_NETWORK);  	rtnl_unlock(); -	if (!ndev) { +	if (!wdev) {  		ath6kl_err("Failed to instantiate a network device\n");  		ret = -ENOMEM;  		wiphy_unregister(ar->wiphy); @@ -200,7 +200,7 @@ int ath6kl_core_init(struct ath6kl *ar, enum ath6kl_htc_type htc_type)  	}  	ath6kl_dbg(ATH6KL_DBG_TRC, "%s: name=%s dev=0x%p, ar=0x%p\n", -		   __func__, ndev->name, ndev, ar); +		   __func__, wdev->netdev->name, wdev->netdev, ar);  	return ret; diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h index 4d9c6f14269..cec49a31029 100644 --- a/drivers/net/wireless/ath/ath6kl/core.h +++ b/drivers/net/wireless/ath/ath6kl/core.h @@ -100,6 +100,21 @@ enum ath6kl_fw_capability {  	/* Firmware has support to override rsn cap of rsn ie */  	ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE, +	/* +	 * Multicast support in WOW and host awake mode. +	 * Allow all multicast in host awake mode. +	 * Apply multicast filter in WOW mode. +	 */ +	ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, + +	/* Firmware supports enhanced bmiss detection */ +	ATH6KL_FW_CAPABILITY_BMISS_ENHANCE, + +	/* +	 * FW supports matching of ssid in schedule scan +	 */ +	ATH6KL_FW_CAPABILITY_SCHED_SCAN_MATCH_LIST, +  	/* this needs to be last */  	ATH6KL_FW_CAPABILITY_MAX,  }; @@ -112,6 +127,10 @@ struct ath6kl_fw_ie {  	u8 data[0];  }; +enum ath6kl_hw_flags { +	ATH6KL_HW_FLAG_64BIT_RATES	= BIT(0), +}; +  #define ATH6KL_FW_API2_FILE "fw-2.bin"  #define ATH6KL_FW_API3_FILE "fw-3.bin" @@ -196,7 +215,7 @@ struct ath6kl_fw_ie {  #define AGGR_NUM_OF_FREE_NETBUFS    16 -#define AGGR_RX_TIMEOUT     400	/* in ms */ +#define AGGR_RX_TIMEOUT     100	/* in ms */  #define WMI_TIMEOUT (2 * HZ) @@ -245,7 +264,6 @@ struct skb_hold_q {  struct rxtid {  	bool aggr; -	bool progress;  	bool timer_mon;  	u16 win_sz;  	u16 seq_next; @@ -254,9 +272,15 @@ struct rxtid {  	struct sk_buff_head q;  	/* -	 * FIXME: No clue what this should protect. Apparently it should -	 * protect some of the fields above but they are also accessed -	 * without taking the lock. +	 * lock mainly protects seq_next and hold_q. Movement of seq_next +	 * needs to be protected between aggr_timeout() and +	 * aggr_process_recv_frm(). hold_q will be holding the pending +	 * reorder frames and it's access should also be protected. +	 * Some of the other fields like hold_q_sz, win_sz and aggr are +	 * initialized/reset when receiving addba/delba req, also while +	 * deleting aggr state all the pending buffers are flushed before +	 * resetting these fields, so there should not be any race in accessing +	 * these fields.  	 */  	spinlock_t lock;  }; @@ -541,7 +565,7 @@ struct ath6kl_vif {  	struct ath6kl_wep_key wep_key_list[WMI_MAX_KEY_INDEX + 1];  	struct ath6kl_key keys[WMI_MAX_KEY_INDEX + 1];  	struct aggr_info *aggr_cntxt; -	struct ath6kl_htcap htcap; +	struct ath6kl_htcap htcap[IEEE80211_NUM_BANDS];  	struct timer_list disconnect_timer;  	struct timer_list sched_scan_timer; @@ -553,9 +577,6 @@ struct ath6kl_vif {  	u32 last_cancel_roc_id;  	u32 send_action_id;  	bool probe_req_report; -	u16 next_chan; -	enum nl80211_channel_type next_ch_type; -	enum ieee80211_band next_ch_band;  	u16 assoc_bss_beacon_int;  	u16 listen_intvl_t;  	u16 bmiss_time_t; @@ -568,6 +589,11 @@ struct ath6kl_vif {  	struct list_head mc_filter;  }; +static inline struct ath6kl_vif *ath6kl_vif_from_wdev(struct wireless_dev *wdev) +{ +	return container_of(wdev, struct ath6kl_vif, wdev); +} +  #define WOW_LIST_ID		0  #define WOW_HOST_REQ_DELAY	500 /* ms */ @@ -687,6 +713,8 @@ struct ath6kl {  		u32 testscript_addr;  		enum wmi_phy_cap cap; +		u32 flags; +  		struct ath6kl_hw_fw {  			const char *dir;  			const char *otp; diff --git a/drivers/net/wireless/ath/ath6kl/htc_mbox.c b/drivers/net/wireless/ath/ath6kl/htc_mbox.c index 2798624d3a9..cd0e1ba410d 100644 --- a/drivers/net/wireless/ath/ath6kl/htc_mbox.c +++ b/drivers/net/wireless/ath/ath6kl/htc_mbox.c @@ -1309,7 +1309,7 @@ static int ath6kl_htc_rx_packet(struct htc_target *target,  	}  	ath6kl_dbg(ATH6KL_DBG_HTC, -		   "htc rx 0x%p hdr x%x len %d mbox 0x%x\n", +		   "htc rx 0x%p hdr 0x%x len %d mbox 0x%x\n",  		   packet, packet->info.rx.exp_hdr,  		   padded_len, dev->ar->mbox_info.htc_addr); diff --git a/drivers/net/wireless/ath/ath6kl/init.c b/drivers/net/wireless/ath/ath6kl/init.c index 7eb0515f458..f90b5db741c 100644 --- a/drivers/net/wireless/ath/ath6kl/init.c +++ b/drivers/net/wireless/ath/ath6kl/init.c @@ -42,6 +42,7 @@ static const struct ath6kl_hw hw_list[] = {  		.reserved_ram_size		= 6912,  		.refclk_hz			= 26000000,  		.uarttx_pin			= 8, +		.flags				= 0,  		/* hw2.0 needs override address hardcoded */  		.app_start_override_addr	= 0x944C00, @@ -67,6 +68,7 @@ static const struct ath6kl_hw hw_list[] = {  		.refclk_hz			= 26000000,  		.uarttx_pin			= 8,  		.testscript_addr		= 0x57ef74, +		.flags				= 0,  		.fw = {  			.dir		= AR6003_HW_2_1_1_FW_DIR, @@ -91,6 +93,7 @@ static const struct ath6kl_hw hw_list[] = {  		.board_addr			= 0x433900,  		.refclk_hz			= 26000000,  		.uarttx_pin			= 11, +		.flags				= ATH6KL_HW_FLAG_64BIT_RATES,  		.fw = {  			.dir		= AR6004_HW_1_0_FW_DIR, @@ -110,6 +113,7 @@ static const struct ath6kl_hw hw_list[] = {  		.board_addr			= 0x43d400,  		.refclk_hz			= 40000000,  		.uarttx_pin			= 11, +		.flags				= ATH6KL_HW_FLAG_64BIT_RATES,  		.fw = {  			.dir		= AR6004_HW_1_1_FW_DIR, @@ -129,6 +133,7 @@ static const struct ath6kl_hw hw_list[] = {  		.board_addr			= 0x435c00,  		.refclk_hz			= 40000000,  		.uarttx_pin			= 11, +		.flags				= ATH6KL_HW_FLAG_64BIT_RATES,  		.fw = {  			.dir		= AR6004_HW_1_2_FW_DIR, @@ -938,6 +943,14 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)  		}  		switch (ie_id) { +		case ATH6KL_FW_IE_FW_VERSION: +			strlcpy(ar->wiphy->fw_version, data, +				sizeof(ar->wiphy->fw_version)); + +			ath6kl_dbg(ATH6KL_DBG_BOOT, +				   "found fw version %s\n", +				    ar->wiphy->fw_version); +			break;  		case ATH6KL_FW_IE_OTP_IMAGE:  			ath6kl_dbg(ATH6KL_DBG_BOOT, "found otp image ie (%zd B)\n",  				   ie_len); @@ -991,9 +1004,6 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)  				   ar->hw.reserved_ram_size);  			break;  		case ATH6KL_FW_IE_CAPABILITIES: -			if (ie_len < DIV_ROUND_UP(ATH6KL_FW_CAPABILITY_MAX, 8)) -				break; -  			ath6kl_dbg(ATH6KL_DBG_BOOT,  				   "found firmware capabilities ie (%zd B)\n",  				   ie_len); @@ -1002,6 +1012,9 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)  				index = i / 8;  				bit = i % 8; +				if (index == ie_len) +					break; +  				if (data[index] & (1 << bit))  					__set_bit(i, ar->fw_capabilities);  			} @@ -1392,6 +1405,12 @@ static int ath6kl_init_upload(struct ath6kl *ar)  	    ar->version.target_ver == AR6003_HW_2_1_1_VERSION) {  		ath6kl_err("temporary war to avoid sdio crc error\n"); +		param = 0x28; +		address = GPIO_BASE_ADDRESS + GPIO_PIN9_ADDRESS; +		status = ath6kl_bmi_reg_write(ar, address, param); +		if (status) +			return status; +  		param = 0x20;  		address = GPIO_BASE_ADDRESS + GPIO_PIN10_ADDRESS; @@ -1659,6 +1678,9 @@ void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready)  		cfg80211_scan_done(vif->scan_req, true);  		vif->scan_req = NULL;  	} + +	/* need to clean up enhanced bmiss detection fw state */ +	ath6kl_cfg80211_sta_bmiss_enhance(vif, false);  }  void ath6kl_stop_txrx(struct ath6kl *ar) diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c index e5524470529..c189e28e86a 100644 --- a/drivers/net/wireless/ath/ath6kl/main.c +++ b/drivers/net/wireless/ath/ath6kl/main.c @@ -554,20 +554,24 @@ void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver,  	struct ath6kl *ar = devt;  	memcpy(ar->mac_addr, datap, ETH_ALEN); -	ath6kl_dbg(ATH6KL_DBG_TRC, "%s: mac addr = %pM\n", -		   __func__, ar->mac_addr); + +	ath6kl_dbg(ATH6KL_DBG_BOOT, +		   "ready event mac addr %pM sw_ver 0x%x abi_ver 0x%x cap 0x%x\n", +		   ar->mac_addr, sw_ver, abi_ver, cap);  	ar->version.wlan_ver = sw_ver;  	ar->version.abi_ver = abi_ver;  	ar->hw.cap = cap; -	snprintf(ar->wiphy->fw_version, -		 sizeof(ar->wiphy->fw_version), -		 "%u.%u.%u.%u", -		 (ar->version.wlan_ver & 0xf0000000) >> 28, -		 (ar->version.wlan_ver & 0x0f000000) >> 24, -		 (ar->version.wlan_ver & 0x00ff0000) >> 16, -		 (ar->version.wlan_ver & 0x0000ffff)); +	if (strlen(ar->wiphy->fw_version) == 0) { +		snprintf(ar->wiphy->fw_version, +			 sizeof(ar->wiphy->fw_version), +			 "%u.%u.%u.%u", +			 (ar->version.wlan_ver & 0xf0000000) >> 28, +			 (ar->version.wlan_ver & 0x0f000000) >> 24, +			 (ar->version.wlan_ver & 0x00ff0000) >> 16, +			 (ar->version.wlan_ver & 0x0000ffff)); +	}  	/* indicate to the waiting thread that the ready event was received */  	set_bit(WMI_READY, &ar->flag); @@ -598,7 +602,6 @@ static int ath6kl_commit_ch_switch(struct ath6kl_vif *vif, u16 channel)  	struct ath6kl *ar = vif->ar; -	vif->next_chan = channel;  	vif->profile.ch = cpu_to_le16(channel);  	switch (vif->nw_type) { @@ -1167,7 +1170,10 @@ static void ath6kl_set_multicast_list(struct net_device *ndev)  	else  		clear_bit(NETDEV_MCAST_ALL_ON, &vif->flags); -	mc_all_on = mc_all_on || (vif->ar->state == ATH6KL_STATE_ON); +	if (test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, +		     vif->ar->fw_capabilities)) { +		mc_all_on = mc_all_on || (vif->ar->state == ATH6KL_STATE_ON); +	}  	if (!(ndev->flags & IFF_MULTICAST)) {  		mc_all_on = false; diff --git a/drivers/net/wireless/ath/ath6kl/target.h b/drivers/net/wireless/ath/ath6kl/target.h index 78e0ef4567a..a98c12ba70c 100644 --- a/drivers/net/wireless/ath/ath6kl/target.h +++ b/drivers/net/wireless/ath/ath6kl/target.h @@ -45,6 +45,7 @@  #define LPO_CAL_ENABLE_S		20  #define LPO_CAL_ENABLE			0x00100000 +#define GPIO_PIN9_ADDRESS		0x0000004c  #define GPIO_PIN10_ADDRESS		0x00000050  #define GPIO_PIN11_ADDRESS		0x00000054  #define GPIO_PIN12_ADDRESS		0x00000058 diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c index 67206aedea6..7dfa0fd86d7 100644 --- a/drivers/net/wireless/ath/ath6kl/txrx.c +++ b/drivers/net/wireless/ath/ath6kl/txrx.c @@ -1036,6 +1036,7 @@ static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,  	rxtid = &agg_conn->rx_tid[tid];  	stats = &agg_conn->stat[tid]; +	spin_lock_bh(&rxtid->lock);  	idx = AGGR_WIN_IDX(rxtid->seq_next, rxtid->hold_q_sz);  	/* @@ -1054,8 +1055,6 @@ static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,  	seq_end = seq_no ? seq_no : rxtid->seq_next;  	idx_end = AGGR_WIN_IDX(seq_end, rxtid->hold_q_sz); -	spin_lock_bh(&rxtid->lock); -  	do {  		node = &rxtid->hold_q[idx];  		if ((order == 1) && (!node->skb)) @@ -1127,11 +1126,13 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,  		    ((end > extended_end) && (cur > extended_end) &&  		     (cur < end))) {  			aggr_deque_frms(agg_conn, tid, 0, 0); +			spin_lock_bh(&rxtid->lock);  			if (cur >= rxtid->hold_q_sz - 1)  				rxtid->seq_next = cur - (rxtid->hold_q_sz - 1);  			else  				rxtid->seq_next = ATH6KL_MAX_SEQ_NO -  						  (rxtid->hold_q_sz - 2 - cur); +			spin_unlock_bh(&rxtid->lock);  		} else {  			/*  			 * Dequeue only those frames that are outside the @@ -1185,25 +1186,25 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,  	aggr_deque_frms(agg_conn, tid, 0, 1);  	if (agg_conn->timer_scheduled) -		rxtid->progress = true; -	else -		for (idx = 0 ; idx < rxtid->hold_q_sz; idx++) { -			if (rxtid->hold_q[idx].skb) { -				/* -				 * There is a frame in the queue and no -				 * timer so start a timer to ensure that -				 * the frame doesn't remain stuck -				 * forever. -				 */ -				agg_conn->timer_scheduled = true; -				mod_timer(&agg_conn->timer, -					  (jiffies + -					   HZ * (AGGR_RX_TIMEOUT) / 1000)); -				rxtid->progress = false; -				rxtid->timer_mon = true; -				break; -			} +		return is_queued; + +	spin_lock_bh(&rxtid->lock); +	for (idx = 0 ; idx < rxtid->hold_q_sz; idx++) { +		if (rxtid->hold_q[idx].skb) { +			/* +			 * There is a frame in the queue and no +			 * timer so start a timer to ensure that +			 * the frame doesn't remain stuck +			 * forever. +			 */ +			agg_conn->timer_scheduled = true; +			mod_timer(&agg_conn->timer, +				  (jiffies + (HZ * AGGR_RX_TIMEOUT) / 1000)); +			rxtid->timer_mon = true; +			break;  		} +	} +	spin_unlock_bh(&rxtid->lock);  	return is_queued;  } @@ -1608,7 +1609,7 @@ static void aggr_timeout(unsigned long arg)  		rxtid = &aggr_conn->rx_tid[i];  		stats = &aggr_conn->stat[i]; -		if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress) +		if (!rxtid->aggr || !rxtid->timer_mon)  			continue;  		stats->num_timeouts++; @@ -1626,14 +1627,15 @@ static void aggr_timeout(unsigned long arg)  		rxtid = &aggr_conn->rx_tid[i];  		if (rxtid->aggr && rxtid->hold_q) { +			spin_lock_bh(&rxtid->lock);  			for (j = 0; j < rxtid->hold_q_sz; j++) {  				if (rxtid->hold_q[j].skb) {  					aggr_conn->timer_scheduled = true;  					rxtid->timer_mon = true; -					rxtid->progress = false;  					break;  				}  			} +			spin_unlock_bh(&rxtid->lock);  			if (j >= rxtid->hold_q_sz)  				rxtid->timer_mon = false; @@ -1660,7 +1662,6 @@ static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid)  		aggr_deque_frms(aggr_conn, tid, 0, 0);  	rxtid->aggr = false; -	rxtid->progress = false;  	rxtid->timer_mon = false;  	rxtid->win_sz = 0;  	rxtid->seq_next = 0; @@ -1739,7 +1740,6 @@ void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,  	for (i = 0; i < NUM_OF_TIDS; i++) {  		rxtid = &aggr_conn->rx_tid[i];  		rxtid->aggr = false; -		rxtid->progress = false;  		rxtid->timer_mon = false;  		skb_queue_head_init(&rxtid->q);  		spin_lock_init(&rxtid->lock); diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c index ee8ec2394c2..c30ab4b11d6 100644 --- a/drivers/net/wireless/ath/ath6kl/wmi.c +++ b/drivers/net/wireless/ath/ath6kl/wmi.c @@ -474,7 +474,7 @@ static int ath6kl_wmi_remain_on_chnl_event_rx(struct wmi *wmi, u8 *datap,  		return -EINVAL;  	}  	id = vif->last_roc_id; -	cfg80211_ready_on_channel(vif->ndev, id, chan, NL80211_CHAN_NO_HT, +	cfg80211_ready_on_channel(&vif->wdev, id, chan, NL80211_CHAN_NO_HT,  				  dur, GFP_ATOMIC);  	return 0; @@ -513,7 +513,7 @@ static int ath6kl_wmi_cancel_remain_on_chnl_event_rx(struct wmi *wmi,  	else  		id = vif->last_roc_id; /* timeout on uncanceled r-o-c */  	vif->last_cancel_roc_id = 0; -	cfg80211_remain_on_channel_expired(vif->ndev, id, chan, +	cfg80211_remain_on_channel_expired(&vif->wdev, id, chan,  					   NL80211_CHAN_NO_HT, GFP_ATOMIC);  	return 0; @@ -533,7 +533,7 @@ static int ath6kl_wmi_tx_status_event_rx(struct wmi *wmi, u8 *datap, int len,  	ath6kl_dbg(ATH6KL_DBG_WMI, "tx_status: id=%x ack_status=%u\n",  		   id, ev->ack_status);  	if (wmi->last_mgmt_tx_frame) { -		cfg80211_mgmt_tx_status(vif->ndev, id, +		cfg80211_mgmt_tx_status(&vif->wdev, id,  					wmi->last_mgmt_tx_frame,  					wmi->last_mgmt_tx_frame_len,  					!!ev->ack_status, GFP_ATOMIC); @@ -568,7 +568,7 @@ static int ath6kl_wmi_rx_probe_req_event_rx(struct wmi *wmi, u8 *datap, int len,  		   dlen, freq, vif->probe_req_report);  	if (vif->probe_req_report || vif->nw_type == AP_NETWORK) -		cfg80211_rx_mgmt(vif->ndev, freq, 0, +		cfg80211_rx_mgmt(&vif->wdev, freq, 0,  				 ev->data, dlen, GFP_ATOMIC);  	return 0; @@ -608,7 +608,7 @@ static int ath6kl_wmi_rx_action_event_rx(struct wmi *wmi, u8 *datap, int len,  		return -EINVAL;  	}  	ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq); -	cfg80211_rx_mgmt(vif->ndev, freq, 0, +	cfg80211_rx_mgmt(&vif->wdev, freq, 0,  			 ev->data, dlen, GFP_ATOMIC);  	return 0; @@ -743,7 +743,6 @@ int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid)  		return -ENOMEM;  	cmd = (struct roam_ctrl_cmd *) skb->data; -	memset(cmd, 0, sizeof(*cmd));  	memcpy(cmd->info.bssid, bssid, ETH_ALEN);  	cmd->roam_ctrl = WMI_FORCE_ROAM; @@ -753,6 +752,22 @@ int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid)  				   NO_SYNC_WMIFLAG);  } +int ath6kl_wmi_ap_set_dtim_cmd(struct wmi *wmi, u8 if_idx, u32 dtim_period) +{ +	struct sk_buff *skb; +	struct set_dtim_cmd *cmd; + +	skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); +	if (!skb) +		return -ENOMEM; + +	cmd = (struct set_dtim_cmd *) skb->data; + +	cmd->dtim_period = cpu_to_le32(dtim_period); +	return ath6kl_wmi_cmd_send(wmi, if_idx, skb, +				   WMI_AP_SET_DTIM_CMDID, NO_SYNC_WMIFLAG); +} +  int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode)  {  	struct sk_buff *skb; @@ -763,7 +778,6 @@ int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode)  		return -ENOMEM;  	cmd = (struct roam_ctrl_cmd *) skb->data; -	memset(cmd, 0, sizeof(*cmd));  	cmd->info.roam_mode = mode;  	cmd->roam_ctrl = WMI_SET_ROAM_MODE; @@ -1995,7 +2009,7 @@ int ath6kl_wmi_probedssid_cmd(struct wmi *wmi, u8 if_idx, u8 index, u8 flag,  	struct wmi_probed_ssid_cmd *cmd;  	int ret; -	if (index > MAX_PROBED_SSID_INDEX) +	if (index >= MAX_PROBED_SSIDS)  		return -EINVAL;  	if (ssid_len > sizeof(cmd->ssid)) @@ -2599,6 +2613,115 @@ static void ath6kl_wmi_relinquish_implicit_pstream_credits(struct wmi *wmi)  	spin_unlock_bh(&wmi->lock);  } +static int ath6kl_set_bitrate_mask64(struct wmi *wmi, u8 if_idx, +				     const struct cfg80211_bitrate_mask *mask) +{ +	struct sk_buff *skb; +	int ret, mode, band; +	u64 mcsrate, ratemask[IEEE80211_NUM_BANDS]; +	struct wmi_set_tx_select_rates64_cmd *cmd; + +	memset(&ratemask, 0, sizeof(ratemask)); +	for (band = 0; band < IEEE80211_NUM_BANDS; band++) { +		/* copy legacy rate mask */ +		ratemask[band] = mask->control[band].legacy; +		if (band == IEEE80211_BAND_5GHZ) +			ratemask[band] = +				mask->control[band].legacy << 4; + +		/* copy mcs rate mask */ +		mcsrate = mask->control[band].mcs[1]; +		mcsrate <<= 8; +		mcsrate |= mask->control[band].mcs[0]; +		ratemask[band] |= mcsrate << 12; +		ratemask[band] |= mcsrate << 28; +	} + +	ath6kl_dbg(ATH6KL_DBG_WMI, +		   "Ratemask 64 bit: 2.4:%llx 5:%llx\n", +		   ratemask[0], ratemask[1]); + +	skb = ath6kl_wmi_get_new_buf(sizeof(*cmd) * WMI_RATES_MODE_MAX); +	if (!skb) +		return -ENOMEM; + +	cmd = (struct wmi_set_tx_select_rates64_cmd *) skb->data; +	for (mode = 0; mode < WMI_RATES_MODE_MAX; mode++) { +		/* A mode operate in 5GHZ band */ +		if (mode == WMI_RATES_MODE_11A || +		    mode == WMI_RATES_MODE_11A_HT20 || +		    mode == WMI_RATES_MODE_11A_HT40) +			band = IEEE80211_BAND_5GHZ; +		else +			band = IEEE80211_BAND_2GHZ; +		cmd->ratemask[mode] = cpu_to_le64(ratemask[band]); +	} + +	ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, +				  WMI_SET_TX_SELECT_RATES_CMDID, +				  NO_SYNC_WMIFLAG); +	return ret; +} + +static int ath6kl_set_bitrate_mask32(struct wmi *wmi, u8 if_idx, +				     const struct cfg80211_bitrate_mask *mask) +{ +	struct sk_buff *skb; +	int ret, mode, band; +	u32 mcsrate, ratemask[IEEE80211_NUM_BANDS]; +	struct wmi_set_tx_select_rates32_cmd *cmd; + +	memset(&ratemask, 0, sizeof(ratemask)); +	for (band = 0; band < IEEE80211_NUM_BANDS; band++) { +		/* copy legacy rate mask */ +		ratemask[band] = mask->control[band].legacy; +		if (band == IEEE80211_BAND_5GHZ) +			ratemask[band] = +				mask->control[band].legacy << 4; + +		/* copy mcs rate mask */ +		mcsrate = mask->control[band].mcs[0]; +		ratemask[band] |= mcsrate << 12; +		ratemask[band] |= mcsrate << 20; +	} + +	ath6kl_dbg(ATH6KL_DBG_WMI, +		   "Ratemask 32 bit: 2.4:%x 5:%x\n", +		   ratemask[0], ratemask[1]); + +	skb = ath6kl_wmi_get_new_buf(sizeof(*cmd) * WMI_RATES_MODE_MAX); +	if (!skb) +		return -ENOMEM; + +	cmd = (struct wmi_set_tx_select_rates32_cmd *) skb->data; +	for (mode = 0; mode < WMI_RATES_MODE_MAX; mode++) { +		/* A mode operate in 5GHZ band */ +		if (mode == WMI_RATES_MODE_11A || +		    mode == WMI_RATES_MODE_11A_HT20 || +		    mode == WMI_RATES_MODE_11A_HT40) +			band = IEEE80211_BAND_5GHZ; +		else +			band = IEEE80211_BAND_2GHZ; +		cmd->ratemask[mode] = cpu_to_le32(ratemask[band]); +	} + +	ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, +				  WMI_SET_TX_SELECT_RATES_CMDID, +				  NO_SYNC_WMIFLAG); +	return ret; +} + +int ath6kl_wmi_set_bitrate_mask(struct wmi *wmi, u8 if_idx, +				const struct cfg80211_bitrate_mask *mask) +{ +	struct ath6kl *ar = wmi->parent_dev; + +	if (ar->hw.flags & ATH6KL_HW_FLAG_64BIT_RATES) +		return ath6kl_set_bitrate_mask64(wmi, if_idx, mask); +	else +		return ath6kl_set_bitrate_mask32(wmi, if_idx, mask); +} +  int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx,  				       enum ath6kl_host_mode host_mode)  { @@ -2997,6 +3120,25 @@ int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx,  	return ret;  } +int ath6kl_wmi_sta_bmiss_enhance_cmd(struct wmi *wmi, u8 if_idx, bool enhance) +{ +	struct sk_buff *skb; +	struct wmi_sta_bmiss_enhance_cmd *cmd; +	int ret; + +	skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); +	if (!skb) +		return -ENOMEM; + +	cmd = (struct wmi_sta_bmiss_enhance_cmd *) skb->data; +	cmd->enable = enhance ? 1 : 0; + +	ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, +				  WMI_STA_BMISS_ENHANCE_CMDID, +				  NO_SYNC_WMIFLAG); +	return ret; +} +  s32 ath6kl_wmi_get_rate(s8 rate_index)  {  	if (rate_index == RATE_AUTO) diff --git a/drivers/net/wireless/ath/ath6kl/wmi.h b/drivers/net/wireless/ath/ath6kl/wmi.h index 9076bec3a2b..43339aca585 100644 --- a/drivers/net/wireless/ath/ath6kl/wmi.h +++ b/drivers/net/wireless/ath/ath6kl/wmi.h @@ -624,6 +624,10 @@ enum wmi_cmd_id {  	WMI_SEND_MGMT_CMDID,  	WMI_BEGIN_SCAN_CMDID, +	WMI_SET_BLACK_LIST, +	WMI_SET_MCASTRATE, + +	WMI_STA_BMISS_ENHANCE_CMDID,  };  enum wmi_mgmt_frame_type { @@ -960,6 +964,9 @@ enum wmi_bss_filter {  	/* beacons matching probed ssid */  	PROBED_SSID_FILTER, +	/* beacons matching matched ssid */ +	MATCHED_SSID_FILTER, +  	/* marker only */  	LAST_BSS_FILTER,  }; @@ -978,7 +985,7 @@ struct wmi_bss_filter_cmd {  } __packed;  /* WMI_SET_PROBED_SSID_CMDID */ -#define MAX_PROBED_SSID_INDEX   9 +#define MAX_PROBED_SSIDS   16  enum wmi_ssid_flag {  	/* disables entry */ @@ -989,10 +996,13 @@ enum wmi_ssid_flag {  	/* probes for any ssid */  	ANY_SSID_FLAG = 0x02, + +	/* match for ssid */ +	MATCH_SSID_FLAG = 0x08,  };  struct wmi_probed_ssid_cmd { -	/* 0 to MAX_PROBED_SSID_INDEX */ +	/* 0 to MAX_PROBED_SSIDS - 1 */  	u8 entry_index;  	/* see, enum wmi_ssid_flg */ @@ -1017,6 +1027,11 @@ struct wmi_bmiss_time_cmd {  	__le16 num_beacons;  }; +/* WMI_STA_ENHANCE_BMISS_CMDID */ +struct wmi_sta_bmiss_enhance_cmd { +	u8 enable; +} __packed; +  /* WMI_SET_POWER_MODE_CMDID */  enum wmi_power_mode {  	REC_POWER = 0x01, @@ -1048,6 +1063,36 @@ struct wmi_power_params_cmd {  	__le16 ps_fail_event_policy;  } __packed; +/* + * Ratemask for below modes should be passed + * to WMI_SET_TX_SELECT_RATES_CMDID. + * AR6003 has 32 bit mask for each modes. + * First 12 bits for legacy rates, 13 to 20 + * bits for HT 20 rates and 21 to 28 bits for + * HT 40 rates + */ +enum wmi_mode_phy { +	WMI_RATES_MODE_11A = 0, +	WMI_RATES_MODE_11G, +	WMI_RATES_MODE_11B, +	WMI_RATES_MODE_11GONLY, +	WMI_RATES_MODE_11A_HT20, +	WMI_RATES_MODE_11G_HT20, +	WMI_RATES_MODE_11A_HT40, +	WMI_RATES_MODE_11G_HT40, +	WMI_RATES_MODE_MAX +}; + +/* WMI_SET_TX_SELECT_RATES_CMDID */ +struct wmi_set_tx_select_rates32_cmd { +	__le32 ratemask[WMI_RATES_MODE_MAX]; +} __packed; + +/* WMI_SET_TX_SELECT_RATES_CMDID */ +struct wmi_set_tx_select_rates64_cmd { +	__le64 ratemask[WMI_RATES_MODE_MAX]; +} __packed; +  /* WMI_SET_DISC_TIMEOUT_CMDID */  struct wmi_disc_timeout_cmd {  	/* seconds */ @@ -1572,6 +1617,10 @@ struct roam_ctrl_cmd {  	u8 roam_ctrl;  } __packed; +struct set_dtim_cmd { +	__le32 dtim_period; +} __packed; +  /* BSS INFO HDR version 2.0 */  struct wmi_bss_info_hdr2 {  	__le16 ch; /* frequency in MHz */ @@ -2532,6 +2581,8 @@ int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, u8 if_idx,  			  __be32 ips0, __be32 ips1);  int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx,  				       enum ath6kl_host_mode host_mode); +int ath6kl_wmi_set_bitrate_mask(struct wmi *wmi, u8 if_idx, +				const struct cfg80211_bitrate_mask *mask);  int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,  				enum ath6kl_wow_mode wow_mode,  				u32 filter, u16 host_req_delay); @@ -2542,11 +2593,14 @@ int ath6kl_wmi_add_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,  int ath6kl_wmi_del_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,  				   u16 list_id, u16 filter_id);  int ath6kl_wmi_set_roam_lrssi_cmd(struct wmi *wmi, u8 lrssi); +int ath6kl_wmi_ap_set_dtim_cmd(struct wmi *wmi, u8 if_idx, u32 dtim_period);  int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid);  int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode);  int ath6kl_wmi_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, bool mc_all_on);  int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx,  					u8 *filter, bool add_filter); +int ath6kl_wmi_sta_bmiss_enhance_cmd(struct wmi *wmi, u8 if_idx, bool enable); +  /* AP mode uAPSD */  int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable); diff --git a/drivers/net/wireless/ath/ath9k/Kconfig b/drivers/net/wireless/ath/ath9k/Kconfig index e507e78398f..c7aa6646123 100644 --- a/drivers/net/wireless/ath/ath9k/Kconfig +++ b/drivers/net/wireless/ath/ath9k/Kconfig @@ -64,7 +64,7 @@ config ATH9K_DEBUGFS  config ATH9K_DFS_CERTIFIED  	bool "Atheros DFS support for certified platforms" -	depends on ATH9K && EXPERT +	depends on ATH9K && CFG80211_CERTIFICATION_ONUS  	default n  	---help---  	  This option enables DFS support for initiating radiation on diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile index 3f0b8472378..2ad8f9474ba 100644 --- a/drivers/net/wireless/ath/ath9k/Makefile +++ b/drivers/net/wireless/ath/ath9k/Makefile @@ -3,7 +3,9 @@ ath9k-y +=	beacon.o \  		init.o \  		main.o \  		recv.o \ -		xmit.o +		xmit.o \ +		link.o \ +		antenna.o  ath9k-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += mci.o  ath9k-$(CONFIG_ATH9K_RATE_CONTROL) += rc.o @@ -15,6 +17,7 @@ ath9k-$(CONFIG_ATH9K_DFS_CERTIFIED) += \  		dfs.o \  		dfs_pattern_detector.o \  		dfs_pri_detector.o +ath9k-$(CONFIG_PM_SLEEP) += wow.o  obj-$(CONFIG_ATH9K) += ath9k.o diff --git a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c index 5e47ca6d16a..3a69804f4c1 100644 --- a/drivers/net/wireless/ath/ath9k/ahb.c +++ b/drivers/net/wireless/ath/ath9k/ahb.c @@ -35,6 +35,10 @@ static const struct platform_device_id ath9k_platform_id_table[] = {  		.name = "ar934x_wmac",  		.driver_data = AR9300_DEVID_AR9340,  	}, +	{ +		.name = "qca955x_wmac", +		.driver_data = AR9300_DEVID_QCA955X, +	},  	{},  }; @@ -126,7 +130,7 @@ static int ath_ahb_probe(struct platform_device *pdev)  	sc->irq = irq;  	/* Will be cleared in ath9k_start() */ -	sc->sc_flags |= SC_OP_INVALID; +	set_bit(SC_OP_INVALID, &sc->sc_flags);  	ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc);  	if (ret) { diff --git a/drivers/net/wireless/ath/ath9k/ani.c b/drivers/net/wireless/ath/ath9k/ani.c index b4c77f9d747..ff007f500fe 100644 --- a/drivers/net/wireless/ath/ath9k/ani.c +++ b/drivers/net/wireless/ath/ath9k/ani.c @@ -104,11 +104,6 @@ static const struct ani_cck_level_entry cck_level_table[] = {  #define ATH9K_ANI_CCK_DEF_LEVEL \  	2 /* default level - matches the INI settings */ -static bool use_new_ani(struct ath_hw *ah) -{ -	return AR_SREV_9300_20_OR_LATER(ah) || modparam_force_new_ani; -} -  static void ath9k_hw_update_mibstats(struct ath_hw *ah,  				     struct ath9k_mib_stats *stats)  { @@ -122,8 +117,6 @@ static void ath9k_hw_update_mibstats(struct ath_hw *ah,  static void ath9k_ani_restart(struct ath_hw *ah)  {  	struct ar5416AniState *aniState; -	struct ath_common *common = ath9k_hw_common(ah); -	u32 ofdm_base = 0, cck_base = 0;  	if (!DO_ANI(ah))  		return; @@ -131,18 +124,10 @@ static void ath9k_ani_restart(struct ath_hw *ah)  	aniState = &ah->curchan->ani;  	aniState->listenTime = 0; -	if (!use_new_ani(ah)) { -		ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high; -		cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high; -	} - -	ath_dbg(common, ANI, "Writing ofdmbase=%u   cckbase=%u\n", -		ofdm_base, cck_base); -  	ENABLE_REGWRITE_BUFFER(ah); -	REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base); -	REG_WRITE(ah, AR_PHY_ERR_2, cck_base); +	REG_WRITE(ah, AR_PHY_ERR_1, 0); +	REG_WRITE(ah, AR_PHY_ERR_2, 0);  	REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);  	REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); @@ -154,129 +139,23 @@ static void ath9k_ani_restart(struct ath_hw *ah)  	aniState->cckPhyErrCount = 0;  } -static void ath9k_hw_ani_ofdm_err_trigger_old(struct ath_hw *ah) -{ -	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; -	struct ar5416AniState *aniState; -	int32_t rssi; - -	aniState = &ah->curchan->ani; - -	if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) { -		if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, -					 aniState->noiseImmunityLevel + 1)) { -			return; -		} -	} - -	if (aniState->spurImmunityLevel < HAL_SPUR_IMMUNE_MAX) { -		if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, -					 aniState->spurImmunityLevel + 1)) { -			return; -		} -	} - -	if (ah->opmode == NL80211_IFTYPE_AP) { -		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { -			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -					     aniState->firstepLevel + 1); -		} -		return; -	} -	rssi = BEACON_RSSI(ah); -	if (rssi > aniState->rssiThrHigh) { -		if (!aniState->ofdmWeakSigDetectOff) { -			if (ath9k_hw_ani_control(ah, -					 ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, -					 false)) { -				ath9k_hw_ani_control(ah, -					ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0); -				return; -			} -		} -		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { -			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -					     aniState->firstepLevel + 1); -			return; -		} -	} else if (rssi > aniState->rssiThrLow) { -		if (aniState->ofdmWeakSigDetectOff) -			ath9k_hw_ani_control(ah, -				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, -				     true); -		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) -			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -					     aniState->firstepLevel + 1); -		return; -	} else { -		if ((conf->channel->band == IEEE80211_BAND_2GHZ) && -		    !conf_is_ht(conf)) { -			if (!aniState->ofdmWeakSigDetectOff) -				ath9k_hw_ani_control(ah, -				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, -				     false); -			if (aniState->firstepLevel > 0) -				ath9k_hw_ani_control(ah, -					     ATH9K_ANI_FIRSTEP_LEVEL, 0); -			return; -		} -	} -} - -static void ath9k_hw_ani_cck_err_trigger_old(struct ath_hw *ah) -{ -	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; -	struct ar5416AniState *aniState; -	int32_t rssi; - -	aniState = &ah->curchan->ani; -	if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) { -		if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, -					 aniState->noiseImmunityLevel + 1)) { -			return; -		} -	} -	if (ah->opmode == NL80211_IFTYPE_AP) { -		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { -			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -					     aniState->firstepLevel + 1); -		} -		return; -	} -	rssi = BEACON_RSSI(ah); -	if (rssi > aniState->rssiThrLow) { -		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) -			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -					     aniState->firstepLevel + 1); -	} else { -		if ((conf->channel->band == IEEE80211_BAND_2GHZ) && -		    !conf_is_ht(conf)) { -			if (aniState->firstepLevel > 0) -				ath9k_hw_ani_control(ah, -					     ATH9K_ANI_FIRSTEP_LEVEL, 0); -		} -	} -} -  /* Adjust the OFDM Noise Immunity Level */ -static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel) +static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel, +				  bool scan)  {  	struct ar5416AniState *aniState = &ah->curchan->ani;  	struct ath_common *common = ath9k_hw_common(ah);  	const struct ani_ofdm_level_entry *entry_ofdm;  	const struct ani_cck_level_entry *entry_cck; - -	aniState->noiseFloor = BEACON_RSSI(ah); +	bool weak_sig;  	ath_dbg(common, ANI, "**** ofdmlevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",  		aniState->ofdmNoiseImmunityLevel, -		immunityLevel, aniState->noiseFloor, +		immunityLevel, BEACON_RSSI(ah),  		aniState->rssiThrLow, aniState->rssiThrHigh); -	if (aniState->update_ani) -		aniState->ofdmNoiseImmunityLevel = -			(immunityLevel > ATH9K_ANI_OFDM_DEF_LEVEL) ? -			immunityLevel : ATH9K_ANI_OFDM_DEF_LEVEL; +	if (!scan) +		aniState->ofdmNoiseImmunityLevel = immunityLevel;  	entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel];  	entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel]; @@ -292,12 +171,22 @@ static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel)  				     ATH9K_ANI_FIRSTEP_LEVEL,  				     entry_ofdm->fir_step_level); -	if ((aniState->noiseFloor >= aniState->rssiThrHigh) && -	    (!aniState->ofdmWeakSigDetectOff != -	     entry_ofdm->ofdm_weak_signal_on)) { +	weak_sig = entry_ofdm->ofdm_weak_signal_on; +	if (ah->opmode == NL80211_IFTYPE_STATION && +	    BEACON_RSSI(ah) <= aniState->rssiThrHigh) +		weak_sig = true; + +	if (aniState->ofdmWeakSigDetect != weak_sig)  			ath9k_hw_ani_control(ah,  				ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,  				entry_ofdm->ofdm_weak_signal_on); + +	if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) { +		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH; +		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI; +	} else { +		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI; +		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;  	}  } @@ -308,43 +197,35 @@ static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah)  	if (!DO_ANI(ah))  		return; -	if (!use_new_ani(ah)) { -		ath9k_hw_ani_ofdm_err_trigger_old(ah); -		return; -	} -  	aniState = &ah->curchan->ani;  	if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL) -		ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel + 1); +		ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel + 1, false);  }  /*   * Set the ANI settings to match an CCK level.   */ -static void ath9k_hw_set_cck_nil(struct ath_hw *ah, u_int8_t immunityLevel) +static void ath9k_hw_set_cck_nil(struct ath_hw *ah, u_int8_t immunityLevel, +				 bool scan)  {  	struct ar5416AniState *aniState = &ah->curchan->ani;  	struct ath_common *common = ath9k_hw_common(ah);  	const struct ani_ofdm_level_entry *entry_ofdm;  	const struct ani_cck_level_entry *entry_cck; -	aniState->noiseFloor = BEACON_RSSI(ah);  	ath_dbg(common, ANI, "**** ccklevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",  		aniState->cckNoiseImmunityLevel, immunityLevel, -		aniState->noiseFloor, aniState->rssiThrLow, +		BEACON_RSSI(ah), aniState->rssiThrLow,  		aniState->rssiThrHigh); -	if ((ah->opmode == NL80211_IFTYPE_STATION || -	     ah->opmode == NL80211_IFTYPE_ADHOC) && -	    aniState->noiseFloor <= aniState->rssiThrLow && +	if (ah->opmode == NL80211_IFTYPE_STATION && +	    BEACON_RSSI(ah) <= aniState->rssiThrLow &&  	    immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)  		immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI; -	if (aniState->update_ani) -		aniState->cckNoiseImmunityLevel = -			(immunityLevel > ATH9K_ANI_CCK_DEF_LEVEL) ? -			immunityLevel : ATH9K_ANI_CCK_DEF_LEVEL; +	if (!scan) +		aniState->cckNoiseImmunityLevel = immunityLevel;  	entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel];  	entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel]; @@ -359,7 +240,7 @@ static void ath9k_hw_set_cck_nil(struct ath_hw *ah, u_int8_t immunityLevel)  	if (!AR_SREV_9300_20_OR_LATER(ah) || AR_SREV_9485(ah))  		return; -	if (aniState->mrcCCKOff == entry_cck->mrc_cck_on) +	if (aniState->mrcCCK != entry_cck->mrc_cck_on)  		ath9k_hw_ani_control(ah,  				     ATH9K_ANI_MRC_CCK,  				     entry_cck->mrc_cck_on); @@ -372,68 +253,11 @@ static void ath9k_hw_ani_cck_err_trigger(struct ath_hw *ah)  	if (!DO_ANI(ah))  		return; -	if (!use_new_ani(ah)) { -		ath9k_hw_ani_cck_err_trigger_old(ah); -		return; -	} -  	aniState = &ah->curchan->ani;  	if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL) -		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1); -} - -static void ath9k_hw_ani_lower_immunity_old(struct ath_hw *ah) -{ -	struct ar5416AniState *aniState; -	int32_t rssi; - -	aniState = &ah->curchan->ani; - -	if (ah->opmode == NL80211_IFTYPE_AP) { -		if (aniState->firstepLevel > 0) { -			if (ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -						 aniState->firstepLevel - 1)) -				return; -		} -	} else { -		rssi = BEACON_RSSI(ah); -		if (rssi > aniState->rssiThrHigh) { -			/* XXX: Handle me */ -		} else if (rssi > aniState->rssiThrLow) { -			if (aniState->ofdmWeakSigDetectOff) { -				if (ath9k_hw_ani_control(ah, -					 ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, -					 true)) -					return; -			} -			if (aniState->firstepLevel > 0) { -				if (ath9k_hw_ani_control(ah, -					 ATH9K_ANI_FIRSTEP_LEVEL, -					 aniState->firstepLevel - 1)) -					return; -			} -		} else { -			if (aniState->firstepLevel > 0) { -				if (ath9k_hw_ani_control(ah, -					 ATH9K_ANI_FIRSTEP_LEVEL, -					 aniState->firstepLevel - 1)) -					return; -			} -		} -	} - -	if (aniState->spurImmunityLevel > 0) { -		if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, -					 aniState->spurImmunityLevel - 1)) -			return; -	} - -	if (aniState->noiseImmunityLevel > 0) { -		ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, -				     aniState->noiseImmunityLevel - 1); -		return; -	} +		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1, +				     false);  }  /* @@ -446,87 +270,18 @@ static void ath9k_hw_ani_lower_immunity(struct ath_hw *ah)  	aniState = &ah->curchan->ani; -	if (!use_new_ani(ah)) { -		ath9k_hw_ani_lower_immunity_old(ah); -		return; -	} -  	/* lower OFDM noise immunity */  	if (aniState->ofdmNoiseImmunityLevel > 0 &&  	    (aniState->ofdmsTurn || aniState->cckNoiseImmunityLevel == 0)) { -		ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel - 1); +		ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel - 1, +				      false);  		return;  	}  	/* lower CCK noise immunity */  	if (aniState->cckNoiseImmunityLevel > 0) -		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1); -} - -static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning) -{ -	struct ar5416AniState *aniState; -	struct ath9k_channel *chan = ah->curchan; -	struct ath_common *common = ath9k_hw_common(ah); - -	if (!DO_ANI(ah)) -		return; - -	aniState = &ah->curchan->ani; - -	if (ah->opmode != NL80211_IFTYPE_STATION -	    && ah->opmode != NL80211_IFTYPE_ADHOC) { -		ath_dbg(common, ANI, "Reset ANI state opmode %u\n", ah->opmode); -		ah->stats.ast_ani_reset++; - -		if (ah->opmode == NL80211_IFTYPE_AP) { -			/* -			 * ath9k_hw_ani_control() will only process items set on -			 * ah->ani_function -			 */ -			if (IS_CHAN_2GHZ(chan)) -				ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL | -						    ATH9K_ANI_FIRSTEP_LEVEL); -			else -				ah->ani_function = 0; -		} - -		ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0); -		ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0); -		ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0); -		ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, -				     !ATH9K_ANI_USE_OFDM_WEAK_SIG); -		ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, -				     ATH9K_ANI_CCK_WEAK_SIG_THR); - -		ath9k_ani_restart(ah); -		return; -	} - -	if (aniState->noiseImmunityLevel != 0) -		ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, -				     aniState->noiseImmunityLevel); -	if (aniState->spurImmunityLevel != 0) -		ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, -				     aniState->spurImmunityLevel); -	if (aniState->ofdmWeakSigDetectOff) -		ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, -				     !aniState->ofdmWeakSigDetectOff); -	if (aniState->cckWeakSigThreshold) -		ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, -				     aniState->cckWeakSigThreshold); -	if (aniState->firstepLevel != 0) -		ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, -				     aniState->firstepLevel); - -	ath9k_ani_restart(ah); - -	ENABLE_REGWRITE_BUFFER(ah); - -	REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); -	REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); - -	REGWRITE_BUFFER_FLUSH(ah); +		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1, +				     false);  }  /* @@ -539,13 +294,11 @@ void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning)  	struct ar5416AniState *aniState = &ah->curchan->ani;  	struct ath9k_channel *chan = ah->curchan;  	struct ath_common *common = ath9k_hw_common(ah); +	int ofdm_nil, cck_nil;  	if (!DO_ANI(ah))  		return; -	if (!use_new_ani(ah)) -		return ath9k_ani_reset_old(ah, is_scanning); -  	BUG_ON(aniState == NULL);  	ah->stats.ast_ani_reset++; @@ -563,6 +316,11 @@ void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning)  	/* always allow mode (on/off) to be controlled */  	ah->ani_function |= ATH9K_ANI_MODE; +	ofdm_nil = max_t(int, ATH9K_ANI_OFDM_DEF_LEVEL, +			 aniState->ofdmNoiseImmunityLevel); +	cck_nil = max_t(int, ATH9K_ANI_CCK_DEF_LEVEL, +			 aniState->cckNoiseImmunityLevel); +  	if (is_scanning ||  	    (ah->opmode != NL80211_IFTYPE_STATION &&  	     ah->opmode != NL80211_IFTYPE_ADHOC)) { @@ -585,9 +343,8 @@ void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning)  				aniState->ofdmNoiseImmunityLevel,  				aniState->cckNoiseImmunityLevel); -			aniState->update_ani = false; -			ath9k_hw_set_ofdm_nil(ah, ATH9K_ANI_OFDM_DEF_LEVEL); -			ath9k_hw_set_cck_nil(ah, ATH9K_ANI_CCK_DEF_LEVEL); +			ofdm_nil = ATH9K_ANI_OFDM_DEF_LEVEL; +			cck_nil = ATH9K_ANI_CCK_DEF_LEVEL;  		}  	} else {  		/* @@ -601,13 +358,9 @@ void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning)  			is_scanning,  			aniState->ofdmNoiseImmunityLevel,  			aniState->cckNoiseImmunityLevel); - -			aniState->update_ani = true; -			ath9k_hw_set_ofdm_nil(ah, -					      aniState->ofdmNoiseImmunityLevel); -			ath9k_hw_set_cck_nil(ah, -					     aniState->cckNoiseImmunityLevel);  	} +	ath9k_hw_set_ofdm_nil(ah, ofdm_nil, is_scanning); +	ath9k_hw_set_cck_nil(ah, cck_nil, is_scanning);  	/*  	 * enable phy counters if hw supports or if not, enable phy @@ -627,9 +380,6 @@ static bool ath9k_hw_ani_read_counters(struct ath_hw *ah)  {  	struct ath_common *common = ath9k_hw_common(ah);  	struct ar5416AniState *aniState = &ah->curchan->ani; -	u32 ofdm_base = 0; -	u32 cck_base = 0; -	u32 ofdmPhyErrCnt, cckPhyErrCnt;  	u32 phyCnt1, phyCnt2;  	int32_t listenTime; @@ -642,11 +392,6 @@ static bool ath9k_hw_ani_read_counters(struct ath_hw *ah)  		return false;  	} -	if (!use_new_ani(ah)) { -		ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high; -		cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high; -	} -  	aniState->listenTime += listenTime;  	ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); @@ -654,35 +399,12 @@ static bool ath9k_hw_ani_read_counters(struct ath_hw *ah)  	phyCnt1 = REG_READ(ah, AR_PHY_ERR_1);  	phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); -	if (!use_new_ani(ah) && (phyCnt1 < ofdm_base || phyCnt2 < cck_base)) { -		if (phyCnt1 < ofdm_base) { -			ath_dbg(common, ANI, -				"phyCnt1 0x%x, resetting counter value to 0x%x\n", -				phyCnt1, ofdm_base); -			REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base); -			REG_WRITE(ah, AR_PHY_ERR_MASK_1, -				  AR_PHY_ERR_OFDM_TIMING); -		} -		if (phyCnt2 < cck_base) { -			ath_dbg(common, ANI, -				"phyCnt2 0x%x, resetting counter value to 0x%x\n", -				phyCnt2, cck_base); -			REG_WRITE(ah, AR_PHY_ERR_2, cck_base); -			REG_WRITE(ah, AR_PHY_ERR_MASK_2, -				  AR_PHY_ERR_CCK_TIMING); -		} -		return false; -	} +	ah->stats.ast_ani_ofdmerrs += phyCnt1 - aniState->ofdmPhyErrCount; +	aniState->ofdmPhyErrCount = phyCnt1; -	ofdmPhyErrCnt = phyCnt1 - ofdm_base; -	ah->stats.ast_ani_ofdmerrs += -		ofdmPhyErrCnt - aniState->ofdmPhyErrCount; -	aniState->ofdmPhyErrCount = ofdmPhyErrCnt; +	ah->stats.ast_ani_cckerrs += phyCnt2 - aniState->cckPhyErrCount; +	aniState->cckPhyErrCount = phyCnt2; -	cckPhyErrCnt = phyCnt2 - cck_base; -	ah->stats.ast_ani_cckerrs += -		cckPhyErrCnt - aniState->cckPhyErrCount; -	aniState->cckPhyErrCount = cckPhyErrCnt;  	return true;  } @@ -716,21 +438,10 @@ void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan)  	if (aniState->listenTime > ah->aniperiod) {  		if (cckPhyErrRate < ah->config.cck_trig_low && -		    ((ofdmPhyErrRate < ah->config.ofdm_trig_low && -		      aniState->ofdmNoiseImmunityLevel < -		      ATH9K_ANI_OFDM_DEF_LEVEL) || -		     (ofdmPhyErrRate < ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI && -		      aniState->ofdmNoiseImmunityLevel >= -		      ATH9K_ANI_OFDM_DEF_LEVEL))) { +		    ofdmPhyErrRate < ah->config.ofdm_trig_low) {  			ath9k_hw_ani_lower_immunity(ah);  			aniState->ofdmsTurn = !aniState->ofdmsTurn; -		} else if ((ofdmPhyErrRate > ah->config.ofdm_trig_high && -			    aniState->ofdmNoiseImmunityLevel >= -			    ATH9K_ANI_OFDM_DEF_LEVEL) || -			   (ofdmPhyErrRate > -			    ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI && -			    aniState->ofdmNoiseImmunityLevel < -			    ATH9K_ANI_OFDM_DEF_LEVEL)) { +		} else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) {  			ath9k_hw_ani_ofdm_err_trigger(ah);  			aniState->ofdmsTurn = false;  		} else if (cckPhyErrRate > ah->config.cck_trig_high) { @@ -778,49 +489,6 @@ void ath9k_hw_disable_mib_counters(struct ath_hw *ah)  }  EXPORT_SYMBOL(ath9k_hw_disable_mib_counters); -/* - * Process a MIB interrupt.  We may potentially be invoked because - * any of the MIB counters overflow/trigger so don't assume we're - * here because a PHY error counter triggered. - */ -void ath9k_hw_proc_mib_event(struct ath_hw *ah) -{ -	u32 phyCnt1, phyCnt2; - -	/* Reset these counters regardless */ -	REG_WRITE(ah, AR_FILT_OFDM, 0); -	REG_WRITE(ah, AR_FILT_CCK, 0); -	if (!(REG_READ(ah, AR_SLP_MIB_CTRL) & AR_SLP_MIB_PENDING)) -		REG_WRITE(ah, AR_SLP_MIB_CTRL, AR_SLP_MIB_CLEAR); - -	/* Clear the mib counters and save them in the stats */ -	ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); - -	if (!DO_ANI(ah)) { -		/* -		 * We must always clear the interrupt cause by -		 * resetting the phy error regs. -		 */ -		REG_WRITE(ah, AR_PHY_ERR_1, 0); -		REG_WRITE(ah, AR_PHY_ERR_2, 0); -		return; -	} - -	/* NB: these are not reset-on-read */ -	phyCnt1 = REG_READ(ah, AR_PHY_ERR_1); -	phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); -	if (((phyCnt1 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK) || -	    ((phyCnt2 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK)) { - -		if (!use_new_ani(ah)) -			ath9k_hw_ani_read_counters(ah); - -		/* NB: always restart to insure the h/w counters are reset */ -		ath9k_ani_restart(ah); -	} -} -EXPORT_SYMBOL(ath9k_hw_proc_mib_event); -  void ath9k_hw_ani_setup(struct ath_hw *ah)  {  	int i; @@ -845,66 +513,37 @@ void ath9k_hw_ani_init(struct ath_hw *ah)  	ath_dbg(common, ANI, "Initialize ANI\n"); -	if (use_new_ani(ah)) { -		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_NEW; -		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_NEW; +	ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH; +	ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW; -		ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_NEW; -		ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_NEW; -	} else { -		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_OLD; -		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_OLD; - -		ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_OLD; -		ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_OLD; -	} +	ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH; +	ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW;  	for (i = 0; i < ARRAY_SIZE(ah->channels); i++) {  		struct ath9k_channel *chan = &ah->channels[i];  		struct ar5416AniState *ani = &chan->ani; -		if (use_new_ani(ah)) { -			ani->spurImmunityLevel = -				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; +		ani->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; -			ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; +		ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; -			if (AR_SREV_9300_20_OR_LATER(ah)) -				ani->mrcCCKOff = -					!ATH9K_ANI_ENABLE_MRC_CCK; -			else -				ani->mrcCCKOff = true; +		ani->mrcCCK = AR_SREV_9300_20_OR_LATER(ah) ? true : false; -			ani->ofdmsTurn = true; -		} else { -			ani->spurImmunityLevel = -				ATH9K_ANI_SPUR_IMMUNE_LVL_OLD; -			ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_OLD; - -			ani->cckWeakSigThreshold = -				ATH9K_ANI_CCK_WEAK_SIG_THR; -		} +		ani->ofdmsTurn = true;  		ani->rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH;  		ani->rssiThrLow = ATH9K_ANI_RSSI_THR_LOW; -		ani->ofdmWeakSigDetectOff = -			!ATH9K_ANI_USE_OFDM_WEAK_SIG; +		ani->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG;  		ani->cckNoiseImmunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;  		ani->ofdmNoiseImmunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL; -		ani->update_ani = false;  	}  	/*  	 * since we expect some ongoing maintenance on the tables, let's sanity  	 * check here default level should not modify INI setting.  	 */ -	if (use_new_ani(ah)) { -		ah->aniperiod = ATH9K_ANI_PERIOD_NEW; -		ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_NEW; -	} else { -		ah->aniperiod = ATH9K_ANI_PERIOD_OLD; -		ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_OLD; -	} +	ah->aniperiod = ATH9K_ANI_PERIOD; +	ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL;  	if (ah->config.enable_ani)  		ah->proc_phyerr |= HAL_PROCESS_ANI; diff --git a/drivers/net/wireless/ath/ath9k/ani.h b/drivers/net/wireless/ath/ath9k/ani.h index 72e2b874e17..1485bf5e351 100644 --- a/drivers/net/wireless/ath/ath9k/ani.h +++ b/drivers/net/wireless/ath/ath9k/ani.h @@ -24,42 +24,34 @@  #define BEACON_RSSI(ahp) (ahp->stats.avgbrssi)  /* units are errors per second */ -#define ATH9K_ANI_OFDM_TRIG_HIGH_OLD      500 -#define ATH9K_ANI_OFDM_TRIG_HIGH_NEW      3500 +#define ATH9K_ANI_OFDM_TRIG_HIGH          3500  #define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000  /* units are errors per second */ -#define ATH9K_ANI_OFDM_TRIG_LOW_OLD       200 -#define ATH9K_ANI_OFDM_TRIG_LOW_NEW       400 +#define ATH9K_ANI_OFDM_TRIG_LOW           400  #define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900  /* units are errors per second */ -#define ATH9K_ANI_CCK_TRIG_HIGH_OLD       200 -#define ATH9K_ANI_CCK_TRIG_HIGH_NEW       600 +#define ATH9K_ANI_CCK_TRIG_HIGH           600  /* units are errors per second */ -#define ATH9K_ANI_CCK_TRIG_LOW_OLD        100 -#define ATH9K_ANI_CCK_TRIG_LOW_NEW        300 +#define ATH9K_ANI_CCK_TRIG_LOW            300  #define ATH9K_ANI_NOISE_IMMUNE_LVL        4  #define ATH9K_ANI_USE_OFDM_WEAK_SIG       true  #define ATH9K_ANI_CCK_WEAK_SIG_THR        false -#define ATH9K_ANI_SPUR_IMMUNE_LVL_OLD     7 -#define ATH9K_ANI_SPUR_IMMUNE_LVL_NEW     3 +#define ATH9K_ANI_SPUR_IMMUNE_LVL         3 -#define ATH9K_ANI_FIRSTEP_LVL_OLD         0 -#define ATH9K_ANI_FIRSTEP_LVL_NEW         2 +#define ATH9K_ANI_FIRSTEP_LVL             2  #define ATH9K_ANI_RSSI_THR_HIGH           40  #define ATH9K_ANI_RSSI_THR_LOW            7 -#define ATH9K_ANI_PERIOD_OLD              100 -#define ATH9K_ANI_PERIOD_NEW              300 +#define ATH9K_ANI_PERIOD                  300  /* in ms */ -#define ATH9K_ANI_POLLINTERVAL_OLD        100 -#define ATH9K_ANI_POLLINTERVAL_NEW        1000 +#define ATH9K_ANI_POLLINTERVAL            1000  #define HAL_NOISE_IMMUNE_MAX              4  #define HAL_SPUR_IMMUNE_MAX               7 @@ -70,8 +62,6 @@  #define ATH9K_SIG_SPUR_IMM_SETTING_MIN    0  #define ATH9K_SIG_SPUR_IMM_SETTING_MAX    22 -#define ATH9K_ANI_ENABLE_MRC_CCK          true -  /* values here are relative to the INI */  enum ath9k_ani_cmd { @@ -119,16 +109,14 @@ struct ar5416AniState {  	u8 ofdmNoiseImmunityLevel;  	u8 cckNoiseImmunityLevel;  	bool ofdmsTurn; -	u8 mrcCCKOff; +	u8 mrcCCK;  	u8 spurImmunityLevel;  	u8 firstepLevel; -	u8 ofdmWeakSigDetectOff; +	u8 ofdmWeakSigDetect;  	u8 cckWeakSigThreshold; -	bool update_ani;  	u32 listenTime;  	int32_t rssiThrLow;  	int32_t rssiThrHigh; -	u32 noiseFloor;  	u32 ofdmPhyErrCount;  	u32 cckPhyErrCount;  	int16_t pktRssi[2]; diff --git a/drivers/net/wireless/ath/ath9k/antenna.c b/drivers/net/wireless/ath/ath9k/antenna.c new file mode 100644 index 00000000000..bbcfeb3b2a6 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/antenna.c @@ -0,0 +1,776 @@ +/* + * Copyright (c) 2012 Qualcomm Atheros, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ath9k.h" + +static inline bool ath_is_alt_ant_ratio_better(int alt_ratio, int maxdelta, +					       int mindelta, int main_rssi_avg, +					       int alt_rssi_avg, int pkt_count) +{ +	return (((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) && +		 (alt_rssi_avg > main_rssi_avg + maxdelta)) || +		(alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50); +} + +static inline bool ath_ant_div_comb_alt_check(u8 div_group, int alt_ratio, +					      int curr_main_set, int curr_alt_set, +					      int alt_rssi_avg, int main_rssi_avg) +{ +	bool result = false; +	switch (div_group) { +	case 0: +		if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) +			result = true; +		break; +	case 1: +	case 2: +		if ((((curr_main_set == ATH_ANT_DIV_COMB_LNA2) && +		      (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) && +		      (alt_rssi_avg >= (main_rssi_avg - 5))) || +		     ((curr_main_set == ATH_ANT_DIV_COMB_LNA1) && +		      (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) && +		      (alt_rssi_avg >= (main_rssi_avg - 2)))) && +		    (alt_rssi_avg >= 4)) +			result = true; +		else +			result = false; +		break; +	} + +	return result; +} + +static void ath_lnaconf_alt_good_scan(struct ath_ant_comb *antcomb, +				      struct ath_hw_antcomb_conf ant_conf, +				      int main_rssi_avg) +{ +	antcomb->quick_scan_cnt = 0; + +	if (ant_conf.main_lna_conf == ATH_ANT_DIV_COMB_LNA2) +		antcomb->rssi_lna2 = main_rssi_avg; +	else if (ant_conf.main_lna_conf == ATH_ANT_DIV_COMB_LNA1) +		antcomb->rssi_lna1 = main_rssi_avg; + +	switch ((ant_conf.main_lna_conf << 4) | ant_conf.alt_lna_conf) { +	case 0x10: /* LNA2 A-B */ +		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +		antcomb->first_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1; +		break; +	case 0x20: /* LNA1 A-B */ +		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +		antcomb->first_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2; +		break; +	case 0x21: /* LNA1 LNA2 */ +		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA2; +		antcomb->first_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +		antcomb->second_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +		break; +	case 0x12: /* LNA2 LNA1 */ +		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1; +		antcomb->first_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +		antcomb->second_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +		break; +	case 0x13: /* LNA2 A+B */ +		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +		antcomb->first_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1; +		break; +	case 0x23: /* LNA1 A+B */ +		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +		antcomb->first_quick_scan_conf = +			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2; +		break; +	default: +		break; +	} +} + +static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb, +				       struct ath_hw_antcomb_conf *div_ant_conf, +				       int main_rssi_avg, int alt_rssi_avg, +				       int alt_ratio) +{ +	/* alt_good */ +	switch (antcomb->quick_scan_cnt) { +	case 0: +		/* set alt to main, and alt to first conf */ +		div_ant_conf->main_lna_conf = antcomb->main_conf; +		div_ant_conf->alt_lna_conf = antcomb->first_quick_scan_conf; +		break; +	case 1: +		/* set alt to main, and alt to first conf */ +		div_ant_conf->main_lna_conf = antcomb->main_conf; +		div_ant_conf->alt_lna_conf = antcomb->second_quick_scan_conf; +		antcomb->rssi_first = main_rssi_avg; +		antcomb->rssi_second = alt_rssi_avg; + +		if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) { +			/* main is LNA1 */ +			if (ath_is_alt_ant_ratio_better(alt_ratio, +						ATH_ANT_DIV_COMB_LNA1_DELTA_HI, +						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, +						main_rssi_avg, alt_rssi_avg, +						antcomb->total_pkt_count)) +				antcomb->first_ratio = true; +			else +				antcomb->first_ratio = false; +		} else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) { +			if (ath_is_alt_ant_ratio_better(alt_ratio, +						ATH_ANT_DIV_COMB_LNA1_DELTA_MID, +						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, +						main_rssi_avg, alt_rssi_avg, +						antcomb->total_pkt_count)) +				antcomb->first_ratio = true; +			else +				antcomb->first_ratio = false; +		} else { +			if ((((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) && +			      (alt_rssi_avg > main_rssi_avg + +			       ATH_ANT_DIV_COMB_LNA1_DELTA_HI)) || +			     (alt_rssi_avg > main_rssi_avg)) && +			    (antcomb->total_pkt_count > 50)) +				antcomb->first_ratio = true; +			else +				antcomb->first_ratio = false; +		} +		break; +	case 2: +		antcomb->alt_good = false; +		antcomb->scan_not_start = false; +		antcomb->scan = false; +		antcomb->rssi_first = main_rssi_avg; +		antcomb->rssi_third = alt_rssi_avg; + +		if (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) +			antcomb->rssi_lna1 = alt_rssi_avg; +		else if (antcomb->second_quick_scan_conf == +			 ATH_ANT_DIV_COMB_LNA2) +			antcomb->rssi_lna2 = alt_rssi_avg; +		else if (antcomb->second_quick_scan_conf == +			 ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2) { +			if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) +				antcomb->rssi_lna2 = main_rssi_avg; +			else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) +				antcomb->rssi_lna1 = main_rssi_avg; +		} + +		if (antcomb->rssi_lna2 > antcomb->rssi_lna1 + +		    ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA) +			div_ant_conf->main_lna_conf = ATH_ANT_DIV_COMB_LNA2; +		else +			div_ant_conf->main_lna_conf = ATH_ANT_DIV_COMB_LNA1; + +		if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) { +			if (ath_is_alt_ant_ratio_better(alt_ratio, +						ATH_ANT_DIV_COMB_LNA1_DELTA_HI, +						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, +						main_rssi_avg, alt_rssi_avg, +						antcomb->total_pkt_count)) +				antcomb->second_ratio = true; +			else +				antcomb->second_ratio = false; +		} else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) { +			if (ath_is_alt_ant_ratio_better(alt_ratio, +						ATH_ANT_DIV_COMB_LNA1_DELTA_MID, +						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, +						main_rssi_avg, alt_rssi_avg, +						antcomb->total_pkt_count)) +				antcomb->second_ratio = true; +			else +				antcomb->second_ratio = false; +		} else { +			if ((((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) && +			      (alt_rssi_avg > main_rssi_avg + +			       ATH_ANT_DIV_COMB_LNA1_DELTA_HI)) || +			     (alt_rssi_avg > main_rssi_avg)) && +			    (antcomb->total_pkt_count > 50)) +				antcomb->second_ratio = true; +			else +				antcomb->second_ratio = false; +		} + +		/* set alt to the conf with maximun ratio */ +		if (antcomb->first_ratio && antcomb->second_ratio) { +			if (antcomb->rssi_second > antcomb->rssi_third) { +				/* first alt*/ +				if ((antcomb->first_quick_scan_conf == +				    ATH_ANT_DIV_COMB_LNA1) || +				    (antcomb->first_quick_scan_conf == +				    ATH_ANT_DIV_COMB_LNA2)) +					/* Set alt LNA1 or LNA2*/ +					if (div_ant_conf->main_lna_conf == +					    ATH_ANT_DIV_COMB_LNA2) +						div_ant_conf->alt_lna_conf = +							ATH_ANT_DIV_COMB_LNA1; +					else +						div_ant_conf->alt_lna_conf = +							ATH_ANT_DIV_COMB_LNA2; +				else +					/* Set alt to A+B or A-B */ +					div_ant_conf->alt_lna_conf = +						antcomb->first_quick_scan_conf; +			} else if ((antcomb->second_quick_scan_conf == +				   ATH_ANT_DIV_COMB_LNA1) || +				   (antcomb->second_quick_scan_conf == +				   ATH_ANT_DIV_COMB_LNA2)) { +				/* Set alt LNA1 or LNA2 */ +				if (div_ant_conf->main_lna_conf == +				    ATH_ANT_DIV_COMB_LNA2) +					div_ant_conf->alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +				else +					div_ant_conf->alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +			} else { +				/* Set alt to A+B or A-B */ +				div_ant_conf->alt_lna_conf = +					antcomb->second_quick_scan_conf; +			} +		} else if (antcomb->first_ratio) { +			/* first alt */ +			if ((antcomb->first_quick_scan_conf == +			    ATH_ANT_DIV_COMB_LNA1) || +			    (antcomb->first_quick_scan_conf == +			    ATH_ANT_DIV_COMB_LNA2)) +					/* Set alt LNA1 or LNA2 */ +				if (div_ant_conf->main_lna_conf == +				    ATH_ANT_DIV_COMB_LNA2) +					div_ant_conf->alt_lna_conf = +							ATH_ANT_DIV_COMB_LNA1; +				else +					div_ant_conf->alt_lna_conf = +							ATH_ANT_DIV_COMB_LNA2; +			else +				/* Set alt to A+B or A-B */ +				div_ant_conf->alt_lna_conf = +						antcomb->first_quick_scan_conf; +		} else if (antcomb->second_ratio) { +				/* second alt */ +			if ((antcomb->second_quick_scan_conf == +			    ATH_ANT_DIV_COMB_LNA1) || +			    (antcomb->second_quick_scan_conf == +			    ATH_ANT_DIV_COMB_LNA2)) +				/* Set alt LNA1 or LNA2 */ +				if (div_ant_conf->main_lna_conf == +				    ATH_ANT_DIV_COMB_LNA2) +					div_ant_conf->alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +				else +					div_ant_conf->alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +			else +				/* Set alt to A+B or A-B */ +				div_ant_conf->alt_lna_conf = +						antcomb->second_quick_scan_conf; +		} else { +			/* main is largest */ +			if ((antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) || +			    (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2)) +				/* Set alt LNA1 or LNA2 */ +				if (div_ant_conf->main_lna_conf == +				    ATH_ANT_DIV_COMB_LNA2) +					div_ant_conf->alt_lna_conf = +							ATH_ANT_DIV_COMB_LNA1; +				else +					div_ant_conf->alt_lna_conf = +							ATH_ANT_DIV_COMB_LNA2; +			else +				/* Set alt to A+B or A-B */ +				div_ant_conf->alt_lna_conf = antcomb->main_conf; +		} +		break; +	default: +		break; +	} +} + +static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, +					  struct ath_ant_comb *antcomb, +					  int alt_ratio) +{ +	if (ant_conf->div_group == 0) { +		/* Adjust the fast_div_bias based on main and alt lna conf */ +		switch ((ant_conf->main_lna_conf << 4) | +				ant_conf->alt_lna_conf) { +		case 0x01: /* A-B LNA2 */ +			ant_conf->fast_div_bias = 0x3b; +			break; +		case 0x02: /* A-B LNA1 */ +			ant_conf->fast_div_bias = 0x3d; +			break; +		case 0x03: /* A-B A+B */ +			ant_conf->fast_div_bias = 0x1; +			break; +		case 0x10: /* LNA2 A-B */ +			ant_conf->fast_div_bias = 0x7; +			break; +		case 0x12: /* LNA2 LNA1 */ +			ant_conf->fast_div_bias = 0x2; +			break; +		case 0x13: /* LNA2 A+B */ +			ant_conf->fast_div_bias = 0x7; +			break; +		case 0x20: /* LNA1 A-B */ +			ant_conf->fast_div_bias = 0x6; +			break; +		case 0x21: /* LNA1 LNA2 */ +			ant_conf->fast_div_bias = 0x0; +			break; +		case 0x23: /* LNA1 A+B */ +			ant_conf->fast_div_bias = 0x6; +			break; +		case 0x30: /* A+B A-B */ +			ant_conf->fast_div_bias = 0x1; +			break; +		case 0x31: /* A+B LNA2 */ +			ant_conf->fast_div_bias = 0x3b; +			break; +		case 0x32: /* A+B LNA1 */ +			ant_conf->fast_div_bias = 0x3d; +			break; +		default: +			break; +		} +	} else if (ant_conf->div_group == 1) { +		/* Adjust the fast_div_bias based on main and alt_lna_conf */ +		switch ((ant_conf->main_lna_conf << 4) | +			ant_conf->alt_lna_conf) { +		case 0x01: /* A-B LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x02: /* A-B LNA1 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x03: /* A-B A+B */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x10: /* LNA2 A-B */ +			if (!(antcomb->scan) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x3f; +			else +				ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x12: /* LNA2 LNA1 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x13: /* LNA2 A+B */ +			if (!(antcomb->scan) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x3f; +			else +				ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x20: /* LNA1 A-B */ +			if (!(antcomb->scan) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x3f; +			else +				ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x21: /* LNA1 LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x23: /* LNA1 A+B */ +			if (!(antcomb->scan) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x3f; +			else +				ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x30: /* A+B A-B */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x31: /* A+B LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x32: /* A+B LNA1 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		default: +			break; +		} +	} else if (ant_conf->div_group == 2) { +		/* Adjust the fast_div_bias based on main and alt_lna_conf */ +		switch ((ant_conf->main_lna_conf << 4) | +				ant_conf->alt_lna_conf) { +		case 0x01: /* A-B LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x02: /* A-B LNA1 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x03: /* A-B A+B */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x10: /* LNA2 A-B */ +			if (!(antcomb->scan) && +				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x1; +			else +				ant_conf->fast_div_bias = 0x2; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x12: /* LNA2 LNA1 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x13: /* LNA2 A+B */ +			if (!(antcomb->scan) && +				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x1; +			else +				ant_conf->fast_div_bias = 0x2; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x20: /* LNA1 A-B */ +			if (!(antcomb->scan) && +				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x1; +			else +				ant_conf->fast_div_bias = 0x2; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x21: /* LNA1 LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x23: /* LNA1 A+B */ +			if (!(antcomb->scan) && +				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) +				ant_conf->fast_div_bias = 0x1; +			else +				ant_conf->fast_div_bias = 0x2; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x30: /* A+B A-B */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x31: /* A+B LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		case 0x32: /* A+B LNA1 */ +			ant_conf->fast_div_bias = 0x1; +			ant_conf->main_gaintb = 0; +			ant_conf->alt_gaintb = 0; +			break; +		default: +			break; +		} +	} +} + +void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs) +{ +	struct ath_hw_antcomb_conf div_ant_conf; +	struct ath_ant_comb *antcomb = &sc->ant_comb; +	int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; +	int curr_main_set; +	int main_rssi = rs->rs_rssi_ctl0; +	int alt_rssi = rs->rs_rssi_ctl1; +	int rx_ant_conf,  main_ant_conf; +	bool short_scan = false; + +	rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) & +		       ATH_ANT_RX_MASK; +	main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & +			 ATH_ANT_RX_MASK; + +	/* Record packet only when both main_rssi and  alt_rssi is positive */ +	if (main_rssi > 0 && alt_rssi > 0) { +		antcomb->total_pkt_count++; +		antcomb->main_total_rssi += main_rssi; +		antcomb->alt_total_rssi  += alt_rssi; +		if (main_ant_conf == rx_ant_conf) +			antcomb->main_recv_cnt++; +		else +			antcomb->alt_recv_cnt++; +	} + +	/* Short scan check */ +	if (antcomb->scan && antcomb->alt_good) { +		if (time_after(jiffies, antcomb->scan_start_time + +		    msecs_to_jiffies(ATH_ANT_DIV_COMB_SHORT_SCAN_INTR))) +			short_scan = true; +		else +			if (antcomb->total_pkt_count == +			    ATH_ANT_DIV_COMB_SHORT_SCAN_PKTCOUNT) { +				alt_ratio = ((antcomb->alt_recv_cnt * 100) / +					    antcomb->total_pkt_count); +				if (alt_ratio < ATH_ANT_DIV_COMB_ALT_ANT_RATIO) +					short_scan = true; +			} +	} + +	if (((antcomb->total_pkt_count < ATH_ANT_DIV_COMB_MAX_PKTCOUNT) || +	    rs->rs_moreaggr) && !short_scan) +		return; + +	if (antcomb->total_pkt_count) { +		alt_ratio = ((antcomb->alt_recv_cnt * 100) / +			     antcomb->total_pkt_count); +		main_rssi_avg = (antcomb->main_total_rssi / +				 antcomb->total_pkt_count); +		alt_rssi_avg = (antcomb->alt_total_rssi / +				 antcomb->total_pkt_count); +	} + + +	ath9k_hw_antdiv_comb_conf_get(sc->sc_ah, &div_ant_conf); +	curr_alt_set = div_ant_conf.alt_lna_conf; +	curr_main_set = div_ant_conf.main_lna_conf; + +	antcomb->count++; + +	if (antcomb->count == ATH_ANT_DIV_COMB_MAX_COUNT) { +		if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) { +			ath_lnaconf_alt_good_scan(antcomb, div_ant_conf, +						  main_rssi_avg); +			antcomb->alt_good = true; +		} else { +			antcomb->alt_good = false; +		} + +		antcomb->count = 0; +		antcomb->scan = true; +		antcomb->scan_not_start = true; +	} + +	if (!antcomb->scan) { +		if (ath_ant_div_comb_alt_check(div_ant_conf.div_group, +					alt_ratio, curr_main_set, curr_alt_set, +					alt_rssi_avg, main_rssi_avg)) { +			if (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) { +				/* Switch main and alt LNA */ +				div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +				div_ant_conf.alt_lna_conf  = +						ATH_ANT_DIV_COMB_LNA1; +			} else if (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) { +				div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +				div_ant_conf.alt_lna_conf  = +						ATH_ANT_DIV_COMB_LNA2; +			} + +			goto div_comb_done; +		} else if ((curr_alt_set != ATH_ANT_DIV_COMB_LNA1) && +			   (curr_alt_set != ATH_ANT_DIV_COMB_LNA2)) { +			/* Set alt to another LNA */ +			if (curr_main_set == ATH_ANT_DIV_COMB_LNA2) +				div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +			else if (curr_main_set == ATH_ANT_DIV_COMB_LNA1) +				div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; + +			goto div_comb_done; +		} + +		if ((alt_rssi_avg < (main_rssi_avg + +				     div_ant_conf.lna1_lna2_delta))) +			goto div_comb_done; +	} + +	if (!antcomb->scan_not_start) { +		switch (curr_alt_set) { +		case ATH_ANT_DIV_COMB_LNA2: +			antcomb->rssi_lna2 = alt_rssi_avg; +			antcomb->rssi_lna1 = main_rssi_avg; +			antcomb->scan = true; +			/* set to A+B */ +			div_ant_conf.main_lna_conf = +				ATH_ANT_DIV_COMB_LNA1; +			div_ant_conf.alt_lna_conf  = +				ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +			break; +		case ATH_ANT_DIV_COMB_LNA1: +			antcomb->rssi_lna1 = alt_rssi_avg; +			antcomb->rssi_lna2 = main_rssi_avg; +			antcomb->scan = true; +			/* set to A+B */ +			div_ant_conf.main_lna_conf = ATH_ANT_DIV_COMB_LNA2; +			div_ant_conf.alt_lna_conf  = +				ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +			break; +		case ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2: +			antcomb->rssi_add = alt_rssi_avg; +			antcomb->scan = true; +			/* set to A-B */ +			div_ant_conf.alt_lna_conf = +				ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +			break; +		case ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2: +			antcomb->rssi_sub = alt_rssi_avg; +			antcomb->scan = false; +			if (antcomb->rssi_lna2 > +			    (antcomb->rssi_lna1 + +			    ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA)) { +				/* use LNA2 as main LNA */ +				if ((antcomb->rssi_add > antcomb->rssi_lna1) && +				    (antcomb->rssi_add > antcomb->rssi_sub)) { +					/* set to A+B */ +					div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +					div_ant_conf.alt_lna_conf  = +						ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +				} else if (antcomb->rssi_sub > +					   antcomb->rssi_lna1) { +					/* set to A-B */ +					div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +					div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +				} else { +					/* set to LNA1 */ +					div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +					div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +				} +			} else { +				/* use LNA1 as main LNA */ +				if ((antcomb->rssi_add > antcomb->rssi_lna2) && +				    (antcomb->rssi_add > antcomb->rssi_sub)) { +					/* set to A+B */ +					div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +					div_ant_conf.alt_lna_conf  = +						ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; +				} else if (antcomb->rssi_sub > +					   antcomb->rssi_lna1) { +					/* set to A-B */ +					div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +					div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; +				} else { +					/* set to LNA2 */ +					div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +					div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +				} +			} +			break; +		default: +			break; +		} +	} else { +		if (!antcomb->alt_good) { +			antcomb->scan_not_start = false; +			/* Set alt to another LNA */ +			if (curr_main_set == ATH_ANT_DIV_COMB_LNA2) { +				div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +				div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +			} else if (curr_main_set == ATH_ANT_DIV_COMB_LNA1) { +				div_ant_conf.main_lna_conf = +						ATH_ANT_DIV_COMB_LNA1; +				div_ant_conf.alt_lna_conf = +						ATH_ANT_DIV_COMB_LNA2; +			} +			goto div_comb_done; +		} +	} + +	ath_select_ant_div_from_quick_scan(antcomb, &div_ant_conf, +					   main_rssi_avg, alt_rssi_avg, +					   alt_ratio); + +	antcomb->quick_scan_cnt++; + +div_comb_done: +	ath_ant_div_conf_fast_divbias(&div_ant_conf, antcomb, alt_ratio); +	ath9k_hw_antdiv_comb_conf_set(sc->sc_ah, &div_ant_conf); + +	antcomb->scan_start_time = jiffies; +	antcomb->total_pkt_count = 0; +	antcomb->main_total_rssi = 0; +	antcomb->alt_total_rssi = 0; +	antcomb->main_recv_cnt = 0; +	antcomb->alt_recv_cnt = 0; +} + +void ath_ant_comb_update(struct ath_softc *sc) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath_hw_antcomb_conf div_ant_conf; +	u8 lna_conf; + +	ath9k_hw_antdiv_comb_conf_get(ah, &div_ant_conf); + +	if (sc->ant_rx == 1) +		lna_conf = ATH_ANT_DIV_COMB_LNA1; +	else +		lna_conf = ATH_ANT_DIV_COMB_LNA2; + +	div_ant_conf.main_lna_conf = lna_conf; +	div_ant_conf.alt_lna_conf = lna_conf; + +	ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); +} diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c index c7492c6a251..874186bfda4 100644 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c @@ -995,141 +995,6 @@ static u32 ar5008_hw_compute_pll_control(struct ath_hw *ah,  	return pll;  } -static bool ar5008_hw_ani_control_old(struct ath_hw *ah, -				      enum ath9k_ani_cmd cmd, -				      int param) -{ -	struct ar5416AniState *aniState = &ah->curchan->ani; -	struct ath_common *common = ath9k_hw_common(ah); - -	switch (cmd & ah->ani_function) { -	case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ -		u32 level = param; - -		if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { -			ath_dbg(common, ANI, "level out of range (%u > %zu)\n", -				level, ARRAY_SIZE(ah->totalSizeDesired)); -			return false; -		} - -		REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, -			      AR_PHY_DESIRED_SZ_TOT_DES, -			      ah->totalSizeDesired[level]); -		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, -			      AR_PHY_AGC_CTL1_COARSE_LOW, -			      ah->coarse_low[level]); -		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, -			      AR_PHY_AGC_CTL1_COARSE_HIGH, -			      ah->coarse_high[level]); -		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, -			      AR_PHY_FIND_SIG_FIRPWR, -			      ah->firpwr[level]); - -		if (level > aniState->noiseImmunityLevel) -			ah->stats.ast_ani_niup++; -		else if (level < aniState->noiseImmunityLevel) -			ah->stats.ast_ani_nidown++; -		aniState->noiseImmunityLevel = level; -		break; -	} -	case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ -		u32 on = param ? 1 : 0; - -		if (on) -			REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, -				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); -		else -			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, -				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); - -		if (!on != aniState->ofdmWeakSigDetectOff) { -			if (on) -				ah->stats.ast_ani_ofdmon++; -			else -				ah->stats.ast_ani_ofdmoff++; -			aniState->ofdmWeakSigDetectOff = !on; -		} -		break; -	} -	case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ -		static const int weakSigThrCck[] = { 8, 6 }; -		u32 high = param ? 1 : 0; - -		REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, -			      AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, -			      weakSigThrCck[high]); -		if (high != aniState->cckWeakSigThreshold) { -			if (high) -				ah->stats.ast_ani_cckhigh++; -			else -				ah->stats.ast_ani_ccklow++; -			aniState->cckWeakSigThreshold = high; -		} -		break; -	} -	case ATH9K_ANI_FIRSTEP_LEVEL:{ -		static const int firstep[] = { 0, 4, 8 }; -		u32 level = param; - -		if (level >= ARRAY_SIZE(firstep)) { -			ath_dbg(common, ANI, "level out of range (%u > %zu)\n", -				level, ARRAY_SIZE(firstep)); -			return false; -		} -		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, -			      AR_PHY_FIND_SIG_FIRSTEP, -			      firstep[level]); -		if (level > aniState->firstepLevel) -			ah->stats.ast_ani_stepup++; -		else if (level < aniState->firstepLevel) -			ah->stats.ast_ani_stepdown++; -		aniState->firstepLevel = level; -		break; -	} -	case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ -		static const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; -		u32 level = param; - -		if (level >= ARRAY_SIZE(cycpwrThr1)) { -			ath_dbg(common, ANI, "level out of range (%u > %zu)\n", -				level, ARRAY_SIZE(cycpwrThr1)); -			return false; -		} -		REG_RMW_FIELD(ah, AR_PHY_TIMING5, -			      AR_PHY_TIMING5_CYCPWR_THR1, -			      cycpwrThr1[level]); -		if (level > aniState->spurImmunityLevel) -			ah->stats.ast_ani_spurup++; -		else if (level < aniState->spurImmunityLevel) -			ah->stats.ast_ani_spurdown++; -		aniState->spurImmunityLevel = level; -		break; -	} -	case ATH9K_ANI_PRESENT: -		break; -	default: -		ath_dbg(common, ANI, "invalid cmd %u\n", cmd); -		return false; -	} - -	ath_dbg(common, ANI, "ANI parameters:\n"); -	ath_dbg(common, ANI, -		"noiseImmunityLevel=%d, spurImmunityLevel=%d, ofdmWeakSigDetectOff=%d\n", -		aniState->noiseImmunityLevel, -		aniState->spurImmunityLevel, -		!aniState->ofdmWeakSigDetectOff); -	ath_dbg(common, ANI, -		"cckWeakSigThreshold=%d, firstepLevel=%d, listenTime=%d\n", -		aniState->cckWeakSigThreshold, -		aniState->firstepLevel, -		aniState->listenTime); -	ath_dbg(common, ANI, "ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", -		aniState->ofdmPhyErrCount, -		aniState->cckPhyErrCount); - -	return true; -} -  static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  				      enum ath9k_ani_cmd cmd,  				      int param) @@ -1206,18 +1071,18 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,  				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); -		if (!on != aniState->ofdmWeakSigDetectOff) { +		if (on != aniState->ofdmWeakSigDetect) {  			ath_dbg(common, ANI,  				"** ch %d: ofdm weak signal: %s=>%s\n",  				chan->channel, -				!aniState->ofdmWeakSigDetectOff ? +				aniState->ofdmWeakSigDetect ?  				"on" : "off",  				on ? "on" : "off");  			if (on)  				ah->stats.ast_ani_ofdmon++;  			else  				ah->stats.ast_ani_ofdmoff++; -			aniState->ofdmWeakSigDetectOff = !on; +			aniState->ofdmWeakSigDetect = on;  		}  		break;  	} @@ -1236,7 +1101,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value = firstep_table[level] - -			firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + +			firstep_table[ATH9K_ANI_FIRSTEP_LVL] +  			aniState->iniDef.firstep;  		if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)  			value = ATH9K_SIG_FIRSTEP_SETTING_MIN; @@ -1251,7 +1116,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value2 = firstep_table[level] - -			 firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + +			 firstep_table[ATH9K_ANI_FIRSTEP_LVL] +  			 aniState->iniDef.firstepLow;  		if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)  			value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; @@ -1267,7 +1132,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  				chan->channel,  				aniState->firstepLevel,  				level, -				ATH9K_ANI_FIRSTEP_LVL_NEW, +				ATH9K_ANI_FIRSTEP_LVL,  				value,  				aniState->iniDef.firstep);  			ath_dbg(common, ANI, @@ -1275,7 +1140,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  				chan->channel,  				aniState->firstepLevel,  				level, -				ATH9K_ANI_FIRSTEP_LVL_NEW, +				ATH9K_ANI_FIRSTEP_LVL,  				value2,  				aniState->iniDef.firstepLow);  			if (level > aniState->firstepLevel) @@ -1300,7 +1165,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value = cycpwrThr1_table[level] - -			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + +			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +  			aniState->iniDef.cycpwrThr1;  		if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN)  			value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; @@ -1316,7 +1181,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value2 = cycpwrThr1_table[level] - -			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + +			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +  			 aniState->iniDef.cycpwrThr1Ext;  		if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN)  			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; @@ -1331,7 +1196,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  				chan->channel,  				aniState->spurImmunityLevel,  				level, -				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, +				ATH9K_ANI_SPUR_IMMUNE_LVL,  				value,  				aniState->iniDef.cycpwrThr1);  			ath_dbg(common, ANI, @@ -1339,7 +1204,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  				chan->channel,  				aniState->spurImmunityLevel,  				level, -				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, +				ATH9K_ANI_SPUR_IMMUNE_LVL,  				value2,  				aniState->iniDef.cycpwrThr1Ext);  			if (level > aniState->spurImmunityLevel) @@ -1367,9 +1232,9 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  	ath_dbg(common, ANI,  		"ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n",  		aniState->spurImmunityLevel, -		!aniState->ofdmWeakSigDetectOff ? "on" : "off", +		aniState->ofdmWeakSigDetect ? "on" : "off",  		aniState->firstepLevel, -		!aniState->mrcCCKOff ? "on" : "off", +		aniState->mrcCCK ? "on" : "off",  		aniState->listenTime,  		aniState->ofdmPhyErrCount,  		aniState->cckPhyErrCount); @@ -1454,10 +1319,10 @@ static void ar5008_hw_ani_cache_ini_regs(struct ath_hw *ah)  					       AR_PHY_EXT_TIMING5_CYCPWR_THR1);  	/* these levels just got reset to defaults by the INI */ -	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; -	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; -	aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; -	aniState->mrcCCKOff = true; /* not available on pre AR9003 */ +	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; +	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; +	aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; +	aniState->mrcCCK = false; /* not available on pre AR9003 */  }  static void ar5008_hw_set_nf_limits(struct ath_hw *ah) @@ -1545,11 +1410,8 @@ void ar5008_hw_attach_phy_ops(struct ath_hw *ah)  	priv_ops->do_getnf = ar5008_hw_do_getnf;  	priv_ops->set_radar_params = ar5008_hw_set_radar_params; -	if (modparam_force_new_ani) { -		priv_ops->ani_control = ar5008_hw_ani_control_new; -		priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; -	} else -		priv_ops->ani_control = ar5008_hw_ani_control_old; +	priv_ops->ani_control = ar5008_hw_ani_control_new; +	priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs;  	if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah))  		priv_ops->compute_pll_control = ar9160_hw_compute_pll_control; diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c index d9a69fc470c..648da3e885e 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c @@ -21,110 +21,79 @@  #include "ar9002_initvals.h"  #include "ar9002_phy.h" -int modparam_force_new_ani; -module_param_named(force_new_ani, modparam_force_new_ani, int, 0444); -MODULE_PARM_DESC(force_new_ani, "Force new ANI for AR5008, AR9001, AR9002"); -  /* General hardware code for the A5008/AR9001/AR9002 hadware families */  static void ar9002_hw_init_mode_regs(struct ath_hw *ah)  {  	if (AR_SREV_9271(ah)) { -		INIT_INI_ARRAY(&ah->iniModes, ar9271Modes_9271, -			       ARRAY_SIZE(ar9271Modes_9271), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271, -			       ARRAY_SIZE(ar9271Common_9271), 2); -		INIT_INI_ARRAY(&ah->iniModes_9271_ANI_reg, ar9271Modes_9271_ANI_reg, -			       ARRAY_SIZE(ar9271Modes_9271_ANI_reg), 5); +		INIT_INI_ARRAY(&ah->iniModes, ar9271Modes_9271); +		INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271); +		INIT_INI_ARRAY(&ah->iniModes_9271_ANI_reg, ar9271Modes_9271_ANI_reg);  		return;  	}  	if (ah->config.pcie_clock_req)  		INIT_INI_ARRAY(&ah->iniPcieSerdes, -			   ar9280PciePhy_clkreq_off_L1_9280, -			   ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280), 2); +			   ar9280PciePhy_clkreq_off_L1_9280);  	else  		INIT_INI_ARRAY(&ah->iniPcieSerdes, -			   ar9280PciePhy_clkreq_always_on_L1_9280, -			   ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2); +			   ar9280PciePhy_clkreq_always_on_L1_9280); +#ifdef CONFIG_PM_SLEEP +		INIT_INI_ARRAY(&ah->iniPcieSerdesWow, +			       ar9280PciePhy_awow); +#endif  	if (AR_SREV_9287_11_OR_LATER(ah)) { -		INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1, -				ARRAY_SIZE(ar9287Modes_9287_1_1), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_1, -				ARRAY_SIZE(ar9287Common_9287_1_1), 2); +		INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1); +		INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_1);  	} else if (AR_SREV_9285_12_OR_LATER(ah)) { -		INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2, -			       ARRAY_SIZE(ar9285Modes_9285_1_2), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2, -			       ARRAY_SIZE(ar9285Common_9285_1_2), 2); +		INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2); +		INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2);  	} else if (AR_SREV_9280_20_OR_LATER(ah)) { -		INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2, -			       ARRAY_SIZE(ar9280Modes_9280_2), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2, -			       ARRAY_SIZE(ar9280Common_9280_2), 2); +		INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2); +		INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2);  		INIT_INI_ARRAY(&ah->iniModesFastClock, -			       ar9280Modes_fast_clock_9280_2, -			       ARRAY_SIZE(ar9280Modes_fast_clock_9280_2), 3); +			       ar9280Modes_fast_clock_9280_2);  	} else if (AR_SREV_9160_10_OR_LATER(ah)) { -		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9160, -			       ARRAY_SIZE(ar5416Modes_9160), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160, -			       ARRAY_SIZE(ar5416Common_9160), 2); +		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9160); +		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160);  		if (AR_SREV_9160_11(ah)) {  			INIT_INI_ARRAY(&ah->iniAddac, -				       ar5416Addac_9160_1_1, -				       ARRAY_SIZE(ar5416Addac_9160_1_1), 2); +				       ar5416Addac_9160_1_1);  		} else { -			INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9160, -				       ARRAY_SIZE(ar5416Addac_9160), 2); +			INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9160);  		}  	} else if (AR_SREV_9100_OR_LATER(ah)) { -		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100, -			       ARRAY_SIZE(ar5416Modes_9100), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100, -			       ARRAY_SIZE(ar5416Common_9100), 2); -		INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100, -			       ARRAY_SIZE(ar5416Bank6_9100), 3); -		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100, -			       ARRAY_SIZE(ar5416Addac_9100), 2); +		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100); +		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100); +		INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100); +		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100);  	} else { -		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes, -			       ARRAY_SIZE(ar5416Modes), 5); -		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common, -			       ARRAY_SIZE(ar5416Common), 2); -		INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC, -			       ARRAY_SIZE(ar5416Bank6TPC), 3); -		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, -			       ARRAY_SIZE(ar5416Addac), 2); +		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes); +		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common); +		INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC); +		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac);  	}  	if (!AR_SREV_9280_20_OR_LATER(ah)) {  		/* Common for AR5416, AR913x, AR9160 */ -		INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain, -			       ARRAY_SIZE(ar5416BB_RfGain), 3); +		INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain); -		INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0, -			       ARRAY_SIZE(ar5416Bank0), 2); -		INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1, -			       ARRAY_SIZE(ar5416Bank1), 2); -		INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2, -			       ARRAY_SIZE(ar5416Bank2), 2); -		INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3, -			       ARRAY_SIZE(ar5416Bank3), 3); -		INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7, -			       ARRAY_SIZE(ar5416Bank7), 2); +		INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0); +		INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1); +		INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2); +		INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3); +		INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7);  		/* Common for AR5416, AR9160 */  		if (!AR_SREV_9100(ah)) -			INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6, -				       ARRAY_SIZE(ar5416Bank6), 3); +			INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6);  		/* Common for AR913x, AR9160 */  		if (!AR_SREV_5416(ah)) -			INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100, -				       ARRAY_SIZE(ar5416Bank6TPC_9100), 3); +			INIT_INI_ARRAY(&ah->iniBank6TPC, +				      ar5416Bank6TPC_9100);  	}  	/* iniAddac needs to be modified for these chips */ @@ -147,13 +116,9 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)  	}  	if (AR_SREV_9287_11_OR_LATER(ah)) {  		INIT_INI_ARRAY(&ah->iniCckfirNormal, -		       ar9287Common_normal_cck_fir_coeff_9287_1_1, -		       ARRAY_SIZE(ar9287Common_normal_cck_fir_coeff_9287_1_1), -		       2); +		       ar9287Common_normal_cck_fir_coeff_9287_1_1);  		INIT_INI_ARRAY(&ah->iniCckfirJapan2484, -		       ar9287Common_japan_2484_cck_fir_coeff_9287_1_1, -		       ARRAY_SIZE(ar9287Common_japan_2484_cck_fir_coeff_9287_1_1), -		       2); +		       ar9287Common_japan_2484_cck_fir_coeff_9287_1_1);  	}  } @@ -167,20 +132,16 @@ static void ar9280_20_hw_init_rxgain_ini(struct ath_hw *ah)  		if (rxgain_type == AR5416_EEP_RXGAIN_13DB_BACKOFF)  			INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9280Modes_backoff_13db_rxgain_9280_2, -			ARRAY_SIZE(ar9280Modes_backoff_13db_rxgain_9280_2), 5); +				       ar9280Modes_backoff_13db_rxgain_9280_2);  		else if (rxgain_type == AR5416_EEP_RXGAIN_23DB_BACKOFF)  			INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9280Modes_backoff_23db_rxgain_9280_2, -			ARRAY_SIZE(ar9280Modes_backoff_23db_rxgain_9280_2), 5); +				       ar9280Modes_backoff_23db_rxgain_9280_2);  		else  			INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9280Modes_original_rxgain_9280_2, -			ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 5); +				       ar9280Modes_original_rxgain_9280_2);  	} else {  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9280Modes_original_rxgain_9280_2, -			ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 5); +			       ar9280Modes_original_rxgain_9280_2);  	}  } @@ -190,16 +151,13 @@ static void ar9280_20_hw_init_txgain_ini(struct ath_hw *ah, u32 txgain_type)  	    AR5416_EEP_MINOR_VER_19) {  		if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER)  			INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9280Modes_high_power_tx_gain_9280_2, -			ARRAY_SIZE(ar9280Modes_high_power_tx_gain_9280_2), 5); +				       ar9280Modes_high_power_tx_gain_9280_2);  		else  			INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9280Modes_original_tx_gain_9280_2, -			ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 5); +				       ar9280Modes_original_tx_gain_9280_2);  	} else {  		INIT_INI_ARRAY(&ah->iniModesTxGain, -		ar9280Modes_original_tx_gain_9280_2, -		ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 5); +			       ar9280Modes_original_tx_gain_9280_2);  	}  } @@ -207,12 +165,10 @@ static void ar9271_hw_init_txgain_ini(struct ath_hw *ah, u32 txgain_type)  {  	if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER)  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			       ar9271Modes_high_power_tx_gain_9271, -			       ARRAY_SIZE(ar9271Modes_high_power_tx_gain_9271), 5); +			       ar9271Modes_high_power_tx_gain_9271);  	else  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			       ar9271Modes_normal_power_tx_gain_9271, -			       ARRAY_SIZE(ar9271Modes_normal_power_tx_gain_9271), 5); +			       ar9271Modes_normal_power_tx_gain_9271);  }  static void ar9002_hw_init_mode_gain_regs(struct ath_hw *ah) @@ -221,8 +177,7 @@ static void ar9002_hw_init_mode_gain_regs(struct ath_hw *ah)  	if (AR_SREV_9287_11_OR_LATER(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -		ar9287Modes_rx_gain_9287_1_1, -		ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_1), 5); +			       ar9287Modes_rx_gain_9287_1_1);  	else if (AR_SREV_9280_20(ah))  		ar9280_20_hw_init_rxgain_ini(ah); @@ -230,8 +185,7 @@ static void ar9002_hw_init_mode_gain_regs(struct ath_hw *ah)  		ar9271_hw_init_txgain_ini(ah, txgain_type);  	} else if (AR_SREV_9287_11_OR_LATER(ah)) {  		INIT_INI_ARRAY(&ah->iniModesTxGain, -		ar9287Modes_tx_gain_9287_1_1, -		ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_1), 5); +			       ar9287Modes_tx_gain_9287_1_1);  	} else if (AR_SREV_9280_20(ah)) {  		ar9280_20_hw_init_txgain_ini(ah, txgain_type);  	} else if (AR_SREV_9285_12_OR_LATER(ah)) { @@ -239,26 +193,18 @@ static void ar9002_hw_init_mode_gain_regs(struct ath_hw *ah)  		if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) {  			if (AR_SREV_9285E_20(ah)) {  				INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9285Modes_XE2_0_high_power, -				ARRAY_SIZE( -				  ar9285Modes_XE2_0_high_power), 5); +					       ar9285Modes_XE2_0_high_power);  			} else {  				INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9285Modes_high_power_tx_gain_9285_1_2, -				ARRAY_SIZE( -				  ar9285Modes_high_power_tx_gain_9285_1_2), 5); +					ar9285Modes_high_power_tx_gain_9285_1_2);  			}  		} else {  			if (AR_SREV_9285E_20(ah)) {  				INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9285Modes_XE2_0_normal_power, -				ARRAY_SIZE( -				  ar9285Modes_XE2_0_normal_power), 5); +					       ar9285Modes_XE2_0_normal_power);  			} else {  				INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9285Modes_original_tx_gain_9285_1_2, -				ARRAY_SIZE( -				  ar9285Modes_original_tx_gain_9285_1_2), 5); +					ar9285Modes_original_tx_gain_9285_1_2);  			}  		}  	} diff --git a/drivers/net/wireless/ath/ath9k/ar9002_initvals.h b/drivers/net/wireless/ath/ath9k/ar9002_initvals.h index 4d18c66a679..beb6162cf97 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9002_initvals.h @@ -925,6 +925,20 @@ static const u32 ar9280PciePhy_clkreq_always_on_L1_9280[][2] = {  	{0x00004044, 0x00000000},  }; +static const u32 ar9280PciePhy_awow[][2] = { +	/* Addr      allmodes  */ +	{0x00004040, 0x9248fd00}, +	{0x00004040, 0x24924924}, +	{0x00004040, 0xa8000019}, +	{0x00004040, 0x13160820}, +	{0x00004040, 0xe5980560}, +	{0x00004040, 0xc01dcffd}, +	{0x00004040, 0x1aaabe41}, +	{0x00004040, 0xbe105554}, +	{0x00004040, 0x00043007}, +	{0x00004044, 0x00000000}, +}; +  static const u32 ar9285Modes_9285_1_2[][5] = {  	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h index 952cb2b4656..89bf94d4d8a 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h @@ -1,5 +1,6 @@  /*   * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c index 9fdd70fcaf5..84b558d126c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c @@ -159,14 +159,11 @@ static bool ar9003_hw_calibrate(struct ath_hw *ah,  		}  	} -	/* Do NF cal only at longer intervals */ -	if (longcal) { -		/* -		 * Get the value from the previous NF cal and update -		 * history buffer. -		 */ -		ath9k_hw_getnf(ah, chan); - +	/* +	 * Do NF cal only at longer intervals. Get the value from +	 * the previous NF cal and update history buffer. +	 */ +	if (longcal && ath9k_hw_getnf(ah, chan)) {  		/*  		 * Load the NF from history buffer of the current channel.  		 * NF is slow time-variant, so it is OK to use a historical @@ -653,7 +650,6 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,  }  static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah, -						 u8 num_chains,  						 struct coeff *coeff,  						 bool is_reusable)  { @@ -677,7 +673,9 @@ static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah,  	}  	/* Load the average of 2 passes */ -	for (i = 0; i < num_chains; i++) { +	for (i = 0; i < AR9300_MAX_CHAINS; i++) { +		if (!(ah->txchainmask & (1 << i))) +			continue;  		nmeasurement = REG_READ_FIELD(ah,  				AR_PHY_TX_IQCAL_STATUS_B0,  				AR_PHY_CALIBRATED_GAINS_0); @@ -767,16 +765,13 @@ static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)  	};  	struct coeff coeff;  	s32 iq_res[6]; -	u8 num_chains = 0;  	int i, im, j;  	int nmeasurement;  	for (i = 0; i < AR9300_MAX_CHAINS; i++) { -		if (ah->txchainmask & (1 << i)) -			num_chains++; -	} +		if (!(ah->txchainmask & (1 << i))) +			continue; -	for (i = 0; i < num_chains; i++) {  		nmeasurement = REG_READ_FIELD(ah,  				AR_PHY_TX_IQCAL_STATUS_B0,  				AR_PHY_CALIBRATED_GAINS_0); @@ -839,8 +834,7 @@ static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)  				coeff.phs_coeff[i][im] -= 128;  		}  	} -	ar9003_hw_tx_iqcal_load_avg_2_passes(ah, num_chains, -					     &coeff, is_reusable); +	ar9003_hw_tx_iqcal_load_avg_2_passes(ah, &coeff, is_reusable);  	return; @@ -901,7 +895,6 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,  	bool is_reusable = true, status = true;  	bool run_rtt_cal = false, run_agc_cal;  	bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT); -	bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI);  	u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL |  					  AR_PHY_AGC_CONTROL_FLTR_CAL   |  					  AR_PHY_AGC_CONTROL_PKDET_CAL; @@ -970,7 +963,7 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,  	} else if (caldata && !caldata->done_txiqcal_once)  		run_agc_cal = true; -	if (mci && IS_CHAN_2GHZ(chan) && run_agc_cal) +	if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal)  		ar9003_mci_init_cal_req(ah, &is_reusable);  	if (!(IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan))) { @@ -993,7 +986,7 @@ skip_tx_iqcal:  				       0, AH_WAIT_TIMEOUT);  	} -	if (mci && IS_CHAN_2GHZ(chan) && run_agc_cal) +	if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal)  		ar9003_mci_init_cal_done(ah);  	if (rtt && !run_rtt_cal) { diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c index ac53d901801..2588848f4a8 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c @@ -131,8 +131,9 @@ static const struct ar9300_eeprom ar9300_default = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0cf0e0e0),  		.papdRateMaskHt40 = LE32(0x6cf0e0e0), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	 },  	.base_ext1 = { @@ -331,8 +332,9 @@ static const struct ar9300_eeprom ar9300_default = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0c80c080),  		.papdRateMaskHt40 = LE32(0x0080c080), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	 },  	.base_ext2 = { @@ -704,8 +706,9 @@ static const struct ar9300_eeprom ar9300_x113 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0c80c080),  		.papdRateMaskHt40 = LE32(0x0080c080), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	 },  	 .base_ext1 = { @@ -904,8 +907,9 @@ static const struct ar9300_eeprom ar9300_x113 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0cf0e0e0),  		.papdRateMaskHt40 = LE32(0x6cf0e0e0), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	 },  	.base_ext2 = { @@ -1278,8 +1282,9 @@ static const struct ar9300_eeprom ar9300_h112 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0c80c080),  		.papdRateMaskHt40 = LE32(0x0080c080), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	},  	.base_ext1 = { @@ -1478,8 +1483,9 @@ static const struct ar9300_eeprom ar9300_h112 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0cf0e0e0),  		.papdRateMaskHt40 = LE32(0x6cf0e0e0), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	},  	.base_ext2 = { @@ -1852,8 +1858,9 @@ static const struct ar9300_eeprom ar9300_x112 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0c80c080),  		.papdRateMaskHt40 = LE32(0x0080c080), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	},  	.base_ext1 = { @@ -2052,8 +2059,9 @@ static const struct ar9300_eeprom ar9300_x112 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0cf0e0e0),  		.papdRateMaskHt40 = LE32(0x6cf0e0e0), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	},  	.base_ext2 = { @@ -2425,8 +2433,9 @@ static const struct ar9300_eeprom ar9300_h116 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0c80C080),  		.papdRateMaskHt40 = LE32(0x0080C080), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	 },  	 .base_ext1 = { @@ -2625,8 +2634,9 @@ static const struct ar9300_eeprom ar9300_h116 = {  		.thresh62 = 28,  		.papdRateMaskHt20 = LE32(0x0cf0e0e0),  		.papdRateMaskHt40 = LE32(0x6cf0e0e0), +		.xlna_bias_strength = 0,  		.futureModal = { -			0, 0, 0, 0, 0, 0, 0, 0, +			0, 0, 0, 0, 0, 0, 0,  		},  	 },  	.base_ext2 = { @@ -2971,14 +2981,6 @@ static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,  		return (pBase->txrxMask >> 4) & 0xf;  	case EEP_RX_MASK:  		return pBase->txrxMask & 0xf; -	case EEP_DRIVE_STRENGTH: -#define AR9300_EEP_BASE_DRIV_STRENGTH	0x1 -		return pBase->miscConfiguration & AR9300_EEP_BASE_DRIV_STRENGTH; -	case EEP_INTERNAL_REGULATOR: -		/* Bit 4 is internal regulator flag */ -		return (pBase->featureEnable & 0x10) >> 4; -	case EEP_SWREG: -		return le32_to_cpu(pBase->swreg);  	case EEP_PAPRD:  		return !!(pBase->featureEnable & BIT(5));  	case EEP_CHAIN_MASK_REDUCE: @@ -2989,8 +2991,6 @@ static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,  		return eep->modalHeader5G.antennaGain;  	case EEP_ANTENNA_GAIN_2G:  		return eep->modalHeader2G.antennaGain; -	case EEP_QUICK_DROP: -		return pBase->miscConfiguration & BIT(1);  	default:  		return 0;  	} @@ -3178,7 +3178,7 @@ static int ar9300_compress_decision(struct ath_hw *ah,  				mdata_size, length);  			return -1;  		} -		memcpy(mptr, (u8 *) (word + COMP_HDR_LEN), length); +		memcpy(mptr, word + COMP_HDR_LEN, length);  		ath_dbg(common, EEPROM,  			"restored eeprom %d: uncompressed, length %d\n",  			it, length); @@ -3199,7 +3199,7 @@ static int ar9300_compress_decision(struct ath_hw *ah,  			"restore eeprom %d: block, reference %d, length %d\n",  			it, reference, length);  		ar9300_uncompress_block(ah, mptr, mdata_size, -					(u8 *) (word + COMP_HDR_LEN), length); +					(word + COMP_HDR_LEN), length);  		break;  	default:  		ath_dbg(common, EEPROM, "unknown compression code %d\n", code); @@ -3260,10 +3260,20 @@ static int ar9300_eeprom_restore_internal(struct ath_hw *ah,  	int it;  	u16 checksum, mchecksum;  	struct ath_common *common = ath9k_hw_common(ah); +	struct ar9300_eeprom *eep;  	eeprom_read_op read; -	if (ath9k_hw_use_flash(ah)) -		return ar9300_eeprom_restore_flash(ah, mptr, mdata_size); +	if (ath9k_hw_use_flash(ah)) { +		u8 txrx; + +		ar9300_eeprom_restore_flash(ah, mptr, mdata_size); + +		/* check if eeprom contains valid data */ +		eep = (struct ar9300_eeprom *) mptr; +		txrx = eep->baseEepHeader.txrxMask; +		if (txrx != 0 && txrx != 0xff) +			return 0; +	}  	word = kzalloc(2048, GFP_KERNEL);  	if (!word) @@ -3412,11 +3422,11 @@ static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,  	if (!dump_base_hdr) {  		len += snprintf(buf + len, size - len,  				"%20s :\n", "2GHz modal Header"); -		len += ar9003_dump_modal_eeprom(buf, len, size, +		len = ar9003_dump_modal_eeprom(buf, len, size,  						&eep->modalHeader2G);  		len += snprintf(buf + len, size - len,  				"%20s :\n", "5GHz modal Header"); -		len += ar9003_dump_modal_eeprom(buf, len, size, +		len = ar9003_dump_modal_eeprom(buf, len, size,  						&eep->modalHeader5G);  		goto out;  	} @@ -3493,23 +3503,24 @@ static int ath9k_hw_ar9300_get_eeprom_rev(struct ath_hw *ah)  	return 0;  } -static s32 ar9003_hw_xpa_bias_level_get(struct ath_hw *ah, bool is2ghz) +static struct ar9300_modal_eep_header *ar9003_modal_header(struct ath_hw *ah, +							   bool is2ghz)  {  	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;  	if (is2ghz) -		return eep->modalHeader2G.xpaBiasLvl; +		return &eep->modalHeader2G;  	else -		return eep->modalHeader5G.xpaBiasLvl; +		return &eep->modalHeader5G;  }  static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)  { -	int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz); +	int bias = ar9003_modal_header(ah, is2ghz)->xpaBiasLvl;  	if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))  		REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias); -	else if (AR_SREV_9462(ah)) +	else if (AR_SREV_9462(ah) || AR_SREV_9550(ah))  		REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);  	else {  		REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias); @@ -3521,57 +3532,26 @@ static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)  	}  } -static u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is_2ghz) +static u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is2ghz)  { -	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; -	__le16 val; - -	if (is_2ghz) -		val = eep->modalHeader2G.switchcomspdt; -	else -		val = eep->modalHeader5G.switchcomspdt; -	return le16_to_cpu(val); +	return le16_to_cpu(ar9003_modal_header(ah, is2ghz)->switchcomspdt);  }  static u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)  { -	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; -	__le32 val; - -	if (is2ghz) -		val = eep->modalHeader2G.antCtrlCommon; -	else -		val = eep->modalHeader5G.antCtrlCommon; -	return le32_to_cpu(val); +	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon);  }  static u32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz)  { -	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; -	__le32 val; - -	if (is2ghz) -		val = eep->modalHeader2G.antCtrlCommon2; -	else -		val = eep->modalHeader5G.antCtrlCommon2; -	return le32_to_cpu(val); +	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon2);  } -static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, -					int chain, +static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, int chain,  					bool is2ghz)  { -	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; -	__le16 val = 0; - -	if (chain >= 0 && chain < AR9300_MAX_CHAINS) { -		if (is2ghz) -			val = eep->modalHeader2G.antCtrlChain[chain]; -		else -			val = eep->modalHeader5G.antCtrlChain[chain]; -	} - +	__le16 val = ar9003_modal_header(ah, is2ghz)->antCtrlChain[chain];  	return le16_to_cpu(val);  } @@ -3591,6 +3571,9 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)  	if (AR_SREV_9462(ah)) {  		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,  				AR_SWITCH_TABLE_COM_AR9462_ALL, value); +	} else if (AR_SREV_9550(ah)) { +		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, +				AR_SWITCH_TABLE_COM_AR9550_ALL, value);  	} else  		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,  			      AR_SWITCH_TABLE_COM_ALL, value); @@ -3613,6 +3596,7 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)  		value = ar9003_switch_com_spdt_get(ah, is2ghz);  		REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,  				AR_SWITCH_TABLE_COM_SPDT_ALL, value); +		REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_SPDT_ENABLE);  	}  	value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz); @@ -3677,11 +3661,12 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)  static void ar9003_hw_drive_strength_apply(struct ath_hw *ah)  { +	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; +	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;  	int drive_strength;  	unsigned long reg; -	drive_strength = ath9k_hw_ar9300_get_eeprom(ah, EEP_DRIVE_STRENGTH); - +	drive_strength = pBase->miscConfiguration & BIT(0);  	if (!drive_strength)  		return; @@ -3809,13 +3794,13 @@ static bool is_pmu_set(struct ath_hw *ah, u32 pmu_reg, int pmu_set)  	return true;  } -static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah) +void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)  { -	int internal_regulator = -		ath9k_hw_ar9300_get_eeprom(ah, EEP_INTERNAL_REGULATOR); +	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; +	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;  	u32 reg_val; -	if (internal_regulator) { +	if (pBase->featureEnable & BIT(4)) {  		if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {  			int reg_pmu_set; @@ -3859,11 +3844,11 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)  			if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))  				return;  		} else if (AR_SREV_9462(ah)) { -			reg_val = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG); +			reg_val = le32_to_cpu(pBase->swreg);  			REG_WRITE(ah, AR_PHY_PMU1, reg_val);  		} else {  			/* Internal regulator is ON. Write swreg register. */ -			reg_val = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG); +			reg_val = le32_to_cpu(pBase->swreg);  			REG_WRITE(ah, AR_RTC_REG_CONTROL1,  				  REG_READ(ah, AR_RTC_REG_CONTROL1) &  				  (~AR_RTC_REG_CONTROL1_SWREG_PROGRAM)); @@ -3905,6 +3890,9 @@ static void ar9003_hw_apply_tuning_caps(struct ath_hw *ah)  	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;  	u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0]; +	if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah)) +		return; +  	if (eep->baseEepHeader.featureEnable & 0x40) {  		tuning_caps_param &= 0x7f;  		REG_RMW_FIELD(ah, AR_CH0_XTAL, AR_CH0_XTAL_CAPINDAC, @@ -3917,10 +3905,11 @@ static void ar9003_hw_apply_tuning_caps(struct ath_hw *ah)  static void ar9003_hw_quick_drop_apply(struct ath_hw *ah, u16 freq)  {  	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; -	int quick_drop = ath9k_hw_ar9300_get_eeprom(ah, EEP_QUICK_DROP); +	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader; +	int quick_drop;  	s32 t[3], f[3] = {5180, 5500, 5785}; -	if (!quick_drop) +	if (!(pBase->miscConfiguration & BIT(1)))  		return;  	if (freq < 4000) @@ -3934,13 +3923,11 @@ static void ar9003_hw_quick_drop_apply(struct ath_hw *ah, u16 freq)  	REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop);  } -static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, u16 freq) +static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, bool is2ghz)  { -	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;  	u32 value; -	value = (freq < 4000) ? eep->modalHeader2G.txEndToXpaOff : -				eep->modalHeader5G.txEndToXpaOff; +	value = ar9003_modal_header(ah, is2ghz)->txEndToXpaOff;  	REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,  		      AR_PHY_XPA_TIMING_CTL_TX_END_XPAB_OFF, value); @@ -3948,19 +3935,63 @@ static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, u16 freq)  		      AR_PHY_XPA_TIMING_CTL_TX_END_XPAA_OFF, value);  } +static void ar9003_hw_xpa_timing_control_apply(struct ath_hw *ah, bool is2ghz) +{ +	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; +	u8 xpa_ctl; + +	if (!(eep->baseEepHeader.featureEnable & 0x80)) +		return; + +	if (!AR_SREV_9300(ah) && !AR_SREV_9340(ah) && !AR_SREV_9580(ah)) +		return; + +	xpa_ctl = ar9003_modal_header(ah, is2ghz)->txFrameToXpaOn; +	if (is2ghz) +		REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL, +			      AR_PHY_XPA_TIMING_CTL_FRAME_XPAB_ON, xpa_ctl); +	else +		REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL, +			      AR_PHY_XPA_TIMING_CTL_FRAME_XPAA_ON, xpa_ctl); +} + +static void ar9003_hw_xlna_bias_strength_apply(struct ath_hw *ah, bool is2ghz) +{ +	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; +	u8 bias; + +	if (!(eep->baseEepHeader.featureEnable & 0x40)) +		return; + +	if (!AR_SREV_9300(ah)) +		return; + +	bias = ar9003_modal_header(ah, is2ghz)->xlna_bias_strength; +	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS, +		      bias & 0x3); +	bias >>= 2; +	REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS, +		      bias & 0x3); +	bias >>= 2; +	REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS, +		      bias & 0x3); +} +  static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,  					     struct ath9k_channel *chan)  { -	ar9003_hw_xpa_bias_level_apply(ah, IS_CHAN_2GHZ(chan)); -	ar9003_hw_ant_ctrl_apply(ah, IS_CHAN_2GHZ(chan)); +	bool is2ghz = IS_CHAN_2GHZ(chan); +	ar9003_hw_xpa_timing_control_apply(ah, is2ghz); +	ar9003_hw_xpa_bias_level_apply(ah, is2ghz); +	ar9003_hw_ant_ctrl_apply(ah, is2ghz);  	ar9003_hw_drive_strength_apply(ah); +	ar9003_hw_xlna_bias_strength_apply(ah, is2ghz);  	ar9003_hw_atten_apply(ah, chan);  	ar9003_hw_quick_drop_apply(ah, chan->channel); -	if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah)) +	if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) && !AR_SREV_9550(ah))  		ar9003_hw_internal_regulator_apply(ah); -	if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah)) -		ar9003_hw_apply_tuning_caps(ah); -	ar9003_hw_txend_to_xpa_off_apply(ah, chan->channel); +	ar9003_hw_apply_tuning_caps(ah); +	ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz);  }  static void ath9k_hw_ar9300_set_addac(struct ath_hw *ah, @@ -5096,14 +5127,9 @@ s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah)  	return (eep->baseEepHeader.txrxgain) & 0xf; /* bits 3:0 */  } -u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is_2ghz) +u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is2ghz)  { -	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; - -	if (is_2ghz) -		return eep->modalHeader2G.spurChans; -	else -		return eep->modalHeader5G.spurChans; +	return ar9003_modal_header(ah, is2ghz)->spurChans;  }  unsigned int ar9003_get_paprd_scale_factor(struct ath_hw *ah, diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h index 2505ac44f0c..3a1ff55bceb 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h @@ -231,7 +231,8 @@ struct ar9300_modal_eep_header {  	__le32 papdRateMaskHt20;  	__le32 papdRateMaskHt40;  	__le16 switchcomspdt; -	u8 futureModal[8]; +	u8 xlna_bias_strength; +	u8 futureModal[7];  } __packed;  struct ar9300_cal_data_per_freq_op_loop { @@ -334,4 +335,7 @@ u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is_2ghz);  unsigned int ar9003_get_paprd_scale_factor(struct ath_hw *ah,  					   struct ath9k_channel *chan); + +void ar9003_hw_internal_regulator_apply(struct ath_hw *ah); +  #endif diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c index a0e3394b10d..1e8a4da5952 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c @@ -21,6 +21,7 @@  #include "ar9340_initvals.h"  #include "ar9330_1p1_initvals.h"  #include "ar9330_1p2_initvals.h" +#include "ar955x_1p0_initvals.h"  #include "ar9580_1p0_initvals.h"  #include "ar9462_2p0_initvals.h" @@ -43,408 +44,310 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)  		ar9462_2p0_baseband_core_txfir_coeff_japan_2484  	if (AR_SREV_9330_11(ah)) {  		/* mac */ -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], -				ar9331_1p1_mac_core, -				ARRAY_SIZE(ar9331_1p1_mac_core), 2); +				ar9331_1p1_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9331_1p1_mac_postamble, -				ARRAY_SIZE(ar9331_1p1_mac_postamble), 5); +				ar9331_1p1_mac_postamble);  		/* bb */ -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9331_1p1_baseband_core, -				ARRAY_SIZE(ar9331_1p1_baseband_core), 2); +				ar9331_1p1_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9331_1p1_baseband_postamble, -				ARRAY_SIZE(ar9331_1p1_baseband_postamble), 5); +				ar9331_1p1_baseband_postamble);  		/* radio */ -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9331_1p1_radio_core, -				ARRAY_SIZE(ar9331_1p1_radio_core), 2); -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], NULL, 0, 0); +				ar9331_1p1_radio_core);  		/* soc */  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9331_1p1_soc_preamble, -				ARRAY_SIZE(ar9331_1p1_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +				ar9331_1p1_soc_preamble);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], -				ar9331_1p1_soc_postamble, -				ARRAY_SIZE(ar9331_1p1_soc_postamble), 2); +				ar9331_1p1_soc_postamble);  		/* rx/tx gain */  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9331_common_rx_gain_1p1, -				ARRAY_SIZE(ar9331_common_rx_gain_1p1), 2); +				ar9331_common_rx_gain_1p1);  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_lowest_ob_db_tx_gain_1p1, -			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p1), -			5); +				ar9331_modes_lowest_ob_db_tx_gain_1p1);  		/* additional clock settings */  		if (ah->is_clk_25mhz)  			INIT_INI_ARRAY(&ah->iniAdditional, -					ar9331_1p1_xtal_25M, -					ARRAY_SIZE(ar9331_1p1_xtal_25M), 2); +					ar9331_1p1_xtal_25M);  		else  			INIT_INI_ARRAY(&ah->iniAdditional, -					ar9331_1p1_xtal_40M, -					ARRAY_SIZE(ar9331_1p1_xtal_40M), 2); +					ar9331_1p1_xtal_40M);  	} else if (AR_SREV_9330_12(ah)) {  		/* mac */ -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], -				ar9331_1p2_mac_core, -				ARRAY_SIZE(ar9331_1p2_mac_core), 2); +				ar9331_1p2_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9331_1p2_mac_postamble, -				ARRAY_SIZE(ar9331_1p2_mac_postamble), 5); +				ar9331_1p2_mac_postamble);  		/* bb */ -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9331_1p2_baseband_core, -				ARRAY_SIZE(ar9331_1p2_baseband_core), 2); +				ar9331_1p2_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9331_1p2_baseband_postamble, -				ARRAY_SIZE(ar9331_1p2_baseband_postamble), 5); +				ar9331_1p2_baseband_postamble);  		/* radio */ -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9331_1p2_radio_core, -				ARRAY_SIZE(ar9331_1p2_radio_core), 2); -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], NULL, 0, 0); +				ar9331_1p2_radio_core);  		/* soc */  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9331_1p2_soc_preamble, -				ARRAY_SIZE(ar9331_1p2_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +				ar9331_1p2_soc_preamble);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], -				ar9331_1p2_soc_postamble, -				ARRAY_SIZE(ar9331_1p2_soc_postamble), 2); +				ar9331_1p2_soc_postamble);  		/* rx/tx gain */  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9331_common_rx_gain_1p2, -				ARRAY_SIZE(ar9331_common_rx_gain_1p2), 2); +				ar9331_common_rx_gain_1p2);  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_lowest_ob_db_tx_gain_1p2, -			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p2), -			5); +				ar9331_modes_lowest_ob_db_tx_gain_1p2);  		/* additional clock settings */  		if (ah->is_clk_25mhz)  			INIT_INI_ARRAY(&ah->iniAdditional, -					ar9331_1p2_xtal_25M, -					ARRAY_SIZE(ar9331_1p2_xtal_25M), 2); +					ar9331_1p2_xtal_25M);  		else  			INIT_INI_ARRAY(&ah->iniAdditional, -					ar9331_1p2_xtal_40M, -					ARRAY_SIZE(ar9331_1p2_xtal_40M), 2); +					ar9331_1p2_xtal_40M);  	} else if (AR_SREV_9340(ah)) {  		/* mac */ -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], -				ar9340_1p0_mac_core, -				ARRAY_SIZE(ar9340_1p0_mac_core), 2); +				ar9340_1p0_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9340_1p0_mac_postamble, -				ARRAY_SIZE(ar9340_1p0_mac_postamble), 5); +				ar9340_1p0_mac_postamble);  		/* bb */ -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9340_1p0_baseband_core, -				ARRAY_SIZE(ar9340_1p0_baseband_core), 2); +				ar9340_1p0_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9340_1p0_baseband_postamble, -				ARRAY_SIZE(ar9340_1p0_baseband_postamble), 5); +				ar9340_1p0_baseband_postamble);  		/* radio */ -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9340_1p0_radio_core, -				ARRAY_SIZE(ar9340_1p0_radio_core), 2); +				ar9340_1p0_radio_core);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], -				ar9340_1p0_radio_postamble, -				ARRAY_SIZE(ar9340_1p0_radio_postamble), 5); +				ar9340_1p0_radio_postamble);  		/* soc */  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9340_1p0_soc_preamble, -				ARRAY_SIZE(ar9340_1p0_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +				ar9340_1p0_soc_preamble);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], -				ar9340_1p0_soc_postamble, -				ARRAY_SIZE(ar9340_1p0_soc_postamble), 5); +				ar9340_1p0_soc_postamble);  		/* rx/tx gain */  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9340Common_wo_xlna_rx_gain_table_1p0, -				ARRAY_SIZE(ar9340Common_wo_xlna_rx_gain_table_1p0), -				5); +				ar9340Common_wo_xlna_rx_gain_table_1p0);  		INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9340Modes_high_ob_db_tx_gain_table_1p0, -				ARRAY_SIZE(ar9340Modes_high_ob_db_tx_gain_table_1p0), -				5); +				ar9340Modes_high_ob_db_tx_gain_table_1p0);  		INIT_INI_ARRAY(&ah->iniModesFastClock, -				ar9340Modes_fast_clock_1p0, -				ARRAY_SIZE(ar9340Modes_fast_clock_1p0), -				3); +				ar9340Modes_fast_clock_1p0);  		if (!ah->is_clk_25mhz)  			INIT_INI_ARRAY(&ah->iniAdditional, -				       ar9340_1p0_radio_core_40M, -				       ARRAY_SIZE(ar9340_1p0_radio_core_40M), -				       2); +				       ar9340_1p0_radio_core_40M);  	} else if (AR_SREV_9485_11(ah)) {  		/* mac */ -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], -				ar9485_1_1_mac_core, -				ARRAY_SIZE(ar9485_1_1_mac_core), 2); +				ar9485_1_1_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9485_1_1_mac_postamble, -				ARRAY_SIZE(ar9485_1_1_mac_postamble), 5); +				ar9485_1_1_mac_postamble);  		/* bb */ -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], ar9485_1_1, -				ARRAY_SIZE(ar9485_1_1), 2); +		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], ar9485_1_1);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9485_1_1_baseband_core, -				ARRAY_SIZE(ar9485_1_1_baseband_core), 2); +				ar9485_1_1_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9485_1_1_baseband_postamble, -				ARRAY_SIZE(ar9485_1_1_baseband_postamble), 5); +				ar9485_1_1_baseband_postamble);  		/* radio */ -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9485_1_1_radio_core, -				ARRAY_SIZE(ar9485_1_1_radio_core), 2); +				ar9485_1_1_radio_core);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], -				ar9485_1_1_radio_postamble, -				ARRAY_SIZE(ar9485_1_1_radio_postamble), 2); +				ar9485_1_1_radio_postamble);  		/* soc */  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9485_1_1_soc_preamble, -				ARRAY_SIZE(ar9485_1_1_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], NULL, 0, 0); +				ar9485_1_1_soc_preamble);  		/* rx/tx gain */  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9485Common_wo_xlna_rx_gain_1_1, -				ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1), 2); +				ar9485Common_wo_xlna_rx_gain_1_1);  		INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9485_modes_lowest_ob_db_tx_gain_1_1, -				ARRAY_SIZE(ar9485_modes_lowest_ob_db_tx_gain_1_1), -				5); +				ar9485_modes_lowest_ob_db_tx_gain_1_1);  		/* Load PCIE SERDES settings from INI */  		/* Awake Setting */  		INIT_INI_ARRAY(&ah->iniPcieSerdes, -				ar9485_1_1_pcie_phy_clkreq_disable_L1, -				ARRAY_SIZE(ar9485_1_1_pcie_phy_clkreq_disable_L1), -				2); +				ar9485_1_1_pcie_phy_clkreq_disable_L1);  		/* Sleep Setting */  		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, -				ar9485_1_1_pcie_phy_clkreq_disable_L1, -				ARRAY_SIZE(ar9485_1_1_pcie_phy_clkreq_disable_L1), -				2); +				ar9485_1_1_pcie_phy_clkreq_disable_L1);  	} else if (AR_SREV_9462_20(ah)) { -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0); -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core, -				ARRAY_SIZE(ar9462_2p0_mac_core), 2); +		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9462_2p0_mac_postamble, -				ARRAY_SIZE(ar9462_2p0_mac_postamble), 5); +				ar9462_2p0_mac_postamble); -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9462_2p0_baseband_core, -				ARRAY_SIZE(ar9462_2p0_baseband_core), 2); +				ar9462_2p0_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9462_2p0_baseband_postamble, -				ARRAY_SIZE(ar9462_2p0_baseband_postamble), 5); +				ar9462_2p0_baseband_postamble); -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9462_2p0_radio_core, -				ARRAY_SIZE(ar9462_2p0_radio_core), 2); +				ar9462_2p0_radio_core);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], -				ar9462_2p0_radio_postamble, -				ARRAY_SIZE(ar9462_2p0_radio_postamble), 5); +				ar9462_2p0_radio_postamble);  		INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant, -				ar9462_2p0_radio_postamble_sys2ant, -				ARRAY_SIZE(ar9462_2p0_radio_postamble_sys2ant), -				5); +				ar9462_2p0_radio_postamble_sys2ant);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9462_2p0_soc_preamble, -				ARRAY_SIZE(ar9462_2p0_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +				ar9462_2p0_soc_preamble);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], -				ar9462_2p0_soc_postamble, -				ARRAY_SIZE(ar9462_2p0_soc_postamble), 5); +				ar9462_2p0_soc_postamble);  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9462_common_rx_gain_table_2p0, -				ARRAY_SIZE(ar9462_common_rx_gain_table_2p0), 2); +				ar9462_common_rx_gain_table_2p0);  		/* Awake -> Sleep Setting */  		INIT_INI_ARRAY(&ah->iniPcieSerdes, -				PCIE_PLL_ON_CREQ_DIS_L1_2P0, -				ARRAY_SIZE(PCIE_PLL_ON_CREQ_DIS_L1_2P0), -				2); +				PCIE_PLL_ON_CREQ_DIS_L1_2P0);  		/* Sleep -> Awake Setting */  		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, -				PCIE_PLL_ON_CREQ_DIS_L1_2P0, -				ARRAY_SIZE(PCIE_PLL_ON_CREQ_DIS_L1_2P0), -				2); +				PCIE_PLL_ON_CREQ_DIS_L1_2P0);  		/* Fast clock modal settings */  		INIT_INI_ARRAY(&ah->iniModesFastClock, -				ar9462_modes_fast_clock_2p0, -				ARRAY_SIZE(ar9462_modes_fast_clock_2p0), 3); +				ar9462_modes_fast_clock_2p0);  		INIT_INI_ARRAY(&ah->iniCckfirJapan2484, -				AR9462_BB_CTX_COEFJ(2p0), -				ARRAY_SIZE(AR9462_BB_CTX_COEFJ(2p0)), 2); +				AR9462_BB_CTX_COEFJ(2p0)); -		INIT_INI_ARRAY(&ah->ini_japan2484, AR9462_BBC_TXIFR_COEFFJ, -				ARRAY_SIZE(AR9462_BBC_TXIFR_COEFFJ), 2); +		INIT_INI_ARRAY(&ah->ini_japan2484, AR9462_BBC_TXIFR_COEFFJ); +	} else if (AR_SREV_9550(ah)) { +		/* mac */ +		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], +				ar955x_1p0_mac_core); +		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], +				ar955x_1p0_mac_postamble); + +		/* bb */ +		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], +				ar955x_1p0_baseband_core); +		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], +				ar955x_1p0_baseband_postamble); + +		/* radio */ +		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], +				ar955x_1p0_radio_core); +		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], +				ar955x_1p0_radio_postamble); + +		/* soc */ +		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], +				ar955x_1p0_soc_preamble); +		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], +				ar955x_1p0_soc_postamble); + +		/* rx/tx gain */ +		INIT_INI_ARRAY(&ah->iniModesRxGain, +			ar955x_1p0_common_wo_xlna_rx_gain_table); +		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds, +			ar955x_1p0_common_wo_xlna_rx_gain_bounds); +		INIT_INI_ARRAY(&ah->iniModesTxGain, +				ar955x_1p0_modes_xpa_tx_gain_table); +		/* Fast clock modal settings */ +		INIT_INI_ARRAY(&ah->iniModesFastClock, +				ar955x_1p0_modes_fast_clock);  	} else if (AR_SREV_9580(ah)) {  		/* mac */ -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], -				ar9580_1p0_mac_core, -				ARRAY_SIZE(ar9580_1p0_mac_core), 2); +				ar9580_1p0_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9580_1p0_mac_postamble, -				ARRAY_SIZE(ar9580_1p0_mac_postamble), 5); +				ar9580_1p0_mac_postamble);  		/* bb */ -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9580_1p0_baseband_core, -				ARRAY_SIZE(ar9580_1p0_baseband_core), 2); +				ar9580_1p0_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9580_1p0_baseband_postamble, -				ARRAY_SIZE(ar9580_1p0_baseband_postamble), 5); +				ar9580_1p0_baseband_postamble);  		/* radio */ -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9580_1p0_radio_core, -				ARRAY_SIZE(ar9580_1p0_radio_core), 2); +				ar9580_1p0_radio_core);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], -				ar9580_1p0_radio_postamble, -				ARRAY_SIZE(ar9580_1p0_radio_postamble), 5); +				ar9580_1p0_radio_postamble);  		/* soc */  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9580_1p0_soc_preamble, -				ARRAY_SIZE(ar9580_1p0_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +				ar9580_1p0_soc_preamble);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], -				ar9580_1p0_soc_postamble, -				ARRAY_SIZE(ar9580_1p0_soc_postamble), 5); +				ar9580_1p0_soc_postamble);  		/* rx/tx gain */  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9580_1p0_rx_gain_table, -				ARRAY_SIZE(ar9580_1p0_rx_gain_table), 2); +				ar9580_1p0_rx_gain_table);  		INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9580_1p0_low_ob_db_tx_gain_table, -				ARRAY_SIZE(ar9580_1p0_low_ob_db_tx_gain_table), -				5); +				ar9580_1p0_low_ob_db_tx_gain_table);  		INIT_INI_ARRAY(&ah->iniModesFastClock, -				ar9580_1p0_modes_fast_clock, -				ARRAY_SIZE(ar9580_1p0_modes_fast_clock), -				3); +				ar9580_1p0_modes_fast_clock);  	} else {  		/* mac */ -		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], -				ar9300_2p2_mac_core, -				ARRAY_SIZE(ar9300_2p2_mac_core), 2); +				ar9300_2p2_mac_core);  		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], -				ar9300_2p2_mac_postamble, -				ARRAY_SIZE(ar9300_2p2_mac_postamble), 5); +				ar9300_2p2_mac_postamble);  		/* bb */ -		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], -				ar9300_2p2_baseband_core, -				ARRAY_SIZE(ar9300_2p2_baseband_core), 2); +				ar9300_2p2_baseband_core);  		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], -				ar9300_2p2_baseband_postamble, -				ARRAY_SIZE(ar9300_2p2_baseband_postamble), 5); +				ar9300_2p2_baseband_postamble);  		/* radio */ -		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], -				ar9300_2p2_radio_core, -				ARRAY_SIZE(ar9300_2p2_radio_core), 2); +				ar9300_2p2_radio_core);  		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], -				ar9300_2p2_radio_postamble, -				ARRAY_SIZE(ar9300_2p2_radio_postamble), 5); +				ar9300_2p2_radio_postamble);  		/* soc */  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], -				ar9300_2p2_soc_preamble, -				ARRAY_SIZE(ar9300_2p2_soc_preamble), 2); -		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +				ar9300_2p2_soc_preamble);  		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], -				ar9300_2p2_soc_postamble, -				ARRAY_SIZE(ar9300_2p2_soc_postamble), 5); +				ar9300_2p2_soc_postamble);  		/* rx/tx gain */  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9300Common_rx_gain_table_2p2, -				ARRAY_SIZE(ar9300Common_rx_gain_table_2p2), 2); +				ar9300Common_rx_gain_table_2p2);  		INIT_INI_ARRAY(&ah->iniModesTxGain, -				ar9300Modes_lowest_ob_db_tx_gain_table_2p2, -				ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p2), -				5); +				ar9300Modes_lowest_ob_db_tx_gain_table_2p2);  		/* Load PCIE SERDES settings from INI */  		/* Awake Setting */  		INIT_INI_ARRAY(&ah->iniPcieSerdes, -				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2, -				ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2), -				2); +				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);  		/* Sleep Setting */  		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, -				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2, -				ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2), -				2); +				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);  		/* Fast clock modal settings */  		INIT_INI_ARRAY(&ah->iniModesFastClock, -				ar9300Modes_fast_clock_2p2, -				ARRAY_SIZE(ar9300Modes_fast_clock_2p2), -				3); +				ar9300Modes_fast_clock_2p2);  	}  } @@ -452,146 +355,110 @@ static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)  {  	if (AR_SREV_9330_12(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_lowest_ob_db_tx_gain_1p2, -			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p2), -			5); +			ar9331_modes_lowest_ob_db_tx_gain_1p2);  	else if (AR_SREV_9330_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_lowest_ob_db_tx_gain_1p1, -			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p1), -			5); +			ar9331_modes_lowest_ob_db_tx_gain_1p1);  	else if (AR_SREV_9340(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9340Modes_lowest_ob_db_tx_gain_table_1p0, -			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0), -			5); +			ar9340Modes_lowest_ob_db_tx_gain_table_1p0);  	else if (AR_SREV_9485_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9485_modes_lowest_ob_db_tx_gain_1_1, -			ARRAY_SIZE(ar9485_modes_lowest_ob_db_tx_gain_1_1), -			5); +			ar9485_modes_lowest_ob_db_tx_gain_1_1); +	else if (AR_SREV_9550(ah)) +		INIT_INI_ARRAY(&ah->iniModesTxGain, +			ar955x_1p0_modes_xpa_tx_gain_table);  	else if (AR_SREV_9580(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9580_1p0_lowest_ob_db_tx_gain_table, -			ARRAY_SIZE(ar9580_1p0_lowest_ob_db_tx_gain_table), -			5); +			ar9580_1p0_lowest_ob_db_tx_gain_table);  	else if (AR_SREV_9462_20(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9462_modes_low_ob_db_tx_gain_table_2p0, -			ARRAY_SIZE(ar9462_modes_low_ob_db_tx_gain_table_2p0), -			5); +			ar9462_modes_low_ob_db_tx_gain_table_2p0);  	else  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9300Modes_lowest_ob_db_tx_gain_table_2p2, -			ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p2), -			5); +			ar9300Modes_lowest_ob_db_tx_gain_table_2p2);  }  static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)  {  	if (AR_SREV_9330_12(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_high_ob_db_tx_gain_1p2, -			ARRAY_SIZE(ar9331_modes_high_ob_db_tx_gain_1p2), -			5); +			ar9331_modes_high_ob_db_tx_gain_1p2);  	else if (AR_SREV_9330_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_high_ob_db_tx_gain_1p1, -			ARRAY_SIZE(ar9331_modes_high_ob_db_tx_gain_1p1), -			5); +			ar9331_modes_high_ob_db_tx_gain_1p1);  	else if (AR_SREV_9340(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9340Modes_lowest_ob_db_tx_gain_table_1p0, -			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0), -			5); +			ar9340Modes_high_ob_db_tx_gain_table_1p0);  	else if (AR_SREV_9485_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9485Modes_high_ob_db_tx_gain_1_1, -			ARRAY_SIZE(ar9485Modes_high_ob_db_tx_gain_1_1), -			5); +			ar9485Modes_high_ob_db_tx_gain_1_1);  	else if (AR_SREV_9580(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9580_1p0_high_ob_db_tx_gain_table, -			ARRAY_SIZE(ar9580_1p0_high_ob_db_tx_gain_table), -			5); +			ar9580_1p0_high_ob_db_tx_gain_table); +	else if (AR_SREV_9550(ah)) +		INIT_INI_ARRAY(&ah->iniModesTxGain, +			ar955x_1p0_modes_no_xpa_tx_gain_table);  	else if (AR_SREV_9462_20(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9462_modes_high_ob_db_tx_gain_table_2p0, -			ARRAY_SIZE(ar9462_modes_high_ob_db_tx_gain_table_2p0), -			5); +			ar9462_modes_high_ob_db_tx_gain_table_2p0);  	else  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9300Modes_high_ob_db_tx_gain_table_2p2, -			ARRAY_SIZE(ar9300Modes_high_ob_db_tx_gain_table_2p2), -			5); +			ar9300Modes_high_ob_db_tx_gain_table_2p2);  }  static void ar9003_tx_gain_table_mode2(struct ath_hw *ah)  {  	if (AR_SREV_9330_12(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_low_ob_db_tx_gain_1p2, -			ARRAY_SIZE(ar9331_modes_low_ob_db_tx_gain_1p2), -			5); +			ar9331_modes_low_ob_db_tx_gain_1p2);  	else if (AR_SREV_9330_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_low_ob_db_tx_gain_1p1, -			ARRAY_SIZE(ar9331_modes_low_ob_db_tx_gain_1p1), -			5); +			ar9331_modes_low_ob_db_tx_gain_1p1);  	else if (AR_SREV_9340(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9340Modes_lowest_ob_db_tx_gain_table_1p0, -			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0), -			5); +			ar9340Modes_low_ob_db_tx_gain_table_1p0);  	else if (AR_SREV_9485_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9485Modes_low_ob_db_tx_gain_1_1, -			ARRAY_SIZE(ar9485Modes_low_ob_db_tx_gain_1_1), -			5); +			ar9485Modes_low_ob_db_tx_gain_1_1);  	else if (AR_SREV_9580(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9580_1p0_low_ob_db_tx_gain_table, -			ARRAY_SIZE(ar9580_1p0_low_ob_db_tx_gain_table), -			5); +			ar9580_1p0_low_ob_db_tx_gain_table);  	else  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9300Modes_low_ob_db_tx_gain_table_2p2, -			ARRAY_SIZE(ar9300Modes_low_ob_db_tx_gain_table_2p2), -			5); +			ar9300Modes_low_ob_db_tx_gain_table_2p2);  }  static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)  {  	if (AR_SREV_9330_12(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_high_power_tx_gain_1p2, -			ARRAY_SIZE(ar9331_modes_high_power_tx_gain_1p2), -			5); +			ar9331_modes_high_power_tx_gain_1p2);  	else if (AR_SREV_9330_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9331_modes_high_power_tx_gain_1p1, -			ARRAY_SIZE(ar9331_modes_high_power_tx_gain_1p1), -			5); +			ar9331_modes_high_power_tx_gain_1p1);  	else if (AR_SREV_9340(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9340Modes_lowest_ob_db_tx_gain_table_1p0, -			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0), -			5); +			ar9340Modes_high_power_tx_gain_table_1p0);  	else if (AR_SREV_9485_11(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9485Modes_high_power_tx_gain_1_1, -			ARRAY_SIZE(ar9485Modes_high_power_tx_gain_1_1), -			5); +			ar9485Modes_high_power_tx_gain_1_1);  	else if (AR_SREV_9580(ah))  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9580_1p0_high_power_tx_gain_table, -			ARRAY_SIZE(ar9580_1p0_high_power_tx_gain_table), -			5); +			ar9580_1p0_high_power_tx_gain_table);  	else  		INIT_INI_ARRAY(&ah->iniModesTxGain, -			ar9300Modes_high_power_tx_gain_table_2p2, -			ARRAY_SIZE(ar9300Modes_high_power_tx_gain_table_2p2), -			5); +			ar9300Modes_high_power_tx_gain_table_2p2); +} + +static void ar9003_tx_gain_table_mode4(struct ath_hw *ah) +{ +	if (AR_SREV_9340(ah)) +		INIT_INI_ARRAY(&ah->iniModesTxGain, +			ar9340Modes_mixed_ob_db_tx_gain_table_1p0); +	else if (AR_SREV_9580(ah)) +		INIT_INI_ARRAY(&ah->iniModesTxGain, +			ar9580_1p0_mixed_ob_db_tx_gain_table);  }  static void ar9003_tx_gain_table_apply(struct ath_hw *ah) @@ -610,6 +477,9 @@ static void ar9003_tx_gain_table_apply(struct ath_hw *ah)  	case 3:  		ar9003_tx_gain_table_mode3(ah);  		break; +	case 4: +		ar9003_tx_gain_table_mode4(ah); +		break;  	}  } @@ -617,86 +487,67 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)  {  	if (AR_SREV_9330_12(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9331_common_rx_gain_1p2, -				ARRAY_SIZE(ar9331_common_rx_gain_1p2), -				2); +				ar9331_common_rx_gain_1p2);  	else if (AR_SREV_9330_11(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9331_common_rx_gain_1p1, -				ARRAY_SIZE(ar9331_common_rx_gain_1p1), -				2); +				ar9331_common_rx_gain_1p1);  	else if (AR_SREV_9340(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9340Common_rx_gain_table_1p0, -				ARRAY_SIZE(ar9340Common_rx_gain_table_1p0), -				2); +				ar9340Common_rx_gain_table_1p0);  	else if (AR_SREV_9485_11(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9485Common_wo_xlna_rx_gain_1_1, -				ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1), -				2); -	else if (AR_SREV_9580(ah)) +				ar9485Common_wo_xlna_rx_gain_1_1); +	else if (AR_SREV_9550(ah)) { +		INIT_INI_ARRAY(&ah->iniModesRxGain, +				ar955x_1p0_common_rx_gain_table); +		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds, +				ar955x_1p0_common_rx_gain_bounds); +	} else if (AR_SREV_9580(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9580_1p0_rx_gain_table, -				ARRAY_SIZE(ar9580_1p0_rx_gain_table), -				2); +				ar9580_1p0_rx_gain_table);  	else if (AR_SREV_9462_20(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9462_common_rx_gain_table_2p0, -				ARRAY_SIZE(ar9462_common_rx_gain_table_2p0), -				2); +				ar9462_common_rx_gain_table_2p0);  	else  		INIT_INI_ARRAY(&ah->iniModesRxGain, -				ar9300Common_rx_gain_table_2p2, -				ARRAY_SIZE(ar9300Common_rx_gain_table_2p2), -				2); +				ar9300Common_rx_gain_table_2p2);  }  static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)  {  	if (AR_SREV_9330_12(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9331_common_wo_xlna_rx_gain_1p2, -			ARRAY_SIZE(ar9331_common_wo_xlna_rx_gain_1p2), -			2); +			ar9331_common_wo_xlna_rx_gain_1p2);  	else if (AR_SREV_9330_11(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9331_common_wo_xlna_rx_gain_1p1, -			ARRAY_SIZE(ar9331_common_wo_xlna_rx_gain_1p1), -			2); +			ar9331_common_wo_xlna_rx_gain_1p1);  	else if (AR_SREV_9340(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9340Common_wo_xlna_rx_gain_table_1p0, -			ARRAY_SIZE(ar9340Common_wo_xlna_rx_gain_table_1p0), -			2); +			ar9340Common_wo_xlna_rx_gain_table_1p0);  	else if (AR_SREV_9485_11(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9485Common_wo_xlna_rx_gain_1_1, -			ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1), -			2); +			ar9485Common_wo_xlna_rx_gain_1_1);  	else if (AR_SREV_9462_20(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9462_common_wo_xlna_rx_gain_table_2p0, -			ARRAY_SIZE(ar9462_common_wo_xlna_rx_gain_table_2p0), -			2); -	else if (AR_SREV_9580(ah)) +			ar9462_common_wo_xlna_rx_gain_table_2p0); +	else if (AR_SREV_9550(ah)) { +		INIT_INI_ARRAY(&ah->iniModesRxGain, +			ar955x_1p0_common_wo_xlna_rx_gain_table); +		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds, +			ar955x_1p0_common_wo_xlna_rx_gain_bounds); +	} else if (AR_SREV_9580(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9580_1p0_wo_xlna_rx_gain_table, -			ARRAY_SIZE(ar9580_1p0_wo_xlna_rx_gain_table), -			2); +			ar9580_1p0_wo_xlna_rx_gain_table);  	else  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			ar9300Common_wo_xlna_rx_gain_table_2p2, -			ARRAY_SIZE(ar9300Common_wo_xlna_rx_gain_table_2p2), -			2); +			ar9300Common_wo_xlna_rx_gain_table_2p2);  }  static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)  {  	if (AR_SREV_9462_20(ah))  		INIT_INI_ARRAY(&ah->iniModesRxGain, -			       ar9462_common_mixed_rx_gain_table_2p0, -			       ARRAY_SIZE(ar9462_common_mixed_rx_gain_table_2p0), 2); +			       ar9462_common_mixed_rx_gain_table_2p0);  }  static void ar9003_rx_gain_table_apply(struct ath_hw *ah) diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index d9e0824af09..78816b8b217 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c @@ -181,11 +181,14 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)  	u32 mask2 = 0;  	struct ath9k_hw_capabilities *pCap = &ah->caps;  	struct ath_common *common = ath9k_hw_common(ah); -	u32 sync_cause = 0, async_cause; +	u32 sync_cause = 0, async_cause, async_mask = AR_INTR_MAC_IRQ; + +	if (ath9k_hw_mci_is_enabled(ah)) +		async_mask |= AR_INTR_ASYNC_MASK_MCI;  	async_cause = REG_READ(ah, AR_INTR_ASYNC_CAUSE); -	if (async_cause & (AR_INTR_MAC_IRQ | AR_INTR_ASYNC_MASK_MCI)) { +	if (async_cause & async_mask) {  		if ((REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M)  				== AR_RTC_STATUS_ON)  			isr = REG_READ(ah, AR_ISR); diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c index ffbb180f91e..9a34fcaae3f 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c @@ -35,31 +35,30 @@ static int ar9003_mci_wait_for_interrupt(struct ath_hw *ah, u32 address,  	struct ath_common *common = ath9k_hw_common(ah);  	while (time_out) { -		if (REG_READ(ah, address) & bit_position) { -			REG_WRITE(ah, address, bit_position); +		if (!(REG_READ(ah, address) & bit_position)) { +			udelay(10); +			time_out -= 10; -			if (address == AR_MCI_INTERRUPT_RX_MSG_RAW) { -				if (bit_position & -				    AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE) -					ar9003_mci_reset_req_wakeup(ah); - -				if (bit_position & -				    (AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING | -				     AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING)) -					REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, -					AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE); +			if (time_out < 0) +				break; +			else +				continue; +		} +		REG_WRITE(ah, address, bit_position); -				REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, -					  AR_MCI_INTERRUPT_RX_MSG); -			} +		if (address != AR_MCI_INTERRUPT_RX_MSG_RAW)  			break; -		} -		udelay(10); -		time_out -= 10; +		if (bit_position & AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE) +			ar9003_mci_reset_req_wakeup(ah); -		if (time_out < 0) -			break; +		if (bit_position & (AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING | +				    AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING)) +			REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, +				  AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE); + +		REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_RX_MSG); +		break;  	}  	if (time_out <= 0) { @@ -127,14 +126,13 @@ static void ar9003_mci_send_coex_version_query(struct ath_hw *ah,  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;  	u32 payload[4] = {0, 0, 0, 0}; -	if (!mci->bt_version_known && -	    (mci->bt_state != MCI_BT_SLEEP)) { -		MCI_GPM_SET_TYPE_OPCODE(payload, -					MCI_GPM_COEX_AGENT, -					MCI_GPM_COEX_VERSION_QUERY); -		ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, -					wait_done, true); -	} +	if (mci->bt_version_known || +	    (mci->bt_state == MCI_BT_SLEEP)) +		return; + +	MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT, +				MCI_GPM_COEX_VERSION_QUERY); +	ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true);  }  static void ar9003_mci_send_coex_version_response(struct ath_hw *ah, @@ -158,15 +156,14 @@ static void ar9003_mci_send_coex_wlan_channels(struct ath_hw *ah,  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;  	u32 *payload = &mci->wlan_channels[0]; -	if ((mci->wlan_channels_update == true) && -	    (mci->bt_state != MCI_BT_SLEEP)) { -		MCI_GPM_SET_TYPE_OPCODE(payload, -					MCI_GPM_COEX_AGENT, -					MCI_GPM_COEX_WLAN_CHANNELS); -		ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, -					wait_done, true); -		MCI_GPM_SET_TYPE_OPCODE(payload, 0xff, 0xff); -	} +	if (!mci->wlan_channels_update || +	    (mci->bt_state == MCI_BT_SLEEP)) +		return; + +	MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT, +				MCI_GPM_COEX_WLAN_CHANNELS); +	ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); +	MCI_GPM_SET_TYPE_OPCODE(payload, 0xff, 0xff);  }  static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah, @@ -174,29 +171,30 @@ static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah,  {  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;  	u32 payload[4] = {0, 0, 0, 0}; -	bool query_btinfo = !!(query_type & (MCI_GPM_COEX_QUERY_BT_ALL_INFO | -					     MCI_GPM_COEX_QUERY_BT_TOPOLOGY)); - -	if (mci->bt_state != MCI_BT_SLEEP) { +	bool query_btinfo; -		MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT, -					MCI_GPM_COEX_STATUS_QUERY); +	if (mci->bt_state == MCI_BT_SLEEP) +		return; -		*(((u8 *)payload) + MCI_GPM_COEX_B_BT_BITMAP) = query_type; +	query_btinfo = !!(query_type & (MCI_GPM_COEX_QUERY_BT_ALL_INFO | +					MCI_GPM_COEX_QUERY_BT_TOPOLOGY)); +	MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT, +				MCI_GPM_COEX_STATUS_QUERY); -		/* -		 * If bt_status_query message is  not sent successfully, -		 * then need_flush_btinfo should be set again. -		 */ -		if (!ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, -					     wait_done, true)) { -			if (query_btinfo) -				mci->need_flush_btinfo = true; -		} +	*(((u8 *)payload) + MCI_GPM_COEX_B_BT_BITMAP) = query_type; +	/* +	 * If bt_status_query message is  not sent successfully, +	 * then need_flush_btinfo should be set again. +	 */ +	if (!ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, +				wait_done, true)) {  		if (query_btinfo) -			mci->query_bt = false; +			mci->need_flush_btinfo = true;  	} + +	if (query_btinfo) +		mci->query_bt = false;  }  static void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt, @@ -241,73 +239,73 @@ static void ar9003_mci_prep_interface(struct ath_hw *ah)  	ar9003_mci_remote_reset(ah, true);  	ar9003_mci_send_req_wake(ah, true); -	if (ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, -				  AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING, 500)) { +	if (!ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, +				  AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING, 500)) +		goto clear_redunt; -		mci->bt_state = MCI_BT_AWAKE; +	mci->bt_state = MCI_BT_AWAKE; -		/* -		 * we don't need to send more remote_reset at this moment. -		 * If BT receive first remote_reset, then BT HW will -		 * be cleaned up and will be able to receive req_wake -		 * and BT HW will respond sys_waking. -		 * In this case, WLAN will receive BT's HW sys_waking. -		 * Otherwise, if BT SW missed initial remote_reset, -		 * that remote_reset will still clean up BT MCI RX, -		 * and the req_wake will wake BT up, -		 * and BT SW will respond this req_wake with a remote_reset and -		 * sys_waking. In this case, WLAN will receive BT's SW -		 * sys_waking. In either case, BT's RX is cleaned up. So we -		 * don't need to reply BT's remote_reset now, if any. -		 * Similarly, if in any case, WLAN can receive BT's sys_waking, -		 * that means WLAN's RX is also fine. -		 */ -		ar9003_mci_send_sys_waking(ah, true); -		udelay(10); +	/* +	 * we don't need to send more remote_reset at this moment. +	 * If BT receive first remote_reset, then BT HW will +	 * be cleaned up and will be able to receive req_wake +	 * and BT HW will respond sys_waking. +	 * In this case, WLAN will receive BT's HW sys_waking. +	 * Otherwise, if BT SW missed initial remote_reset, +	 * that remote_reset will still clean up BT MCI RX, +	 * and the req_wake will wake BT up, +	 * and BT SW will respond this req_wake with a remote_reset and +	 * sys_waking. In this case, WLAN will receive BT's SW +	 * sys_waking. In either case, BT's RX is cleaned up. So we +	 * don't need to reply BT's remote_reset now, if any. +	 * Similarly, if in any case, WLAN can receive BT's sys_waking, +	 * that means WLAN's RX is also fine. +	 */ +	ar9003_mci_send_sys_waking(ah, true); +	udelay(10); -		/* -		 * Set BT priority interrupt value to be 0xff to -		 * avoid having too many BT PRIORITY interrupts. -		 */ -		REG_WRITE(ah, AR_MCI_BT_PRI0, 0xFFFFFFFF); -		REG_WRITE(ah, AR_MCI_BT_PRI1, 0xFFFFFFFF); -		REG_WRITE(ah, AR_MCI_BT_PRI2, 0xFFFFFFFF); -		REG_WRITE(ah, AR_MCI_BT_PRI3, 0xFFFFFFFF); -		REG_WRITE(ah, AR_MCI_BT_PRI, 0X000000FF); +	/* +	 * Set BT priority interrupt value to be 0xff to +	 * avoid having too many BT PRIORITY interrupts. +	 */ +	REG_WRITE(ah, AR_MCI_BT_PRI0, 0xFFFFFFFF); +	REG_WRITE(ah, AR_MCI_BT_PRI1, 0xFFFFFFFF); +	REG_WRITE(ah, AR_MCI_BT_PRI2, 0xFFFFFFFF); +	REG_WRITE(ah, AR_MCI_BT_PRI3, 0xFFFFFFFF); +	REG_WRITE(ah, AR_MCI_BT_PRI, 0X000000FF); -		/* -		 * A contention reset will be received after send out -		 * sys_waking. Also BT priority interrupt bits will be set. -		 * Clear those bits before the next step. -		 */ +	/* +	 * A contention reset will be received after send out +	 * sys_waking. Also BT priority interrupt bits will be set. +	 * Clear those bits before the next step. +	 */ -		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, -			  AR_MCI_INTERRUPT_RX_MSG_CONT_RST); -		REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, -			  AR_MCI_INTERRUPT_BT_PRI); +	REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, +		  AR_MCI_INTERRUPT_RX_MSG_CONT_RST); +	REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_BT_PRI); -		if (mci->is_2g) { -			ar9003_mci_send_lna_transfer(ah, true); -			udelay(5); -		} +	if (mci->is_2g) { +		ar9003_mci_send_lna_transfer(ah, true); +		udelay(5); +	} -		if ((mci->is_2g && !mci->update_2g5g)) { -			if (ar9003_mci_wait_for_interrupt(ah, -					  AR_MCI_INTERRUPT_RX_MSG_RAW, -					  AR_MCI_INTERRUPT_RX_MSG_LNA_INFO, -					  mci_timeout)) -				ath_dbg(common, MCI, -					"MCI WLAN has control over the LNA & BT obeys it\n"); -			else -				ath_dbg(common, MCI, -					"MCI BT didn't respond to LNA_TRANS\n"); -		} +	if ((mci->is_2g && !mci->update_2g5g)) { +		if (ar9003_mci_wait_for_interrupt(ah, +					AR_MCI_INTERRUPT_RX_MSG_RAW, +					AR_MCI_INTERRUPT_RX_MSG_LNA_INFO, +					mci_timeout)) +			ath_dbg(common, MCI, +				"MCI WLAN has control over the LNA & BT obeys it\n"); +		else +			ath_dbg(common, MCI, +				"MCI BT didn't respond to LNA_TRANS\n");  	} +clear_redunt:  	/* Clear the extra redundant SYS_WAKING from BT */  	if ((mci->bt_state == MCI_BT_AWAKE) && -		(REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, -				AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING)) && +	    (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, +			    AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING)) &&  	    (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,  			    AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING) == 0)) {  		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, @@ -323,14 +321,13 @@ void ar9003_mci_set_full_sleep(struct ath_hw *ah)  {  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; -	if (ar9003_mci_state(ah, MCI_STATE_ENABLE, NULL) && +	if (ar9003_mci_state(ah, MCI_STATE_ENABLE) &&  	    (mci->bt_state != MCI_BT_SLEEP) &&  	    !mci->halted_bt_gpm) {  		ar9003_mci_send_coex_halt_bt_gpm(ah, true, true);  	}  	mci->ready = false; -	REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);  }  static void ar9003_mci_disable_interrupt(struct ath_hw *ah) @@ -487,7 +484,7 @@ static void ar9003_mci_sync_bt_state(struct ath_hw *ah)  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;  	u32 cur_bt_state; -	cur_bt_state = ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL); +	cur_bt_state = ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP);  	if (mci->bt_state != cur_bt_state)  		mci->bt_state = cur_bt_state; @@ -596,8 +593,7 @@ static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,  		if (!time_out)  			break; -		offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET, -					  &more_data); +		offset = ar9003_mci_get_next_gpm_offset(ah, false, &more_data);  		if (offset == MCI_GPM_INVALID)  			continue; @@ -615,9 +611,9 @@ static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,  				}  				break;  			} -		} else if ((recv_type == gpm_type) && (recv_opcode == gpm_opcode)) { +		} else if ((recv_type == gpm_type) && +			   (recv_opcode == gpm_opcode))  			break; -		}  		/*  		 * check if it's cal_grant @@ -661,8 +657,7 @@ static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,  		time_out = 0;  	while (more_data == MCI_GPM_MORE) { -		offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET, -					  &more_data); +		offset = ar9003_mci_get_next_gpm_offset(ah, false, &more_data);  		if (offset == MCI_GPM_INVALID)  			break; @@ -731,38 +726,38 @@ int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (!IS_CHAN_2GHZ(chan) || (mci_hw->bt_state != MCI_BT_SLEEP))  		goto exit; -	if (ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET) || -	    ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)) { +	if (!ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET) && +	    !ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)) +		goto exit; -		/* -		 * BT is sleeping. Check if BT wakes up during -		 * WLAN calibration. If BT wakes up during -		 * WLAN calibration, need to go through all -		 * message exchanges again and recal. -		 */ -		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, -			  AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET | -			  AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE); +	/* +	 * BT is sleeping. Check if BT wakes up during +	 * WLAN calibration. If BT wakes up during +	 * WLAN calibration, need to go through all +	 * message exchanges again and recal. +	 */ +	REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, +		  (AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET | +		   AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)); -		ar9003_mci_remote_reset(ah, true); -		ar9003_mci_send_sys_waking(ah, true); -		udelay(1); +	ar9003_mci_remote_reset(ah, true); +	ar9003_mci_send_sys_waking(ah, true); +	udelay(1); -		if (IS_CHAN_2GHZ(chan)) -			ar9003_mci_send_lna_transfer(ah, true); +	if (IS_CHAN_2GHZ(chan)) +		ar9003_mci_send_lna_transfer(ah, true); -		mci_hw->bt_state = MCI_BT_AWAKE; +	mci_hw->bt_state = MCI_BT_AWAKE; -		if (caldata) { -			caldata->done_txiqcal_once = false; -			caldata->done_txclcal_once = false; -			caldata->rtt_done = false; -		} +	if (caldata) { +		caldata->done_txiqcal_once = false; +		caldata->done_txclcal_once = false; +		caldata->rtt_done = false; +	} -		if (!ath9k_hw_init_cal(ah, chan)) -			return -EIO; +	if (!ath9k_hw_init_cal(ah, chan)) +		return -EIO; -	}  exit:  	ar9003_mci_enable_interrupt(ah);  	return 0; @@ -772,10 +767,6 @@ static void ar9003_mci_mute_bt(struct ath_hw *ah)  {  	/* disable all MCI messages */  	REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000); -	REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, 0xffffffff); -	REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS1, 0xffffffff); -	REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS2, 0xffffffff); -	REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS3, 0xffffffff);  	REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);  	/* wait pending HW messages to flush out */ @@ -798,29 +789,27 @@ static void ar9003_mci_osla_setup(struct ath_hw *ah, bool enable)  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;  	u32 thresh; -	if (enable) { -		REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, -			      AR_MCI_SCHD_TABLE_2_HW_BASED, 1); -		REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, -			      AR_MCI_SCHD_TABLE_2_MEM_BASED, 1); - -		if (!(mci->config & ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) { -			thresh = MS(mci->config, ATH_MCI_CONFIG_AGGR_THRESH); -			REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, -				      AR_BTCOEX_CTRL_AGGR_THRESH, thresh); -			REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, -				      AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 1); -		} else { -			REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, -				      AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 0); -		} - -		REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, -			      AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN, 1); -	} else { +	if (!enable) {  		REG_CLR_BIT(ah, AR_BTCOEX_CTRL,  			    AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); +		return;  	} +	REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_HW_BASED, 1); +	REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, +		      AR_MCI_SCHD_TABLE_2_MEM_BASED, 1); + +	if (!(mci->config & ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) { +		thresh = MS(mci->config, ATH_MCI_CONFIG_AGGR_THRESH); +		REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, +			      AR_BTCOEX_CTRL_AGGR_THRESH, thresh); +		REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, +			      AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 1); +	} else +		REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, +			      AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 0); + +	REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, +		      AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN, 1);  }  void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, @@ -898,13 +887,16 @@ void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,  		udelay(100);  	} +	/* Check pending GPM msg before MCI Reset Rx */ +	ar9003_mci_check_gpm_offset(ah); +  	regval |= SM(1, AR_MCI_COMMAND2_RESET_RX);  	REG_WRITE(ah, AR_MCI_COMMAND2, regval);  	udelay(1);  	regval &= ~SM(1, AR_MCI_COMMAND2_RESET_RX);  	REG_WRITE(ah, AR_MCI_COMMAND2, regval); -	ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL); +	ar9003_mci_get_next_gpm_offset(ah, true, NULL);  	REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE,  		  (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) | @@ -943,26 +935,27 @@ static void ar9003_mci_send_2g5g_status(struct ath_hw *ah, bool wait_done)  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;  	u32 new_flags, to_set, to_clear; -	if (mci->update_2g5g && (mci->bt_state != MCI_BT_SLEEP)) { -		if (mci->is_2g) { -			new_flags = MCI_2G_FLAGS; -			to_clear = MCI_2G_FLAGS_CLEAR_MASK; -			to_set = MCI_2G_FLAGS_SET_MASK; -		} else { -			new_flags = MCI_5G_FLAGS; -			to_clear = MCI_5G_FLAGS_CLEAR_MASK; -			to_set = MCI_5G_FLAGS_SET_MASK; -		} +	if (!mci->update_2g5g || (mci->bt_state == MCI_BT_SLEEP)) +		return; -		if (to_clear) -			ar9003_mci_send_coex_bt_flags(ah, wait_done, +	if (mci->is_2g) { +		new_flags = MCI_2G_FLAGS; +		to_clear = MCI_2G_FLAGS_CLEAR_MASK; +		to_set = MCI_2G_FLAGS_SET_MASK; +	} else { +		new_flags = MCI_5G_FLAGS; +		to_clear = MCI_5G_FLAGS_CLEAR_MASK; +		to_set = MCI_5G_FLAGS_SET_MASK; +	} + +	if (to_clear) +		ar9003_mci_send_coex_bt_flags(ah, wait_done,  					      MCI_GPM_COEX_BT_FLAGS_CLEAR,  					      to_clear); -		if (to_set) -			ar9003_mci_send_coex_bt_flags(ah, wait_done, +	if (to_set) +		ar9003_mci_send_coex_bt_flags(ah, wait_done,  					      MCI_GPM_COEX_BT_FLAGS_SET,  					      to_set); -	}  }  static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header, @@ -1014,38 +1007,36 @@ static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header,  	}  } -void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool wait_done) +void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool force)  {  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; -	if (mci->update_2g5g) { -		if (mci->is_2g) { -			ar9003_mci_send_2g5g_status(ah, true); -			ar9003_mci_send_lna_transfer(ah, true); -			udelay(5); +	if (!mci->update_2g5g && !force) +		return; -			REG_CLR_BIT(ah, AR_MCI_TX_CTRL, -				    AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); -			REG_CLR_BIT(ah, AR_PHY_GLB_CONTROL, -				    AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); +	if (mci->is_2g) { +		ar9003_mci_send_2g5g_status(ah, true); +		ar9003_mci_send_lna_transfer(ah, true); +		udelay(5); -			if (!(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) { -				REG_SET_BIT(ah, AR_BTCOEX_CTRL, -					    AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); -			} -		} else { -			ar9003_mci_send_lna_take(ah, true); -			udelay(5); +		REG_CLR_BIT(ah, AR_MCI_TX_CTRL, +			    AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); +		REG_CLR_BIT(ah, AR_PHY_GLB_CONTROL, +			    AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); -			REG_SET_BIT(ah, AR_MCI_TX_CTRL, -				    AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); -			REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, -				    AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); -			REG_CLR_BIT(ah, AR_BTCOEX_CTRL, -				    AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); +		if (!(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) +			ar9003_mci_osla_setup(ah, true); +	} else { +		ar9003_mci_send_lna_take(ah, true); +		udelay(5); -			ar9003_mci_send_2g5g_status(ah, true); -		} +		REG_SET_BIT(ah, AR_MCI_TX_CTRL, +			    AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); +		REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, +			    AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); + +		ar9003_mci_osla_setup(ah, false); +		ar9003_mci_send_2g5g_status(ah, true);  	}  } @@ -1132,7 +1123,7 @@ void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable)  	if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_GRANT, 0, 50000)) {  		ath_dbg(common, MCI, "MCI BT_CAL_GRANT received\n");  	} else { -		is_reusable = false; +		*is_reusable = false;  		ath_dbg(common, MCI, "MCI BT_CAL_GRANT not received\n");  	}  } @@ -1173,11 +1164,10 @@ void ar9003_mci_cleanup(struct ath_hw *ah)  }  EXPORT_SYMBOL(ar9003_mci_cleanup); -u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data) +u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)  { -	struct ath_common *common = ath9k_hw_common(ah);  	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; -	u32 value = 0, more_gpm = 0, gpm_ptr; +	u32 value = 0;  	u8 query_type;  	switch (state_type) { @@ -1190,81 +1180,6 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)  		}  		value &= AR_BTCOEX_CTRL_MCI_MODE_EN;  		break; -	case MCI_STATE_INIT_GPM_OFFSET: -		value = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); -		mci->gpm_idx = value; -		break; -	case MCI_STATE_NEXT_GPM_OFFSET: -	case MCI_STATE_LAST_GPM_OFFSET: -		/* -		* This could be useful to avoid new GPM message interrupt which -		* may lead to spurious interrupt after power sleep, or multiple -		* entry of ath_mci_intr(). -		* Adding empty GPM check by returning HAL_MCI_GPM_INVALID can -		* alleviate this effect, but clearing GPM RX interrupt bit is -		* safe, because whether this is called from hw or driver code -		* there must be an interrupt bit set/triggered initially -		*/ -		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, -			  AR_MCI_INTERRUPT_RX_MSG_GPM); - -		gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); -		value = gpm_ptr; - -		if (value == 0) -			value = mci->gpm_len - 1; -		else if (value >= mci->gpm_len) { -			if (value != 0xFFFF) -				value = 0; -		} else { -			value--; -		} - -		if (value == 0xFFFF) { -			value = MCI_GPM_INVALID; -			more_gpm = MCI_GPM_NOMORE; -		} else if (state_type == MCI_STATE_NEXT_GPM_OFFSET) { -			if (gpm_ptr == mci->gpm_idx) { -				value = MCI_GPM_INVALID; -				more_gpm = MCI_GPM_NOMORE; -			} else { -				for (;;) { -					u32 temp_index; - -					/* skip reserved GPM if any */ - -					if (value != mci->gpm_idx) -						more_gpm = MCI_GPM_MORE; -					else -						more_gpm = MCI_GPM_NOMORE; - -					temp_index = mci->gpm_idx; -					mci->gpm_idx++; - -					if (mci->gpm_idx >= -					    mci->gpm_len) -						mci->gpm_idx = 0; - -					if (ar9003_mci_is_gpm_valid(ah, -								    temp_index)) { -						value = temp_index; -						break; -					} - -					if (more_gpm == MCI_GPM_NOMORE) { -						value = MCI_GPM_INVALID; -						break; -					} -				} -			} -			if (p_data) -				*p_data = more_gpm; -			} - -			if (value != MCI_GPM_INVALID) -				value <<= 4; - -			break;  	case MCI_STATE_LAST_SCHD_MSG_OFFSET:  		value = MS(REG_READ(ah, AR_MCI_RX_STATUS),  				    AR_MCI_RX_LAST_SCHD_MSG_INDEX); @@ -1276,21 +1191,6 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)  			   AR_MCI_RX_REMOTE_SLEEP) ?  			MCI_BT_SLEEP : MCI_BT_AWAKE;  		break; -	case MCI_STATE_CONT_RSSI_POWER: -		value = MS(mci->cont_status, AR_MCI_CONT_RSSI_POWER); -		break; -	case MCI_STATE_CONT_PRIORITY: -		value = MS(mci->cont_status, AR_MCI_CONT_RRIORITY); -		break; -	case MCI_STATE_CONT_TXRX: -		value = MS(mci->cont_status, AR_MCI_CONT_TXRX); -		break; -	case MCI_STATE_BT: -		value = mci->bt_state; -		break; -	case MCI_STATE_SET_BT_SLEEP: -		mci->bt_state = MCI_BT_SLEEP; -		break;  	case MCI_STATE_SET_BT_AWAKE:  		mci->bt_state = MCI_BT_AWAKE;  		ar9003_mci_send_coex_version_query(ah, true); @@ -1299,7 +1199,7 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)  		if (mci->unhalt_bt_gpm)  			ar9003_mci_send_coex_halt_bt_gpm(ah, false, true); -		ar9003_mci_2g5g_switch(ah, true); +		ar9003_mci_2g5g_switch(ah, false);  		break;  	case MCI_STATE_SET_BT_CAL_START:  		mci->bt_state = MCI_BT_CAL_START; @@ -1323,34 +1223,6 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)  	case MCI_STATE_SEND_WLAN_COEX_VERSION:  		ar9003_mci_send_coex_version_response(ah, true);  		break; -	case MCI_STATE_SET_BT_COEX_VERSION: -		if (!p_data) -			ath_dbg(common, MCI, -				"MCI Set BT Coex version with NULL data!!\n"); -		else { -			mci->bt_ver_major = (*p_data >> 8) & 0xff; -			mci->bt_ver_minor = (*p_data) & 0xff; -			mci->bt_version_known = true; -			ath_dbg(common, MCI, "MCI BT version set: %d.%d\n", -				mci->bt_ver_major, mci->bt_ver_minor); -		} -		break; -	case MCI_STATE_SEND_WLAN_CHANNELS: -		if (p_data) { -			if (((mci->wlan_channels[1] & 0xffff0000) == -			     (*(p_data + 1) & 0xffff0000)) && -			    (mci->wlan_channels[2] == *(p_data + 2)) && -			    (mci->wlan_channels[3] == *(p_data + 3))) -				break; - -			mci->wlan_channels[0] = *p_data++; -			mci->wlan_channels[1] = *p_data++; -			mci->wlan_channels[2] = *p_data++; -			mci->wlan_channels[3] = *p_data++; -		} -		mci->wlan_channels_update = true; -		ar9003_mci_send_coex_wlan_channels(ah, true); -		break;  	case MCI_STATE_SEND_VERSION_QUERY:  		ar9003_mci_send_coex_version_query(ah, true);  		break; @@ -1358,38 +1230,16 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)  		query_type = MCI_GPM_COEX_QUERY_BT_TOPOLOGY;  		ar9003_mci_send_coex_bt_status_query(ah, true, query_type);  		break; -	case MCI_STATE_NEED_FLUSH_BT_INFO: -			/* -			 * btcoex_hw.mci.unhalt_bt_gpm means whether it's -			 * needed to send UNHALT message. It's set whenever -			 * there's a request to send HALT message. -			 * mci_halted_bt_gpm means whether HALT message is sent -			 * out successfully. -			 * -			 * Checking (mci_unhalt_bt_gpm == false) instead of -			 * checking (ah->mci_halted_bt_gpm == false) will make -			 * sure currently is in UNHALT-ed mode and BT can -			 * respond to status query. -			 */ -			value = (!mci->unhalt_bt_gpm && -				 mci->need_flush_btinfo) ? 1 : 0; -			if (p_data) -				mci->need_flush_btinfo = -					(*p_data != 0) ? true : false; -			break;  	case MCI_STATE_RECOVER_RX:  		ar9003_mci_prep_interface(ah);  		mci->query_bt = true;  		mci->need_flush_btinfo = true;  		ar9003_mci_send_coex_wlan_channels(ah, true); -		ar9003_mci_2g5g_switch(ah, true); +		ar9003_mci_2g5g_switch(ah, false);  		break;  	case MCI_STATE_NEED_FTP_STOMP:  		value = !(mci->config & ATH_MCI_CONFIG_DISABLE_FTP_STOMP);  		break; -	case MCI_STATE_NEED_TUNING: -		value = !(mci->config & ATH_MCI_CONFIG_DISABLE_TUNING); -		break;  	default:  		break;  	} @@ -1397,3 +1247,173 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)  	return value;  }  EXPORT_SYMBOL(ar9003_mci_state); + +void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah) +{ +	struct ath_common *common = ath9k_hw_common(ah); +	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; + +	ath_dbg(common, MCI, "Give LNA and SPDT control to BT\n"); + +	ar9003_mci_send_lna_take(ah, true); +	udelay(50); + +	REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); +	mci->is_2g = false; +	mci->update_2g5g = true; +	ar9003_mci_send_2g5g_status(ah, true); + +	/* Force another 2g5g update at next scanning */ +	mci->update_2g5g = true; +} + +void ar9003_mci_set_power_awake(struct ath_hw *ah) +{ +	u32 btcoex_ctrl2, diag_sw; +	int i; +	u8 lna_ctrl, bt_sleep; + +	for (i = 0; i < AH_WAIT_TIMEOUT; i++) { +		btcoex_ctrl2 = REG_READ(ah, AR_BTCOEX_CTRL2); +		if (btcoex_ctrl2 != 0xdeadbeef) +			break; +		udelay(AH_TIME_QUANTUM); +	} +	REG_WRITE(ah, AR_BTCOEX_CTRL2, (btcoex_ctrl2 | BIT(23))); + +	for (i = 0; i < AH_WAIT_TIMEOUT; i++) { +		diag_sw = REG_READ(ah, AR_DIAG_SW); +		if (diag_sw != 0xdeadbeef) +			break; +		udelay(AH_TIME_QUANTUM); +	} +	REG_WRITE(ah, AR_DIAG_SW, (diag_sw | BIT(27) | BIT(19) | BIT(18))); +	lna_ctrl = REG_READ(ah, AR_OBS_BUS_CTRL) & 0x3; +	bt_sleep = REG_READ(ah, AR_MCI_RX_STATUS) & AR_MCI_RX_REMOTE_SLEEP; + +	REG_WRITE(ah, AR_BTCOEX_CTRL2, btcoex_ctrl2); +	REG_WRITE(ah, AR_DIAG_SW, diag_sw); + +	if (bt_sleep && (lna_ctrl == 2)) { +		REG_SET_BIT(ah, AR_BTCOEX_RC, 0x1); +		REG_CLR_BIT(ah, AR_BTCOEX_RC, 0x1); +		udelay(50); +	} +} + +void ar9003_mci_check_gpm_offset(struct ath_hw *ah) +{ +	struct ath_common *common = ath9k_hw_common(ah); +	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; +	u32 offset; + +	/* +	 * This should only be called before "MAC Warm Reset" or "MCI Reset Rx". +	 */ +	offset = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); +	if (mci->gpm_idx == offset) +		return; +	ath_dbg(common, MCI, "GPM cached write pointer mismatch %d %d\n", +		mci->gpm_idx, offset); +	mci->query_bt = true; +	mci->need_flush_btinfo = true; +	mci->gpm_idx = 0; +} + +u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, bool first, u32 *more) +{ +	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; +	u32 offset, more_gpm = 0, gpm_ptr; + +	if (first) { +		gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); +		mci->gpm_idx = gpm_ptr; +		return gpm_ptr; +	} + +	/* +	 * This could be useful to avoid new GPM message interrupt which +	 * may lead to spurious interrupt after power sleep, or multiple +	 * entry of ath_mci_intr(). +	 * Adding empty GPM check by returning HAL_MCI_GPM_INVALID can +	 * alleviate this effect, but clearing GPM RX interrupt bit is +	 * safe, because whether this is called from hw or driver code +	 * there must be an interrupt bit set/triggered initially +	 */ +	REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, +			AR_MCI_INTERRUPT_RX_MSG_GPM); + +	gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); +	offset = gpm_ptr; + +	if (!offset) +		offset = mci->gpm_len - 1; +	else if (offset >= mci->gpm_len) { +		if (offset != 0xFFFF) +			offset = 0; +	} else { +		offset--; +	} + +	if ((offset == 0xFFFF) || (gpm_ptr == mci->gpm_idx)) { +		offset = MCI_GPM_INVALID; +		more_gpm = MCI_GPM_NOMORE; +		goto out; +	} +	for (;;) { +		u32 temp_index; + +		/* skip reserved GPM if any */ + +		if (offset != mci->gpm_idx) +			more_gpm = MCI_GPM_MORE; +		else +			more_gpm = MCI_GPM_NOMORE; + +		temp_index = mci->gpm_idx; +		mci->gpm_idx++; + +		if (mci->gpm_idx >= mci->gpm_len) +			mci->gpm_idx = 0; + +		if (ar9003_mci_is_gpm_valid(ah, temp_index)) { +			offset = temp_index; +			break; +		} + +		if (more_gpm == MCI_GPM_NOMORE) { +			offset = MCI_GPM_INVALID; +			break; +		} +	} + +	if (offset != MCI_GPM_INVALID) +		offset <<= 4; +out: +	if (more) +		*more = more_gpm; + +	return offset; +} +EXPORT_SYMBOL(ar9003_mci_get_next_gpm_offset); + +void ar9003_mci_set_bt_version(struct ath_hw *ah, u8 major, u8 minor) +{ +	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; + +	mci->bt_ver_major = major; +	mci->bt_ver_minor = minor; +	mci->bt_version_known = true; +	ath_dbg(ath9k_hw_common(ah), MCI, "MCI BT version set: %d.%d\n", +		mci->bt_ver_major, mci->bt_ver_minor); +} +EXPORT_SYMBOL(ar9003_mci_set_bt_version); + +void ar9003_mci_send_wlan_channels(struct ath_hw *ah) +{ +	struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; + +	mci->wlan_channels_update = true; +	ar9003_mci_send_coex_wlan_channels(ah, true); +} +EXPORT_SYMBOL(ar9003_mci_send_wlan_channels); diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h index 4842f6c06b8..d33b8e12885 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h @@ -189,30 +189,18 @@ enum mci_bt_state {  /* Type of state query */  enum mci_state_type {  	MCI_STATE_ENABLE, -	MCI_STATE_INIT_GPM_OFFSET, -	MCI_STATE_NEXT_GPM_OFFSET, -	MCI_STATE_LAST_GPM_OFFSET, -	MCI_STATE_BT, -	MCI_STATE_SET_BT_SLEEP,  	MCI_STATE_SET_BT_AWAKE,  	MCI_STATE_SET_BT_CAL_START,  	MCI_STATE_SET_BT_CAL,  	MCI_STATE_LAST_SCHD_MSG_OFFSET,  	MCI_STATE_REMOTE_SLEEP, -	MCI_STATE_CONT_RSSI_POWER, -	MCI_STATE_CONT_PRIORITY, -	MCI_STATE_CONT_TXRX,  	MCI_STATE_RESET_REQ_WAKE,  	MCI_STATE_SEND_WLAN_COEX_VERSION, -	MCI_STATE_SET_BT_COEX_VERSION, -	MCI_STATE_SEND_WLAN_CHANNELS,  	MCI_STATE_SEND_VERSION_QUERY,  	MCI_STATE_SEND_STATUS_QUERY, -	MCI_STATE_NEED_FLUSH_BT_INFO,  	MCI_STATE_SET_CONCUR_TX_PRI,  	MCI_STATE_RECOVER_RX,  	MCI_STATE_NEED_FTP_STOMP, -	MCI_STATE_NEED_TUNING,  	MCI_STATE_DEBUG,  	MCI_STATE_MAX  }; @@ -260,28 +248,26 @@ enum mci_gpm_coex_opcode {  bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag,  			     u32 *payload, u8 len, bool wait_done,  			     bool check_bt); -u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data); +u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type);  void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,  		      u16 len, u32 sched_addr);  void ar9003_mci_cleanup(struct ath_hw *ah);  void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,  			      u32 *rx_msg_intr); - +u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, bool first, u32 *more); +void ar9003_mci_set_bt_version(struct ath_hw *ah, u8 major, u8 minor); +void ar9003_mci_send_wlan_channels(struct ath_hw *ah);  /*   * These functions are used by ath9k_hw.   */  #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT -static inline bool ar9003_mci_is_ready(struct ath_hw *ah) -{ -	return ah->btcoex_hw.mci.ready; -}  void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep);  void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable);  void ar9003_mci_init_cal_done(struct ath_hw *ah);  void ar9003_mci_set_full_sleep(struct ath_hw *ah); -void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool wait_done); +void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool force);  void ar9003_mci_check_bt(struct ath_hw *ah);  bool ar9003_mci_start_reset(struct ath_hw *ah, struct ath9k_channel *chan);  int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan, @@ -289,13 +275,12 @@ int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan,  void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,  		      bool is_full_sleep);  void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked); +void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah); +void ar9003_mci_set_power_awake(struct ath_hw *ah); +void ar9003_mci_check_gpm_offset(struct ath_hw *ah);  #else -static inline bool ar9003_mci_is_ready(struct ath_hw *ah) -{ -	return false; -}  static inline void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep)  {  } @@ -330,6 +315,15 @@ static inline void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,  static inline void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked)  {  } +static inline void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah) +{ +} +static inline void ar9003_mci_set_power_awake(struct ath_hw *ah) +{ +} +static inline void ar9003_mci_check_gpm_offset(struct ath_hw *ah) +{ +}  #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */  #endif diff --git a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c index 3d400e8d653..2c9f7d7ed4c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c @@ -211,7 +211,7 @@ static int ar9003_paprd_setup_single_table(struct ath_hw *ah)  		      AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES, 7);  	REG_RMW_FIELD(ah, AR_PHY_PAPRD_TRAINER_CNTL3,  		      AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL, 1); -	if (AR_SREV_9485(ah) || AR_SREV_9462(ah)) +	if (AR_SREV_9485(ah) || AR_SREV_9462(ah) || AR_SREV_9550(ah))  		REG_RMW_FIELD(ah, AR_PHY_PAPRD_TRAINER_CNTL3,  			      AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,  			      -3); diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 11abb972be1..e476f9f92ce 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c @@ -99,7 +99,7 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)  			channelSel = (freq * 4) / 120;  			chan_frac = (((freq * 4) % 120) * 0x20000) / 120;  			channelSel = (channelSel << 17) | chan_frac; -		} else if (AR_SREV_9340(ah)) { +		} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {  			if (ah->is_clk_25mhz) {  				u32 chan_frac; @@ -113,11 +113,12 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)  		/* Set to 2G mode */  		bMode = 1;  	} else { -		if (AR_SREV_9340(ah) && ah->is_clk_25mhz) { +		if ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) && +		    ah->is_clk_25mhz) {  			u32 chan_frac; -			channelSel = (freq * 2) / 75; -			chan_frac = (((freq * 2) % 75) * 0x20000) / 75; +			channelSel = freq / 75; +			chan_frac = ((freq % 75) * 0x20000) / 75;  			channelSel = (channelSel << 17) | chan_frac;  		} else {  			channelSel = CHANSEL_5G(freq); @@ -173,16 +174,15 @@ static void ar9003_hw_spur_mitigate_mrc_cck(struct ath_hw *ah,  	int cur_bb_spur, negative = 0, cck_spur_freq;  	int i;  	int range, max_spur_cnts, synth_freq; -	u8 *spur_fbin_ptr = NULL; +	u8 *spur_fbin_ptr = ar9003_get_spur_chan_ptr(ah, IS_CHAN_2GHZ(chan));  	/*  	 * Need to verify range +/- 10 MHz in control channel, otherwise spur  	 * is out-of-band and can be ignored.  	 */ -	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah)) { -		spur_fbin_ptr = ar9003_get_spur_chan_ptr(ah, -							 IS_CHAN_2GHZ(chan)); +	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah) || +	    AR_SREV_9550(ah)) {  		if (spur_fbin_ptr[0] == 0) /* No spur */  			return;  		max_spur_cnts = 5; @@ -207,7 +207,8 @@ static void ar9003_hw_spur_mitigate_mrc_cck(struct ath_hw *ah,  		if (AR_SREV_9462(ah) && (i == 0 || i == 3))  			continue;  		negative = 0; -		if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah)) +		if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah) || +		    AR_SREV_9550(ah))  			cur_bb_spur = ath9k_hw_fbin2freq(spur_fbin_ptr[i],  							 IS_CHAN_2GHZ(chan));  		else @@ -620,6 +621,50 @@ static void ar9003_hw_prog_ini(struct ath_hw *ah,  	}  } +static int ar9550_hw_get_modes_txgain_index(struct ath_hw *ah, +					    struct ath9k_channel *chan) +{ +	int ret; + +	switch (chan->chanmode) { +	case CHANNEL_A: +	case CHANNEL_A_HT20: +		if (chan->channel <= 5350) +			ret = 1; +		else if ((chan->channel > 5350) && (chan->channel <= 5600)) +			ret = 3; +		else +			ret = 5; +		break; + +	case CHANNEL_A_HT40PLUS: +	case CHANNEL_A_HT40MINUS: +		if (chan->channel <= 5350) +			ret = 2; +		else if ((chan->channel > 5350) && (chan->channel <= 5600)) +			ret = 4; +		else +			ret = 6; +		break; + +	case CHANNEL_G: +	case CHANNEL_G_HT20: +	case CHANNEL_B: +		ret = 8; +		break; + +	case CHANNEL_G_HT40PLUS: +	case CHANNEL_G_HT40MINUS: +		ret = 7; +		break; + +	default: +		ret = -EINVAL; +	} + +	return ret; +} +  static int ar9003_hw_process_ini(struct ath_hw *ah,  				 struct ath9k_channel *chan)  { @@ -661,7 +706,22 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,  	}  	REG_WRITE_ARRAY(&ah->iniModesRxGain, 1, regWrites); -	REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); +	if (AR_SREV_9550(ah)) +		REG_WRITE_ARRAY(&ah->ini_modes_rx_gain_bounds, modesIndex, +				regWrites); + +	if (AR_SREV_9550(ah)) { +		int modes_txgain_index; + +		modes_txgain_index = ar9550_hw_get_modes_txgain_index(ah, chan); +		if (modes_txgain_index < 0) +			return -EINVAL; + +		REG_WRITE_ARRAY(&ah->iniModesTxGain, modes_txgain_index, +				regWrites); +	} else { +		REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); +	}  	/*  	 * For 5GHz channels requiring Fast Clock, apply @@ -676,6 +736,10 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,  	if (chan->channel == 2484)  		ar9003_hw_prog_ini(ah, &ah->ini_japan2484, 1); +	if (AR_SREV_9462(ah)) +		REG_WRITE(ah, AR_GLB_SWREG_DISCONT_MODE, +			  AR_GLB_SWREG_DISCONT_EN_BT_WLAN); +  	ah->modes_index = modesIndex;  	ar9003_hw_override_ini(ah);  	ar9003_hw_set_channel_regs(ah, chan); @@ -821,18 +885,18 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,  				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); -		if (!on != aniState->ofdmWeakSigDetectOff) { +		if (on != aniState->ofdmWeakSigDetect) {  			ath_dbg(common, ANI,  				"** ch %d: ofdm weak signal: %s=>%s\n",  				chan->channel, -				!aniState->ofdmWeakSigDetectOff ? +				aniState->ofdmWeakSigDetect ?  				"on" : "off",  				on ? "on" : "off");  			if (on)  				ah->stats.ast_ani_ofdmon++;  			else  				ah->stats.ast_ani_ofdmoff++; -			aniState->ofdmWeakSigDetectOff = !on; +			aniState->ofdmWeakSigDetect = on;  		}  		break;  	} @@ -851,7 +915,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value = firstep_table[level] - -			firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + +			firstep_table[ATH9K_ANI_FIRSTEP_LVL] +  			aniState->iniDef.firstep;  		if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)  			value = ATH9K_SIG_FIRSTEP_SETTING_MIN; @@ -866,7 +930,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value2 = firstep_table[level] - -			 firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + +			 firstep_table[ATH9K_ANI_FIRSTEP_LVL] +  			 aniState->iniDef.firstepLow;  		if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)  			value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; @@ -882,7 +946,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  				chan->channel,  				aniState->firstepLevel,  				level, -				ATH9K_ANI_FIRSTEP_LVL_NEW, +				ATH9K_ANI_FIRSTEP_LVL,  				value,  				aniState->iniDef.firstep);  			ath_dbg(common, ANI, @@ -890,7 +954,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  				chan->channel,  				aniState->firstepLevel,  				level, -				ATH9K_ANI_FIRSTEP_LVL_NEW, +				ATH9K_ANI_FIRSTEP_LVL,  				value2,  				aniState->iniDef.firstepLow);  			if (level > aniState->firstepLevel) @@ -915,7 +979,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value = cycpwrThr1_table[level] - -			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + +			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +  			aniState->iniDef.cycpwrThr1;  		if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN)  			value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; @@ -931,7 +995,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  		 * from INI file & cap value  		 */  		value2 = cycpwrThr1_table[level] - -			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + +			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +  			 aniState->iniDef.cycpwrThr1Ext;  		if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN)  			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; @@ -946,7 +1010,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  				chan->channel,  				aniState->spurImmunityLevel,  				level, -				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, +				ATH9K_ANI_SPUR_IMMUNE_LVL,  				value,  				aniState->iniDef.cycpwrThr1);  			ath_dbg(common, ANI, @@ -954,7 +1018,7 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  				chan->channel,  				aniState->spurImmunityLevel,  				level, -				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, +				ATH9K_ANI_SPUR_IMMUNE_LVL,  				value2,  				aniState->iniDef.cycpwrThr1Ext);  			if (level > aniState->spurImmunityLevel) @@ -975,16 +1039,16 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  			      AR_PHY_MRC_CCK_ENABLE, is_on);  		REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL,  			      AR_PHY_MRC_CCK_MUX_REG, is_on); -		if (!is_on != aniState->mrcCCKOff) { +		if (is_on != aniState->mrcCCK) {  			ath_dbg(common, ANI, "** ch %d: MRC CCK: %s=>%s\n",  				chan->channel, -				!aniState->mrcCCKOff ? "on" : "off", +				aniState->mrcCCK ? "on" : "off",  				is_on ? "on" : "off");  		if (is_on)  			ah->stats.ast_ani_ccklow++;  		else  			ah->stats.ast_ani_cckhigh++; -		aniState->mrcCCKOff = !is_on; +		aniState->mrcCCK = is_on;  		}  	break;  	} @@ -998,9 +1062,9 @@ static bool ar9003_hw_ani_control(struct ath_hw *ah,  	ath_dbg(common, ANI,  		"ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n",  		aniState->spurImmunityLevel, -		!aniState->ofdmWeakSigDetectOff ? "on" : "off", +		aniState->ofdmWeakSigDetect ? "on" : "off",  		aniState->firstepLevel, -		!aniState->mrcCCKOff ? "on" : "off", +		aniState->mrcCCK ? "on" : "off",  		aniState->listenTime,  		aniState->ofdmPhyErrCount,  		aniState->cckPhyErrCount); @@ -1107,10 +1171,10 @@ static void ar9003_hw_ani_cache_ini_regs(struct ath_hw *ah)  					       AR_PHY_EXT_CYCPWR_THR1);  	/* these levels just got reset to defaults by the INI */ -	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; -	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; -	aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; -	aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK; +	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; +	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; +	aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; +	aniState->mrcCCK = true;  }  static void ar9003_hw_set_radar_params(struct ath_hw *ah, diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h index 7268a48a92a..7bfbaf065a4 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h @@ -633,11 +633,13 @@  #define AR_PHY_65NM_CH0_BIAS2       0x160c4  #define AR_PHY_65NM_CH0_BIAS4       0x160cc  #define AR_PHY_65NM_CH0_RXTX4       0x1610c +#define AR_PHY_65NM_CH1_RXTX4       0x1650c +#define AR_PHY_65NM_CH2_RXTX4       0x1690c  #define AR_CH0_TOP	(AR_SREV_9300(ah) ? 0x16288 : \  				((AR_SREV_9462(ah) ? 0x1628c : 0x16280))) -#define AR_CH0_TOP_XPABIASLVL (0x300) -#define AR_CH0_TOP_XPABIASLVL_S (8) +#define AR_CH0_TOP_XPABIASLVL (AR_SREV_9550(ah) ? 0x3c0 : 0x300) +#define AR_CH0_TOP_XPABIASLVL_S (AR_SREV_9550(ah) ? 6 : 8)  #define AR_CH0_THERM	(AR_SREV_9300(ah) ? 0x16290 : \  				((AR_SREV_9485(ah) ? 0x1628c : 0x16294))) @@ -650,6 +652,8 @@  #define AR_SWITCH_TABLE_COM_ALL_S (0)  #define AR_SWITCH_TABLE_COM_AR9462_ALL (0xffffff)  #define AR_SWITCH_TABLE_COM_AR9462_ALL_S (0) +#define AR_SWITCH_TABLE_COM_AR9550_ALL (0xffffff) +#define AR_SWITCH_TABLE_COM_AR9550_ALL_S (0)  #define AR_SWITCH_TABLE_COM_SPDT (0x00f00000)  #define AR_SWITCH_TABLE_COM_SPDT_ALL (0x0000fff0)  #define AR_SWITCH_TABLE_COM_SPDT_ALL_S (4) @@ -820,18 +824,26 @@  #define AR_PHY_CHAN_INFO_MEMORY_CAPTURE_MASK         0x0001  #define AR_PHY_RX_DELAY_DELAY   0x00003FFF  #define AR_PHY_CCK_TX_CTRL_JAPAN    0x00000010 -#define AR_PHY_SPECTRAL_SCAN_ENABLE         0x00000001 -#define AR_PHY_SPECTRAL_SCAN_ENABLE_S       0 -#define AR_PHY_SPECTRAL_SCAN_ACTIVE         0x00000002 -#define AR_PHY_SPECTRAL_SCAN_ACTIVE_S       1 -#define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD     0x000000F0 -#define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD_S   4 -#define AR_PHY_SPECTRAL_SCAN_PERIOD         0x0000FF00 -#define AR_PHY_SPECTRAL_SCAN_PERIOD_S       8 -#define AR_PHY_SPECTRAL_SCAN_COUNT          0x00FF0000 -#define AR_PHY_SPECTRAL_SCAN_COUNT_S        16 -#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT   0x01000000 -#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S 24 + +#define AR_PHY_SPECTRAL_SCAN_ENABLE           0x00000001 +#define AR_PHY_SPECTRAL_SCAN_ENABLE_S         0 +#define AR_PHY_SPECTRAL_SCAN_ACTIVE           0x00000002 +#define AR_PHY_SPECTRAL_SCAN_ACTIVE_S         1 +#define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD       0x000000F0 +#define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD_S     4 +#define AR_PHY_SPECTRAL_SCAN_PERIOD           0x0000FF00 +#define AR_PHY_SPECTRAL_SCAN_PERIOD_S         8 +#define AR_PHY_SPECTRAL_SCAN_COUNT            0x0FFF0000 +#define AR_PHY_SPECTRAL_SCAN_COUNT_S          16 +#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT     0x10000000 +#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S   28 +#define AR_PHY_SPECTRAL_SCAN_PRIORITY         0x20000000 +#define AR_PHY_SPECTRAL_SCAN_PRIORITY_S       29 +#define AR_PHY_SPECTRAL_SCAN_USE_ERR5         0x40000000 +#define AR_PHY_SPECTRAL_SCAN_USE_ERR5_S       30 +#define AR_PHY_SPECTRAL_SCAN_COMPRESSED_RPT   0x80000000 +#define AR_PHY_SPECTRAL_SCAN_COMPRESSED_RPT_S 31 +  #define AR_PHY_CHANNEL_STATUS_RX_CLEAR      0x00000004  #define AR_PHY_RTT_CTRL_ENA_RADIO_RETENTION     0x00000001  #define AR_PHY_RTT_CTRL_ENA_RADIO_RETENTION_S   0 @@ -866,6 +878,9 @@  #define AR_PHY_65NM_CH0_RXTX4_THERM_ON          0x10000000  #define AR_PHY_65NM_CH0_RXTX4_THERM_ON_S        28 +#define AR_PHY_65NM_RXTX4_XLNA_BIAS		0xC0000000 +#define AR_PHY_65NM_RXTX4_XLNA_BIAS_S		30 +  /*   * Channel 1 Register Map   */ diff --git a/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h b/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h index f11d9b2677f..6e1756bc383 100644 --- a/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h @@ -1,5 +1,6 @@  /* - * Copyright (c) 2011 Atheros Communications Inc. + * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -18,7 +19,7 @@  #define INITVALS_9330_1P1_H  static const u32 ar9331_1p1_baseband_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},  	{0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e},  	{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0}, @@ -27,10 +28,10 @@ static const u32 ar9331_1p1_baseband_postamble[][5] = {  	{0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},  	{0x00009c00, 0x00000044, 0x00000044, 0x00000044, 0x00000044},  	{0x00009e00, 0x0372161e, 0x0372161e, 0x037216a4, 0x037216a4}, -	{0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020}, +	{0x00009e04, 0x00202020, 0x00202020, 0x00202020, 0x00202020},  	{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},  	{0x00009e10, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e}, -	{0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e}, +	{0x00009e14, 0x31365d5e, 0x3136605e, 0x3136605e, 0x31365d5e},  	{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},  	{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, @@ -55,7 +56,7 @@ static const u32 ar9331_1p1_baseband_postamble[][5] = {  	{0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, -	{0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071981}, +	{0x0000a2d0, 0x00071982, 0x00071982, 0x00071982, 0x00071982},  	{0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},  	{0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000ae04, 0x00802020, 0x00802020, 0x00802020, 0x00802020}, @@ -63,7 +64,7 @@ static const u32 ar9331_1p1_baseband_postamble[][5] = {  };  static const u32 ar9331_modes_lowest_ob_db_tx_gain_1p1[][5] = { -	/*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},  	{0x0000a2dc, 0xffff2a52, 0xffff2a52, 0xffff2a52, 0xffff2a52},  	{0x0000a2e0, 0xffffcc84, 0xffffcc84, 0xffffcc84, 0xffffcc84}, @@ -155,7 +156,7 @@ static const u32 ar9331_modes_lowest_ob_db_tx_gain_1p1[][5] = {  };  static const u32 ar9331_modes_high_ob_db_tx_gain_1p1[][5] = { -	/*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},  	{0x0000a2dc, 0xffaa9a52, 0xffaa9a52, 0xffaa9a52, 0xffaa9a52},  	{0x0000a2e0, 0xffb31c84, 0xffb31c84, 0xffb31c84, 0xffb31c84}, @@ -245,7 +246,7 @@ static const u32 ar9331_modes_high_ob_db_tx_gain_1p1[][5] = {  };  static const u32 ar9331_modes_low_ob_db_tx_gain_1p1[][5] = { -	/*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},  	{0x0000a2dc, 0xffff2a52, 0xffff2a52, 0xffff2a52, 0xffff2a52},  	{0x0000a2e0, 0xffffcc84, 0xffffcc84, 0xffffcc84, 0xffffcc84}, @@ -336,12 +337,7 @@ static const u32 ar9331_modes_low_ob_db_tx_gain_1p1[][5] = {  	{0x00016284, 0x14d3f000, 0x14d3f000, 0x14d3f000, 0x14d3f000},  }; -static const u32 ar9331_1p1_baseband_core_txfir_coeff_japan_2484[][2] = { -	/* Addr      allmodes  */ -	{0x0000a398, 0x00000000}, -	{0x0000a39c, 0x6f7f0301}, -	{0x0000a3a0, 0xca9228ee}, -}; +#define ar9331_1p1_baseband_core_txfir_coeff_japan_2484 ar9462_2p0_baseband_core_txfir_coeff_japan_2484  static const u32 ar9331_1p1_xtal_25M[][2] = {  	/* Addr      allmodes  */ @@ -377,14 +373,14 @@ static const u32 ar9331_1p1_radio_core[][2] = {  	{0x000160b4, 0x92480040},  	{0x000160c0, 0x006db6db},  	{0x000160c4, 0x0186db60}, -	{0x000160c8, 0x6db6db6c}, +	{0x000160c8, 0x6db4db6c},  	{0x000160cc, 0x6de6c300},  	{0x000160d0, 0x14500820},  	{0x00016100, 0x04cb0001},  	{0x00016104, 0xfff80015},  	{0x00016108, 0x00080010},  	{0x0001610c, 0x00170000}, -	{0x00016140, 0x10804000}, +	{0x00016140, 0x10800000},  	{0x00016144, 0x01884080},  	{0x00016148, 0x000080c0},  	{0x00016280, 0x01000015}, @@ -417,7 +413,7 @@ static const u32 ar9331_1p1_radio_core[][2] = {  };  static const u32 ar9331_1p1_soc_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x00007010, 0x00000022, 0x00000022, 0x00000022, 0x00000022},  }; @@ -691,7 +687,7 @@ static const u32 ar9331_1p1_baseband_core[][2] = {  };  static const u32 ar9331_modes_high_power_tx_gain_1p1[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},  	{0x0000a2dc, 0xffff2a52, 0xffff2a52, 0xffff2a52, 0xffff2a52},  	{0x0000a2e0, 0xffffcc84, 0xffffcc84, 0xffffcc84, 0xffffcc84}, @@ -782,17 +778,7 @@ static const u32 ar9331_modes_high_power_tx_gain_1p1[][5] = {  	{0x00016284, 0x14d3f000, 0x14d3f000, 0x14d3f000, 0x14d3f000},  }; -static const u32 ar9331_1p1_mac_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, -	{0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, -	{0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, -	{0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, -	{0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, -	{0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, -	{0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, -	{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, -}; +#define ar9331_1p1_mac_postamble ar9300_2p2_mac_postamble  static const u32 ar9331_1p1_soc_preamble[][2] = {  	/* Addr      allmodes  */ @@ -973,26 +959,27 @@ static const u32 ar9331_1p1_mac_core[][2] = {  static const u32 ar9331_common_rx_gain_1p1[][2] = {  	/* Addr      allmodes  */ -	{0x0000a000, 0x00010000}, -	{0x0000a004, 0x00030002}, -	{0x0000a008, 0x00050004}, -	{0x0000a00c, 0x00810080}, -	{0x0000a010, 0x00830082}, -	{0x0000a014, 0x01810180}, -	{0x0000a018, 0x01830182}, -	{0x0000a01c, 0x01850184}, -	{0x0000a020, 0x01890188}, -	{0x0000a024, 0x018b018a}, -	{0x0000a028, 0x018d018c}, -	{0x0000a02c, 0x01910190}, -	{0x0000a030, 0x01930192}, -	{0x0000a034, 0x01950194}, -	{0x0000a038, 0x038a0196}, -	{0x0000a03c, 0x038c038b}, -	{0x0000a040, 0x0390038d}, -	{0x0000a044, 0x03920391}, -	{0x0000a048, 0x03940393}, -	{0x0000a04c, 0x03960395}, +	{0x00009e18, 0x05000000}, +	{0x0000a000, 0x00060005}, +	{0x0000a004, 0x00810080}, +	{0x0000a008, 0x00830082}, +	{0x0000a00c, 0x00850084}, +	{0x0000a010, 0x01820181}, +	{0x0000a014, 0x01840183}, +	{0x0000a018, 0x01880185}, +	{0x0000a01c, 0x018a0189}, +	{0x0000a020, 0x02850284}, +	{0x0000a024, 0x02890288}, +	{0x0000a028, 0x028b028a}, +	{0x0000a02c, 0x03850384}, +	{0x0000a030, 0x03890388}, +	{0x0000a034, 0x038b038a}, +	{0x0000a038, 0x038d038c}, +	{0x0000a03c, 0x03910390}, +	{0x0000a040, 0x03930392}, +	{0x0000a044, 0x03950394}, +	{0x0000a048, 0x00000396}, +	{0x0000a04c, 0x00000000},  	{0x0000a050, 0x00000000},  	{0x0000a054, 0x00000000},  	{0x0000a058, 0x00000000}, @@ -1005,15 +992,15 @@ static const u32 ar9331_common_rx_gain_1p1[][2] = {  	{0x0000a074, 0x00000000},  	{0x0000a078, 0x00000000},  	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x22222229}, -	{0x0000a084, 0x1d1d1d1d}, -	{0x0000a088, 0x1d1d1d1d}, -	{0x0000a08c, 0x1d1d1d1d}, -	{0x0000a090, 0x171d1d1d}, -	{0x0000a094, 0x11111717}, -	{0x0000a098, 0x00030311}, -	{0x0000a09c, 0x00000000}, -	{0x0000a0a0, 0x00000000}, +	{0x0000a080, 0x28282828}, +	{0x0000a084, 0x28282828}, +	{0x0000a088, 0x28282828}, +	{0x0000a08c, 0x28282828}, +	{0x0000a090, 0x28282828}, +	{0x0000a094, 0x24242428}, +	{0x0000a098, 0x171e1e1e}, +	{0x0000a09c, 0x02020b0b}, +	{0x0000a0a0, 0x02020202},  	{0x0000a0a4, 0x00000000},  	{0x0000a0a8, 0x00000000},  	{0x0000a0ac, 0x00000000}, @@ -1021,27 +1008,27 @@ static const u32 ar9331_common_rx_gain_1p1[][2] = {  	{0x0000a0b4, 0x00000000},  	{0x0000a0b8, 0x00000000},  	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x001f0000}, -	{0x0000a0c4, 0x01000101}, -	{0x0000a0c8, 0x011e011f}, -	{0x0000a0cc, 0x011c011d}, -	{0x0000a0d0, 0x02030204}, -	{0x0000a0d4, 0x02010202}, -	{0x0000a0d8, 0x021f0200}, -	{0x0000a0dc, 0x0302021e}, -	{0x0000a0e0, 0x03000301}, -	{0x0000a0e4, 0x031e031f}, -	{0x0000a0e8, 0x0402031d}, -	{0x0000a0ec, 0x04000401}, -	{0x0000a0f0, 0x041e041f}, -	{0x0000a0f4, 0x0502041d}, -	{0x0000a0f8, 0x05000501}, -	{0x0000a0fc, 0x051e051f}, -	{0x0000a100, 0x06010602}, -	{0x0000a104, 0x061f0600}, -	{0x0000a108, 0x061d061e}, -	{0x0000a10c, 0x07020703}, -	{0x0000a110, 0x07000701}, +	{0x0000a0c0, 0x22072208}, +	{0x0000a0c4, 0x22052206}, +	{0x0000a0c8, 0x22032204}, +	{0x0000a0cc, 0x22012202}, +	{0x0000a0d0, 0x221f2200}, +	{0x0000a0d4, 0x221d221e}, +	{0x0000a0d8, 0x33023303}, +	{0x0000a0dc, 0x33003301}, +	{0x0000a0e0, 0x331e331f}, +	{0x0000a0e4, 0x4402331d}, +	{0x0000a0e8, 0x44004401}, +	{0x0000a0ec, 0x441e441f}, +	{0x0000a0f0, 0x55025503}, +	{0x0000a0f4, 0x55005501}, +	{0x0000a0f8, 0x551e551f}, +	{0x0000a0fc, 0x6602551d}, +	{0x0000a100, 0x66006601}, +	{0x0000a104, 0x661e661f}, +	{0x0000a108, 0x7703661d}, +	{0x0000a10c, 0x77017702}, +	{0x0000a110, 0x00007700},  	{0x0000a114, 0x00000000},  	{0x0000a118, 0x00000000},  	{0x0000a11c, 0x00000000}, @@ -1054,26 +1041,26 @@ static const u32 ar9331_common_rx_gain_1p1[][2] = {  	{0x0000a138, 0x00000000},  	{0x0000a13c, 0x00000000},  	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x01000101}, -	{0x0000a148, 0x011e011f}, -	{0x0000a14c, 0x011c011d}, -	{0x0000a150, 0x02030204}, -	{0x0000a154, 0x02010202}, -	{0x0000a158, 0x021f0200}, -	{0x0000a15c, 0x0302021e}, -	{0x0000a160, 0x03000301}, -	{0x0000a164, 0x031e031f}, -	{0x0000a168, 0x0402031d}, -	{0x0000a16c, 0x04000401}, -	{0x0000a170, 0x041e041f}, -	{0x0000a174, 0x0502041d}, -	{0x0000a178, 0x05000501}, -	{0x0000a17c, 0x051e051f}, -	{0x0000a180, 0x06010602}, -	{0x0000a184, 0x061f0600}, -	{0x0000a188, 0x061d061e}, -	{0x0000a18c, 0x07020703}, -	{0x0000a190, 0x07000701}, +	{0x0000a144, 0x111f1100}, +	{0x0000a148, 0x111d111e}, +	{0x0000a14c, 0x111b111c}, +	{0x0000a150, 0x22032204}, +	{0x0000a154, 0x22012202}, +	{0x0000a158, 0x221f2200}, +	{0x0000a15c, 0x221d221e}, +	{0x0000a160, 0x33013302}, +	{0x0000a164, 0x331f3300}, +	{0x0000a168, 0x4402331e}, +	{0x0000a16c, 0x44004401}, +	{0x0000a170, 0x441e441f}, +	{0x0000a174, 0x55015502}, +	{0x0000a178, 0x551f5500}, +	{0x0000a17c, 0x6602551e}, +	{0x0000a180, 0x66006601}, +	{0x0000a184, 0x661e661f}, +	{0x0000a188, 0x7703661d}, +	{0x0000a18c, 0x77017702}, +	{0x0000a190, 0x00007700},  	{0x0000a194, 0x00000000},  	{0x0000a198, 0x00000000},  	{0x0000a19c, 0x00000000}, @@ -1100,48 +1087,14 @@ static const u32 ar9331_common_rx_gain_1p1[][2] = {  	{0x0000a1f0, 0x00000396},  	{0x0000a1f4, 0x00000396},  	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000196}, +	{0x0000a1fc, 0x00000296},  };  static const u32 ar9331_common_tx_gain_offset1_1[][1] = { -	{0}, -	{3}, -	{0}, -	{0}, -}; - -static const u32 ar9331_1p1_chansel_xtal_25M[] = { -	0x0101479e, -	0x0101d027, -	0x010258af, -	0x0102e138, -	0x010369c0, -	0x0103f249, -	0x01047ad1, -	0x0105035a, -	0x01058be2, -	0x0106146b, -	0x01069cf3, -	0x0107257c, -	0x0107ae04, -	0x0108f5b2, -}; - -static const u32 ar9331_1p1_chansel_xtal_40M[] = { -	0x00a0ccbe, -	0x00a12213, -	0x00a17769, -	0x00a1ccbe, -	0x00a22213, -	0x00a27769, -	0x00a2ccbe, -	0x00a32213, -	0x00a37769, -	0x00a3ccbe, -	0x00a42213, -	0x00a47769, -	0x00a4ccbe, -	0x00a5998b, +	{0x00000000}, +	{0x00000003}, +	{0x00000000}, +	{0x00000000},  };  #endif /* INITVALS_9330_1P1_H */ diff --git a/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h index 0e6ca0834b3..57ed8a11217 100644 --- a/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h @@ -1,5 +1,6 @@  /* - * Copyright (c) 2011 Atheros Communications Inc. + * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -17,8 +18,8 @@  #ifndef INITVALS_9330_1P2_H  #define INITVALS_9330_1P2_H -static const u32 ar9331_modes_lowest_ob_db_tx_gain_1p2[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +static const u32 ar9331_modes_high_ob_db_tx_gain_1p2[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7},  	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},  	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, @@ -102,8 +103,14 @@ static const u32 ar9331_modes_lowest_ob_db_tx_gain_1p2[][5] = {  	{0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},  }; +#define ar9331_modes_high_power_tx_gain_1p2 ar9331_modes_high_ob_db_tx_gain_1p2 + +#define ar9331_modes_low_ob_db_tx_gain_1p2 ar9331_modes_high_power_tx_gain_1p2 + +#define ar9331_modes_lowest_ob_db_tx_gain_1p2 ar9331_modes_low_ob_db_tx_gain_1p2 +  static const u32 ar9331_1p2_baseband_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},  	{0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e},  	{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0}, @@ -147,191 +154,6 @@ static const u32 ar9331_1p2_baseband_postamble[][5] = {  	{0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  }; -static const u32 ar9331_modes_high_ob_db_tx_gain_1p2[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x3f001620, 0x3f001620}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x41001621, 0x41001621}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x44001640, 0x44001640}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x46001641, 0x46001641}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x48001642, 0x48001642}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x4b001644, 0x4b001644}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4e001a81, 0x4e001a81}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x51001a83, 0x51001a83}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x54001c84, 0x54001c84}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x57001ce3, 0x57001ce3}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x5b001ce5, 0x5b001ce5}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5f001ce9, 0x5f001ce9}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x66001eec, 0x66001eec}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x66001eec, 0x66001eec}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200}, -	{0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202}, -	{0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400}, -	{0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402}, -	{0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404}, -	{0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603}, -	{0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02}, -	{0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04}, -	{0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20}, -	{0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20}, -	{0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22}, -	{0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24}, -	{0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640}, -	{0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660}, -	{0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861}, -	{0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81}, -	{0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83}, -	{0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84}, -	{0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3}, -	{0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5}, -	{0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9}, -	{0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb}, -	{0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec}, -	{0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, -	{0x0000a618, 0x02008501, 0x02008501, 0x02008501, 0x02008501}, -	{0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802}, -	{0x0000a620, 0x0300c802, 0x0300c802, 0x0300c802, 0x0300c802}, -	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x0300cc03, 0x0300cc03}, -	{0x0000a628, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a62c, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a630, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a634, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a638, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -}; - -static const u32 ar9331_modes_low_ob_db_tx_gain_1p2[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x3f001620, 0x3f001620}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x41001621, 0x41001621}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x44001640, 0x44001640}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x46001641, 0x46001641}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x48001642, 0x48001642}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x4b001644, 0x4b001644}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4e001a81, 0x4e001a81}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x51001a83, 0x51001a83}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x54001c84, 0x54001c84}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x57001ce3, 0x57001ce3}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x5b001ce5, 0x5b001ce5}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5f001ce9, 0x5f001ce9}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x66001eec, 0x66001eec}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x66001eec, 0x66001eec}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200}, -	{0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202}, -	{0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400}, -	{0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402}, -	{0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404}, -	{0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603}, -	{0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02}, -	{0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04}, -	{0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20}, -	{0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20}, -	{0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22}, -	{0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24}, -	{0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640}, -	{0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660}, -	{0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861}, -	{0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81}, -	{0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83}, -	{0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84}, -	{0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3}, -	{0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5}, -	{0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9}, -	{0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb}, -	{0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec}, -	{0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, -	{0x0000a618, 0x02008501, 0x02008501, 0x02008501, 0x02008501}, -	{0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802}, -	{0x0000a620, 0x0300c802, 0x0300c802, 0x0300c802, 0x0300c802}, -	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x0300cc03, 0x0300cc03}, -	{0x0000a628, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a62c, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a630, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a634, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a638, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -}; - -static const u32 ar9331_1p2_baseband_core_txfir_coeff_japan_2484[][2] = { -	/* Addr      allmodes  */ -	{0x0000a398, 0x00000000}, -	{0x0000a39c, 0x6f7f0301}, -	{0x0000a3a0, 0xca9228ee}, -}; - -static const u32 ar9331_1p2_xtal_25M[][2] = { -	/* Addr      allmodes  */ -	{0x00007038, 0x000002f8}, -	{0x00008244, 0x0010f3d7}, -	{0x0000824c, 0x0001e7ae}, -	{0x0001609c, 0x0f508f29}, -}; -  static const u32 ar9331_1p2_radio_core[][2] = {  	/* Addr      allmodes  */  	{0x00016000, 0x36db6db6}, @@ -397,684 +219,24 @@ static const u32 ar9331_1p2_radio_core[][2] = {  	{0x000163d4, 0x00000000},  }; -static const u32 ar9331_1p2_soc_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x00007010, 0x00000022, 0x00000022, 0x00000022, 0x00000022}, -}; +#define ar9331_1p2_baseband_core_txfir_coeff_japan_2484 ar9331_1p1_baseband_core_txfir_coeff_japan_2484 -static const u32 ar9331_common_wo_xlna_rx_gain_1p2[][2] = { -	/* Addr      allmodes  */ -	{0x0000a000, 0x00060005}, -	{0x0000a004, 0x00810080}, -	{0x0000a008, 0x00830082}, -	{0x0000a00c, 0x00850084}, -	{0x0000a010, 0x01820181}, -	{0x0000a014, 0x01840183}, -	{0x0000a018, 0x01880185}, -	{0x0000a01c, 0x018a0189}, -	{0x0000a020, 0x02850284}, -	{0x0000a024, 0x02890288}, -	{0x0000a028, 0x028b028a}, -	{0x0000a02c, 0x03850384}, -	{0x0000a030, 0x03890388}, -	{0x0000a034, 0x038b038a}, -	{0x0000a038, 0x038d038c}, -	{0x0000a03c, 0x03910390}, -	{0x0000a040, 0x03930392}, -	{0x0000a044, 0x03950394}, -	{0x0000a048, 0x00000396}, -	{0x0000a04c, 0x00000000}, -	{0x0000a050, 0x00000000}, -	{0x0000a054, 0x00000000}, -	{0x0000a058, 0x00000000}, -	{0x0000a05c, 0x00000000}, -	{0x0000a060, 0x00000000}, -	{0x0000a064, 0x00000000}, -	{0x0000a068, 0x00000000}, -	{0x0000a06c, 0x00000000}, -	{0x0000a070, 0x00000000}, -	{0x0000a074, 0x00000000}, -	{0x0000a078, 0x00000000}, -	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x28282828}, -	{0x0000a084, 0x28282828}, -	{0x0000a088, 0x28282828}, -	{0x0000a08c, 0x28282828}, -	{0x0000a090, 0x28282828}, -	{0x0000a094, 0x24242428}, -	{0x0000a098, 0x171e1e1e}, -	{0x0000a09c, 0x02020b0b}, -	{0x0000a0a0, 0x02020202}, -	{0x0000a0a4, 0x00000000}, -	{0x0000a0a8, 0x00000000}, -	{0x0000a0ac, 0x00000000}, -	{0x0000a0b0, 0x00000000}, -	{0x0000a0b4, 0x00000000}, -	{0x0000a0b8, 0x00000000}, -	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x22072208}, -	{0x0000a0c4, 0x22052206}, -	{0x0000a0c8, 0x22032204}, -	{0x0000a0cc, 0x22012202}, -	{0x0000a0d0, 0x221f2200}, -	{0x0000a0d4, 0x221d221e}, -	{0x0000a0d8, 0x33023303}, -	{0x0000a0dc, 0x33003301}, -	{0x0000a0e0, 0x331e331f}, -	{0x0000a0e4, 0x4402331d}, -	{0x0000a0e8, 0x44004401}, -	{0x0000a0ec, 0x441e441f}, -	{0x0000a0f0, 0x55025503}, -	{0x0000a0f4, 0x55005501}, -	{0x0000a0f8, 0x551e551f}, -	{0x0000a0fc, 0x6602551d}, -	{0x0000a100, 0x66006601}, -	{0x0000a104, 0x661e661f}, -	{0x0000a108, 0x7703661d}, -	{0x0000a10c, 0x77017702}, -	{0x0000a110, 0x00007700}, -	{0x0000a114, 0x00000000}, -	{0x0000a118, 0x00000000}, -	{0x0000a11c, 0x00000000}, -	{0x0000a120, 0x00000000}, -	{0x0000a124, 0x00000000}, -	{0x0000a128, 0x00000000}, -	{0x0000a12c, 0x00000000}, -	{0x0000a130, 0x00000000}, -	{0x0000a134, 0x00000000}, -	{0x0000a138, 0x00000000}, -	{0x0000a13c, 0x00000000}, -	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x111f1100}, -	{0x0000a148, 0x111d111e}, -	{0x0000a14c, 0x111b111c}, -	{0x0000a150, 0x22032204}, -	{0x0000a154, 0x22012202}, -	{0x0000a158, 0x221f2200}, -	{0x0000a15c, 0x221d221e}, -	{0x0000a160, 0x33013302}, -	{0x0000a164, 0x331f3300}, -	{0x0000a168, 0x4402331e}, -	{0x0000a16c, 0x44004401}, -	{0x0000a170, 0x441e441f}, -	{0x0000a174, 0x55015502}, -	{0x0000a178, 0x551f5500}, -	{0x0000a17c, 0x6602551e}, -	{0x0000a180, 0x66006601}, -	{0x0000a184, 0x661e661f}, -	{0x0000a188, 0x7703661d}, -	{0x0000a18c, 0x77017702}, -	{0x0000a190, 0x00007700}, -	{0x0000a194, 0x00000000}, -	{0x0000a198, 0x00000000}, -	{0x0000a19c, 0x00000000}, -	{0x0000a1a0, 0x00000000}, -	{0x0000a1a4, 0x00000000}, -	{0x0000a1a8, 0x00000000}, -	{0x0000a1ac, 0x00000000}, -	{0x0000a1b0, 0x00000000}, -	{0x0000a1b4, 0x00000000}, -	{0x0000a1b8, 0x00000000}, -	{0x0000a1bc, 0x00000000}, -	{0x0000a1c0, 0x00000000}, -	{0x0000a1c4, 0x00000000}, -	{0x0000a1c8, 0x00000000}, -	{0x0000a1cc, 0x00000000}, -	{0x0000a1d0, 0x00000000}, -	{0x0000a1d4, 0x00000000}, -	{0x0000a1d8, 0x00000000}, -	{0x0000a1dc, 0x00000000}, -	{0x0000a1e0, 0x00000000}, -	{0x0000a1e4, 0x00000000}, -	{0x0000a1e8, 0x00000000}, -	{0x0000a1ec, 0x00000000}, -	{0x0000a1f0, 0x00000396}, -	{0x0000a1f4, 0x00000396}, -	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000296}, -}; +#define ar9331_1p2_xtal_25M ar9331_1p1_xtal_25M -static const u32 ar9331_1p2_baseband_core[][2] = { -	/* Addr      allmodes  */ -	{0x00009800, 0xafe68e30}, -	{0x00009804, 0xfd14e000}, -	{0x00009808, 0x9c0a8f6b}, -	{0x0000980c, 0x04800000}, -	{0x00009814, 0x9280c00a}, -	{0x00009818, 0x00000000}, -	{0x0000981c, 0x00020028}, -	{0x00009834, 0x5f3ca3de}, -	{0x00009838, 0x0108ecff}, -	{0x0000983c, 0x14750600}, -	{0x00009880, 0x201fff00}, -	{0x00009884, 0x00001042}, -	{0x000098a4, 0x00200400}, -	{0x000098b0, 0x32840bbe}, -	{0x000098d0, 0x004b6a8e}, -	{0x000098d4, 0x00000820}, -	{0x000098dc, 0x00000000}, -	{0x000098f0, 0x00000000}, -	{0x000098f4, 0x00000000}, -	{0x00009c04, 0x00000000}, -	{0x00009c08, 0x03200000}, -	{0x00009c0c, 0x00000000}, -	{0x00009c10, 0x00000000}, -	{0x00009c14, 0x00046384}, -	{0x00009c18, 0x05b6b440}, -	{0x00009c1c, 0x00b6b440}, -	{0x00009d00, 0xc080a333}, -	{0x00009d04, 0x40206c10}, -	{0x00009d08, 0x009c4060}, -	{0x00009d0c, 0x1883800a}, -	{0x00009d10, 0x01834061}, -	{0x00009d14, 0x00c00400}, -	{0x00009d18, 0x00000000}, -	{0x00009e08, 0x0038233c}, -	{0x00009e24, 0x9927b515}, -	{0x00009e28, 0x12ef0200}, -	{0x00009e30, 0x06336f77}, -	{0x00009e34, 0x6af6532f}, -	{0x00009e38, 0x0cc80c00}, -	{0x00009e40, 0x0d261820}, -	{0x00009e4c, 0x00001004}, -	{0x00009e50, 0x00ff03f1}, -	{0x00009fc0, 0x803e4788}, -	{0x00009fc4, 0x0001efb5}, -	{0x00009fcc, 0x40000014}, -	{0x0000a20c, 0x00000000}, -	{0x0000a220, 0x00000000}, -	{0x0000a224, 0x00000000}, -	{0x0000a228, 0x10002310}, -	{0x0000a23c, 0x00000000}, -	{0x0000a244, 0x0c000000}, -	{0x0000a2a0, 0x00000001}, -	{0x0000a2c0, 0x00000001}, -	{0x0000a2c8, 0x00000000}, -	{0x0000a2cc, 0x18c43433}, -	{0x0000a2d4, 0x00000000}, -	{0x0000a2dc, 0x00000000}, -	{0x0000a2e0, 0x00000000}, -	{0x0000a2e4, 0x00000000}, -	{0x0000a2e8, 0x00000000}, -	{0x0000a2ec, 0x00000000}, -	{0x0000a2f0, 0x00000000}, -	{0x0000a2f4, 0x00000000}, -	{0x0000a2f8, 0x00000000}, -	{0x0000a344, 0x00000000}, -	{0x0000a34c, 0x00000000}, -	{0x0000a350, 0x0000a000}, -	{0x0000a364, 0x00000000}, -	{0x0000a370, 0x00000000}, -	{0x0000a390, 0x00000001}, -	{0x0000a394, 0x00000444}, -	{0x0000a398, 0x001f0e0f}, -	{0x0000a39c, 0x0075393f}, -	{0x0000a3a0, 0xb79f6427}, -	{0x0000a3a4, 0x00000000}, -	{0x0000a3a8, 0xaaaaaaaa}, -	{0x0000a3ac, 0x3c466478}, -	{0x0000a3c0, 0x20202020}, -	{0x0000a3c4, 0x22222220}, -	{0x0000a3c8, 0x20200020}, -	{0x0000a3cc, 0x20202020}, -	{0x0000a3d0, 0x20202020}, -	{0x0000a3d4, 0x20202020}, -	{0x0000a3d8, 0x20202020}, -	{0x0000a3dc, 0x20202020}, -	{0x0000a3e0, 0x20202020}, -	{0x0000a3e4, 0x20202020}, -	{0x0000a3e8, 0x20202020}, -	{0x0000a3ec, 0x20202020}, -	{0x0000a3f0, 0x00000000}, -	{0x0000a3f4, 0x00000006}, -	{0x0000a3f8, 0x0cdbd380}, -	{0x0000a3fc, 0x000f0f01}, -	{0x0000a400, 0x8fa91f01}, -	{0x0000a404, 0x00000000}, -	{0x0000a408, 0x0e79e5c6}, -	{0x0000a40c, 0x00820820}, -	{0x0000a414, 0x1ce739ce}, -	{0x0000a418, 0x2d001dce}, -	{0x0000a41c, 0x1ce739ce}, -	{0x0000a420, 0x000001ce}, -	{0x0000a424, 0x1ce739ce}, -	{0x0000a428, 0x000001ce}, -	{0x0000a42c, 0x1ce739ce}, -	{0x0000a430, 0x1ce739ce}, -	{0x0000a434, 0x00000000}, -	{0x0000a438, 0x00001801}, -	{0x0000a43c, 0x00000000}, -	{0x0000a440, 0x00000000}, -	{0x0000a444, 0x00000000}, -	{0x0000a448, 0x04000000}, -	{0x0000a44c, 0x00000001}, -	{0x0000a450, 0x00010000}, -	{0x0000a458, 0x00000000}, -	{0x0000a640, 0x00000000}, -	{0x0000a644, 0x3fad9d74}, -	{0x0000a648, 0x0048060a}, -	{0x0000a64c, 0x00003c37}, -	{0x0000a670, 0x03020100}, -	{0x0000a674, 0x09080504}, -	{0x0000a678, 0x0d0c0b0a}, -	{0x0000a67c, 0x13121110}, -	{0x0000a680, 0x31301514}, -	{0x0000a684, 0x35343332}, -	{0x0000a688, 0x00000036}, -	{0x0000a690, 0x00000838}, -	{0x0000a7c0, 0x00000000}, -	{0x0000a7c4, 0xfffffffc}, -	{0x0000a7c8, 0x00000000}, -	{0x0000a7cc, 0x00000000}, -	{0x0000a7d0, 0x00000000}, -	{0x0000a7d4, 0x00000004}, -	{0x0000a7dc, 0x00000001}, -}; +#define ar9331_1p2_xtal_40M ar9331_1p1_xtal_40M -static const u32 ar9331_modes_high_power_tx_gain_1p2[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x3f001620, 0x3f001620}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x41001621, 0x41001621}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x44001640, 0x44001640}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x46001641, 0x46001641}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x48001642, 0x48001642}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x4b001644, 0x4b001644}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4e001a81, 0x4e001a81}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x51001a83, 0x51001a83}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x54001c84, 0x54001c84}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x57001ce3, 0x57001ce3}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x5b001ce5, 0x5b001ce5}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5f001ce9, 0x5f001ce9}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x66001eec, 0x66001eec}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x66001eec, 0x66001eec}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec}, -	{0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200}, -	{0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202}, -	{0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400}, -	{0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402}, -	{0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404}, -	{0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603}, -	{0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02}, -	{0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04}, -	{0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20}, -	{0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20}, -	{0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22}, -	{0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24}, -	{0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640}, -	{0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660}, -	{0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861}, -	{0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81}, -	{0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83}, -	{0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84}, -	{0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3}, -	{0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5}, -	{0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9}, -	{0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb}, -	{0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec}, -	{0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec}, -	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, -	{0x0000a618, 0x02008501, 0x02008501, 0x02008501, 0x02008501}, -	{0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802}, -	{0x0000a620, 0x0300c802, 0x0300c802, 0x0300c802, 0x0300c802}, -	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x0300cc03, 0x0300cc03}, -	{0x0000a628, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a62c, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a630, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a634, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a638, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -	{0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004}, -}; +#define ar9331_1p2_baseband_core ar9331_1p1_baseband_core -static const u32 ar9331_1p2_mac_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, -	{0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, -	{0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, -	{0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, -	{0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, -	{0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, -	{0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, -	{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, -}; +#define ar9331_1p2_soc_postamble ar9331_1p1_soc_postamble -static const u32 ar9331_1p2_soc_preamble[][2] = { -	/* Addr      allmodes  */ -	{0x00007020, 0x00000000}, -	{0x00007034, 0x00000002}, -	{0x00007038, 0x000002f8}, -}; +#define ar9331_1p2_mac_postamble ar9331_1p1_mac_postamble -static const u32 ar9331_1p2_xtal_40M[][2] = { -	/* Addr      allmodes  */ -	{0x00007038, 0x000004c2}, -	{0x00008244, 0x0010f400}, -	{0x0000824c, 0x0001e800}, -	{0x0001609c, 0x0b283f31}, -}; +#define ar9331_1p2_soc_preamble ar9331_1p1_soc_preamble -static const u32 ar9331_1p2_mac_core[][2] = { -	/* Addr      allmodes  */ -	{0x00000008, 0x00000000}, -	{0x00000030, 0x00020085}, -	{0x00000034, 0x00000005}, -	{0x00000040, 0x00000000}, -	{0x00000044, 0x00000000}, -	{0x00000048, 0x00000008}, -	{0x0000004c, 0x00000010}, -	{0x00000050, 0x00000000}, -	{0x00001040, 0x002ffc0f}, -	{0x00001044, 0x002ffc0f}, -	{0x00001048, 0x002ffc0f}, -	{0x0000104c, 0x002ffc0f}, -	{0x00001050, 0x002ffc0f}, -	{0x00001054, 0x002ffc0f}, -	{0x00001058, 0x002ffc0f}, -	{0x0000105c, 0x002ffc0f}, -	{0x00001060, 0x002ffc0f}, -	{0x00001064, 0x002ffc0f}, -	{0x000010f0, 0x00000100}, -	{0x00001270, 0x00000000}, -	{0x000012b0, 0x00000000}, -	{0x000012f0, 0x00000000}, -	{0x0000143c, 0x00000000}, -	{0x0000147c, 0x00000000}, -	{0x00008000, 0x00000000}, -	{0x00008004, 0x00000000}, -	{0x00008008, 0x00000000}, -	{0x0000800c, 0x00000000}, -	{0x00008018, 0x00000000}, -	{0x00008020, 0x00000000}, -	{0x00008038, 0x00000000}, -	{0x0000803c, 0x00000000}, -	{0x00008040, 0x00000000}, -	{0x00008044, 0x00000000}, -	{0x00008048, 0x00000000}, -	{0x0000804c, 0xffffffff}, -	{0x00008054, 0x00000000}, -	{0x00008058, 0x00000000}, -	{0x0000805c, 0x000fc78f}, -	{0x00008060, 0x0000000f}, -	{0x00008064, 0x00000000}, -	{0x00008070, 0x00000310}, -	{0x00008074, 0x00000020}, -	{0x00008078, 0x00000000}, -	{0x0000809c, 0x0000000f}, -	{0x000080a0, 0x00000000}, -	{0x000080a4, 0x02ff0000}, -	{0x000080a8, 0x0e070605}, -	{0x000080ac, 0x0000000d}, -	{0x000080b0, 0x00000000}, -	{0x000080b4, 0x00000000}, -	{0x000080b8, 0x00000000}, -	{0x000080bc, 0x00000000}, -	{0x000080c0, 0x2a800000}, -	{0x000080c4, 0x06900168}, -	{0x000080c8, 0x13881c20}, -	{0x000080cc, 0x01f40000}, -	{0x000080d0, 0x00252500}, -	{0x000080d4, 0x00a00000}, -	{0x000080d8, 0x00400000}, -	{0x000080dc, 0x00000000}, -	{0x000080e0, 0xffffffff}, -	{0x000080e4, 0x0000ffff}, -	{0x000080e8, 0x3f3f3f3f}, -	{0x000080ec, 0x00000000}, -	{0x000080f0, 0x00000000}, -	{0x000080f4, 0x00000000}, -	{0x000080fc, 0x00020000}, -	{0x00008100, 0x00000000}, -	{0x00008108, 0x00000052}, -	{0x0000810c, 0x00000000}, -	{0x00008110, 0x00000000}, -	{0x00008114, 0x000007ff}, -	{0x00008118, 0x000000aa}, -	{0x0000811c, 0x00003210}, -	{0x00008124, 0x00000000}, -	{0x00008128, 0x00000000}, -	{0x0000812c, 0x00000000}, -	{0x00008130, 0x00000000}, -	{0x00008134, 0x00000000}, -	{0x00008138, 0x00000000}, -	{0x0000813c, 0x0000ffff}, -	{0x00008144, 0xffffffff}, -	{0x00008168, 0x00000000}, -	{0x0000816c, 0x00000000}, -	{0x00008170, 0x18486200}, -	{0x00008174, 0x33332210}, -	{0x00008178, 0x00000000}, -	{0x0000817c, 0x00020000}, -	{0x000081c0, 0x00000000}, -	{0x000081c4, 0x33332210}, -	{0x000081c8, 0x00000000}, -	{0x000081cc, 0x00000000}, -	{0x000081d4, 0x00000000}, -	{0x000081ec, 0x00000000}, -	{0x000081f0, 0x00000000}, -	{0x000081f4, 0x00000000}, -	{0x000081f8, 0x00000000}, -	{0x000081fc, 0x00000000}, -	{0x00008240, 0x00100000}, -	{0x00008248, 0x00000800}, -	{0x00008250, 0x00000000}, -	{0x00008254, 0x00000000}, -	{0x00008258, 0x00000000}, -	{0x0000825c, 0x40000000}, -	{0x00008260, 0x00080922}, -	{0x00008264, 0x9d400010}, -	{0x00008268, 0xffffffff}, -	{0x0000826c, 0x0000ffff}, -	{0x00008270, 0x00000000}, -	{0x00008274, 0x40000000}, -	{0x00008278, 0x003e4180}, -	{0x0000827c, 0x00000004}, -	{0x00008284, 0x0000002c}, -	{0x00008288, 0x0000002c}, -	{0x0000828c, 0x000000ff}, -	{0x00008294, 0x00000000}, -	{0x00008298, 0x00000000}, -	{0x0000829c, 0x00000000}, -	{0x00008300, 0x00000140}, -	{0x00008314, 0x00000000}, -	{0x0000831c, 0x0000010d}, -	{0x00008328, 0x00000000}, -	{0x0000832c, 0x00000007}, -	{0x00008330, 0x00000302}, -	{0x00008334, 0x00000700}, -	{0x00008338, 0x00ff0000}, -	{0x0000833c, 0x02400000}, -	{0x00008340, 0x000107ff}, -	{0x00008344, 0xaa48105b}, -	{0x00008348, 0x008f0000}, -	{0x0000835c, 0x00000000}, -	{0x00008360, 0xffffffff}, -	{0x00008364, 0xffffffff}, -	{0x00008368, 0x00000000}, -	{0x00008370, 0x00000000}, -	{0x00008374, 0x000000ff}, -	{0x00008378, 0x00000000}, -	{0x0000837c, 0x00000000}, -	{0x00008380, 0xffffffff}, -	{0x00008384, 0xffffffff}, -	{0x00008390, 0xffffffff}, -	{0x00008394, 0xffffffff}, -	{0x00008398, 0x00000000}, -	{0x0000839c, 0x00000000}, -	{0x000083a0, 0x00000000}, -	{0x000083a4, 0x0000fa14}, -	{0x000083a8, 0x000f0c00}, -	{0x000083ac, 0x33332210}, -	{0x000083b0, 0x33332210}, -	{0x000083b4, 0x33332210}, -	{0x000083b8, 0x33332210}, -	{0x000083bc, 0x00000000}, -	{0x000083c0, 0x00000000}, -	{0x000083c4, 0x00000000}, -	{0x000083c8, 0x00000000}, -	{0x000083cc, 0x00000200}, -	{0x000083d0, 0x000301ff}, -}; +#define ar9331_1p2_mac_core ar9331_1p1_mac_core -static const u32 ar9331_common_rx_gain_1p2[][2] = { -	/* Addr      allmodes  */ -	{0x0000a000, 0x00010000}, -	{0x0000a004, 0x00030002}, -	{0x0000a008, 0x00050004}, -	{0x0000a00c, 0x00810080}, -	{0x0000a010, 0x01800082}, -	{0x0000a014, 0x01820181}, -	{0x0000a018, 0x01840183}, -	{0x0000a01c, 0x01880185}, -	{0x0000a020, 0x018a0189}, -	{0x0000a024, 0x02850284}, -	{0x0000a028, 0x02890288}, -	{0x0000a02c, 0x03850384}, -	{0x0000a030, 0x03890388}, -	{0x0000a034, 0x038b038a}, -	{0x0000a038, 0x038d038c}, -	{0x0000a03c, 0x03910390}, -	{0x0000a040, 0x03930392}, -	{0x0000a044, 0x03950394}, -	{0x0000a048, 0x00000396}, -	{0x0000a04c, 0x00000000}, -	{0x0000a050, 0x00000000}, -	{0x0000a054, 0x00000000}, -	{0x0000a058, 0x00000000}, -	{0x0000a05c, 0x00000000}, -	{0x0000a060, 0x00000000}, -	{0x0000a064, 0x00000000}, -	{0x0000a068, 0x00000000}, -	{0x0000a06c, 0x00000000}, -	{0x0000a070, 0x00000000}, -	{0x0000a074, 0x00000000}, -	{0x0000a078, 0x00000000}, -	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x28282828}, -	{0x0000a084, 0x28282828}, -	{0x0000a088, 0x28282828}, -	{0x0000a08c, 0x28282828}, -	{0x0000a090, 0x28282828}, -	{0x0000a094, 0x21212128}, -	{0x0000a098, 0x171c1c1c}, -	{0x0000a09c, 0x02020212}, -	{0x0000a0a0, 0x00000202}, -	{0x0000a0a4, 0x00000000}, -	{0x0000a0a8, 0x00000000}, -	{0x0000a0ac, 0x00000000}, -	{0x0000a0b0, 0x00000000}, -	{0x0000a0b4, 0x00000000}, -	{0x0000a0b8, 0x00000000}, -	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x001f0000}, -	{0x0000a0c4, 0x111f1100}, -	{0x0000a0c8, 0x111d111e}, -	{0x0000a0cc, 0x111b111c}, -	{0x0000a0d0, 0x22032204}, -	{0x0000a0d4, 0x22012202}, -	{0x0000a0d8, 0x221f2200}, -	{0x0000a0dc, 0x221d221e}, -	{0x0000a0e0, 0x33013302}, -	{0x0000a0e4, 0x331f3300}, -	{0x0000a0e8, 0x4402331e}, -	{0x0000a0ec, 0x44004401}, -	{0x0000a0f0, 0x441e441f}, -	{0x0000a0f4, 0x55015502}, -	{0x0000a0f8, 0x551f5500}, -	{0x0000a0fc, 0x6602551e}, -	{0x0000a100, 0x66006601}, -	{0x0000a104, 0x661e661f}, -	{0x0000a108, 0x7703661d}, -	{0x0000a10c, 0x77017702}, -	{0x0000a110, 0x00007700}, -	{0x0000a114, 0x00000000}, -	{0x0000a118, 0x00000000}, -	{0x0000a11c, 0x00000000}, -	{0x0000a120, 0x00000000}, -	{0x0000a124, 0x00000000}, -	{0x0000a128, 0x00000000}, -	{0x0000a12c, 0x00000000}, -	{0x0000a130, 0x00000000}, -	{0x0000a134, 0x00000000}, -	{0x0000a138, 0x00000000}, -	{0x0000a13c, 0x00000000}, -	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x111f1100}, -	{0x0000a148, 0x111d111e}, -	{0x0000a14c, 0x111b111c}, -	{0x0000a150, 0x22032204}, -	{0x0000a154, 0x22012202}, -	{0x0000a158, 0x221f2200}, -	{0x0000a15c, 0x221d221e}, -	{0x0000a160, 0x33013302}, -	{0x0000a164, 0x331f3300}, -	{0x0000a168, 0x4402331e}, -	{0x0000a16c, 0x44004401}, -	{0x0000a170, 0x441e441f}, -	{0x0000a174, 0x55015502}, -	{0x0000a178, 0x551f5500}, -	{0x0000a17c, 0x6602551e}, -	{0x0000a180, 0x66006601}, -	{0x0000a184, 0x661e661f}, -	{0x0000a188, 0x7703661d}, -	{0x0000a18c, 0x77017702}, -	{0x0000a190, 0x00007700}, -	{0x0000a194, 0x00000000}, -	{0x0000a198, 0x00000000}, -	{0x0000a19c, 0x00000000}, -	{0x0000a1a0, 0x00000000}, -	{0x0000a1a4, 0x00000000}, -	{0x0000a1a8, 0x00000000}, -	{0x0000a1ac, 0x00000000}, -	{0x0000a1b0, 0x00000000}, -	{0x0000a1b4, 0x00000000}, -	{0x0000a1b8, 0x00000000}, -	{0x0000a1bc, 0x00000000}, -	{0x0000a1c0, 0x00000000}, -	{0x0000a1c4, 0x00000000}, -	{0x0000a1c8, 0x00000000}, -	{0x0000a1cc, 0x00000000}, -	{0x0000a1d0, 0x00000000}, -	{0x0000a1d4, 0x00000000}, -	{0x0000a1d8, 0x00000000}, -	{0x0000a1dc, 0x00000000}, -	{0x0000a1e0, 0x00000000}, -	{0x0000a1e4, 0x00000000}, -	{0x0000a1e8, 0x00000000}, -	{0x0000a1ec, 0x00000000}, -	{0x0000a1f0, 0x00000396}, -	{0x0000a1f4, 0x00000396}, -	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000296}, -}; +#define ar9331_common_wo_xlna_rx_gain_1p2 ar9331_common_wo_xlna_rx_gain_1p1 + +#define ar9331_common_rx_gain_1p2 ar9485_common_rx_gain_1_1  #endif /* INITVALS_9330_1P2_H */ diff --git a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h index 815a8af1bee..1d8235e19f0 100644 --- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h @@ -1,5 +1,6 @@  /* - * Copyright (c) 2011 Atheros Communications Inc. + * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -18,16 +19,16 @@  #define INITVALS_9340_H  static const u32 ar9340_1p0_radio_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x000160ac, 0xa4646800, 0xa4646800, 0xa4646800, 0xa4646800}, -	{0x0001610c, 0x08000000, 0x08000000, 0x00000000, 0x00000000}, +	{0x0001610c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},  	{0x00016140, 0x10804000, 0x10804000, 0x50804000, 0x50804000}, -	{0x0001650c, 0x08000000, 0x08000000, 0x00000000, 0x00000000}, +	{0x0001650c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},  	{0x00016540, 0x10804000, 0x10804000, 0x50804000, 0x50804000},  };  static const u32 ar9340Modes_lowest_ob_db_tx_gain_table_1p0[][5] = { -	/*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, @@ -99,21 +100,10 @@ static const u32 ar9340Modes_lowest_ob_db_tx_gain_table_1p0[][5] = {  	{0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266},  }; -static const u32 ar9340Modes_fast_clock_1p0[][3] = { -	/*  Addr      5G_HT20     5G_HT40  */ -	{0x00001030, 0x00000268, 0x000004d0}, -	{0x00001070, 0x0000018c, 0x00000318}, -	{0x000010b0, 0x00000fd0, 0x00001fa0}, -	{0x00008014, 0x044c044c, 0x08980898}, -	{0x0000801c, 0x148ec02b, 0x148ec057}, -	{0x00008318, 0x000044c0, 0x00008980}, -	{0x00009e00, 0x03721821, 0x03721821}, -	{0x0000a230, 0x0000000b, 0x00000016}, -	{0x0000a254, 0x00000898, 0x00001130}, -}; +#define ar9340Modes_fast_clock_1p0 ar9300Modes_fast_clock_2p2  static const u32 ar9340_1p0_radio_core[][2] = { -	/*  Addr     allmodes  */ +	/* Addr      allmodes  */  	{0x00016000, 0x36db6db6},  	{0x00016004, 0x6db6db40},  	{0x00016008, 0x73f00000}, @@ -146,15 +136,13 @@ static const u32 ar9340_1p0_radio_core[][2] = {  	{0x00016100, 0x04cb0001},  	{0x00016104, 0xfff80000},  	{0x00016108, 0x00080010}, -	{0x0001610c, 0x00000000},  	{0x00016140, 0x50804008},  	{0x00016144, 0x01884080},  	{0x00016148, 0x000080c0},  	{0x00016280, 0x01000015}, -	{0x00016284, 0x05530000}, +	{0x00016284, 0x15530000},  	{0x00016288, 0x00318000},  	{0x0001628c, 0x50000000}, -	{0x00016290, 0x4080294f},  	{0x00016380, 0x00000000},  	{0x00016384, 0x00000000},  	{0x00016388, 0x00800700}, @@ -219,52 +207,43 @@ static const u32 ar9340_1p0_radio_core[][2] = {  };  static const u32 ar9340_1p0_radio_core_40M[][2] = { +	/* Addr      allmodes  */  	{0x0001609c, 0x02566f3a},  	{0x000160ac, 0xa4647c00},  	{0x000160b0, 0x01885f5a},  }; -static const u32 ar9340_1p0_mac_postamble[][5] = { -	/* Addr       5G_HT20     5G_HT40     2G_HT40    2G_HT20  */ -	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, -	{0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, -	{0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, -	{0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, -	{0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, -	{0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, -	{0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, -	{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, -}; +#define ar9340_1p0_mac_postamble ar9300_2p2_mac_postamble -static const u32 ar9340_1p0_soc_postamble[][5] = { -	/*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ -	{0x00007010, 0x00000023, 0x00000023, 0x00000023, 0x00000023}, -}; +#define ar9340_1p0_soc_postamble ar9300_2p2_soc_postamble  static const u32 ar9340_1p0_baseband_postamble[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},  	{0x00009820, 0x206a022e, 0x206a022e, 0x206a022e, 0x206a022e},  	{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},  	{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},  	{0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},  	{0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c}, -	{0x00009c00, 0x00000044, 0x000000c4, 0x000000c4, 0x00000044}, -	{0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0}, -	{0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020}, +	{0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4}, +	{0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0}, +	{0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020},  	{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},  	{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec88d2e, 0x7ec88d2e}, -	{0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e}, +	{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},  	{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},  	{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},  	{0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, +	{0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222},  	{0x00009e44, 0x02321e27, 0x02321e27, 0x02291e27, 0x02291e27},  	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},  	{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, -	{0x0000a204, 0x00003fc0, 0x00003fc4, 0x00003fc4, 0x00003fc0}, +	{0x0000a204, 0x00003ec0, 0x00003ec4, 0x00003ec4, 0x00003ec0},  	{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, +	{0x0000a22c, 0x07e26a2f, 0x07e26a2f, 0x01026a2f, 0x01026a2f},  	{0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b}, +	{0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff},  	{0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},  	{0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},  	{0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898}, @@ -277,11 +256,11 @@ static const u32 ar9340_1p0_baseband_postamble[][5] = {  	{0x0000a288, 0x00000220, 0x00000220, 0x00000110, 0x00000110},  	{0x0000a28c, 0x00011111, 0x00011111, 0x00022222, 0x00022222},  	{0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, -	{0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071982}, -	{0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a}, +	{0x0000a2d0, 0x00041983, 0x00041983, 0x00041982, 0x00041982}, +	{0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},  	{0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, -	{0x0000ae04, 0x00180000, 0x00180000, 0x00180000, 0x00180000}, +	{0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000},  	{0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},  	{0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, @@ -289,21 +268,21 @@ static const u32 ar9340_1p0_baseband_postamble[][5] = {  };  static const u32 ar9340_1p0_baseband_core[][2] = { -	/*  Addr     allmodes  */ +	/* Addr      allmodes  */  	{0x00009800, 0xafe68e30},  	{0x00009804, 0xfd14e000},  	{0x00009808, 0x9c0a9f6b},  	{0x0000980c, 0x04900000}, -	{0x00009814, 0xb280c00a}, +	{0x00009814, 0x3280c00a},  	{0x00009818, 0x00000000},  	{0x0000981c, 0x00020028}, -	{0x00009834, 0x5f3ca3de}, +	{0x00009834, 0x6400a190},  	{0x00009838, 0x0108ecff}, -	{0x0000983c, 0x14750600}, +	{0x0000983c, 0x14000600},  	{0x00009880, 0x201fff00},  	{0x00009884, 0x00001042},  	{0x000098a4, 0x00200400}, -	{0x000098b0, 0x52440bbe}, +	{0x000098b0, 0x32840bbe},  	{0x000098d0, 0x004b6a8e},  	{0x000098d4, 0x00000820},  	{0x000098dc, 0x00000000}, @@ -329,7 +308,6 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  	{0x00009e30, 0x06336f77},  	{0x00009e34, 0x6af6532f},  	{0x00009e38, 0x0cc80c00}, -	{0x00009e3c, 0xcf946222},  	{0x00009e40, 0x0d261820},  	{0x00009e4c, 0x00001004},  	{0x00009e50, 0x00ff03f1}, @@ -342,8 +320,6 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  	{0x0000a220, 0x00000000},  	{0x0000a224, 0x00000000},  	{0x0000a228, 0x10002310}, -	{0x0000a22c, 0x01036a1e}, -	{0x0000a234, 0x10000fff},  	{0x0000a23c, 0x00000000},  	{0x0000a244, 0x0c000000},  	{0x0000a2a0, 0x00000001}, @@ -351,10 +327,6 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  	{0x0000a2c8, 0x00000000},  	{0x0000a2cc, 0x18c43433},  	{0x0000a2d4, 0x00000000}, -	{0x0000a2dc, 0x00000000}, -	{0x0000a2e0, 0x00000000}, -	{0x0000a2e4, 0x00000000}, -	{0x0000a2e8, 0x00000000},  	{0x0000a2ec, 0x00000000},  	{0x0000a2f0, 0x00000000},  	{0x0000a2f4, 0x00000000}, @@ -385,7 +357,7 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  	{0x0000a3e8, 0x20202020},  	{0x0000a3ec, 0x20202020},  	{0x0000a3f0, 0x00000000}, -	{0x0000a3f4, 0x00000246}, +	{0x0000a3f4, 0x00000000},  	{0x0000a3f8, 0x0cdbd380},  	{0x0000a3fc, 0x000f0f01},  	{0x0000a400, 0x8fa91f01}, @@ -402,33 +374,17 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  	{0x0000a430, 0x1ce739ce},  	{0x0000a434, 0x00000000},  	{0x0000a438, 0x00001801}, -	{0x0000a43c, 0x00000000}, +	{0x0000a43c, 0x00100000},  	{0x0000a440, 0x00000000},  	{0x0000a444, 0x00000000}, -	{0x0000a448, 0x04000080}, +	{0x0000a448, 0x05000080},  	{0x0000a44c, 0x00000001},  	{0x0000a450, 0x00010000},  	{0x0000a458, 0x00000000}, -	{0x0000a600, 0x00000000}, -	{0x0000a604, 0x00000000}, -	{0x0000a608, 0x00000000}, -	{0x0000a60c, 0x00000000}, -	{0x0000a610, 0x00000000}, -	{0x0000a614, 0x00000000}, -	{0x0000a618, 0x00000000}, -	{0x0000a61c, 0x00000000}, -	{0x0000a620, 0x00000000}, -	{0x0000a624, 0x00000000}, -	{0x0000a628, 0x00000000}, -	{0x0000a62c, 0x00000000}, -	{0x0000a630, 0x00000000}, -	{0x0000a634, 0x00000000}, -	{0x0000a638, 0x00000000}, -	{0x0000a63c, 0x00000000},  	{0x0000a640, 0x00000000},  	{0x0000a644, 0x3fad9d74},  	{0x0000a648, 0x0048060a}, -	{0x0000a64c, 0x00000637}, +	{0x0000a64c, 0x00003c37},  	{0x0000a670, 0x03020100},  	{0x0000a674, 0x09080504},  	{0x0000a678, 0x0d0c0b0a}, @@ -451,10 +407,6 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  	{0x0000a8f4, 0x00000000},  	{0x0000b2d0, 0x00000080},  	{0x0000b2d4, 0x00000000}, -	{0x0000b2dc, 0x00000000}, -	{0x0000b2e0, 0x00000000}, -	{0x0000b2e4, 0x00000000}, -	{0x0000b2e8, 0x00000000},  	{0x0000b2ec, 0x00000000},  	{0x0000b2f0, 0x00000000},  	{0x0000b2f4, 0x00000000}, @@ -465,80 +417,108 @@ static const u32 ar9340_1p0_baseband_core[][2] = {  };  static const u32 ar9340Modes_high_power_tx_gain_table_1p0[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, +	{0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, +	{0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, +	{0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501}, +	{0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501}, +	{0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03}, +	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, +	{0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04}, +	{0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005}, +	{0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, +	{0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, +	{0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, -	{0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, -	{0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200}, -	{0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202}, -	{0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400}, -	{0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402}, -	{0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404}, -	{0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603}, -	{0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02}, -	{0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04}, -	{0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20}, -	{0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20}, -	{0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22}, -	{0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24}, -	{0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640}, -	{0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660}, -	{0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861}, -	{0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81}, -	{0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42001a83, 0x42001a83}, -	{0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84}, -	{0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3}, -	{0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5}, -	{0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9}, -	{0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb}, -	{0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, +	{0x0000a504, 0x04002222, 0x04002222, 0x02000001, 0x02000001}, +	{0x0000a508, 0x09002421, 0x09002421, 0x05000003, 0x05000003}, +	{0x0000a50c, 0x0d002621, 0x0d002621, 0x0a000005, 0x0a000005}, +	{0x0000a510, 0x13004620, 0x13004620, 0x0e000201, 0x0e000201}, +	{0x0000a514, 0x19004a20, 0x19004a20, 0x11000203, 0x11000203}, +	{0x0000a518, 0x1d004e20, 0x1d004e20, 0x14000401, 0x14000401}, +	{0x0000a51c, 0x21005420, 0x21005420, 0x18000403, 0x18000403}, +	{0x0000a520, 0x26005e20, 0x26005e20, 0x1b000602, 0x1b000602}, +	{0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000802, 0x1f000802}, +	{0x0000a528, 0x2f005e42, 0x2f005e42, 0x21000620, 0x21000620}, +	{0x0000a52c, 0x33005e44, 0x33005e44, 0x25000820, 0x25000820}, +	{0x0000a530, 0x38005e65, 0x38005e65, 0x29000822, 0x29000822}, +	{0x0000a534, 0x3c005e69, 0x3c005e69, 0x2d000824, 0x2d000824}, +	{0x0000a538, 0x40005e6b, 0x40005e6b, 0x30000828, 0x30000828}, +	{0x0000a53c, 0x44005e6d, 0x44005e6d, 0x3400082a, 0x3400082a}, +	{0x0000a540, 0x49005e72, 0x49005e72, 0x38000849, 0x38000849}, +	{0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b000a2c, 0x3b000a2c}, +	{0x0000a548, 0x53005f12, 0x53005f12, 0x3e000e2b, 0x3e000e2b}, +	{0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42000e2d, 0x42000e2d}, +	{0x0000a550, 0x5e025f12, 0x5e025f12, 0x4500124a, 0x4500124a}, +	{0x0000a554, 0x61027f12, 0x61027f12, 0x4900124c, 0x4900124c}, +	{0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c00126c, 0x4c00126c}, +	{0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x4f00128c, 0x4f00128c}, +	{0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x52001290, 0x52001290}, +	{0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292}, +	{0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292}, +	{0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292}, +	{0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292}, +	{0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292}, +	{0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292}, +	{0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},  	{0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000}, -	{0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002}, -	{0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004}, -	{0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200}, -	{0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202}, -	{0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400}, -	{0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402}, -	{0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404}, -	{0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603}, -	{0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02}, -	{0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04}, -	{0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20}, -	{0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20}, -	{0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22}, -	{0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24}, -	{0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640}, -	{0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660}, -	{0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861}, -	{0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81}, -	{0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83}, -	{0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84}, -	{0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3}, -	{0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5}, -	{0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9}, -	{0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb}, -	{0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x00016044, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db}, +	{0x0000a584, 0x04802222, 0x04802222, 0x02800001, 0x02800001}, +	{0x0000a588, 0x09802421, 0x09802421, 0x05800003, 0x05800003}, +	{0x0000a58c, 0x0d802621, 0x0d802621, 0x0a800005, 0x0a800005}, +	{0x0000a590, 0x13804620, 0x13804620, 0x0e800201, 0x0e800201}, +	{0x0000a594, 0x19804a20, 0x19804a20, 0x11800203, 0x11800203}, +	{0x0000a598, 0x1d804e20, 0x1d804e20, 0x14800401, 0x14800401}, +	{0x0000a59c, 0x21805420, 0x21805420, 0x18800403, 0x18800403}, +	{0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800602, 0x1b800602}, +	{0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800802, 0x1f800802}, +	{0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x21800620, 0x21800620}, +	{0x0000a5ac, 0x33805e44, 0x33805e44, 0x25800820, 0x25800820}, +	{0x0000a5b0, 0x38805e65, 0x38805e65, 0x29800822, 0x29800822}, +	{0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2d800824, 0x2d800824}, +	{0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x30800828, 0x30800828}, +	{0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x3480082a, 0x3480082a}, +	{0x0000a5c0, 0x49805e72, 0x49805e72, 0x38800849, 0x38800849}, +	{0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b800a2c, 0x3b800a2c}, +	{0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e800e2b, 0x3e800e2b}, +	{0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42800e2d, 0x42800e2d}, +	{0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x4580124a, 0x4580124a}, +	{0x0000a5d4, 0x61827f12, 0x61827f12, 0x4980124c, 0x4980124c}, +	{0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c80126c, 0x4c80126c}, +	{0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x4f80128c, 0x4f80128c}, +	{0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x52801290, 0x52801290}, +	{0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292}, +	{0x00016044, 0x056db2db, 0x056db2db, 0x022492db, 0x022492db},  	{0x00016048, 0x24925266, 0x24925266, 0x24925266, 0x24925266}, -	{0x00016444, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db}, +	{0x00016444, 0x056db2db, 0x056db2db, 0x022492db, 0x022492db},  	{0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266},  };  static const u32 ar9340Modes_high_ob_db_tx_gain_table_1p0[][5] = { -	/*  Addr       5G_HT20    5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352}, +	{0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584}, +	{0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},  	{0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, @@ -559,7 +539,7 @@ static const u32 ar9340Modes_high_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},  	{0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},  	{0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81}, -	{0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42001a83, 0x42001a83}, +	{0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},  	{0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},  	{0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},  	{0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5}, @@ -604,13 +584,43 @@ static const u32 ar9340Modes_high_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},  	{0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},  	{0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000}, +	{0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000}, +	{0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501}, +	{0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501}, +	{0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03}, +	{0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04}, +	{0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04}, +	{0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352}, +	{0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584}, +	{0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x00016044, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4}, -	{0x00016048, 0x8e481266, 0x8e481266, 0x8e481266, 0x8e481266}, +	{0x00016048, 0x8e481666, 0x8e481666, 0x8e481266, 0x8e481266}, +	{0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015},  	{0x00016444, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4}, -	{0x00016448, 0x8e481266, 0x8e481266, 0x8e481266, 0x8e481266}, +	{0x00016448, 0x8e481666, 0x8e481666, 0x8e481266, 0x8e481266},  }; +  static const u32 ar9340Modes_ub124_tx_gain_table_1p0[][5] = { -	/*  Addr      5G_HT20      5G_HT40     2G_HT40    2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005}, +	{0x00009820, 0x206a022e, 0x206a022e, 0x206a00ae, 0x206a00ae}, +	{0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c}, +	{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec82d2e, 0x7ec82d2e}, +	{0x0000a2dc, 0xfef5d402, 0xfef5d402, 0xfdab5b52, 0xfdab5b52}, +	{0x0000a2e0, 0xfe896600, 0xfe896600, 0xfd339c84, 0xfd339c84}, +	{0x0000a2e4, 0xff01f800, 0xff01f800, 0xfec3e000, 0xfec3e000}, +	{0x0000a2e8, 0xfffe0000, 0xfffe0000, 0xfffc0000, 0xfffc0000},  	{0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},  	{0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, @@ -676,15 +686,34 @@ static const u32 ar9340Modes_ub124_tx_gain_table_1p0[][5] = {  	{0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},  	{0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},  	{0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x00016044, 0x036db2db, 0x036db2db, 0x036db2db, 0x036db2db}, -	{0x00016048, 0x69b65266, 0x69b65266, 0x69b65266, 0x69b65266}, -	{0x00016444, 0x036db2db, 0x036db2db, 0x036db2db, 0x036db2db}, -	{0x00016448, 0x69b65266, 0x69b65266, 0x69b65266, 0x69b65266}, +	{0x00016044, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4}, +	{0x00016048, 0x8e480086, 0x8e480086, 0x8e480086, 0x8e480086}, +	{0x00016444, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4}, +	{0x00016448, 0x8e480086, 0x8e480086, 0x8e480086, 0x8e480086}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000}, +	{0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000}, +	{0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501}, +	{0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501}, +	{0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03}, +	{0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04}, +	{0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04}, +	{0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, +	{0x0000b2dc, 0xfef5d402, 0xfef5d402, 0xfdab5b52, 0xfdab5b52}, +	{0x0000b2e0, 0xfe896600, 0xfe896600, 0xfd339c84, 0xfd339c84}, +	{0x0000b2e4, 0xff01f800, 0xff01f800, 0xfec3e000, 0xfec3e000}, +	{0x0000b2e8, 0xfffe0000, 0xfffe0000, 0xfffc0000, 0xfffc0000},  }; -  static const u32 ar9340Common_rx_gain_table_1p0[][2] = { -	/*   Addr     allmodes */ +	/* Addr      allmodes  */  	{0x0000a000, 0x00010000},  	{0x0000a004, 0x00030002},  	{0x0000a008, 0x00050004}, @@ -845,14 +874,14 @@ static const u32 ar9340Common_rx_gain_table_1p0[][2] = {  	{0x0000b074, 0x00000000},  	{0x0000b078, 0x00000000},  	{0x0000b07c, 0x00000000}, -	{0x0000b080, 0x32323232}, -	{0x0000b084, 0x2f2f3232}, -	{0x0000b088, 0x23282a2d}, -	{0x0000b08c, 0x1c1e2123}, -	{0x0000b090, 0x14171919}, -	{0x0000b094, 0x0e0e1214}, -	{0x0000b098, 0x03050707}, -	{0x0000b09c, 0x00030303}, +	{0x0000b080, 0x23232323}, +	{0x0000b084, 0x21232323}, +	{0x0000b088, 0x19191c1e}, +	{0x0000b08c, 0x12141417}, +	{0x0000b090, 0x07070e0e}, +	{0x0000b094, 0x03030305}, +	{0x0000b098, 0x00000003}, +	{0x0000b09c, 0x00000000},  	{0x0000b0a0, 0x00000000},  	{0x0000b0a4, 0x00000000},  	{0x0000b0a8, 0x00000000}, @@ -944,7 +973,11 @@ static const u32 ar9340Common_rx_gain_table_1p0[][2] = {  };  static const u32 ar9340Modes_low_ob_db_tx_gain_table_1p0[][5] = { -	/*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, +	{0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, +	{0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, @@ -952,8 +985,8 @@ static const u32 ar9340Modes_low_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},  	{0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},  	{0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, -	{0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402}, -	{0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404}, +	{0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402}, +	{0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404},  	{0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},  	{0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},  	{0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, @@ -965,19 +998,19 @@ static const u32 ar9340Modes_low_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},  	{0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},  	{0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81}, -	{0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83}, -	{0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84}, -	{0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3}, -	{0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5}, -	{0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9}, -	{0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, -	{0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, -	{0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, -	{0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, -	{0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, -	{0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, -	{0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, +	{0x0000a54c, 0x5c02486b, 0x5c02486b, 0x47001a83, 0x47001a83}, +	{0x0000a550, 0x61024a6c, 0x61024a6c, 0x4a001c84, 0x4a001c84}, +	{0x0000a554, 0x66026a6c, 0x66026a6c, 0x4e001ce3, 0x4e001ce3}, +	{0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x52001ce5, 0x52001ce5}, +	{0x0000a55c, 0x7002708c, 0x7002708c, 0x56001ce9, 0x56001ce9}, +	{0x0000a560, 0x7302b08a, 0x7302b08a, 0x5a001ceb, 0x5a001ceb}, +	{0x0000a564, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, +	{0x0000a568, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, +	{0x0000a56c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, +	{0x0000a570, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, +	{0x0000a574, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, +	{0x0000a578, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, +	{0x0000a57c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},  	{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},  	{0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},  	{0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, @@ -1010,14 +1043,40 @@ static const u32 ar9340Modes_low_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a5f4, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec},  	{0x0000a5f8, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec},  	{0x0000a5fc, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, +	{0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501}, +	{0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501}, +	{0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03}, +	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, +	{0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04}, +	{0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005}, +	{0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, +	{0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, +	{0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x00016044, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db}, -	{0x00016048, 0x24925266, 0x24925266, 0x24925266, 0x24925266}, +	{0x00016048, 0x24925666, 0x24925666, 0x24925266, 0x24925266}, +	{0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015}, +	{0x00016288, 0xf0318000, 0xf0318000, 0xf0318000, 0xf0318000},  	{0x00016444, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db}, -	{0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266}, +	{0x00016448, 0x24925666, 0x24925666, 0x24925266, 0x24925266},  };  static const u32 ar9340Modes_mixed_ob_db_tx_gain_table_1p0[][5] = { -	/*  Addr       5G_HT20     5G_HT40     2G_HT40    2G_HT20  */ +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, +	{0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, +	{0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, @@ -1025,8 +1084,8 @@ static const u32 ar9340Modes_mixed_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},  	{0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},  	{0x0000a514, 0x1c000223, 0x1c000223, 0x11000400, 0x11000400}, -	{0x0000a518, 0x21020220, 0x21020220, 0x15000402, 0x15000402}, -	{0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404}, +	{0x0000a518, 0x21002220, 0x21002220, 0x15000402, 0x15000402}, +	{0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404},  	{0x0000a520, 0x2b022220, 0x2b022220, 0x1b000603, 0x1b000603},  	{0x0000a524, 0x2f022222, 0x2f022222, 0x1f000a02, 0x1f000a02},  	{0x0000a528, 0x34022225, 0x34022225, 0x23000a04, 0x23000a04}, @@ -1038,19 +1097,19 @@ static const u32 ar9340Modes_mixed_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a540, 0x4e02246c, 0x4e02246c, 0x38001660, 0x38001660},  	{0x0000a544, 0x5302266c, 0x5302266c, 0x3b001861, 0x3b001861},  	{0x0000a548, 0x5702286c, 0x5702286c, 0x3e001a81, 0x3e001a81}, -	{0x0000a54c, 0x5c04286b, 0x5c04286b, 0x42001a83, 0x42001a83}, -	{0x0000a550, 0x61042a6c, 0x61042a6c, 0x44001c84, 0x44001c84}, -	{0x0000a554, 0x66062a6c, 0x66062a6c, 0x48001ce3, 0x48001ce3}, -	{0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x4c001ce5, 0x4c001ce5}, -	{0x0000a55c, 0x7006308c, 0x7006308c, 0x50001ce9, 0x50001ce9}, -	{0x0000a560, 0x730a308a, 0x730a308a, 0x54001ceb, 0x54001ceb}, -	{0x0000a564, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, -	{0x0000a568, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, -	{0x0000a56c, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, -	{0x0000a570, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, -	{0x0000a574, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, -	{0x0000a578, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, -	{0x0000a57c, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec}, +	{0x0000a54c, 0x5c02486b, 0x5c02486b, 0x42001a83, 0x42001a83}, +	{0x0000a550, 0x61024a6c, 0x61024a6c, 0x44001c84, 0x44001c84}, +	{0x0000a554, 0x66026a6c, 0x66026a6c, 0x48001ce3, 0x48001ce3}, +	{0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x4c001ce5, 0x4c001ce5}, +	{0x0000a55c, 0x7002708c, 0x7002708c, 0x50001ce9, 0x50001ce9}, +	{0x0000a560, 0x7302b08a, 0x7302b08a, 0x54001ceb, 0x54001ceb}, +	{0x0000a564, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec}, +	{0x0000a568, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec}, +	{0x0000a56c, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec}, +	{0x0000a570, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec}, +	{0x0000a574, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec}, +	{0x0000a578, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec}, +	{0x0000a57c, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},  	{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},  	{0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},  	{0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, @@ -1083,14 +1142,36 @@ static const u32 ar9340Modes_mixed_ob_db_tx_gain_table_1p0[][5] = {  	{0x0000a5f4, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},  	{0x0000a5f8, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},  	{0x0000a5fc, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, +	{0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501}, +	{0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501}, +	{0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03}, +	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, +	{0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04}, +	{0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005}, +	{0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, +	{0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, +	{0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, +	{0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, +	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x00016044, 0x056db2db, 0x056db2db, 0x03b6d2e4, 0x03b6d2e4}, -	{0x00016048, 0x24927266, 0x24927266, 0x8e483266, 0x8e483266}, +	{0x00016048, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266}, +	{0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015}, +	{0x00016288, 0x30318000, 0x30318000, 0x00318000, 0x00318000},  	{0x00016444, 0x056db2db, 0x056db2db, 0x03b6d2e4, 0x03b6d2e4}, -	{0x00016448, 0x24927266, 0x24927266, 0x8e482266, 0x8e482266}, +	{0x00016448, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266},  };  static const u32 ar9340_1p0_mac_core[][2] = { -	/*    Addr        allmodes        */ +	/* Addr      allmodes  */  	{0x00000008, 0x00000000},  	{0x00000030, 0x00020085},  	{0x00000034, 0x00000005}, @@ -1119,6 +1200,7 @@ static const u32 ar9340_1p0_mac_core[][2] = {  	{0x00008004, 0x00000000},  	{0x00008008, 0x00000000},  	{0x0000800c, 0x00000000}, +	{0x00008010, 0x00080800},  	{0x00008018, 0x00000000},  	{0x00008020, 0x00000000},  	{0x00008038, 0x00000000}, @@ -1146,7 +1228,7 @@ static const u32 ar9340_1p0_mac_core[][2] = {  	{0x000080bc, 0x00000000},  	{0x000080c0, 0x2a800000},  	{0x000080c4, 0x06900168}, -	{0x000080c8, 0x13881c20}, +	{0x000080c8, 0x13881c22},  	{0x000080cc, 0x01f40000},  	{0x000080d0, 0x00252500},  	{0x000080d4, 0x00a00000}, @@ -1250,276 +1332,17 @@ static const u32 ar9340_1p0_mac_core[][2] = {  	{0x000083c4, 0x00000000},  	{0x000083c8, 0x00000000},  	{0x000083cc, 0x00000200}, -	{0x000083d0, 0x000301ff}, +	{0x000083d0, 0x000101ff},  }; -static const u32 ar9340Common_wo_xlna_rx_gain_table_1p0[][2] = { -	/*    Addr        allmodes        */ -	{0x0000a000, 0x00010000}, -	{0x0000a004, 0x00030002}, -	{0x0000a008, 0x00050004}, -	{0x0000a00c, 0x00810080}, -	{0x0000a010, 0x00830082}, -	{0x0000a014, 0x01810180}, -	{0x0000a018, 0x01830182}, -	{0x0000a01c, 0x01850184}, -	{0x0000a020, 0x01890188}, -	{0x0000a024, 0x018b018a}, -	{0x0000a028, 0x018d018c}, -	{0x0000a02c, 0x03820190}, -	{0x0000a030, 0x03840383}, -	{0x0000a034, 0x03880385}, -	{0x0000a038, 0x038a0389}, -	{0x0000a03c, 0x038c038b}, -	{0x0000a040, 0x0390038d}, -	{0x0000a044, 0x03920391}, -	{0x0000a048, 0x03940393}, -	{0x0000a04c, 0x03960395}, -	{0x0000a050, 0x00000000}, -	{0x0000a054, 0x00000000}, -	{0x0000a058, 0x00000000}, -	{0x0000a05c, 0x00000000}, -	{0x0000a060, 0x00000000}, -	{0x0000a064, 0x00000000}, -	{0x0000a068, 0x00000000}, -	{0x0000a06c, 0x00000000}, -	{0x0000a070, 0x00000000}, -	{0x0000a074, 0x00000000}, -	{0x0000a078, 0x00000000}, -	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x29292929}, -	{0x0000a084, 0x29292929}, -	{0x0000a088, 0x29292929}, -	{0x0000a08c, 0x29292929}, -	{0x0000a090, 0x22292929}, -	{0x0000a094, 0x1d1d2222}, -	{0x0000a098, 0x0c111117}, -	{0x0000a09c, 0x00030303}, -	{0x0000a0a0, 0x00000000}, -	{0x0000a0a4, 0x00000000}, -	{0x0000a0a8, 0x00000000}, -	{0x0000a0ac, 0x00000000}, -	{0x0000a0b0, 0x00000000}, -	{0x0000a0b4, 0x00000000}, -	{0x0000a0b8, 0x00000000}, -	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x001f0000}, -	{0x0000a0c4, 0x01000101}, -	{0x0000a0c8, 0x011e011f}, -	{0x0000a0cc, 0x011c011d}, -	{0x0000a0d0, 0x02030204}, -	{0x0000a0d4, 0x02010202}, -	{0x0000a0d8, 0x021f0200}, -	{0x0000a0dc, 0x0302021e}, -	{0x0000a0e0, 0x03000301}, -	{0x0000a0e4, 0x031e031f}, -	{0x0000a0e8, 0x0402031d}, -	{0x0000a0ec, 0x04000401}, -	{0x0000a0f0, 0x041e041f}, -	{0x0000a0f4, 0x0502041d}, -	{0x0000a0f8, 0x05000501}, -	{0x0000a0fc, 0x051e051f}, -	{0x0000a100, 0x06010602}, -	{0x0000a104, 0x061f0600}, -	{0x0000a108, 0x061d061e}, -	{0x0000a10c, 0x07020703}, -	{0x0000a110, 0x07000701}, -	{0x0000a114, 0x00000000}, -	{0x0000a118, 0x00000000}, -	{0x0000a11c, 0x00000000}, -	{0x0000a120, 0x00000000}, -	{0x0000a124, 0x00000000}, -	{0x0000a128, 0x00000000}, -	{0x0000a12c, 0x00000000}, -	{0x0000a130, 0x00000000}, -	{0x0000a134, 0x00000000}, -	{0x0000a138, 0x00000000}, -	{0x0000a13c, 0x00000000}, -	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x01000101}, -	{0x0000a148, 0x011e011f}, -	{0x0000a14c, 0x011c011d}, -	{0x0000a150, 0x02030204}, -	{0x0000a154, 0x02010202}, -	{0x0000a158, 0x021f0200}, -	{0x0000a15c, 0x0302021e}, -	{0x0000a160, 0x03000301}, -	{0x0000a164, 0x031e031f}, -	{0x0000a168, 0x0402031d}, -	{0x0000a16c, 0x04000401}, -	{0x0000a170, 0x041e041f}, -	{0x0000a174, 0x0502041d}, -	{0x0000a178, 0x05000501}, -	{0x0000a17c, 0x051e051f}, -	{0x0000a180, 0x06010602}, -	{0x0000a184, 0x061f0600}, -	{0x0000a188, 0x061d061e}, -	{0x0000a18c, 0x07020703}, -	{0x0000a190, 0x07000701}, -	{0x0000a194, 0x00000000}, -	{0x0000a198, 0x00000000}, -	{0x0000a19c, 0x00000000}, -	{0x0000a1a0, 0x00000000}, -	{0x0000a1a4, 0x00000000}, -	{0x0000a1a8, 0x00000000}, -	{0x0000a1ac, 0x00000000}, -	{0x0000a1b0, 0x00000000}, -	{0x0000a1b4, 0x00000000}, -	{0x0000a1b8, 0x00000000}, -	{0x0000a1bc, 0x00000000}, -	{0x0000a1c0, 0x00000000}, -	{0x0000a1c4, 0x00000000}, -	{0x0000a1c8, 0x00000000}, -	{0x0000a1cc, 0x00000000}, -	{0x0000a1d0, 0x00000000}, -	{0x0000a1d4, 0x00000000}, -	{0x0000a1d8, 0x00000000}, -	{0x0000a1dc, 0x00000000}, -	{0x0000a1e0, 0x00000000}, -	{0x0000a1e4, 0x00000000}, -	{0x0000a1e8, 0x00000000}, -	{0x0000a1ec, 0x00000000}, -	{0x0000a1f0, 0x00000396}, -	{0x0000a1f4, 0x00000396}, -	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000196}, -	{0x0000b000, 0x00010000}, -	{0x0000b004, 0x00030002}, -	{0x0000b008, 0x00050004}, -	{0x0000b00c, 0x00810080}, -	{0x0000b010, 0x00830082}, -	{0x0000b014, 0x01810180}, -	{0x0000b018, 0x01830182}, -	{0x0000b01c, 0x01850184}, -	{0x0000b020, 0x02810280}, -	{0x0000b024, 0x02830282}, -	{0x0000b028, 0x02850284}, -	{0x0000b02c, 0x02890288}, -	{0x0000b030, 0x028b028a}, -	{0x0000b034, 0x0388028c}, -	{0x0000b038, 0x038a0389}, -	{0x0000b03c, 0x038c038b}, -	{0x0000b040, 0x0390038d}, -	{0x0000b044, 0x03920391}, -	{0x0000b048, 0x03940393}, -	{0x0000b04c, 0x03960395}, -	{0x0000b050, 0x00000000}, -	{0x0000b054, 0x00000000}, -	{0x0000b058, 0x00000000}, -	{0x0000b05c, 0x00000000}, -	{0x0000b060, 0x00000000}, -	{0x0000b064, 0x00000000}, -	{0x0000b068, 0x00000000}, -	{0x0000b06c, 0x00000000}, -	{0x0000b070, 0x00000000}, -	{0x0000b074, 0x00000000}, -	{0x0000b078, 0x00000000}, -	{0x0000b07c, 0x00000000}, -	{0x0000b080, 0x32323232}, -	{0x0000b084, 0x2f2f3232}, -	{0x0000b088, 0x23282a2d}, -	{0x0000b08c, 0x1c1e2123}, -	{0x0000b090, 0x14171919}, -	{0x0000b094, 0x0e0e1214}, -	{0x0000b098, 0x03050707}, -	{0x0000b09c, 0x00030303}, -	{0x0000b0a0, 0x00000000}, -	{0x0000b0a4, 0x00000000}, -	{0x0000b0a8, 0x00000000}, -	{0x0000b0ac, 0x00000000}, -	{0x0000b0b0, 0x00000000}, -	{0x0000b0b4, 0x00000000}, -	{0x0000b0b8, 0x00000000}, -	{0x0000b0bc, 0x00000000}, -	{0x0000b0c0, 0x003f0020}, -	{0x0000b0c4, 0x00400041}, -	{0x0000b0c8, 0x0140005f}, -	{0x0000b0cc, 0x0160015f}, -	{0x0000b0d0, 0x017e017f}, -	{0x0000b0d4, 0x02410242}, -	{0x0000b0d8, 0x025f0240}, -	{0x0000b0dc, 0x027f0260}, -	{0x0000b0e0, 0x0341027e}, -	{0x0000b0e4, 0x035f0340}, -	{0x0000b0e8, 0x037f0360}, -	{0x0000b0ec, 0x04400441}, -	{0x0000b0f0, 0x0460045f}, -	{0x0000b0f4, 0x0541047f}, -	{0x0000b0f8, 0x055f0540}, -	{0x0000b0fc, 0x057f0560}, -	{0x0000b100, 0x06400641}, -	{0x0000b104, 0x0660065f}, -	{0x0000b108, 0x067e067f}, -	{0x0000b10c, 0x07410742}, -	{0x0000b110, 0x075f0740}, -	{0x0000b114, 0x077f0760}, -	{0x0000b118, 0x07800781}, -	{0x0000b11c, 0x07a0079f}, -	{0x0000b120, 0x07c107bf}, -	{0x0000b124, 0x000007c0}, -	{0x0000b128, 0x00000000}, -	{0x0000b12c, 0x00000000}, -	{0x0000b130, 0x00000000}, -	{0x0000b134, 0x00000000}, -	{0x0000b138, 0x00000000}, -	{0x0000b13c, 0x00000000}, -	{0x0000b140, 0x003f0020}, -	{0x0000b144, 0x00400041}, -	{0x0000b148, 0x0140005f}, -	{0x0000b14c, 0x0160015f}, -	{0x0000b150, 0x017e017f}, -	{0x0000b154, 0x02410242}, -	{0x0000b158, 0x025f0240}, -	{0x0000b15c, 0x027f0260}, -	{0x0000b160, 0x0341027e}, -	{0x0000b164, 0x035f0340}, -	{0x0000b168, 0x037f0360}, -	{0x0000b16c, 0x04400441}, -	{0x0000b170, 0x0460045f}, -	{0x0000b174, 0x0541047f}, -	{0x0000b178, 0x055f0540}, -	{0x0000b17c, 0x057f0560}, -	{0x0000b180, 0x06400641}, -	{0x0000b184, 0x0660065f}, -	{0x0000b188, 0x067e067f}, -	{0x0000b18c, 0x07410742}, -	{0x0000b190, 0x075f0740}, -	{0x0000b194, 0x077f0760}, -	{0x0000b198, 0x07800781}, -	{0x0000b19c, 0x07a0079f}, -	{0x0000b1a0, 0x07c107bf}, -	{0x0000b1a4, 0x000007c0}, -	{0x0000b1a8, 0x00000000}, -	{0x0000b1ac, 0x00000000}, -	{0x0000b1b0, 0x00000000}, -	{0x0000b1b4, 0x00000000}, -	{0x0000b1b8, 0x00000000}, -	{0x0000b1bc, 0x00000000}, -	{0x0000b1c0, 0x00000000}, -	{0x0000b1c4, 0x00000000}, -	{0x0000b1c8, 0x00000000}, -	{0x0000b1cc, 0x00000000}, -	{0x0000b1d0, 0x00000000}, -	{0x0000b1d4, 0x00000000}, -	{0x0000b1d8, 0x00000000}, -	{0x0000b1dc, 0x00000000}, -	{0x0000b1e0, 0x00000000}, -	{0x0000b1e4, 0x00000000}, -	{0x0000b1e8, 0x00000000}, -	{0x0000b1ec, 0x00000000}, -	{0x0000b1f0, 0x00000396}, -	{0x0000b1f4, 0x00000396}, -	{0x0000b1f8, 0x00000396}, -	{0x0000b1fc, 0x00000196}, -}; +#define ar9340Common_wo_xlna_rx_gain_table_1p0 ar9300Common_wo_xlna_rx_gain_table_2p2  static const u32 ar9340_1p0_soc_preamble[][2] = { -	/*    Addr        allmodes        */ -	{0x000040a4, 0x00a0c1c9}, +	/* Addr      allmodes  */  	{0x00007008, 0x00000000},  	{0x00007020, 0x00000000},  	{0x00007034, 0x00000002},  	{0x00007038, 0x000004c2},  }; -#endif +#endif /* INITVALS_9340_H */ diff --git a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h index 1d6658e139b..4ef7dcccaa2 100644 --- a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h @@ -1,5 +1,6 @@  /* - * Copyright (c) 2010 Atheros Communications Inc. + * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -52,7 +53,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = {  	{0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020},  	{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000d8},  	{0x00009e10, 0x92c88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec86d2e}, -	{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3376605e, 0x33795d5e}, +	{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3376605e, 0x32395d5e},  	{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},  	{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, @@ -61,7 +62,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = {  	{0x00009e44, 0x62321e27, 0x62321e27, 0xfe291e27, 0xfe291e27},  	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},  	{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, -	{0x0000a204, 0x013187c0, 0x013187c4, 0x013187c4, 0x013187c0}, +	{0x0000a204, 0x01318fc0, 0x01318fc4, 0x01318fc4, 0x01318fc0},  	{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},  	{0x0000a22c, 0x01026a2f, 0x01026a27, 0x01026a2f, 0x01026a2f},  	{0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b}, @@ -958,7 +959,7 @@ static const u32 ar9462_2p0_radio_core[][2] = {  	{0x0001604c, 0x2699e04f},  	{0x00016050, 0x6db6db6c},  	{0x00016058, 0x6c200000}, -	{0x00016080, 0x00040000}, +	{0x00016080, 0x000c0000},  	{0x00016084, 0x9a68048c},  	{0x00016088, 0x54214514},  	{0x0001608c, 0x1203040b}, @@ -981,7 +982,7 @@ static const u32 ar9462_2p0_radio_core[][2] = {  	{0x00016144, 0x02084080},  	{0x00016148, 0x000080c0},  	{0x00016280, 0x050a0001}, -	{0x00016284, 0x3d841400}, +	{0x00016284, 0x3d841418},  	{0x00016288, 0x00000000},  	{0x0001628c, 0xe3000000},  	{0x00016290, 0xa1005080}, @@ -1007,6 +1008,7 @@ static const u32 ar9462_2p0_radio_core[][2] = {  static const u32 ar9462_2p0_soc_preamble[][2] = {  	/* Addr      allmodes  */ +	{0x000040a4, 0x00a0c1c9},  	{0x00007020, 0x00000000},  	{0x00007034, 0x00000002},  	{0x00007038, 0x000004c2}, diff --git a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h index d16d029f81a..fb4497fc7a3 100644 --- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h @@ -1,5 +1,6 @@  /*   * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -17,360 +18,151 @@  #ifndef INITVALS_9485_H  #define INITVALS_9485_H -static const u32 ar9485_1_1_mac_core[][2] = { -	/*  Addr       allmodes */ -	{0x00000008, 0x00000000}, -	{0x00000030, 0x00020085}, -	{0x00000034, 0x00000005}, -	{0x00000040, 0x00000000}, -	{0x00000044, 0x00000000}, -	{0x00000048, 0x00000008}, -	{0x0000004c, 0x00000010}, -	{0x00000050, 0x00000000}, -	{0x00001040, 0x002ffc0f}, -	{0x00001044, 0x002ffc0f}, -	{0x00001048, 0x002ffc0f}, -	{0x0000104c, 0x002ffc0f}, -	{0x00001050, 0x002ffc0f}, -	{0x00001054, 0x002ffc0f}, -	{0x00001058, 0x002ffc0f}, -	{0x0000105c, 0x002ffc0f}, -	{0x00001060, 0x002ffc0f}, -	{0x00001064, 0x002ffc0f}, -	{0x000010f0, 0x00000100}, -	{0x00001270, 0x00000000}, -	{0x000012b0, 0x00000000}, -	{0x000012f0, 0x00000000}, -	{0x0000143c, 0x00000000}, -	{0x0000147c, 0x00000000}, -	{0x00008000, 0x00000000}, -	{0x00008004, 0x00000000}, -	{0x00008008, 0x00000000}, -	{0x0000800c, 0x00000000}, -	{0x00008018, 0x00000000}, -	{0x00008020, 0x00000000}, -	{0x00008038, 0x00000000}, -	{0x0000803c, 0x00000000}, -	{0x00008040, 0x00000000}, -	{0x00008044, 0x00000000}, -	{0x00008048, 0x00000000}, -	{0x0000804c, 0xffffffff}, -	{0x00008054, 0x00000000}, -	{0x00008058, 0x00000000}, -	{0x0000805c, 0x000fc78f}, -	{0x00008060, 0x0000000f}, -	{0x00008064, 0x00000000}, -	{0x00008070, 0x00000310}, -	{0x00008074, 0x00000020}, -	{0x00008078, 0x00000000}, -	{0x0000809c, 0x0000000f}, -	{0x000080a0, 0x00000000}, -	{0x000080a4, 0x02ff0000}, -	{0x000080a8, 0x0e070605}, -	{0x000080ac, 0x0000000d}, -	{0x000080b0, 0x00000000}, -	{0x000080b4, 0x00000000}, -	{0x000080b8, 0x00000000}, -	{0x000080bc, 0x00000000}, -	{0x000080c0, 0x2a800000}, -	{0x000080c4, 0x06900168}, -	{0x000080c8, 0x13881c22}, -	{0x000080cc, 0x01f40000}, -	{0x000080d0, 0x00252500}, -	{0x000080d4, 0x00a00000}, -	{0x000080d8, 0x00400000}, -	{0x000080dc, 0x00000000}, -	{0x000080e0, 0xffffffff}, -	{0x000080e4, 0x0000ffff}, -	{0x000080e8, 0x3f3f3f3f}, -	{0x000080ec, 0x00000000}, -	{0x000080f0, 0x00000000}, -	{0x000080f4, 0x00000000}, -	{0x000080fc, 0x00020000}, -	{0x00008100, 0x00000000}, -	{0x00008108, 0x00000052}, -	{0x0000810c, 0x00000000}, -	{0x00008110, 0x00000000}, -	{0x00008114, 0x000007ff}, -	{0x00008118, 0x000000aa}, -	{0x0000811c, 0x00003210}, -	{0x00008124, 0x00000000}, -	{0x00008128, 0x00000000}, -	{0x0000812c, 0x00000000}, -	{0x00008130, 0x00000000}, -	{0x00008134, 0x00000000}, -	{0x00008138, 0x00000000}, -	{0x0000813c, 0x0000ffff}, -	{0x00008144, 0xffffffff}, -	{0x00008168, 0x00000000}, -	{0x0000816c, 0x00000000}, -	{0x00008170, 0x18486200}, -	{0x00008174, 0x33332210}, -	{0x00008178, 0x00000000}, -	{0x0000817c, 0x00020000}, -	{0x000081c0, 0x00000000}, -	{0x000081c4, 0x33332210}, -	{0x000081d4, 0x00000000}, -	{0x000081ec, 0x00000000}, -	{0x000081f0, 0x00000000}, -	{0x000081f4, 0x00000000}, -	{0x000081f8, 0x00000000}, -	{0x000081fc, 0x00000000}, -	{0x00008240, 0x00100000}, -	{0x00008244, 0x0010f400}, -	{0x00008248, 0x00000800}, -	{0x0000824c, 0x0001e800}, -	{0x00008250, 0x00000000}, -	{0x00008254, 0x00000000}, -	{0x00008258, 0x00000000}, -	{0x0000825c, 0x40000000}, -	{0x00008260, 0x00080922}, -	{0x00008264, 0x9ca00010}, -	{0x00008268, 0xffffffff}, -	{0x0000826c, 0x0000ffff}, -	{0x00008270, 0x00000000}, -	{0x00008274, 0x40000000}, -	{0x00008278, 0x003e4180}, -	{0x0000827c, 0x00000004}, -	{0x00008284, 0x0000002c}, -	{0x00008288, 0x0000002c}, -	{0x0000828c, 0x000000ff}, -	{0x00008294, 0x00000000}, -	{0x00008298, 0x00000000}, -	{0x0000829c, 0x00000000}, -	{0x00008300, 0x00000140}, -	{0x00008314, 0x00000000}, -	{0x0000831c, 0x0000010d}, -	{0x00008328, 0x00000000}, -	{0x0000832c, 0x00000007}, -	{0x00008330, 0x00000302}, -	{0x00008334, 0x00000700}, -	{0x00008338, 0x00ff0000}, -	{0x0000833c, 0x02400000}, -	{0x00008340, 0x000107ff}, -	{0x00008344, 0xa248105b}, -	{0x00008348, 0x008f0000}, -	{0x0000835c, 0x00000000}, -	{0x00008360, 0xffffffff}, -	{0x00008364, 0xffffffff}, -	{0x00008368, 0x00000000}, -	{0x00008370, 0x00000000}, -	{0x00008374, 0x000000ff}, -	{0x00008378, 0x00000000}, -	{0x0000837c, 0x00000000}, -	{0x00008380, 0xffffffff}, -	{0x00008384, 0xffffffff}, -	{0x00008390, 0xffffffff}, -	{0x00008394, 0xffffffff}, -	{0x00008398, 0x00000000}, -	{0x0000839c, 0x00000000}, -	{0x000083a0, 0x00000000}, -	{0x000083a4, 0x0000fa14}, -	{0x000083a8, 0x000f0c00}, -	{0x000083ac, 0x33332210}, -	{0x000083b0, 0x33332210}, -	{0x000083b4, 0x33332210}, -	{0x000083b8, 0x33332210}, -	{0x000083bc, 0x00000000}, -	{0x000083c0, 0x00000000}, -	{0x000083c4, 0x00000000}, -	{0x000083c8, 0x00000000}, -	{0x000083cc, 0x00000200}, -	{0x000083d0, 0x000301ff}, -}; +/* AR9485 1.0 */ -static const u32 ar9485_1_1_baseband_core[][2] = { -	/* Addr       allmodes */ -	{0x00009800, 0xafe68e30}, -	{0x00009804, 0xfd14e000}, -	{0x00009808, 0x9c0a8f6b}, -	{0x0000980c, 0x04800000}, -	{0x00009814, 0x9280c00a}, -	{0x00009818, 0x00000000}, -	{0x0000981c, 0x00020028}, -	{0x00009834, 0x5f3ca3de}, -	{0x00009838, 0x0108ecff}, -	{0x0000983c, 0x14750600}, -	{0x00009880, 0x201fff00}, -	{0x00009884, 0x00001042}, -	{0x000098a4, 0x00200400}, -	{0x000098b0, 0x52440bbe}, -	{0x000098d0, 0x004b6a8e}, -	{0x000098d4, 0x00000820}, -	{0x000098dc, 0x00000000}, -	{0x000098f0, 0x00000000}, -	{0x000098f4, 0x00000000}, -	{0x00009c04, 0x00000000}, -	{0x00009c08, 0x03200000}, -	{0x00009c0c, 0x00000000}, -	{0x00009c10, 0x00000000}, -	{0x00009c14, 0x00046384}, -	{0x00009c18, 0x05b6b440}, -	{0x00009c1c, 0x00b6b440}, -	{0x00009d00, 0xc080a333}, -	{0x00009d04, 0x40206c10}, -	{0x00009d08, 0x009c4060}, -	{0x00009d0c, 0x1883800a}, -	{0x00009d10, 0x01834061}, -	{0x00009d14, 0x00c00400}, -	{0x00009d18, 0x00000000}, -	{0x00009d1c, 0x00000000}, -	{0x00009e08, 0x0038233c}, -	{0x00009e24, 0x9927b515}, -	{0x00009e28, 0x12ef0200}, -	{0x00009e30, 0x06336f77}, -	{0x00009e34, 0x6af6532f}, -	{0x00009e38, 0x0cc80c00}, -	{0x00009e40, 0x0d261820}, -	{0x00009e4c, 0x00001004}, -	{0x00009e50, 0x00ff03f1}, -	{0x00009fc0, 0x80be4788}, -	{0x00009fc4, 0x0001efb5}, -	{0x00009fcc, 0x40000014}, -	{0x0000a20c, 0x00000000}, -	{0x0000a210, 0x00000000}, -	{0x0000a220, 0x00000000}, -	{0x0000a224, 0x00000000}, -	{0x0000a228, 0x10002310}, -	{0x0000a23c, 0x00000000}, -	{0x0000a244, 0x0c000000}, -	{0x0000a2a0, 0x00000001}, -	{0x0000a2c0, 0x00000001}, -	{0x0000a2c8, 0x00000000}, -	{0x0000a2cc, 0x18c43433}, -	{0x0000a2d4, 0x00000000}, -	{0x0000a2dc, 0x00000000}, -	{0x0000a2e0, 0x00000000}, -	{0x0000a2e4, 0x00000000}, -	{0x0000a2e8, 0x00000000}, -	{0x0000a2ec, 0x00000000}, -	{0x0000a2f0, 0x00000000}, -	{0x0000a2f4, 0x00000000}, -	{0x0000a2f8, 0x00000000}, -	{0x0000a344, 0x00000000}, -	{0x0000a34c, 0x00000000}, -	{0x0000a350, 0x0000a000}, -	{0x0000a364, 0x00000000}, -	{0x0000a370, 0x00000000}, -	{0x0000a390, 0x00000001}, -	{0x0000a394, 0x00000444}, -	{0x0000a398, 0x001f0e0f}, -	{0x0000a39c, 0x0075393f}, -	{0x0000a3a0, 0xb79f6427}, -	{0x0000a3a4, 0x000000ff}, -	{0x0000a3a8, 0x3b3b3b3b}, -	{0x0000a3ac, 0x2f2f2f2f}, -	{0x0000a3c0, 0x20202020}, -	{0x0000a3c4, 0x22222220}, -	{0x0000a3c8, 0x20200020}, -	{0x0000a3cc, 0x20202020}, -	{0x0000a3d0, 0x20202020}, -	{0x0000a3d4, 0x20202020}, -	{0x0000a3d8, 0x20202020}, -	{0x0000a3dc, 0x20202020}, -	{0x0000a3e0, 0x20202020}, -	{0x0000a3e4, 0x20202020}, -	{0x0000a3e8, 0x20202020}, -	{0x0000a3ec, 0x20202020}, -	{0x0000a3f0, 0x00000000}, -	{0x0000a3f4, 0x00000006}, -	{0x0000a3f8, 0x0cdbd380}, -	{0x0000a3fc, 0x000f0f01}, -	{0x0000a400, 0x8fa91f01}, -	{0x0000a404, 0x00000000}, -	{0x0000a408, 0x0e79e5c6}, -	{0x0000a40c, 0x00820820}, -	{0x0000a414, 0x1ce739cf}, -	{0x0000a418, 0x2d0019ce}, -	{0x0000a41c, 0x1ce739ce}, -	{0x0000a420, 0x000001ce}, -	{0x0000a424, 0x1ce739ce}, -	{0x0000a428, 0x000001ce}, -	{0x0000a42c, 0x1ce739ce}, -	{0x0000a430, 0x1ce739ce}, -	{0x0000a434, 0x00000000}, -	{0x0000a438, 0x00001801}, -	{0x0000a43c, 0x00000000}, -	{0x0000a440, 0x00000000}, -	{0x0000a444, 0x00000000}, -	{0x0000a448, 0x04000000}, -	{0x0000a44c, 0x00000001}, -	{0x0000a450, 0x00010000}, -	{0x0000a5c4, 0xbfad9d74}, -	{0x0000a5c8, 0x0048060a}, -	{0x0000a5cc, 0x00000637}, -	{0x0000a760, 0x03020100}, -	{0x0000a764, 0x09080504}, -	{0x0000a768, 0x0d0c0b0a}, -	{0x0000a76c, 0x13121110}, -	{0x0000a770, 0x31301514}, -	{0x0000a774, 0x35343332}, -	{0x0000a778, 0x00000036}, -	{0x0000a780, 0x00000838}, -	{0x0000a7c0, 0x00000000}, -	{0x0000a7c4, 0xfffffffc}, -	{0x0000a7c8, 0x00000000}, -	{0x0000a7cc, 0x00000000}, -	{0x0000a7d0, 0x00000000}, -	{0x0000a7d4, 0x00000004}, -	{0x0000a7dc, 0x00000000}, -}; +#define ar9485_1_1_mac_postamble ar9300_2p2_mac_postamble -static const u32 ar9485Common_1_1[][2] = { -	/*  Addr      allmodes */ -	{0x00007010, 0x00000022}, -	{0x00007020, 0x00000000}, -	{0x00007034, 0x00000002}, -	{0x00007038, 0x000004c2}, +static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = { +	/* Addr      allmodes  */ +	{0x00018c00, 0x18012e5e}, +	{0x00018c04, 0x000801d8}, +	{0x00018c08, 0x0000080c},  }; -static const u32 ar9485_1_1_baseband_postamble[][5] = { -	/* Addr       5G_HT20        5G_HT40       2G_HT40       2G_HT20 */ -	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005}, -	{0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e}, -	{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0}, -	{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881}, -	{0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4}, -	{0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c}, -	{0x00009c00, 0x00000044, 0x00000044, 0x00000044, 0x00000044}, -	{0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0}, -	{0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020}, -	{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2}, -	{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec80d2e, 0x7ec80d2e}, -	{0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e}, -	{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, -	{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, -	{0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, -	{0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222}, -	{0x00009e44, 0x02321e27, 0x02321e27, 0x02282324, 0x02282324}, -	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302010, 0x50302010}, -	{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, -	{0x0000a204, 0x01303fc0, 0x01303fc4, 0x01303fc4, 0x01303fc0}, -	{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, -	{0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b}, -	{0x0000a234, 0x10000fff, 0x10000fff, 0x10000fff, 0x10000fff}, -	{0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018}, -	{0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108}, -	{0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898}, -	{0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002}, -	{0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e}, -	{0x0000a260, 0x3a021501, 0x3a021501, 0x3a021501, 0x3a021501}, -	{0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e}, -	{0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b}, -	{0x0000a284, 0x00000000, 0x00000000, 0x000002a0, 0x000002a0}, -	{0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, -	{0x0000a2d0, 0x00071981, 0x00071981, 0x00071982, 0x00071982}, -	{0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a}, -	{0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000be04, 0x00802020, 0x00802020, 0x00802020, 0x00802020}, -	{0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = { +	/* Addr      allmodes  */ +	{0x0000a000, 0x00060005}, +	{0x0000a004, 0x00810080}, +	{0x0000a008, 0x00830082}, +	{0x0000a00c, 0x00850084}, +	{0x0000a010, 0x01820181}, +	{0x0000a014, 0x01840183}, +	{0x0000a018, 0x01880185}, +	{0x0000a01c, 0x018a0189}, +	{0x0000a020, 0x02850284}, +	{0x0000a024, 0x02890288}, +	{0x0000a028, 0x028b028a}, +	{0x0000a02c, 0x03850384}, +	{0x0000a030, 0x03890388}, +	{0x0000a034, 0x038b038a}, +	{0x0000a038, 0x038d038c}, +	{0x0000a03c, 0x03910390}, +	{0x0000a040, 0x03930392}, +	{0x0000a044, 0x03950394}, +	{0x0000a048, 0x00000396}, +	{0x0000a04c, 0x00000000}, +	{0x0000a050, 0x00000000}, +	{0x0000a054, 0x00000000}, +	{0x0000a058, 0x00000000}, +	{0x0000a05c, 0x00000000}, +	{0x0000a060, 0x00000000}, +	{0x0000a064, 0x00000000}, +	{0x0000a068, 0x00000000}, +	{0x0000a06c, 0x00000000}, +	{0x0000a070, 0x00000000}, +	{0x0000a074, 0x00000000}, +	{0x0000a078, 0x00000000}, +	{0x0000a07c, 0x00000000}, +	{0x0000a080, 0x28282828}, +	{0x0000a084, 0x28282828}, +	{0x0000a088, 0x28282828}, +	{0x0000a08c, 0x28282828}, +	{0x0000a090, 0x28282828}, +	{0x0000a094, 0x24242428}, +	{0x0000a098, 0x171e1e1e}, +	{0x0000a09c, 0x02020b0b}, +	{0x0000a0a0, 0x02020202}, +	{0x0000a0a4, 0x00000000}, +	{0x0000a0a8, 0x00000000}, +	{0x0000a0ac, 0x00000000}, +	{0x0000a0b0, 0x00000000}, +	{0x0000a0b4, 0x00000000}, +	{0x0000a0b8, 0x00000000}, +	{0x0000a0bc, 0x00000000}, +	{0x0000a0c0, 0x22072208}, +	{0x0000a0c4, 0x22052206}, +	{0x0000a0c8, 0x22032204}, +	{0x0000a0cc, 0x22012202}, +	{0x0000a0d0, 0x221f2200}, +	{0x0000a0d4, 0x221d221e}, +	{0x0000a0d8, 0x33023303}, +	{0x0000a0dc, 0x33003301}, +	{0x0000a0e0, 0x331e331f}, +	{0x0000a0e4, 0x4402331d}, +	{0x0000a0e8, 0x44004401}, +	{0x0000a0ec, 0x441e441f}, +	{0x0000a0f0, 0x55025503}, +	{0x0000a0f4, 0x55005501}, +	{0x0000a0f8, 0x551e551f}, +	{0x0000a0fc, 0x6602551d}, +	{0x0000a100, 0x66006601}, +	{0x0000a104, 0x661e661f}, +	{0x0000a108, 0x7703661d}, +	{0x0000a10c, 0x77017702}, +	{0x0000a110, 0x00007700}, +	{0x0000a114, 0x00000000}, +	{0x0000a118, 0x00000000}, +	{0x0000a11c, 0x00000000}, +	{0x0000a120, 0x00000000}, +	{0x0000a124, 0x00000000}, +	{0x0000a128, 0x00000000}, +	{0x0000a12c, 0x00000000}, +	{0x0000a130, 0x00000000}, +	{0x0000a134, 0x00000000}, +	{0x0000a138, 0x00000000}, +	{0x0000a13c, 0x00000000}, +	{0x0000a140, 0x001f0000}, +	{0x0000a144, 0x111f1100}, +	{0x0000a148, 0x111d111e}, +	{0x0000a14c, 0x111b111c}, +	{0x0000a150, 0x22032204}, +	{0x0000a154, 0x22012202}, +	{0x0000a158, 0x221f2200}, +	{0x0000a15c, 0x221d221e}, +	{0x0000a160, 0x33013302}, +	{0x0000a164, 0x331f3300}, +	{0x0000a168, 0x4402331e}, +	{0x0000a16c, 0x44004401}, +	{0x0000a170, 0x441e441f}, +	{0x0000a174, 0x55015502}, +	{0x0000a178, 0x551f5500}, +	{0x0000a17c, 0x6602551e}, +	{0x0000a180, 0x66006601}, +	{0x0000a184, 0x661e661f}, +	{0x0000a188, 0x7703661d}, +	{0x0000a18c, 0x77017702}, +	{0x0000a190, 0x00007700}, +	{0x0000a194, 0x00000000}, +	{0x0000a198, 0x00000000}, +	{0x0000a19c, 0x00000000}, +	{0x0000a1a0, 0x00000000}, +	{0x0000a1a4, 0x00000000}, +	{0x0000a1a8, 0x00000000}, +	{0x0000a1ac, 0x00000000}, +	{0x0000a1b0, 0x00000000}, +	{0x0000a1b4, 0x00000000}, +	{0x0000a1b8, 0x00000000}, +	{0x0000a1bc, 0x00000000}, +	{0x0000a1c0, 0x00000000}, +	{0x0000a1c4, 0x00000000}, +	{0x0000a1c8, 0x00000000}, +	{0x0000a1cc, 0x00000000}, +	{0x0000a1d0, 0x00000000}, +	{0x0000a1d4, 0x00000000}, +	{0x0000a1d8, 0x00000000}, +	{0x0000a1dc, 0x00000000}, +	{0x0000a1e0, 0x00000000}, +	{0x0000a1e4, 0x00000000}, +	{0x0000a1e8, 0x00000000}, +	{0x0000a1ec, 0x00000000}, +	{0x0000a1f0, 0x00000396}, +	{0x0000a1f4, 0x00000396}, +	{0x0000a1f8, 0x00000396}, +	{0x0000a1fc, 0x00000296},  }; -static const u32 ar9485Modes_high_ob_db_tx_gain_1_1[][5] = { -	/* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */ +static const u32 ar9485Modes_high_power_tx_gain_1_1[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */  	{0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},  	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},  	{0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, @@ -442,102 +234,34 @@ static const u32 ar9485Modes_high_ob_db_tx_gain_1_1[][5] = {  	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},  }; -static const u32 ar9485_modes_lowest_ob_db_tx_gain_1_1[][5] = { -	/* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20  */ -	{0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002}, -	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8}, -	{0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b54c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b550, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b554, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b558, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b55c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b560, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b564, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b568, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b56c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b570, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b574, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b578, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b57c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db}, -	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, -}; +#define ar9485Modes_high_ob_db_tx_gain_1_1 ar9485Modes_high_power_tx_gain_1_1 -static const u32 ar9485_1_1_radio_postamble[][2] = { -	/* Addr        allmodes */ -	{0x0001609c, 0x0b283f31}, -	{0x000160ac, 0x24611800}, -	{0x000160b0, 0x03284f3e}, -	{0x0001610c, 0x00170000}, -	{0x00016140, 0x50804008}, -}; +#define ar9485Modes_low_ob_db_tx_gain_1_1 ar9485Modes_high_ob_db_tx_gain_1_1 -static const u32 ar9485_1_1_mac_postamble[][5] = { -	/* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */ -	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, -	{0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, -	{0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, -	{0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, -	{0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, -	{0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, -	{0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, -	{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, +#define ar9485_modes_lowest_ob_db_tx_gain_1_1 ar9485Modes_low_ob_db_tx_gain_1_1 + +static const u32 ar9485_1_1[][2] = { +	/* Addr      allmodes  */ +	{0x0000a580, 0x00000000}, +	{0x0000a584, 0x00000000}, +	{0x0000a588, 0x00000000}, +	{0x0000a58c, 0x00000000}, +	{0x0000a590, 0x00000000}, +	{0x0000a594, 0x00000000}, +	{0x0000a598, 0x00000000}, +	{0x0000a59c, 0x00000000}, +	{0x0000a5a0, 0x00000000}, +	{0x0000a5a4, 0x00000000}, +	{0x0000a5a8, 0x00000000}, +	{0x0000a5ac, 0x00000000}, +	{0x0000a5b0, 0x00000000}, +	{0x0000a5b4, 0x00000000}, +	{0x0000a5b8, 0x00000000}, +	{0x0000a5bc, 0x00000000},  };  static const u32 ar9485_1_1_radio_core[][2] = { -	/* Addr        allmodes */ +	/* Addr      allmodes  */  	{0x00016000, 0x36db6db6},  	{0x00016004, 0x6db6db40},  	{0x00016008, 0x73800000}, @@ -601,294 +325,145 @@ static const u32 ar9485_1_1_radio_core[][2] = {  	{0x00016c44, 0x12000000},  }; -static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = { -	/* Addr        allmodes */ -	{0x00018c00, 0x18052e5e}, -	{0x00018c04, 0x000801d8}, -	{0x00018c08, 0x0000080c}, -}; - -static const u32 ar9485Modes_high_power_tx_gain_1_1[][5] = { -	/* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */ -	{0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002}, -	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8}, -	{0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b54c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b550, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b554, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b558, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b55c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b560, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b564, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b568, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b56c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b570, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b574, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b578, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b57c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db}, -	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, -}; - -static const u32 ar9485_1_1[][2] = { -	/* Addr        allmodes */ -	{0x0000a580, 0x00000000}, -	{0x0000a584, 0x00000000}, -	{0x0000a588, 0x00000000}, -	{0x0000a58c, 0x00000000}, -	{0x0000a590, 0x00000000}, -	{0x0000a594, 0x00000000}, -	{0x0000a598, 0x00000000}, -	{0x0000a59c, 0x00000000}, -	{0x0000a5a0, 0x00000000}, -	{0x0000a5a4, 0x00000000}, -	{0x0000a5a8, 0x00000000}, -	{0x0000a5ac, 0x00000000}, -	{0x0000a5b0, 0x00000000}, -	{0x0000a5b4, 0x00000000}, -	{0x0000a5b8, 0x00000000}, -	{0x0000a5bc, 0x00000000}, -}; - -static const u32 ar9485_modes_green_ob_db_tx_gain_1_1[][5] = { -	/* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */ -	{0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003}, -	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8}, -	{0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000006, 0x00000006}, -	{0x0000a504, 0x05062002, 0x05062002, 0x03000201, 0x03000201}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x06000203, 0x06000203}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0a000401, 0x0a000401}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x0e000403, 0x0e000403}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x12000405, 0x12000405}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x15000604, 0x15000604}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x18000605, 0x18000605}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x1c000a04, 0x1c000a04}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x21000a06, 0x21000a06}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x29000a24, 0x29000a24}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x2f000e21, 0x2f000e21}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x31000e20, 0x31000e20}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x33000e20, 0x33000e20}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000b500, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b504, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b508, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b50c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b510, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b514, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b518, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b51c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b520, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b524, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b528, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, -	{0x0000b52c, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a}, -	{0x0000b530, 0x0000003a, 0x0000003a, 0x0000003a, 0x0000003a}, -	{0x0000b534, 0x0000004a, 0x0000004a, 0x0000004a, 0x0000004a}, -	{0x0000b538, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b53c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b540, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b544, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b548, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b54c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b550, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b554, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b558, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b55c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b560, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b564, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b568, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b56c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b570, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b574, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b578, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x0000b57c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, -	{0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db}, -	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, -}; - -static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = { -	/* Addr        allmodes */ -	{0x00018c00, 0x18013e5e}, -	{0x00018c04, 0x000801d8}, -	{0x00018c08, 0x0000080c}, -}; - -static const u32 ar9485_1_1_soc_preamble[][2] = { -	/* Addr        allmodes */ -	{0x00004014, 0xba280400}, -	{0x00004090, 0x00aa10aa}, -	{0x000040a4, 0x00a0c9c9}, -	{0x00007010, 0x00000022}, -	{0x00007020, 0x00000000}, -	{0x00007034, 0x00000002}, -	{0x00007038, 0x000004c2}, -	{0x00007048, 0x00000002}, -}; - -static const u32 ar9485_1_1_baseband_core_txfir_coeff_japan_2484[][2] = { -	/* Addr        allmodes */ -	{0x0000a398, 0x00000000}, -	{0x0000a39c, 0x6f7f0301}, -	{0x0000a3a0, 0xca9228ee}, -}; - -static const u32 ar9485Modes_low_ob_db_tx_gain_1_1[][5] = { -	/* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20  */ -	{0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002}, -	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8}, -	{0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000}, -	{0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200}, -	{0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202}, -	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400}, -	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402}, -	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404}, -	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603}, -	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605}, -	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03}, -	{0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04}, -	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20}, -	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21}, -	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62}, -	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63}, -	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65}, -	{0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66}, -	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645}, -	{0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865}, -	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86}, -	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9}, -	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, -	{0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b54c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b550, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b554, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b558, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b55c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b560, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b564, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b568, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b56c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b570, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b574, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b578, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000b57c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db}, -	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, -}; - -static const u32 ar9485_fast_clock_1_1_baseband_postamble[][3] = { -	/* Addr        5G_HT2        5G_HT40  */ -	{0x00009e00, 0x03721821, 0x03721821}, -	{0x0000a230, 0x0000400b, 0x00004016}, -	{0x0000a254, 0x00000898, 0x00001130}, -}; - -static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = { -	/* Addr        allmodes  */ -	{0x00018c00, 0x18012e5e}, -	{0x00018c04, 0x000801d8}, -	{0x00018c08, 0x0000080c}, +static const u32 ar9485_1_1_baseband_core[][2] = { +	/* Addr      allmodes  */ +	{0x00009800, 0xafe68e30}, +	{0x00009804, 0xfd14e000}, +	{0x00009808, 0x9c0a8f6b}, +	{0x0000980c, 0x04800000}, +	{0x00009814, 0x9280c00a}, +	{0x00009818, 0x00000000}, +	{0x0000981c, 0x00020028}, +	{0x00009834, 0x5f3ca3de}, +	{0x00009838, 0x0108ecff}, +	{0x0000983c, 0x14750600}, +	{0x00009880, 0x201fff00}, +	{0x00009884, 0x00001042}, +	{0x000098a4, 0x00200400}, +	{0x000098b0, 0x52440bbe}, +	{0x000098d0, 0x004b6a8e}, +	{0x000098d4, 0x00000820}, +	{0x000098dc, 0x00000000}, +	{0x000098f0, 0x00000000}, +	{0x000098f4, 0x00000000}, +	{0x00009c04, 0x00000000}, +	{0x00009c08, 0x03200000}, +	{0x00009c0c, 0x00000000}, +	{0x00009c10, 0x00000000}, +	{0x00009c14, 0x00046384}, +	{0x00009c18, 0x05b6b440}, +	{0x00009c1c, 0x00b6b440}, +	{0x00009d00, 0xc080a333}, +	{0x00009d04, 0x40206c10}, +	{0x00009d08, 0x009c4060}, +	{0x00009d0c, 0x1883800a}, +	{0x00009d10, 0x01834061}, +	{0x00009d14, 0x00c00400}, +	{0x00009d18, 0x00000000}, +	{0x00009d1c, 0x00000000}, +	{0x00009e08, 0x0038233c}, +	{0x00009e24, 0x9927b515}, +	{0x00009e28, 0x12ef0200}, +	{0x00009e30, 0x06336f77}, +	{0x00009e34, 0x6af6532f}, +	{0x00009e38, 0x0cc80c00}, +	{0x00009e40, 0x0d261820}, +	{0x00009e4c, 0x00001004}, +	{0x00009e50, 0x00ff03f1}, +	{0x00009fc0, 0x80be4788}, +	{0x00009fc4, 0x0001efb5}, +	{0x00009fcc, 0x40000014}, +	{0x0000a20c, 0x00000000}, +	{0x0000a210, 0x00000000}, +	{0x0000a220, 0x00000000}, +	{0x0000a224, 0x00000000}, +	{0x0000a228, 0x10002310}, +	{0x0000a23c, 0x00000000}, +	{0x0000a244, 0x0c000000}, +	{0x0000a2a0, 0x00000001}, +	{0x0000a2c0, 0x00000001}, +	{0x0000a2c8, 0x00000000}, +	{0x0000a2cc, 0x18c43433}, +	{0x0000a2d4, 0x00000000}, +	{0x0000a2dc, 0x00000000}, +	{0x0000a2e0, 0x00000000}, +	{0x0000a2e4, 0x00000000}, +	{0x0000a2e8, 0x00000000}, +	{0x0000a2ec, 0x00000000}, +	{0x0000a2f0, 0x00000000}, +	{0x0000a2f4, 0x00000000}, +	{0x0000a2f8, 0x00000000}, +	{0x0000a344, 0x00000000}, +	{0x0000a34c, 0x00000000}, +	{0x0000a350, 0x0000a000}, +	{0x0000a364, 0x00000000}, +	{0x0000a370, 0x00000000}, +	{0x0000a390, 0x00000001}, +	{0x0000a394, 0x00000444}, +	{0x0000a398, 0x001f0e0f}, +	{0x0000a39c, 0x0075393f}, +	{0x0000a3a0, 0xb79f6427}, +	{0x0000a3a4, 0x000000ff}, +	{0x0000a3a8, 0x3b3b3b3b}, +	{0x0000a3ac, 0x2f2f2f2f}, +	{0x0000a3c0, 0x20202020}, +	{0x0000a3c4, 0x22222220}, +	{0x0000a3c8, 0x20200020}, +	{0x0000a3cc, 0x20202020}, +	{0x0000a3d0, 0x20202020}, +	{0x0000a3d4, 0x20202020}, +	{0x0000a3d8, 0x20202020}, +	{0x0000a3dc, 0x20202020}, +	{0x0000a3e0, 0x20202020}, +	{0x0000a3e4, 0x20202020}, +	{0x0000a3e8, 0x20202020}, +	{0x0000a3ec, 0x20202020}, +	{0x0000a3f0, 0x00000000}, +	{0x0000a3f4, 0x00000006}, +	{0x0000a3f8, 0x0cdbd380}, +	{0x0000a3fc, 0x000f0f01}, +	{0x0000a400, 0x8fa91f01}, +	{0x0000a404, 0x00000000}, +	{0x0000a408, 0x0e79e5c6}, +	{0x0000a40c, 0x00820820}, +	{0x0000a414, 0x1ce739cf}, +	{0x0000a418, 0x2d0019ce}, +	{0x0000a41c, 0x1ce739ce}, +	{0x0000a420, 0x000001ce}, +	{0x0000a424, 0x1ce739ce}, +	{0x0000a428, 0x000001ce}, +	{0x0000a42c, 0x1ce739ce}, +	{0x0000a430, 0x1ce739ce}, +	{0x0000a434, 0x00000000}, +	{0x0000a438, 0x00001801}, +	{0x0000a43c, 0x00000000}, +	{0x0000a440, 0x00000000}, +	{0x0000a444, 0x00000000}, +	{0x0000a448, 0x04000000}, +	{0x0000a44c, 0x00000001}, +	{0x0000a450, 0x00010000}, +	{0x0000a5c4, 0xbfad9d74}, +	{0x0000a5c8, 0x0048060a}, +	{0x0000a5cc, 0x00000637}, +	{0x0000a760, 0x03020100}, +	{0x0000a764, 0x09080504}, +	{0x0000a768, 0x0d0c0b0a}, +	{0x0000a76c, 0x13121110}, +	{0x0000a770, 0x31301514}, +	{0x0000a774, 0x35343332}, +	{0x0000a778, 0x00000036}, +	{0x0000a780, 0x00000838}, +	{0x0000a7c0, 0x00000000}, +	{0x0000a7c4, 0xfffffffc}, +	{0x0000a7c8, 0x00000000}, +	{0x0000a7cc, 0x00000000}, +	{0x0000a7d0, 0x00000000}, +	{0x0000a7d4, 0x00000004}, +	{0x0000a7dc, 0x00000000},  };  static const u32 ar9485_common_rx_gain_1_1[][2] = { -	/* Addr        allmodes */ +	/* Addr      allmodes  */  	{0x0000a000, 0x00010000},  	{0x0000a004, 0x00030002},  	{0x0000a008, 0x00050004}, @@ -1019,143 +594,260 @@ static const u32 ar9485_common_rx_gain_1_1[][2] = {  	{0x0000a1fc, 0x00000296},  }; +static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = { +	/* Addr      allmodes  */ +	{0x00018c00, 0x18052e5e}, +	{0x00018c04, 0x000801d8}, +	{0x00018c08, 0x0000080c}, +}; +  static const u32 ar9485_1_1_pcie_phy_clkreq_enable_L1[][2] = { -	/* Addr        allmodes */ +	/* Addr      allmodes  */  	{0x00018c00, 0x18053e5e},  	{0x00018c04, 0x000801d8},  	{0x00018c08, 0x0000080c},  }; -static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = { -	/* Addr        allmodes */ -	{0x0000a000, 0x00060005}, -	{0x0000a004, 0x00810080}, -	{0x0000a008, 0x00830082}, -	{0x0000a00c, 0x00850084}, -	{0x0000a010, 0x01820181}, -	{0x0000a014, 0x01840183}, -	{0x0000a018, 0x01880185}, -	{0x0000a01c, 0x018a0189}, -	{0x0000a020, 0x02850284}, -	{0x0000a024, 0x02890288}, -	{0x0000a028, 0x028b028a}, -	{0x0000a02c, 0x03850384}, -	{0x0000a030, 0x03890388}, -	{0x0000a034, 0x038b038a}, -	{0x0000a038, 0x038d038c}, -	{0x0000a03c, 0x03910390}, -	{0x0000a040, 0x03930392}, -	{0x0000a044, 0x03950394}, -	{0x0000a048, 0x00000396}, -	{0x0000a04c, 0x00000000}, -	{0x0000a050, 0x00000000}, -	{0x0000a054, 0x00000000}, -	{0x0000a058, 0x00000000}, -	{0x0000a05c, 0x00000000}, -	{0x0000a060, 0x00000000}, -	{0x0000a064, 0x00000000}, -	{0x0000a068, 0x00000000}, -	{0x0000a06c, 0x00000000}, -	{0x0000a070, 0x00000000}, -	{0x0000a074, 0x00000000}, -	{0x0000a078, 0x00000000}, -	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x28282828}, -	{0x0000a084, 0x28282828}, -	{0x0000a088, 0x28282828}, -	{0x0000a08c, 0x28282828}, -	{0x0000a090, 0x28282828}, -	{0x0000a094, 0x24242428}, -	{0x0000a098, 0x171e1e1e}, -	{0x0000a09c, 0x02020b0b}, -	{0x0000a0a0, 0x02020202}, -	{0x0000a0a4, 0x00000000}, -	{0x0000a0a8, 0x00000000}, -	{0x0000a0ac, 0x00000000}, -	{0x0000a0b0, 0x00000000}, -	{0x0000a0b4, 0x00000000}, -	{0x0000a0b8, 0x00000000}, -	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x22072208}, -	{0x0000a0c4, 0x22052206}, -	{0x0000a0c8, 0x22032204}, -	{0x0000a0cc, 0x22012202}, -	{0x0000a0d0, 0x221f2200}, -	{0x0000a0d4, 0x221d221e}, -	{0x0000a0d8, 0x33023303}, -	{0x0000a0dc, 0x33003301}, -	{0x0000a0e0, 0x331e331f}, -	{0x0000a0e4, 0x4402331d}, -	{0x0000a0e8, 0x44004401}, -	{0x0000a0ec, 0x441e441f}, -	{0x0000a0f0, 0x55025503}, -	{0x0000a0f4, 0x55005501}, -	{0x0000a0f8, 0x551e551f}, -	{0x0000a0fc, 0x6602551d}, -	{0x0000a100, 0x66006601}, -	{0x0000a104, 0x661e661f}, -	{0x0000a108, 0x7703661d}, -	{0x0000a10c, 0x77017702}, -	{0x0000a110, 0x00007700}, -	{0x0000a114, 0x00000000}, -	{0x0000a118, 0x00000000}, -	{0x0000a11c, 0x00000000}, -	{0x0000a120, 0x00000000}, -	{0x0000a124, 0x00000000}, -	{0x0000a128, 0x00000000}, -	{0x0000a12c, 0x00000000}, -	{0x0000a130, 0x00000000}, -	{0x0000a134, 0x00000000}, -	{0x0000a138, 0x00000000}, -	{0x0000a13c, 0x00000000}, -	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x111f1100}, -	{0x0000a148, 0x111d111e}, -	{0x0000a14c, 0x111b111c}, -	{0x0000a150, 0x22032204}, -	{0x0000a154, 0x22012202}, -	{0x0000a158, 0x221f2200}, -	{0x0000a15c, 0x221d221e}, -	{0x0000a160, 0x33013302}, -	{0x0000a164, 0x331f3300}, -	{0x0000a168, 0x4402331e}, -	{0x0000a16c, 0x44004401}, -	{0x0000a170, 0x441e441f}, -	{0x0000a174, 0x55015502}, -	{0x0000a178, 0x551f5500}, -	{0x0000a17c, 0x6602551e}, -	{0x0000a180, 0x66006601}, -	{0x0000a184, 0x661e661f}, -	{0x0000a188, 0x7703661d}, -	{0x0000a18c, 0x77017702}, -	{0x0000a190, 0x00007700}, -	{0x0000a194, 0x00000000}, -	{0x0000a198, 0x00000000}, -	{0x0000a19c, 0x00000000}, -	{0x0000a1a0, 0x00000000}, -	{0x0000a1a4, 0x00000000}, -	{0x0000a1a8, 0x00000000}, -	{0x0000a1ac, 0x00000000}, -	{0x0000a1b0, 0x00000000}, -	{0x0000a1b4, 0x00000000}, -	{0x0000a1b8, 0x00000000}, -	{0x0000a1bc, 0x00000000}, -	{0x0000a1c0, 0x00000000}, -	{0x0000a1c4, 0x00000000}, -	{0x0000a1c8, 0x00000000}, -	{0x0000a1cc, 0x00000000}, -	{0x0000a1d0, 0x00000000}, -	{0x0000a1d4, 0x00000000}, -	{0x0000a1d8, 0x00000000}, -	{0x0000a1dc, 0x00000000}, -	{0x0000a1e0, 0x00000000}, -	{0x0000a1e4, 0x00000000}, -	{0x0000a1e8, 0x00000000}, -	{0x0000a1ec, 0x00000000}, -	{0x0000a1f0, 0x00000396}, -	{0x0000a1f4, 0x00000396}, -	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000296}, +static const u32 ar9485_1_1_soc_preamble[][2] = { +	/* Addr      allmodes  */ +	{0x00004014, 0xba280400}, +	{0x00004090, 0x00aa10aa}, +	{0x000040a4, 0x00a0c9c9}, +	{0x00007010, 0x00000022}, +	{0x00007020, 0x00000000}, +	{0x00007034, 0x00000002}, +	{0x00007038, 0x000004c2}, +	{0x00007048, 0x00000002}, +}; + +static const u32 ar9485_fast_clock_1_1_baseband_postamble[][3] = { +	/* Addr      5G_HT20     5G_HT40   */ +	{0x00009e00, 0x03721821, 0x03721821}, +	{0x0000a230, 0x0000400b, 0x00004016}, +	{0x0000a254, 0x00000898, 0x00001130}, +}; + +static const u32 ar9485_1_1_baseband_postamble[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005}, +	{0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e}, +	{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0}, +	{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881}, +	{0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4}, +	{0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c}, +	{0x00009c00, 0x00000044, 0x00000044, 0x00000044, 0x00000044}, +	{0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0}, +	{0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020}, +	{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2}, +	{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec80d2e, 0x7ec80d2e}, +	{0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e}, +	{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, +	{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, +	{0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, +	{0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222}, +	{0x00009e44, 0x02321e27, 0x02321e27, 0x02282324, 0x02282324}, +	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302010, 0x50302010}, +	{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, +	{0x0000a204, 0x01303fc0, 0x01303fc4, 0x01303fc4, 0x01303fc0}, +	{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, +	{0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b}, +	{0x0000a234, 0x10000fff, 0x10000fff, 0x10000fff, 0x10000fff}, +	{0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018}, +	{0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108}, +	{0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898}, +	{0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002}, +	{0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e}, +	{0x0000a260, 0x3a021501, 0x3a021501, 0x3a021501, 0x3a021501}, +	{0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e}, +	{0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b}, +	{0x0000a284, 0x00000000, 0x00000000, 0x000002a0, 0x000002a0}, +	{0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, +	{0x0000a2d0, 0x00071981, 0x00071981, 0x00071982, 0x00071982}, +	{0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a}, +	{0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000be04, 0x00802020, 0x00802020, 0x00802020, 0x00802020}, +	{0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +}; + +static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = { +	/* Addr      allmodes  */ +	{0x00018c00, 0x18013e5e}, +	{0x00018c04, 0x000801d8}, +	{0x00018c08, 0x0000080c}, +}; + +static const u32 ar9485_1_1_radio_postamble[][2] = { +	/* Addr      allmodes  */ +	{0x0001609c, 0x0b283f31}, +	{0x000160ac, 0x24611800}, +	{0x000160b0, 0x03284f3e}, +	{0x0001610c, 0x00170000}, +	{0x00016140, 0x50804008}, +}; + +static const u32 ar9485_1_1_mac_core[][2] = { +	/* Addr      allmodes  */ +	{0x00000008, 0x00000000}, +	{0x00000030, 0x00020085}, +	{0x00000034, 0x00000005}, +	{0x00000040, 0x00000000}, +	{0x00000044, 0x00000000}, +	{0x00000048, 0x00000008}, +	{0x0000004c, 0x00000010}, +	{0x00000050, 0x00000000}, +	{0x00001040, 0x002ffc0f}, +	{0x00001044, 0x002ffc0f}, +	{0x00001048, 0x002ffc0f}, +	{0x0000104c, 0x002ffc0f}, +	{0x00001050, 0x002ffc0f}, +	{0x00001054, 0x002ffc0f}, +	{0x00001058, 0x002ffc0f}, +	{0x0000105c, 0x002ffc0f}, +	{0x00001060, 0x002ffc0f}, +	{0x00001064, 0x002ffc0f}, +	{0x000010f0, 0x00000100}, +	{0x00001270, 0x00000000}, +	{0x000012b0, 0x00000000}, +	{0x000012f0, 0x00000000}, +	{0x0000143c, 0x00000000}, +	{0x0000147c, 0x00000000}, +	{0x00008000, 0x00000000}, +	{0x00008004, 0x00000000}, +	{0x00008008, 0x00000000}, +	{0x0000800c, 0x00000000}, +	{0x00008018, 0x00000000}, +	{0x00008020, 0x00000000}, +	{0x00008038, 0x00000000}, +	{0x0000803c, 0x00000000}, +	{0x00008040, 0x00000000}, +	{0x00008044, 0x00000000}, +	{0x00008048, 0x00000000}, +	{0x0000804c, 0xffffffff}, +	{0x00008054, 0x00000000}, +	{0x00008058, 0x00000000}, +	{0x0000805c, 0x000fc78f}, +	{0x00008060, 0x0000000f}, +	{0x00008064, 0x00000000}, +	{0x00008070, 0x00000310}, +	{0x00008074, 0x00000020}, +	{0x00008078, 0x00000000}, +	{0x0000809c, 0x0000000f}, +	{0x000080a0, 0x00000000}, +	{0x000080a4, 0x02ff0000}, +	{0x000080a8, 0x0e070605}, +	{0x000080ac, 0x0000000d}, +	{0x000080b0, 0x00000000}, +	{0x000080b4, 0x00000000}, +	{0x000080b8, 0x00000000}, +	{0x000080bc, 0x00000000}, +	{0x000080c0, 0x2a800000}, +	{0x000080c4, 0x06900168}, +	{0x000080c8, 0x13881c22}, +	{0x000080cc, 0x01f40000}, +	{0x000080d0, 0x00252500}, +	{0x000080d4, 0x00a00000}, +	{0x000080d8, 0x00400000}, +	{0x000080dc, 0x00000000}, +	{0x000080e0, 0xffffffff}, +	{0x000080e4, 0x0000ffff}, +	{0x000080e8, 0x3f3f3f3f}, +	{0x000080ec, 0x00000000}, +	{0x000080f0, 0x00000000}, +	{0x000080f4, 0x00000000}, +	{0x000080fc, 0x00020000}, +	{0x00008100, 0x00000000}, +	{0x00008108, 0x00000052}, +	{0x0000810c, 0x00000000}, +	{0x00008110, 0x00000000}, +	{0x00008114, 0x000007ff}, +	{0x00008118, 0x000000aa}, +	{0x0000811c, 0x00003210}, +	{0x00008124, 0x00000000}, +	{0x00008128, 0x00000000}, +	{0x0000812c, 0x00000000}, +	{0x00008130, 0x00000000}, +	{0x00008134, 0x00000000}, +	{0x00008138, 0x00000000}, +	{0x0000813c, 0x0000ffff}, +	{0x00008144, 0xffffffff}, +	{0x00008168, 0x00000000}, +	{0x0000816c, 0x00000000}, +	{0x00008170, 0x18486200}, +	{0x00008174, 0x33332210}, +	{0x00008178, 0x00000000}, +	{0x0000817c, 0x00020000}, +	{0x000081c0, 0x00000000}, +	{0x000081c4, 0x33332210}, +	{0x000081d4, 0x00000000}, +	{0x000081ec, 0x00000000}, +	{0x000081f0, 0x00000000}, +	{0x000081f4, 0x00000000}, +	{0x000081f8, 0x00000000}, +	{0x000081fc, 0x00000000}, +	{0x00008240, 0x00100000}, +	{0x00008244, 0x0010f400}, +	{0x00008248, 0x00000800}, +	{0x0000824c, 0x0001e800}, +	{0x00008250, 0x00000000}, +	{0x00008254, 0x00000000}, +	{0x00008258, 0x00000000}, +	{0x0000825c, 0x40000000}, +	{0x00008260, 0x00080922}, +	{0x00008264, 0x9ca00010}, +	{0x00008268, 0xffffffff}, +	{0x0000826c, 0x0000ffff}, +	{0x00008270, 0x00000000}, +	{0x00008274, 0x40000000}, +	{0x00008278, 0x003e4180}, +	{0x0000827c, 0x00000004}, +	{0x00008284, 0x0000002c}, +	{0x00008288, 0x0000002c}, +	{0x0000828c, 0x000000ff}, +	{0x00008294, 0x00000000}, +	{0x00008298, 0x00000000}, +	{0x0000829c, 0x00000000}, +	{0x00008300, 0x00000140}, +	{0x00008314, 0x00000000}, +	{0x0000831c, 0x0000010d}, +	{0x00008328, 0x00000000}, +	{0x0000832c, 0x00000007}, +	{0x00008330, 0x00000302}, +	{0x00008334, 0x00000700}, +	{0x00008338, 0x00ff0000}, +	{0x0000833c, 0x02400000}, +	{0x00008340, 0x000107ff}, +	{0x00008344, 0xa248105b}, +	{0x00008348, 0x008f0000}, +	{0x0000835c, 0x00000000}, +	{0x00008360, 0xffffffff}, +	{0x00008364, 0xffffffff}, +	{0x00008368, 0x00000000}, +	{0x00008370, 0x00000000}, +	{0x00008374, 0x000000ff}, +	{0x00008378, 0x00000000}, +	{0x0000837c, 0x00000000}, +	{0x00008380, 0xffffffff}, +	{0x00008384, 0xffffffff}, +	{0x00008390, 0xffffffff}, +	{0x00008394, 0xffffffff}, +	{0x00008398, 0x00000000}, +	{0x0000839c, 0x00000000}, +	{0x000083a0, 0x00000000}, +	{0x000083a4, 0x0000fa14}, +	{0x000083a8, 0x000f0c00}, +	{0x000083ac, 0x33332210}, +	{0x000083b0, 0x33332210}, +	{0x000083b4, 0x33332210}, +	{0x000083b8, 0x33332210}, +	{0x000083bc, 0x00000000}, +	{0x000083c0, 0x00000000}, +	{0x000083c4, 0x00000000}, +	{0x000083c8, 0x00000000}, +	{0x000083cc, 0x00000200}, +	{0x000083d0, 0x000301ff},  }; -#endif +#endif /* INITVALS_9485_H */ diff --git a/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h new file mode 100644 index 00000000000..df97f21c52d --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h @@ -0,0 +1,1284 @@ +/* + * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef INITVALS_955X_1P0_H +#define INITVALS_955X_1P0_H + +/* AR955X 1.0 */ + +static const u32 ar955x_1p0_radio_postamble[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00016098, 0xd2dd5554, 0xd2dd5554, 0xd28b3330, 0xd28b3330}, +	{0x0001609c, 0x0a566f3a, 0x0a566f3a, 0x06345f2a, 0x06345f2a}, +	{0x000160ac, 0xa4647c00, 0xa4647c00, 0xa4646800, 0xa4646800}, +	{0x000160b0, 0x01885f52, 0x01885f52, 0x04accf3a, 0x04accf3a}, +	{0x00016104, 0xb7a00001, 0xb7a00001, 0xb7a00001, 0xb7a00001}, +	{0x0001610c, 0xc0000000, 0xc0000000, 0xc0000000, 0xc0000000}, +	{0x00016140, 0x10804008, 0x10804008, 0x10804008, 0x10804008}, +	{0x00016504, 0xb7a00001, 0xb7a00001, 0xb7a00001, 0xb7a00001}, +	{0x0001650c, 0xc0000000, 0xc0000000, 0xc0000000, 0xc0000000}, +	{0x00016540, 0x10804008, 0x10804008, 0x10804008, 0x10804008}, +	{0x00016904, 0xb7a00001, 0xb7a00001, 0xb7a00001, 0xb7a00001}, +	{0x0001690c, 0xc0000000, 0xc0000000, 0xc0000000, 0xc0000000}, +	{0x00016940, 0x10804008, 0x10804008, 0x10804008, 0x10804008}, +}; + +static const u32 ar955x_1p0_baseband_core_txfir_coeff_japan_2484[][2] = { +	/* Addr      allmodes  */ +	{0x0000a398, 0x00000000}, +	{0x0000a39c, 0x6f7f0301}, +	{0x0000a3a0, 0xca9228ee}, +}; + +static const u32 ar955x_1p0_baseband_postamble[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011}, +	{0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a012e}, +	{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0}, +	{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881}, +	{0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4}, +	{0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c}, +	{0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4}, +	{0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0}, +	{0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020}, +	{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2}, +	{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e}, +	{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e}, +	{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, +	{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, +	{0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, +	{0x00009e3c, 0xcfa10820, 0xcfa10820, 0xcfa10822, 0xcfa10822}, +	{0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27}, +	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012}, +	{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, +	{0x0000a204, 0x005c0ec0, 0x005c0ec4, 0x005c0ec4, 0x005c0ec0}, +	{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, +	{0x0000a22c, 0x07e26a2f, 0x07e26a2f, 0x01026a2f, 0x01026a2f}, +	{0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b}, +	{0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff}, +	{0x0000a238, 0xffb01018, 0xffb01018, 0xffb01018, 0xffb01018}, +	{0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108}, +	{0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898}, +	{0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002}, +	{0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e}, +	{0x0000a260, 0x0a021501, 0x0a021501, 0x3a021501, 0x3a021501}, +	{0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e}, +	{0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b}, +	{0x0000a284, 0x00000000, 0x00000000, 0x00000010, 0x00000010}, +	{0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110}, +	{0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222}, +	{0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, +	{0x0000a2cc, 0x18c50033, 0x18c43433, 0x18c41033, 0x18c44c33}, +	{0x0000a2d0, 0x00041982, 0x00041982, 0x00041982, 0x00041982}, +	{0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b}, +	{0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, +	{0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000}, +	{0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, +	{0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, +	{0x0000b284, 0x00000000, 0x00000000, 0x00000010, 0x00000010}, +	{0x0000b830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, +	{0x0000be04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000}, +	{0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000be1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, +	{0x0000be20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, +	{0x0000c284, 0x00000000, 0x00000000, 0x00000010, 0x00000010}, +}; + +static const u32 ar955x_1p0_radio_core[][2] = { +	/* Addr      allmodes  */ +	{0x00016000, 0x36db6db6}, +	{0x00016004, 0x6db6db40}, +	{0x00016008, 0x73f00000}, +	{0x0001600c, 0x00000000}, +	{0x00016040, 0x7f80fff8}, +	{0x0001604c, 0x76d005b5}, +	{0x00016050, 0x557cf031}, +	{0x00016054, 0x13449440}, +	{0x00016058, 0x0c51c92c}, +	{0x0001605c, 0x3db7fffc}, +	{0x00016060, 0xfffffffc}, +	{0x00016064, 0x000f0278}, +	{0x00016068, 0x6db6db6c}, +	{0x0001606c, 0x6db60000}, +	{0x00016080, 0x00080000}, +	{0x00016084, 0x0e48048c}, +	{0x00016088, 0x14214514}, +	{0x0001608c, 0x119f101e}, +	{0x00016090, 0x24926490}, +	{0x00016094, 0x00000000}, +	{0x000160a0, 0x0a108ffe}, +	{0x000160a4, 0x812fc370}, +	{0x000160a8, 0x423c8000}, +	{0x000160b4, 0x92480080}, +	{0x000160c0, 0x006db6d0}, +	{0x000160c4, 0x6db6db60}, +	{0x000160c8, 0x6db6db6c}, +	{0x000160cc, 0x01e6c000}, +	{0x00016100, 0x11999601}, +	{0x00016108, 0x00080010}, +	{0x00016144, 0x02084080}, +	{0x00016148, 0x000080c0}, +	{0x00016280, 0x01800804}, +	{0x00016284, 0x00038dc5}, +	{0x00016288, 0x00000000}, +	{0x0001628c, 0x00000040}, +	{0x00016380, 0x00000000}, +	{0x00016384, 0x00000000}, +	{0x00016388, 0x00400705}, +	{0x0001638c, 0x00800700}, +	{0x00016390, 0x00800700}, +	{0x00016394, 0x00000000}, +	{0x00016398, 0x00000000}, +	{0x0001639c, 0x00000000}, +	{0x000163a0, 0x00000001}, +	{0x000163a4, 0x00000001}, +	{0x000163a8, 0x00000000}, +	{0x000163ac, 0x00000000}, +	{0x000163b0, 0x00000000}, +	{0x000163b4, 0x00000000}, +	{0x000163b8, 0x00000000}, +	{0x000163bc, 0x00000000}, +	{0x000163c0, 0x000000a0}, +	{0x000163c4, 0x000c0000}, +	{0x000163c8, 0x14021402}, +	{0x000163cc, 0x00001402}, +	{0x000163d0, 0x00000000}, +	{0x000163d4, 0x00000000}, +	{0x00016400, 0x36db6db6}, +	{0x00016404, 0x6db6db40}, +	{0x00016408, 0x73f00000}, +	{0x0001640c, 0x00000000}, +	{0x00016440, 0x7f80fff8}, +	{0x0001644c, 0x76d005b5}, +	{0x00016450, 0x557cf031}, +	{0x00016454, 0x13449440}, +	{0x00016458, 0x0c51c92c}, +	{0x0001645c, 0x3db7fffc}, +	{0x00016460, 0xfffffffc}, +	{0x00016464, 0x000f0278}, +	{0x00016468, 0x6db6db6c}, +	{0x0001646c, 0x6db60000}, +	{0x00016500, 0x11999601}, +	{0x00016508, 0x00080010}, +	{0x00016544, 0x02084080}, +	{0x00016548, 0x000080c0}, +	{0x00016780, 0x00000000}, +	{0x00016784, 0x00000000}, +	{0x00016788, 0x00400705}, +	{0x0001678c, 0x00800700}, +	{0x00016790, 0x00800700}, +	{0x00016794, 0x00000000}, +	{0x00016798, 0x00000000}, +	{0x0001679c, 0x00000000}, +	{0x000167a0, 0x00000001}, +	{0x000167a4, 0x00000001}, +	{0x000167a8, 0x00000000}, +	{0x000167ac, 0x00000000}, +	{0x000167b0, 0x00000000}, +	{0x000167b4, 0x00000000}, +	{0x000167b8, 0x00000000}, +	{0x000167bc, 0x00000000}, +	{0x000167c0, 0x000000a0}, +	{0x000167c4, 0x000c0000}, +	{0x000167c8, 0x14021402}, +	{0x000167cc, 0x00001402}, +	{0x000167d0, 0x00000000}, +	{0x000167d4, 0x00000000}, +	{0x00016800, 0x36db6db6}, +	{0x00016804, 0x6db6db40}, +	{0x00016808, 0x73f00000}, +	{0x0001680c, 0x00000000}, +	{0x00016840, 0x7f80fff8}, +	{0x0001684c, 0x76d005b5}, +	{0x00016850, 0x557cf031}, +	{0x00016854, 0x13449440}, +	{0x00016858, 0x0c51c92c}, +	{0x0001685c, 0x3db7fffc}, +	{0x00016860, 0xfffffffc}, +	{0x00016864, 0x000f0278}, +	{0x00016868, 0x6db6db6c}, +	{0x0001686c, 0x6db60000}, +	{0x00016900, 0x11999601}, +	{0x00016908, 0x00080010}, +	{0x00016944, 0x02084080}, +	{0x00016948, 0x000080c0}, +	{0x00016b80, 0x00000000}, +	{0x00016b84, 0x00000000}, +	{0x00016b88, 0x00400705}, +	{0x00016b8c, 0x00800700}, +	{0x00016b90, 0x00800700}, +	{0x00016b94, 0x00000000}, +	{0x00016b98, 0x00000000}, +	{0x00016b9c, 0x00000000}, +	{0x00016ba0, 0x00000001}, +	{0x00016ba4, 0x00000001}, +	{0x00016ba8, 0x00000000}, +	{0x00016bac, 0x00000000}, +	{0x00016bb0, 0x00000000}, +	{0x00016bb4, 0x00000000}, +	{0x00016bb8, 0x00000000}, +	{0x00016bbc, 0x00000000}, +	{0x00016bc0, 0x000000a0}, +	{0x00016bc4, 0x000c0000}, +	{0x00016bc8, 0x14021402}, +	{0x00016bcc, 0x00001402}, +	{0x00016bd0, 0x00000000}, +	{0x00016bd4, 0x00000000}, +}; + +static const u32 ar955x_1p0_modes_xpa_tx_gain_table[][9] = { +	/* Addr      5G_HT20_L   5G_HT40_L   5G_HT20_M   5G_HT40_M   5G_HT20_H   5G_HT40_H   2G_HT40     2G_HT20  */ +	{0x0000a2dc, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xfffd5aaa, 0xfffd5aaa}, +	{0x0000a2e0, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xfffe9ccc, 0xfffe9ccc}, +	{0x0000a2e4, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xffffe0f0, 0xffffe0f0}, +	{0x0000a2e8, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xfffcff00, 0xfffcff00}, +	{0x0000a410, 0x000050de, 0x000050de, 0x000050de, 0x000050de, 0x000050de, 0x000050de, 0x000050da, 0x000050da}, +	{0x0000a500, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000}, +	{0x0000a504, 0x04000005, 0x04000005, 0x04000005, 0x04000005, 0x04000005, 0x04000005, 0x04000002, 0x04000002}, +	{0x0000a508, 0x08000009, 0x08000009, 0x08000009, 0x08000009, 0x08000009, 0x08000009, 0x08000004, 0x08000004}, +	{0x0000a50c, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c000006, 0x0c000006}, +	{0x0000a510, 0x1000000d, 0x1000000d, 0x1000000d, 0x1000000d, 0x1000000d, 0x1000000d, 0x0f00000a, 0x0f00000a}, +	{0x0000a514, 0x14000011, 0x14000011, 0x14000011, 0x14000011, 0x14000011, 0x14000011, 0x1300000c, 0x1300000c}, +	{0x0000a518, 0x19004008, 0x19004008, 0x19004008, 0x19004008, 0x18004008, 0x18004008, 0x1700000e, 0x1700000e}, +	{0x0000a51c, 0x1d00400a, 0x1d00400a, 0x1d00400a, 0x1d00400a, 0x1c00400a, 0x1c00400a, 0x1b000064, 0x1b000064}, +	{0x0000a520, 0x230020a2, 0x230020a2, 0x210020a2, 0x210020a2, 0x200020a2, 0x200020a2, 0x1f000242, 0x1f000242}, +	{0x0000a524, 0x2500006e, 0x2500006e, 0x2500006e, 0x2500006e, 0x2400006e, 0x2400006e, 0x23000229, 0x23000229}, +	{0x0000a528, 0x29022221, 0x29022221, 0x28022221, 0x28022221, 0x27022221, 0x27022221, 0x270002a2, 0x270002a2}, +	{0x0000a52c, 0x2d00062a, 0x2d00062a, 0x2c00062a, 0x2c00062a, 0x2a00062a, 0x2a00062a, 0x2c001203, 0x2c001203}, +	{0x0000a530, 0x340220a5, 0x340220a5, 0x320220a5, 0x320220a5, 0x2f0220a5, 0x2f0220a5, 0x30001803, 0x30001803}, +	{0x0000a534, 0x380022c5, 0x380022c5, 0x350022c5, 0x350022c5, 0x320022c5, 0x320022c5, 0x33000881, 0x33000881}, +	{0x0000a538, 0x3b002486, 0x3b002486, 0x39002486, 0x39002486, 0x36002486, 0x36002486, 0x38001809, 0x38001809}, +	{0x0000a53c, 0x3f00248a, 0x3f00248a, 0x3d00248a, 0x3d00248a, 0x3a00248a, 0x3a00248a, 0x3a000814, 0x3a000814}, +	{0x0000a540, 0x4202242c, 0x4202242c, 0x4102242c, 0x4102242c, 0x3f02242c, 0x3f02242c, 0x3f001a0c, 0x3f001a0c}, +	{0x0000a544, 0x490044c6, 0x490044c6, 0x460044c6, 0x460044c6, 0x420044c6, 0x420044c6, 0x43001a0e, 0x43001a0e}, +	{0x0000a548, 0x4d024485, 0x4d024485, 0x4a024485, 0x4a024485, 0x46024485, 0x46024485, 0x46001812, 0x46001812}, +	{0x0000a54c, 0x51044483, 0x51044483, 0x4e044483, 0x4e044483, 0x4a044483, 0x4a044483, 0x49001884, 0x49001884}, +	{0x0000a550, 0x5404a40c, 0x5404a40c, 0x5204a40c, 0x5204a40c, 0x4d04a40c, 0x4d04a40c, 0x4d001e84, 0x4d001e84}, +	{0x0000a554, 0x57024632, 0x57024632, 0x55024632, 0x55024632, 0x52024632, 0x52024632, 0x50001e69, 0x50001e69}, +	{0x0000a558, 0x5c00a634, 0x5c00a634, 0x5900a634, 0x5900a634, 0x5600a634, 0x5600a634, 0x550006f4, 0x550006f4}, +	{0x0000a55c, 0x5f026832, 0x5f026832, 0x5d026832, 0x5d026832, 0x5a026832, 0x5a026832, 0x59000ad3, 0x59000ad3}, +	{0x0000a560, 0x6602b012, 0x6602b012, 0x6202b012, 0x6202b012, 0x5d02b012, 0x5d02b012, 0x5e000ad5, 0x5e000ad5}, +	{0x0000a564, 0x6e02d0e1, 0x6e02d0e1, 0x6802d0e1, 0x6802d0e1, 0x6002d0e1, 0x6002d0e1, 0x61001ced, 0x61001ced}, +	{0x0000a568, 0x7202b4c4, 0x7202b4c4, 0x6c02b4c4, 0x6c02b4c4, 0x6502b4c4, 0x6502b4c4, 0x660018d4, 0x660018d4}, +	{0x0000a56c, 0x75007894, 0x75007894, 0x70007894, 0x70007894, 0x6b007894, 0x6b007894, 0x660018d4, 0x660018d4}, +	{0x0000a570, 0x7b025c74, 0x7b025c74, 0x75025c74, 0x75025c74, 0x70025c74, 0x70025c74, 0x660018d4, 0x660018d4}, +	{0x0000a574, 0x8300bcb5, 0x8300bcb5, 0x7a00bcb5, 0x7a00bcb5, 0x7600bcb5, 0x7600bcb5, 0x660018d4, 0x660018d4}, +	{0x0000a578, 0x8a04dc74, 0x8a04dc74, 0x7f04dc74, 0x7f04dc74, 0x7c04dc74, 0x7c04dc74, 0x660018d4, 0x660018d4}, +	{0x0000a57c, 0x8a04dc74, 0x8a04dc74, 0x7f04dc74, 0x7f04dc74, 0x7c04dc74, 0x7c04dc74, 0x660018d4, 0x660018d4}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x03804000, 0x03804000}, +	{0x0000a610, 0x04c08c01, 0x04c08c01, 0x04808b01, 0x04808b01, 0x04808a01, 0x04808a01, 0x0300ca02, 0x0300ca02}, +	{0x0000a614, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00000e04, 0x00000e04}, +	{0x0000a618, 0x04010c01, 0x04010c01, 0x03c10b01, 0x03c10b01, 0x03810a01, 0x03810a01, 0x03014000, 0x03014000}, +	{0x0000a61c, 0x03814e05, 0x03814e05, 0x03414d05, 0x03414d05, 0x03414d05, 0x03414d05, 0x00000000, 0x00000000}, +	{0x0000a620, 0x04010303, 0x04010303, 0x03c10303, 0x03c10303, 0x03810303, 0x03810303, 0x00000000, 0x00000000}, +	{0x0000a624, 0x03814e05, 0x03814e05, 0x03414d05, 0x03414d05, 0x03414d05, 0x03414d05, 0x03014000, 0x03014000}, +	{0x0000a628, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x03804c05, 0x03804c05}, +	{0x0000a62c, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x0701de06, 0x0701de06}, +	{0x0000a630, 0x03418000, 0x03418000, 0x03018000, 0x03018000, 0x02c18000, 0x02c18000, 0x07819c07, 0x07819c07}, +	{0x0000a634, 0x03815004, 0x03815004, 0x03414f04, 0x03414f04, 0x03414e04, 0x03414e04, 0x0701dc07, 0x0701dc07}, +	{0x0000a638, 0x03005302, 0x03005302, 0x02c05202, 0x02c05202, 0x02805202, 0x02805202, 0x0701dc07, 0x0701dc07}, +	{0x0000a63c, 0x04c09302, 0x04c09302, 0x04809202, 0x04809202, 0x04809202, 0x04809202, 0x0701dc07, 0x0701dc07}, +	{0x0000b2dc, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xfffd5aaa, 0xfffd5aaa}, +	{0x0000b2e0, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xfffe9ccc, 0xfffe9ccc}, +	{0x0000b2e4, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xffffe0f0, 0xffffe0f0}, +	{0x0000b2e8, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xfffcff00, 0xfffcff00}, +	{0x0000c2dc, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xfffd5aaa, 0xfffd5aaa}, +	{0x0000c2e0, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xfffe9ccc, 0xfffe9ccc}, +	{0x0000c2e4, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xffffe0f0, 0xffffe0f0}, +	{0x0000c2e8, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xfffcff00, 0xfffcff00}, +	{0x00016044, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x010002d4, 0x010002d4}, +	{0x00016048, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x66482401, 0x66482401}, +	{0x00016280, 0x01801e84, 0x01801e84, 0x01801e84, 0x01801e84, 0x01801e84, 0x01801e84, 0x01808e84, 0x01808e84}, +	{0x00016444, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x010002d4, 0x010002d4}, +	{0x00016448, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x66482401, 0x66482401}, +	{0x00016844, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x010002d4, 0x010002d4}, +	{0x00016848, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x66482401, 0x66482401}, +}; + +static const u32 ar955x_1p0_mac_core[][2] = { +	/* Addr      allmodes  */ +	{0x00000008, 0x00000000}, +	{0x00000030, 0x00020085}, +	{0x00000034, 0x00000005}, +	{0x00000040, 0x00000000}, +	{0x00000044, 0x00000000}, +	{0x00000048, 0x00000008}, +	{0x0000004c, 0x00000010}, +	{0x00000050, 0x00000000}, +	{0x00001040, 0x002ffc0f}, +	{0x00001044, 0x002ffc0f}, +	{0x00001048, 0x002ffc0f}, +	{0x0000104c, 0x002ffc0f}, +	{0x00001050, 0x002ffc0f}, +	{0x00001054, 0x002ffc0f}, +	{0x00001058, 0x002ffc0f}, +	{0x0000105c, 0x002ffc0f}, +	{0x00001060, 0x002ffc0f}, +	{0x00001064, 0x002ffc0f}, +	{0x000010f0, 0x00000100}, +	{0x00001270, 0x00000000}, +	{0x000012b0, 0x00000000}, +	{0x000012f0, 0x00000000}, +	{0x0000143c, 0x00000000}, +	{0x0000147c, 0x00000000}, +	{0x00008000, 0x00000000}, +	{0x00008004, 0x00000000}, +	{0x00008008, 0x00000000}, +	{0x0000800c, 0x00000000}, +	{0x00008018, 0x00000000}, +	{0x00008020, 0x00000000}, +	{0x00008038, 0x00000000}, +	{0x0000803c, 0x00000000}, +	{0x00008040, 0x00000000}, +	{0x00008044, 0x00000000}, +	{0x00008048, 0x00000000}, +	{0x0000804c, 0xffffffff}, +	{0x00008054, 0x00000000}, +	{0x00008058, 0x00000000}, +	{0x0000805c, 0x000fc78f}, +	{0x00008060, 0x0000000f}, +	{0x00008064, 0x00000000}, +	{0x00008070, 0x00000310}, +	{0x00008074, 0x00000020}, +	{0x00008078, 0x00000000}, +	{0x0000809c, 0x0000000f}, +	{0x000080a0, 0x00000000}, +	{0x000080a4, 0x02ff0000}, +	{0x000080a8, 0x0e070605}, +	{0x000080ac, 0x0000000d}, +	{0x000080b0, 0x00000000}, +	{0x000080b4, 0x00000000}, +	{0x000080b8, 0x00000000}, +	{0x000080bc, 0x00000000}, +	{0x000080c0, 0x2a800000}, +	{0x000080c4, 0x06900168}, +	{0x000080c8, 0x13881c22}, +	{0x000080cc, 0x01f40000}, +	{0x000080d0, 0x00252500}, +	{0x000080d4, 0x00a00000}, +	{0x000080d8, 0x00400000}, +	{0x000080dc, 0x00000000}, +	{0x000080e0, 0xffffffff}, +	{0x000080e4, 0x0000ffff}, +	{0x000080e8, 0x3f3f3f3f}, +	{0x000080ec, 0x00000000}, +	{0x000080f0, 0x00000000}, +	{0x000080f4, 0x00000000}, +	{0x000080fc, 0x00020000}, +	{0x00008100, 0x00000000}, +	{0x00008108, 0x00000052}, +	{0x0000810c, 0x00000000}, +	{0x00008110, 0x00000000}, +	{0x00008114, 0x000007ff}, +	{0x00008118, 0x000000aa}, +	{0x0000811c, 0x00003210}, +	{0x00008124, 0x00000000}, +	{0x00008128, 0x00000000}, +	{0x0000812c, 0x00000000}, +	{0x00008130, 0x00000000}, +	{0x00008134, 0x00000000}, +	{0x00008138, 0x00000000}, +	{0x0000813c, 0x0000ffff}, +	{0x00008140, 0x000000fe}, +	{0x00008144, 0xffffffff}, +	{0x00008168, 0x00000000}, +	{0x0000816c, 0x00000000}, +	{0x000081c0, 0x00000000}, +	{0x000081c4, 0x33332210}, +	{0x000081ec, 0x00000000}, +	{0x000081f0, 0x00000000}, +	{0x000081f4, 0x00000000}, +	{0x000081f8, 0x00000000}, +	{0x000081fc, 0x00000000}, +	{0x00008240, 0x00100000}, +	{0x00008244, 0x0010f400}, +	{0x00008248, 0x00000800}, +	{0x0000824c, 0x0001e800}, +	{0x00008250, 0x00000000}, +	{0x00008254, 0x00000000}, +	{0x00008258, 0x00000000}, +	{0x0000825c, 0x40000000}, +	{0x00008260, 0x00080922}, +	{0x00008264, 0x9d400010}, +	{0x00008268, 0xffffffff}, +	{0x0000826c, 0x0000ffff}, +	{0x00008270, 0x00000000}, +	{0x00008274, 0x40000000}, +	{0x00008278, 0x003e4180}, +	{0x0000827c, 0x00000004}, +	{0x00008284, 0x0000002c}, +	{0x00008288, 0x0000002c}, +	{0x0000828c, 0x000000ff}, +	{0x00008294, 0x00000000}, +	{0x00008298, 0x00000000}, +	{0x0000829c, 0x00000000}, +	{0x00008300, 0x00001d40}, +	{0x00008314, 0x00000000}, +	{0x0000831c, 0x0000010d}, +	{0x00008328, 0x00000000}, +	{0x0000832c, 0x0000001f}, +	{0x00008330, 0x00000302}, +	{0x00008334, 0x00000700}, +	{0x00008338, 0xffff0000}, +	{0x0000833c, 0x02400000}, +	{0x00008340, 0x000107ff}, +	{0x00008344, 0xaa48107b}, +	{0x00008348, 0x008f0000}, +	{0x0000835c, 0x00000000}, +	{0x00008360, 0xffffffff}, +	{0x00008364, 0xffffffff}, +	{0x00008368, 0x00000000}, +	{0x00008370, 0x00000000}, +	{0x00008374, 0x000000ff}, +	{0x00008378, 0x00000000}, +	{0x0000837c, 0x00000000}, +	{0x00008380, 0xffffffff}, +	{0x00008384, 0xffffffff}, +	{0x00008390, 0xffffffff}, +	{0x00008394, 0xffffffff}, +	{0x00008398, 0x00000000}, +	{0x0000839c, 0x00000000}, +	{0x000083a0, 0x00000000}, +	{0x000083a4, 0x0000fa14}, +	{0x000083a8, 0x000f0c00}, +	{0x000083ac, 0x33332210}, +	{0x000083b0, 0x33332210}, +	{0x000083b4, 0x33332210}, +	{0x000083b8, 0x33332210}, +	{0x000083bc, 0x00000000}, +	{0x000083c0, 0x00000000}, +	{0x000083c4, 0x00000000}, +	{0x000083c8, 0x00000000}, +	{0x000083cc, 0x00000200}, +	{0x000083d0, 0x8c7901ff}, +}; + +static const u32 ar955x_1p0_common_rx_gain_table[][2] = { +	/* Addr      allmodes  */ +	{0x0000a000, 0x00010000}, +	{0x0000a004, 0x00030002}, +	{0x0000a008, 0x00050004}, +	{0x0000a00c, 0x00810080}, +	{0x0000a010, 0x00830082}, +	{0x0000a014, 0x01810180}, +	{0x0000a018, 0x01830182}, +	{0x0000a01c, 0x01850184}, +	{0x0000a020, 0x01890188}, +	{0x0000a024, 0x018b018a}, +	{0x0000a028, 0x018d018c}, +	{0x0000a02c, 0x01910190}, +	{0x0000a030, 0x01930192}, +	{0x0000a034, 0x01950194}, +	{0x0000a038, 0x038a0196}, +	{0x0000a03c, 0x038c038b}, +	{0x0000a040, 0x0390038d}, +	{0x0000a044, 0x03920391}, +	{0x0000a048, 0x03940393}, +	{0x0000a04c, 0x03960395}, +	{0x0000a050, 0x00000000}, +	{0x0000a054, 0x00000000}, +	{0x0000a058, 0x00000000}, +	{0x0000a05c, 0x00000000}, +	{0x0000a060, 0x00000000}, +	{0x0000a064, 0x00000000}, +	{0x0000a068, 0x00000000}, +	{0x0000a06c, 0x00000000}, +	{0x0000a070, 0x00000000}, +	{0x0000a074, 0x00000000}, +	{0x0000a078, 0x00000000}, +	{0x0000a07c, 0x00000000}, +	{0x0000a080, 0x22222229}, +	{0x0000a084, 0x1d1d1d1d}, +	{0x0000a088, 0x1d1d1d1d}, +	{0x0000a08c, 0x1d1d1d1d}, +	{0x0000a090, 0x171d1d1d}, +	{0x0000a094, 0x11111717}, +	{0x0000a098, 0x00030311}, +	{0x0000a09c, 0x00000000}, +	{0x0000a0a0, 0x00000000}, +	{0x0000a0a4, 0x00000000}, +	{0x0000a0a8, 0x00000000}, +	{0x0000a0ac, 0x00000000}, +	{0x0000a0b0, 0x00000000}, +	{0x0000a0b4, 0x00000000}, +	{0x0000a0b8, 0x00000000}, +	{0x0000a0bc, 0x00000000}, +	{0x0000a0c0, 0x001f0000}, +	{0x0000a0c4, 0x01000101}, +	{0x0000a0c8, 0x011e011f}, +	{0x0000a0cc, 0x011c011d}, +	{0x0000a0d0, 0x02030204}, +	{0x0000a0d4, 0x02010202}, +	{0x0000a0d8, 0x021f0200}, +	{0x0000a0dc, 0x0302021e}, +	{0x0000a0e0, 0x03000301}, +	{0x0000a0e4, 0x031e031f}, +	{0x0000a0e8, 0x0402031d}, +	{0x0000a0ec, 0x04000401}, +	{0x0000a0f0, 0x041e041f}, +	{0x0000a0f4, 0x0502041d}, +	{0x0000a0f8, 0x05000501}, +	{0x0000a0fc, 0x051e051f}, +	{0x0000a100, 0x06010602}, +	{0x0000a104, 0x061f0600}, +	{0x0000a108, 0x061d061e}, +	{0x0000a10c, 0x07020703}, +	{0x0000a110, 0x07000701}, +	{0x0000a114, 0x00000000}, +	{0x0000a118, 0x00000000}, +	{0x0000a11c, 0x00000000}, +	{0x0000a120, 0x00000000}, +	{0x0000a124, 0x00000000}, +	{0x0000a128, 0x00000000}, +	{0x0000a12c, 0x00000000}, +	{0x0000a130, 0x00000000}, +	{0x0000a134, 0x00000000}, +	{0x0000a138, 0x00000000}, +	{0x0000a13c, 0x00000000}, +	{0x0000a140, 0x001f0000}, +	{0x0000a144, 0x01000101}, +	{0x0000a148, 0x011e011f}, +	{0x0000a14c, 0x011c011d}, +	{0x0000a150, 0x02030204}, +	{0x0000a154, 0x02010202}, +	{0x0000a158, 0x021f0200}, +	{0x0000a15c, 0x0302021e}, +	{0x0000a160, 0x03000301}, +	{0x0000a164, 0x031e031f}, +	{0x0000a168, 0x0402031d}, +	{0x0000a16c, 0x04000401}, +	{0x0000a170, 0x041e041f}, +	{0x0000a174, 0x0502041d}, +	{0x0000a178, 0x05000501}, +	{0x0000a17c, 0x051e051f}, +	{0x0000a180, 0x06010602}, +	{0x0000a184, 0x061f0600}, +	{0x0000a188, 0x061d061e}, +	{0x0000a18c, 0x07020703}, +	{0x0000a190, 0x07000701}, +	{0x0000a194, 0x00000000}, +	{0x0000a198, 0x00000000}, +	{0x0000a19c, 0x00000000}, +	{0x0000a1a0, 0x00000000}, +	{0x0000a1a4, 0x00000000}, +	{0x0000a1a8, 0x00000000}, +	{0x0000a1ac, 0x00000000}, +	{0x0000a1b0, 0x00000000}, +	{0x0000a1b4, 0x00000000}, +	{0x0000a1b8, 0x00000000}, +	{0x0000a1bc, 0x00000000}, +	{0x0000a1c0, 0x00000000}, +	{0x0000a1c4, 0x00000000}, +	{0x0000a1c8, 0x00000000}, +	{0x0000a1cc, 0x00000000}, +	{0x0000a1d0, 0x00000000}, +	{0x0000a1d4, 0x00000000}, +	{0x0000a1d8, 0x00000000}, +	{0x0000a1dc, 0x00000000}, +	{0x0000a1e0, 0x00000000}, +	{0x0000a1e4, 0x00000000}, +	{0x0000a1e8, 0x00000000}, +	{0x0000a1ec, 0x00000000}, +	{0x0000a1f0, 0x00000396}, +	{0x0000a1f4, 0x00000396}, +	{0x0000a1f8, 0x00000396}, +	{0x0000a1fc, 0x00000196}, +	{0x0000b000, 0x00010000}, +	{0x0000b004, 0x00030002}, +	{0x0000b008, 0x00050004}, +	{0x0000b00c, 0x00810080}, +	{0x0000b010, 0x00830082}, +	{0x0000b014, 0x01810180}, +	{0x0000b018, 0x01830182}, +	{0x0000b01c, 0x01850184}, +	{0x0000b020, 0x02810280}, +	{0x0000b024, 0x02830282}, +	{0x0000b028, 0x02850284}, +	{0x0000b02c, 0x02890288}, +	{0x0000b030, 0x028b028a}, +	{0x0000b034, 0x0388028c}, +	{0x0000b038, 0x038a0389}, +	{0x0000b03c, 0x038c038b}, +	{0x0000b040, 0x0390038d}, +	{0x0000b044, 0x03920391}, +	{0x0000b048, 0x03940393}, +	{0x0000b04c, 0x03960395}, +	{0x0000b050, 0x00000000}, +	{0x0000b054, 0x00000000}, +	{0x0000b058, 0x00000000}, +	{0x0000b05c, 0x00000000}, +	{0x0000b060, 0x00000000}, +	{0x0000b064, 0x00000000}, +	{0x0000b068, 0x00000000}, +	{0x0000b06c, 0x00000000}, +	{0x0000b070, 0x00000000}, +	{0x0000b074, 0x00000000}, +	{0x0000b078, 0x00000000}, +	{0x0000b07c, 0x00000000}, +	{0x0000b080, 0x23232323}, +	{0x0000b084, 0x21232323}, +	{0x0000b088, 0x19191c1e}, +	{0x0000b08c, 0x12141417}, +	{0x0000b090, 0x07070e0e}, +	{0x0000b094, 0x03030305}, +	{0x0000b098, 0x00000003}, +	{0x0000b09c, 0x00000000}, +	{0x0000b0a0, 0x00000000}, +	{0x0000b0a4, 0x00000000}, +	{0x0000b0a8, 0x00000000}, +	{0x0000b0ac, 0x00000000}, +	{0x0000b0b0, 0x00000000}, +	{0x0000b0b4, 0x00000000}, +	{0x0000b0b8, 0x00000000}, +	{0x0000b0bc, 0x00000000}, +	{0x0000b0c0, 0x003f0020}, +	{0x0000b0c4, 0x00400041}, +	{0x0000b0c8, 0x0140005f}, +	{0x0000b0cc, 0x0160015f}, +	{0x0000b0d0, 0x017e017f}, +	{0x0000b0d4, 0x02410242}, +	{0x0000b0d8, 0x025f0240}, +	{0x0000b0dc, 0x027f0260}, +	{0x0000b0e0, 0x0341027e}, +	{0x0000b0e4, 0x035f0340}, +	{0x0000b0e8, 0x037f0360}, +	{0x0000b0ec, 0x04400441}, +	{0x0000b0f0, 0x0460045f}, +	{0x0000b0f4, 0x0541047f}, +	{0x0000b0f8, 0x055f0540}, +	{0x0000b0fc, 0x057f0560}, +	{0x0000b100, 0x06400641}, +	{0x0000b104, 0x0660065f}, +	{0x0000b108, 0x067e067f}, +	{0x0000b10c, 0x07410742}, +	{0x0000b110, 0x075f0740}, +	{0x0000b114, 0x077f0760}, +	{0x0000b118, 0x07800781}, +	{0x0000b11c, 0x07a0079f}, +	{0x0000b120, 0x07c107bf}, +	{0x0000b124, 0x000007c0}, +	{0x0000b128, 0x00000000}, +	{0x0000b12c, 0x00000000}, +	{0x0000b130, 0x00000000}, +	{0x0000b134, 0x00000000}, +	{0x0000b138, 0x00000000}, +	{0x0000b13c, 0x00000000}, +	{0x0000b140, 0x003f0020}, +	{0x0000b144, 0x00400041}, +	{0x0000b148, 0x0140005f}, +	{0x0000b14c, 0x0160015f}, +	{0x0000b150, 0x017e017f}, +	{0x0000b154, 0x02410242}, +	{0x0000b158, 0x025f0240}, +	{0x0000b15c, 0x027f0260}, +	{0x0000b160, 0x0341027e}, +	{0x0000b164, 0x035f0340}, +	{0x0000b168, 0x037f0360}, +	{0x0000b16c, 0x04400441}, +	{0x0000b170, 0x0460045f}, +	{0x0000b174, 0x0541047f}, +	{0x0000b178, 0x055f0540}, +	{0x0000b17c, 0x057f0560}, +	{0x0000b180, 0x06400641}, +	{0x0000b184, 0x0660065f}, +	{0x0000b188, 0x067e067f}, +	{0x0000b18c, 0x07410742}, +	{0x0000b190, 0x075f0740}, +	{0x0000b194, 0x077f0760}, +	{0x0000b198, 0x07800781}, +	{0x0000b19c, 0x07a0079f}, +	{0x0000b1a0, 0x07c107bf}, +	{0x0000b1a4, 0x000007c0}, +	{0x0000b1a8, 0x00000000}, +	{0x0000b1ac, 0x00000000}, +	{0x0000b1b0, 0x00000000}, +	{0x0000b1b4, 0x00000000}, +	{0x0000b1b8, 0x00000000}, +	{0x0000b1bc, 0x00000000}, +	{0x0000b1c0, 0x00000000}, +	{0x0000b1c4, 0x00000000}, +	{0x0000b1c8, 0x00000000}, +	{0x0000b1cc, 0x00000000}, +	{0x0000b1d0, 0x00000000}, +	{0x0000b1d4, 0x00000000}, +	{0x0000b1d8, 0x00000000}, +	{0x0000b1dc, 0x00000000}, +	{0x0000b1e0, 0x00000000}, +	{0x0000b1e4, 0x00000000}, +	{0x0000b1e8, 0x00000000}, +	{0x0000b1ec, 0x00000000}, +	{0x0000b1f0, 0x00000396}, +	{0x0000b1f4, 0x00000396}, +	{0x0000b1f8, 0x00000396}, +	{0x0000b1fc, 0x00000196}, +}; + +static const u32 ar955x_1p0_baseband_core[][2] = { +	/* Addr      allmodes  */ +	{0x00009800, 0xafe68e30}, +	{0x00009804, 0xfd14e000}, +	{0x00009808, 0x9c0a9f6b}, +	{0x0000980c, 0x04900000}, +	{0x00009814, 0x0280c00a}, +	{0x00009818, 0x00000000}, +	{0x0000981c, 0x00020028}, +	{0x00009834, 0x6400a190}, +	{0x00009838, 0x0108ecff}, +	{0x0000983c, 0x14000600}, +	{0x00009880, 0x201fff00}, +	{0x00009884, 0x00001042}, +	{0x000098a4, 0x00200400}, +	{0x000098b0, 0x32840bbe}, +	{0x000098bc, 0x00000002}, +	{0x000098d0, 0x004b6a8e}, +	{0x000098d4, 0x00000820}, +	{0x000098dc, 0x00000000}, +	{0x000098f0, 0x00000000}, +	{0x000098f4, 0x00000000}, +	{0x00009c04, 0xff55ff55}, +	{0x00009c08, 0x0320ff55}, +	{0x00009c0c, 0x00000000}, +	{0x00009c10, 0x00000000}, +	{0x00009c14, 0x00046384}, +	{0x00009c18, 0x05b6b440}, +	{0x00009c1c, 0x00b6b440}, +	{0x00009d00, 0xc080a333}, +	{0x00009d04, 0x40206c10}, +	{0x00009d08, 0x009c4060}, +	{0x00009d0c, 0x9883800a}, +	{0x00009d10, 0x01834061}, +	{0x00009d14, 0x00c0040b}, +	{0x00009d18, 0x00000000}, +	{0x00009e08, 0x0038230c}, +	{0x00009e24, 0x990bb515}, +	{0x00009e28, 0x0c6f0000}, +	{0x00009e30, 0x06336f77}, +	{0x00009e34, 0x6af6532f}, +	{0x00009e38, 0x0cc80c00}, +	{0x00009e40, 0x0d261820}, +	{0x00009e4c, 0x00001004}, +	{0x00009e50, 0x00ff03f1}, +	{0x00009fc0, 0x813e4788}, +	{0x00009fc4, 0x0001efb5}, +	{0x00009fcc, 0x40000014}, +	{0x00009fd0, 0x01193b93}, +	{0x0000a20c, 0x00000000}, +	{0x0000a220, 0x00000000}, +	{0x0000a224, 0x00000000}, +	{0x0000a228, 0x10002310}, +	{0x0000a23c, 0x00000000}, +	{0x0000a244, 0x0c000000}, +	{0x0000a248, 0x00000140}, +	{0x0000a2a0, 0x00000007}, +	{0x0000a2c0, 0x00000007}, +	{0x0000a2c8, 0x00000000}, +	{0x0000a2d4, 0x00000000}, +	{0x0000a2ec, 0x00000000}, +	{0x0000a2f0, 0x00000000}, +	{0x0000a2f4, 0x00000000}, +	{0x0000a2f8, 0x00000000}, +	{0x0000a344, 0x00000000}, +	{0x0000a34c, 0x00000000}, +	{0x0000a350, 0x0000a000}, +	{0x0000a364, 0x00000000}, +	{0x0000a370, 0x00000000}, +	{0x0000a390, 0x00000001}, +	{0x0000a394, 0x00000444}, +	{0x0000a398, 0x1f020503}, +	{0x0000a39c, 0x29180c03}, +	{0x0000a3a0, 0x9a8b6844}, +	{0x0000a3a4, 0x00000000}, +	{0x0000a3a8, 0xaaaaaaaa}, +	{0x0000a3ac, 0x3c466478}, +	{0x0000a3c0, 0x20202020}, +	{0x0000a3c4, 0x22222220}, +	{0x0000a3c8, 0x20200020}, +	{0x0000a3cc, 0x20202020}, +	{0x0000a3d0, 0x20202020}, +	{0x0000a3d4, 0x20202020}, +	{0x0000a3d8, 0x20202020}, +	{0x0000a3dc, 0x20202020}, +	{0x0000a3e0, 0x20202020}, +	{0x0000a3e4, 0x20202020}, +	{0x0000a3e8, 0x20202020}, +	{0x0000a3ec, 0x20202020}, +	{0x0000a3f0, 0x00000000}, +	{0x0000a3f4, 0x00000000}, +	{0x0000a3f8, 0x0c9bd380}, +	{0x0000a3fc, 0x000f0f01}, +	{0x0000a400, 0x8fa91f01}, +	{0x0000a404, 0x00000000}, +	{0x0000a408, 0x0e79e5c6}, +	{0x0000a40c, 0x00820820}, +	{0x0000a414, 0x1ce739ce}, +	{0x0000a418, 0x2d001dce}, +	{0x0000a41c, 0x1ce739ce}, +	{0x0000a420, 0x000001ce}, +	{0x0000a424, 0x1ce739ce}, +	{0x0000a428, 0x000001ce}, +	{0x0000a42c, 0x1ce739ce}, +	{0x0000a430, 0x1ce739ce}, +	{0x0000a434, 0x00000000}, +	{0x0000a438, 0x00001801}, +	{0x0000a43c, 0x00100000}, +	{0x0000a444, 0x00000000}, +	{0x0000a448, 0x05000080}, +	{0x0000a44c, 0x00000001}, +	{0x0000a450, 0x00010000}, +	{0x0000a458, 0x00000000}, +	{0x0000a644, 0x3fad9d74}, +	{0x0000a648, 0x0048060a}, +	{0x0000a64c, 0x00003c37}, +	{0x0000a670, 0x03020100}, +	{0x0000a674, 0x09080504}, +	{0x0000a678, 0x0d0c0b0a}, +	{0x0000a67c, 0x13121110}, +	{0x0000a680, 0x31301514}, +	{0x0000a684, 0x35343332}, +	{0x0000a688, 0x00000036}, +	{0x0000a690, 0x00000838}, +	{0x0000a7cc, 0x00000000}, +	{0x0000a7d0, 0x00000000}, +	{0x0000a7d4, 0x00000004}, +	{0x0000a7dc, 0x00000000}, +	{0x0000a8d0, 0x004b6a8e}, +	{0x0000a8d4, 0x00000820}, +	{0x0000a8dc, 0x00000000}, +	{0x0000a8f0, 0x00000000}, +	{0x0000a8f4, 0x00000000}, +	{0x0000b2d0, 0x00000080}, +	{0x0000b2d4, 0x00000000}, +	{0x0000b2ec, 0x00000000}, +	{0x0000b2f0, 0x00000000}, +	{0x0000b2f4, 0x00000000}, +	{0x0000b2f8, 0x00000000}, +	{0x0000b408, 0x0e79e5c0}, +	{0x0000b40c, 0x00820820}, +	{0x0000b420, 0x00000000}, +	{0x0000b8d0, 0x004b6a8e}, +	{0x0000b8d4, 0x00000820}, +	{0x0000b8dc, 0x00000000}, +	{0x0000b8f0, 0x00000000}, +	{0x0000b8f4, 0x00000000}, +	{0x0000c2d0, 0x00000080}, +	{0x0000c2d4, 0x00000000}, +	{0x0000c2ec, 0x00000000}, +	{0x0000c2f0, 0x00000000}, +	{0x0000c2f4, 0x00000000}, +	{0x0000c2f8, 0x00000000}, +	{0x0000c408, 0x0e79e5c0}, +	{0x0000c40c, 0x00820820}, +	{0x0000c420, 0x00000000}, +}; + +static const u32 ar955x_1p0_common_wo_xlna_rx_gain_table[][2] = { +	/* Addr      allmodes  */ +	{0x0000a000, 0x00010000}, +	{0x0000a004, 0x00030002}, +	{0x0000a008, 0x00050004}, +	{0x0000a00c, 0x00810080}, +	{0x0000a010, 0x00830082}, +	{0x0000a014, 0x01810180}, +	{0x0000a018, 0x01830182}, +	{0x0000a01c, 0x01850184}, +	{0x0000a020, 0x01890188}, +	{0x0000a024, 0x018b018a}, +	{0x0000a028, 0x018d018c}, +	{0x0000a02c, 0x03820190}, +	{0x0000a030, 0x03840383}, +	{0x0000a034, 0x03880385}, +	{0x0000a038, 0x038a0389}, +	{0x0000a03c, 0x038c038b}, +	{0x0000a040, 0x0390038d}, +	{0x0000a044, 0x03920391}, +	{0x0000a048, 0x03940393}, +	{0x0000a04c, 0x03960395}, +	{0x0000a050, 0x00000000}, +	{0x0000a054, 0x00000000}, +	{0x0000a058, 0x00000000}, +	{0x0000a05c, 0x00000000}, +	{0x0000a060, 0x00000000}, +	{0x0000a064, 0x00000000}, +	{0x0000a068, 0x00000000}, +	{0x0000a06c, 0x00000000}, +	{0x0000a070, 0x00000000}, +	{0x0000a074, 0x00000000}, +	{0x0000a078, 0x00000000}, +	{0x0000a07c, 0x00000000}, +	{0x0000a080, 0x29292929}, +	{0x0000a084, 0x29292929}, +	{0x0000a088, 0x29292929}, +	{0x0000a08c, 0x29292929}, +	{0x0000a090, 0x22292929}, +	{0x0000a094, 0x1d1d2222}, +	{0x0000a098, 0x0c111117}, +	{0x0000a09c, 0x00030303}, +	{0x0000a0a0, 0x00000000}, +	{0x0000a0a4, 0x00000000}, +	{0x0000a0a8, 0x00000000}, +	{0x0000a0ac, 0x00000000}, +	{0x0000a0b0, 0x00000000}, +	{0x0000a0b4, 0x00000000}, +	{0x0000a0b8, 0x00000000}, +	{0x0000a0bc, 0x00000000}, +	{0x0000a0c0, 0x001f0000}, +	{0x0000a0c4, 0x01000101}, +	{0x0000a0c8, 0x011e011f}, +	{0x0000a0cc, 0x011c011d}, +	{0x0000a0d0, 0x02030204}, +	{0x0000a0d4, 0x02010202}, +	{0x0000a0d8, 0x021f0200}, +	{0x0000a0dc, 0x0302021e}, +	{0x0000a0e0, 0x03000301}, +	{0x0000a0e4, 0x031e031f}, +	{0x0000a0e8, 0x0402031d}, +	{0x0000a0ec, 0x04000401}, +	{0x0000a0f0, 0x041e041f}, +	{0x0000a0f4, 0x0502041d}, +	{0x0000a0f8, 0x05000501}, +	{0x0000a0fc, 0x051e051f}, +	{0x0000a100, 0x06010602}, +	{0x0000a104, 0x061f0600}, +	{0x0000a108, 0x061d061e}, +	{0x0000a10c, 0x07020703}, +	{0x0000a110, 0x07000701}, +	{0x0000a114, 0x00000000}, +	{0x0000a118, 0x00000000}, +	{0x0000a11c, 0x00000000}, +	{0x0000a120, 0x00000000}, +	{0x0000a124, 0x00000000}, +	{0x0000a128, 0x00000000}, +	{0x0000a12c, 0x00000000}, +	{0x0000a130, 0x00000000}, +	{0x0000a134, 0x00000000}, +	{0x0000a138, 0x00000000}, +	{0x0000a13c, 0x00000000}, +	{0x0000a140, 0x001f0000}, +	{0x0000a144, 0x01000101}, +	{0x0000a148, 0x011e011f}, +	{0x0000a14c, 0x011c011d}, +	{0x0000a150, 0x02030204}, +	{0x0000a154, 0x02010202}, +	{0x0000a158, 0x021f0200}, +	{0x0000a15c, 0x0302021e}, +	{0x0000a160, 0x03000301}, +	{0x0000a164, 0x031e031f}, +	{0x0000a168, 0x0402031d}, +	{0x0000a16c, 0x04000401}, +	{0x0000a170, 0x041e041f}, +	{0x0000a174, 0x0502041d}, +	{0x0000a178, 0x05000501}, +	{0x0000a17c, 0x051e051f}, +	{0x0000a180, 0x06010602}, +	{0x0000a184, 0x061f0600}, +	{0x0000a188, 0x061d061e}, +	{0x0000a18c, 0x07020703}, +	{0x0000a190, 0x07000701}, +	{0x0000a194, 0x00000000}, +	{0x0000a198, 0x00000000}, +	{0x0000a19c, 0x00000000}, +	{0x0000a1a0, 0x00000000}, +	{0x0000a1a4, 0x00000000}, +	{0x0000a1a8, 0x00000000}, +	{0x0000a1ac, 0x00000000}, +	{0x0000a1b0, 0x00000000}, +	{0x0000a1b4, 0x00000000}, +	{0x0000a1b8, 0x00000000}, +	{0x0000a1bc, 0x00000000}, +	{0x0000a1c0, 0x00000000}, +	{0x0000a1c4, 0x00000000}, +	{0x0000a1c8, 0x00000000}, +	{0x0000a1cc, 0x00000000}, +	{0x0000a1d0, 0x00000000}, +	{0x0000a1d4, 0x00000000}, +	{0x0000a1d8, 0x00000000}, +	{0x0000a1dc, 0x00000000}, +	{0x0000a1e0, 0x00000000}, +	{0x0000a1e4, 0x00000000}, +	{0x0000a1e8, 0x00000000}, +	{0x0000a1ec, 0x00000000}, +	{0x0000a1f0, 0x00000396}, +	{0x0000a1f4, 0x00000396}, +	{0x0000a1f8, 0x00000396}, +	{0x0000a1fc, 0x00000196}, +	{0x0000b000, 0x00010000}, +	{0x0000b004, 0x00030002}, +	{0x0000b008, 0x00050004}, +	{0x0000b00c, 0x00810080}, +	{0x0000b010, 0x00830082}, +	{0x0000b014, 0x01810180}, +	{0x0000b018, 0x01830182}, +	{0x0000b01c, 0x01850184}, +	{0x0000b020, 0x02810280}, +	{0x0000b024, 0x02830282}, +	{0x0000b028, 0x02850284}, +	{0x0000b02c, 0x02890288}, +	{0x0000b030, 0x028b028a}, +	{0x0000b034, 0x0388028c}, +	{0x0000b038, 0x038a0389}, +	{0x0000b03c, 0x038c038b}, +	{0x0000b040, 0x0390038d}, +	{0x0000b044, 0x03920391}, +	{0x0000b048, 0x03940393}, +	{0x0000b04c, 0x03960395}, +	{0x0000b050, 0x00000000}, +	{0x0000b054, 0x00000000}, +	{0x0000b058, 0x00000000}, +	{0x0000b05c, 0x00000000}, +	{0x0000b060, 0x00000000}, +	{0x0000b064, 0x00000000}, +	{0x0000b068, 0x00000000}, +	{0x0000b06c, 0x00000000}, +	{0x0000b070, 0x00000000}, +	{0x0000b074, 0x00000000}, +	{0x0000b078, 0x00000000}, +	{0x0000b07c, 0x00000000}, +	{0x0000b080, 0x32323232}, +	{0x0000b084, 0x2f2f3232}, +	{0x0000b088, 0x23282a2d}, +	{0x0000b08c, 0x1c1e2123}, +	{0x0000b090, 0x14171919}, +	{0x0000b094, 0x0e0e1214}, +	{0x0000b098, 0x03050707}, +	{0x0000b09c, 0x00030303}, +	{0x0000b0a0, 0x00000000}, +	{0x0000b0a4, 0x00000000}, +	{0x0000b0a8, 0x00000000}, +	{0x0000b0ac, 0x00000000}, +	{0x0000b0b0, 0x00000000}, +	{0x0000b0b4, 0x00000000}, +	{0x0000b0b8, 0x00000000}, +	{0x0000b0bc, 0x00000000}, +	{0x0000b0c0, 0x003f0020}, +	{0x0000b0c4, 0x00400041}, +	{0x0000b0c8, 0x0140005f}, +	{0x0000b0cc, 0x0160015f}, +	{0x0000b0d0, 0x017e017f}, +	{0x0000b0d4, 0x02410242}, +	{0x0000b0d8, 0x025f0240}, +	{0x0000b0dc, 0x027f0260}, +	{0x0000b0e0, 0x0341027e}, +	{0x0000b0e4, 0x035f0340}, +	{0x0000b0e8, 0x037f0360}, +	{0x0000b0ec, 0x04400441}, +	{0x0000b0f0, 0x0460045f}, +	{0x0000b0f4, 0x0541047f}, +	{0x0000b0f8, 0x055f0540}, +	{0x0000b0fc, 0x057f0560}, +	{0x0000b100, 0x06400641}, +	{0x0000b104, 0x0660065f}, +	{0x0000b108, 0x067e067f}, +	{0x0000b10c, 0x07410742}, +	{0x0000b110, 0x075f0740}, +	{0x0000b114, 0x077f0760}, +	{0x0000b118, 0x07800781}, +	{0x0000b11c, 0x07a0079f}, +	{0x0000b120, 0x07c107bf}, +	{0x0000b124, 0x000007c0}, +	{0x0000b128, 0x00000000}, +	{0x0000b12c, 0x00000000}, +	{0x0000b130, 0x00000000}, +	{0x0000b134, 0x00000000}, +	{0x0000b138, 0x00000000}, +	{0x0000b13c, 0x00000000}, +	{0x0000b140, 0x003f0020}, +	{0x0000b144, 0x00400041}, +	{0x0000b148, 0x0140005f}, +	{0x0000b14c, 0x0160015f}, +	{0x0000b150, 0x017e017f}, +	{0x0000b154, 0x02410242}, +	{0x0000b158, 0x025f0240}, +	{0x0000b15c, 0x027f0260}, +	{0x0000b160, 0x0341027e}, +	{0x0000b164, 0x035f0340}, +	{0x0000b168, 0x037f0360}, +	{0x0000b16c, 0x04400441}, +	{0x0000b170, 0x0460045f}, +	{0x0000b174, 0x0541047f}, +	{0x0000b178, 0x055f0540}, +	{0x0000b17c, 0x057f0560}, +	{0x0000b180, 0x06400641}, +	{0x0000b184, 0x0660065f}, +	{0x0000b188, 0x067e067f}, +	{0x0000b18c, 0x07410742}, +	{0x0000b190, 0x075f0740}, +	{0x0000b194, 0x077f0760}, +	{0x0000b198, 0x07800781}, +	{0x0000b19c, 0x07a0079f}, +	{0x0000b1a0, 0x07c107bf}, +	{0x0000b1a4, 0x000007c0}, +	{0x0000b1a8, 0x00000000}, +	{0x0000b1ac, 0x00000000}, +	{0x0000b1b0, 0x00000000}, +	{0x0000b1b4, 0x00000000}, +	{0x0000b1b8, 0x00000000}, +	{0x0000b1bc, 0x00000000}, +	{0x0000b1c0, 0x00000000}, +	{0x0000b1c4, 0x00000000}, +	{0x0000b1c8, 0x00000000}, +	{0x0000b1cc, 0x00000000}, +	{0x0000b1d0, 0x00000000}, +	{0x0000b1d4, 0x00000000}, +	{0x0000b1d8, 0x00000000}, +	{0x0000b1dc, 0x00000000}, +	{0x0000b1e0, 0x00000000}, +	{0x0000b1e4, 0x00000000}, +	{0x0000b1e8, 0x00000000}, +	{0x0000b1ec, 0x00000000}, +	{0x0000b1f0, 0x00000396}, +	{0x0000b1f4, 0x00000396}, +	{0x0000b1f8, 0x00000396}, +	{0x0000b1fc, 0x00000196}, +}; + +static const u32 ar955x_1p0_soc_preamble[][2] = { +	/* Addr      allmodes  */ +	{0x00007000, 0x00000000}, +	{0x00007004, 0x00000000}, +	{0x00007008, 0x00000000}, +	{0x0000700c, 0x00000000}, +	{0x0000701c, 0x00000000}, +	{0x00007020, 0x00000000}, +	{0x00007024, 0x00000000}, +	{0x00007028, 0x00000000}, +	{0x0000702c, 0x00000000}, +	{0x00007030, 0x00000000}, +	{0x00007034, 0x00000002}, +	{0x00007038, 0x000004c2}, +	{0x00007048, 0x00000000}, +}; + +static const u32 ar955x_1p0_common_wo_xlna_rx_gain_bounds[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27}, +	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012}, +}; + +static const u32 ar955x_1p0_mac_postamble[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, +	{0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, +	{0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, +	{0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, +	{0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, +	{0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, +	{0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, +	{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, +}; + +static const u32 ar955x_1p0_common_rx_gain_bounds[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27}, +	{0x00009e48, 0x5030201a, 0x5030201a, 0x50302018, 0x50302018}, +}; + +static const u32 ar955x_1p0_modes_no_xpa_tx_gain_table[][9] = { +	/* Addr      5G_HT20_L   5G_HT40_L   5G_HT20_M   5G_HT40_M   5G_HT20_H   5G_HT40_H   2G_HT40     2G_HT20  */ +	{0x0000a2dc, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0xfffe5aaa, 0xfffe5aaa}, +	{0x0000a2e0, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0xfffe9ccc, 0xfffe9ccc}, +	{0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0xffffe0f0, 0xffffe0f0}, +	{0x0000a2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffef00, 0xffffef00}, +	{0x0000a410, 0x000050d8, 0x000050d8, 0x000050d8, 0x000050d8, 0x000050d8, 0x000050d8, 0x000050d7, 0x000050d7}, +	{0x0000a500, 0x00002220, 0x00002220, 0x00002220, 0x00002220, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, +	{0x0000a504, 0x04002222, 0x04002222, 0x04002222, 0x04002222, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, +	{0x0000a508, 0x09002421, 0x09002421, 0x09002421, 0x09002421, 0x09002421, 0x09002421, 0x08000004, 0x08000004}, +	{0x0000a50c, 0x0d002621, 0x0d002621, 0x0d002621, 0x0d002621, 0x0d002621, 0x0d002621, 0x0b000006, 0x0b000006}, +	{0x0000a510, 0x13004620, 0x13004620, 0x13004620, 0x13004620, 0x13004620, 0x13004620, 0x0f00000a, 0x0f00000a}, +	{0x0000a514, 0x19004a20, 0x19004a20, 0x19004a20, 0x19004a20, 0x19004a20, 0x19004a20, 0x1300000c, 0x1300000c}, +	{0x0000a518, 0x1d004e20, 0x1d004e20, 0x1d004e20, 0x1d004e20, 0x1d004e20, 0x1d004e20, 0x1700000e, 0x1700000e}, +	{0x0000a51c, 0x21005420, 0x21005420, 0x21005420, 0x21005420, 0x21005420, 0x21005420, 0x1b000012, 0x1b000012}, +	{0x0000a520, 0x26005e20, 0x26005e20, 0x26005e20, 0x26005e20, 0x26005e20, 0x26005e20, 0x1f00004a, 0x1f00004a}, +	{0x0000a524, 0x2b005e40, 0x2b005e40, 0x2b005e40, 0x2b005e40, 0x2b005e40, 0x2b005e40, 0x23000244, 0x23000244}, +	{0x0000a528, 0x2f005e42, 0x2f005e42, 0x2f005e42, 0x2f005e42, 0x2f005e42, 0x2f005e42, 0x2700022b, 0x2700022b}, +	{0x0000a52c, 0x33005e44, 0x33005e44, 0x33005e44, 0x33005e44, 0x33005e44, 0x33005e44, 0x2b000625, 0x2b000625}, +	{0x0000a530, 0x38005e65, 0x38005e65, 0x38005e65, 0x38005e65, 0x38005e65, 0x38005e65, 0x2f001006, 0x2f001006}, +	{0x0000a534, 0x3c005e69, 0x3c005e69, 0x3c005e69, 0x3c005e69, 0x3c005e69, 0x3c005e69, 0x330008a0, 0x330008a0}, +	{0x0000a538, 0x40005e6b, 0x40005e6b, 0x40005e6b, 0x40005e6b, 0x40005e6b, 0x40005e6b, 0x37000a2a, 0x37000a2a}, +	{0x0000a53c, 0x44005e6d, 0x44005e6d, 0x44005e6d, 0x44005e6d, 0x44005e6d, 0x44005e6d, 0x3b001c23, 0x3b001c23}, +	{0x0000a540, 0x49005e72, 0x49005e72, 0x49005e72, 0x49005e72, 0x49005e72, 0x49005e72, 0x3f0014a0, 0x3f0014a0}, +	{0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x4e005eb2, 0x4e005eb2, 0x4e005eb2, 0x4e005eb2, 0x43001882, 0x43001882}, +	{0x0000a548, 0x53005f12, 0x53005f12, 0x53005f12, 0x53005f12, 0x53005f12, 0x53005f12, 0x47001ca2, 0x47001ca2}, +	{0x0000a54c, 0x59025eb2, 0x59025eb2, 0x59025eb2, 0x59025eb2, 0x59025eb2, 0x59025eb2, 0x4b001ec3, 0x4b001ec3}, +	{0x0000a550, 0x5e025f12, 0x5e025f12, 0x5e025f12, 0x5e025f12, 0x5e025f12, 0x5e025f12, 0x4f00148c, 0x4f00148c}, +	{0x0000a554, 0x61027f12, 0x61027f12, 0x61027f12, 0x61027f12, 0x61027f12, 0x61027f12, 0x53001c6e, 0x53001c6e}, +	{0x0000a558, 0x6702bf12, 0x6702bf12, 0x6702bf12, 0x6702bf12, 0x6702bf12, 0x6702bf12, 0x57001c92, 0x57001c92}, +	{0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x6b02bf14, 0x6b02bf14, 0x6b02bf14, 0x6b02bf14, 0x5c001af6, 0x5c001af6}, +	{0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x6f02bf16, 0x5c001af6, 0x5c001af6}, +	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00804000, 0x00804000, 0x00804000, 0x00804000, 0x00804000, 0x00804000, 0x04005001, 0x04005001}, +	{0x0000a614, 0x00804201, 0x00804201, 0x00804201, 0x00804201, 0x00804201, 0x00804201, 0x03808e02, 0x03808e02}, +	{0x0000a618, 0x0280c802, 0x0280c802, 0x0280c802, 0x0280c802, 0x0280c802, 0x0280c802, 0x0300c000, 0x0300c000}, +	{0x0000a61c, 0x0280ca03, 0x0280ca03, 0x0280ca03, 0x0280ca03, 0x0280ca03, 0x0280ca03, 0x03808e02, 0x03808e02}, +	{0x0000a620, 0x04c15104, 0x04c15104, 0x04c15104, 0x04c15104, 0x04c15104, 0x04c15104, 0x03410c03, 0x03410c03}, +	{0x0000a624, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04014c03, 0x04014c03}, +	{0x0000a628, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x05818d04, 0x05818d04}, +	{0x0000a62c, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x0801cd04, 0x0801cd04}, +	{0x0000a630, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x0801e007, 0x0801e007}, +	{0x0000a634, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x0801e007, 0x0801e007}, +	{0x0000a638, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x0801e007, 0x0801e007}, +	{0x0000a63c, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x04c15305, 0x0801e007, 0x0801e007}, +	{0x0000b2dc, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0xfffe5aaa, 0xfffe5aaa}, +	{0x0000b2e0, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0xfffe9ccc, 0xfffe9ccc}, +	{0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0xffffe0f0, 0xffffe0f0}, +	{0x0000b2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffef00, 0xffffef00}, +	{0x0000c2dc, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0x01feee00, 0xfffe5aaa, 0xfffe5aaa}, +	{0x0000c2e0, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0x0000f000, 0xfffe9ccc, 0xfffe9ccc}, +	{0x0000c2e4, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0x01ff0000, 0xffffe0f0, 0xffffe0f0}, +	{0x0000c2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffef00, 0xffffef00}, +	{0x00016044, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x054922d4, 0x054922d4}, +	{0x00016048, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401}, +	{0x00016444, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x054922d4, 0x054922d4}, +	{0x00016448, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401}, +	{0x00016844, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x054922d4, 0x054922d4}, +	{0x00016848, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401}, +}; + +static const u32 ar955x_1p0_soc_postamble[][5] = { +	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ +	{0x00007010, 0x00000023, 0x00000023, 0x00000023, 0x00000023}, +}; + +static const u32 ar955x_1p0_modes_fast_clock[][3] = { +	/* Addr      5G_HT20     5G_HT40   */ +	{0x00001030, 0x00000268, 0x000004d0}, +	{0x00001070, 0x0000018c, 0x00000318}, +	{0x000010b0, 0x00000fd0, 0x00001fa0}, +	{0x00008014, 0x044c044c, 0x08980898}, +	{0x0000801c, 0x148ec02b, 0x148ec057}, +	{0x00008318, 0x000044c0, 0x00008980}, +	{0x00009e00, 0x0372131c, 0x0372131c}, +	{0x0000a230, 0x0000000b, 0x00000016}, +	{0x0000a254, 0x00000898, 0x00001130}, +}; + +#endif /* INITVALS_955X_1P0_H */ diff --git a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h index 06b3f0df9fa..6e1915aee71 100644 --- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h @@ -1,5 +1,6 @@  /* - * Copyright (c) 2010 Atheros Communications Inc. + * Copyright (c) 2010-2011 Atheros Communications Inc. + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -19,18 +20,7 @@  /* AR9580 1.0 */ -static const u32 ar9580_1p0_modes_fast_clock[][3] = { -	/* Addr      5G_HT20     5G_HT40   */ -	{0x00001030, 0x00000268, 0x000004d0}, -	{0x00001070, 0x0000018c, 0x00000318}, -	{0x000010b0, 0x00000fd0, 0x00001fa0}, -	{0x00008014, 0x044c044c, 0x08980898}, -	{0x0000801c, 0x148ec02b, 0x148ec057}, -	{0x00008318, 0x000044c0, 0x00008980}, -	{0x00009e00, 0x0372131c, 0x0372131c}, -	{0x0000a230, 0x0000000b, 0x00000016}, -	{0x0000a254, 0x00000898, 0x00001130}, -}; +#define ar9580_1p0_modes_fast_clock ar9300Modes_fast_clock_2p2  static const u32 ar9580_1p0_radio_postamble[][5] = {  	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ @@ -208,17 +198,7 @@ static const u32 ar9580_1p0_baseband_core[][2] = {  	{0x0000c420, 0x00000000},  }; -static const u32 ar9580_1p0_mac_postamble[][5] = { -	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ -	{0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, -	{0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, -	{0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, -	{0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, -	{0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, -	{0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, -	{0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, -	{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, -}; +#define ar9580_1p0_mac_postamble ar9300_2p2_mac_postamble  static const u32 ar9580_1p0_low_ob_db_tx_gain_table[][5] = {  	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ @@ -326,111 +306,7 @@ static const u32 ar9580_1p0_low_ob_db_tx_gain_table[][5] = {  	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},  }; -static const u32 ar9580_1p0_high_power_tx_gain_table[][5] = { -	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ -	{0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, -	{0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, -	{0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, -	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, -	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, -	{0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, -	{0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, -	{0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, -	{0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402}, -	{0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404}, -	{0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, -	{0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, -	{0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, -	{0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, -	{0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, -	{0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, -	{0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, -	{0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, -	{0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, -	{0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861}, -	{0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81}, -	{0x0000a54c, 0x5c02486b, 0x5c02486b, 0x47001a83, 0x47001a83}, -	{0x0000a550, 0x61024a6c, 0x61024a6c, 0x4a001c84, 0x4a001c84}, -	{0x0000a554, 0x66026a6c, 0x66026a6c, 0x4e001ce3, 0x4e001ce3}, -	{0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x52001ce5, 0x52001ce5}, -	{0x0000a55c, 0x7002708c, 0x7002708c, 0x56001ce9, 0x56001ce9}, -	{0x0000a560, 0x7302b08a, 0x7302b08a, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a564, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a568, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a56c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a570, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a574, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a578, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a57c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec}, -	{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, -	{0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, -	{0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, -	{0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, -	{0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, -	{0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, -	{0x0000a598, 0x21802220, 0x21802220, 0x16800402, 0x16800402}, -	{0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404}, -	{0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, -	{0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, -	{0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, -	{0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, -	{0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, -	{0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, -	{0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, -	{0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, -	{0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, -	{0x0000a5c4, 0x5382266c, 0x5382266c, 0x3f801861, 0x3f801861}, -	{0x0000a5c8, 0x5782286c, 0x5782286c, 0x43801a81, 0x43801a81}, -	{0x0000a5cc, 0x5c82486b, 0x5c82486b, 0x47801a83, 0x47801a83}, -	{0x0000a5d0, 0x61824a6c, 0x61824a6c, 0x4a801c84, 0x4a801c84}, -	{0x0000a5d4, 0x66826a6c, 0x66826a6c, 0x4e801ce3, 0x4e801ce3}, -	{0x0000a5d8, 0x6b826e6c, 0x6b826e6c, 0x52801ce5, 0x52801ce5}, -	{0x0000a5dc, 0x7082708c, 0x7082708c, 0x56801ce9, 0x56801ce9}, -	{0x0000a5e0, 0x7382b08a, 0x7382b08a, 0x5a801ceb, 0x5a801ceb}, -	{0x0000a5e4, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a5e8, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a5ec, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a5f0, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a5f4, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a5f8, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a5fc, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec}, -	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000}, -	{0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501}, -	{0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501}, -	{0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03}, -	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, -	{0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04}, -	{0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005}, -	{0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, -	{0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, -	{0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, -	{0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005}, -	{0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, -	{0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, -	{0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, -	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, -	{0x0000c2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, -	{0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, -	{0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, -	{0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, -	{0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, -	{0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, -	{0x00016448, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, -	{0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, -	{0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, -	{0x00016848, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, -	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, -}; +#define ar9580_1p0_high_power_tx_gain_table ar9580_1p0_low_ob_db_tx_gain_table  static const u32 ar9580_1p0_lowest_ob_db_tx_gain_table[][5] = {  	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ @@ -538,12 +414,7 @@ static const u32 ar9580_1p0_lowest_ob_db_tx_gain_table[][5] = {  	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},  }; -static const u32 ar9580_1p0_baseband_core_txfir_coeff_japan_2484[][2] = { -	/* Addr      allmodes  */ -	{0x0000a398, 0x00000000}, -	{0x0000a39c, 0x6f7f0301}, -	{0x0000a3a0, 0xca9228ee}, -}; +#define ar9580_1p0_baseband_core_txfir_coeff_japan_2484 ar9462_2p0_baseband_core_txfir_coeff_japan_2484  static const u32 ar9580_1p0_mac_core[][2] = {  	/* Addr      allmodes  */ @@ -808,376 +679,11 @@ static const u32 ar9580_1p0_mixed_ob_db_tx_gain_table[][5] = {  	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},  }; -static const u32 ar9580_1p0_wo_xlna_rx_gain_table[][2] = { -	/* Addr      allmodes  */ -	{0x0000a000, 0x00010000}, -	{0x0000a004, 0x00030002}, -	{0x0000a008, 0x00050004}, -	{0x0000a00c, 0x00810080}, -	{0x0000a010, 0x00830082}, -	{0x0000a014, 0x01810180}, -	{0x0000a018, 0x01830182}, -	{0x0000a01c, 0x01850184}, -	{0x0000a020, 0x01890188}, -	{0x0000a024, 0x018b018a}, -	{0x0000a028, 0x018d018c}, -	{0x0000a02c, 0x03820190}, -	{0x0000a030, 0x03840383}, -	{0x0000a034, 0x03880385}, -	{0x0000a038, 0x038a0389}, -	{0x0000a03c, 0x038c038b}, -	{0x0000a040, 0x0390038d}, -	{0x0000a044, 0x03920391}, -	{0x0000a048, 0x03940393}, -	{0x0000a04c, 0x03960395}, -	{0x0000a050, 0x00000000}, -	{0x0000a054, 0x00000000}, -	{0x0000a058, 0x00000000}, -	{0x0000a05c, 0x00000000}, -	{0x0000a060, 0x00000000}, -	{0x0000a064, 0x00000000}, -	{0x0000a068, 0x00000000}, -	{0x0000a06c, 0x00000000}, -	{0x0000a070, 0x00000000}, -	{0x0000a074, 0x00000000}, -	{0x0000a078, 0x00000000}, -	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x29292929}, -	{0x0000a084, 0x29292929}, -	{0x0000a088, 0x29292929}, -	{0x0000a08c, 0x29292929}, -	{0x0000a090, 0x22292929}, -	{0x0000a094, 0x1d1d2222}, -	{0x0000a098, 0x0c111117}, -	{0x0000a09c, 0x00030303}, -	{0x0000a0a0, 0x00000000}, -	{0x0000a0a4, 0x00000000}, -	{0x0000a0a8, 0x00000000}, -	{0x0000a0ac, 0x00000000}, -	{0x0000a0b0, 0x00000000}, -	{0x0000a0b4, 0x00000000}, -	{0x0000a0b8, 0x00000000}, -	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x001f0000}, -	{0x0000a0c4, 0x01000101}, -	{0x0000a0c8, 0x011e011f}, -	{0x0000a0cc, 0x011c011d}, -	{0x0000a0d0, 0x02030204}, -	{0x0000a0d4, 0x02010202}, -	{0x0000a0d8, 0x021f0200}, -	{0x0000a0dc, 0x0302021e}, -	{0x0000a0e0, 0x03000301}, -	{0x0000a0e4, 0x031e031f}, -	{0x0000a0e8, 0x0402031d}, -	{0x0000a0ec, 0x04000401}, -	{0x0000a0f0, 0x041e041f}, -	{0x0000a0f4, 0x0502041d}, -	{0x0000a0f8, 0x05000501}, -	{0x0000a0fc, 0x051e051f}, -	{0x0000a100, 0x06010602}, -	{0x0000a104, 0x061f0600}, -	{0x0000a108, 0x061d061e}, -	{0x0000a10c, 0x07020703}, -	{0x0000a110, 0x07000701}, -	{0x0000a114, 0x00000000}, -	{0x0000a118, 0x00000000}, -	{0x0000a11c, 0x00000000}, -	{0x0000a120, 0x00000000}, -	{0x0000a124, 0x00000000}, -	{0x0000a128, 0x00000000}, -	{0x0000a12c, 0x00000000}, -	{0x0000a130, 0x00000000}, -	{0x0000a134, 0x00000000}, -	{0x0000a138, 0x00000000}, -	{0x0000a13c, 0x00000000}, -	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x01000101}, -	{0x0000a148, 0x011e011f}, -	{0x0000a14c, 0x011c011d}, -	{0x0000a150, 0x02030204}, -	{0x0000a154, 0x02010202}, -	{0x0000a158, 0x021f0200}, -	{0x0000a15c, 0x0302021e}, -	{0x0000a160, 0x03000301}, -	{0x0000a164, 0x031e031f}, -	{0x0000a168, 0x0402031d}, -	{0x0000a16c, 0x04000401}, -	{0x0000a170, 0x041e041f}, -	{0x0000a174, 0x0502041d}, -	{0x0000a178, 0x05000501}, -	{0x0000a17c, 0x051e051f}, -	{0x0000a180, 0x06010602}, -	{0x0000a184, 0x061f0600}, -	{0x0000a188, 0x061d061e}, -	{0x0000a18c, 0x07020703}, -	{0x0000a190, 0x07000701}, -	{0x0000a194, 0x00000000}, -	{0x0000a198, 0x00000000}, -	{0x0000a19c, 0x00000000}, -	{0x0000a1a0, 0x00000000}, -	{0x0000a1a4, 0x00000000}, -	{0x0000a1a8, 0x00000000}, -	{0x0000a1ac, 0x00000000}, -	{0x0000a1b0, 0x00000000}, -	{0x0000a1b4, 0x00000000}, -	{0x0000a1b8, 0x00000000}, -	{0x0000a1bc, 0x00000000}, -	{0x0000a1c0, 0x00000000}, -	{0x0000a1c4, 0x00000000}, -	{0x0000a1c8, 0x00000000}, -	{0x0000a1cc, 0x00000000}, -	{0x0000a1d0, 0x00000000}, -	{0x0000a1d4, 0x00000000}, -	{0x0000a1d8, 0x00000000}, -	{0x0000a1dc, 0x00000000}, -	{0x0000a1e0, 0x00000000}, -	{0x0000a1e4, 0x00000000}, -	{0x0000a1e8, 0x00000000}, -	{0x0000a1ec, 0x00000000}, -	{0x0000a1f0, 0x00000396}, -	{0x0000a1f4, 0x00000396}, -	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000196}, -	{0x0000b000, 0x00010000}, -	{0x0000b004, 0x00030002}, -	{0x0000b008, 0x00050004}, -	{0x0000b00c, 0x00810080}, -	{0x0000b010, 0x00830082}, -	{0x0000b014, 0x01810180}, -	{0x0000b018, 0x01830182}, -	{0x0000b01c, 0x01850184}, -	{0x0000b020, 0x02810280}, -	{0x0000b024, 0x02830282}, -	{0x0000b028, 0x02850284}, -	{0x0000b02c, 0x02890288}, -	{0x0000b030, 0x028b028a}, -	{0x0000b034, 0x0388028c}, -	{0x0000b038, 0x038a0389}, -	{0x0000b03c, 0x038c038b}, -	{0x0000b040, 0x0390038d}, -	{0x0000b044, 0x03920391}, -	{0x0000b048, 0x03940393}, -	{0x0000b04c, 0x03960395}, -	{0x0000b050, 0x00000000}, -	{0x0000b054, 0x00000000}, -	{0x0000b058, 0x00000000}, -	{0x0000b05c, 0x00000000}, -	{0x0000b060, 0x00000000}, -	{0x0000b064, 0x00000000}, -	{0x0000b068, 0x00000000}, -	{0x0000b06c, 0x00000000}, -	{0x0000b070, 0x00000000}, -	{0x0000b074, 0x00000000}, -	{0x0000b078, 0x00000000}, -	{0x0000b07c, 0x00000000}, -	{0x0000b080, 0x32323232}, -	{0x0000b084, 0x2f2f3232}, -	{0x0000b088, 0x23282a2d}, -	{0x0000b08c, 0x1c1e2123}, -	{0x0000b090, 0x14171919}, -	{0x0000b094, 0x0e0e1214}, -	{0x0000b098, 0x03050707}, -	{0x0000b09c, 0x00030303}, -	{0x0000b0a0, 0x00000000}, -	{0x0000b0a4, 0x00000000}, -	{0x0000b0a8, 0x00000000}, -	{0x0000b0ac, 0x00000000}, -	{0x0000b0b0, 0x00000000}, -	{0x0000b0b4, 0x00000000}, -	{0x0000b0b8, 0x00000000}, -	{0x0000b0bc, 0x00000000}, -	{0x0000b0c0, 0x003f0020}, -	{0x0000b0c4, 0x00400041}, -	{0x0000b0c8, 0x0140005f}, -	{0x0000b0cc, 0x0160015f}, -	{0x0000b0d0, 0x017e017f}, -	{0x0000b0d4, 0x02410242}, -	{0x0000b0d8, 0x025f0240}, -	{0x0000b0dc, 0x027f0260}, -	{0x0000b0e0, 0x0341027e}, -	{0x0000b0e4, 0x035f0340}, -	{0x0000b0e8, 0x037f0360}, -	{0x0000b0ec, 0x04400441}, -	{0x0000b0f0, 0x0460045f}, -	{0x0000b0f4, 0x0541047f}, -	{0x0000b0f8, 0x055f0540}, -	{0x0000b0fc, 0x057f0560}, -	{0x0000b100, 0x06400641}, -	{0x0000b104, 0x0660065f}, -	{0x0000b108, 0x067e067f}, -	{0x0000b10c, 0x07410742}, -	{0x0000b110, 0x075f0740}, -	{0x0000b114, 0x077f0760}, -	{0x0000b118, 0x07800781}, -	{0x0000b11c, 0x07a0079f}, -	{0x0000b120, 0x07c107bf}, -	{0x0000b124, 0x000007c0}, -	{0x0000b128, 0x00000000}, -	{0x0000b12c, 0x00000000}, -	{0x0000b130, 0x00000000}, -	{0x0000b134, 0x00000000}, -	{0x0000b138, 0x00000000}, -	{0x0000b13c, 0x00000000}, -	{0x0000b140, 0x003f0020}, -	{0x0000b144, 0x00400041}, -	{0x0000b148, 0x0140005f}, -	{0x0000b14c, 0x0160015f}, -	{0x0000b150, 0x017e017f}, -	{0x0000b154, 0x02410242}, -	{0x0000b158, 0x025f0240}, -	{0x0000b15c, 0x027f0260}, -	{0x0000b160, 0x0341027e}, -	{0x0000b164, 0x035f0340}, -	{0x0000b168, 0x037f0360}, -	{0x0000b16c, 0x04400441}, -	{0x0000b170, 0x0460045f}, -	{0x0000b174, 0x0541047f}, -	{0x0000b178, 0x055f0540}, -	{0x0000b17c, 0x057f0560}, -	{0x0000b180, 0x06400641}, -	{0x0000b184, 0x0660065f}, -	{0x0000b188, 0x067e067f}, -	{0x0000b18c, 0x07410742}, -	{0x0000b190, 0x075f0740}, -	{0x0000b194, 0x077f0760}, -	{0x0000b198, 0x07800781}, -	{0x0000b19c, 0x07a0079f}, -	{0x0000b1a0, 0x07c107bf}, -	{0x0000b1a4, 0x000007c0}, -	{0x0000b1a8, 0x00000000}, -	{0x0000b1ac, 0x00000000}, -	{0x0000b1b0, 0x00000000}, -	{0x0000b1b4, 0x00000000}, -	{0x0000b1b8, 0x00000000}, -	{0x0000b1bc, 0x00000000}, -	{0x0000b1c0, 0x00000000}, -	{0x0000b1c4, 0x00000000}, -	{0x0000b1c8, 0x00000000}, -	{0x0000b1cc, 0x00000000}, -	{0x0000b1d0, 0x00000000}, -	{0x0000b1d4, 0x00000000}, -	{0x0000b1d8, 0x00000000}, -	{0x0000b1dc, 0x00000000}, -	{0x0000b1e0, 0x00000000}, -	{0x0000b1e4, 0x00000000}, -	{0x0000b1e8, 0x00000000}, -	{0x0000b1ec, 0x00000000}, -	{0x0000b1f0, 0x00000396}, -	{0x0000b1f4, 0x00000396}, -	{0x0000b1f8, 0x00000396}, -	{0x0000b1fc, 0x00000196}, -}; +#define ar9580_1p0_wo_xlna_rx_gain_table ar9300Common_wo_xlna_rx_gain_table_2p2 -static const u32 ar9580_1p0_soc_postamble[][5] = { -	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ -	{0x00007010, 0x00000023, 0x00000023, 0x00000023, 0x00000023}, -}; +#define ar9580_1p0_soc_postamble ar9300_2p2_soc_postamble -static const u32 ar9580_1p0_high_ob_db_tx_gain_table[][5] = { -	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ -	{0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352}, -	{0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584}, -	{0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800}, -	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9}, -	{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, -	{0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, -	{0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004}, -	{0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200}, -	{0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202}, -	{0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400}, -	{0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402}, -	{0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404}, -	{0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603}, -	{0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02}, -	{0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04}, -	{0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20}, -	{0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20}, -	{0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22}, -	{0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24}, -	{0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640}, -	{0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660}, -	{0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861}, -	{0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81}, -	{0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83}, -	{0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84}, -	{0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3}, -	{0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5}, -	{0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9}, -	{0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb}, -	{0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, -	{0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000}, -	{0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002}, -	{0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004}, -	{0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200}, -	{0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202}, -	{0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400}, -	{0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402}, -	{0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404}, -	{0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603}, -	{0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02}, -	{0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04}, -	{0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20}, -	{0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20}, -	{0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22}, -	{0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24}, -	{0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640}, -	{0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660}, -	{0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861}, -	{0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81}, -	{0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83}, -	{0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84}, -	{0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3}, -	{0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5}, -	{0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9}, -	{0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb}, -	{0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, -	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000}, -	{0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000}, -	{0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501}, -	{0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501}, -	{0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03}, -	{0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04}, -	{0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04}, -	{0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, -	{0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, -	{0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, -	{0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, -	{0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, -	{0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352}, -	{0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584}, -	{0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800}, -	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x0000c2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352}, -	{0x0000c2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584}, -	{0x0000c2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800}, -	{0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x00016044, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4}, -	{0x00016048, 0x8e480001, 0x8e480001, 0x8e480001, 0x8e480001}, -	{0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, -	{0x00016444, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4}, -	{0x00016448, 0x8e480001, 0x8e480001, 0x8e480001, 0x8e480001}, -	{0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, -	{0x00016844, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4}, -	{0x00016848, 0x8e480001, 0x8e480001, 0x8e480001, 0x8e480001}, -	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, -}; +#define ar9580_1p0_high_ob_db_tx_gain_table ar9300Modes_high_ob_db_tx_gain_table_2p2  static const u32 ar9580_1p0_soc_preamble[][2] = {  	/* Addr      allmodes  */ @@ -1189,265 +695,7 @@ static const u32 ar9580_1p0_soc_preamble[][2] = {  	{0x00007048, 0x00000008},  }; -static const u32 ar9580_1p0_rx_gain_table[][2] = { -	/* Addr      allmodes  */ -	{0x0000a000, 0x00010000}, -	{0x0000a004, 0x00030002}, -	{0x0000a008, 0x00050004}, -	{0x0000a00c, 0x00810080}, -	{0x0000a010, 0x00830082}, -	{0x0000a014, 0x01810180}, -	{0x0000a018, 0x01830182}, -	{0x0000a01c, 0x01850184}, -	{0x0000a020, 0x01890188}, -	{0x0000a024, 0x018b018a}, -	{0x0000a028, 0x018d018c}, -	{0x0000a02c, 0x01910190}, -	{0x0000a030, 0x01930192}, -	{0x0000a034, 0x01950194}, -	{0x0000a038, 0x038a0196}, -	{0x0000a03c, 0x038c038b}, -	{0x0000a040, 0x0390038d}, -	{0x0000a044, 0x03920391}, -	{0x0000a048, 0x03940393}, -	{0x0000a04c, 0x03960395}, -	{0x0000a050, 0x00000000}, -	{0x0000a054, 0x00000000}, -	{0x0000a058, 0x00000000}, -	{0x0000a05c, 0x00000000}, -	{0x0000a060, 0x00000000}, -	{0x0000a064, 0x00000000}, -	{0x0000a068, 0x00000000}, -	{0x0000a06c, 0x00000000}, -	{0x0000a070, 0x00000000}, -	{0x0000a074, 0x00000000}, -	{0x0000a078, 0x00000000}, -	{0x0000a07c, 0x00000000}, -	{0x0000a080, 0x22222229}, -	{0x0000a084, 0x1d1d1d1d}, -	{0x0000a088, 0x1d1d1d1d}, -	{0x0000a08c, 0x1d1d1d1d}, -	{0x0000a090, 0x171d1d1d}, -	{0x0000a094, 0x11111717}, -	{0x0000a098, 0x00030311}, -	{0x0000a09c, 0x00000000}, -	{0x0000a0a0, 0x00000000}, -	{0x0000a0a4, 0x00000000}, -	{0x0000a0a8, 0x00000000}, -	{0x0000a0ac, 0x00000000}, -	{0x0000a0b0, 0x00000000}, -	{0x0000a0b4, 0x00000000}, -	{0x0000a0b8, 0x00000000}, -	{0x0000a0bc, 0x00000000}, -	{0x0000a0c0, 0x001f0000}, -	{0x0000a0c4, 0x01000101}, -	{0x0000a0c8, 0x011e011f}, -	{0x0000a0cc, 0x011c011d}, -	{0x0000a0d0, 0x02030204}, -	{0x0000a0d4, 0x02010202}, -	{0x0000a0d8, 0x021f0200}, -	{0x0000a0dc, 0x0302021e}, -	{0x0000a0e0, 0x03000301}, -	{0x0000a0e4, 0x031e031f}, -	{0x0000a0e8, 0x0402031d}, -	{0x0000a0ec, 0x04000401}, -	{0x0000a0f0, 0x041e041f}, -	{0x0000a0f4, 0x0502041d}, -	{0x0000a0f8, 0x05000501}, -	{0x0000a0fc, 0x051e051f}, -	{0x0000a100, 0x06010602}, -	{0x0000a104, 0x061f0600}, -	{0x0000a108, 0x061d061e}, -	{0x0000a10c, 0x07020703}, -	{0x0000a110, 0x07000701}, -	{0x0000a114, 0x00000000}, -	{0x0000a118, 0x00000000}, -	{0x0000a11c, 0x00000000}, -	{0x0000a120, 0x00000000}, -	{0x0000a124, 0x00000000}, -	{0x0000a128, 0x00000000}, -	{0x0000a12c, 0x00000000}, -	{0x0000a130, 0x00000000}, -	{0x0000a134, 0x00000000}, -	{0x0000a138, 0x00000000}, -	{0x0000a13c, 0x00000000}, -	{0x0000a140, 0x001f0000}, -	{0x0000a144, 0x01000101}, -	{0x0000a148, 0x011e011f}, -	{0x0000a14c, 0x011c011d}, -	{0x0000a150, 0x02030204}, -	{0x0000a154, 0x02010202}, -	{0x0000a158, 0x021f0200}, -	{0x0000a15c, 0x0302021e}, -	{0x0000a160, 0x03000301}, -	{0x0000a164, 0x031e031f}, -	{0x0000a168, 0x0402031d}, -	{0x0000a16c, 0x04000401}, -	{0x0000a170, 0x041e041f}, -	{0x0000a174, 0x0502041d}, -	{0x0000a178, 0x05000501}, -	{0x0000a17c, 0x051e051f}, -	{0x0000a180, 0x06010602}, -	{0x0000a184, 0x061f0600}, -	{0x0000a188, 0x061d061e}, -	{0x0000a18c, 0x07020703}, -	{0x0000a190, 0x07000701}, -	{0x0000a194, 0x00000000}, -	{0x0000a198, 0x00000000}, -	{0x0000a19c, 0x00000000}, -	{0x0000a1a0, 0x00000000}, -	{0x0000a1a4, 0x00000000}, -	{0x0000a1a8, 0x00000000}, -	{0x0000a1ac, 0x00000000}, -	{0x0000a1b0, 0x00000000}, -	{0x0000a1b4, 0x00000000}, -	{0x0000a1b8, 0x00000000}, -	{0x0000a1bc, 0x00000000}, -	{0x0000a1c0, 0x00000000}, -	{0x0000a1c4, 0x00000000}, -	{0x0000a1c8, 0x00000000}, -	{0x0000a1cc, 0x00000000}, -	{0x0000a1d0, 0x00000000}, -	{0x0000a1d4, 0x00000000}, -	{0x0000a1d8, 0x00000000}, -	{0x0000a1dc, 0x00000000}, -	{0x0000a1e0, 0x00000000}, -	{0x0000a1e4, 0x00000000}, -	{0x0000a1e8, 0x00000000}, -	{0x0000a1ec, 0x00000000}, -	{0x0000a1f0, 0x00000396}, -	{0x0000a1f4, 0x00000396}, -	{0x0000a1f8, 0x00000396}, -	{0x0000a1fc, 0x00000196}, -	{0x0000b000, 0x00010000}, -	{0x0000b004, 0x00030002}, -	{0x0000b008, 0x00050004}, -	{0x0000b00c, 0x00810080}, -	{0x0000b010, 0x00830082}, -	{0x0000b014, 0x01810180}, -	{0x0000b018, 0x01830182}, -	{0x0000b01c, 0x01850184}, -	{0x0000b020, 0x02810280}, -	{0x0000b024, 0x02830282}, -	{0x0000b028, 0x02850284}, -	{0x0000b02c, 0x02890288}, -	{0x0000b030, 0x028b028a}, -	{0x0000b034, 0x0388028c}, -	{0x0000b038, 0x038a0389}, -	{0x0000b03c, 0x038c038b}, -	{0x0000b040, 0x0390038d}, -	{0x0000b044, 0x03920391}, -	{0x0000b048, 0x03940393}, -	{0x0000b04c, 0x03960395}, -	{0x0000b050, 0x00000000}, -	{0x0000b054, 0x00000000}, -	{0x0000b058, 0x00000000}, -	{0x0000b05c, 0x00000000}, -	{0x0000b060, 0x00000000}, -	{0x0000b064, 0x00000000}, -	{0x0000b068, 0x00000000}, -	{0x0000b06c, 0x00000000}, -	{0x0000b070, 0x00000000}, -	{0x0000b074, 0x00000000}, -	{0x0000b078, 0x00000000}, -	{0x0000b07c, 0x00000000}, -	{0x0000b080, 0x2a2d2f32}, -	{0x0000b084, 0x21232328}, -	{0x0000b088, 0x19191c1e}, -	{0x0000b08c, 0x12141417}, -	{0x0000b090, 0x07070e0e}, -	{0x0000b094, 0x03030305}, -	{0x0000b098, 0x00000003}, -	{0x0000b09c, 0x00000000}, -	{0x0000b0a0, 0x00000000}, -	{0x0000b0a4, 0x00000000}, -	{0x0000b0a8, 0x00000000}, -	{0x0000b0ac, 0x00000000}, -	{0x0000b0b0, 0x00000000}, -	{0x0000b0b4, 0x00000000}, -	{0x0000b0b8, 0x00000000}, -	{0x0000b0bc, 0x00000000}, -	{0x0000b0c0, 0x003f0020}, -	{0x0000b0c4, 0x00400041}, -	{0x0000b0c8, 0x0140005f}, -	{0x0000b0cc, 0x0160015f}, -	{0x0000b0d0, 0x017e017f}, -	{0x0000b0d4, 0x02410242}, -	{0x0000b0d8, 0x025f0240}, -	{0x0000b0dc, 0x027f0260}, -	{0x0000b0e0, 0x0341027e}, -	{0x0000b0e4, 0x035f0340}, -	{0x0000b0e8, 0x037f0360}, -	{0x0000b0ec, 0x04400441}, -	{0x0000b0f0, 0x0460045f}, -	{0x0000b0f4, 0x0541047f}, -	{0x0000b0f8, 0x055f0540}, -	{0x0000b0fc, 0x057f0560}, -	{0x0000b100, 0x06400641}, -	{0x0000b104, 0x0660065f}, -	{0x0000b108, 0x067e067f}, -	{0x0000b10c, 0x07410742}, -	{0x0000b110, 0x075f0740}, -	{0x0000b114, 0x077f0760}, -	{0x0000b118, 0x07800781}, -	{0x0000b11c, 0x07a0079f}, -	{0x0000b120, 0x07c107bf}, -	{0x0000b124, 0x000007c0}, -	{0x0000b128, 0x00000000}, -	{0x0000b12c, 0x00000000}, -	{0x0000b130, 0x00000000}, -	{0x0000b134, 0x00000000}, -	{0x0000b138, 0x00000000}, -	{0x0000b13c, 0x00000000}, -	{0x0000b140, 0x003f0020}, -	{0x0000b144, 0x00400041}, -	{0x0000b148, 0x0140005f}, -	{0x0000b14c, 0x0160015f}, -	{0x0000b150, 0x017e017f}, -	{0x0000b154, 0x02410242}, -	{0x0000b158, 0x025f0240}, -	{0x0000b15c, 0x027f0260}, -	{0x0000b160, 0x0341027e}, -	{0x0000b164, 0x035f0340}, -	{0x0000b168, 0x037f0360}, -	{0x0000b16c, 0x04400441}, -	{0x0000b170, 0x0460045f}, -	{0x0000b174, 0x0541047f}, -	{0x0000b178, 0x055f0540}, -	{0x0000b17c, 0x057f0560}, -	{0x0000b180, 0x06400641}, -	{0x0000b184, 0x0660065f}, -	{0x0000b188, 0x067e067f}, -	{0x0000b18c, 0x07410742}, -	{0x0000b190, 0x075f0740}, -	{0x0000b194, 0x077f0760}, -	{0x0000b198, 0x07800781}, -	{0x0000b19c, 0x07a0079f}, -	{0x0000b1a0, 0x07c107bf}, -	{0x0000b1a4, 0x000007c0}, -	{0x0000b1a8, 0x00000000}, -	{0x0000b1ac, 0x00000000}, -	{0x0000b1b0, 0x00000000}, -	{0x0000b1b4, 0x00000000}, -	{0x0000b1b8, 0x00000000}, -	{0x0000b1bc, 0x00000000}, -	{0x0000b1c0, 0x00000000}, -	{0x0000b1c4, 0x00000000}, -	{0x0000b1c8, 0x00000000}, -	{0x0000b1cc, 0x00000000}, -	{0x0000b1d0, 0x00000000}, -	{0x0000b1d4, 0x00000000}, -	{0x0000b1d8, 0x00000000}, -	{0x0000b1dc, 0x00000000}, -	{0x0000b1e0, 0x00000000}, -	{0x0000b1e4, 0x00000000}, -	{0x0000b1e8, 0x00000000}, -	{0x0000b1ec, 0x00000000}, -	{0x0000b1f0, 0x00000396}, -	{0x0000b1f4, 0x00000396}, -	{0x0000b1f8, 0x00000396}, -	{0x0000b1fc, 0x00000196}, -}; +#define ar9580_1p0_rx_gain_table ar9462_common_rx_gain_table_2p0  static const u32 ar9580_1p0_radio_core[][2] = {  	/* Addr      allmodes  */ diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index a277cf6f339..b09285c36c4 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h @@ -214,6 +214,7 @@ struct ath_frame_info {  	enum ath9k_key_type keytype;  	u8 keyix;  	u8 retries; +	u8 rtscts_rate;  };  struct ath_buf_state { @@ -296,6 +297,8 @@ struct ath_tx {  	struct ath_txq txq[ATH9K_NUM_TX_QUEUES];  	struct ath_descdma txdma;  	struct ath_txq *txq_map[WME_NUM_AC]; +	u32 txq_max_pending[WME_NUM_AC]; +	u16 max_aggr_framelen[WME_NUM_AC][4][32];  };  struct ath_rx_edma { @@ -307,6 +310,7 @@ struct ath_rx {  	u8 defant;  	u8 rxotherant;  	u32 *rxlink; +	u32 num_pkts;  	unsigned int rxfilter;  	spinlock_t rxbuflock;  	struct list_head rxbuf; @@ -325,6 +329,9 @@ int ath_rx_init(struct ath_softc *sc, int nbufs);  void ath_rx_cleanup(struct ath_softc *sc);  int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp);  struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); +void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq); +void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq); +void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq);  void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq);  bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx);  void ath_draintxq(struct ath_softc *sc, @@ -336,6 +343,7 @@ int ath_tx_init(struct ath_softc *sc, int nbufs);  void ath_tx_cleanup(struct ath_softc *sc);  int ath_txq_update(struct ath_softc *sc, int qnum,  		   struct ath9k_tx_queue_info *q); +void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop);  int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,  		 struct ath_tx_control *txctl);  void ath_tx_tasklet(struct ath_softc *sc); @@ -355,7 +363,7 @@ void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc,  struct ath_vif {  	int av_bslot; -	bool is_bslot_active, primary_sta_vif; +	bool primary_sta_vif;  	__le64 tsf_adjust; /* TSF adjustment for staggered beacons */  	struct ath_buf *av_bcbuf;  }; @@ -381,6 +389,7 @@ struct ath_beacon_config {  	u16 dtim_period;  	u16 bmiss_timeout;  	u8 dtim_count; +	bool enable_beacon;  };  struct ath_beacon { @@ -392,7 +401,6 @@ struct ath_beacon {  	u32 beaconq;  	u32 bmisscnt; -	u32 ast_be_xmit;  	u32 bc_tstamp;  	struct ieee80211_vif *bslot[ATH_BCBUF];  	int slottime; @@ -406,17 +414,19 @@ struct ath_beacon {  	bool tx_last;  }; -void ath_beacon_tasklet(unsigned long data); -void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif); -int ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_vif *vif); -void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp); -int ath_beaconq_config(struct ath_softc *sc); -void ath_set_beacon(struct ath_softc *sc); +void ath9k_beacon_tasklet(unsigned long data); +bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif); +void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif, +			 u32 changed); +void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif); +void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif); +void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif); +void ath9k_set_beacon(struct ath_softc *sc);  void ath9k_set_beaconing_status(struct ath_softc *sc, bool status); -/*******/ -/* ANI */ -/*******/ +/*******************/ +/* Link Monitoring */ +/*******************/  #define ATH_STA_SHORT_CALINTERVAL 1000    /* 1 second */  #define ATH_AP_SHORT_CALINTERVAL  100     /* 100 ms */ @@ -427,7 +437,9 @@ void ath9k_set_beaconing_status(struct ath_softc *sc, bool status);  #define ATH_RESTART_CALINTERVAL   1200000 /* 20 minutes */  #define ATH_PAPRD_TIMEOUT	100 /* msecs */ +#define ATH_PLL_WORK_INTERVAL   100 +void ath_tx_complete_poll_work(struct work_struct *work);  void ath_reset_work(struct work_struct *work);  void ath_hw_check(struct work_struct *work);  void ath_hw_pll_work(struct work_struct *work); @@ -435,23 +447,35 @@ void ath_rx_poll(unsigned long data);  void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon);  void ath_paprd_calibrate(struct work_struct *work);  void ath_ani_calibrate(unsigned long data); -void ath_start_ani(struct ath_common *common); +void ath_start_ani(struct ath_softc *sc); +void ath_stop_ani(struct ath_softc *sc); +void ath_check_ani(struct ath_softc *sc); +int ath_update_survey_stats(struct ath_softc *sc); +void ath_update_survey_nf(struct ath_softc *sc, int channel); +void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);  /**********/  /* BTCOEX */  /**********/ +enum bt_op_flags { +	BT_OP_PRIORITY_DETECTED, +	BT_OP_SCAN, +}; +  struct ath_btcoex {  	bool hw_timer_enabled;  	spinlock_t btcoex_lock;  	struct timer_list period_timer; /* Timer for BT period */  	u32 bt_priority_cnt;  	unsigned long bt_priority_time; +	unsigned long op_flags;  	int bt_stomp_type; /* Types of BT stomping */  	u32 btcoex_no_stomp; /* in usec */  	u32 btcoex_period; /* in usec */  	u32 btscan_no_stomp; /* in usec */  	u32 duty_cycle; +	u32 bt_wait_time;  	struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */  	struct ath_mci_profile mci;  }; @@ -465,6 +489,7 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc);  void ath9k_btcoex_timer_pause(struct ath_softc *sc);  void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status);  u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen); +void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc);  #else  static inline int ath9k_init_btcoex(struct ath_softc *sc)  { @@ -488,8 +513,17 @@ static inline u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc,  {  	return 0;  } +static inline void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc) +{ +}  #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ +struct ath9k_wow_pattern { +	u8 pattern_bytes[MAX_PATTERN_SIZE]; +	u8 mask_bytes[MAX_PATTERN_SIZE]; +	u32 pattern_len; +}; +  /********************/  /*   LED Control    */  /********************/ @@ -513,8 +547,10 @@ static inline void ath_deinit_leds(struct ath_softc *sc)  }  #endif - +/*******************************/  /* Antenna diversity/combining */ +/*******************************/ +  #define ATH_ANT_RX_CURRENT_SHIFT 4  #define ATH_ANT_RX_MAIN_SHIFT 2  #define ATH_ANT_RX_MASK 0x3 @@ -567,6 +603,9 @@ struct ath_ant_comb {  	unsigned long scan_start_time;  }; +void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs); +void ath_ant_comb_update(struct ath_softc *sc); +  /********************/  /* Main driver core */  /********************/ @@ -584,15 +623,14 @@ struct ath_ant_comb {  #define ATH_TXPOWER_MAX         100     /* .5 dBm units */  #define ATH_RATE_DUMMY_MARKER   0 -#define SC_OP_INVALID                BIT(0) -#define SC_OP_BEACONS                BIT(1) -#define SC_OP_OFFCHANNEL             BIT(2) -#define SC_OP_RXFLUSH                BIT(3) -#define SC_OP_TSF_RESET              BIT(4) -#define SC_OP_BT_PRIORITY_DETECTED   BIT(5) -#define SC_OP_BT_SCAN                BIT(6) -#define SC_OP_ANI_RUN                BIT(7) -#define SC_OP_PRIM_STA_VIF           BIT(8) +enum sc_op_flags { +	SC_OP_INVALID, +	SC_OP_BEACONS, +	SC_OP_RXFLUSH, +	SC_OP_ANI_RUN, +	SC_OP_PRIM_STA_VIF, +	SC_OP_HW_RESET, +};  /* Powersave flags */  #define PS_WAIT_FOR_BEACON        BIT(0) @@ -638,9 +676,9 @@ struct ath_softc {  	struct completion paprd_complete;  	unsigned int hw_busy_count; +	unsigned long sc_flags;  	u32 intrstatus; -	u32 sc_flags; /* SC_OP_* */  	u16 ps_flags; /* PS_* */  	u16 curtxpow;  	bool ps_enabled; @@ -678,6 +716,7 @@ struct ath_softc {  #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT  	struct ath_btcoex btcoex;  	struct ath_mci_coex mci_coex; +	struct work_struct mci_work;  #endif  	struct ath_descdma txsdma; @@ -685,6 +724,13 @@ struct ath_softc {  	struct ath_ant_comb ant_comb;  	u8 ant_tx, ant_rx;  	struct dfs_pattern_detector *dfs_detector; +	u32 wow_enabled; + +#ifdef CONFIG_PM_SLEEP +	atomic_t wow_got_bmiss_intr; +	atomic_t wow_sleep_proc_intr; /* in the middle of WoW sleep ? */ +	u32 wow_intr_before_sleep; +#endif  };  void ath9k_tasklet(unsigned long data); @@ -700,6 +746,7 @@ extern int ath9k_modparam_nohwcrypt;  extern int led_blink;  extern bool is_ath9k_unloaded; +u8 ath9k_parse_mpdudensity(u8 mpdudensity);  irqreturn_t ath_isr(int irq, void *dev);  int ath9k_init_device(u16 devid, struct ath_softc *sc,  		    const struct ath_bus_ops *bus_ops); @@ -736,5 +783,4 @@ void ath9k_calculate_iter_data(struct ieee80211_hw *hw,  			       struct ieee80211_vif *vif,  			       struct ath9k_vif_iter_data *iter_data); -  #endif /* ATH9K_H */ diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 11bc55e3d69..76f07d8c272 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c @@ -30,7 +30,7 @@ static void ath9k_reset_beacon_status(struct ath_softc *sc)   *  the operating mode of the station (AP or AdHoc).  Parameters are AIFS   *  settings and channel width min/max  */ -int ath_beaconq_config(struct ath_softc *sc) +static void ath9k_beaconq_config(struct ath_softc *sc)  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); @@ -38,6 +38,7 @@ int ath_beaconq_config(struct ath_softc *sc)  	struct ath_txq *txq;  	ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi); +  	if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {  		/* Always burst out beacon and CAB traffic. */  		qi.tqi_aifs = 1; @@ -48,17 +49,17 @@ int ath_beaconq_config(struct ath_softc *sc)  		txq = sc->tx.txq_map[WME_AC_BE];  		ath9k_hw_get_txq_props(ah, txq->axq_qnum, &qi_be);  		qi.tqi_aifs = qi_be.tqi_aifs; -		qi.tqi_cwmin = 4*qi_be.tqi_cwmin; +		if (ah->slottime == ATH9K_SLOT_TIME_20) +			qi.tqi_cwmin = 2*qi_be.tqi_cwmin; +		else +			qi.tqi_cwmin = 4*qi_be.tqi_cwmin;  		qi.tqi_cwmax = qi_be.tqi_cwmax;  	}  	if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) { -		ath_err(common, -			"Unable to update h/w beacon queue parameters\n"); -		return 0; +		ath_err(common, "Unable to update h/w beacon queue parameters\n");  	} else {  		ath9k_hw_resettxqueue(ah, sc->beacon.beaconq); -		return 1;  	}  } @@ -67,7 +68,7 @@ int ath_beaconq_config(struct ath_softc *sc)   *  up rate codes, and channel flags. Beacons are always sent out at the   *  lowest rate, and are not retried.  */ -static void ath_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif, +static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,  			     struct ath_buf *bf, int rateidx)  {  	struct sk_buff *skb = bf->bf_mpdu; @@ -78,8 +79,6 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,  	u8 chainmask = ah->txchainmask;  	u8 rate = 0; -	ath9k_reset_beacon_status(sc); -  	sband = &sc->sbands[common->hw->conf.channel->band];  	rate = sband->bitrates[rateidx].hw_value;  	if (vif->bss_conf.use_short_preamble) @@ -108,7 +107,7 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,  	ath9k_hw_set_txdesc(ah, bf->bf_desc, &info);  } -static void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb) +static void ath9k_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)  {  	struct ath_softc *sc = hw->priv;  	struct ath_common *common = ath9k_hw_common(sc->sc_ah); @@ -125,28 +124,22 @@ static void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)  	}  } -static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, -					   struct ieee80211_vif *vif) +static struct ath_buf *ath9k_beacon_generate(struct ieee80211_hw *hw, +					     struct ieee80211_vif *vif)  {  	struct ath_softc *sc = hw->priv;  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_buf *bf; -	struct ath_vif *avp; +	struct ath_vif *avp = (void *)vif->drv_priv;  	struct sk_buff *skb; -	struct ath_txq *cabq; +	struct ath_txq *cabq = sc->beacon.cabq;  	struct ieee80211_tx_info *info; +	struct ieee80211_mgmt *mgmt_hdr;  	int cabq_depth; -	ath9k_reset_beacon_status(sc); - -	avp = (void *)vif->drv_priv; -	cabq = sc->beacon.cabq; - -	if ((avp->av_bcbuf == NULL) || !avp->is_bslot_active) +	if (avp->av_bcbuf == NULL)  		return NULL; -	/* Release the old beacon first */ -  	bf = avp->av_bcbuf;  	skb = bf->bf_mpdu;  	if (skb) { @@ -156,14 +149,14 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,  		bf->bf_buf_addr = 0;  	} -	/* Get a new beacon from mac80211 */ -  	skb = ieee80211_beacon_get(hw, vif); -	bf->bf_mpdu = skb;  	if (skb == NULL)  		return NULL; -	((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp = -		avp->tsf_adjust; + +	bf->bf_mpdu = skb; + +	mgmt_hdr = (struct ieee80211_mgmt *)skb->data; +	mgmt_hdr->u.beacon.timestamp = avp->tsf_adjust;  	info = IEEE80211_SKB_CB(skb);  	if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { @@ -209,61 +202,52 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,  		}  	} -	ath_beacon_setup(sc, vif, bf, info->control.rates[0].idx); +	ath9k_beacon_setup(sc, vif, bf, info->control.rates[0].idx);  	while (skb) { -		ath_tx_cabq(hw, skb); +		ath9k_tx_cabq(hw, skb);  		skb = ieee80211_get_buffered_bc(hw, vif);  	}  	return bf;  } -int ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_vif *vif) +void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif)  {  	struct ath_common *common = ath9k_hw_common(sc->sc_ah); -	struct ath_vif *avp; -	struct ath_buf *bf; -	struct sk_buff *skb; -	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; -	__le64 tstamp; - -	avp = (void *)vif->drv_priv; - -	/* Allocate a beacon descriptor if we haven't done so. */ -	if (!avp->av_bcbuf) { -		/* Allocate beacon state for hostap/ibss.  We know -		 * a buffer is available. */ -		avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, -						 struct ath_buf, list); -		list_del(&avp->av_bcbuf->list); +	struct ath_vif *avp = (void *)vif->drv_priv; +	int slot; -		if (ath9k_uses_beacons(vif->type)) { -			int slot; -			/* -			 * Assign the vif to a beacon xmit slot. As -			 * above, this cannot fail to find one. -			 */ -			avp->av_bslot = 0; -			for (slot = 0; slot < ATH_BCBUF; slot++) -				if (sc->beacon.bslot[slot] == NULL) { -					avp->av_bslot = slot; -					avp->is_bslot_active = false; +	avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, struct ath_buf, list); +	list_del(&avp->av_bcbuf->list); -					/* NB: keep looking for a double slot */ -					if (slot == 0 || !sc->beacon.bslot[slot-1]) -						break; -				} -			BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL); -			sc->beacon.bslot[avp->av_bslot] = vif; -			sc->nbcnvifs++; +	for (slot = 0; slot < ATH_BCBUF; slot++) { +		if (sc->beacon.bslot[slot] == NULL) { +			avp->av_bslot = slot; +			break;  		}  	} -	/* release the previous beacon frame, if it already exists. */ -	bf = avp->av_bcbuf; -	if (bf->bf_mpdu != NULL) { -		skb = bf->bf_mpdu; +	sc->beacon.bslot[avp->av_bslot] = vif; +	sc->nbcnvifs++; + +	ath_dbg(common, CONFIG, "Added interface at beacon slot: %d\n", +		avp->av_bslot); +} + +void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif) +{ +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); +	struct ath_vif *avp = (void *)vif->drv_priv; +	struct ath_buf *bf = avp->av_bcbuf; + +	ath_dbg(common, CONFIG, "Removing interface at beacon slot: %d\n", +		avp->av_bslot); + +	tasklet_disable(&sc->bcon_tasklet); + +	if (bf && bf->bf_mpdu) { +		struct sk_buff *skb = bf->bf_mpdu;  		dma_unmap_single(sc->dev, bf->bf_buf_addr,  				 skb->len, DMA_TO_DEVICE);  		dev_kfree_skb_any(skb); @@ -271,99 +255,74 @@ int ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_vif *vif)  		bf->bf_buf_addr = 0;  	} -	/* NB: the beacon data buffer must be 32-bit aligned. */ -	skb = ieee80211_beacon_get(sc->hw, vif); -	if (skb == NULL) -		return -ENOMEM; +	avp->av_bcbuf = NULL; +	sc->beacon.bslot[avp->av_bslot] = NULL; +	sc->nbcnvifs--; +	list_add_tail(&bf->list, &sc->beacon.bbuf); -	tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; -	sc->beacon.bc_tstamp = (u32) le64_to_cpu(tstamp); -	/* Calculate a TSF adjustment factor required for staggered beacons. */ -	if (avp->av_bslot > 0) { -		u64 tsfadjust; -		int intval; - -		intval = cur_conf->beacon_interval ? : ATH_DEFAULT_BINTVAL; +	tasklet_enable(&sc->bcon_tasklet); +} -		/* -		 * Calculate the TSF offset for this beacon slot, i.e., the -		 * number of usecs that need to be added to the timestamp field -		 * in Beacon and Probe Response frames. Beacon slot 0 is -		 * processed at the correct offset, so it does not require TSF -		 * adjustment. Other slots are adjusted to get the timestamp -		 * close to the TBTT for the BSS. -		 */ -		tsfadjust = TU_TO_USEC(intval * avp->av_bslot) / ATH_BCBUF; -		avp->tsf_adjust = cpu_to_le64(tsfadjust); +static int ath9k_beacon_choose_slot(struct ath_softc *sc) +{ +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); +	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; +	u16 intval; +	u32 tsftu; +	u64 tsf; +	int slot; -		ath_dbg(common, BEACON, -			"stagger beacons, bslot %d intval %u tsfadjust %llu\n", -			avp->av_bslot, intval, (unsigned long long)tsfadjust); +	if (sc->sc_ah->opmode != NL80211_IFTYPE_AP) { +		ath_dbg(common, BEACON, "slot 0, tsf: %llu\n", +			ath9k_hw_gettsf64(sc->sc_ah)); +		return 0; +	} -		((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp = -			avp->tsf_adjust; -	} else -		avp->tsf_adjust = cpu_to_le64(0); +	intval = cur_conf->beacon_interval ? : ATH_DEFAULT_BINTVAL; +	tsf = ath9k_hw_gettsf64(sc->sc_ah); +	tsf += TU_TO_USEC(sc->sc_ah->config.sw_beacon_response_time); +	tsftu = TSF_TO_TU((tsf * ATH_BCBUF) >>32, tsf * ATH_BCBUF); +	slot = (tsftu % (intval * ATH_BCBUF)) / intval; -	bf->bf_mpdu = skb; -	bf->bf_buf_addr = dma_map_single(sc->dev, skb->data, -					 skb->len, DMA_TO_DEVICE); -	if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) { -		dev_kfree_skb_any(skb); -		bf->bf_mpdu = NULL; -		bf->bf_buf_addr = 0; -		ath_err(common, "dma_mapping_error on beacon alloc\n"); -		return -ENOMEM; -	} -	avp->is_bslot_active = true; +	ath_dbg(common, BEACON, "slot: %d tsf: %llu tsftu: %u\n", +		slot, tsf, tsftu / ATH_BCBUF); -	return 0; +	return slot;  } -void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp) +void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif)  { -	if (avp->av_bcbuf != NULL) { -		struct ath_buf *bf; +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); +	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; +	struct ath_vif *avp = (void *)vif->drv_priv; +	u64 tsfadjust; -		avp->is_bslot_active = false; -		if (avp->av_bslot != -1) { -			sc->beacon.bslot[avp->av_bslot] = NULL; -			sc->nbcnvifs--; -			avp->av_bslot = -1; -		} +	if (avp->av_bslot == 0) +		return; -		bf = avp->av_bcbuf; -		if (bf->bf_mpdu != NULL) { -			struct sk_buff *skb = bf->bf_mpdu; -			dma_unmap_single(sc->dev, bf->bf_buf_addr, -					 skb->len, DMA_TO_DEVICE); -			dev_kfree_skb_any(skb); -			bf->bf_mpdu = NULL; -			bf->bf_buf_addr = 0; -		} -		list_add_tail(&bf->list, &sc->beacon.bbuf); +	tsfadjust = cur_conf->beacon_interval * avp->av_bslot / ATH_BCBUF; +	avp->tsf_adjust = cpu_to_le64(TU_TO_USEC(tsfadjust)); -		avp->av_bcbuf = NULL; -	} +	ath_dbg(common, CONFIG, "tsfadjust is: %llu for bslot: %d\n", +		(unsigned long long)tsfadjust, avp->av_bslot);  } -void ath_beacon_tasklet(unsigned long data) +void ath9k_beacon_tasklet(unsigned long data)  {  	struct ath_softc *sc = (struct ath_softc *)data; -	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah);  	struct ath_buf *bf = NULL;  	struct ieee80211_vif *vif;  	bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);  	int slot; -	u32 bfaddr, bc = 0; -	if (work_pending(&sc->hw_reset_work)) { +	if (test_bit(SC_OP_HW_RESET, &sc->sc_flags)) {  		ath_dbg(common, RESET,  			"reset work is pending, skip beaconing now\n");  		return;  	} +  	/*  	 * Check if the previous beacon has gone out.  If  	 * not don't try to post another, skip this period @@ -387,55 +346,25 @@ void ath_beacon_tasklet(unsigned long data)  		} else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) {  			ath_dbg(common, BSTUCK, "beacon is officially stuck\n");  			sc->beacon.bmisscnt = 0; -			sc->sc_flags |= SC_OP_TSF_RESET; -			ieee80211_queue_work(sc->hw, &sc->hw_reset_work); +			ath9k_queue_reset(sc, RESET_TYPE_BEACON_STUCK);  		}  		return;  	} -	/* -	 * Generate beacon frames. we are sending frames -	 * staggered so calculate the slot for this frame based -	 * on the tsf to safeguard against missing an swba. -	 */ - - -	if (ah->opmode == NL80211_IFTYPE_AP) { -		u16 intval; -		u32 tsftu; -		u64 tsf; - -		intval = cur_conf->beacon_interval ? : ATH_DEFAULT_BINTVAL; -		tsf = ath9k_hw_gettsf64(ah); -		tsf += TU_TO_USEC(ah->config.sw_beacon_response_time); -		tsftu = TSF_TO_TU((tsf * ATH_BCBUF) >>32, tsf * ATH_BCBUF); -		slot = (tsftu % (intval * ATH_BCBUF)) / intval; -		vif = sc->beacon.bslot[slot]; - -		ath_dbg(common, BEACON, -			"slot %d [tsf %llu tsftu %u intval %u] vif %p\n", -			slot, tsf, tsftu / ATH_BCBUF, intval, vif); -	} else { -		slot = 0; -		vif = sc->beacon.bslot[slot]; -	} +	slot = ath9k_beacon_choose_slot(sc); +	vif = sc->beacon.bslot[slot]; +	if (!vif || !vif->bss_conf.enable_beacon) +		return; -	bfaddr = 0; -	if (vif) { -		bf = ath_beacon_generate(sc->hw, vif); -		if (bf != NULL) { -			bfaddr = bf->bf_daddr; -			bc = 1; -		} +	bf = ath9k_beacon_generate(sc->hw, vif); +	WARN_ON(!bf); -		if (sc->beacon.bmisscnt != 0) { -			ath_dbg(common, BSTUCK, -				"resume beacon xmit after %u misses\n", -				sc->beacon.bmisscnt); -			sc->beacon.bmisscnt = 0; -		} +	if (sc->beacon.bmisscnt != 0) { +		ath_dbg(common, BSTUCK, "resume beacon xmit after %u misses\n", +			sc->beacon.bmisscnt); +		sc->beacon.bmisscnt = 0;  	}  	/* @@ -455,39 +384,40 @@ void ath_beacon_tasklet(unsigned long data)  	 *     set to ATH_BCBUF so this check is a noop.  	 */  	if (sc->beacon.updateslot == UPDATE) { -		sc->beacon.updateslot = COMMIT; /* commit next beacon */ +		sc->beacon.updateslot = COMMIT;  		sc->beacon.slotupdate = slot; -	} else if (sc->beacon.updateslot == COMMIT && sc->beacon.slotupdate == slot) { +	} else if (sc->beacon.updateslot == COMMIT && +		   sc->beacon.slotupdate == slot) {  		ah->slottime = sc->beacon.slottime;  		ath9k_hw_init_global_settings(ah);  		sc->beacon.updateslot = OK;  	} -	if (bfaddr != 0) { + +	if (bf) { +		ath9k_reset_beacon_status(sc); + +		ath_dbg(common, BEACON, +			"Transmitting beacon for slot: %d\n", slot); +  		/* NB: cabq traffic should already be queued and primed */ -		ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); +		ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);  		if (!edma)  			ath9k_hw_txstart(ah, sc->beacon.beaconq); - -		sc->beacon.ast_be_xmit += bc;     /* XXX per-vif? */  	}  } -static void ath9k_beacon_init(struct ath_softc *sc, -			      u32 next_beacon, -			      u32 beacon_period) +static void ath9k_beacon_init(struct ath_softc *sc, u32 nexttbtt, u32 intval)  { -	if (sc->sc_flags & SC_OP_TSF_RESET) { -		ath9k_ps_wakeup(sc); -		ath9k_hw_reset_tsf(sc->sc_ah); -	} - -	ath9k_hw_beaconinit(sc->sc_ah, next_beacon, beacon_period); +	struct ath_hw *ah = sc->sc_ah; -	if (sc->sc_flags & SC_OP_TSF_RESET) { -		ath9k_ps_restore(sc); -		sc->sc_flags &= ~SC_OP_TSF_RESET; -	} +	ath9k_hw_disable_interrupts(ah); +	ath9k_hw_reset_tsf(ah); +	ath9k_beaconq_config(sc); +	ath9k_hw_beaconinit(ah, nexttbtt, intval); +	sc->beacon.bmisscnt = 0; +	ath9k_hw_set_interrupts(ah); +	ath9k_hw_enable_interrupts(ah);  }  /* @@ -495,32 +425,27 @@ static void ath9k_beacon_init(struct ath_softc *sc,   * burst together.  For the former arrange for the SWBA to be delivered for each   * slot. Slots that are not occupied will generate nothing.   */ -static void ath_beacon_config_ap(struct ath_softc *sc, -				 struct ath_beacon_config *conf) +static void ath9k_beacon_config_ap(struct ath_softc *sc, +				   struct ath_beacon_config *conf)  {  	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah);  	u32 nexttbtt, intval;  	/* NB: the beacon interval is kept internally in TU's */  	intval = TU_TO_USEC(conf->beacon_interval); -	intval /= ATH_BCBUF;    /* for staggered beacons */ +	intval /= ATH_BCBUF;  	nexttbtt = intval; -	/* -	 * In AP mode we enable the beacon timers and SWBA interrupts to -	 * prepare beacon frames. -	 */ -	ah->imask |= ATH9K_INT_SWBA; -	ath_beaconq_config(sc); +	if (conf->enable_beacon) +		ah->imask |= ATH9K_INT_SWBA; +	else +		ah->imask &= ~ATH9K_INT_SWBA; -	/* Set the computed AP beacon timers */ +	ath_dbg(common, BEACON, "AP nexttbtt: %u intval: %u conf_intval: %u\n", +		nexttbtt, intval, conf->beacon_interval); -	ath9k_hw_disable_interrupts(ah); -	sc->sc_flags |= SC_OP_TSF_RESET;  	ath9k_beacon_init(sc, nexttbtt, intval); -	sc->beacon.bmisscnt = 0; -	ath9k_hw_set_interrupts(ah); -	ath9k_hw_enable_interrupts(ah);  }  /* @@ -531,8 +456,8 @@ static void ath_beacon_config_ap(struct ath_softc *sc,   * we'll receive a BMISS interrupt when we stop seeing beacons from the AP   * we've associated with.   */ -static void ath_beacon_config_sta(struct ath_softc *sc, -				  struct ath_beacon_config *conf) +static void ath9k_beacon_config_sta(struct ath_softc *sc, +				    struct ath_beacon_config *conf)  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); @@ -544,7 +469,7 @@ static void ath_beacon_config_sta(struct ath_softc *sc,  	int num_beacons, offset, dtim_dec_count, cfp_dec_count;  	/* No need to configure beacon if we are not associated */ -	if (!common->curaid) { +	if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {  		ath_dbg(common, BEACON,  			"STA is not yet associated..skipping beacon config\n");  		return; @@ -651,97 +576,65 @@ static void ath_beacon_config_sta(struct ath_softc *sc,  	ath9k_hw_enable_interrupts(ah);  } -static void ath_beacon_config_adhoc(struct ath_softc *sc, -				    struct ath_beacon_config *conf) +static void ath9k_beacon_config_adhoc(struct ath_softc *sc, +				      struct ath_beacon_config *conf)  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); -	u32 tsf, intval, nexttbtt; +	u32 intval, nexttbtt;  	ath9k_reset_beacon_status(sc); -	if (!(sc->sc_flags & SC_OP_BEACONS)) -		ath9k_hw_settsf64(ah, sc->beacon.bc_tstamp);  	intval = TU_TO_USEC(conf->beacon_interval); -	tsf = roundup(ath9k_hw_gettsf32(ah) + TU_TO_USEC(FUDGE), intval); -	nexttbtt = tsf + intval; - -	ath_dbg(common, BEACON, "IBSS nexttbtt %u intval %u (%u)\n", -		nexttbtt, intval, conf->beacon_interval); - -	/* -	 * In IBSS mode enable the beacon timers but only enable SWBA interrupts -	 * if we need to manually prepare beacon frames.  Otherwise we use a -	 * self-linked tx descriptor and let the hardware deal with things. -	 */ -	ah->imask |= ATH9K_INT_SWBA; +	nexttbtt = intval; -	ath_beaconq_config(sc); +	if (conf->enable_beacon) +		ah->imask |= ATH9K_INT_SWBA; +	else +		ah->imask &= ~ATH9K_INT_SWBA; -	/* Set the computed ADHOC beacon timers */ +	ath_dbg(common, BEACON, "IBSS nexttbtt: %u intval: %u conf_intval: %u\n", +		nexttbtt, intval, conf->beacon_interval); -	ath9k_hw_disable_interrupts(ah);  	ath9k_beacon_init(sc, nexttbtt, intval); -	sc->beacon.bmisscnt = 0; - -	ath9k_hw_set_interrupts(ah); -	ath9k_hw_enable_interrupts(ah);  } -static bool ath9k_allow_beacon_config(struct ath_softc *sc, -				      struct ieee80211_vif *vif) +bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)  { -	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;  	struct ath_common *common = ath9k_hw_common(sc->sc_ah); -	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;  	struct ath_vif *avp = (void *)vif->drv_priv; -	/* -	 * Can not have different beacon interval on multiple -	 * AP interface case -	 */ -	if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) && -	    (sc->nbcnvifs > 1) && -	    (vif->type == NL80211_IFTYPE_AP) && -	    (cur_conf->beacon_interval != bss_conf->beacon_int)) { -		ath_dbg(common, CONFIG, -			"Changing beacon interval of multiple AP interfaces !\n"); -		return false; -	} -	/* -	 * Can not configure station vif's beacon config -	 * while on AP opmode -	 */ -	if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) && -	    (vif->type != NL80211_IFTYPE_AP)) { -		ath_dbg(common, CONFIG, -			"STA vif's beacon not allowed on AP mode\n"); -		return false; +	if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { +		if ((vif->type != NL80211_IFTYPE_AP) || +		    (sc->nbcnvifs > 1)) { +			ath_dbg(common, CONFIG, +				"An AP interface is already present !\n"); +			return false; +		}  	} -	/* -	 * Do not allow beacon config if HW was already configured -	 * with another STA vif -	 */ -	if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) && -	    (vif->type == NL80211_IFTYPE_STATION) && -	    (sc->sc_flags & SC_OP_BEACONS) && -	    !avp->primary_sta_vif) { -		ath_dbg(common, CONFIG, -			"Beacon already configured for a station interface\n"); -		return false; + +	if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) { +		if ((vif->type == NL80211_IFTYPE_STATION) && +		    test_bit(SC_OP_BEACONS, &sc->sc_flags) && +		    !avp->primary_sta_vif) { +			ath_dbg(common, CONFIG, +				"Beacon already configured for a station interface\n"); +			return false; +		}  	} +  	return true;  } -void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) +static void ath9k_cache_beacon_config(struct ath_softc *sc, +				      struct ieee80211_bss_conf *bss_conf)  { +	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; -	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; -	if (!ath9k_allow_beacon_config(sc, vif)) -		return; +	ath_dbg(common, BEACON, +		"Caching beacon data for BSS: %pM\n", bss_conf->bssid); -	/* Setup the beacon configuration parameters */  	cur_conf->beacon_interval = bss_conf->beacon_int;  	cur_conf->dtim_period = bss_conf->dtim_period;  	cur_conf->listen_interval = 1; @@ -766,73 +659,62 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)  	if (cur_conf->dtim_period == 0)  		cur_conf->dtim_period = 1; -	ath_set_beacon(sc);  } -static bool ath_has_valid_bslot(struct ath_softc *sc) +void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif, +			 u32 changed)  { -	struct ath_vif *avp; -	int slot; -	bool found = false; +	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; +	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; -	for (slot = 0; slot < ATH_BCBUF; slot++) { -		if (sc->beacon.bslot[slot]) { -			avp = (void *)sc->beacon.bslot[slot]->drv_priv; -			if (avp->is_bslot_active) { -				found = true; -				break; +	if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) { +		ath9k_cache_beacon_config(sc, bss_conf); +		ath9k_set_beacon(sc); +		set_bit(SC_OP_BEACONS, &sc->sc_flags); +	} else { +		/* +		 * Take care of multiple interfaces when +		 * enabling/disabling SWBA. +		 */ +		if (changed & BSS_CHANGED_BEACON_ENABLED) { +			if (!bss_conf->enable_beacon && +			    (sc->nbcnvifs <= 1)) { +				cur_conf->enable_beacon = false; +			} else if (bss_conf->enable_beacon) { +				cur_conf->enable_beacon = true; +				ath9k_cache_beacon_config(sc, bss_conf);  			}  		} + +		if (cur_conf->beacon_interval) { +			ath9k_set_beacon(sc); + +			if (cur_conf->enable_beacon) +				set_bit(SC_OP_BEACONS, &sc->sc_flags); +			else +				clear_bit(SC_OP_BEACONS, &sc->sc_flags); +		}  	} -	return found;  } - -void ath_set_beacon(struct ath_softc *sc) +void ath9k_set_beacon(struct ath_softc *sc)  {  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;  	switch (sc->sc_ah->opmode) {  	case NL80211_IFTYPE_AP: -		if (ath_has_valid_bslot(sc)) -			ath_beacon_config_ap(sc, cur_conf); +		ath9k_beacon_config_ap(sc, cur_conf);  		break;  	case NL80211_IFTYPE_ADHOC:  	case NL80211_IFTYPE_MESH_POINT: -		ath_beacon_config_adhoc(sc, cur_conf); +		ath9k_beacon_config_adhoc(sc, cur_conf);  		break;  	case NL80211_IFTYPE_STATION: -		ath_beacon_config_sta(sc, cur_conf); +		ath9k_beacon_config_sta(sc, cur_conf);  		break;  	default:  		ath_dbg(common, CONFIG, "Unsupported beaconing mode\n");  		return;  	} - -	sc->sc_flags |= SC_OP_BEACONS; -} - -void ath9k_set_beaconing_status(struct ath_softc *sc, bool status) -{ -	struct ath_hw *ah = sc->sc_ah; - -	if (!ath_has_valid_bslot(sc)) { -		sc->sc_flags &= ~SC_OP_BEACONS; -		return; -	} - -	ath9k_ps_wakeup(sc); -	if (status) { -		/* Re-enable beaconing */ -		ah->imask |= ATH9K_INT_SWBA; -		ath9k_hw_set_interrupts(ah); -	} else { -		/* Disable SWBA interrupt */ -		ah->imask &= ~ATH9K_INT_SWBA; -		ath9k_hw_set_interrupts(ah); -		tasklet_kill(&sc->bcon_tasklet); -		ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); -	} -	ath9k_ps_restore(sc);  } diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c index 1ca6da80d4a..acd437384fe 100644 --- a/drivers/net/wireless/ath/ath9k/btcoex.c +++ b/drivers/net/wireless/ath/ath9k/btcoex.c @@ -336,10 +336,16 @@ static void ar9003_btcoex_bt_stomp(struct ath_hw *ah,  			 enum ath_stomp_type stomp_type)  {  	struct ath_btcoex_hw *btcoex = &ah->btcoex_hw; -	const u32 *weight = AR_SREV_9462(ah) ? ar9003_wlan_weights[stomp_type] : -					       ar9462_wlan_weights[stomp_type]; +	const u32 *weight = ar9003_wlan_weights[stomp_type];  	int i; +	if (AR_SREV_9462(ah)) { +		if ((stomp_type == ATH_BTCOEX_STOMP_LOW) && +		    btcoex->mci.stomp_ftp) +			stomp_type = ATH_BTCOEX_STOMP_LOW_FTP; +		weight = ar9462_wlan_weights[stomp_type]; +	} +  	for (i = 0; i < AR9300_NUM_WLAN_WEIGHTS; i++) {  		btcoex->bt_weight[i] = AR9300_BT_WGHT;  		btcoex->wlan_weight[i] = weight[i]; diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h index 3a1e1cfabd5..20092f98658 100644 --- a/drivers/net/wireless/ath/ath9k/btcoex.h +++ b/drivers/net/wireless/ath/ath9k/btcoex.h @@ -36,6 +36,9 @@  #define ATH_BT_CNT_THRESHOLD	       3  #define ATH_BT_CNT_SCAN_THRESHOLD      15 +#define ATH_BTCOEX_RX_WAIT_TIME       100 +#define ATH_BTCOEX_STOMP_FTP_THRESH   5 +  #define AR9300_NUM_BT_WEIGHTS   4  #define AR9300_NUM_WLAN_WEIGHTS 4  /* Defines the BT AR_BT_COEX_WGHT used */ @@ -80,6 +83,7 @@ struct ath9k_hw_mci {  	u8 bt_ver_major;  	u8 bt_ver_minor;  	u8 bt_state; +	u8 stomp_ftp;  };  struct ath_btcoex_hw { diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h index 3b33996d97d..1060c19a501 100644 --- a/drivers/net/wireless/ath/ath9k/calib.h +++ b/drivers/net/wireless/ath/ath9k/calib.h @@ -30,10 +30,10 @@ struct ar5416IniArray {  	u32 ia_columns;  }; -#define INIT_INI_ARRAY(iniarray, array, rows, columns) do {	\ +#define INIT_INI_ARRAY(iniarray, array) do {	\  		(iniarray)->ia_array = (u32 *)(array);		\ -		(iniarray)->ia_rows = (rows);			\ -		(iniarray)->ia_columns = (columns);		\ +		(iniarray)->ia_rows = ARRAY_SIZE(array);	\ +		(iniarray)->ia_columns = ARRAY_SIZE(array[0]);	\  	} while (0)  #define INI_RA(iniarray, row, column) \ diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index fde700c4e49..68b643c8943 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c @@ -205,11 +205,10 @@ static ssize_t write_file_disable_ani(struct file *file,  	common->disable_ani = !!disable_ani;  	if (disable_ani) { -		sc->sc_flags &= ~SC_OP_ANI_RUN; -		del_timer_sync(&common->ani.timer); +		clear_bit(SC_OP_ANI_RUN, &sc->sc_flags); +		ath_stop_ani(sc);  	} else { -		sc->sc_flags |= SC_OP_ANI_RUN; -		ath_start_ani(common); +		ath_check_ani(sc);  	}  	return count; @@ -348,8 +347,6 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status)  		sc->debug.stats.istats.txok++;  	if (status & ATH9K_INT_TXURN)  		sc->debug.stats.istats.txurn++; -	if (status & ATH9K_INT_MIB) -		sc->debug.stats.istats.mib++;  	if (status & ATH9K_INT_RXPHY)  		sc->debug.stats.istats.rxphyerr++;  	if (status & ATH9K_INT_RXKCM) @@ -374,6 +371,8 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status)  		sc->debug.stats.istats.dtim++;  	if (status & ATH9K_INT_TSFOOR)  		sc->debug.stats.istats.tsfoor++; +	if (status & ATH9K_INT_MCI) +		sc->debug.stats.istats.mci++;  }  static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, @@ -418,6 +417,7 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf,  	PR_IS("DTIMSYNC", dtimsync);  	PR_IS("DTIM", dtim);  	PR_IS("TSFOOR", tsfoor); +	PR_IS("MCI", mci);  	PR_IS("TOTAL", total);  	len += snprintf(buf + len, mxlen - len, @@ -1318,7 +1318,7 @@ static int open_file_bb_mac_samps(struct inode *inode, struct file *file)  	u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;  	u8 nread; -	if (sc->sc_flags & SC_OP_INVALID) +	if (test_bit(SC_OP_INVALID, &sc->sc_flags))  		return -EAGAIN;  	buf = vmalloc(size); @@ -1555,6 +1555,14 @@ int ath9k_init_debug(struct ath_hw *ah)  			    &fops_interrupt);  	debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc,  			    &fops_xmit); +	debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +			   &sc->tx.txq_max_pending[WME_AC_BK]); +	debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +			   &sc->tx.txq_max_pending[WME_AC_BE]); +	debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +			   &sc->tx.txq_max_pending[WME_AC_VI]); +	debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +			   &sc->tx.txq_max_pending[WME_AC_VO]);  	debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc,  			    &fops_stations);  	debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy, sc, diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h index c34da09d910..8b9d080d89d 100644 --- a/drivers/net/wireless/ath/ath9k/debug.h +++ b/drivers/net/wireless/ath/ath9k/debug.h @@ -32,6 +32,19 @@ struct ath_buf;  #define RESET_STAT_INC(sc, type) do { } while (0)  #endif +enum ath_reset_type { +	RESET_TYPE_BB_HANG, +	RESET_TYPE_BB_WATCHDOG, +	RESET_TYPE_FATAL_INT, +	RESET_TYPE_TX_ERROR, +	RESET_TYPE_TX_HANG, +	RESET_TYPE_PLL_HANG, +	RESET_TYPE_MAC_HANG, +	RESET_TYPE_BEACON_STUCK, +	RESET_TYPE_MCI, +	__RESET_TYPE_MAX +}; +  #ifdef CONFIG_ATH9K_DEBUGFS  /** @@ -86,6 +99,7 @@ struct ath_interrupt_stats {  	u32 dtim;  	u32 bb_watchdog;  	u32 tsfoor; +	u32 mci;  	/* Sync-cause stats */  	u32 sync_cause_all; @@ -208,17 +222,6 @@ struct ath_rx_stats {  	u32 rx_frags;  }; -enum ath_reset_type { -	RESET_TYPE_BB_HANG, -	RESET_TYPE_BB_WATCHDOG, -	RESET_TYPE_FATAL_INT, -	RESET_TYPE_TX_ERROR, -	RESET_TYPE_TX_HANG, -	RESET_TYPE_PLL_HANG, -	RESET_TYPE_MAC_HANG, -	__RESET_TYPE_MAX -}; -  struct ath_stats {  	struct ath_interrupt_stats istats;  	struct ath_tx_stats txstats[ATH9K_NUM_TX_QUEUES]; diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h index 33acb920ed3..484b3130590 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom.h +++ b/drivers/net/wireless/ath/ath9k/eeprom.h @@ -241,16 +241,12 @@ enum eeprom_param {  	EEP_TEMPSENSE_SLOPE,  	EEP_TEMPSENSE_SLOPE_PAL_ON,  	EEP_PWR_TABLE_OFFSET, -	EEP_DRIVE_STRENGTH, -	EEP_INTERNAL_REGULATOR, -	EEP_SWREG,  	EEP_PAPRD,  	EEP_MODAL_VER,  	EEP_ANT_DIV_CTL1,  	EEP_CHAIN_MASK_REDUCE,  	EEP_ANTENNA_GAIN_2G,  	EEP_ANTENNA_GAIN_5G, -	EEP_QUICK_DROP  };  enum ar5416_rates { diff --git a/drivers/net/wireless/ath/ath9k/eeprom_4k.c b/drivers/net/wireless/ath/ath9k/eeprom_4k.c index 4322ac80c20..7d075105a85 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c @@ -135,7 +135,7 @@ static u32 ath9k_hw_4k_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,  	if (!dump_base_hdr) {  		len += snprintf(buf + len, size - len,  				"%20s :\n", "2GHz modal Header"); -		len += ath9k_dump_4k_modal_eeprom(buf, len, size, +		len = ath9k_dump_4k_modal_eeprom(buf, len, size,  						  &eep->modalHeader);  		goto out;  	} @@ -188,8 +188,7 @@ static int ath9k_hw_4k_check_eeprom(struct ath_hw *ah)  {  #define EEPROM_4K_SIZE (sizeof(struct ar5416_eeprom_4k) / sizeof(u16))  	struct ath_common *common = ath9k_hw_common(ah); -	struct ar5416_eeprom_4k *eep = -		(struct ar5416_eeprom_4k *) &ah->eeprom.map4k; +	struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k;  	u16 *eepdata, temp, magic, magic2;  	u32 sum = 0, el;  	bool need_swap = false; diff --git a/drivers/net/wireless/ath/ath9k/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c index aa614767adf..cd742fb944c 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c @@ -132,7 +132,7 @@ static u32 ath9k_hw_ar9287_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,  	if (!dump_base_hdr) {  		len += snprintf(buf + len, size - len,  				"%20s :\n", "2GHz modal Header"); -		len += ar9287_dump_modal_eeprom(buf, len, size, +		len = ar9287_dump_modal_eeprom(buf, len, size,  						&eep->modalHeader);  		goto out;  	} diff --git a/drivers/net/wireless/ath/ath9k/eeprom_def.c b/drivers/net/wireless/ath/ath9k/eeprom_def.c index b5fba8b18b8..a8ac30a0072 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_def.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c @@ -211,11 +211,11 @@ static u32 ath9k_hw_def_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,  	if (!dump_base_hdr) {  		len += snprintf(buf + len, size - len,  				"%20s :\n", "2GHz modal Header"); -		len += ath9k_def_dump_modal_eeprom(buf, len, size, +		len = ath9k_def_dump_modal_eeprom(buf, len, size,  						   &eep->modalHeader[0]);  		len += snprintf(buf + len, size - len,  				"%20s :\n", "5GHz modal Header"); -		len += ath9k_def_dump_modal_eeprom(buf, len, size, +		len = ath9k_def_dump_modal_eeprom(buf, len, size,  						   &eep->modalHeader[1]);  		goto out;  	} @@ -264,8 +264,7 @@ static u32 ath9k_hw_def_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,  static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)  { -	struct ar5416_eeprom_def *eep = -		(struct ar5416_eeprom_def *) &ah->eeprom.def; +	struct ar5416_eeprom_def *eep = &ah->eeprom.def;  	struct ath_common *common = ath9k_hw_common(ah);  	u16 *eepdata, temp, magic, magic2;  	u32 sum = 0, el; diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index 281a9af0f1b..bacdb8fb4ef 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c @@ -132,17 +132,18 @@ static void ath_detect_bt_priority(struct ath_softc *sc)  	if (time_after(jiffies, btcoex->bt_priority_time +  			msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { -		sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); +		clear_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags); +		clear_bit(BT_OP_SCAN, &btcoex->op_flags);  		/* Detect if colocated bt started scanning */  		if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) {  			ath_dbg(ath9k_hw_common(sc->sc_ah), BTCOEX,  				"BT scan detected\n"); -			sc->sc_flags |= (SC_OP_BT_SCAN | -					 SC_OP_BT_PRIORITY_DETECTED); +			set_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags); +			set_bit(BT_OP_SCAN, &btcoex->op_flags);  		} else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) {  			ath_dbg(ath9k_hw_common(sc->sc_ah), BTCOEX,  				"BT priority traffic detected\n"); -			sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; +			set_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags);  		}  		btcoex->bt_priority_cnt = 0; @@ -190,13 +191,34 @@ static void ath_btcoex_period_timer(unsigned long data)  	struct ath_softc *sc = (struct ath_softc *) data;  	struct ath_hw *ah = sc->sc_ah;  	struct ath_btcoex *btcoex = &sc->btcoex; +	struct ath_mci_profile *mci = &btcoex->mci;  	u32 timer_period;  	bool is_btscan; +	unsigned long flags; + +	spin_lock_irqsave(&sc->sc_pm_lock, flags); +	if (sc->sc_ah->power_mode == ATH9K_PM_NETWORK_SLEEP) { +		spin_unlock_irqrestore(&sc->sc_pm_lock, flags); +		goto skip_hw_wakeup; +	} +	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);  	ath9k_ps_wakeup(sc);  	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI))  		ath_detect_bt_priority(sc); -	is_btscan = sc->sc_flags & SC_OP_BT_SCAN; +	is_btscan = test_bit(BT_OP_SCAN, &btcoex->op_flags); + +	btcoex->bt_wait_time += btcoex->btcoex_period; +	if (btcoex->bt_wait_time > ATH_BTCOEX_RX_WAIT_TIME) { +		if (ar9003_mci_state(ah, MCI_STATE_NEED_FTP_STOMP) && +		    (mci->num_pan || mci->num_other_acl)) +			ah->btcoex_hw.mci.stomp_ftp = +				(sc->rx.num_pkts < ATH_BTCOEX_STOMP_FTP_THRESH); +		else +			ah->btcoex_hw.mci.stomp_ftp = false; +		btcoex->bt_wait_time = 0; +		sc->rx.num_pkts = 0; +	}  	spin_lock_bh(&btcoex->btcoex_lock); @@ -218,9 +240,9 @@ static void ath_btcoex_period_timer(unsigned long data)  	}  	ath9k_ps_restore(sc); -	timer_period = btcoex->btcoex_period / 1000; -	mod_timer(&btcoex->period_timer, jiffies + -				  msecs_to_jiffies(timer_period)); +skip_hw_wakeup: +	timer_period = btcoex->btcoex_period; +	mod_timer(&btcoex->period_timer, jiffies + msecs_to_jiffies(timer_period));  }  /* @@ -233,14 +255,14 @@ static void ath_btcoex_no_stomp_timer(void *arg)  	struct ath_hw *ah = sc->sc_ah;  	struct ath_btcoex *btcoex = &sc->btcoex;  	struct ath_common *common = ath9k_hw_common(ah); -	bool is_btscan = sc->sc_flags & SC_OP_BT_SCAN;  	ath_dbg(common, BTCOEX, "no stomp timer running\n");  	ath9k_ps_wakeup(sc);  	spin_lock_bh(&btcoex->btcoex_lock); -	if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan) +	if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || +	    test_bit(BT_OP_SCAN, &btcoex->op_flags))  		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE);  	 else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL)  		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); @@ -254,10 +276,10 @@ static int ath_init_btcoex_timer(struct ath_softc *sc)  {  	struct ath_btcoex *btcoex = &sc->btcoex; -	btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000; -	btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * +	btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD; +	btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * 1000 *  		btcoex->btcoex_period / 100; -	btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * +	btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * 1000 *  				   btcoex->btcoex_period / 100;  	setup_timer(&btcoex->period_timer, ath_btcoex_period_timer, @@ -292,7 +314,8 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)  	btcoex->bt_priority_cnt = 0;  	btcoex->bt_priority_time = jiffies; -	sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); +	clear_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags); +	clear_bit(BT_OP_SCAN, &btcoex->op_flags);  	mod_timer(&btcoex->period_timer, jiffies);  } @@ -314,14 +337,22 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc)  	btcoex->hw_timer_enabled = false;  } +void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc) +{ +	struct ath_btcoex *btcoex = &sc->btcoex; + +	ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); +} +  u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)  { +	struct ath_btcoex *btcoex = &sc->btcoex;  	struct ath_mci_profile *mci = &sc->btcoex.mci;  	u16 aggr_limit = 0;  	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && mci->aggr_limit)  		aggr_limit = (max_4ms_framelen * mci->aggr_limit) >> 4; -	else if (sc->sc_flags & SC_OP_BT_PRIORITY_DETECTED) +	else if (test_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags))  		aggr_limit = min((max_4ms_framelen * 3) / 8,  				 (u32)ATH_AMPDU_LIMIT_MAX); @@ -362,9 +393,9 @@ void ath9k_stop_btcoex(struct ath_softc *sc)  	if (ah->btcoex_hw.enabled &&  	    ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) { -		ath9k_hw_btcoex_disable(ah);  		if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)  			ath9k_btcoex_timer_pause(sc); +		ath9k_hw_btcoex_disable(ah);  		if (AR_SREV_9462(ah))  			ath_mci_flush_profile(&sc->btcoex.mci);  	} @@ -372,11 +403,13 @@ void ath9k_stop_btcoex(struct ath_softc *sc)  void ath9k_deinit_btcoex(struct ath_softc *sc)  { +	struct ath_hw *ah = sc->sc_ah; +          if ((sc->btcoex.no_stomp_timer) &&  	    ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_3WIRE)  		ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer); -	if (AR_SREV_9462(sc->sc_ah)) +	if (ath9k_hw_mci_is_enabled(ah))  		ath_mci_cleanup(sc);  } @@ -402,7 +435,7 @@ int ath9k_init_btcoex(struct ath_softc *sc)  		txq = sc->tx.txq_map[WME_AC_BE];  		ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum);  		sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW; -		if (AR_SREV_9462(ah)) { +		if (ath9k_hw_mci_is_enabled(ah)) {  			sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE;  			INIT_LIST_HEAD(&sc->btcoex.mci.info); diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 135795257d9..936e920fb88 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h @@ -453,7 +453,6 @@ struct ath9k_htc_priv {  	u8 num_sta_assoc_vif;  	u8 num_ap_vif; -	u16 op_flags;  	u16 curtxpow;  	u16 txpowlimit;  	u16 nvifs; @@ -461,6 +460,7 @@ struct ath9k_htc_priv {  	bool rearm_ani;  	bool reconfig_beacon;  	unsigned int rxfilter; +	unsigned long op_flags;  	struct ath9k_hw_cal_data caldata;  	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; @@ -572,8 +572,6 @@ bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,  void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);  void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw); -void ath9k_htc_radio_enable(struct ieee80211_hw *hw); -void ath9k_htc_radio_disable(struct ieee80211_hw *hw);  #ifdef CONFIG_MAC80211_LEDS  void ath9k_init_leds(struct ath9k_htc_priv *priv); diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c index 2eadffb7971..77d541feb91 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c @@ -207,9 +207,9 @@ static void ath9k_htc_beacon_config_ap(struct ath9k_htc_priv *priv,  	else  		priv->ah->config.sw_beacon_response_time = MIN_SWBA_RESPONSE; -	if (priv->op_flags & OP_TSF_RESET) { +	if (test_bit(OP_TSF_RESET, &priv->op_flags)) {  		ath9k_hw_reset_tsf(priv->ah); -		priv->op_flags &= ~OP_TSF_RESET; +		clear_bit(OP_TSF_RESET, &priv->op_flags);  	} else {  		/*  		 * Pull nexttbtt forward to reflect the current TSF. @@ -221,7 +221,7 @@ static void ath9k_htc_beacon_config_ap(struct ath9k_htc_priv *priv,  		} while (nexttbtt < tsftu);  	} -	if (priv->op_flags & OP_ENABLE_BEACON) +	if (test_bit(OP_ENABLE_BEACON, &priv->op_flags))  		imask |= ATH9K_INT_SWBA;  	ath_dbg(common, CONFIG, @@ -269,7 +269,7 @@ static void ath9k_htc_beacon_config_adhoc(struct ath9k_htc_priv *priv,  	else  		priv->ah->config.sw_beacon_response_time = MIN_SWBA_RESPONSE; -	if (priv->op_flags & OP_ENABLE_BEACON) +	if (test_bit(OP_ENABLE_BEACON, &priv->op_flags))  		imask |= ATH9K_INT_SWBA;  	ath_dbg(common, CONFIG, @@ -365,7 +365,7 @@ static void ath9k_htc_send_beacon(struct ath9k_htc_priv *priv,  	vif = priv->cur_beacon_conf.bslot[slot];  	avp = (struct ath9k_htc_vif *)vif->drv_priv; -	if (unlikely(priv->op_flags & OP_SCANNING)) { +	if (unlikely(test_bit(OP_SCANNING, &priv->op_flags))) {  		spin_unlock_bh(&priv->beacon_lock);  		return;  	} diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c b/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c index 1c10e2e5c23..07df279c8d4 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c @@ -37,17 +37,18 @@ static void ath_detect_bt_priority(struct ath9k_htc_priv *priv)  	if (time_after(jiffies, btcoex->bt_priority_time +  			msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { -		priv->op_flags &= ~(OP_BT_PRIORITY_DETECTED | OP_BT_SCAN); +		clear_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags); +		clear_bit(OP_BT_SCAN, &priv->op_flags);  		/* Detect if colocated bt started scanning */  		if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) {  			ath_dbg(ath9k_hw_common(ah), BTCOEX,  				"BT scan detected\n"); -			priv->op_flags |= (OP_BT_SCAN | -					 OP_BT_PRIORITY_DETECTED); +			set_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags); +			set_bit(OP_BT_SCAN, &priv->op_flags);  		} else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) {  			ath_dbg(ath9k_hw_common(ah), BTCOEX,  				"BT priority traffic detected\n"); -			priv->op_flags |= OP_BT_PRIORITY_DETECTED; +			set_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags);  		}  		btcoex->bt_priority_cnt = 0; @@ -67,26 +68,23 @@ static void ath_btcoex_period_work(struct work_struct *work)  	struct ath_btcoex *btcoex = &priv->btcoex;  	struct ath_common *common = ath9k_hw_common(priv->ah);  	u32 timer_period; -	bool is_btscan;  	int ret;  	ath_detect_bt_priority(priv); -	is_btscan = !!(priv->op_flags & OP_BT_SCAN); -  	ret = ath9k_htc_update_cap_target(priv, -				  !!(priv->op_flags & OP_BT_PRIORITY_DETECTED)); +			  test_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags));  	if (ret) {  		ath_err(common, "Unable to set BTCOEX parameters\n");  		return;  	} -	ath9k_hw_btcoex_bt_stomp(priv->ah, is_btscan ? ATH_BTCOEX_STOMP_ALL : -			btcoex->bt_stomp_type); +	ath9k_hw_btcoex_bt_stomp(priv->ah, test_bit(OP_BT_SCAN, &priv->op_flags) ? +				 ATH_BTCOEX_STOMP_ALL : btcoex->bt_stomp_type);  	ath9k_hw_btcoex_enable(priv->ah); -	timer_period = is_btscan ? btcoex->btscan_no_stomp : -		btcoex->btcoex_no_stomp; +	timer_period = test_bit(OP_BT_SCAN, &priv->op_flags) ? +		btcoex->btscan_no_stomp : btcoex->btcoex_no_stomp;  	ieee80211_queue_delayed_work(priv->hw, &priv->duty_cycle_work,  				     msecs_to_jiffies(timer_period));  	ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work, @@ -104,14 +102,15 @@ static void ath_btcoex_duty_cycle_work(struct work_struct *work)  	struct ath_hw *ah = priv->ah;  	struct ath_btcoex *btcoex = &priv->btcoex;  	struct ath_common *common = ath9k_hw_common(ah); -	bool is_btscan = priv->op_flags & OP_BT_SCAN;  	ath_dbg(common, BTCOEX, "time slice work for bt and wlan\n"); -	if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan) +	if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || +	    test_bit(OP_BT_SCAN, &priv->op_flags))  		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE);  	else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL)  		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); +  	ath9k_hw_btcoex_enable(priv->ah);  } @@ -141,7 +140,8 @@ static void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv)  	btcoex->bt_priority_cnt = 0;  	btcoex->bt_priority_time = jiffies; -	priv->op_flags &= ~(OP_BT_PRIORITY_DETECTED | OP_BT_SCAN); +	clear_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags); +	clear_bit(OP_BT_SCAN, &priv->op_flags);  	ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work, 0);  } @@ -310,95 +310,3 @@ void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv)  	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)  		wiphy_rfkill_start_polling(priv->hw->wiphy);  } - -void ath9k_htc_radio_enable(struct ieee80211_hw *hw) -{ -	struct ath9k_htc_priv *priv = hw->priv; -	struct ath_hw *ah = priv->ah; -	struct ath_common *common = ath9k_hw_common(ah); -	int ret; -	u8 cmd_rsp; - -	if (!ah->curchan) -		ah->curchan = ath9k_cmn_get_curchannel(hw, ah); - -	/* Reset the HW */ -	ret = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); -	if (ret) { -		ath_err(common, -			"Unable to reset hardware; reset status %d (freq %u MHz)\n", -			ret, ah->curchan->channel); -	} - -	ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit, -			       &priv->curtxpow); - -	/* Start RX */ -	WMI_CMD(WMI_START_RECV_CMDID); -	ath9k_host_rx_init(priv); - -	/* Start TX */ -	htc_start(priv->htc); -	spin_lock_bh(&priv->tx.tx_lock); -	priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP; -	spin_unlock_bh(&priv->tx.tx_lock); -	ieee80211_wake_queues(hw); - -	WMI_CMD(WMI_ENABLE_INTR_CMDID); - -	/* Enable LED */ -	ath9k_hw_cfg_output(ah, ah->led_pin, -			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -	ath9k_hw_set_gpio(ah, ah->led_pin, 0); -} - -void ath9k_htc_radio_disable(struct ieee80211_hw *hw) -{ -	struct ath9k_htc_priv *priv = hw->priv; -	struct ath_hw *ah = priv->ah; -	struct ath_common *common = ath9k_hw_common(ah); -	int ret; -	u8 cmd_rsp; - -	ath9k_htc_ps_wakeup(priv); - -	/* Disable LED */ -	ath9k_hw_set_gpio(ah, ah->led_pin, 1); -	ath9k_hw_cfg_gpio_input(ah, ah->led_pin); - -	WMI_CMD(WMI_DISABLE_INTR_CMDID); - -	/* Stop TX */ -	ieee80211_stop_queues(hw); -	ath9k_htc_tx_drain(priv); -	WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); - -	/* Stop RX */ -	WMI_CMD(WMI_STOP_RECV_CMDID); - -	/* Clear the WMI event queue */ -	ath9k_wmi_event_drain(priv); - -	/* -	 * The MIB counters have to be disabled here, -	 * since the target doesn't do it. -	 */ -	ath9k_hw_disable_mib_counters(ah); - -	if (!ah->curchan) -		ah->curchan = ath9k_cmn_get_curchannel(hw, ah); - -	/* Reset the HW */ -	ret = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); -	if (ret) { -		ath_err(common, -			"Unable to reset hardware; reset status %d (freq %u MHz)\n", -			ret, ah->curchan->channel); -	} - -	/* Disable the PHY */ -	ath9k_hw_phy_disable(ah); - -	ath9k_htc_ps_restore(priv); -	ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP); -} diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c index 25213d521bc..a035a380d66 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c @@ -611,7 +611,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,  	struct ath_common *common;  	int i, ret = 0, csz = 0; -	priv->op_flags |= OP_INVALID; +	set_bit(OP_INVALID, &priv->op_flags);  	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);  	if (!ah) @@ -718,7 +718,7 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,  	hw->queues = 4;  	hw->channel_change_time = 5000; -	hw->max_listen_interval = 10; +	hw->max_listen_interval = 1;  	hw->vif_data_size = sizeof(struct ath9k_htc_vif);  	hw->sta_data_size = sizeof(struct ath9k_htc_sta); diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 2b8f61c210e..c785129692f 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c @@ -75,14 +75,19 @@ unlock:  void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv)  { +	bool reset; +  	mutex_lock(&priv->htc_pm_lock);  	if (--priv->ps_usecount != 0)  		goto unlock; -	if (priv->ps_idle) +	if (priv->ps_idle) { +		ath9k_hw_setrxabort(priv->ah, true); +		ath9k_hw_stopdmarecv(priv->ah, &reset);  		ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP); -	else if (priv->ps_enabled) +	} else if (priv->ps_enabled) {  		ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP); +	}  unlock:  	mutex_unlock(&priv->htc_pm_lock); @@ -250,7 +255,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,  	u8 cmd_rsp;  	int ret; -	if (priv->op_flags & OP_INVALID) +	if (test_bit(OP_INVALID, &priv->op_flags))  		return -EIO;  	fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL); @@ -304,7 +309,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,  	htc_start(priv->htc); -	if (!(priv->op_flags & OP_SCANNING) && +	if (!test_bit(OP_SCANNING, &priv->op_flags) &&  	    !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))  		ath9k_htc_vif_reconfig(priv); @@ -750,7 +755,7 @@ void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)  	common->ani.shortcal_timer = timestamp;  	common->ani.checkani_timer = timestamp; -	priv->op_flags |= OP_ANI_RUNNING; +	set_bit(OP_ANI_RUNNING, &priv->op_flags);  	ieee80211_queue_delayed_work(common->hw, &priv->ani_work,  				     msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); @@ -759,7 +764,7 @@ void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)  void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv)  {  	cancel_delayed_work_sync(&priv->ani_work); -	priv->op_flags &= ~OP_ANI_RUNNING; +	clear_bit(OP_ANI_RUNNING, &priv->op_flags);  }  void ath9k_htc_ani_work(struct work_struct *work) @@ -944,7 +949,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)  		ath_dbg(common, CONFIG,  			"Failed to update capability in target\n"); -	priv->op_flags &= ~OP_INVALID; +	clear_bit(OP_INVALID, &priv->op_flags);  	htc_start(priv->htc);  	spin_lock_bh(&priv->tx.tx_lock); @@ -973,7 +978,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)  	mutex_lock(&priv->mutex); -	if (priv->op_flags & OP_INVALID) { +	if (test_bit(OP_INVALID, &priv->op_flags)) {  		ath_dbg(common, ANY, "Device not present\n");  		mutex_unlock(&priv->mutex);  		return; @@ -1015,7 +1020,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)  	ath9k_htc_ps_restore(priv);  	ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP); -	priv->op_flags |= OP_INVALID; +	set_bit(OP_INVALID, &priv->op_flags);  	ath_dbg(common, CONFIG, "Driver halt\n");  	mutex_unlock(&priv->mutex); @@ -1105,8 +1110,8 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw,  	ath9k_htc_set_opmode(priv);  	if ((priv->ah->opmode == NL80211_IFTYPE_AP) && -	    !(priv->op_flags & OP_ANI_RUNNING)) { -		ath9k_hw_set_tsfadjust(priv->ah, 1); +	    !test_bit(OP_ANI_RUNNING, &priv->op_flags)) { +		ath9k_hw_set_tsfadjust(priv->ah, true);  		ath9k_htc_start_ani(priv);  	} @@ -1178,24 +1183,20 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)  	struct ath9k_htc_priv *priv = hw->priv;  	struct ath_common *common = ath9k_hw_common(priv->ah);  	struct ieee80211_conf *conf = &hw->conf; +	bool chip_reset = false; +	int ret = 0;  	mutex_lock(&priv->mutex); +	ath9k_htc_ps_wakeup(priv);  	if (changed & IEEE80211_CONF_CHANGE_IDLE) { -		bool enable_radio = false; -		bool idle = !!(conf->flags & IEEE80211_CONF_IDLE); -  		mutex_lock(&priv->htc_pm_lock); -		if (!idle && priv->ps_idle) -			enable_radio = true; -		priv->ps_idle = idle; -		mutex_unlock(&priv->htc_pm_lock); -		if (enable_radio) { -			ath_dbg(common, CONFIG, "not-idle: enabling radio\n"); -			ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); -			ath9k_htc_radio_enable(hw); -		} +		priv->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); +		if (priv->ps_idle) +			chip_reset = true; + +		mutex_unlock(&priv->htc_pm_lock);  	}  	/* @@ -1210,7 +1211,7 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)  			ath9k_htc_remove_monitor_interface(priv);  	} -	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { +	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || chip_reset) {  		struct ieee80211_channel *curchan = hw->conf.channel;  		int pos = curchan->hw_value; @@ -1223,8 +1224,8 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)  		if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {  			ath_err(common, "Unable to set channel\n"); -			mutex_unlock(&priv->mutex); -			return -EINVAL; +			ret = -EINVAL; +			goto out;  		}  	} @@ -1246,21 +1247,10 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)  				       priv->txpowlimit, &priv->curtxpow);  	} -	if (changed & IEEE80211_CONF_CHANGE_IDLE) { -		mutex_lock(&priv->htc_pm_lock); -		if (!priv->ps_idle) { -			mutex_unlock(&priv->htc_pm_lock); -			goto out; -		} -		mutex_unlock(&priv->htc_pm_lock); - -		ath_dbg(common, CONFIG, "idle: disabling radio\n"); -		ath9k_htc_radio_disable(hw); -	} -  out: +	ath9k_htc_ps_restore(priv);  	mutex_unlock(&priv->mutex); -	return 0; +	return ret;  }  #define SUPPORTED_FILTERS			\ @@ -1285,7 +1275,7 @@ static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,  	changed_flags &= SUPPORTED_FILTERS;  	*total_flags &= SUPPORTED_FILTERS; -	if (priv->op_flags & OP_INVALID) { +	if (test_bit(OP_INVALID, &priv->op_flags)) {  		ath_dbg(ath9k_hw_common(priv->ah), ANY,  			"Unable to configure filter on invalid state\n");  		mutex_unlock(&priv->mutex); @@ -1361,7 +1351,7 @@ static int ath9k_htc_conf_tx(struct ieee80211_hw *hw,  	qi.tqi_aifs = params->aifs;  	qi.tqi_cwmin = params->cw_min;  	qi.tqi_cwmax = params->cw_max; -	qi.tqi_burstTime = params->txop; +	qi.tqi_burstTime = params->txop * 32;  	qnum = get_hw_qnum(queue, priv->hwq_map); @@ -1496,6 +1486,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,  			priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--;  		if (priv->ah->opmode == NL80211_IFTYPE_STATION) { +			ath9k_htc_choose_set_bssid(priv);  			if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1))  				ath9k_htc_start_ani(priv);  			else if (priv->num_sta_assoc_vif == 0) @@ -1503,13 +1494,11 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,  		}  	} -	if (changed & BSS_CHANGED_BSSID) { +	if (changed & BSS_CHANGED_IBSS) {  		if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) {  			common->curaid = bss_conf->aid;  			memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);  			ath9k_htc_set_bssid(priv); -		} else if (priv->ah->opmode == NL80211_IFTYPE_STATION) { -			ath9k_htc_choose_set_bssid(priv);  		}  	} @@ -1517,7 +1506,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,  		ath_dbg(common, CONFIG, "Beacon enabled for BSS: %pM\n",  			bss_conf->bssid);  		ath9k_htc_set_tsfadjust(priv, vif); -		priv->op_flags |= OP_ENABLE_BEACON; +		set_bit(OP_ENABLE_BEACON, &priv->op_flags);  		ath9k_htc_beacon_config(priv, vif);  	} @@ -1530,7 +1519,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,  			ath_dbg(common, CONFIG,  				"Beacon disabled for BSS: %pM\n",  				bss_conf->bssid); -			priv->op_flags &= ~OP_ENABLE_BEACON; +			clear_bit(OP_ENABLE_BEACON, &priv->op_flags);  			ath9k_htc_beacon_config(priv, vif);  		}  	} @@ -1543,7 +1532,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,  		    (priv->nvifs == 1) &&  		    (priv->num_ap_vif == 1) &&  		    (vif->type == NL80211_IFTYPE_AP)) { -			priv->op_flags |= OP_TSF_RESET; +			set_bit(OP_TSF_RESET, &priv->op_flags);  		}  		ath_dbg(common, CONFIG,  			"Beacon interval changed for BSS: %pM\n", @@ -1655,7 +1644,7 @@ static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)  	mutex_lock(&priv->mutex);  	spin_lock_bh(&priv->beacon_lock); -	priv->op_flags |= OP_SCANNING; +	set_bit(OP_SCANNING, &priv->op_flags);  	spin_unlock_bh(&priv->beacon_lock);  	cancel_work_sync(&priv->ps_work);  	ath9k_htc_stop_ani(priv); @@ -1668,7 +1657,7 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)  	mutex_lock(&priv->mutex);  	spin_lock_bh(&priv->beacon_lock); -	priv->op_flags &= ~OP_SCANNING; +	clear_bit(OP_SCANNING, &priv->op_flags);  	spin_unlock_bh(&priv->beacon_lock);  	ath9k_htc_ps_wakeup(priv);  	ath9k_htc_vif_reconfig(priv); diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 3e40a646151..47e61d0da33 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c @@ -916,7 +916,7 @@ void ath9k_host_rx_init(struct ath9k_htc_priv *priv)  {  	ath9k_hw_rxena(priv->ah);  	ath9k_htc_opmode_init(priv); -	ath9k_hw_startpcureceive(priv->ah, (priv->op_flags & OP_SCANNING)); +	ath9k_hw_startpcureceive(priv->ah, test_bit(OP_SCANNING, &priv->op_flags));  	priv->rx.last_rssi = ATH_RSSI_DUMMY_MARKER;  } diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index abe05ec85d5..cfa91ab7acf 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -342,6 +342,9 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)  		val = REG_READ(ah, AR_SREV);  		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);  		return; +	case AR9300_DEVID_QCA955X: +		ah->hw_version.macVersion = AR_SREV_VERSION_9550; +		return;  	}  	val = REG_READ(ah, AR_SREV) & AR_SREV_ID; @@ -390,14 +393,6 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah)  	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);  } -static void ath9k_hw_aspm_init(struct ath_hw *ah) -{ -	struct ath_common *common = ath9k_hw_common(ah); - -	if (common->bus_ops->aspm_init) -		common->bus_ops->aspm_init(common); -} -  /* This should work for all families including legacy */  static bool ath9k_hw_chip_test(struct ath_hw *ah)  { @@ -622,7 +617,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) {  		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || -		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah)) && +		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) &&  		     !ah->is_pciexpress)) {  			ah->config.serialize_regmode =  				SER_REG_MODE_ON; @@ -654,6 +649,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	case AR_SREV_VERSION_9485:  	case AR_SREV_VERSION_9340:  	case AR_SREV_VERSION_9462: +	case AR_SREV_VERSION_9550:  		break;  	default:  		ath_err(common, @@ -663,7 +659,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	}  	if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) || -	    AR_SREV_9330(ah)) +	    AR_SREV_9330(ah) || AR_SREV_9550(ah))  		ah->is_pciexpress = false;  	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID); @@ -675,10 +671,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	if (!AR_SREV_9300_20_OR_LATER(ah))  		ah->ani_function &= ~ATH9K_ANI_MRC_CCK; -	/* disable ANI for 9340 */ -	if (AR_SREV_9340(ah)) -		ah->config.enable_ani = false; -  	ath9k_hw_init_mode_regs(ah);  	if (!ah->is_pciexpress) @@ -693,9 +685,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	if (r)  		return r; -	if (ah->is_pciexpress) -		ath9k_hw_aspm_init(ah); -  	r = ath9k_hw_init_macaddr(ah);  	if (r) {  		ath_err(common, "Failed to initialize MAC address\n"); @@ -738,6 +727,7 @@ int ath9k_hw_init(struct ath_hw *ah)  	case AR9300_DEVID_AR9485_PCIE:  	case AR9300_DEVID_AR9330:  	case AR9300_DEVID_AR9340: +	case AR9300_DEVID_QCA955X:  	case AR9300_DEVID_AR9580:  	case AR9300_DEVID_AR9462:  		break; @@ -784,13 +774,25 @@ static void ath9k_hw_init_qos(struct ath_hw *ah)  u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)  { +	struct ath_common *common = ath9k_hw_common(ah); +	int i = 0; +  	REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);  	udelay(100);  	REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK); -	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) +	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) { +  		udelay(100); +		if (WARN_ON_ONCE(i >= 100)) { +			ath_err(common, "PLL4 meaurement not done\n"); +			break; +		} + +		i++; +	} +  	return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;  }  EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc); @@ -864,7 +866,7 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  		/* program BB PLL phase_shift */  		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,  			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x1); -	} else if (AR_SREV_9340(ah)) { +	} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {  		u32 regval, pll2_divint, pll2_divfrac, refdiv;  		REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c); @@ -878,9 +880,15 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  			pll2_divfrac = 0x1eb85;  			refdiv = 3;  		} else { -			pll2_divint = 88; -			pll2_divfrac = 0; -			refdiv = 5; +			if (AR_SREV_9340(ah)) { +				pll2_divint = 88; +				pll2_divfrac = 0; +				refdiv = 5; +			} else { +				pll2_divint = 0x11; +				pll2_divfrac = 0x26666; +				refdiv = 1; +			}  		}  		regval = REG_READ(ah, AR_PHY_PLL_MODE); @@ -893,8 +901,12 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  		udelay(100);  		regval = REG_READ(ah, AR_PHY_PLL_MODE); -		regval = (regval & 0x80071fff) | (0x1 << 30) | (0x1 << 13) | -			 (0x4 << 26) | (0x18 << 19); +		if (AR_SREV_9340(ah)) +			regval = (regval & 0x80071fff) | (0x1 << 30) | +				 (0x1 << 13) | (0x4 << 26) | (0x18 << 19); +		else +			regval = (regval & 0x80071fff) | (0x3 << 30) | +				 (0x1 << 13) | (0x4 << 26) | (0x60 << 19);  		REG_WRITE(ah, AR_PHY_PLL_MODE, regval);  		REG_WRITE(ah, AR_PHY_PLL_MODE,  			  REG_READ(ah, AR_PHY_PLL_MODE) & 0xfffeffff); @@ -905,7 +917,8 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); -	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah)) +	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah) || +	    AR_SREV_9550(ah))  		udelay(1000);  	/* Switch the core clock for ar9271 to 117Mhz */ @@ -918,7 +931,7 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK); -	if (AR_SREV_9340(ah)) { +	if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {  		if (ah->is_clk_25mhz) {  			REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x17c << 1);  			REG_WRITE(ah, AR_SLP32_MODE, 0x0010f3d7); @@ -942,7 +955,7 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,  		AR_IMR_RXORN |  		AR_IMR_BCNMISC; -	if (AR_SREV_9340(ah)) +	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))  		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;  	if (AR_SREV_9300_20_OR_LATER(ah)) { @@ -1359,6 +1372,9 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  		}  	} +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_check_gpm_offset(ah); +  	REG_WRITE(ah, AR_RTC_RC, rst_flags);  	REGWRITE_BUFFER_FLUSH(ah); @@ -1443,9 +1459,6 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)  		break;  	} -	if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -		REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2); -  	return ret;  } @@ -1468,6 +1481,9 @@ static bool ath9k_hw_chip_reset(struct ath_hw *ah,  		return false;  	ah->chip_fullsleep = false; + +	if (AR_SREV_9330(ah)) +		ar9003_hw_internal_regulator_apply(ah);  	ath9k_hw_init_pll(ah, chan);  	ath9k_hw_set_rfmode(ah, chan); @@ -1718,8 +1734,8 @@ static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan)  	ath9k_hw_loadnf(ah, ah->curchan);  	ath9k_hw_start_nfcal(ah, true); -	if ((ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && ar9003_mci_is_ready(ah)) -		ar9003_mci_2g5g_switch(ah, true); +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_2g5g_switch(ah, false);  	if (AR_SREV_9271(ah))  		ar9002_hw_load_ani_reg(ah, chan); @@ -1739,10 +1755,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	u64 tsf = 0;  	int i, r;  	bool start_mci_reset = false; -	bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI);  	bool save_fullsleep = ah->chip_fullsleep; -	if (mci) { +	if (ath9k_hw_mci_is_enabled(ah)) {  		start_mci_reset = ar9003_mci_start_reset(ah, chan);  		if (start_mci_reset)  			return 0; @@ -1771,7 +1786,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  			return r;  	} -	if (mci) +	if (ath9k_hw_mci_is_enabled(ah))  		ar9003_mci_stop_bt(ah, save_fullsleep);  	saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA); @@ -1829,7 +1844,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (r)  		return r; -	if (mci) +	if (ath9k_hw_mci_is_enabled(ah))  		ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep);  	/* @@ -1924,7 +1939,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	ath9k_hw_set_dma(ah); -	REG_WRITE(ah, AR_OBS, 8); +	if (!ath9k_hw_mci_is_enabled(ah)) +		REG_WRITE(ah, AR_OBS, 8);  	if (ah->config.rx_intr_mitigation) {  		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500); @@ -1945,10 +1961,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (!ath9k_hw_init_cal(ah, chan))  		return -EIO; -	ath9k_hw_loadnf(ah, chan); -	ath9k_hw_start_nfcal(ah, true); - -	if (mci && ar9003_mci_end_reset(ah, chan, caldata)) +	if (ath9k_hw_mci_is_enabled(ah) && ar9003_mci_end_reset(ah, chan, caldata))  		return -EIO;  	ENABLE_REGWRITE_BUFFER(ah); @@ -1983,7 +1996,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  				REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);  		}  #ifdef __BIG_ENDIAN -		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah)) +		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah) || +			 AR_SREV_9550(ah))  			REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);  		else  			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD); @@ -1993,9 +2007,12 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (ath9k_hw_btcoex_is_enabled(ah))  		ath9k_hw_btcoex_enable(ah); -	if (mci) +	if (ath9k_hw_mci_is_enabled(ah))  		ar9003_mci_check_bt(ah); +	ath9k_hw_loadnf(ah, chan); +	ath9k_hw_start_nfcal(ah, true); +  	if (AR_SREV_9300_20_OR_LATER(ah)) {  		ar9003_hw_bb_watchdog_config(ah); @@ -2016,39 +2033,35 @@ EXPORT_SYMBOL(ath9k_hw_reset);   * Notify Power Mgt is disabled in self-generated frames.   * If requested, force chip to sleep.   */ -static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip) +static void ath9k_set_power_sleep(struct ath_hw *ah)  {  	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); -	if (setChip) { -		if (AR_SREV_9462(ah)) { -			REG_WRITE(ah, AR_TIMER_MODE, -				  REG_READ(ah, AR_TIMER_MODE) & 0xFFFFFF00); -			REG_WRITE(ah, AR_NDP2_TIMER_MODE, REG_READ(ah, -				  AR_NDP2_TIMER_MODE) & 0xFFFFFF00); -			REG_WRITE(ah, AR_SLP32_INC, -				  REG_READ(ah, AR_SLP32_INC) & 0xFFF00000); -			/* xxx Required for WLAN only case ? */ -			REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0); -			udelay(100); -		} -		/* -		 * Clear the RTC force wake bit to allow the -		 * mac to go to sleep. -		 */ -		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN); +	if (AR_SREV_9462(ah)) { +		REG_CLR_BIT(ah, AR_TIMER_MODE, 0xff); +		REG_CLR_BIT(ah, AR_NDP2_TIMER_MODE, 0xff); +		REG_CLR_BIT(ah, AR_SLP32_INC, 0xfffff); +		/* xxx Required for WLAN only case ? */ +		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0); +		udelay(100); +	} -		if (AR_SREV_9462(ah)) -			udelay(100); +	/* +	 * Clear the RTC force wake bit to allow the +	 * mac to go to sleep. +	 */ +	REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN); -		if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) -			REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); +	if (ath9k_hw_mci_is_enabled(ah)) +		udelay(100); -		/* Shutdown chip. Active low */ -		if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) { -			REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN); -			udelay(2); -		} +	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) +		REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); + +	/* Shutdown chip. Active low */ +	if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) { +		REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN); +		udelay(2);  	}  	/* Clear Bit 14 of AR_WA after putting chip into Full Sleep mode. */ @@ -2061,44 +2074,38 @@ static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)   * frames. If request, set power mode of chip to   * auto/normal.  Duration in units of 128us (1/8 TU).   */ -static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip) +static void ath9k_set_power_network_sleep(struct ath_hw *ah)  { -	u32 val; +	struct ath9k_hw_capabilities *pCap = &ah->caps;  	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); -	if (setChip) { -		struct ath9k_hw_capabilities *pCap = &ah->caps; -		if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { -			/* Set WakeOnInterrupt bit; clear ForceWake bit */ -			REG_WRITE(ah, AR_RTC_FORCE_WAKE, -				  AR_RTC_FORCE_WAKE_ON_INT); -		} else { +	if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { +		/* Set WakeOnInterrupt bit; clear ForceWake bit */ +		REG_WRITE(ah, AR_RTC_FORCE_WAKE, +			  AR_RTC_FORCE_WAKE_ON_INT); +	} else { -			/* When chip goes into network sleep, it could be waken -			 * up by MCI_INT interrupt caused by BT's HW messages -			 * (LNA_xxx, CONT_xxx) which chould be in a very fast -			 * rate (~100us). This will cause chip to leave and -			 * re-enter network sleep mode frequently, which in -			 * consequence will have WLAN MCI HW to generate lots of -			 * SYS_WAKING and SYS_SLEEPING messages which will make -			 * BT CPU to busy to process. -			 */ -			if (AR_SREV_9462(ah)) { -				val = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_EN) & -					~AR_MCI_INTERRUPT_RX_HW_MSG_MASK; -				REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, val); -			} -			/* -			 * Clear the RTC force wake bit to allow the -			 * mac to go to sleep. -			 */ -			REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, -				    AR_RTC_FORCE_WAKE_EN); +		/* When chip goes into network sleep, it could be waken +		 * up by MCI_INT interrupt caused by BT's HW messages +		 * (LNA_xxx, CONT_xxx) which chould be in a very fast +		 * rate (~100us). This will cause chip to leave and +		 * re-enter network sleep mode frequently, which in +		 * consequence will have WLAN MCI HW to generate lots of +		 * SYS_WAKING and SYS_SLEEPING messages which will make +		 * BT CPU to busy to process. +		 */ +		if (ath9k_hw_mci_is_enabled(ah)) +			REG_CLR_BIT(ah, AR_MCI_INTERRUPT_RX_MSG_EN, +				    AR_MCI_INTERRUPT_RX_HW_MSG_MASK); +		/* +		 * Clear the RTC force wake bit to allow the +		 * mac to go to sleep. +		 */ +		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN); -			if (AR_SREV_9462(ah)) -				udelay(30); -		} +		if (ath9k_hw_mci_is_enabled(ah)) +			udelay(30);  	}  	/* Clear Bit 14 of AR_WA after putting chip into Net Sleep mode. */ @@ -2106,7 +2113,7 @@ static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)  		REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);  } -static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip) +static bool ath9k_hw_set_power_awake(struct ath_hw *ah)  {  	u32 val;  	int i; @@ -2117,37 +2124,38 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)  		udelay(10);  	} -	if (setChip) { -		if ((REG_READ(ah, AR_RTC_STATUS) & -		     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) { -			if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { -				return false; -			} -			if (!AR_SREV_9300_20_OR_LATER(ah)) -				ath9k_hw_init_pll(ah, NULL); +	if ((REG_READ(ah, AR_RTC_STATUS) & +	     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) { +		if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { +			return false;  		} -		if (AR_SREV_9100(ah)) -			REG_SET_BIT(ah, AR_RTC_RESET, -				    AR_RTC_RESET_EN); +		if (!AR_SREV_9300_20_OR_LATER(ah)) +			ath9k_hw_init_pll(ah, NULL); +	} +	if (AR_SREV_9100(ah)) +		REG_SET_BIT(ah, AR_RTC_RESET, +			    AR_RTC_RESET_EN); + +	REG_SET_BIT(ah, AR_RTC_FORCE_WAKE, +		    AR_RTC_FORCE_WAKE_EN); +	udelay(50); +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_set_power_awake(ah); + +	for (i = POWER_UP_TIME / 50; i > 0; i--) { +		val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M; +		if (val == AR_RTC_STATUS_ON) +			break; +		udelay(50);  		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,  			    AR_RTC_FORCE_WAKE_EN); -		udelay(50); - -		for (i = POWER_UP_TIME / 50; i > 0; i--) { -			val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M; -			if (val == AR_RTC_STATUS_ON) -				break; -			udelay(50); -			REG_SET_BIT(ah, AR_RTC_FORCE_WAKE, -				    AR_RTC_FORCE_WAKE_EN); -		} -		if (i == 0) { -			ath_err(ath9k_hw_common(ah), -				"Failed to wakeup in %uus\n", -				POWER_UP_TIME / 20); -			return false; -		} +	} +	if (i == 0) { +		ath_err(ath9k_hw_common(ah), +			"Failed to wakeup in %uus\n", +			POWER_UP_TIME / 20); +		return false;  	}  	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); @@ -2158,7 +2166,7 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)  {  	struct ath_common *common = ath9k_hw_common(ah); -	int status = true, setChip = true; +	int status = true;  	static const char *modes[] = {  		"AWAKE",  		"FULL-SLEEP", @@ -2174,25 +2182,17 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)  	switch (mode) {  	case ATH9K_PM_AWAKE: -		status = ath9k_hw_set_power_awake(ah, setChip); - -		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -			REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2); - +		status = ath9k_hw_set_power_awake(ah);  		break;  	case ATH9K_PM_FULL_SLEEP: -		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) +		if (ath9k_hw_mci_is_enabled(ah))  			ar9003_mci_set_full_sleep(ah); -		ath9k_set_power_sleep(ah, setChip); +		ath9k_set_power_sleep(ah);  		ah->chip_fullsleep = true;  		break;  	case ATH9K_PM_NETWORK_SLEEP: - -		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -			REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2); - -		ath9k_set_power_network_sleep(ah, setChip); +		ath9k_set_power_network_sleep(ah);  		break;  	default:  		ath_err(common, "Unknown power mode %u\n", mode); @@ -2585,6 +2585,14 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)  	} +	if (AR_SREV_9280_20_OR_LATER(ah)) { +		pCap->hw_caps |= ATH9K_HW_WOW_DEVICE_CAPABLE | +				 ATH9K_HW_WOW_PATTERN_MATCH_EXACT; + +		if (AR_SREV_9280(ah)) +			pCap->hw_caps |= ATH9K_HW_WOW_PATTERN_MATCH_DWORD; +	} +  	return 0;  } @@ -2762,6 +2770,9 @@ EXPORT_SYMBOL(ath9k_hw_setrxfilter);  bool ath9k_hw_phy_disable(struct ath_hw *ah)  { +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_bt_gain_ctrl(ah); +  	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))  		return false; @@ -2901,9 +2912,9 @@ void ath9k_hw_reset_tsf(struct ath_hw *ah)  }  EXPORT_SYMBOL(ath9k_hw_reset_tsf); -void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting) +void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set)  { -	if (setting) +	if (set)  		ah->misc_mode |= AR_PCU_TX_ADD_TSF;  	else  		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF; @@ -3147,6 +3158,7 @@ static struct {  	{ AR_SREV_VERSION_9340,		"9340" },  	{ AR_SREV_VERSION_9485,         "9485" },  	{ AR_SREV_VERSION_9462,         "9462" }, +	{ AR_SREV_VERSION_9550,         "9550" },  };  /* For devices with external radios */ diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index b620c557c2a..dd0c146d81d 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h @@ -48,6 +48,7 @@  #define AR9300_DEVID_AR9580	0x0033  #define AR9300_DEVID_AR9462	0x0034  #define AR9300_DEVID_AR9330	0x0035 +#define AR9300_DEVID_QCA955X	0x0038  #define AR5416_AR9100_DEVID	0x000b @@ -179,6 +180,37 @@  #define PAPRD_TABLE_SZ			24  #define PAPRD_IDEAL_AGC2_PWR_RANGE	0xe0 +/* + * Wake on Wireless + */ + +/* Keep Alive Frame */ +#define KAL_FRAME_LEN		28 +#define KAL_FRAME_TYPE		0x2	/* data frame */ +#define KAL_FRAME_SUB_TYPE	0x4	/* null data frame */ +#define KAL_DURATION_ID		0x3d +#define KAL_NUM_DATA_WORDS	6 +#define KAL_NUM_DESC_WORDS	12 +#define KAL_ANTENNA_MODE	1 +#define KAL_TO_DS		1 +#define KAL_DELAY		4	/*delay of 4ms between 2 KAL frames */ +#define KAL_TIMEOUT		900 + +#define MAX_PATTERN_SIZE		256 +#define MAX_PATTERN_MASK_SIZE		32 +#define MAX_NUM_PATTERN			8 +#define MAX_NUM_USER_PATTERN		6 /*  deducting the disassociate and +					      deauthenticate packets */ + +/* + * WoW trigger mapping to hardware code + */ + +#define AH_WOW_USER_PATTERN_EN		BIT(0) +#define AH_WOW_MAGIC_PATTERN_EN		BIT(1) +#define AH_WOW_LINK_CHANGE		BIT(2) +#define AH_WOW_BEACON_MISS		BIT(3) +  enum ath_hw_txq_subtype {  	ATH_TXQ_AC_BE = 0,  	ATH_TXQ_AC_BK = 1, @@ -211,8 +243,22 @@ enum ath9k_hw_caps {  	ATH9K_HW_CAP_RTT			= BIT(14),  	ATH9K_HW_CAP_MCI			= BIT(15),  	ATH9K_HW_CAP_DFS			= BIT(16), +	ATH9K_HW_WOW_DEVICE_CAPABLE		= BIT(17), +	ATH9K_HW_WOW_PATTERN_MATCH_EXACT	= BIT(18), +	ATH9K_HW_WOW_PATTERN_MATCH_DWORD	= BIT(19),  }; +/* + * WoW device capabilities + * @ATH9K_HW_WOW_DEVICE_CAPABLE: device revision is capable of WoW. + * @ATH9K_HW_WOW_PATTERN_MATCH_EXACT: device is capable of matching + * an exact user defined pattern or de-authentication/disassoc pattern. + * @ATH9K_HW_WOW_PATTERN_MATCH_DWORD: device requires the first four + * bytes of the pattern for user defined pattern, de-authentication and + * disassociation patterns for all types of possible frames recieved + * of those types. + */ +  struct ath9k_hw_capabilities {  	u32 hw_caps; /* ATH9K_HW_CAP_* from ath9k_hw_caps */  	u16 rts_aggr_limit; @@ -814,17 +860,20 @@ struct ath_hw {  	struct ar5416IniArray iniBank7;  	struct ar5416IniArray iniAddac;  	struct ar5416IniArray iniPcieSerdes; +#ifdef CONFIG_PM_SLEEP +	struct ar5416IniArray iniPcieSerdesWow; +#endif  	struct ar5416IniArray iniPcieSerdesLowPower;  	struct ar5416IniArray iniModesFastClock;  	struct ar5416IniArray iniAdditional;  	struct ar5416IniArray iniModesRxGain; +	struct ar5416IniArray ini_modes_rx_gain_bounds;  	struct ar5416IniArray iniModesTxGain;  	struct ar5416IniArray iniCckfirNormal;  	struct ar5416IniArray iniCckfirJapan2484;  	struct ar5416IniArray ini_japan2484;  	struct ar5416IniArray iniModes_9271_ANI_reg;  	struct ar5416IniArray ini_radio_post_sys2ant; -	struct ar5416IniArray ini_BTCOEX_MAX_TXPWR;  	struct ar5416IniArray iniMac[ATH_INI_NUM_SPLIT];  	struct ar5416IniArray iniBB[ATH_INI_NUM_SPLIT]; @@ -862,6 +911,9 @@ struct ath_hw {  	/* Enterprise mode cap */  	u32 ent_mode; +#ifdef CONFIG_PM_SLEEP +	u32 wow_event_mask; +#endif  	bool is_clk_25mhz;  	int (*get_mac_revision)(void);  	int (*external_reset)(void); @@ -942,7 +994,7 @@ u32 ath9k_hw_gettsf32(struct ath_hw *ah);  u64 ath9k_hw_gettsf64(struct ath_hw *ah);  void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);  void ath9k_hw_reset_tsf(struct ath_hw *ah); -void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting); +void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set);  void ath9k_hw_init_global_settings(struct ath_hw *ah);  u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah);  void ath9k_hw_set11nmac2040(struct ath_hw *ah); @@ -1020,16 +1072,8 @@ void ar9002_hw_attach_ops(struct ath_hw *ah);  void ar9003_hw_attach_ops(struct ath_hw *ah);  void ar9002_hw_load_ani_reg(struct ath_hw *ah, struct ath9k_channel *chan); -/* - * ANI work can be shared between all families but a next - * generation implementation of ANI will be used only for AR9003 only - * for now as the other families still need to be tested with the same - * next generation ANI. Feel free to start testing it though for the - * older families (AR5008, AR9001, AR9002) by using modparam_force_new_ani. - */ -extern int modparam_force_new_ani; +  void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning); -void ath9k_hw_proc_mib_event(struct ath_hw *ah);  void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan);  #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT @@ -1037,6 +1081,12 @@ static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah)  {  	return ah->btcoex_hw.enabled;  } +static inline bool ath9k_hw_mci_is_enabled(struct ath_hw *ah) +{ +	return ah->common.btcoex_enabled && +	       (ah->caps.hw_caps & ATH9K_HW_CAP_MCI); + +}  void ath9k_hw_btcoex_enable(struct ath_hw *ah);  static inline enum ath_btcoex_scheme  ath9k_hw_get_btcoex_scheme(struct ath_hw *ah) @@ -1048,6 +1098,10 @@ static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah)  {  	return false;  } +static inline bool ath9k_hw_mci_is_enabled(struct ath_hw *ah) +{ +	return false; +}  static inline void ath9k_hw_btcoex_enable(struct ath_hw *ah)  {  } @@ -1058,6 +1112,37 @@ ath9k_hw_get_btcoex_scheme(struct ath_hw *ah)  }  #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ + +#ifdef CONFIG_PM_SLEEP +const char *ath9k_hw_wow_event_to_string(u32 wow_event); +void ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern, +				u8 *user_mask, int pattern_count, +				int pattern_len); +u32 ath9k_hw_wow_wakeup(struct ath_hw *ah); +void ath9k_hw_wow_enable(struct ath_hw *ah, u32 pattern_enable); +#else +static inline const char *ath9k_hw_wow_event_to_string(u32 wow_event) +{ +	return NULL; +} +static inline void ath9k_hw_wow_apply_pattern(struct ath_hw *ah, +					      u8 *user_pattern, +					      u8 *user_mask, +					      int pattern_count, +					      int pattern_len) +{ +} +static inline u32 ath9k_hw_wow_wakeup(struct ath_hw *ah) +{ +	return 0; +} +static inline void ath9k_hw_wow_enable(struct ath_hw *ah, u32 pattern_enable) +{ +} +#endif + + +  #define ATH9K_CLOCK_RATE_CCK		22  #define ATH9K_CLOCK_RATE_5GHZ_OFDM	40  #define ATH9K_CLOCK_RATE_2GHZ_OFDM	44 diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index dee9e092449..f33712140fa 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c @@ -434,6 +434,7 @@ static int ath9k_init_queues(struct ath_softc *sc)  	for (i = 0; i < WME_NUM_AC; i++) {  		sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i);  		sc->tx.txq_map[i]->mac80211_qnum = i; +		sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH;  	}  	return 0;  } @@ -489,6 +490,7 @@ static void ath9k_init_misc(struct ath_softc *sc)  	setup_timer(&common->ani.timer, ath_ani_calibrate, (unsigned long)sc); +	sc->last_rssi = ATH_RSSI_DUMMY_MARKER;  	sc->config.txpowlimit = ATH_TXPOWER_MAX;  	memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);  	sc->beacon.slottime = ATH9K_SLOT_TIME_9; @@ -557,9 +559,15 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,  	spin_lock_init(&sc->debug.samp_lock);  #endif  	tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc); -	tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet, +	tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,  		     (unsigned long)sc); +	INIT_WORK(&sc->hw_reset_work, ath_reset_work); +	INIT_WORK(&sc->hw_check_work, ath_hw_check); +	INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); +	INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work); +	setup_timer(&sc->rx_poll_timer, ath_rx_poll, (unsigned long)sc); +  	/*  	 * Cache line size is used to size and align various  	 * structures used to communicate with the hardware. @@ -590,6 +598,9 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,  	ath9k_cmn_init_crypto(sc->sc_ah);  	ath9k_init_misc(sc); +	if (common->bus_ops->aspm_init) +		common->bus_ops->aspm_init(common); +  	return 0;  err_btcoex: @@ -703,6 +714,24 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)  	hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;  	hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; +#ifdef CONFIG_PM_SLEEP + +	if ((ah->caps.hw_caps & ATH9K_HW_WOW_DEVICE_CAPABLE) && +	    device_can_wakeup(sc->dev)) { + +		hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT | +					  WIPHY_WOWLAN_DISCONNECT; +		hw->wiphy->wowlan.n_patterns = MAX_NUM_USER_PATTERN; +		hw->wiphy->wowlan.pattern_min_len = 1; +		hw->wiphy->wowlan.pattern_max_len = MAX_PATTERN_SIZE; + +	} + +	atomic_set(&sc->wow_sleep_proc_intr, -1); +	atomic_set(&sc->wow_got_bmiss_intr, -1); + +#endif +  	hw->queues = 4;  	hw->max_rates = 4;  	hw->channel_change_time = 5000; @@ -782,11 +811,6 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc,  		ARRAY_SIZE(ath9k_tpt_blink));  #endif -	INIT_WORK(&sc->hw_reset_work, ath_reset_work); -	INIT_WORK(&sc->hw_check_work, ath_hw_check); -	INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); -	INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work); -  	/* Register with mac80211 */  	error = ieee80211_register_hw(hw);  	if (error) @@ -805,9 +829,6 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc,  			goto error_world;  	} -	setup_timer(&sc->rx_poll_timer, ath_rx_poll, (unsigned long)sc); -	sc->last_rssi = ATH_RSSI_DUMMY_MARKER; -  	ath_init_leds(sc);  	ath_start_rfkill_poll(sc); diff --git a/drivers/net/wireless/ath/ath9k/link.c b/drivers/net/wireless/ath/ath9k/link.c new file mode 100644 index 00000000000..d4549e9aac5 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/link.c @@ -0,0 +1,555 @@ +/* + * Copyright (c) 2012 Qualcomm Atheros, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ath9k.h" + +/* + * TX polling - checks if the TX engine is stuck somewhere + * and issues a chip reset if so. + */ +void ath_tx_complete_poll_work(struct work_struct *work) +{ +	struct ath_softc *sc = container_of(work, struct ath_softc, +					    tx_complete_work.work); +	struct ath_txq *txq; +	int i; +	bool needreset = false; +#ifdef CONFIG_ATH9K_DEBUGFS +	sc->tx_complete_poll_work_seen++; +#endif + +	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) +		if (ATH_TXQ_SETUP(sc, i)) { +			txq = &sc->tx.txq[i]; +			ath_txq_lock(sc, txq); +			if (txq->axq_depth) { +				if (txq->axq_tx_inprogress) { +					needreset = true; +					ath_txq_unlock(sc, txq); +					break; +				} else { +					txq->axq_tx_inprogress = true; +				} +			} +			ath_txq_unlock_complete(sc, txq); +		} + +	if (needreset) { +		ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, +			"tx hung, resetting the chip\n"); +		ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); +		return; +	} + +	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, +				     msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); +} + +/* + * Checks if the BB/MAC is hung. + */ +void ath_hw_check(struct work_struct *work) +{ +	struct ath_softc *sc = container_of(work, struct ath_softc, hw_check_work); +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); +	unsigned long flags; +	int busy; +	u8 is_alive, nbeacon = 1; +	enum ath_reset_type type; + +	ath9k_ps_wakeup(sc); +	is_alive = ath9k_hw_check_alive(sc->sc_ah); + +	if (is_alive && !AR_SREV_9300(sc->sc_ah)) +		goto out; +	else if (!is_alive && AR_SREV_9300(sc->sc_ah)) { +		ath_dbg(common, RESET, +			"DCU stuck is detected. Schedule chip reset\n"); +		type = RESET_TYPE_MAC_HANG; +		goto sched_reset; +	} + +	spin_lock_irqsave(&common->cc_lock, flags); +	busy = ath_update_survey_stats(sc); +	spin_unlock_irqrestore(&common->cc_lock, flags); + +	ath_dbg(common, RESET, "Possible baseband hang, busy=%d (try %d)\n", +		busy, sc->hw_busy_count + 1); +	if (busy >= 99) { +		if (++sc->hw_busy_count >= 3) { +			type = RESET_TYPE_BB_HANG; +			goto sched_reset; +		} +	} else if (busy >= 0) { +		sc->hw_busy_count = 0; +		nbeacon = 3; +	} + +	ath_start_rx_poll(sc, nbeacon); +	goto out; + +sched_reset: +	ath9k_queue_reset(sc, type); +out: +	ath9k_ps_restore(sc); +} + +/* + * PLL-WAR for AR9485/AR9340 + */ +static bool ath_hw_pll_rx_hang_check(struct ath_softc *sc, u32 pll_sqsum) +{ +	static int count; +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); + +	if (pll_sqsum >= 0x40000) { +		count++; +		if (count == 3) { +			ath_dbg(common, RESET, "PLL WAR, resetting the chip\n"); +			ath9k_queue_reset(sc, RESET_TYPE_PLL_HANG); +			count = 0; +			return true; +		} +	} else { +		count = 0; +	} + +	return false; +} + +void ath_hw_pll_work(struct work_struct *work) +{ +	u32 pll_sqsum; +	struct ath_softc *sc = container_of(work, struct ath_softc, +					    hw_pll_work.work); +	/* +	 * ensure that the PLL WAR is executed only +	 * after the STA is associated (or) if the +	 * beaconing had started in interfaces that +	 * uses beacons. +	 */ +	if (!test_bit(SC_OP_BEACONS, &sc->sc_flags)) +		return; + +	ath9k_ps_wakeup(sc); +	pll_sqsum = ar9003_get_pll_sqsum_dvc(sc->sc_ah); +	ath9k_ps_restore(sc); +	if (ath_hw_pll_rx_hang_check(sc, pll_sqsum)) +		return; + +	ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, +				     msecs_to_jiffies(ATH_PLL_WORK_INTERVAL)); +} + +/* + * RX Polling - monitors baseband hangs. + */ +void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon) +{ +	if (!AR_SREV_9300(sc->sc_ah)) +		return; + +	if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) +		return; + +	mod_timer(&sc->rx_poll_timer, jiffies + msecs_to_jiffies +		  (nbeacon * sc->cur_beacon_conf.beacon_interval)); +} + +void ath_rx_poll(unsigned long data) +{ +	struct ath_softc *sc = (struct ath_softc *)data; + +	ieee80211_queue_work(sc->hw, &sc->hw_check_work); +} + +/* + * PA Pre-distortion. + */ +static void ath_paprd_activate(struct ath_softc *sc) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath9k_hw_cal_data *caldata = ah->caldata; +	int chain; + +	if (!caldata || !caldata->paprd_done) +		return; + +	ath9k_ps_wakeup(sc); +	ar9003_paprd_enable(ah, false); +	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { +		if (!(ah->txchainmask & BIT(chain))) +			continue; + +		ar9003_paprd_populate_single_table(ah, caldata, chain); +	} + +	ar9003_paprd_enable(ah, true); +	ath9k_ps_restore(sc); +} + +static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int chain) +{ +	struct ieee80211_hw *hw = sc->hw; +	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	struct ath_tx_control txctl; +	int time_left; + +	memset(&txctl, 0, sizeof(txctl)); +	txctl.txq = sc->tx.txq_map[WME_AC_BE]; + +	memset(tx_info, 0, sizeof(*tx_info)); +	tx_info->band = hw->conf.channel->band; +	tx_info->flags |= IEEE80211_TX_CTL_NO_ACK; +	tx_info->control.rates[0].idx = 0; +	tx_info->control.rates[0].count = 1; +	tx_info->control.rates[0].flags = IEEE80211_TX_RC_MCS; +	tx_info->control.rates[1].idx = -1; + +	init_completion(&sc->paprd_complete); +	txctl.paprd = BIT(chain); + +	if (ath_tx_start(hw, skb, &txctl) != 0) { +		ath_dbg(common, CALIBRATE, "PAPRD TX failed\n"); +		dev_kfree_skb_any(skb); +		return false; +	} + +	time_left = wait_for_completion_timeout(&sc->paprd_complete, +			msecs_to_jiffies(ATH_PAPRD_TIMEOUT)); + +	if (!time_left) +		ath_dbg(common, CALIBRATE, +			"Timeout waiting for paprd training on TX chain %d\n", +			chain); + +	return !!time_left; +} + +void ath_paprd_calibrate(struct work_struct *work) +{ +	struct ath_softc *sc = container_of(work, struct ath_softc, paprd_work); +	struct ieee80211_hw *hw = sc->hw; +	struct ath_hw *ah = sc->sc_ah; +	struct ieee80211_hdr *hdr; +	struct sk_buff *skb = NULL; +	struct ath9k_hw_cal_data *caldata = ah->caldata; +	struct ath_common *common = ath9k_hw_common(ah); +	int ftype; +	int chain_ok = 0; +	int chain; +	int len = 1800; + +	if (!caldata) +		return; + +	ath9k_ps_wakeup(sc); + +	if (ar9003_paprd_init_table(ah) < 0) +		goto fail_paprd; + +	skb = alloc_skb(len, GFP_KERNEL); +	if (!skb) +		goto fail_paprd; + +	skb_put(skb, len); +	memset(skb->data, 0, len); +	hdr = (struct ieee80211_hdr *)skb->data; +	ftype = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC; +	hdr->frame_control = cpu_to_le16(ftype); +	hdr->duration_id = cpu_to_le16(10); +	memcpy(hdr->addr1, hw->wiphy->perm_addr, ETH_ALEN); +	memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN); +	memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN); + +	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { +		if (!(ah->txchainmask & BIT(chain))) +			continue; + +		chain_ok = 0; + +		ath_dbg(common, CALIBRATE, +			"Sending PAPRD frame for thermal measurement on chain %d\n", +			chain); +		if (!ath_paprd_send_frame(sc, skb, chain)) +			goto fail_paprd; + +		ar9003_paprd_setup_gain_table(ah, chain); + +		ath_dbg(common, CALIBRATE, +			"Sending PAPRD training frame on chain %d\n", chain); +		if (!ath_paprd_send_frame(sc, skb, chain)) +			goto fail_paprd; + +		if (!ar9003_paprd_is_done(ah)) { +			ath_dbg(common, CALIBRATE, +				"PAPRD not yet done on chain %d\n", chain); +			break; +		} + +		if (ar9003_paprd_create_curve(ah, caldata, chain)) { +			ath_dbg(common, CALIBRATE, +				"PAPRD create curve failed on chain %d\n", +				chain); +			break; +		} + +		chain_ok = 1; +	} +	kfree_skb(skb); + +	if (chain_ok) { +		caldata->paprd_done = true; +		ath_paprd_activate(sc); +	} + +fail_paprd: +	ath9k_ps_restore(sc); +} + +/* + *  ANI performs periodic noise floor calibration + *  that is used to adjust and optimize the chip performance.  This + *  takes environmental changes (location, temperature) into account. + *  When the task is complete, it reschedules itself depending on the + *  appropriate interval that was calculated. + */ +void ath_ani_calibrate(unsigned long data) +{ +	struct ath_softc *sc = (struct ath_softc *)data; +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	bool longcal = false; +	bool shortcal = false; +	bool aniflag = false; +	unsigned int timestamp = jiffies_to_msecs(jiffies); +	u32 cal_interval, short_cal_interval, long_cal_interval; +	unsigned long flags; + +	if (ah->caldata && ah->caldata->nfcal_interference) +		long_cal_interval = ATH_LONG_CALINTERVAL_INT; +	else +		long_cal_interval = ATH_LONG_CALINTERVAL; + +	short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ? +		ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL; + +	/* Only calibrate if awake */ +	if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE) +		goto set_timer; + +	ath9k_ps_wakeup(sc); + +	/* Long calibration runs independently of short calibration. */ +	if ((timestamp - common->ani.longcal_timer) >= long_cal_interval) { +		longcal = true; +		common->ani.longcal_timer = timestamp; +	} + +	/* Short calibration applies only while caldone is false */ +	if (!common->ani.caldone) { +		if ((timestamp - common->ani.shortcal_timer) >= short_cal_interval) { +			shortcal = true; +			common->ani.shortcal_timer = timestamp; +			common->ani.resetcal_timer = timestamp; +		} +	} else { +		if ((timestamp - common->ani.resetcal_timer) >= +		    ATH_RESTART_CALINTERVAL) { +			common->ani.caldone = ath9k_hw_reset_calvalid(ah); +			if (common->ani.caldone) +				common->ani.resetcal_timer = timestamp; +		} +	} + +	/* Verify whether we must check ANI */ +	if (sc->sc_ah->config.enable_ani +	    && (timestamp - common->ani.checkani_timer) >= +	    ah->config.ani_poll_interval) { +		aniflag = true; +		common->ani.checkani_timer = timestamp; +	} + +	/* Call ANI routine if necessary */ +	if (aniflag) { +		spin_lock_irqsave(&common->cc_lock, flags); +		ath9k_hw_ani_monitor(ah, ah->curchan); +		ath_update_survey_stats(sc); +		spin_unlock_irqrestore(&common->cc_lock, flags); +	} + +	/* Perform calibration if necessary */ +	if (longcal || shortcal) { +		common->ani.caldone = +			ath9k_hw_calibrate(ah, ah->curchan, +					   ah->rxchainmask, longcal); +	} + +	ath_dbg(common, ANI, +		"Calibration @%lu finished: %s %s %s, caldone: %s\n", +		jiffies, +		longcal ? "long" : "", shortcal ? "short" : "", +		aniflag ? "ani" : "", common->ani.caldone ? "true" : "false"); + +	ath9k_debug_samp_bb_mac(sc); +	ath9k_ps_restore(sc); + +set_timer: +	/* +	* Set timer interval based on previous results. +	* The interval must be the shortest necessary to satisfy ANI, +	* short calibration and long calibration. +	*/ +	cal_interval = ATH_LONG_CALINTERVAL; +	if (sc->sc_ah->config.enable_ani) +		cal_interval = min(cal_interval, +				   (u32)ah->config.ani_poll_interval); +	if (!common->ani.caldone) +		cal_interval = min(cal_interval, (u32)short_cal_interval); + +	mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); +	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) { +		if (!ah->caldata->paprd_done) +			ieee80211_queue_work(sc->hw, &sc->paprd_work); +		else if (!ah->paprd_table_write_done) +			ath_paprd_activate(sc); +	} +} + +void ath_start_ani(struct ath_softc *sc) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	unsigned long timestamp = jiffies_to_msecs(jiffies); + +	if (common->disable_ani || +	    !test_bit(SC_OP_ANI_RUN, &sc->sc_flags) || +	    (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) +		return; + +	common->ani.longcal_timer = timestamp; +	common->ani.shortcal_timer = timestamp; +	common->ani.checkani_timer = timestamp; + +	ath_dbg(common, ANI, "Starting ANI\n"); +	mod_timer(&common->ani.timer, +		  jiffies + msecs_to_jiffies((u32)ah->config.ani_poll_interval)); +} + +void ath_stop_ani(struct ath_softc *sc) +{ +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); + +	ath_dbg(common, ANI, "Stopping ANI\n"); +	del_timer_sync(&common->ani.timer); +} + +void ath_check_ani(struct ath_softc *sc) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; + +	/* +	 * Check for the various conditions in which ANI has to +	 * be stopped. +	 */ +	if (ah->opmode == NL80211_IFTYPE_ADHOC) { +		if (!cur_conf->enable_beacon) +			goto stop_ani; +	} else if (ah->opmode == NL80211_IFTYPE_AP) { +		if (!cur_conf->enable_beacon) { +			/* +			 * Disable ANI only when there are no +			 * associated stations. +			 */ +			if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) +				goto stop_ani; +		} +	} else if (ah->opmode == NL80211_IFTYPE_STATION) { +		if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) +			goto stop_ani; +	} + +	if (!test_bit(SC_OP_ANI_RUN, &sc->sc_flags)) { +		set_bit(SC_OP_ANI_RUN, &sc->sc_flags); +		ath_start_ani(sc); +	} + +	return; + +stop_ani: +	clear_bit(SC_OP_ANI_RUN, &sc->sc_flags); +	ath_stop_ani(sc); +} + +void ath_update_survey_nf(struct ath_softc *sc, int channel) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath9k_channel *chan = &ah->channels[channel]; +	struct survey_info *survey = &sc->survey[channel]; + +	if (chan->noisefloor) { +		survey->filled |= SURVEY_INFO_NOISE_DBM; +		survey->noise = ath9k_hw_getchan_noise(ah, chan); +	} +} + +/* + * Updates the survey statistics and returns the busy time since last + * update in %, if the measurement duration was long enough for the + * result to be useful, -1 otherwise. + */ +int ath_update_survey_stats(struct ath_softc *sc) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	int pos = ah->curchan - &ah->channels[0]; +	struct survey_info *survey = &sc->survey[pos]; +	struct ath_cycle_counters *cc = &common->cc_survey; +	unsigned int div = common->clockrate * 1000; +	int ret = 0; + +	if (!ah->curchan) +		return -1; + +	if (ah->power_mode == ATH9K_PM_AWAKE) +		ath_hw_cycle_counters_update(common); + +	if (cc->cycles > 0) { +		survey->filled |= SURVEY_INFO_CHANNEL_TIME | +			SURVEY_INFO_CHANNEL_TIME_BUSY | +			SURVEY_INFO_CHANNEL_TIME_RX | +			SURVEY_INFO_CHANNEL_TIME_TX; +		survey->channel_time += cc->cycles / div; +		survey->channel_time_busy += cc->rx_busy / div; +		survey->channel_time_rx += cc->rx_frame / div; +		survey->channel_time_tx += cc->tx_frame / div; +	} + +	if (cc->cycles < div) +		return -1; + +	if (cc->cycles > 0) +		ret = cc->rx_busy * 100 / cc->cycles; + +	memset(cc, 0, sizeof(*cc)); + +	ath_update_survey_nf(sc, pos); + +	return ret; +} diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 04ef775ccee..7990cd55599 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c @@ -810,7 +810,7 @@ void ath9k_hw_enable_interrupts(struct ath_hw *ah)  		return;  	} -	if (AR_SREV_9340(ah)) +	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))  		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;  	async_mask = AR_INTR_MAC_IRQ; diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h index 21c955609e6..0eba36dca6f 100644 --- a/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h @@ -646,6 +646,7 @@ enum ath9k_rx_filter {  	ATH9K_RX_FILTER_PHYRADAR = 0x00002000,  	ATH9K_RX_FILTER_MCAST_BCAST_ALL = 0x00008000,  	ATH9K_RX_FILTER_CONTROL_WRAPPER = 0x00080000, +	ATH9K_RX_FILTER_4ADDRESS = 0x00100000,  };  #define ATH9K_RATESERIES_RTS_CTS  0x0001 diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index dfa78e8b647..6049d8b8285 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -19,7 +19,10 @@  #include "ath9k.h"  #include "btcoex.h" -static u8 parse_mpdudensity(u8 mpdudensity) +static void ath9k_set_assoc_state(struct ath_softc *sc, +				  struct ieee80211_vif *vif); + +u8 ath9k_parse_mpdudensity(u8 mpdudensity)  {  	/*  	 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing": @@ -101,6 +104,7 @@ void ath9k_ps_wakeup(struct ath_softc *sc)  		spin_lock(&common->cc_lock);  		ath_hw_cycle_counters_update(common);  		memset(&common->cc_survey, 0, sizeof(common->cc_survey)); +		memset(&common->cc_ani, 0, sizeof(common->cc_ani));  		spin_unlock(&common->cc_lock);  	} @@ -129,6 +133,8 @@ void ath9k_ps_restore(struct ath_softc *sc)  				     PS_WAIT_FOR_PSPOLL_DATA |  				     PS_WAIT_FOR_TX_ACK))) {  		mode = ATH9K_PM_NETWORK_SLEEP; +		if (ath9k_hw_btcoex_is_enabled(sc->sc_ah)) +			ath9k_btcoex_stop_gen_timer(sc);  	} else {  		goto unlock;  	} @@ -143,90 +149,17 @@ void ath9k_ps_restore(struct ath_softc *sc)  	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);  } -void ath_start_ani(struct ath_common *common) -{ -	struct ath_hw *ah = common->ah; -	unsigned long timestamp = jiffies_to_msecs(jiffies); -	struct ath_softc *sc = (struct ath_softc *) common->priv; - -	if (!(sc->sc_flags & SC_OP_ANI_RUN)) -		return; - -	if (sc->sc_flags & SC_OP_OFFCHANNEL) -		return; - -	common->ani.longcal_timer = timestamp; -	common->ani.shortcal_timer = timestamp; -	common->ani.checkani_timer = timestamp; - -	mod_timer(&common->ani.timer, -		  jiffies + -			msecs_to_jiffies((u32)ah->config.ani_poll_interval)); -} - -static void ath_update_survey_nf(struct ath_softc *sc, int channel) -{ -	struct ath_hw *ah = sc->sc_ah; -	struct ath9k_channel *chan = &ah->channels[channel]; -	struct survey_info *survey = &sc->survey[channel]; - -	if (chan->noisefloor) { -		survey->filled |= SURVEY_INFO_NOISE_DBM; -		survey->noise = ath9k_hw_getchan_noise(ah, chan); -	} -} - -/* - * Updates the survey statistics and returns the busy time since last - * update in %, if the measurement duration was long enough for the - * result to be useful, -1 otherwise. - */ -static int ath_update_survey_stats(struct ath_softc *sc) -{ -	struct ath_hw *ah = sc->sc_ah; -	struct ath_common *common = ath9k_hw_common(ah); -	int pos = ah->curchan - &ah->channels[0]; -	struct survey_info *survey = &sc->survey[pos]; -	struct ath_cycle_counters *cc = &common->cc_survey; -	unsigned int div = common->clockrate * 1000; -	int ret = 0; - -	if (!ah->curchan) -		return -1; - -	if (ah->power_mode == ATH9K_PM_AWAKE) -		ath_hw_cycle_counters_update(common); - -	if (cc->cycles > 0) { -		survey->filled |= SURVEY_INFO_CHANNEL_TIME | -			SURVEY_INFO_CHANNEL_TIME_BUSY | -			SURVEY_INFO_CHANNEL_TIME_RX | -			SURVEY_INFO_CHANNEL_TIME_TX; -		survey->channel_time += cc->cycles / div; -		survey->channel_time_busy += cc->rx_busy / div; -		survey->channel_time_rx += cc->rx_frame / div; -		survey->channel_time_tx += cc->tx_frame / div; -	} - -	if (cc->cycles < div) -		return -1; - -	if (cc->cycles > 0) -		ret = cc->rx_busy * 100 / cc->cycles; - -	memset(cc, 0, sizeof(*cc)); - -	ath_update_survey_nf(sc, pos); - -	return ret; -} -  static void __ath_cancel_work(struct ath_softc *sc)  {  	cancel_work_sync(&sc->paprd_work);  	cancel_work_sync(&sc->hw_check_work);  	cancel_delayed_work_sync(&sc->tx_complete_work);  	cancel_delayed_work_sync(&sc->hw_pll_work); + +#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT +	if (ath9k_hw_mci_is_enabled(sc->sc_ah)) +		cancel_work_sync(&sc->mci_work); +#endif  }  static void ath_cancel_work(struct ath_softc *sc) @@ -235,26 +168,39 @@ static void ath_cancel_work(struct ath_softc *sc)  	cancel_work_sync(&sc->hw_reset_work);  } +static void ath_restart_work(struct ath_softc *sc) +{ +	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); + +	if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9485(sc->sc_ah) || +	    AR_SREV_9550(sc->sc_ah)) +		ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, +				     msecs_to_jiffies(ATH_PLL_WORK_INTERVAL)); + +	ath_start_rx_poll(sc, 3); +	ath_start_ani(sc); +} +  static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush)  {  	struct ath_hw *ah = sc->sc_ah; -	struct ath_common *common = ath9k_hw_common(ah); -	bool ret; +	bool ret = true;  	ieee80211_stop_queues(sc->hw);  	sc->hw_busy_count = 0; -	del_timer_sync(&common->ani.timer); +	ath_stop_ani(sc);  	del_timer_sync(&sc->rx_poll_timer);  	ath9k_debug_samp_bb_mac(sc);  	ath9k_hw_disable_interrupts(ah); -	ret = ath_drain_all_txq(sc, retry_tx); -  	if (!ath_stoprecv(sc))  		ret = false; +	if (!ath_drain_all_txq(sc, retry_tx)) +		ret = false; +  	if (!flush) {  		if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)  			ath_rx_tasklet(sc, 1, true); @@ -270,6 +216,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); +	unsigned long flags;  	if (ath_startrecv(sc) != 0) {  		ath_err(common, "Unable to restart recv logic\n"); @@ -278,36 +225,30 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)  	ath9k_cmn_update_txpow(ah, sc->curtxpow,  			       sc->config.txpowlimit, &sc->curtxpow); + +	clear_bit(SC_OP_HW_RESET, &sc->sc_flags);  	ath9k_hw_set_interrupts(ah);  	ath9k_hw_enable_interrupts(ah); -	if (!(sc->sc_flags & (SC_OP_OFFCHANNEL)) && start) { -		if (sc->sc_flags & SC_OP_BEACONS) -			ath_set_beacon(sc); - -		ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); -		ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, HZ/2); -		ath_start_rx_poll(sc, 3); -		if (!common->disable_ani) -			ath_start_ani(common); -	} +	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) && start) { +		if (!test_bit(SC_OP_BEACONS, &sc->sc_flags)) +			goto work; -	if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) { -		struct ath_hw_antcomb_conf div_ant_conf; -		u8 lna_conf; +		ath9k_set_beacon(sc); -		ath9k_hw_antdiv_comb_conf_get(ah, &div_ant_conf); - -		if (sc->ant_rx == 1) -			lna_conf = ATH_ANT_DIV_COMB_LNA1; -		else -			lna_conf = ATH_ANT_DIV_COMB_LNA2; -		div_ant_conf.main_lna_conf = lna_conf; -		div_ant_conf.alt_lna_conf = lna_conf; - -		ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); +		if (ah->opmode == NL80211_IFTYPE_STATION && +		    test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) { +			spin_lock_irqsave(&sc->sc_pm_lock, flags); +			sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON; +			spin_unlock_irqrestore(&sc->sc_pm_lock, flags); +		} +	work: +		ath_restart_work(sc);  	} +	if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) +		ath_ant_comb_update(sc); +  	ieee80211_wake_queues(sc->hw);  	return true; @@ -327,7 +268,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan,  	spin_lock_bh(&sc->sc_pcu_lock); -	if (!(sc->sc_flags & SC_OP_OFFCHANNEL)) { +	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) {  		fastcc = false;  		caldata = &sc->caldata;  	} @@ -370,7 +311,7 @@ static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,  {  	int r; -	if (sc->sc_flags & SC_OP_INVALID) +	if (test_bit(SC_OP_INVALID, &sc->sc_flags))  		return -EIO;  	r = ath_reset_internal(sc, hchan, false); @@ -378,262 +319,11 @@ static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,  	return r;  } -static void ath_paprd_activate(struct ath_softc *sc) -{ -	struct ath_hw *ah = sc->sc_ah; -	struct ath9k_hw_cal_data *caldata = ah->caldata; -	int chain; - -	if (!caldata || !caldata->paprd_done) -		return; - -	ath9k_ps_wakeup(sc); -	ar9003_paprd_enable(ah, false); -	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { -		if (!(ah->txchainmask & BIT(chain))) -			continue; - -		ar9003_paprd_populate_single_table(ah, caldata, chain); -	} - -	ar9003_paprd_enable(ah, true); -	ath9k_ps_restore(sc); -} - -static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int chain) -{ -	struct ieee80211_hw *hw = sc->hw; -	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); -	struct ath_hw *ah = sc->sc_ah; -	struct ath_common *common = ath9k_hw_common(ah); -	struct ath_tx_control txctl; -	int time_left; - -	memset(&txctl, 0, sizeof(txctl)); -	txctl.txq = sc->tx.txq_map[WME_AC_BE]; - -	memset(tx_info, 0, sizeof(*tx_info)); -	tx_info->band = hw->conf.channel->band; -	tx_info->flags |= IEEE80211_TX_CTL_NO_ACK; -	tx_info->control.rates[0].idx = 0; -	tx_info->control.rates[0].count = 1; -	tx_info->control.rates[0].flags = IEEE80211_TX_RC_MCS; -	tx_info->control.rates[1].idx = -1; - -	init_completion(&sc->paprd_complete); -	txctl.paprd = BIT(chain); - -	if (ath_tx_start(hw, skb, &txctl) != 0) { -		ath_dbg(common, CALIBRATE, "PAPRD TX failed\n"); -		dev_kfree_skb_any(skb); -		return false; -	} - -	time_left = wait_for_completion_timeout(&sc->paprd_complete, -			msecs_to_jiffies(ATH_PAPRD_TIMEOUT)); - -	if (!time_left) -		ath_dbg(common, CALIBRATE, -			"Timeout waiting for paprd training on TX chain %d\n", -			chain); - -	return !!time_left; -} - -void ath_paprd_calibrate(struct work_struct *work) -{ -	struct ath_softc *sc = container_of(work, struct ath_softc, paprd_work); -	struct ieee80211_hw *hw = sc->hw; -	struct ath_hw *ah = sc->sc_ah; -	struct ieee80211_hdr *hdr; -	struct sk_buff *skb = NULL; -	struct ath9k_hw_cal_data *caldata = ah->caldata; -	struct ath_common *common = ath9k_hw_common(ah); -	int ftype; -	int chain_ok = 0; -	int chain; -	int len = 1800; - -	if (!caldata) -		return; - -	ath9k_ps_wakeup(sc); - -	if (ar9003_paprd_init_table(ah) < 0) -		goto fail_paprd; - -	skb = alloc_skb(len, GFP_KERNEL); -	if (!skb) -		goto fail_paprd; - -	skb_put(skb, len); -	memset(skb->data, 0, len); -	hdr = (struct ieee80211_hdr *)skb->data; -	ftype = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC; -	hdr->frame_control = cpu_to_le16(ftype); -	hdr->duration_id = cpu_to_le16(10); -	memcpy(hdr->addr1, hw->wiphy->perm_addr, ETH_ALEN); -	memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN); -	memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN); - -	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { -		if (!(ah->txchainmask & BIT(chain))) -			continue; - -		chain_ok = 0; - -		ath_dbg(common, CALIBRATE, -			"Sending PAPRD frame for thermal measurement on chain %d\n", -			chain); -		if (!ath_paprd_send_frame(sc, skb, chain)) -			goto fail_paprd; - -		ar9003_paprd_setup_gain_table(ah, chain); - -		ath_dbg(common, CALIBRATE, -			"Sending PAPRD training frame on chain %d\n", chain); -		if (!ath_paprd_send_frame(sc, skb, chain)) -			goto fail_paprd; - -		if (!ar9003_paprd_is_done(ah)) { -			ath_dbg(common, CALIBRATE, -				"PAPRD not yet done on chain %d\n", chain); -			break; -		} - -		if (ar9003_paprd_create_curve(ah, caldata, chain)) { -			ath_dbg(common, CALIBRATE, -				"PAPRD create curve failed on chain %d\n", -								   chain); -			break; -		} - -		chain_ok = 1; -	} -	kfree_skb(skb); - -	if (chain_ok) { -		caldata->paprd_done = true; -		ath_paprd_activate(sc); -	} - -fail_paprd: -	ath9k_ps_restore(sc); -} - -/* - *  This routine performs the periodic noise floor calibration function - *  that is used to adjust and optimize the chip performance.  This - *  takes environmental changes (location, temperature) into account. - *  When the task is complete, it reschedules itself depending on the - *  appropriate interval that was calculated. - */ -void ath_ani_calibrate(unsigned long data) -{ -	struct ath_softc *sc = (struct ath_softc *)data; -	struct ath_hw *ah = sc->sc_ah; -	struct ath_common *common = ath9k_hw_common(ah); -	bool longcal = false; -	bool shortcal = false; -	bool aniflag = false; -	unsigned int timestamp = jiffies_to_msecs(jiffies); -	u32 cal_interval, short_cal_interval, long_cal_interval; -	unsigned long flags; - -	if (ah->caldata && ah->caldata->nfcal_interference) -		long_cal_interval = ATH_LONG_CALINTERVAL_INT; -	else -		long_cal_interval = ATH_LONG_CALINTERVAL; - -	short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ? -		ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL; - -	/* Only calibrate if awake */ -	if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE) -		goto set_timer; - -	ath9k_ps_wakeup(sc); - -	/* Long calibration runs independently of short calibration. */ -	if ((timestamp - common->ani.longcal_timer) >= long_cal_interval) { -		longcal = true; -		common->ani.longcal_timer = timestamp; -	} - -	/* Short calibration applies only while caldone is false */ -	if (!common->ani.caldone) { -		if ((timestamp - common->ani.shortcal_timer) >= short_cal_interval) { -			shortcal = true; -			common->ani.shortcal_timer = timestamp; -			common->ani.resetcal_timer = timestamp; -		} -	} else { -		if ((timestamp - common->ani.resetcal_timer) >= -		    ATH_RESTART_CALINTERVAL) { -			common->ani.caldone = ath9k_hw_reset_calvalid(ah); -			if (common->ani.caldone) -				common->ani.resetcal_timer = timestamp; -		} -	} - -	/* Verify whether we must check ANI */ -	if (sc->sc_ah->config.enable_ani -	    && (timestamp - common->ani.checkani_timer) >= -	    ah->config.ani_poll_interval) { -		aniflag = true; -		common->ani.checkani_timer = timestamp; -	} - -	/* Call ANI routine if necessary */ -	if (aniflag) { -		spin_lock_irqsave(&common->cc_lock, flags); -		ath9k_hw_ani_monitor(ah, ah->curchan); -		ath_update_survey_stats(sc); -		spin_unlock_irqrestore(&common->cc_lock, flags); -	} - -	/* Perform calibration if necessary */ -	if (longcal || shortcal) { -		common->ani.caldone = -			ath9k_hw_calibrate(ah, ah->curchan, -						ah->rxchainmask, longcal); -	} - -	ath_dbg(common, ANI, -		"Calibration @%lu finished: %s %s %s, caldone: %s\n", -		jiffies, -		longcal ? "long" : "", shortcal ? "short" : "", -		aniflag ? "ani" : "", common->ani.caldone ? "true" : "false"); - -	ath9k_ps_restore(sc); - -set_timer: -	/* -	* Set timer interval based on previous results. -	* The interval must be the shortest necessary to satisfy ANI, -	* short calibration and long calibration. -	*/ -	ath9k_debug_samp_bb_mac(sc); -	cal_interval = ATH_LONG_CALINTERVAL; -	if (sc->sc_ah->config.enable_ani) -		cal_interval = min(cal_interval, -				   (u32)ah->config.ani_poll_interval); -	if (!common->ani.caldone) -		cal_interval = min(cal_interval, (u32)short_cal_interval); - -	mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); -	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) { -		if (!ah->caldata->paprd_done) -			ieee80211_queue_work(sc->hw, &sc->paprd_work); -		else if (!ah->paprd_table_write_done) -			ath_paprd_activate(sc); -	} -} -  static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,  			    struct ieee80211_vif *vif)  {  	struct ath_node *an; +	u8 density;  	an = (struct ath_node *)sta->drv_priv;  #ifdef CONFIG_ATH9K_DEBUGFS @@ -648,7 +338,8 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,  		ath_tx_node_init(sc, an);  		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +  				     sta->ht_cap.ampdu_factor); -		an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density); +		density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density); +		an->mpdudensity = density;  	}  } @@ -667,13 +358,13 @@ static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta)  		ath_tx_node_cleanup(sc, an);  } -  void ath9k_tasklet(unsigned long data)  {  	struct ath_softc *sc = (struct ath_softc *)data;  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); - +	enum ath_reset_type type; +	unsigned long flags;  	u32 status = sc->intrstatus;  	u32 rxmask; @@ -682,20 +373,17 @@ void ath9k_tasklet(unsigned long data)  	if ((status & ATH9K_INT_FATAL) ||  	    (status & ATH9K_INT_BB_WATCHDOG)) { -#ifdef CONFIG_ATH9K_DEBUGFS -		enum ath_reset_type type;  		if (status & ATH9K_INT_FATAL)  			type = RESET_TYPE_FATAL_INT;  		else  			type = RESET_TYPE_BB_WATCHDOG; -		RESET_STAT_INC(sc, type); -#endif -		ieee80211_queue_work(sc->hw, &sc->hw_reset_work); +		ath9k_queue_reset(sc, type);  		goto out;  	} +	spin_lock_irqsave(&sc->sc_pm_lock, flags);  	if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {  		/*  		 * TSF sync does not look correct; remain awake to sync with @@ -704,6 +392,7 @@ void ath9k_tasklet(unsigned long data)  		ath_dbg(common, PS, "TSFOOR - Sync with next Beacon\n");  		sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC;  	} +	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);  	if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)  		rxmask = (ATH9K_INT_RXHP | ATH9K_INT_RXLP | ATH9K_INT_RXEOL | @@ -765,15 +454,17 @@ irqreturn_t ath_isr(int irq, void *dev)  	 * touch anything. Note this can happen early  	 * on if the IRQ is shared.  	 */ -	if (sc->sc_flags & SC_OP_INVALID) +	if (test_bit(SC_OP_INVALID, &sc->sc_flags))  		return IRQ_NONE; -  	/* shared irq, not for us */  	if (!ath9k_hw_intrpend(ah))  		return IRQ_NONE; +	if(test_bit(SC_OP_HW_RESET, &sc->sc_flags)) +		return IRQ_HANDLED; +  	/*  	 * Figure out the reason(s) for the interrupt.  Note  	 * that the hal returns a pseudo-ISR that may include @@ -796,6 +487,17 @@ irqreturn_t ath_isr(int irq, void *dev)  	if (status & SCHED_INTR)  		sched = true; +#ifdef CONFIG_PM_SLEEP +	if (status & ATH9K_INT_BMISS) { +		if (atomic_read(&sc->wow_sleep_proc_intr) == 0) { +			ath_dbg(common, ANY, "during WoW we got a BMISS\n"); +			atomic_inc(&sc->wow_got_bmiss_intr); +			atomic_dec(&sc->wow_sleep_proc_intr); +		} +	ath_dbg(common, INTERRUPT, "beacon miss interrupt\n"); +	} +#endif +  	/*  	 * If a FATAL or RXORN interrupt is received, we have to reset the  	 * chip immediately. @@ -826,24 +528,6 @@ irqreturn_t ath_isr(int irq, void *dev)  		ath9k_hw_set_interrupts(ah);  	} -	if (status & ATH9K_INT_MIB) { -		/* -		 * Disable interrupts until we service the MIB -		 * interrupt; otherwise it will continue to -		 * fire. -		 */ -		ath9k_hw_disable_interrupts(ah); -		/* -		 * Let the hal handle the event. We assume -		 * it will clear whatever condition caused -		 * the interrupt. -		 */ -		spin_lock(&common->cc_lock); -		ath9k_hw_proc_mib_event(ah); -		spin_unlock(&common->cc_lock); -		ath9k_hw_enable_interrupts(ah); -	} -  	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))  		if (status & ATH9K_INT_TIM_TIMER) {  			if (ATH_DBG_WARN_ON_ONCE(sc->ps_idle)) @@ -851,8 +535,10 @@ irqreturn_t ath_isr(int irq, void *dev)  			/* Clear RxAbort bit so that we can  			 * receive frames */  			ath9k_setpower(sc, ATH9K_PM_AWAKE); +			spin_lock(&sc->sc_pm_lock);  			ath9k_hw_setrxabort(sc->sc_ah, 0);  			sc->ps_flags |= PS_WAIT_FOR_BEACON; +			spin_unlock(&sc->sc_pm_lock);  		}  chip_reset: @@ -894,92 +580,20 @@ static int ath_reset(struct ath_softc *sc, bool retry_tx)  	return r;  } -void ath_reset_work(struct work_struct *work) +void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type)  { -	struct ath_softc *sc = container_of(work, struct ath_softc, hw_reset_work); - -	ath_reset(sc, true); -} - -void ath_hw_check(struct work_struct *work) -{ -	struct ath_softc *sc = container_of(work, struct ath_softc, hw_check_work); -	struct ath_common *common = ath9k_hw_common(sc->sc_ah); -	unsigned long flags; -	int busy; -	u8 is_alive, nbeacon = 1; - -	ath9k_ps_wakeup(sc); -	is_alive = ath9k_hw_check_alive(sc->sc_ah); - -	if (is_alive && !AR_SREV_9300(sc->sc_ah)) -		goto out; -	else if (!is_alive && AR_SREV_9300(sc->sc_ah)) { -		ath_dbg(common, RESET, -			"DCU stuck is detected. Schedule chip reset\n"); -		RESET_STAT_INC(sc, RESET_TYPE_MAC_HANG); -		goto sched_reset; -	} - -	spin_lock_irqsave(&common->cc_lock, flags); -	busy = ath_update_survey_stats(sc); -	spin_unlock_irqrestore(&common->cc_lock, flags); - -	ath_dbg(common, RESET, "Possible baseband hang, busy=%d (try %d)\n", -		busy, sc->hw_busy_count + 1); -	if (busy >= 99) { -		if (++sc->hw_busy_count >= 3) { -			RESET_STAT_INC(sc, RESET_TYPE_BB_HANG); -			goto sched_reset; -		} -	} else if (busy >= 0) { -		sc->hw_busy_count = 0; -		nbeacon = 3; -	} - -	ath_start_rx_poll(sc, nbeacon); -	goto out; - -sched_reset: +#ifdef CONFIG_ATH9K_DEBUGFS +	RESET_STAT_INC(sc, type); +#endif +	set_bit(SC_OP_HW_RESET, &sc->sc_flags);  	ieee80211_queue_work(sc->hw, &sc->hw_reset_work); -out: -	ath9k_ps_restore(sc);  } -static void ath_hw_pll_rx_hang_check(struct ath_softc *sc, u32 pll_sqsum) -{ -	static int count; -	struct ath_common *common = ath9k_hw_common(sc->sc_ah); - -	if (pll_sqsum >= 0x40000) { -		count++; -		if (count == 3) { -			/* Rx is hung for more than 500ms. Reset it */ -			ath_dbg(common, RESET, "Possible RX hang, resetting\n"); -			RESET_STAT_INC(sc, RESET_TYPE_PLL_HANG); -			ieee80211_queue_work(sc->hw, &sc->hw_reset_work); -			count = 0; -		} -	} else -		count = 0; -} - -void ath_hw_pll_work(struct work_struct *work) +void ath_reset_work(struct work_struct *work)  { -	struct ath_softc *sc = container_of(work, struct ath_softc, -					    hw_pll_work.work); -	u32 pll_sqsum; - -	if (AR_SREV_9485(sc->sc_ah)) { - -		ath9k_ps_wakeup(sc); -		pll_sqsum = ar9003_get_pll_sqsum_dvc(sc->sc_ah); -		ath9k_ps_restore(sc); - -		ath_hw_pll_rx_hang_check(sc, pll_sqsum); +	struct ath_softc *sc = container_of(work, struct ath_softc, hw_reset_work); -		ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, HZ/5); -	} +	ath_reset(sc, true);  }  /**********************/ @@ -1044,10 +658,9 @@ static int ath9k_start(struct ieee80211_hw *hw)  	if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)  		ah->imask |= ATH9K_INT_CST; -	if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -		ah->imask |= ATH9K_INT_MCI; +	ath_mci_enable(sc); -	sc->sc_flags &= ~SC_OP_INVALID; +	clear_bit(SC_OP_INVALID, &sc->sc_flags);  	sc->sc_ah->is_monitoring = false;  	if (!ath_complete_reset(sc, false)) { @@ -1070,8 +683,6 @@ static int ath9k_start(struct ieee80211_hw *hw)  	spin_unlock_bh(&sc->sc_pcu_lock); -	ath9k_start_btcoex(sc); -  	if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en)  		common->bus_ops->extn_synch_en(common); @@ -1089,6 +700,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_tx_control txctl;  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; +	unsigned long flags;  	if (sc->ps_enabled) {  		/* @@ -1111,6 +723,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)  		 * completed and if needed, also for RX of buffered frames.  		 */  		ath9k_ps_wakeup(sc); +		spin_lock_irqsave(&sc->sc_pm_lock, flags);  		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))  			ath9k_hw_setrxabort(sc->sc_ah, 0);  		if (ieee80211_is_pspoll(hdr->frame_control)) { @@ -1126,6 +739,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)  		 * the ps_flags bit is cleared. We are just dropping  		 * the ps_usecount here.  		 */ +		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);  		ath9k_ps_restore(sc);  	} @@ -1166,7 +780,7 @@ static void ath9k_stop(struct ieee80211_hw *hw)  	ath_cancel_work(sc);  	del_timer_sync(&sc->rx_poll_timer); -	if (sc->sc_flags & SC_OP_INVALID) { +	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {  		ath_dbg(common, ANY, "Device not present\n");  		mutex_unlock(&sc->mutex);  		return; @@ -1175,8 +789,6 @@ static void ath9k_stop(struct ieee80211_hw *hw)  	/* Ensure HW is awake when we try to shut it down. */  	ath9k_ps_wakeup(sc); -	ath9k_stop_btcoex(sc); -  	spin_lock_bh(&sc->sc_pcu_lock);  	/* prevent tasklets to enable interrupts once we disable them */ @@ -1223,7 +835,7 @@ static void ath9k_stop(struct ieee80211_hw *hw)  	ath9k_ps_restore(sc); -	sc->sc_flags |= SC_OP_INVALID; +	set_bit(SC_OP_INVALID, &sc->sc_flags);  	sc->ps_idle = prev_idle;  	mutex_unlock(&sc->mutex); @@ -1243,16 +855,6 @@ bool ath9k_uses_beacons(int type)  	}  } -static void ath9k_reclaim_beacon(struct ath_softc *sc, -				 struct ieee80211_vif *vif) -{ -	struct ath_vif *avp = (void *)vif->drv_priv; - -	ath9k_set_beaconing_status(sc, false); -	ath_beacon_return(sc, avp); -	ath9k_set_beaconing_status(sc, true); -} -  static void ath9k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)  {  	struct ath9k_vif_iter_data *iter_data = data; @@ -1284,6 +886,18 @@ static void ath9k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)  	}  } +static void ath9k_sta_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif) +{ +	struct ath_softc *sc = data; +	struct ath_vif *avp = (void *)vif->drv_priv; + +	if (vif->type != NL80211_IFTYPE_STATION) +		return; + +	if (avp->primary_sta_vif) +		ath9k_set_assoc_state(sc, vif); +} +  /* Called with sc->mutex held. */  void ath9k_calculate_iter_data(struct ieee80211_hw *hw,  			       struct ieee80211_vif *vif, @@ -1317,21 +931,18 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah);  	struct ath9k_vif_iter_data iter_data; +	enum nl80211_iftype old_opmode = ah->opmode;  	ath9k_calculate_iter_data(hw, vif, &iter_data); -	/* Set BSSID mask. */  	memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);  	ath_hw_setbssidmask(common); -	/* Set op-mode & TSF */  	if (iter_data.naps > 0) { -		ath9k_hw_set_tsfadjust(ah, 1); -		sc->sc_flags |= SC_OP_TSF_RESET; +		ath9k_hw_set_tsfadjust(ah, true);  		ah->opmode = NL80211_IFTYPE_AP;  	} else { -		ath9k_hw_set_tsfadjust(ah, 0); -		sc->sc_flags &= ~SC_OP_TSF_RESET; +		ath9k_hw_set_tsfadjust(ah, false);  		if (iter_data.nmeshes)  			ah->opmode = NL80211_IFTYPE_MESH_POINT; @@ -1343,70 +954,27 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,  			ah->opmode = NL80211_IFTYPE_STATION;  	} -	/* -	 * Enable MIB interrupts when there are hardware phy counters. -	 */ -	if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) { -		if (ah->config.enable_ani) -			ah->imask |= ATH9K_INT_MIB; +	ath9k_hw_setopmode(ah); + +	if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0)  		ah->imask |= ATH9K_INT_TSFOOR; -	} else { -		ah->imask &= ~ATH9K_INT_MIB; +	else  		ah->imask &= ~ATH9K_INT_TSFOOR; -	}  	ath9k_hw_set_interrupts(ah); -	/* Set up ANI */ -	if (iter_data.naps > 0) { -		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; - -		if (!common->disable_ani) { -			sc->sc_flags |= SC_OP_ANI_RUN; -			ath_start_ani(common); -		} - -	} else { -		sc->sc_flags &= ~SC_OP_ANI_RUN; -		del_timer_sync(&common->ani.timer); -	} -} - -/* Called with sc->mutex held, vif counts set up properly. */ -static void ath9k_do_vif_add_setup(struct ieee80211_hw *hw, -				   struct ieee80211_vif *vif) -{ -	struct ath_softc *sc = hw->priv; - -	ath9k_calculate_summary_state(hw, vif); - -	if (ath9k_uses_beacons(vif->type)) { -		/* Reserve a beacon slot for the vif */ -		ath9k_set_beaconing_status(sc, false); -		ath_beacon_alloc(sc, vif); -		ath9k_set_beaconing_status(sc, true); +	/* +	 * If we are changing the opmode to STATION, +	 * a beacon sync needs to be done. +	 */ +	if (ah->opmode == NL80211_IFTYPE_STATION && +	    old_opmode == NL80211_IFTYPE_AP && +	    test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) { +		ieee80211_iterate_active_interfaces_atomic(sc->hw, +						   ath9k_sta_vif_iter, sc);  	}  } -void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon) -{ -	if (!AR_SREV_9300(sc->sc_ah)) -		return; - -	if (!(sc->sc_flags & SC_OP_PRIM_STA_VIF)) -		return; - -	mod_timer(&sc->rx_poll_timer, jiffies + msecs_to_jiffies -			(nbeacon * sc->cur_beacon_conf.beacon_interval)); -} - -void ath_rx_poll(unsigned long data) -{ -	struct ath_softc *sc = (struct ath_softc *)data; - -	ieee80211_queue_work(sc->hw, &sc->hw_check_work); -} -  static int ath9k_add_interface(struct ieee80211_hw *hw,  			       struct ieee80211_vif *vif)  { @@ -1442,20 +1010,14 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,  		}  	} -	if ((ah->opmode == NL80211_IFTYPE_ADHOC) || -	    ((vif->type == NL80211_IFTYPE_ADHOC) && -	     sc->nvifs > 0)) { -		ath_err(common, "Cannot create ADHOC interface when other" -			" interfaces already exist.\n"); -		ret = -EINVAL; -		goto out; -	} -  	ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);  	sc->nvifs++; -	ath9k_do_vif_add_setup(hw, vif); +	ath9k_calculate_summary_state(hw, vif); +	if (ath9k_uses_beacons(vif->type)) +		ath9k_beacon_assign_slot(sc, vif); +  out:  	mutex_unlock(&sc->mutex);  	ath9k_ps_restore(sc); @@ -1472,18 +1034,10 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,  	int ret = 0;  	ath_dbg(common, CONFIG, "Change Interface\n"); +  	mutex_lock(&sc->mutex);  	ath9k_ps_wakeup(sc); -	/* See if new interface type is valid. */ -	if ((new_type == NL80211_IFTYPE_ADHOC) && -	    (sc->nvifs > 1)) { -		ath_err(common, "When using ADHOC, it must be the only" -			" interface.\n"); -		ret = -EINVAL; -		goto out; -	} -  	if (ath9k_uses_beacons(new_type) &&  	    !ath9k_uses_beacons(vif->type)) {  		if (sc->nbcnvifs >= ATH_BCBUF) { @@ -1493,15 +1047,16 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,  		}  	} -	/* Clean up old vif stuff */  	if (ath9k_uses_beacons(vif->type)) -		ath9k_reclaim_beacon(sc, vif); +		ath9k_beacon_remove_slot(sc, vif); -	/* Add new settings */  	vif->type = new_type;  	vif->p2p = p2p; -	ath9k_do_vif_add_setup(hw, vif); +	ath9k_calculate_summary_state(hw, vif); +	if (ath9k_uses_beacons(vif->type)) +		ath9k_beacon_assign_slot(sc, vif); +  out:  	ath9k_ps_restore(sc);  	mutex_unlock(&sc->mutex); @@ -1521,9 +1076,8 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,  	sc->nvifs--; -	/* Reclaim beacon resources */  	if (ath9k_uses_beacons(vif->type)) -		ath9k_reclaim_beacon(sc, vif); +		ath9k_beacon_remove_slot(sc, vif);  	ath9k_calculate_summary_state(hw, NULL); @@ -1581,14 +1135,17 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)  	if (changed & IEEE80211_CONF_CHANGE_IDLE) {  		sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); -		if (sc->ps_idle) +		if (sc->ps_idle) {  			ath_cancel_work(sc); -		else +			ath9k_stop_btcoex(sc); +		} else { +			ath9k_start_btcoex(sc);  			/*  			 * The chip needs a reset to properly wake up from  			 * full sleep  			 */  			reset_channel = ah->chip_fullsleep; +		}  	}  	/* @@ -1626,11 +1183,6 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)  		if (ah->curchan)  			old_pos = ah->curchan - &ah->channels[0]; -		if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) -			sc->sc_flags |= SC_OP_OFFCHANNEL; -		else -			sc->sc_flags &= ~SC_OP_OFFCHANNEL; -  		ath_dbg(common, CONFIG, "Set channel: %d MHz type: %d\n",  			curchan->center_freq, conf->channel_type); @@ -1672,6 +1224,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)  		if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {  			ath_err(common, "Unable to set channel\n");  			mutex_unlock(&sc->mutex); +			ath9k_ps_restore(sc);  			return -EINVAL;  		} @@ -1821,21 +1374,18 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw,  	qi.tqi_aifs = params->aifs;  	qi.tqi_cwmin = params->cw_min;  	qi.tqi_cwmax = params->cw_max; -	qi.tqi_burstTime = params->txop; +	qi.tqi_burstTime = params->txop * 32;  	ath_dbg(common, CONFIG,  		"Configure tx [queue/halq] [%d/%d], aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",  		queue, txq->axq_qnum, params->aifs, params->cw_min,  		params->cw_max, params->txop); +	ath_update_max_aggr_framelen(sc, queue, qi.tqi_burstTime);  	ret = ath_txq_update(sc, txq->axq_qnum, &qi);  	if (ret)  		ath_err(common, "TXQ Update failed\n"); -	if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) -		if (queue == WME_AC_BE && !ret) -			ath_beaconq_config(sc); -  	mutex_unlock(&sc->mutex);  	ath9k_ps_restore(sc); @@ -1904,83 +1454,53 @@ static int ath9k_set_key(struct ieee80211_hw *hw,  	return ret;  } -static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif) + +static void ath9k_set_assoc_state(struct ath_softc *sc, +				  struct ieee80211_vif *vif)  { -	struct ath_softc *sc = data;  	struct ath_common *common = ath9k_hw_common(sc->sc_ah); -	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;  	struct ath_vif *avp = (void *)vif->drv_priv; +	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; +	unsigned long flags; + +	set_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags); +	avp->primary_sta_vif = true;  	/* -	 * Skip iteration if primary station vif's bss info -	 * was not changed +	 * Set the AID, BSSID and do beacon-sync only when +	 * the HW opmode is STATION. +	 * +	 * But the primary bit is set above in any case.  	 */ -	if (sc->sc_flags & SC_OP_PRIM_STA_VIF) +	if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)  		return; -	if (bss_conf->assoc) { -		sc->sc_flags |= SC_OP_PRIM_STA_VIF; -		avp->primary_sta_vif = true; -		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); -		common->curaid = bss_conf->aid; -		ath9k_hw_write_associd(sc->sc_ah); -		ath_dbg(common, CONFIG, "Bss Info ASSOC %d, bssid: %pM\n", -			bss_conf->aid, common->curbssid); -		ath_beacon_config(sc, vif); -		/* -		 * Request a re-configuration of Beacon related timers -		 * on the receipt of the first Beacon frame (i.e., -		 * after time sync with the AP). -		 */ -		sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON; -		/* Reset rssi stats */ -		sc->last_rssi = ATH_RSSI_DUMMY_MARKER; -		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; +	memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); +	common->curaid = bss_conf->aid; +	ath9k_hw_write_associd(sc->sc_ah); -		ath_start_rx_poll(sc, 3); +	sc->last_rssi = ATH_RSSI_DUMMY_MARKER; +	sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; -		if (!common->disable_ani) { -			sc->sc_flags |= SC_OP_ANI_RUN; -			ath_start_ani(common); -		} +	spin_lock_irqsave(&sc->sc_pm_lock, flags); +	sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON; +	spin_unlock_irqrestore(&sc->sc_pm_lock, flags); -	} +	ath_dbg(common, CONFIG, +		"Primary Station interface: %pM, BSSID: %pM\n", +		vif->addr, common->curbssid);  } -static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif) +static void ath9k_bss_assoc_iter(void *data, u8 *mac, struct ieee80211_vif *vif)  { -	struct ath_common *common = ath9k_hw_common(sc->sc_ah); +	struct ath_softc *sc = data;  	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; -	struct ath_vif *avp = (void *)vif->drv_priv; -	if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION) +	if (test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))  		return; -	/* Reconfigure bss info */ -	if (avp->primary_sta_vif && !bss_conf->assoc) { -		ath_dbg(common, CONFIG, "Bss Info DISASSOC %d, bssid %pM\n", -			common->curaid, common->curbssid); -		sc->sc_flags &= ~(SC_OP_PRIM_STA_VIF | SC_OP_BEACONS); -		avp->primary_sta_vif = false; -		memset(common->curbssid, 0, ETH_ALEN); -		common->curaid = 0; -	} - -	ieee80211_iterate_active_interfaces_atomic( -			sc->hw, ath9k_bss_iter, sc); - -	/* -	 * None of station vifs are associated. -	 * Clear bssid & aid -	 */ -	if (!(sc->sc_flags & SC_OP_PRIM_STA_VIF)) { -		ath9k_hw_write_associd(sc->sc_ah); -		/* Stop ANI */ -		sc->sc_flags &= ~SC_OP_ANI_RUN; -		del_timer_sync(&common->ani.timer); -		del_timer_sync(&sc->rx_poll_timer); -		memset(&sc->caldata, 0, sizeof(sc->caldata)); -	} +	if (bss_conf->assoc) +		ath9k_set_assoc_state(sc, vif);  }  static void ath9k_bss_info_changed(struct ieee80211_hw *hw, @@ -1988,6 +1508,11 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,  				   struct ieee80211_bss_conf *bss_conf,  				   u32 changed)  { +#define CHECK_ANI				\ +	(BSS_CHANGED_ASSOC |			\ +	 BSS_CHANGED_IBSS |			\ +	 BSS_CHANGED_BEACON_ENABLED) +  	struct ath_softc *sc = hw->priv;  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); @@ -1998,53 +1523,41 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,  	mutex_lock(&sc->mutex);  	if (changed & BSS_CHANGED_ASSOC) { -		ath9k_config_bss(sc, vif); +		ath_dbg(common, CONFIG, "BSSID %pM Changed ASSOC %d\n", +			bss_conf->bssid, bss_conf->assoc); + +		if (avp->primary_sta_vif && !bss_conf->assoc) { +			clear_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags); +			avp->primary_sta_vif = false; + +			if (ah->opmode == NL80211_IFTYPE_STATION) +				clear_bit(SC_OP_BEACONS, &sc->sc_flags); +		} + +		ieee80211_iterate_active_interfaces_atomic(sc->hw, +						   ath9k_bss_assoc_iter, sc); -		ath_dbg(common, CONFIG, "BSSID: %pM aid: 0x%x\n", -			common->curbssid, common->curaid); +		if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags) && +		    ah->opmode == NL80211_IFTYPE_STATION) { +			memset(common->curbssid, 0, ETH_ALEN); +			common->curaid = 0; +			ath9k_hw_write_associd(sc->sc_ah); +		}  	}  	if (changed & BSS_CHANGED_IBSS) { -		/* There can be only one vif available */  		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);  		common->curaid = bss_conf->aid;  		ath9k_hw_write_associd(sc->sc_ah); - -		if (bss_conf->ibss_joined) { -			sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; - -			if (!common->disable_ani) { -				sc->sc_flags |= SC_OP_ANI_RUN; -				ath_start_ani(common); -			} - -		} else { -			sc->sc_flags &= ~SC_OP_ANI_RUN; -			del_timer_sync(&common->ani.timer); -			del_timer_sync(&sc->rx_poll_timer); -		}  	} -	/* -	 * In case of AP mode, the HW TSF has to be reset -	 * when the beacon interval changes. -	 */ -	if ((changed & BSS_CHANGED_BEACON_INT) && -	    (vif->type == NL80211_IFTYPE_AP)) -		sc->sc_flags |= SC_OP_TSF_RESET; - -	/* Configure beaconing (AP, IBSS, MESH) */ -	if (ath9k_uses_beacons(vif->type) && -	    ((changed & BSS_CHANGED_BEACON) || -	     (changed & BSS_CHANGED_BEACON_ENABLED) || -	     (changed & BSS_CHANGED_BEACON_INT))) { -		ath9k_set_beaconing_status(sc, false); -		if (bss_conf->enable_beacon) -			ath_beacon_alloc(sc, vif); -		else -			avp->is_bslot_active = false; -		ath_beacon_config(sc, vif); -		ath9k_set_beaconing_status(sc, true); +	if ((changed & BSS_CHANGED_BEACON_ENABLED) || +	    (changed & BSS_CHANGED_BEACON_INT)) { +		if (ah->opmode == NL80211_IFTYPE_AP && +		    bss_conf->enable_beacon) +			ath9k_set_tsfadjust(sc, vif); +		if (ath9k_allow_beacon_config(sc, vif)) +			ath9k_beacon_config(sc, vif, changed);  	}  	if (changed & BSS_CHANGED_ERP_SLOT) { @@ -2066,8 +1579,13 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,  		}  	} +	if (changed & CHECK_ANI) +		ath_check_ani(sc); +  	mutex_unlock(&sc->mutex);  	ath9k_ps_restore(sc); + +#undef CHECK_ANI  }  static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) @@ -2223,7 +1741,7 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop)  		return;  	} -	if (sc->sc_flags & SC_OP_INVALID) { +	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {  		ath_dbg(common, ANY, "Device not present\n");  		mutex_unlock(&sc->mutex);  		return; @@ -2296,10 +1814,11 @@ static int ath9k_tx_last_beacon(struct ieee80211_hw *hw)  	if (!vif)  		return 0; -	avp = (void *)vif->drv_priv; -	if (!avp->is_bslot_active) +	if (!vif->bss_conf.enable_beacon)  		return 0; +	avp = (void *)vif->drv_priv; +  	if (!sc->beacon.tx_processed && !edma) {  		tasklet_disable(&sc->bcon_tasklet); @@ -2353,12 +1872,29 @@ static u32 fill_chainmask(u32 cap, u32 new)  	return filled;  } +static bool validate_antenna_mask(struct ath_hw *ah, u32 val) +{ +	switch (val & 0x7) { +	case 0x1: +	case 0x3: +	case 0x7: +		return true; +	case 0x2: +		return (ah->caps.rx_chainmask == 1); +	default: +		return false; +	} +} +  static int ath9k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)  {  	struct ath_softc *sc = hw->priv;  	struct ath_hw *ah = sc->sc_ah; -	if (!rx_ant || !tx_ant) +	if (ah->caps.rx_chainmask != 1) +		rx_ant |= tx_ant; + +	if (!validate_antenna_mask(ah, rx_ant) || !tx_ant)  		return -EINVAL;  	sc->ant_rx = rx_ant; @@ -2388,6 +1924,490 @@ static int ath9k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)  	return 0;  } +#ifdef CONFIG_ATH9K_DEBUGFS + +/* Ethtool support for get-stats */ + +#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO" +static const char ath9k_gstrings_stats[][ETH_GSTRING_LEN] = { +	"tx_pkts_nic", +	"tx_bytes_nic", +	"rx_pkts_nic", +	"rx_bytes_nic", +	AMKSTR(d_tx_pkts), +	AMKSTR(d_tx_bytes), +	AMKSTR(d_tx_mpdus_queued), +	AMKSTR(d_tx_mpdus_completed), +	AMKSTR(d_tx_mpdu_xretries), +	AMKSTR(d_tx_aggregates), +	AMKSTR(d_tx_ampdus_queued_hw), +	AMKSTR(d_tx_ampdus_queued_sw), +	AMKSTR(d_tx_ampdus_completed), +	AMKSTR(d_tx_ampdu_retries), +	AMKSTR(d_tx_ampdu_xretries), +	AMKSTR(d_tx_fifo_underrun), +	AMKSTR(d_tx_op_exceeded), +	AMKSTR(d_tx_timer_expiry), +	AMKSTR(d_tx_desc_cfg_err), +	AMKSTR(d_tx_data_underrun), +	AMKSTR(d_tx_delim_underrun), + +	"d_rx_decrypt_crc_err", +	"d_rx_phy_err", +	"d_rx_mic_err", +	"d_rx_pre_delim_crc_err", +	"d_rx_post_delim_crc_err", +	"d_rx_decrypt_busy_err", + +	"d_rx_phyerr_radar", +	"d_rx_phyerr_ofdm_timing", +	"d_rx_phyerr_cck_timing", + +}; +#define ATH9K_SSTATS_LEN ARRAY_SIZE(ath9k_gstrings_stats) + +static void ath9k_get_et_strings(struct ieee80211_hw *hw, +				 struct ieee80211_vif *vif, +				 u32 sset, u8 *data) +{ +	if (sset == ETH_SS_STATS) +		memcpy(data, *ath9k_gstrings_stats, +		       sizeof(ath9k_gstrings_stats)); +} + +static int ath9k_get_et_sset_count(struct ieee80211_hw *hw, +				   struct ieee80211_vif *vif, int sset) +{ +	if (sset == ETH_SS_STATS) +		return ATH9K_SSTATS_LEN; +	return 0; +} + +#define PR_QNUM(_n) (sc->tx.txq_map[_n]->axq_qnum) +#define AWDATA(elem)							\ +	do {								\ +		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].elem; \ +		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].elem; \ +		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].elem; \ +		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].elem; \ +	} while (0) + +#define AWDATA_RX(elem)						\ +	do {							\ +		data[i++] = sc->debug.stats.rxstats.elem;	\ +	} while (0) + +static void ath9k_get_et_stats(struct ieee80211_hw *hw, +			       struct ieee80211_vif *vif, +			       struct ethtool_stats *stats, u64 *data) +{ +	struct ath_softc *sc = hw->priv; +	int i = 0; + +	data[i++] = (sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].tx_pkts_all + +		     sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].tx_pkts_all + +		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].tx_pkts_all + +		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].tx_pkts_all); +	data[i++] = (sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].tx_bytes_all + +		     sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].tx_bytes_all + +		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].tx_bytes_all + +		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].tx_bytes_all); +	AWDATA_RX(rx_pkts_all); +	AWDATA_RX(rx_bytes_all); + +	AWDATA(tx_pkts_all); +	AWDATA(tx_bytes_all); +	AWDATA(queued); +	AWDATA(completed); +	AWDATA(xretries); +	AWDATA(a_aggr); +	AWDATA(a_queued_hw); +	AWDATA(a_queued_sw); +	AWDATA(a_completed); +	AWDATA(a_retries); +	AWDATA(a_xretries); +	AWDATA(fifo_underrun); +	AWDATA(xtxop); +	AWDATA(timer_exp); +	AWDATA(desc_cfg_err); +	AWDATA(data_underrun); +	AWDATA(delim_underrun); + +	AWDATA_RX(decrypt_crc_err); +	AWDATA_RX(phy_err); +	AWDATA_RX(mic_err); +	AWDATA_RX(pre_delim_crc_err); +	AWDATA_RX(post_delim_crc_err); +	AWDATA_RX(decrypt_busy_err); + +	AWDATA_RX(phy_err_stats[ATH9K_PHYERR_RADAR]); +	AWDATA_RX(phy_err_stats[ATH9K_PHYERR_OFDM_TIMING]); +	AWDATA_RX(phy_err_stats[ATH9K_PHYERR_CCK_TIMING]); + +	WARN_ON(i != ATH9K_SSTATS_LEN); +} + +/* End of ethtool get-stats functions */ + +#endif + + +#ifdef CONFIG_PM_SLEEP + +static void ath9k_wow_map_triggers(struct ath_softc *sc, +				   struct cfg80211_wowlan *wowlan, +				   u32 *wow_triggers) +{ +	if (wowlan->disconnect) +		*wow_triggers |= AH_WOW_LINK_CHANGE | +				 AH_WOW_BEACON_MISS; +	if (wowlan->magic_pkt) +		*wow_triggers |= AH_WOW_MAGIC_PATTERN_EN; + +	if (wowlan->n_patterns) +		*wow_triggers |= AH_WOW_USER_PATTERN_EN; + +	sc->wow_enabled = *wow_triggers; + +} + +static void ath9k_wow_add_disassoc_deauth_pattern(struct ath_softc *sc) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	struct ath9k_hw_capabilities *pcaps = &ah->caps; +	int pattern_count = 0; +	int i, byte_cnt; +	u8 dis_deauth_pattern[MAX_PATTERN_SIZE]; +	u8 dis_deauth_mask[MAX_PATTERN_SIZE]; + +	memset(dis_deauth_pattern, 0, MAX_PATTERN_SIZE); +	memset(dis_deauth_mask, 0, MAX_PATTERN_SIZE); + +	/* +	 * Create Dissassociate / Deauthenticate packet filter +	 * +	 *     2 bytes        2 byte    6 bytes   6 bytes  6 bytes +	 *  +--------------+----------+---------+--------+--------+---- +	 *  + Frame Control+ Duration +   DA    +  SA    +  BSSID + +	 *  +--------------+----------+---------+--------+--------+---- +	 * +	 * The above is the management frame format for disassociate/ +	 * deauthenticate pattern, from this we need to match the first byte +	 * of 'Frame Control' and DA, SA, and BSSID fields +	 * (skipping 2nd byte of FC and Duration feild. +	 * +	 * Disassociate pattern +	 * -------------------- +	 * Frame control = 00 00 1010 +	 * DA, SA, BSSID = x:x:x:x:x:x +	 * Pattern will be A0000000 | x:x:x:x:x:x | x:x:x:x:x:x +	 *			    | x:x:x:x:x:x  -- 22 bytes +	 * +	 * Deauthenticate pattern +	 * ---------------------- +	 * Frame control = 00 00 1100 +	 * DA, SA, BSSID = x:x:x:x:x:x +	 * Pattern will be C0000000 | x:x:x:x:x:x | x:x:x:x:x:x +	 *			    | x:x:x:x:x:x  -- 22 bytes +	 */ + +	/* Create Disassociate Pattern first */ + +	byte_cnt = 0; + +	/* Fill out the mask with all FF's */ + +	for (i = 0; i < MAX_PATTERN_MASK_SIZE; i++) +		dis_deauth_mask[i] = 0xff; + +	/* copy the first byte of frame control field */ +	dis_deauth_pattern[byte_cnt] = 0xa0; +	byte_cnt++; + +	/* skip 2nd byte of frame control and Duration field */ +	byte_cnt += 3; + +	/* +	 * need not match the destination mac address, it can be a broadcast +	 * mac address or an unicast to this station +	 */ +	byte_cnt += 6; + +	/* copy the source mac address */ +	memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN); + +	byte_cnt += 6; + +	/* copy the bssid, its same as the source mac address */ + +	memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN); + +	/* Create Disassociate pattern mask */ + +	if (pcaps->hw_caps & ATH9K_HW_WOW_PATTERN_MATCH_EXACT) { + +		if (pcaps->hw_caps & ATH9K_HW_WOW_PATTERN_MATCH_DWORD) { +			/* +			 * for AR9280, because of hardware limitation, the +			 * first 4 bytes have to be matched for all patterns. +			 * the mask for disassociation and de-auth pattern +			 * matching need to enable the first 4 bytes. +			 * also the duration field needs to be filled. +			 */ +			dis_deauth_mask[0] = 0xf0; + +			/* +			 * fill in duration field +			 FIXME: what is the exact value ? +			 */ +			dis_deauth_pattern[2] = 0xff; +			dis_deauth_pattern[3] = 0xff; +		} else { +			dis_deauth_mask[0] = 0xfe; +		} + +		dis_deauth_mask[1] = 0x03; +		dis_deauth_mask[2] = 0xc0; +	} else { +		dis_deauth_mask[0] = 0xef; +		dis_deauth_mask[1] = 0x3f; +		dis_deauth_mask[2] = 0x00; +		dis_deauth_mask[3] = 0xfc; +	} + +	ath_dbg(common, WOW, "Adding disassoc/deauth patterns for WoW\n"); + +	ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask, +				   pattern_count, byte_cnt); + +	pattern_count++; +	/* +	 * for de-authenticate pattern, only the first byte of the frame +	 * control field gets changed from 0xA0 to 0xC0 +	 */ +	dis_deauth_pattern[0] = 0xC0; + +	ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask, +				   pattern_count, byte_cnt); + +} + +static void ath9k_wow_add_pattern(struct ath_softc *sc, +				  struct cfg80211_wowlan *wowlan) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath9k_wow_pattern *wow_pattern = NULL; +	struct cfg80211_wowlan_trig_pkt_pattern *patterns = wowlan->patterns; +	int mask_len; +	s8 i = 0; + +	if (!wowlan->n_patterns) +		return; + +	/* +	 * Add the new user configured patterns +	 */ +	for (i = 0; i < wowlan->n_patterns; i++) { + +		wow_pattern = kzalloc(sizeof(*wow_pattern), GFP_KERNEL); + +		if (!wow_pattern) +			return; + +		/* +		 * TODO: convert the generic user space pattern to +		 * appropriate chip specific/802.11 pattern. +		 */ + +		mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8); +		memset(wow_pattern->pattern_bytes, 0, MAX_PATTERN_SIZE); +		memset(wow_pattern->mask_bytes, 0, MAX_PATTERN_SIZE); +		memcpy(wow_pattern->pattern_bytes, patterns[i].pattern, +		       patterns[i].pattern_len); +		memcpy(wow_pattern->mask_bytes, patterns[i].mask, mask_len); +		wow_pattern->pattern_len = patterns[i].pattern_len; + +		/* +		 * just need to take care of deauth and disssoc pattern, +		 * make sure we don't overwrite them. +		 */ + +		ath9k_hw_wow_apply_pattern(ah, wow_pattern->pattern_bytes, +					   wow_pattern->mask_bytes, +					   i + 2, +					   wow_pattern->pattern_len); +		kfree(wow_pattern); + +	} + +} + +static int ath9k_suspend(struct ieee80211_hw *hw, +			 struct cfg80211_wowlan *wowlan) +{ +	struct ath_softc *sc = hw->priv; +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	u32 wow_triggers_enabled = 0; +	int ret = 0; + +	mutex_lock(&sc->mutex); + +	ath_cancel_work(sc); +	del_timer_sync(&common->ani.timer); +	del_timer_sync(&sc->rx_poll_timer); + +	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) { +		ath_dbg(common, ANY, "Device not present\n"); +		ret = -EINVAL; +		goto fail_wow; +	} + +	if (WARN_ON(!wowlan)) { +		ath_dbg(common, WOW, "None of the WoW triggers enabled\n"); +		ret = -EINVAL; +		goto fail_wow; +	} + +	if (!device_can_wakeup(sc->dev)) { +		ath_dbg(common, WOW, "device_can_wakeup failed, WoW is not enabled\n"); +		ret = 1; +		goto fail_wow; +	} + +	/* +	 * none of the sta vifs are associated +	 * and we are not currently handling multivif +	 * cases, for instance we have to seperately +	 * configure 'keep alive frame' for each +	 * STA. +	 */ + +	if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) { +		ath_dbg(common, WOW, "None of the STA vifs are associated\n"); +		ret = 1; +		goto fail_wow; +	} + +	if (sc->nvifs > 1) { +		ath_dbg(common, WOW, "WoW for multivif is not yet supported\n"); +		ret = 1; +		goto fail_wow; +	} + +	ath9k_wow_map_triggers(sc, wowlan, &wow_triggers_enabled); + +	ath_dbg(common, WOW, "WoW triggers enabled 0x%x\n", +		wow_triggers_enabled); + +	ath9k_ps_wakeup(sc); + +	ath9k_stop_btcoex(sc); + +	/* +	 * Enable wake up on recieving disassoc/deauth +	 * frame by default. +	 */ +	ath9k_wow_add_disassoc_deauth_pattern(sc); + +	if (wow_triggers_enabled & AH_WOW_USER_PATTERN_EN) +		ath9k_wow_add_pattern(sc, wowlan); + +	spin_lock_bh(&sc->sc_pcu_lock); +	/* +	 * To avoid false wake, we enable beacon miss interrupt only +	 * when we go to sleep. We save the current interrupt mask +	 * so we can restore it after the system wakes up +	 */ +	sc->wow_intr_before_sleep = ah->imask; +	ah->imask &= ~ATH9K_INT_GLOBAL; +	ath9k_hw_disable_interrupts(ah); +	ah->imask = ATH9K_INT_BMISS | ATH9K_INT_GLOBAL; +	ath9k_hw_set_interrupts(ah); +	ath9k_hw_enable_interrupts(ah); + +	spin_unlock_bh(&sc->sc_pcu_lock); + +	/* +	 * we can now sync irq and kill any running tasklets, since we already +	 * disabled interrupts and not holding a spin lock +	 */ +	synchronize_irq(sc->irq); +	tasklet_kill(&sc->intr_tq); + +	ath9k_hw_wow_enable(ah, wow_triggers_enabled); + +	ath9k_ps_restore(sc); +	ath_dbg(common, ANY, "WoW enabled in ath9k\n"); +	atomic_inc(&sc->wow_sleep_proc_intr); + +fail_wow: +	mutex_unlock(&sc->mutex); +	return ret; +} + +static int ath9k_resume(struct ieee80211_hw *hw) +{ +	struct ath_softc *sc = hw->priv; +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); +	u32 wow_status; + +	mutex_lock(&sc->mutex); + +	ath9k_ps_wakeup(sc); + +	spin_lock_bh(&sc->sc_pcu_lock); + +	ath9k_hw_disable_interrupts(ah); +	ah->imask = sc->wow_intr_before_sleep; +	ath9k_hw_set_interrupts(ah); +	ath9k_hw_enable_interrupts(ah); + +	spin_unlock_bh(&sc->sc_pcu_lock); + +	wow_status = ath9k_hw_wow_wakeup(ah); + +	if (atomic_read(&sc->wow_got_bmiss_intr) == 0) { +		/* +		 * some devices may not pick beacon miss +		 * as the reason they woke up so we add +		 * that here for that shortcoming. +		 */ +		wow_status |= AH_WOW_BEACON_MISS; +		atomic_dec(&sc->wow_got_bmiss_intr); +		ath_dbg(common, ANY, "Beacon miss interrupt picked up during WoW sleep\n"); +	} + +	atomic_dec(&sc->wow_sleep_proc_intr); + +	if (wow_status) { +		ath_dbg(common, ANY, "Waking up due to WoW triggers %s with WoW status = %x\n", +			ath9k_hw_wow_event_to_string(wow_status), wow_status); +	} + +	ath_restart_work(sc); +	ath9k_start_btcoex(sc); + +	ath9k_ps_restore(sc); +	mutex_unlock(&sc->mutex); + +	return 0; +} + +static void ath9k_set_wakeup(struct ieee80211_hw *hw, bool enabled) +{ +	struct ath_softc *sc = hw->priv; + +	mutex_lock(&sc->mutex); +	device_init_wakeup(sc->dev, 1); +	device_set_wakeup_enable(sc->dev, enabled); +	mutex_unlock(&sc->mutex); +} + +#endif +  struct ieee80211_ops ath9k_ops = {  	.tx 		    = ath9k_tx,  	.start 		    = ath9k_start, @@ -2416,4 +2436,16 @@ struct ieee80211_ops ath9k_ops = {  	.get_stats	    = ath9k_get_stats,  	.set_antenna	    = ath9k_set_antenna,  	.get_antenna	    = ath9k_get_antenna, + +#ifdef CONFIG_PM_SLEEP +	.suspend	    = ath9k_suspend, +	.resume		    = ath9k_resume, +	.set_wakeup	    = ath9k_set_wakeup, +#endif + +#ifdef CONFIG_ATH9K_DEBUGFS +	.get_et_sset_count  = ath9k_get_et_sset_count, +	.get_et_stats  = ath9k_get_et_stats, +	.get_et_strings  = ath9k_get_et_strings, +#endif  }; diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c index 29fe52d6997..fb536e7e661 100644 --- a/drivers/net/wireless/ath/ath9k/mci.c +++ b/drivers/net/wireless/ath/ath9k/mci.c @@ -20,7 +20,7 @@  #include "ath9k.h"  #include "mci.h" -static const u8 ath_mci_duty_cycle[] = { 0, 50, 60, 70, 80, 85, 90, 95, 98 }; +static const u8 ath_mci_duty_cycle[] = { 55, 50, 60, 70, 80, 85, 90, 95, 98 };  static struct ath_mci_profile_info*  ath_mci_find_profile(struct ath_mci_profile *mci, @@ -28,11 +28,14 @@ ath_mci_find_profile(struct ath_mci_profile *mci,  {  	struct ath_mci_profile_info *entry; +	if (list_empty(&mci->info)) +		return NULL; +  	list_for_each_entry(entry, &mci->info, list) {  		if (entry->conn_handle == info->conn_handle) -			break; +			return entry;  	} -	return entry; +	return NULL;  }  static bool ath_mci_add_profile(struct ath_common *common, @@ -49,31 +52,21 @@ static bool ath_mci_add_profile(struct ath_common *common,  	    (info->type != MCI_GPM_COEX_PROFILE_VOICE))  		return false; -	entry = ath_mci_find_profile(mci, info); +	entry = kzalloc(sizeof(*entry), GFP_ATOMIC); +	if (!entry) +		return false; -	if (entry) { -		memcpy(entry, info, 10); -	} else { -		entry = kzalloc(sizeof(*entry), GFP_KERNEL); -		if (!entry) -			return false; - -		memcpy(entry, info, 10); -		INC_PROF(mci, info); -		list_add_tail(&info->list, &mci->info); -	} +	memcpy(entry, info, 10); +	INC_PROF(mci, info); +	list_add_tail(&entry->list, &mci->info);  	return true;  }  static void ath_mci_del_profile(struct ath_common *common,  				struct ath_mci_profile *mci, -				struct ath_mci_profile_info *info) +				struct ath_mci_profile_info *entry)  { -	struct ath_mci_profile_info *entry; - -	entry = ath_mci_find_profile(mci, info); -  	if (!entry)  		return; @@ -86,12 +79,16 @@ void ath_mci_flush_profile(struct ath_mci_profile *mci)  {  	struct ath_mci_profile_info *info, *tinfo; +	mci->aggr_limit = 0; + +	if (list_empty(&mci->info)) +		return; +  	list_for_each_entry_safe(info, tinfo, &mci->info, list) {  		list_del(&info->list);  		DEC_PROF(mci, info);  		kfree(info);  	} -	mci->aggr_limit = 0;  }  static void ath_mci_adjust_aggr_limit(struct ath_btcoex *btcoex) @@ -116,42 +113,60 @@ static void ath_mci_update_scheme(struct ath_softc *sc)  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_btcoex *btcoex = &sc->btcoex;  	struct ath_mci_profile *mci = &btcoex->mci; +	struct ath9k_hw_mci *mci_hw = &sc->sc_ah->btcoex_hw.mci;  	struct ath_mci_profile_info *info;  	u32 num_profile = NUM_PROF(mci); +	if (mci_hw->config & ATH_MCI_CONFIG_DISABLE_TUNING) +		goto skip_tuning; + +	btcoex->duty_cycle = ath_mci_duty_cycle[num_profile]; +  	if (num_profile == 1) {  		info = list_first_entry(&mci->info,  					struct ath_mci_profile_info,  					list); -		if (mci->num_sco && info->T == 12) { -			mci->aggr_limit = 8; +		if (mci->num_sco) { +			if (info->T == 12) +				mci->aggr_limit = 8; +			else if (info->T == 6) { +				mci->aggr_limit = 6; +				btcoex->duty_cycle = 30; +			}  			ath_dbg(common, MCI, -				"Single SCO, aggregation limit 2 ms\n"); -		} else if ((info->type == MCI_GPM_COEX_PROFILE_BNEP) && -			   !info->master) { -			btcoex->btcoex_period = 60; +				"Single SCO, aggregation limit %d 1/4 ms\n", +				mci->aggr_limit); +		} else if (mci->num_pan || mci->num_other_acl) { +			/* +			 * For single PAN/FTP profile, allocate 35% for BT +			 * to improve WLAN throughput. +			 */ +			btcoex->duty_cycle = 35; +			btcoex->btcoex_period = 53;  			ath_dbg(common, MCI, -				"Single slave PAN/FTP, bt period 60 ms\n"); -		} else if ((info->type == MCI_GPM_COEX_PROFILE_HID) && -			 (info->T > 0 && info->T < 50) && -			 (info->A > 1 || info->W > 1)) { +				"Single PAN/FTP bt period %d ms dutycycle %d\n", +				btcoex->duty_cycle, btcoex->btcoex_period); +		} else if (mci->num_hid) {  			btcoex->duty_cycle = 30; -			mci->aggr_limit = 8; +			mci->aggr_limit = 6;  			ath_dbg(common, MCI,  				"Multiple attempt/timeout single HID " -				"aggregation limit 2 ms dutycycle 30%%\n"); +				"aggregation limit 1.5 ms dutycycle 30%%\n");  		} -	} else if ((num_profile == 2) && (mci->num_hid == 2)) { -		btcoex->duty_cycle = 30; -		mci->aggr_limit = 8; -		ath_dbg(common, MCI, -			"Two HIDs aggregation limit 2 ms dutycycle 30%%\n"); -	} else if (num_profile > 3) { +	} else if (num_profile == 2) { +		if (mci->num_hid == 2) +			btcoex->duty_cycle = 30;  		mci->aggr_limit = 6;  		ath_dbg(common, MCI, -			"Three or more profiles aggregation limit 1.5 ms\n"); +			"Two BT profiles aggr limit 1.5 ms dutycycle %d%%\n", +			btcoex->duty_cycle); +	} else if (num_profile >= 3) { +		mci->aggr_limit = 4; +		ath_dbg(common, MCI, +			"Three or more profiles aggregation limit 1 ms\n");  	} +skip_tuning:  	if (IS_CHAN_2GHZ(sc->sc_ah->curchan)) {  		if (IS_CHAN_HT(sc->sc_ah->curchan))  			ath_mci_adjust_aggr_limit(btcoex); @@ -159,18 +174,17 @@ static void ath_mci_update_scheme(struct ath_softc *sc)  			btcoex->btcoex_period >>= 1;  	} -	ath9k_hw_btcoex_disable(sc->sc_ah);  	ath9k_btcoex_timer_pause(sc); +	ath9k_hw_btcoex_disable(sc->sc_ah);  	if (IS_CHAN_5GHZ(sc->sc_ah->curchan))  		return; -	btcoex->duty_cycle += (mci->num_bdr ? ATH_MCI_MAX_DUTY_CYCLE : 0); +	btcoex->duty_cycle += (mci->num_bdr ? ATH_MCI_BDR_DUTY_CYCLE : 0);  	if (btcoex->duty_cycle > ATH_MCI_MAX_DUTY_CYCLE)  		btcoex->duty_cycle = ATH_MCI_MAX_DUTY_CYCLE; -	btcoex->btcoex_period *= 1000; -	btcoex->btcoex_no_stomp =  btcoex->btcoex_period * +	btcoex->btcoex_no_stomp =  btcoex->btcoex_period * 1000 *  		(100 - btcoex->duty_cycle) / 100;  	ath9k_hw_btcoex_enable(sc->sc_ah); @@ -181,20 +195,16 @@ static void ath_mci_cal_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); +	struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;  	u32 payload[4] = {0, 0, 0, 0};  	switch (opcode) {  	case MCI_GPM_BT_CAL_REQ: -		if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_AWAKE) { -			ar9003_mci_state(ah, MCI_STATE_SET_BT_CAL_START, NULL); -			ieee80211_queue_work(sc->hw, &sc->hw_reset_work); -		} else { -			ath_dbg(common, MCI, "MCI State mismatch: %d\n", -				ar9003_mci_state(ah, MCI_STATE_BT, NULL)); +		if (mci_hw->bt_state == MCI_BT_AWAKE) { +			ar9003_mci_state(ah, MCI_STATE_SET_BT_CAL_START); +			ath9k_queue_reset(sc, RESET_TYPE_MCI);  		} -		break; -	case MCI_GPM_BT_CAL_DONE: -		ar9003_mci_state(ah, MCI_STATE_BT, NULL); +		ath_dbg(common, MCI, "MCI State : %d\n", mci_hw->bt_state);  		break;  	case MCI_GPM_BT_CAL_GRANT:  		MCI_GPM_SET_CAL_TYPE(payload, MCI_GPM_WLAN_CAL_DONE); @@ -207,32 +217,55 @@ static void ath_mci_cal_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)  	}  } +static void ath9k_mci_work(struct work_struct *work) +{ +	struct ath_softc *sc = container_of(work, struct ath_softc, mci_work); + +	ath_mci_update_scheme(sc); +} +  static void ath_mci_process_profile(struct ath_softc *sc,  				    struct ath_mci_profile_info *info)  {  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_btcoex *btcoex = &sc->btcoex;  	struct ath_mci_profile *mci = &btcoex->mci; +	struct ath_mci_profile_info *entry = NULL; + +	entry = ath_mci_find_profile(mci, info); +	if (entry) { +		/* +		 * Two MCI interrupts are generated while connecting to +		 * headset and A2DP profile, but only one MCI interrupt +		 * is generated with last added profile type while disconnecting +		 * both profiles. +		 * So while adding second profile type decrement +		 * the first one. +		 */ +		if (entry->type != info->type) { +			DEC_PROF(mci, entry); +			INC_PROF(mci, info); +		} +		memcpy(entry, info, 10); +	}  	if (info->start) { -		if (!ath_mci_add_profile(common, mci, info)) +		if (!entry && !ath_mci_add_profile(common, mci, info))  			return;  	} else -		ath_mci_del_profile(common, mci, info); +		ath_mci_del_profile(common, mci, entry);  	btcoex->btcoex_period = ATH_MCI_DEF_BT_PERIOD;  	mci->aggr_limit = mci->num_sco ? 6 : 0; -	if (NUM_PROF(mci)) { +	btcoex->duty_cycle = ath_mci_duty_cycle[NUM_PROF(mci)]; +	if (NUM_PROF(mci))  		btcoex->bt_stomp_type = ATH_BTCOEX_STOMP_LOW; -		btcoex->duty_cycle = ath_mci_duty_cycle[NUM_PROF(mci)]; -	} else { +	else  		btcoex->bt_stomp_type = mci->num_mgmt ? ATH_BTCOEX_STOMP_ALL :  							ATH_BTCOEX_STOMP_LOW; -		btcoex->duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE; -	} -	ath_mci_update_scheme(sc); +	ieee80211_queue_work(sc->hw, &sc->mci_work);  }  static void ath_mci_process_status(struct ath_softc *sc, @@ -247,8 +280,6 @@ static void ath_mci_process_status(struct ath_softc *sc,  	if (status->is_link)  		return; -	memset(&info, 0, sizeof(struct ath_mci_profile_info)); -  	info.conn_handle = status->conn_handle;  	if (ath_mci_find_profile(mci, &info))  		return; @@ -268,7 +299,7 @@ static void ath_mci_process_status(struct ath_softc *sc,  	} while (++i < ATH_MCI_MAX_PROFILE);  	if (old_num_mgmt != mci->num_mgmt) -		ath_mci_update_scheme(sc); +		ieee80211_queue_work(sc->hw, &sc->mci_work);  }  static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) @@ -277,25 +308,20 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)  	struct ath_mci_profile_info profile_info;  	struct ath_mci_profile_status profile_status;  	struct ath_common *common = ath9k_hw_common(sc->sc_ah); -	u32 version; -	u8 major; -	u8 minor; +	u8 major, minor;  	u32 seq_num;  	switch (opcode) {  	case MCI_GPM_COEX_VERSION_QUERY: -		version = ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION, -					   NULL); +		ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION);  		break;  	case MCI_GPM_COEX_VERSION_RESPONSE:  		major = *(rx_payload + MCI_GPM_COEX_B_MAJOR_VERSION);  		minor = *(rx_payload + MCI_GPM_COEX_B_MINOR_VERSION); -		version = (major << 8) + minor; -		version = ar9003_mci_state(ah, MCI_STATE_SET_BT_COEX_VERSION, -					   &version); +		ar9003_mci_set_bt_version(ah, major, minor);  		break;  	case MCI_GPM_COEX_STATUS_QUERY: -		ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_CHANNELS, NULL); +		ar9003_mci_send_wlan_channels(ah);  		break;  	case MCI_GPM_COEX_BT_PROFILE_INFO:  		memcpy(&profile_info, @@ -322,7 +348,7 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)  		seq_num = *((u32 *)(rx_payload + 12));  		ath_dbg(common, MCI, -			"BT_Status_Update: is_link=%d, linkId=%d, state=%d, SEQ=%d\n", +			"BT_Status_Update: is_link=%d, linkId=%d, state=%d, SEQ=%u\n",  			profile_status.is_link, profile_status.conn_handle,  			profile_status.is_critical, seq_num); @@ -362,6 +388,7 @@ int ath_mci_setup(struct ath_softc *sc)  			 mci->gpm_buf.bf_addr, (mci->gpm_buf.bf_len >> 4),  			 mci->sched_buf.bf_paddr); +	INIT_WORK(&sc->mci_work, ath9k_mci_work);  	ath_dbg(common, MCI, "MCI Initialized\n");  	return 0; @@ -389,6 +416,7 @@ void ath_mci_intr(struct ath_softc *sc)  	struct ath_mci_coex *mci = &sc->mci_coex;  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); +	struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;  	u32 mci_int, mci_int_rxmsg;  	u32 offset, subtype, opcode;  	u32 *pgpm; @@ -397,8 +425,8 @@ void ath_mci_intr(struct ath_softc *sc)  	ar9003_mci_get_interrupt(sc->sc_ah, &mci_int, &mci_int_rxmsg); -	if (ar9003_mci_state(ah, MCI_STATE_ENABLE, NULL) == 0) { -		ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL); +	if (ar9003_mci_state(ah, MCI_STATE_ENABLE) == 0) { +		ar9003_mci_get_next_gpm_offset(ah, true, NULL);  		return;  	} @@ -417,46 +445,41 @@ void ath_mci_intr(struct ath_softc *sc)  					NULL, 0, true, false);  		mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE; -		ar9003_mci_state(ah, MCI_STATE_RESET_REQ_WAKE, NULL); +		ar9003_mci_state(ah, MCI_STATE_RESET_REQ_WAKE);  		/*  		 * always do this for recovery and 2G/5G toggling and LNA_TRANS  		 */ -		ar9003_mci_state(ah, MCI_STATE_SET_BT_AWAKE, NULL); +		ar9003_mci_state(ah, MCI_STATE_SET_BT_AWAKE);  	}  	if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING) {  		mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING; -		if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_SLEEP) { -			if (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL) != -			    MCI_BT_SLEEP) -				ar9003_mci_state(ah, MCI_STATE_SET_BT_AWAKE, -						 NULL); -		} +		if ((mci_hw->bt_state == MCI_BT_SLEEP) && +		    (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP) != +		     MCI_BT_SLEEP)) +			ar9003_mci_state(ah, MCI_STATE_SET_BT_AWAKE);  	}  	if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING) {  		mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING; -		if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_AWAKE) { -			if (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL) != -			    MCI_BT_AWAKE) -				ar9003_mci_state(ah, MCI_STATE_SET_BT_SLEEP, -						 NULL); -		} +		if ((mci_hw->bt_state == MCI_BT_AWAKE) && +		    (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP) != +		     MCI_BT_AWAKE)) +			mci_hw->bt_state = MCI_BT_SLEEP;  	}  	if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) ||  	    (mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)) { -		ar9003_mci_state(ah, MCI_STATE_RECOVER_RX, NULL); +		ar9003_mci_state(ah, MCI_STATE_RECOVER_RX);  		skip_gpm = true;  	}  	if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO) {  		mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO; -		offset = ar9003_mci_state(ah, MCI_STATE_LAST_SCHD_MSG_OFFSET, -					  NULL); +		offset = ar9003_mci_state(ah, MCI_STATE_LAST_SCHD_MSG_OFFSET);  	}  	if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_GPM) { @@ -465,8 +488,8 @@ void ath_mci_intr(struct ath_softc *sc)  		while (more_data == MCI_GPM_MORE) {  			pgpm = mci->gpm_buf.bf_addr; -			offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET, -						  &more_data); +			offset = ar9003_mci_get_next_gpm_offset(ah, false, +								&more_data);  			if (offset == MCI_GPM_INVALID)  				break; @@ -507,23 +530,17 @@ void ath_mci_intr(struct ath_softc *sc)  			mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_LNA_INFO;  		if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_INFO) { -			int value_dbm = ar9003_mci_state(ah, -						 MCI_STATE_CONT_RSSI_POWER, NULL); +			int value_dbm = MS(mci_hw->cont_status, +					   AR_MCI_CONT_RSSI_POWER);  			mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_CONT_INFO; -			if (ar9003_mci_state(ah, MCI_STATE_CONT_TXRX, NULL)) -				ath_dbg(common, MCI, -					"MCI CONT_INFO: (tx) pri = %d, pwr = %d dBm\n", -					ar9003_mci_state(ah, -						 MCI_STATE_CONT_PRIORITY, NULL), -					value_dbm); -			else -				ath_dbg(common, MCI, -					"MCI CONT_INFO: (rx) pri = %d,pwr = %d dBm\n", -					ar9003_mci_state(ah, -						 MCI_STATE_CONT_PRIORITY, NULL), -					value_dbm); +			ath_dbg(common, MCI, +				"MCI CONT_INFO: (%s) pri = %d pwr = %d dBm\n", +				MS(mci_hw->cont_status, AR_MCI_CONT_TXRX) ? +				"tx" : "rx", +				MS(mci_hw->cont_status, AR_MCI_CONT_PRIORITY), +				value_dbm);  		}  		if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_NACK) @@ -538,3 +555,14 @@ void ath_mci_intr(struct ath_softc *sc)  		mci_int &= ~(AR_MCI_INTERRUPT_RX_INVALID_HDR |  			     AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT);  } + +void ath_mci_enable(struct ath_softc *sc) +{ +	struct ath_common *common = ath9k_hw_common(sc->sc_ah); + +	if (!common->btcoex_enabled) +		return; + +	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) +		sc->sc_ah->imask |= ATH9K_INT_MCI; +} diff --git a/drivers/net/wireless/ath/ath9k/mci.h b/drivers/net/wireless/ath/ath9k/mci.h index c841444f53c..fc14eea034e 100644 --- a/drivers/net/wireless/ath/ath9k/mci.h +++ b/drivers/net/wireless/ath/ath9k/mci.h @@ -130,4 +130,13 @@ void ath_mci_flush_profile(struct ath_mci_profile *mci);  int ath_mci_setup(struct ath_softc *sc);  void ath_mci_cleanup(struct ath_softc *sc);  void ath_mci_intr(struct ath_softc *sc); -#endif + +#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT +void ath_mci_enable(struct ath_softc *sc); +#else +static inline void ath_mci_enable(struct ath_softc *sc) +{ +} +#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ + +#endif /* MCI_H*/ diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index a856b51255f..87b89d55e63 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c @@ -115,6 +115,9 @@ static void ath_pci_aspm_init(struct ath_common *common)  	int pos;  	u8 aspm; +	if (!ah->is_pciexpress) +		return; +  	pos = pci_pcie_cap(pdev);  	if (!pos)  		return; @@ -138,6 +141,7 @@ static void ath_pci_aspm_init(struct ath_common *common)  		aspm &= ~(PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1);  		pci_write_config_byte(parent, pos + PCI_EXP_LNKCTL, aspm); +		ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");  		return;  	} @@ -147,6 +151,7 @@ static void ath_pci_aspm_init(struct ath_common *common)  		ah->aspm_enabled = true;  		/* Initialize PCIe PM and SERDES registers. */  		ath9k_hw_configpcipowersave(ah, false); +		ath_info(common, "ASPM enabled: 0x%x\n", aspm);  	}  } @@ -246,7 +251,7 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	sc->mem = mem;  	/* Will be cleared in ath9k_start() */ -	sc->sc_flags |= SC_OP_INVALID; +	set_bit(SC_OP_INVALID, &sc->sc_flags);  	ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);  	if (ret) { @@ -308,6 +313,9 @@ static int ath_pci_suspend(struct device *device)  	struct ieee80211_hw *hw = pci_get_drvdata(pdev);  	struct ath_softc *sc = hw->priv; +	if (sc->wow_enabled) +		return 0; +  	/* The device has to be moved to FULLSLEEP forcibly.  	 * Otherwise the chip never moved to full sleep,  	 * when no interface is up. diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 92a6c0a87f8..e034add9cd5 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c @@ -770,7 +770,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,  	struct ieee80211_tx_rate *rates = tx_info->control.rates;  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;  	__le16 fc = hdr->frame_control; -	u8 try_per_rate, i = 0, rix, high_rix; +	u8 try_per_rate, i = 0, rix;  	int is_probe = 0;  	if (rate_control_send_low(sta, priv_sta, txrc)) @@ -791,7 +791,6 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,  	rate_table = ath_rc_priv->rate_table;  	rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table,  				     &is_probe, false); -	high_rix = rix;  	/*  	 * If we're in HT mode and both us and our peer supports LDPC. @@ -839,16 +838,16 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,  	try_per_rate = 8;  	/* -	 * Use a legacy rate as last retry to ensure that the frame -	 * is tried in both MCS and legacy rates. +	 * If the last rate in the rate series is MCS and has +	 * more than 80% of per thresh, then use a legacy rate +	 * as last retry to ensure that the frame is tried in both +	 * MCS and legacy rate.  	 */ -	if ((rates[2].flags & IEEE80211_TX_RC_MCS) && -	    (!(tx_info->flags & IEEE80211_TX_CTL_AMPDU) || -	    (ath_rc_priv->per[high_rix] > 45))) +	ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix); +	if (WLAN_RC_PHY_HT(rate_table->info[rix].phy) && +	    (ath_rc_priv->per[rix] > 45))  		rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table,  				&is_probe, true); -	else -		ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);  	/* All other rates in the series have RTS enabled */  	ath_rc_rate_set_series(rate_table, &rates[i], txrc, diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index e1fcc68124d..12aca02228c 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c @@ -20,43 +20,6 @@  #define SKB_CB_ATHBUF(__skb)	(*((struct ath_buf **)__skb->cb)) -static inline bool ath_is_alt_ant_ratio_better(int alt_ratio, int maxdelta, -					       int mindelta, int main_rssi_avg, -					       int alt_rssi_avg, int pkt_count) -{ -	return (((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) && -		(alt_rssi_avg > main_rssi_avg + maxdelta)) || -		(alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50); -} - -static inline bool ath_ant_div_comb_alt_check(u8 div_group, int alt_ratio, -					int curr_main_set, int curr_alt_set, -					int alt_rssi_avg, int main_rssi_avg) -{ -	bool result = false; -	switch (div_group) { -	case 0: -		if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) -			result = true; -		break; -	case 1: -	case 2: -		if ((((curr_main_set == ATH_ANT_DIV_COMB_LNA2) && -			(curr_alt_set == ATH_ANT_DIV_COMB_LNA1) && -				(alt_rssi_avg >= (main_rssi_avg - 5))) || -			((curr_main_set == ATH_ANT_DIV_COMB_LNA1) && -			(curr_alt_set == ATH_ANT_DIV_COMB_LNA2) && -				(alt_rssi_avg >= (main_rssi_avg - 2)))) && -							(alt_rssi_avg >= 4)) -			result = true; -		else -			result = false; -		break; -	} - -	return result; -} -  static inline bool ath9k_check_auto_sleep(struct ath_softc *sc)  {  	return sc->ps_enabled && @@ -303,7 +266,7 @@ static void ath_edma_start_recv(struct ath_softc *sc)  	ath_opmode_init(sc); -	ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_OFFCHANNEL)); +	ath9k_hw_startpcureceive(sc->sc_ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL));  	spin_unlock_bh(&sc->rx.rxbuflock);  } @@ -322,8 +285,8 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)  	int error = 0;  	spin_lock_init(&sc->sc_pcu_lock); -	sc->sc_flags &= ~SC_OP_RXFLUSH;  	spin_lock_init(&sc->rx.rxbuflock); +	clear_bit(SC_OP_RXFLUSH, &sc->sc_flags);  	common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 +  			     sc->sc_ah->caps.rx_status_len; @@ -467,6 +430,9 @@ u32 ath_calcrxfilter(struct ath_softc *sc)  		rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL;  	} +	if (AR_SREV_9550(sc->sc_ah)) +		rfilt |= ATH9K_RX_FILTER_4ADDRESS; +  	return rfilt;  } @@ -500,7 +466,7 @@ int ath_startrecv(struct ath_softc *sc)  start_recv:  	ath_opmode_init(sc); -	ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_OFFCHANNEL)); +	ath9k_hw_startpcureceive(ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL));  	spin_unlock_bh(&sc->rx.rxbuflock); @@ -535,11 +501,11 @@ bool ath_stoprecv(struct ath_softc *sc)  void ath_flushrecv(struct ath_softc *sc)  { -	sc->sc_flags |= SC_OP_RXFLUSH; +	set_bit(SC_OP_RXFLUSH, &sc->sc_flags);  	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)  		ath_rx_tasklet(sc, 1, true);  	ath_rx_tasklet(sc, 1, false); -	sc->sc_flags &= ~SC_OP_RXFLUSH; +	clear_bit(SC_OP_RXFLUSH, &sc->sc_flags);  }  static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) @@ -587,7 +553,7 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)  		sc->ps_flags &= ~PS_BEACON_SYNC;  		ath_dbg(common, PS,  			"Reconfigure Beacon timers based on timestamp from the AP\n"); -		ath_set_beacon(sc); +		ath9k_set_beacon(sc);  	}  	if (ath_beacon_dtim_pending_cab(skb)) { @@ -624,13 +590,13 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb, bool mybeacon)  	/* Process Beacon and CAB receive in PS state */  	if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ath9k_check_auto_sleep(sc)) -	    && mybeacon) +	    && mybeacon) {  		ath_rx_ps_beacon(sc, skb); -	else if ((sc->ps_flags & PS_WAIT_FOR_CAB) && -		 (ieee80211_is_data(hdr->frame_control) || -		  ieee80211_is_action(hdr->frame_control)) && -		 is_multicast_ether_addr(hdr->addr1) && -		 !ieee80211_has_moredata(hdr->frame_control)) { +	} else if ((sc->ps_flags & PS_WAIT_FOR_CAB) && +		   (ieee80211_is_data(hdr->frame_control) || +		    ieee80211_is_action(hdr->frame_control)) && +		   is_multicast_ether_addr(hdr->addr1) && +		   !ieee80211_has_moredata(hdr->frame_control)) {  		/*  		 * No more broadcast/multicast frames to be received at this  		 * point. @@ -695,9 +661,9 @@ static bool ath_edma_get_buffers(struct ath_softc *sc,  			__skb_unlink(skb, &rx_edma->rx_fifo);  			list_add_tail(&bf->list, &sc->rx.rxbuf);  			ath_rx_edma_buf_link(sc, qtype); -		} else { -			bf = NULL;  		} + +		bf = NULL;  	}  	*dest = bf; @@ -822,7 +788,8 @@ static bool ath9k_rx_accept(struct ath_common *common,  	 * descriptor does contain a valid key index. This has been observed  	 * mostly with CCMP encryption.  	 */ -	if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID) +	if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID || +	    !test_bit(rx_stats->rs_keyix, common->ccmp_keymap))  		rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS;  	if (!rx_stats->rs_datalen) { @@ -1067,709 +1034,6 @@ static void ath9k_rx_skb_postprocess(struct ath_common *common,  		rxs->flag &= ~RX_FLAG_DECRYPTED;  } -static void ath_lnaconf_alt_good_scan(struct ath_ant_comb *antcomb, -				      struct ath_hw_antcomb_conf ant_conf, -				      int main_rssi_avg) -{ -	antcomb->quick_scan_cnt = 0; - -	if (ant_conf.main_lna_conf == ATH_ANT_DIV_COMB_LNA2) -		antcomb->rssi_lna2 = main_rssi_avg; -	else if (ant_conf.main_lna_conf == ATH_ANT_DIV_COMB_LNA1) -		antcomb->rssi_lna1 = main_rssi_avg; - -	switch ((ant_conf.main_lna_conf << 4) | ant_conf.alt_lna_conf) { -	case 0x10: /* LNA2 A-B */ -		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -		antcomb->first_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1; -		break; -	case 0x20: /* LNA1 A-B */ -		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -		antcomb->first_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2; -		break; -	case 0x21: /* LNA1 LNA2 */ -		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA2; -		antcomb->first_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -		antcomb->second_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -		break; -	case 0x12: /* LNA2 LNA1 */ -		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1; -		antcomb->first_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -		antcomb->second_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -		break; -	case 0x13: /* LNA2 A+B */ -		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -		antcomb->first_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1; -		break; -	case 0x23: /* LNA1 A+B */ -		antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -		antcomb->first_quick_scan_conf = -			ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -		antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2; -		break; -	default: -		break; -	} -} - -static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb, -				struct ath_hw_antcomb_conf *div_ant_conf, -				int main_rssi_avg, int alt_rssi_avg, -				int alt_ratio) -{ -	/* alt_good */ -	switch (antcomb->quick_scan_cnt) { -	case 0: -		/* set alt to main, and alt to first conf */ -		div_ant_conf->main_lna_conf = antcomb->main_conf; -		div_ant_conf->alt_lna_conf = antcomb->first_quick_scan_conf; -		break; -	case 1: -		/* set alt to main, and alt to first conf */ -		div_ant_conf->main_lna_conf = antcomb->main_conf; -		div_ant_conf->alt_lna_conf = antcomb->second_quick_scan_conf; -		antcomb->rssi_first = main_rssi_avg; -		antcomb->rssi_second = alt_rssi_avg; - -		if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) { -			/* main is LNA1 */ -			if (ath_is_alt_ant_ratio_better(alt_ratio, -						ATH_ANT_DIV_COMB_LNA1_DELTA_HI, -						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, -						main_rssi_avg, alt_rssi_avg, -						antcomb->total_pkt_count)) -				antcomb->first_ratio = true; -			else -				antcomb->first_ratio = false; -		} else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) { -			if (ath_is_alt_ant_ratio_better(alt_ratio, -						ATH_ANT_DIV_COMB_LNA1_DELTA_MID, -						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, -						main_rssi_avg, alt_rssi_avg, -						antcomb->total_pkt_count)) -				antcomb->first_ratio = true; -			else -				antcomb->first_ratio = false; -		} else { -			if ((((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) && -			    (alt_rssi_avg > main_rssi_avg + -			    ATH_ANT_DIV_COMB_LNA1_DELTA_HI)) || -			    (alt_rssi_avg > main_rssi_avg)) && -			    (antcomb->total_pkt_count > 50)) -				antcomb->first_ratio = true; -			else -				antcomb->first_ratio = false; -		} -		break; -	case 2: -		antcomb->alt_good = false; -		antcomb->scan_not_start = false; -		antcomb->scan = false; -		antcomb->rssi_first = main_rssi_avg; -		antcomb->rssi_third = alt_rssi_avg; - -		if (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) -			antcomb->rssi_lna1 = alt_rssi_avg; -		else if (antcomb->second_quick_scan_conf == -			 ATH_ANT_DIV_COMB_LNA2) -			antcomb->rssi_lna2 = alt_rssi_avg; -		else if (antcomb->second_quick_scan_conf == -			 ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2) { -			if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) -				antcomb->rssi_lna2 = main_rssi_avg; -			else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) -				antcomb->rssi_lna1 = main_rssi_avg; -		} - -		if (antcomb->rssi_lna2 > antcomb->rssi_lna1 + -		    ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA) -			div_ant_conf->main_lna_conf = ATH_ANT_DIV_COMB_LNA2; -		else -			div_ant_conf->main_lna_conf = ATH_ANT_DIV_COMB_LNA1; - -		if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) { -			if (ath_is_alt_ant_ratio_better(alt_ratio, -						ATH_ANT_DIV_COMB_LNA1_DELTA_HI, -						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, -						main_rssi_avg, alt_rssi_avg, -						antcomb->total_pkt_count)) -				antcomb->second_ratio = true; -			else -				antcomb->second_ratio = false; -		} else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) { -			if (ath_is_alt_ant_ratio_better(alt_ratio, -						ATH_ANT_DIV_COMB_LNA1_DELTA_MID, -						ATH_ANT_DIV_COMB_LNA1_DELTA_LOW, -						main_rssi_avg, alt_rssi_avg, -						antcomb->total_pkt_count)) -				antcomb->second_ratio = true; -			else -				antcomb->second_ratio = false; -		} else { -			if ((((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) && -			    (alt_rssi_avg > main_rssi_avg + -			    ATH_ANT_DIV_COMB_LNA1_DELTA_HI)) || -			    (alt_rssi_avg > main_rssi_avg)) && -			    (antcomb->total_pkt_count > 50)) -				antcomb->second_ratio = true; -			else -				antcomb->second_ratio = false; -		} - -		/* set alt to the conf with maximun ratio */ -		if (antcomb->first_ratio && antcomb->second_ratio) { -			if (antcomb->rssi_second > antcomb->rssi_third) { -				/* first alt*/ -				if ((antcomb->first_quick_scan_conf == -				    ATH_ANT_DIV_COMB_LNA1) || -				    (antcomb->first_quick_scan_conf == -				    ATH_ANT_DIV_COMB_LNA2)) -					/* Set alt LNA1 or LNA2*/ -					if (div_ant_conf->main_lna_conf == -					    ATH_ANT_DIV_COMB_LNA2) -						div_ant_conf->alt_lna_conf = -							ATH_ANT_DIV_COMB_LNA1; -					else -						div_ant_conf->alt_lna_conf = -							ATH_ANT_DIV_COMB_LNA2; -				else -					/* Set alt to A+B or A-B */ -					div_ant_conf->alt_lna_conf = -						antcomb->first_quick_scan_conf; -			} else if ((antcomb->second_quick_scan_conf == -				   ATH_ANT_DIV_COMB_LNA1) || -				   (antcomb->second_quick_scan_conf == -				   ATH_ANT_DIV_COMB_LNA2)) { -				/* Set alt LNA1 or LNA2 */ -				if (div_ant_conf->main_lna_conf == -				    ATH_ANT_DIV_COMB_LNA2) -					div_ant_conf->alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -				else -					div_ant_conf->alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -			} else { -				/* Set alt to A+B or A-B */ -				div_ant_conf->alt_lna_conf = -					antcomb->second_quick_scan_conf; -			} -		} else if (antcomb->first_ratio) { -			/* first alt */ -			if ((antcomb->first_quick_scan_conf == -			    ATH_ANT_DIV_COMB_LNA1) || -			    (antcomb->first_quick_scan_conf == -			    ATH_ANT_DIV_COMB_LNA2)) -					/* Set alt LNA1 or LNA2 */ -				if (div_ant_conf->main_lna_conf == -				    ATH_ANT_DIV_COMB_LNA2) -					div_ant_conf->alt_lna_conf = -							ATH_ANT_DIV_COMB_LNA1; -				else -					div_ant_conf->alt_lna_conf = -							ATH_ANT_DIV_COMB_LNA2; -			else -				/* Set alt to A+B or A-B */ -				div_ant_conf->alt_lna_conf = -						antcomb->first_quick_scan_conf; -		} else if (antcomb->second_ratio) { -				/* second alt */ -			if ((antcomb->second_quick_scan_conf == -			    ATH_ANT_DIV_COMB_LNA1) || -			    (antcomb->second_quick_scan_conf == -			    ATH_ANT_DIV_COMB_LNA2)) -				/* Set alt LNA1 or LNA2 */ -				if (div_ant_conf->main_lna_conf == -				    ATH_ANT_DIV_COMB_LNA2) -					div_ant_conf->alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -				else -					div_ant_conf->alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -			else -				/* Set alt to A+B or A-B */ -				div_ant_conf->alt_lna_conf = -						antcomb->second_quick_scan_conf; -		} else { -			/* main is largest */ -			if ((antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) || -			    (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2)) -				/* Set alt LNA1 or LNA2 */ -				if (div_ant_conf->main_lna_conf == -				    ATH_ANT_DIV_COMB_LNA2) -					div_ant_conf->alt_lna_conf = -							ATH_ANT_DIV_COMB_LNA1; -				else -					div_ant_conf->alt_lna_conf = -							ATH_ANT_DIV_COMB_LNA2; -			else -				/* Set alt to A+B or A-B */ -				div_ant_conf->alt_lna_conf = antcomb->main_conf; -		} -		break; -	default: -		break; -	} -} - -static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, -		struct ath_ant_comb *antcomb, int alt_ratio) -{ -	if (ant_conf->div_group == 0) { -		/* Adjust the fast_div_bias based on main and alt lna conf */ -		switch ((ant_conf->main_lna_conf << 4) | -				ant_conf->alt_lna_conf) { -		case 0x01: /* A-B LNA2 */ -			ant_conf->fast_div_bias = 0x3b; -			break; -		case 0x02: /* A-B LNA1 */ -			ant_conf->fast_div_bias = 0x3d; -			break; -		case 0x03: /* A-B A+B */ -			ant_conf->fast_div_bias = 0x1; -			break; -		case 0x10: /* LNA2 A-B */ -			ant_conf->fast_div_bias = 0x7; -			break; -		case 0x12: /* LNA2 LNA1 */ -			ant_conf->fast_div_bias = 0x2; -			break; -		case 0x13: /* LNA2 A+B */ -			ant_conf->fast_div_bias = 0x7; -			break; -		case 0x20: /* LNA1 A-B */ -			ant_conf->fast_div_bias = 0x6; -			break; -		case 0x21: /* LNA1 LNA2 */ -			ant_conf->fast_div_bias = 0x0; -			break; -		case 0x23: /* LNA1 A+B */ -			ant_conf->fast_div_bias = 0x6; -			break; -		case 0x30: /* A+B A-B */ -			ant_conf->fast_div_bias = 0x1; -			break; -		case 0x31: /* A+B LNA2 */ -			ant_conf->fast_div_bias = 0x3b; -			break; -		case 0x32: /* A+B LNA1 */ -			ant_conf->fast_div_bias = 0x3d; -			break; -		default: -			break; -		} -	} else if (ant_conf->div_group == 1) { -		/* Adjust the fast_div_bias based on main and alt_lna_conf */ -		switch ((ant_conf->main_lna_conf << 4) | -			ant_conf->alt_lna_conf) { -		case 0x01: /* A-B LNA2 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x02: /* A-B LNA1 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x03: /* A-B A+B */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x10: /* LNA2 A-B */ -			if (!(antcomb->scan) && -			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x3f; -			else -				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x12: /* LNA2 LNA1 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x13: /* LNA2 A+B */ -			if (!(antcomb->scan) && -			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x3f; -			else -				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x20: /* LNA1 A-B */ -			if (!(antcomb->scan) && -			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x3f; -			else -				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x21: /* LNA1 LNA2 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x23: /* LNA1 A+B */ -			if (!(antcomb->scan) && -			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x3f; -			else -				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x30: /* A+B A-B */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x31: /* A+B LNA2 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x32: /* A+B LNA1 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		default: -			break; -		} -	} else if (ant_conf->div_group == 2) { -		/* Adjust the fast_div_bias based on main and alt_lna_conf */ -		switch ((ant_conf->main_lna_conf << 4) | -				ant_conf->alt_lna_conf) { -		case 0x01: /* A-B LNA2 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x02: /* A-B LNA1 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x03: /* A-B A+B */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x10: /* LNA2 A-B */ -			if (!(antcomb->scan) && -				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x1; -			else -				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x12: /* LNA2 LNA1 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x13: /* LNA2 A+B */ -			if (!(antcomb->scan) && -				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x1; -			else -				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x20: /* LNA1 A-B */ -			if (!(antcomb->scan) && -				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x1; -			else -				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x21: /* LNA1 LNA2 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x23: /* LNA1 A+B */ -			if (!(antcomb->scan) && -				(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) -				ant_conf->fast_div_bias = 0x1; -			else -				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x30: /* A+B A-B */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x31: /* A+B LNA2 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		case 0x32: /* A+B LNA1 */ -			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; -			break; -		default: -			break; -		} -	} -} - -/* Antenna diversity and combining */ -static void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs) -{ -	struct ath_hw_antcomb_conf div_ant_conf; -	struct ath_ant_comb *antcomb = &sc->ant_comb; -	int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; -	int curr_main_set; -	int main_rssi = rs->rs_rssi_ctl0; -	int alt_rssi = rs->rs_rssi_ctl1; -	int rx_ant_conf,  main_ant_conf; -	bool short_scan = false; - -	rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) & -		       ATH_ANT_RX_MASK; -	main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & -			 ATH_ANT_RX_MASK; - -	/* Record packet only when both main_rssi and  alt_rssi is positive */ -	if (main_rssi > 0 && alt_rssi > 0) { -		antcomb->total_pkt_count++; -		antcomb->main_total_rssi += main_rssi; -		antcomb->alt_total_rssi  += alt_rssi; -		if (main_ant_conf == rx_ant_conf) -			antcomb->main_recv_cnt++; -		else -			antcomb->alt_recv_cnt++; -	} - -	/* Short scan check */ -	if (antcomb->scan && antcomb->alt_good) { -		if (time_after(jiffies, antcomb->scan_start_time + -		    msecs_to_jiffies(ATH_ANT_DIV_COMB_SHORT_SCAN_INTR))) -			short_scan = true; -		else -			if (antcomb->total_pkt_count == -			    ATH_ANT_DIV_COMB_SHORT_SCAN_PKTCOUNT) { -				alt_ratio = ((antcomb->alt_recv_cnt * 100) / -					    antcomb->total_pkt_count); -				if (alt_ratio < ATH_ANT_DIV_COMB_ALT_ANT_RATIO) -					short_scan = true; -			} -	} - -	if (((antcomb->total_pkt_count < ATH_ANT_DIV_COMB_MAX_PKTCOUNT) || -	    rs->rs_moreaggr) && !short_scan) -		return; - -	if (antcomb->total_pkt_count) { -		alt_ratio = ((antcomb->alt_recv_cnt * 100) / -			     antcomb->total_pkt_count); -		main_rssi_avg = (antcomb->main_total_rssi / -				 antcomb->total_pkt_count); -		alt_rssi_avg = (antcomb->alt_total_rssi / -				 antcomb->total_pkt_count); -	} - - -	ath9k_hw_antdiv_comb_conf_get(sc->sc_ah, &div_ant_conf); -	curr_alt_set = div_ant_conf.alt_lna_conf; -	curr_main_set = div_ant_conf.main_lna_conf; - -	antcomb->count++; - -	if (antcomb->count == ATH_ANT_DIV_COMB_MAX_COUNT) { -		if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) { -			ath_lnaconf_alt_good_scan(antcomb, div_ant_conf, -						  main_rssi_avg); -			antcomb->alt_good = true; -		} else { -			antcomb->alt_good = false; -		} - -		antcomb->count = 0; -		antcomb->scan = true; -		antcomb->scan_not_start = true; -	} - -	if (!antcomb->scan) { -		if (ath_ant_div_comb_alt_check(div_ant_conf.div_group, -					alt_ratio, curr_main_set, curr_alt_set, -					alt_rssi_avg, main_rssi_avg)) { -			if (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) { -				/* Switch main and alt LNA */ -				div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -				div_ant_conf.alt_lna_conf  = -						ATH_ANT_DIV_COMB_LNA1; -			} else if (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) { -				div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -				div_ant_conf.alt_lna_conf  = -						ATH_ANT_DIV_COMB_LNA2; -			} - -			goto div_comb_done; -		} else if ((curr_alt_set != ATH_ANT_DIV_COMB_LNA1) && -			   (curr_alt_set != ATH_ANT_DIV_COMB_LNA2)) { -			/* Set alt to another LNA */ -			if (curr_main_set == ATH_ANT_DIV_COMB_LNA2) -				div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -			else if (curr_main_set == ATH_ANT_DIV_COMB_LNA1) -				div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; - -			goto div_comb_done; -		} - -		if ((alt_rssi_avg < (main_rssi_avg + -						div_ant_conf.lna1_lna2_delta))) -			goto div_comb_done; -	} - -	if (!antcomb->scan_not_start) { -		switch (curr_alt_set) { -		case ATH_ANT_DIV_COMB_LNA2: -			antcomb->rssi_lna2 = alt_rssi_avg; -			antcomb->rssi_lna1 = main_rssi_avg; -			antcomb->scan = true; -			/* set to A+B */ -			div_ant_conf.main_lna_conf = -				ATH_ANT_DIV_COMB_LNA1; -			div_ant_conf.alt_lna_conf  = -				ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -			break; -		case ATH_ANT_DIV_COMB_LNA1: -			antcomb->rssi_lna1 = alt_rssi_avg; -			antcomb->rssi_lna2 = main_rssi_avg; -			antcomb->scan = true; -			/* set to A+B */ -			div_ant_conf.main_lna_conf = ATH_ANT_DIV_COMB_LNA2; -			div_ant_conf.alt_lna_conf  = -				ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -			break; -		case ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2: -			antcomb->rssi_add = alt_rssi_avg; -			antcomb->scan = true; -			/* set to A-B */ -			div_ant_conf.alt_lna_conf = -				ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -			break; -		case ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2: -			antcomb->rssi_sub = alt_rssi_avg; -			antcomb->scan = false; -			if (antcomb->rssi_lna2 > -			    (antcomb->rssi_lna1 + -			    ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA)) { -				/* use LNA2 as main LNA */ -				if ((antcomb->rssi_add > antcomb->rssi_lna1) && -				    (antcomb->rssi_add > antcomb->rssi_sub)) { -					/* set to A+B */ -					div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -					div_ant_conf.alt_lna_conf  = -						ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -				} else if (antcomb->rssi_sub > -					   antcomb->rssi_lna1) { -					/* set to A-B */ -					div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -					div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -				} else { -					/* set to LNA1 */ -					div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -					div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -				} -			} else { -				/* use LNA1 as main LNA */ -				if ((antcomb->rssi_add > antcomb->rssi_lna2) && -				    (antcomb->rssi_add > antcomb->rssi_sub)) { -					/* set to A+B */ -					div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -					div_ant_conf.alt_lna_conf  = -						ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; -				} else if (antcomb->rssi_sub > -					   antcomb->rssi_lna1) { -					/* set to A-B */ -					div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -					div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; -				} else { -					/* set to LNA2 */ -					div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -					div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -				} -			} -			break; -		default: -			break; -		} -	} else { -		if (!antcomb->alt_good) { -			antcomb->scan_not_start = false; -			/* Set alt to another LNA */ -			if (curr_main_set == ATH_ANT_DIV_COMB_LNA2) { -				div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -				div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -			} else if (curr_main_set == ATH_ANT_DIV_COMB_LNA1) { -				div_ant_conf.main_lna_conf = -						ATH_ANT_DIV_COMB_LNA1; -				div_ant_conf.alt_lna_conf = -						ATH_ANT_DIV_COMB_LNA2; -			} -			goto div_comb_done; -		} -	} - -	ath_select_ant_div_from_quick_scan(antcomb, &div_ant_conf, -					   main_rssi_avg, alt_rssi_avg, -					   alt_ratio); - -	antcomb->quick_scan_cnt++; - -div_comb_done: -	ath_ant_div_conf_fast_divbias(&div_ant_conf, antcomb, alt_ratio); -	ath9k_hw_antdiv_comb_conf_set(sc->sc_ah, &div_ant_conf); - -	antcomb->scan_start_time = jiffies; -	antcomb->total_pkt_count = 0; -	antcomb->main_total_rssi = 0; -	antcomb->alt_total_rssi = 0; -	antcomb->main_recv_cnt = 0; -	antcomb->alt_recv_cnt = 0; -} -  int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)  {  	struct ath_buf *bf; @@ -1803,7 +1067,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)  	do {  		/* If handling rx interrupt and flush is in progress => exit */ -		if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0)) +		if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags) && (flush == 0))  			break;  		memset(&rs, 0, sizeof(rs)); @@ -1841,13 +1105,14 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)  		else  			rs.is_mybeacon = false; +		sc->rx.num_pkts++;  		ath_debug_stat_rx(sc, &rs);  		/*  		 * If we're asked to flush receive queue, directly  		 * chain it back at the queue without processing it.  		 */ -		if (sc->sc_flags & SC_OP_RXFLUSH) { +		if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags)) {  			RX_STAT_INC(rx_drop_rxflush);  			goto requeue_drop_frag;  		} @@ -1968,7 +1233,6 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)  			skb_trim(skb, skb->len - 8);  		spin_lock_irqsave(&sc->sc_pm_lock, flags); -  		if ((sc->ps_flags & (PS_WAIT_FOR_BEACON |  				     PS_WAIT_FOR_CAB |  				     PS_WAIT_FOR_PSPOLL_DATA)) || diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 458f81b4a7c..87cac8eb783 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h @@ -696,9 +696,12 @@  #define AR_WA_BIT7			(1 << 7)  #define AR_WA_BIT23			(1 << 23)  #define AR_WA_D3_L1_DISABLE		(1 << 14) +#define AR_WA_UNTIE_RESET_EN		(1 << 15) /* Enable PCI Reset +						     to POR (power-on-reset) */  #define AR_WA_D3_TO_L1_DISABLE_REAL     (1 << 16)  #define AR_WA_ASPM_TIMER_BASED_DISABLE  (1 << 17) -#define AR_WA_RESET_EN                  (1 << 18) /* Sw Control to enable PCI-Reset to POR (bit 15) */ +#define AR_WA_RESET_EN                  (1 << 18) /* Enable PCI-Reset to +						     POR (bit 15) */  #define AR_WA_ANALOG_SHIFT              (1 << 20)  #define AR_WA_POR_SHORT                 (1 << 21) /* PCI-E Phy reset control */  #define AR_WA_BIT22			(1 << 22) @@ -798,6 +801,7 @@  #define AR_SREV_REVISION_9580_10	4 /* AR9580 1.0 */  #define AR_SREV_VERSION_9462		0x280  #define AR_SREV_REVISION_9462_20	2 +#define AR_SREV_VERSION_9550		0x400  #define AR_SREV_5416(_ah) \  	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) || \ @@ -905,6 +909,9 @@  	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \  	((_ah)->hw_version.macRev >= AR_SREV_REVISION_9462_20)) +#define AR_SREV_9550(_ah) \ +	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9550)) +  #define AR_SREV_9580(_ah) \  	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \  	((_ah)->hw_version.macRev >= AR_SREV_REVISION_9580_10)) @@ -1028,6 +1035,8 @@ enum {  #define AR_PCIE_PM_CTRL                          (AR_SREV_9340(ah) ? 0x4004 : 0x4014)  #define AR_PCIE_PM_CTRL_ENA                      0x00080000 +#define AR_PCIE_PHY_REG3			 0x18c08 +  #define AR_NUM_GPIO                              14  #define AR928X_NUM_GPIO                          10  #define AR9285_NUM_GPIO                          12 @@ -1231,6 +1240,8 @@ enum {  #define AR_RTC_PLL_CLKSEL       0x00000300  #define AR_RTC_PLL_CLKSEL_S     8  #define AR_RTC_PLL_BYPASS	0x00010000 +#define AR_RTC_PLL_NOPWD	0x00040000 +#define AR_RTC_PLL_NOPWD_S	18  #define PLL3 0x16188  #define PLL3_DO_MEAS_MASK 0x40000000 @@ -1643,11 +1654,11 @@ enum {  #define AR_TPC                 0x80e8  #define AR_TPC_ACK             0x0000003f -#define AR_TPC_ACK_S           0x00 +#define AR_TPC_ACK_S           0  #define AR_TPC_CTS             0x00003f00 -#define AR_TPC_CTS_S           0x08 +#define AR_TPC_CTS_S           8  #define AR_TPC_CHIRP           0x003f0000 -#define AR_TPC_CHIRP_S         0x16 +#define AR_TPC_CHIRP_S         16  #define AR_QUIET1          0x80fc  #define AR_QUIET1_NEXT_QUIET_S         0 @@ -1883,6 +1894,8 @@ enum {  #define AR_PCU_MISC_MODE2_HWWAR2                       0x02000000  #define AR_PCU_MISC_MODE2_RESERVED2                    0xFFFE0000 +#define AR_PCU_MISC_MODE3			       0x83d0 +  #define AR_MAC_PCU_ASYNC_FIFO_REG3			0x8358  #define AR_MAC_PCU_ASYNC_FIFO_REG3_DATAPATH_SEL		0x00000400  #define AR_MAC_PCU_ASYNC_FIFO_REG3_SOFT_RESET		0x80000000 @@ -1905,6 +1918,140 @@ enum {  #define AR_RATE_DURATION_32     0x8780  #define AR_RATE_DURATION(_n)    (AR_RATE_DURATION_0 + ((_n)<<2)) +/* WoW - Wake On Wireless */ + +#define AR_PMCTRL_AUX_PWR_DET		0x10000000 /* Puts Chip in L2 state */ +#define AR_PMCTRL_D3COLD_VAUX		0x00800000 +#define AR_PMCTRL_HOST_PME_EN		0x00400000 /* Send OOB WAKE_L on WoW +						      event */ +#define AR_PMCTRL_WOW_PME_CLR		0x00200000 /* Clear WoW event */ +#define AR_PMCTRL_PWR_STATE_MASK	0x0f000000 /* Power State Mask */ +#define AR_PMCTRL_PWR_STATE_D1D3	0x0f000000 /* Activate D1 and D3 */ +#define AR_PMCTRL_PWR_STATE_D1D3_REAL	0x0f000000 /* Activate D1 and D3 */ +#define AR_PMCTRL_PWR_STATE_D0		0x08000000 /* Activate D0 */ +#define AR_PMCTRL_PWR_PM_CTRL_ENA	0x00008000 /* Enable power mgmt */ + +#define AR_WOW_BEACON_TIMO_MAX		0xffffffff + +/* + * MAC WoW Registers + */ + +#define AR_WOW_PATTERN			0x825C +#define AR_WOW_COUNT			0x8260 +#define AR_WOW_BCN_EN			0x8270 +#define AR_WOW_BCN_TIMO			0x8274 +#define AR_WOW_KEEP_ALIVE_TIMO		0x8278 +#define AR_WOW_KEEP_ALIVE		0x827c +#define AR_WOW_US_SCALAR		0x8284 +#define AR_WOW_KEEP_ALIVE_DELAY		0x8288 +#define AR_WOW_PATTERN_MATCH		0x828c +#define AR_WOW_PATTERN_OFF1		0x8290	/* pattern bytes 0 -> 3 */ +#define AR_WOW_PATTERN_OFF2		0x8294	/* pattern bytes 4 -> 7 */ + +/* for AR9285 or later version of chips */ +#define AR_WOW_EXACT			0x829c +#define AR_WOW_LENGTH1			0x8360 +#define AR_WOW_LENGTH2			0X8364 +/* register to enable match for less than 256 bytes packets */ +#define AR_WOW_PATTERN_MATCH_LT_256B	0x8368 + +#define AR_SW_WOW_CONTROL		0x20018 +#define AR_SW_WOW_ENABLE		0x1 +#define AR_SWITCH_TO_REFCLK		0x2 +#define AR_RESET_CONTROL		0x4 +#define AR_RESET_VALUE_MASK		0x8 +#define AR_HW_WOW_DISABLE		0x10 +#define AR_CLR_MAC_INTERRUPT		0x20 +#define AR_CLR_KA_INTERRUPT		0x40 + +/* AR_WOW_PATTERN register values */ +#define AR_WOW_BACK_OFF_SHIFT(x)	((x & 0xf) << 28) /* in usecs */ +#define AR_WOW_MAC_INTR_EN		0x00040000 +#define AR_WOW_MAGIC_EN			0x00010000 +#define AR_WOW_PATTERN_EN(x)		(x & 0xff) +#define AR_WOW_PAT_FOUND_SHIFT	8 +#define AR_WOW_PATTERN_FOUND(x)		(x & (0xff << AR_WOW_PAT_FOUND_SHIFT)) +#define AR_WOW_PATTERN_FOUND_MASK	((0xff) << AR_WOW_PAT_FOUND_SHIFT) +#define AR_WOW_MAGIC_PAT_FOUND		0x00020000 +#define AR_WOW_MAC_INTR			0x00080000 +#define AR_WOW_KEEP_ALIVE_FAIL		0x00100000 +#define AR_WOW_BEACON_FAIL		0x00200000 + +#define AR_WOW_STATUS(x)		(x & (AR_WOW_PATTERN_FOUND_MASK | \ +					      AR_WOW_MAGIC_PAT_FOUND	| \ +					      AR_WOW_KEEP_ALIVE_FAIL	| \ +					      AR_WOW_BEACON_FAIL)) +#define AR_WOW_CLEAR_EVENTS(x)		(x & ~(AR_WOW_PATTERN_EN(0xff) | \ +					       AR_WOW_MAGIC_EN | \ +					       AR_WOW_MAC_INTR_EN | \ +					       AR_WOW_BEACON_FAIL | \ +					       AR_WOW_KEEP_ALIVE_FAIL)) + +/* AR_WOW_COUNT register values */ +#define AR_WOW_AIFS_CNT(x)		(x & 0xff) +#define AR_WOW_SLOT_CNT(x)		((x & 0xff) << 8) +#define AR_WOW_KEEP_ALIVE_CNT(x)	((x & 0xff) << 16) + +/* AR_WOW_BCN_EN register */ +#define AR_WOW_BEACON_FAIL_EN		0x00000001 + +/* AR_WOW_BCN_TIMO rgister */ +#define AR_WOW_BEACON_TIMO		0x40000000 /* valid if BCN_EN is set */ + +/* AR_WOW_KEEP_ALIVE_TIMO register */ +#define AR_WOW_KEEP_ALIVE_TIMO_VALUE +#define AR_WOW_KEEP_ALIVE_NEVER		0xffffffff + +/* AR_WOW_KEEP_ALIVE register  */ +#define AR_WOW_KEEP_ALIVE_AUTO_DIS	0x00000001 +#define AR_WOW_KEEP_ALIVE_FAIL_DIS	0x00000002 + +/* AR_WOW_KEEP_ALIVE_DELAY register */ +#define AR_WOW_KEEP_ALIVE_DELAY_VALUE	0x000003e8 /* 1 msec */ + + +/* + * keep it long for beacon workaround - ensure no false alarm + */ +#define AR_WOW_BMISSTHRESHOLD		0x20 + +/* AR_WOW_PATTERN_MATCH register */ +#define AR_WOW_PAT_END_OF_PKT(x)	(x & 0xf) +#define AR_WOW_PAT_OFF_MATCH(x)		((x & 0xf) << 8) + +/* + * default values for Wow Configuration for backoff, aifs, slot, keep-alive + * to be programmed into various registers. + */ +#define AR_WOW_PAT_BACKOFF	0x00000004 /* AR_WOW_PATTERN_REG */ +#define AR_WOW_CNT_AIFS_CNT	0x00000022 /* AR_WOW_COUNT_REG */ +#define AR_WOW_CNT_SLOT_CNT	0x00000009 /* AR_WOW_COUNT_REG */ +/* + * Keepalive count applicable for AR9280 2.0 and above. + */ +#define AR_WOW_CNT_KA_CNT 0x00000008    /* AR_WOW_COUNT register */ + +/* WoW - Transmit buffer for keep alive frames */ +#define AR_WOW_TRANSMIT_BUFFER	0xe000 /* E000 - EFFC */ + +#define AR_WOW_TXBUF(i)		(AR_WOW_TRANSMIT_BUFFER + ((i) << 2)) + +#define AR_WOW_KA_DESC_WORD2	0xe000 + +#define AR_WOW_KA_DATA_WORD0	0xe030 + +/* WoW Transmit Buffer for patterns */ +#define AR_WOW_TB_PATTERN(i)	(0xe100 + (i << 8)) +#define AR_WOW_TB_MASK(i)	(0xec00 + (i << 5)) + +/* Currently Pattern 0-7 are supported - so bit 0-7 are set */ +#define AR_WOW_PATTERN_SUPPORTED	0xff +#define AR_WOW_LENGTH_MAX		0xff +#define AR_WOW_LEN1_SHIFT(_i)	((0x3 - ((_i) & 0x3)) << 0x3) +#define AR_WOW_LENGTH1_MASK(_i)	(AR_WOW_LENGTH_MAX << AR_WOW_LEN1_SHIFT(_i)) +#define AR_WOW_LEN2_SHIFT(_i)	((0x7 - ((_i) & 0x7)) << 0x3) +#define AR_WOW_LENGTH2_MASK(_i)	(AR_WOW_LENGTH_MAX << AR_WOW_LEN2_SHIFT(_i))  #define AR9271_CORE_CLOCK	117   /* clock to 117Mhz */  #define AR9271_TARGET_BAUD_RATE	19200 /* 115200 */ @@ -2077,12 +2224,6 @@ enum {  					 AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET| \  					 AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING  | \  					 AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING| \ -					 AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO   | \ -					 AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL | \ -					 AR_MCI_INTERRUPT_RX_MSG_LNA_INFO    | \ -					 AR_MCI_INTERRUPT_RX_MSG_CONT_NACK   | \ -					 AR_MCI_INTERRUPT_RX_MSG_CONT_INFO   | \ -					 AR_MCI_INTERRUPT_RX_MSG_CONT_RST    | \  					 AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)  #define AR_MCI_CPU_INT					0x1840 @@ -2098,8 +2239,8 @@ enum {  #define AR_MCI_CONT_STATUS			0x1848  #define AR_MCI_CONT_RSSI_POWER			0x000000FF  #define AR_MCI_CONT_RSSI_POWER_S		0 -#define AR_MCI_CONT_RRIORITY			0x0000FF00 -#define AR_MCI_CONT_RRIORITY_S			8 +#define AR_MCI_CONT_PRIORITY			0x0000FF00 +#define AR_MCI_CONT_PRIORITY_S			8  #define AR_MCI_CONT_TXRX			0x00010000  #define AR_MCI_CONT_TXRX_S			16 @@ -2162,10 +2303,6 @@ enum {  #define AR_BTCOEX_CTRL_SPDT_POLARITY			0x80000000  #define AR_BTCOEX_CTRL_SPDT_POLARITY_S			31 -#define AR_BTCOEX_WL_WEIGHTS0				0x18b0 -#define AR_BTCOEX_WL_WEIGHTS1				0x18b4 -#define AR_BTCOEX_WL_WEIGHTS2				0x18b8 -#define AR_BTCOEX_WL_WEIGHTS3				0x18bc  #define AR_BTCOEX_MAX_TXPWR(_x)				(0x18c0 + ((_x) << 2))  #define AR_BTCOEX_WL_LNA				0x1940  #define AR_BTCOEX_RFGAIN_CTRL				0x1944 @@ -2211,5 +2348,7 @@ enum {  #define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT	0x00000fff  #define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT_S	0 +#define AR_GLB_SWREG_DISCONT_MODE         0x2002c +#define AR_GLB_SWREG_DISCONT_EN_BT_WLAN   0x3  #endif diff --git a/drivers/net/wireless/ath/ath9k/wow.c b/drivers/net/wireless/ath/ath9k/wow.c new file mode 100644 index 00000000000..44a08eb53c6 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/wow.c @@ -0,0 +1,532 @@ +/* + * Copyright (c) 2012 Qualcomm Atheros, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <linux/export.h> +#include "ath9k.h" +#include "reg.h" +#include "hw-ops.h" + +const char *ath9k_hw_wow_event_to_string(u32 wow_event) +{ +	if (wow_event & AH_WOW_MAGIC_PATTERN_EN) +		return "Magic pattern"; +	if (wow_event & AH_WOW_USER_PATTERN_EN) +		return "User pattern"; +	if (wow_event & AH_WOW_LINK_CHANGE) +		return "Link change"; +	if (wow_event & AH_WOW_BEACON_MISS) +		return "Beacon miss"; + +	return  "unknown reason"; +} +EXPORT_SYMBOL(ath9k_hw_wow_event_to_string); + +static void ath9k_hw_config_serdes_wow_sleep(struct ath_hw *ah) +{ +	int i; + +	for (i = 0; i < ah->iniPcieSerdesWow.ia_rows; i++) +		REG_WRITE(ah, INI_RA(&ah->iniPcieSerdesWow, i, 0), +			  INI_RA(&ah->iniPcieSerdesWow, i, 1)); + +	usleep_range(1000, 1500); +} + +static void ath9k_hw_set_powermode_wow_sleep(struct ath_hw *ah) +{ +	struct ath_common *common = ath9k_hw_common(ah); + +	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); + +	/* set rx disable bit */ +	REG_WRITE(ah, AR_CR, AR_CR_RXD); + +	if (!ath9k_hw_wait(ah, AR_CR, AR_CR_RXE, 0, AH_WAIT_TIMEOUT)) { +		ath_err(common, "Failed to stop Rx DMA in 10ms AR_CR=0x%08x AR_DIAG_SW=0x%08x\n", +			REG_READ(ah, AR_CR), REG_READ(ah, AR_DIAG_SW)); +		return; +	} else { +		if (!AR_SREV_9300_20_OR_LATER(ah)) +			REG_WRITE(ah, AR_RXDP, 0x0); +	} + +	/* AR9280 WoW has sleep issue, do not set it to sleep */ +	if (AR_SREV_9280_20(ah)) +		return; + +	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON_INT); +} + +static void ath9k_wow_create_keep_alive_pattern(struct ath_hw *ah) +{ +	struct ath_common *common = ath9k_hw_common(ah); +	u8 sta_mac_addr[ETH_ALEN], ap_mac_addr[ETH_ALEN]; +	u32 ctl[13] = {0}; +	u32 data_word[KAL_NUM_DATA_WORDS]; +	u8 i; +	u32 wow_ka_data_word0; + +	memcpy(sta_mac_addr, common->macaddr, ETH_ALEN); +	memcpy(ap_mac_addr, common->curbssid, ETH_ALEN); + +	/* set the transmit buffer */ +	ctl[0] = (KAL_FRAME_LEN | (MAX_RATE_POWER << 16)); + +	if (!(AR_SREV_9300_20_OR_LATER(ah))) +		ctl[0] += (KAL_ANTENNA_MODE << 25); + +	ctl[1] = 0; +	ctl[3] = 0xb;	/* OFDM_6M hardware value for this rate */ +	ctl[4] = 0; +	ctl[7] = (ah->txchainmask) << 2; + +	if (AR_SREV_9300_20_OR_LATER(ah)) +		ctl[2] = 0xf << 16; /* tx_tries 0 */ +	else +		ctl[2] = 0x7 << 16; /* tx_tries 0 */ + + +	for (i = 0; i < KAL_NUM_DESC_WORDS; i++) +		REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]); + +	/* for AR9300 family 13 descriptor words */ +	if (AR_SREV_9300_20_OR_LATER(ah)) +		REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]); + +	data_word[0] = (KAL_FRAME_TYPE << 2) | (KAL_FRAME_SUB_TYPE << 4) | +		       (KAL_TO_DS << 8) | (KAL_DURATION_ID << 16); +	data_word[1] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) | +		       (ap_mac_addr[1] << 8) | (ap_mac_addr[0]); +	data_word[2] = (sta_mac_addr[1] << 24) | (sta_mac_addr[0] << 16) | +		       (ap_mac_addr[5] << 8) | (ap_mac_addr[4]); +	data_word[3] = (sta_mac_addr[5] << 24) | (sta_mac_addr[4] << 16) | +		       (sta_mac_addr[3] << 8) | (sta_mac_addr[2]); +	data_word[4] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) | +		       (ap_mac_addr[1] << 8) | (ap_mac_addr[0]); +	data_word[5] = (ap_mac_addr[5] << 8) | (ap_mac_addr[4]); + +	if (AR_SREV_9462_20_OR_LATER(ah)) { +		/* AR9462 2.0 has an extra descriptor word (time based +		 * discard) compared to other chips */ +		REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + (12 * 4)), 0); +		wow_ka_data_word0 = AR_WOW_TXBUF(13); +	} else { +		wow_ka_data_word0 = AR_WOW_TXBUF(12); +	} + +	for (i = 0; i < KAL_NUM_DATA_WORDS; i++) +		REG_WRITE(ah, (wow_ka_data_word0 + i*4), data_word[i]); + +} + +void ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern, +				u8 *user_mask, int pattern_count, +				int pattern_len) +{ +	int i; +	u32 pattern_val, mask_val; +	u32 set, clr; + +	/* FIXME: should check count by querying the hardware capability */ +	if (pattern_count >= MAX_NUM_PATTERN) +		return; + +	REG_SET_BIT(ah, AR_WOW_PATTERN, BIT(pattern_count)); + +	/* set the registers for pattern */ +	for (i = 0; i < MAX_PATTERN_SIZE; i += 4) { +		memcpy(&pattern_val, user_pattern, 4); +		REG_WRITE(ah, (AR_WOW_TB_PATTERN(pattern_count) + i), +			  pattern_val); +		user_pattern += 4; +	} + +	/* set the registers for mask */ +	for (i = 0; i < MAX_PATTERN_MASK_SIZE; i += 4) { +		memcpy(&mask_val, user_mask, 4); +		REG_WRITE(ah, (AR_WOW_TB_MASK(pattern_count) + i), mask_val); +		user_mask += 4; +	} + +	/* set the pattern length to be matched +	 * +	 * AR_WOW_LENGTH1_REG1 +	 * bit 31:24 pattern 0 length +	 * bit 23:16 pattern 1 length +	 * bit 15:8 pattern 2 length +	 * bit 7:0 pattern 3 length +	 * +	 * AR_WOW_LENGTH1_REG2 +	 * bit 31:24 pattern 4 length +	 * bit 23:16 pattern 5 length +	 * bit 15:8 pattern 6 length +	 * bit 7:0 pattern 7 length +	 * +	 * the below logic writes out the new +	 * pattern length for the corresponding +	 * pattern_count, while masking out the +	 * other fields +	 */ + +	ah->wow_event_mask |= BIT(pattern_count + AR_WOW_PAT_FOUND_SHIFT); + +	if (!AR_SREV_9285_12_OR_LATER(ah)) +		return; + +	if (pattern_count < 4) { +		/* Pattern 0-3 uses AR_WOW_LENGTH1 register */ +		set = (pattern_len & AR_WOW_LENGTH_MAX) << +		       AR_WOW_LEN1_SHIFT(pattern_count); +		clr = AR_WOW_LENGTH1_MASK(pattern_count); +		REG_RMW(ah, AR_WOW_LENGTH1, set, clr); +	} else { +		/* Pattern 4-7 uses AR_WOW_LENGTH2 register */ +		set = (pattern_len & AR_WOW_LENGTH_MAX) << +		       AR_WOW_LEN2_SHIFT(pattern_count); +		clr = AR_WOW_LENGTH2_MASK(pattern_count); +		REG_RMW(ah, AR_WOW_LENGTH2, set, clr); +	} + +} +EXPORT_SYMBOL(ath9k_hw_wow_apply_pattern); + +u32 ath9k_hw_wow_wakeup(struct ath_hw *ah) +{ +	u32 wow_status = 0; +	u32 val = 0, rval; +	/* +	 * read the WoW status register to know +	 * the wakeup reason +	 */ +	rval = REG_READ(ah, AR_WOW_PATTERN); +	val = AR_WOW_STATUS(rval); + +	/* +	 * mask only the WoW events that we have enabled. Sometimes +	 * we have spurious WoW events from the AR_WOW_PATTERN +	 * register. This mask will clean it up. +	 */ + +	val &= ah->wow_event_mask; + +	if (val) { + +		if (val & AR_WOW_MAGIC_PAT_FOUND) +			wow_status |= AH_WOW_MAGIC_PATTERN_EN; + +		if (AR_WOW_PATTERN_FOUND(val)) +			wow_status |= AH_WOW_USER_PATTERN_EN; + +		if (val & AR_WOW_KEEP_ALIVE_FAIL) +			wow_status |= AH_WOW_LINK_CHANGE; + +		if (val & AR_WOW_BEACON_FAIL) +			wow_status |= AH_WOW_BEACON_MISS; + +	} + +	/* +	 * set and clear WOW_PME_CLEAR registers for the chip to +	 * generate next wow signal. +	 * disable D3 before accessing other registers ? +	 */ + +	/* do we need to check the bit value 0x01000000 (7-10) ?? */ +	REG_RMW(ah, AR_PCIE_PM_CTRL, AR_PMCTRL_WOW_PME_CLR, +		AR_PMCTRL_PWR_STATE_D1D3); + +	/* +	 * clear all events +	 */ +	REG_WRITE(ah, AR_WOW_PATTERN, +		  AR_WOW_CLEAR_EVENTS(REG_READ(ah, AR_WOW_PATTERN))); + +	/* +	 * tie reset register for AR9002 family of chipsets +	 * NB: not tieing it back might have some repurcussions. +	 */ + +	if (!AR_SREV_9300_20_OR_LATER(ah)) { +		REG_SET_BIT(ah, AR_WA, AR_WA_UNTIE_RESET_EN | +			    AR_WA_POR_SHORT | AR_WA_RESET_EN); +	} + + +	/* +	 * restore the beacon threshold to init value +	 */ +	REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR); + +	/* +	 * Restore the way the PCI-E reset, Power-On-Reset, external +	 * PCIE_POR_SHORT pins are tied to its original value. +	 * Previously just before WoW sleep, we untie the PCI-E +	 * reset to our Chip's Power On Reset so that any PCI-E +	 * reset from the bus will not reset our chip +	 */ + +	if (AR_SREV_9280_20_OR_LATER(ah) && ah->is_pciexpress) +		ath9k_hw_configpcipowersave(ah, false); + +	ah->wow_event_mask = 0; + +	return wow_status; +} +EXPORT_SYMBOL(ath9k_hw_wow_wakeup); + +void ath9k_hw_wow_enable(struct ath_hw *ah, u32 pattern_enable) +{ +	u32 wow_event_mask; +	u32 set, clr; + +	/* +	 * wow_event_mask is a mask to the AR_WOW_PATTERN register to +	 * indicate which WoW events we have enabled. The WoW events +	 * are from the 'pattern_enable' in this function and +	 * 'pattern_count' of ath9k_hw_wow_apply_pattern() +	 */ + +	wow_event_mask = ah->wow_event_mask; + +	/* +	 * Untie Power-on-Reset from the PCI-E-Reset. When we are in +	 * WOW sleep, we do want the Reset from the PCI-E to disturb +	 * our hw state +	 */ + +	if (ah->is_pciexpress) { + +		/* +		 * we need to untie the internal POR (power-on-reset) +		 * to the external PCI-E reset. We also need to tie +		 * the PCI-E Phy reset to the PCI-E reset. +		 */ + +		if (AR_SREV_9300_20_OR_LATER(ah)) { +			set = AR_WA_RESET_EN | AR_WA_POR_SHORT; +			clr = AR_WA_UNTIE_RESET_EN | AR_WA_D3_L1_DISABLE; +			REG_RMW(ah, AR_WA, set, clr); +		} else { +			if (AR_SREV_9285(ah) || AR_SREV_9287(ah)) +				set = AR9285_WA_DEFAULT; +			else +				set = AR9280_WA_DEFAULT; + +			/* +			 * In AR9280 and AR9285, bit 14 in WA register +			 * (disable L1) should only be set when device +			 * enters D3 state and be cleared when device +			 * comes back to D0 +			 */ + +			if (ah->config.pcie_waen & AR_WA_D3_L1_DISABLE) +				set |= AR_WA_D3_L1_DISABLE; + +			clr = AR_WA_UNTIE_RESET_EN; +			set |= AR_WA_RESET_EN | AR_WA_POR_SHORT; +			REG_RMW(ah, AR_WA, set, clr); + +			/* +			 * for WoW sleep, we reprogram the SerDes so that the +			 * PLL and CLK REQ are both enabled. This uses more +			 * power but otherwise WoW sleep is unstable and the +			 * chip may disappear. +			 */ + +			if (AR_SREV_9285_12_OR_LATER(ah)) +				ath9k_hw_config_serdes_wow_sleep(ah); + +		} +	} + +	/* +	 * set the power states appropriately and enable PME +	 */ +	set = AR_PMCTRL_HOST_PME_EN | AR_PMCTRL_PWR_PM_CTRL_ENA | +	      AR_PMCTRL_AUX_PWR_DET | AR_PMCTRL_WOW_PME_CLR; + +	/* +	 * set and clear WOW_PME_CLEAR registers for the chip +	 * to generate next wow signal. +	 */ +	REG_SET_BIT(ah, AR_PCIE_PM_CTRL, set); +	clr = AR_PMCTRL_WOW_PME_CLR; +	REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, clr); + +	/* +	 * Setup for: +	 *	- beacon misses +	 *	- magic pattern +	 *	- keep alive timeout +	 *	- pattern matching +	 */ + +	/* +	 * Program default values for pattern backoff, aifs/slot/KAL count, +	 * beacon miss timeout, KAL timeout, etc. +	 */ + +	set = AR_WOW_BACK_OFF_SHIFT(AR_WOW_PAT_BACKOFF); +	REG_SET_BIT(ah, AR_WOW_PATTERN, set); + +	set = AR_WOW_AIFS_CNT(AR_WOW_CNT_AIFS_CNT) | +	      AR_WOW_SLOT_CNT(AR_WOW_CNT_SLOT_CNT) | +	      AR_WOW_KEEP_ALIVE_CNT(AR_WOW_CNT_KA_CNT); +	REG_SET_BIT(ah, AR_WOW_COUNT, set); + +	if (pattern_enable & AH_WOW_BEACON_MISS) +		set = AR_WOW_BEACON_TIMO; +	/* We are not using beacon miss, program a large value */ +	else +		set = AR_WOW_BEACON_TIMO_MAX; + +	REG_WRITE(ah, AR_WOW_BCN_TIMO, set); + +	/* +	 * Keep alive timo in ms except AR9280 +	 */ +	if (!pattern_enable || AR_SREV_9280(ah)) +		set = AR_WOW_KEEP_ALIVE_NEVER; +	else +		set = KAL_TIMEOUT * 32; + +	REG_WRITE(ah, AR_WOW_KEEP_ALIVE_TIMO, set); + +	/* +	 * Keep alive delay in us. based on 'power on clock', +	 * therefore in usec +	 */ +	set = KAL_DELAY * 1000; +	REG_WRITE(ah, AR_WOW_KEEP_ALIVE_DELAY, set); + +	/* +	 * Create keep alive pattern to respond to beacons +	 */ +	ath9k_wow_create_keep_alive_pattern(ah); + +	/* +	 * Configure MAC WoW Registers +	 */ + +	set = 0; +	/* Send keep alive timeouts anyway */ +	clr = AR_WOW_KEEP_ALIVE_AUTO_DIS; + +	if (pattern_enable & AH_WOW_LINK_CHANGE) +		wow_event_mask |= AR_WOW_KEEP_ALIVE_FAIL; +	else +		set = AR_WOW_KEEP_ALIVE_FAIL_DIS; + +	/* +	 * FIXME: For now disable keep alive frame +	 * failure. This seems to sometimes trigger +	 * unnecessary wake up with AR9485 chipsets. +	 */ +	set = AR_WOW_KEEP_ALIVE_FAIL_DIS; + +	REG_RMW(ah, AR_WOW_KEEP_ALIVE, set, clr); + + +	/* +	 * we are relying on a bmiss failure. ensure we have +	 * enough threshold to prevent false positives +	 */ +	REG_RMW_FIELD(ah, AR_RSSI_THR, AR_RSSI_THR_BM_THR, +		      AR_WOW_BMISSTHRESHOLD); + +	set = 0; +	clr = 0; + +	if (pattern_enable & AH_WOW_BEACON_MISS) { +		set = AR_WOW_BEACON_FAIL_EN; +		wow_event_mask |= AR_WOW_BEACON_FAIL; +	} else { +		clr = AR_WOW_BEACON_FAIL_EN; +	} + +	REG_RMW(ah, AR_WOW_BCN_EN, set, clr); + +	set = 0; +	clr = 0; +	/* +	 * Enable the magic packet registers +	 */ +	if (pattern_enable & AH_WOW_MAGIC_PATTERN_EN) { +		set = AR_WOW_MAGIC_EN; +		wow_event_mask |= AR_WOW_MAGIC_PAT_FOUND; +	} else { +		clr = AR_WOW_MAGIC_EN; +	} +	set |= AR_WOW_MAC_INTR_EN; +	REG_RMW(ah, AR_WOW_PATTERN, set, clr); + +	/* +	 * For AR9285 and later version of chipsets +	 * enable WoW pattern match for packets less +	 * than 256 bytes for all patterns +	 */ +	if (AR_SREV_9285_12_OR_LATER(ah)) +		REG_WRITE(ah, AR_WOW_PATTERN_MATCH_LT_256B, +			  AR_WOW_PATTERN_SUPPORTED); + +	/* +	 * Set the power states appropriately and enable PME +	 */ +	clr = 0; +	set = AR_PMCTRL_PWR_STATE_D1D3 | AR_PMCTRL_HOST_PME_EN | +	      AR_PMCTRL_PWR_PM_CTRL_ENA; +	/* +	 * This is needed for AR9300 chipsets to wake-up +	 * the host. +	 */ +	if (AR_SREV_9300_20_OR_LATER(ah)) +		clr = AR_PCIE_PM_CTRL_ENA; + +	REG_RMW(ah, AR_PCIE_PM_CTRL, set, clr); + +	if (AR_SREV_9462(ah)) { +		/* +		 * this is needed to prevent the chip waking up +		 * the host within 3-4 seconds with certain +		 * platform/BIOS. The fix is to enable +		 * D1 & D3 to match original definition and +		 * also match the OTP value. Anyway this +		 * is more related to SW WOW. +		 */ +		clr = AR_PMCTRL_PWR_STATE_D1D3; +		REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, clr); + +		set = AR_PMCTRL_PWR_STATE_D1D3_REAL; +		REG_SET_BIT(ah, AR_PCIE_PM_CTRL, set); +	} + + + +	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM); + +	if (AR_SREV_9300_20_OR_LATER(ah)) { +		/* to bring down WOW power low margin */ +		set = BIT(13); +		REG_SET_BIT(ah, AR_PCIE_PHY_REG3, set); +		/* HW WoW */ +		clr = BIT(5); +		REG_CLR_BIT(ah, AR_PCU_MISC_MODE3, clr); +	} + +	ath9k_hw_set_powermode_wow_sleep(ah); +	ah->wow_event_mask = wow_event_mask; +} +EXPORT_SYMBOL(ath9k_hw_wow_enable); diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 23eaa1b26eb..2c9da6b2ecb 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -29,6 +29,8 @@  #define HT_LTF(_ns)             (4 * (_ns))  #define SYMBOL_TIME(_ns)        ((_ns) << 2) /* ns * 4 us */  #define SYMBOL_TIME_HALFGI(_ns) (((_ns) * 18 + 4) / 5)  /* ns * 3.6 us */ +#define TIME_SYMBOLS(t)         ((t) >> 2) +#define TIME_SYMBOLS_HALFGI(t)  (((t) * 5 - 4) / 18)  #define NUM_SYMBOLS_PER_USEC(_usec) (_usec >> 2)  #define NUM_SYMBOLS_PER_USEC_HALFGI(_usec) (((_usec*5)-4)/18) @@ -64,7 +66,8 @@ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,  static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,  					   struct ath_txq *txq,  					   struct ath_atx_tid *tid, -					   struct sk_buff *skb); +					   struct sk_buff *skb, +					   bool dequeue);  enum {  	MCS_HT20, @@ -73,50 +76,23 @@ enum {  	MCS_HT40_SGI,  }; -static int ath_max_4ms_framelen[4][32] = { -	[MCS_HT20] = { -		3212,  6432,  9648,  12864,  19300,  25736,  28952,  32172, -		6424,  12852, 19280, 25708,  38568,  51424,  57852,  64280, -		9628,  19260, 28896, 38528,  57792,  65532,  65532,  65532, -		12828, 25656, 38488, 51320,  65532,  65532,  65532,  65532, -	}, -	[MCS_HT20_SGI] = { -		3572,  7144,  10720,  14296,  21444,  28596,  32172,  35744, -		7140,  14284, 21428,  28568,  42856,  57144,  64288,  65532, -		10700, 21408, 32112,  42816,  64228,  65532,  65532,  65532, -		14256, 28516, 42780,  57040,  65532,  65532,  65532,  65532, -	}, -	[MCS_HT40] = { -		6680,  13360,  20044,  26724,  40092,  53456,  60140,  65532, -		13348, 26700,  40052,  53400,  65532,  65532,  65532,  65532, -		20004, 40008,  60016,  65532,  65532,  65532,  65532,  65532, -		26644, 53292,  65532,  65532,  65532,  65532,  65532,  65532, -	}, -	[MCS_HT40_SGI] = { -		7420,  14844,  22272,  29696,  44544,  59396,  65532,  65532, -		14832, 29668,  44504,  59340,  65532,  65532,  65532,  65532, -		22232, 44464,  65532,  65532,  65532,  65532,  65532,  65532, -		29616, 59232,  65532,  65532,  65532,  65532,  65532,  65532, -	} -}; -  /*********************/  /* Aggregation logic */  /*********************/ -static void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq) +void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq)  	__acquires(&txq->axq_lock)  {  	spin_lock_bh(&txq->axq_lock);  } -static void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq) +void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq)  	__releases(&txq->axq_lock)  {  	spin_unlock_bh(&txq->axq_lock);  } -static void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq) +void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq)  	__releases(&txq->axq_lock)  {  	struct sk_buff_head q; @@ -613,10 +589,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  	rcu_read_unlock(); -	if (needreset) { -		RESET_STAT_INC(sc, RESET_TYPE_TX_ERROR); -		ieee80211_queue_work(sc->hw, &sc->hw_reset_work); -	} +	if (needreset) +		ath9k_queue_reset(sc, RESET_TYPE_TX_ERROR);  }  static bool ath_lookup_legacy(struct ath_buf *bf) @@ -649,6 +623,7 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,  	struct ieee80211_tx_rate *rates;  	u32 max_4ms_framelen, frmlen;  	u16 aggr_limit, bt_aggr_limit, legacy = 0; +	int q = tid->ac->txq->mac80211_qnum;  	int i;  	skb = bf->bf_mpdu; @@ -657,8 +632,7 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,  	/*  	 * Find the lowest frame length among the rate series that will have a -	 * 4ms transmit duration. -	 * TODO - TXOP limit needs to be considered. +	 * 4ms (or TXOP limited) transmit duration.  	 */  	max_4ms_framelen = ATH_AMPDU_LIMIT_MAX; @@ -681,7 +655,7 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,  		if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI)  			modeidx++; -		frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx]; +		frmlen = sc->tx.max_aggr_framelen[q][modeidx][rates[i].idx];  		max_4ms_framelen = min(max_4ms_framelen, frmlen);  	} @@ -811,7 +785,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc,  		fi = get_frame_info(skb);  		bf = fi->bf;  		if (!fi->bf) -			bf = ath_tx_setup_buffer(sc, txq, tid, skb); +			bf = ath_tx_setup_buffer(sc, txq, tid, skb, true);  		if (!bf)  			continue; @@ -928,6 +902,44 @@ static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, int pktlen,  	return duration;  } +static int ath_max_framelen(int usec, int mcs, bool ht40, bool sgi) +{ +	int streams = HT_RC_2_STREAMS(mcs); +	int symbols, bits; +	int bytes = 0; + +	symbols = sgi ? TIME_SYMBOLS_HALFGI(usec) : TIME_SYMBOLS(usec); +	bits = symbols * bits_per_symbol[mcs % 8][ht40] * streams; +	bits -= OFDM_PLCP_BITS; +	bytes = bits / 8; +	bytes -= L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); +	if (bytes > 65532) +		bytes = 65532; + +	return bytes; +} + +void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop) +{ +	u16 *cur_ht20, *cur_ht20_sgi, *cur_ht40, *cur_ht40_sgi; +	int mcs; + +	/* 4ms is the default (and maximum) duration */ +	if (!txop || txop > 4096) +		txop = 4096; + +	cur_ht20 = sc->tx.max_aggr_framelen[queue][MCS_HT20]; +	cur_ht20_sgi = sc->tx.max_aggr_framelen[queue][MCS_HT20_SGI]; +	cur_ht40 = sc->tx.max_aggr_framelen[queue][MCS_HT40]; +	cur_ht40_sgi = sc->tx.max_aggr_framelen[queue][MCS_HT40_SGI]; +	for (mcs = 0; mcs < 32; mcs++) { +		cur_ht20[mcs] = ath_max_framelen(txop, mcs, false, false); +		cur_ht20_sgi[mcs] = ath_max_framelen(txop, mcs, false, true); +		cur_ht40[mcs] = ath_max_framelen(txop, mcs, true, false); +		cur_ht40_sgi[mcs] = ath_max_framelen(txop, mcs, true, true); +	} +} +  static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,  			     struct ath_tx_info *info, int len)  { @@ -937,6 +949,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,  	struct ieee80211_tx_rate *rates;  	const struct ieee80211_rate *rate;  	struct ieee80211_hdr *hdr; +	struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu);  	int i;  	u8 rix = 0; @@ -947,18 +960,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,  	/* set dur_update_en for l-sig computation except for PS-Poll frames */  	info->dur_update = !ieee80211_is_pspoll(hdr->frame_control); - -	/* -	 * We check if Short Preamble is needed for the CTS rate by -	 * checking the BSS's global flag. -	 * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. -	 */ -	rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info); -	info->rtscts_rate = rate->hw_value; - -	if (tx_info->control.vif && -	    tx_info->control.vif->bss_conf.use_short_preamble) -		info->rtscts_rate |= rate->hw_value_short; +	info->rtscts_rate = fi->rtscts_rate;  	for (i = 0; i < 4; i++) {  		bool is_40, is_sgi, is_sp; @@ -1000,13 +1002,13 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,  		}  		/* legacy rates */ +		rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];  		if ((tx_info->band == IEEE80211_BAND_2GHZ) &&  		    !(rate->flags & IEEE80211_RATE_ERP_G))  			phy = WLAN_RC_PHY_CCK;  		else  			phy = WLAN_RC_PHY_OFDM; -		rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];  		info->rates[i].Rate = rate->hw_value;  		if (rate->hw_value_short) {  			if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) @@ -1174,6 +1176,7 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,  {  	struct ath_atx_tid *txtid;  	struct ath_node *an; +	u8 density;  	an = (struct ath_node *)sta->drv_priv;  	txtid = ATH_AN_2_TID(an, tid); @@ -1181,6 +1184,17 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,  	if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))  		return -EAGAIN; +	/* update ampdu factor/density, they may have changed. This may happen +	 * in HT IBSS when a beacon with HT-info is received after the station +	 * has already been added. +	 */ +	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) { +		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + +				     sta->ht_cap.ampdu_factor); +		density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density); +		an->mpdudensity = density; +	} +  	txtid->state |= AGGR_ADDBA_PROGRESS;  	txtid->paused = true;  	*ssn = txtid->seq_start = txtid->seq_next; @@ -1400,16 +1414,6 @@ int ath_txq_update(struct ath_softc *sc, int qnum,  	int error = 0;  	struct ath9k_tx_queue_info qi; -	if (qnum == sc->beacon.beaconq) { -		/* -		 * XXX: for beacon queue, we just save the parameter. -		 * It will be picked up by ath_beaconq_config when -		 * it's necessary. -		 */ -		sc->beacon.beacon_qi = *qinfo; -		return 0; -	} -  	BUG_ON(sc->tx.txq[qnum].axq_qnum != qnum);  	ath9k_hw_get_txq_props(ah, qnum, &qi); @@ -1535,7 +1539,7 @@ bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)  	int i;  	u32 npend = 0; -	if (sc->sc_flags & SC_OP_INVALID) +	if (test_bit(SC_OP_INVALID, &sc->sc_flags))  		return true;  	ath9k_hw_abort_tx_dma(ah); @@ -1583,7 +1587,8 @@ void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)  	struct ath_atx_ac *ac, *ac_tmp, *last_ac;  	struct ath_atx_tid *tid, *last_tid; -	if (work_pending(&sc->hw_reset_work) || list_empty(&txq->axq_acq) || +	if (test_bit(SC_OP_HW_RESET, &sc->sc_flags) || +	    list_empty(&txq->axq_acq) ||  	    txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH)  		return; @@ -1726,7 +1731,7 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid,  		return;  	} -	bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); +	bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false);  	if (!bf)  		return; @@ -1753,7 +1758,7 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,  	bf = fi->bf;  	if (!bf) -		bf = ath_tx_setup_buffer(sc, txq, tid, skb); +		bf = ath_tx_setup_buffer(sc, txq, tid, skb, false);  	if (!bf)  		return; @@ -1775,10 +1780,22 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,  	struct ieee80211_sta *sta = tx_info->control.sta;  	struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +	const struct ieee80211_rate *rate;  	struct ath_frame_info *fi = get_frame_info(skb);  	struct ath_node *an = NULL;  	enum ath9k_key_type keytype; +	bool short_preamble = false; +	/* +	 * We check if Short Preamble is needed for the CTS rate by +	 * checking the BSS's global flag. +	 * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. +	 */ +	if (tx_info->control.vif && +	    tx_info->control.vif->bss_conf.use_short_preamble) +		short_preamble = true; + +	rate = ieee80211_get_rts_cts_rate(hw, tx_info);  	keytype = ath9k_cmn_get_hw_crypto_keytype(skb);  	if (sta) @@ -1793,6 +1810,9 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,  		fi->keyix = ATH9K_TXKEYIX_INVALID;  	fi->keytype = keytype;  	fi->framelen = framelen; +	fi->rtscts_rate = rate->hw_value; +	if (short_preamble) +		fi->rtscts_rate |= rate->hw_value_short;  }  u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) @@ -1814,7 +1834,8 @@ u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)  static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,  					   struct ath_txq *txq,  					   struct ath_atx_tid *tid, -					   struct sk_buff *skb) +					   struct sk_buff *skb, +					   bool dequeue)  {  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_frame_info *fi = get_frame_info(skb); @@ -1863,6 +1884,8 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,  	return bf;  error: +	if (dequeue) +		__skb_unlink(skb, &tid->buf_q);  	dev_kfree_skb_any(skb);  	return NULL;  } @@ -1893,7 +1916,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb,  		 */  		ath_tx_send_ampdu(sc, tid, skb, txctl);  	} else { -		bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); +		bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false);  		if (!bf)  			return; @@ -1967,7 +1990,8 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,  	ath_txq_lock(sc, txq);  	if (txq == sc->tx.txq_map[q] && -	    ++txq->pending_frames > ATH_MAX_QDEPTH && !txq->stopped) { +	    ++txq->pending_frames > sc->tx.txq_max_pending[q] && +	    !txq->stopped) {  		ieee80211_stop_queue(sc->hw, q);  		txq->stopped = true;  	} @@ -1990,6 +2014,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;  	int q, padpos, padsize; +	unsigned long flags;  	ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); @@ -2008,6 +2033,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,  		skb_pull(skb, padsize);  	} +	spin_lock_irqsave(&sc->sc_pm_lock, flags);  	if ((sc->ps_flags & PS_WAIT_FOR_TX_ACK) && !txq->axq_depth) {  		sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK;  		ath_dbg(common, PS, @@ -2017,13 +2043,15 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,  					PS_WAIT_FOR_PSPOLL_DATA |  					PS_WAIT_FOR_TX_ACK));  	} +	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);  	q = skb_get_queue_mapping(skb);  	if (txq == sc->tx.txq_map[q]) {  		if (WARN_ON(--txq->pending_frames < 0))  			txq->pending_frames = 0; -		if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) { +		if (txq->stopped && +		    txq->pending_frames < sc->tx.txq_max_pending[q]) {  			ieee80211_wake_queue(sc->hw, q);  			txq->stopped = false;  		} @@ -2167,7 +2195,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)  	ath_txq_lock(sc, txq);  	for (;;) { -		if (work_pending(&sc->hw_reset_work)) +		if (test_bit(SC_OP_HW_RESET, &sc->sc_flags))  			break;  		if (list_empty(&txq->axq_q)) { @@ -2227,46 +2255,6 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)  	ath_txq_unlock_complete(sc, txq);  } -static void ath_tx_complete_poll_work(struct work_struct *work) -{ -	struct ath_softc *sc = container_of(work, struct ath_softc, -			tx_complete_work.work); -	struct ath_txq *txq; -	int i; -	bool needreset = false; -#ifdef CONFIG_ATH9K_DEBUGFS -	sc->tx_complete_poll_work_seen++; -#endif - -	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) -		if (ATH_TXQ_SETUP(sc, i)) { -			txq = &sc->tx.txq[i]; -			ath_txq_lock(sc, txq); -			if (txq->axq_depth) { -				if (txq->axq_tx_inprogress) { -					needreset = true; -					ath_txq_unlock(sc, txq); -					break; -				} else { -					txq->axq_tx_inprogress = true; -				} -			} -			ath_txq_unlock_complete(sc, txq); -		} - -	if (needreset) { -		ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, -			"tx hung, resetting the chip\n"); -		RESET_STAT_INC(sc, RESET_TYPE_TX_HANG); -		ieee80211_queue_work(sc->hw, &sc->hw_reset_work); -	} - -	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, -			msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); -} - - -  void ath_tx_tasklet(struct ath_softc *sc)  {  	struct ath_hw *ah = sc->sc_ah; @@ -2290,7 +2278,7 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)  	int status;  	for (;;) { -		if (work_pending(&sc->hw_reset_work)) +		if (test_bit(SC_OP_HW_RESET, &sc->sc_flags))  			break;  		status = ath9k_hw_txprocdesc(ah, NULL, (void *)&ts); diff --git a/drivers/net/wireless/ath/carl9170/carl9170.h b/drivers/net/wireless/ath/carl9170/carl9170.h index 0cea20e3e25..376be11161c 100644 --- a/drivers/net/wireless/ath/carl9170/carl9170.h +++ b/drivers/net/wireless/ath/carl9170/carl9170.h @@ -289,6 +289,7 @@ struct ar9170 {  		unsigned int mem_block_size;  		unsigned int rx_size;  		unsigned int tx_seq_table; +		bool ba_filter;  	} fw;  	/* interface configuration combinations */ @@ -425,6 +426,10 @@ struct ar9170 {  	struct sk_buff *rx_failover;  	int rx_failover_missing; +	/* FIFO for collecting outstanding BlockAckRequest */ +	struct list_head bar_list[__AR9170_NUM_TXQ]; +	spinlock_t bar_list_lock[__AR9170_NUM_TXQ]; +  #ifdef CONFIG_CARL9170_WPC  	struct {  		bool pbc_state; @@ -468,6 +473,12 @@ enum carl9170_ps_off_override_reasons {  	PS_OFF_BCN	= BIT(1),  }; +struct carl9170_bar_list_entry { +	struct list_head list; +	struct rcu_head head; +	struct sk_buff *skb; +}; +  struct carl9170_ba_stats {  	u8 ampdu_len;  	u8 ampdu_ack_len; diff --git a/drivers/net/wireless/ath/carl9170/cmd.c b/drivers/net/wireless/ath/carl9170/cmd.c index 195dc653811..39a63874b27 100644 --- a/drivers/net/wireless/ath/carl9170/cmd.c +++ b/drivers/net/wireless/ath/carl9170/cmd.c @@ -138,7 +138,7 @@ int carl9170_reboot(struct ar9170 *ar)  	if (!cmd)  		return -ENOMEM; -	err = __carl9170_exec_cmd(ar, (struct carl9170_cmd *)cmd, true); +	err = __carl9170_exec_cmd(ar, cmd, true);  	return err;  } diff --git a/drivers/net/wireless/ath/carl9170/fw.c b/drivers/net/wireless/ath/carl9170/fw.c index 5c73c03872f..c5ca6f1f583 100644 --- a/drivers/net/wireless/ath/carl9170/fw.c +++ b/drivers/net/wireless/ath/carl9170/fw.c @@ -307,6 +307,9 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)  	if (SUPP(CARL9170FW_WOL))  		device_set_wakeup_enable(&ar->udev->dev, true); +	if (SUPP(CARL9170FW_RX_BA_FILTER)) +		ar->fw.ba_filter = true; +  	if_comb_types = BIT(NL80211_IFTYPE_STATION) |  			BIT(NL80211_IFTYPE_P2P_CLIENT); diff --git a/drivers/net/wireless/ath/carl9170/fwdesc.h b/drivers/net/wireless/ath/carl9170/fwdesc.h index 6d9c0891ce7..66848d47c88 100644 --- a/drivers/net/wireless/ath/carl9170/fwdesc.h +++ b/drivers/net/wireless/ath/carl9170/fwdesc.h @@ -78,6 +78,9 @@ enum carl9170fw_feature_list {  	/* HW (ANI, CCA, MIB) tally counters */  	CARL9170FW_HW_COUNTERS, +	/* Firmware will pass BA when BARs are queued */ +	CARL9170FW_RX_BA_FILTER, +  	/* KEEP LAST */  	__CARL9170FW_FEATURE_NUM  }; diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index 8d2523b3f72..858e58dfc4d 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c @@ -949,6 +949,9 @@ static void carl9170_op_configure_filter(struct ieee80211_hw *hw,  	if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) {  		u32 rx_filter = 0; +		if (!ar->fw.ba_filter) +			rx_filter |= CARL9170_RX_FILTER_CTL_OTHER; +  		if (!(*new_flags & (FIF_FCSFAIL | FIF_PLCPFAIL)))  			rx_filter |= CARL9170_RX_FILTER_BAD; @@ -1753,6 +1756,9 @@ void *carl9170_alloc(size_t priv_size)  	for (i = 0; i < ar->hw->queues; i++) {  		skb_queue_head_init(&ar->tx_status[i]);  		skb_queue_head_init(&ar->tx_pending[i]); + +		INIT_LIST_HEAD(&ar->bar_list[i]); +		spin_lock_init(&ar->bar_list_lock[i]);  	}  	INIT_WORK(&ar->ps_work, carl9170_ps_work);  	INIT_WORK(&ar->ping_work, carl9170_ping_work); diff --git a/drivers/net/wireless/ath/carl9170/rx.c b/drivers/net/wireless/ath/carl9170/rx.c index 84b22eec7ab..6f6a3415566 100644 --- a/drivers/net/wireless/ath/carl9170/rx.c +++ b/drivers/net/wireless/ath/carl9170/rx.c @@ -161,7 +161,7 @@ static void carl9170_cmd_callback(struct ar9170 *ar, u32 len, void *buffer)  void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len)  { -	struct carl9170_rsp *cmd = (void *) buf; +	struct carl9170_rsp *cmd = buf;  	struct ieee80211_vif *vif;  	if (carl9170_check_sequence(ar, cmd->hdr.seq)) @@ -520,7 +520,7 @@ static u8 *carl9170_find_ie(u8 *data, unsigned int len, u8 ie)   */  static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len)  { -	struct ieee80211_hdr *hdr = (void *) data; +	struct ieee80211_hdr *hdr = data;  	struct ieee80211_tim_ie *tim_ie;  	u8 *tim;  	u8 tim_len; @@ -576,6 +576,53 @@ static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len)  	}  } +static void carl9170_ba_check(struct ar9170 *ar, void *data, unsigned int len) +{ +	struct ieee80211_bar *bar = (void *) data; +	struct carl9170_bar_list_entry *entry; +	unsigned int queue; + +	if (likely(!ieee80211_is_back(bar->frame_control))) +		return; + +	if (len <= sizeof(*bar) + FCS_LEN) +		return; + +	queue = TID_TO_WME_AC(((le16_to_cpu(bar->control) & +		IEEE80211_BAR_CTRL_TID_INFO_MASK) >> +		IEEE80211_BAR_CTRL_TID_INFO_SHIFT) & 7); + +	rcu_read_lock(); +	list_for_each_entry_rcu(entry, &ar->bar_list[queue], list) { +		struct sk_buff *entry_skb = entry->skb; +		struct _carl9170_tx_superframe *super = (void *)entry_skb->data; +		struct ieee80211_bar *entry_bar = (void *)super->frame_data; + +#define TID_CHECK(a, b) (						\ +	((a) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK)) ==	\ +	((b) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK)))		\ + +		if (bar->start_seq_num == entry_bar->start_seq_num && +		    TID_CHECK(bar->control, entry_bar->control) && +		    compare_ether_addr(bar->ra, entry_bar->ta) == 0 && +		    compare_ether_addr(bar->ta, entry_bar->ra) == 0) { +			struct ieee80211_tx_info *tx_info; + +			tx_info = IEEE80211_SKB_CB(entry_skb); +			tx_info->flags |= IEEE80211_TX_STAT_ACK; + +			spin_lock_bh(&ar->bar_list_lock[queue]); +			list_del_rcu(&entry->list); +			spin_unlock_bh(&ar->bar_list_lock[queue]); +			kfree_rcu(entry, head); +			break; +		} +	} +	rcu_read_unlock(); + +#undef TID_CHECK +} +  static bool carl9170_ampdu_check(struct ar9170 *ar, u8 *buf, u8 ms)  {  	__le16 fc; @@ -738,6 +785,8 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)  	carl9170_ps_beacon(ar, buf, mpdu_len); +	carl9170_ba_check(ar, buf, mpdu_len); +  	skb = carl9170_rx_copy_data(buf, mpdu_len);  	if (!skb)  		goto drop; diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c index aed305177af..6a8681407a1 100644 --- a/drivers/net/wireless/ath/carl9170/tx.c +++ b/drivers/net/wireless/ath/carl9170/tx.c @@ -277,11 +277,11 @@ static void carl9170_tx_release(struct kref *ref)  		return;  	BUILD_BUG_ON( -	    offsetof(struct ieee80211_tx_info, status.ampdu_ack_len) != 23); +	    offsetof(struct ieee80211_tx_info, status.ack_signal) != 20); -	memset(&txinfo->status.ampdu_ack_len, 0, +	memset(&txinfo->status.ack_signal, 0,  	       sizeof(struct ieee80211_tx_info) - -	       offsetof(struct ieee80211_tx_info, status.ampdu_ack_len)); +	       offsetof(struct ieee80211_tx_info, status.ack_signal));  	if (atomic_read(&ar->tx_total_queued))  		ar->tx_schedule = true; @@ -436,6 +436,45 @@ out_rcu:  	rcu_read_unlock();  } +static void carl9170_tx_bar_status(struct ar9170 *ar, struct sk_buff *skb, +	struct ieee80211_tx_info *tx_info) +{ +	struct _carl9170_tx_superframe *super = (void *) skb->data; +	struct ieee80211_bar *bar = (void *) super->frame_data; + +	/* +	 * Unlike all other frames, the status report for BARs does +	 * not directly come from the hardware as it is incapable of +	 * matching a BA to a previously send BAR. +	 * Instead the RX-path will scan for incoming BAs and set the +	 * IEEE80211_TX_STAT_ACK if it sees one that was likely +	 * caused by a BAR from us. +	 */ + +	if (unlikely(ieee80211_is_back_req(bar->frame_control)) && +	   !(tx_info->flags & IEEE80211_TX_STAT_ACK)) { +		struct carl9170_bar_list_entry *entry; +		int queue = skb_get_queue_mapping(skb); + +		rcu_read_lock(); +		list_for_each_entry_rcu(entry, &ar->bar_list[queue], list) { +			if (entry->skb == skb) { +				spin_lock_bh(&ar->bar_list_lock[queue]); +				list_del_rcu(&entry->list); +				spin_unlock_bh(&ar->bar_list_lock[queue]); +				kfree_rcu(entry, head); +				goto out; +			} +		} + +		WARN(1, "bar not found in %d - ra:%pM ta:%pM c:%x ssn:%x\n", +		       queue, bar->ra, bar->ta, bar->control, +			bar->start_seq_num); +out: +		rcu_read_unlock(); +	} +} +  void carl9170_tx_status(struct ar9170 *ar, struct sk_buff *skb,  			const bool success)  { @@ -445,6 +484,8 @@ void carl9170_tx_status(struct ar9170 *ar, struct sk_buff *skb,  	txinfo = IEEE80211_SKB_CB(skb); +	carl9170_tx_bar_status(ar, skb, txinfo); +  	if (success)  		txinfo->flags |= IEEE80211_TX_STAT_ACK;  	else @@ -1265,6 +1306,26 @@ out_rcu:  	return false;  } +static void carl9170_bar_check(struct ar9170 *ar, struct sk_buff *skb) +{ +	struct _carl9170_tx_superframe *super = (void *) skb->data; +	struct ieee80211_bar *bar = (void *) super->frame_data; + +	if (unlikely(ieee80211_is_back_req(bar->frame_control)) && +	    skb->len >= sizeof(struct ieee80211_bar)) { +		struct carl9170_bar_list_entry *entry; +		unsigned int queue = skb_get_queue_mapping(skb); + +		entry = kmalloc(sizeof(*entry), GFP_ATOMIC); +		if (!WARN_ON_ONCE(!entry)) { +			entry->skb = skb; +			spin_lock_bh(&ar->bar_list_lock[queue]); +			list_add_tail_rcu(&entry->list, &ar->bar_list[queue]); +			spin_unlock_bh(&ar->bar_list_lock[queue]); +		} +	} +} +  static void carl9170_tx(struct ar9170 *ar)  {  	struct sk_buff *skb; @@ -1287,6 +1348,8 @@ static void carl9170_tx(struct ar9170 *ar)  			if (unlikely(carl9170_tx_ps_drop(ar, skb)))  				continue; +			carl9170_bar_check(ar, skb); +  			atomic_inc(&ar->tx_total_pending);  			q = __carl9170_get_queue(ar, i); diff --git a/drivers/net/wireless/ath/carl9170/version.h b/drivers/net/wireless/ath/carl9170/version.h index e651db85634..2ec3e9191e4 100644 --- a/drivers/net/wireless/ath/carl9170/version.h +++ b/drivers/net/wireless/ath/carl9170/version.h @@ -1,7 +1,7 @@  #ifndef __CARL9170_SHARED_VERSION_H  #define __CARL9170_SHARED_VERSION_H -#define CARL9170FW_VERSION_YEAR 11 -#define CARL9170FW_VERSION_MONTH 8 -#define CARL9170FW_VERSION_DAY 15 -#define CARL9170FW_VERSION_GIT "1.9.4" +#define CARL9170FW_VERSION_YEAR 12 +#define CARL9170FW_VERSION_MONTH 7 +#define CARL9170FW_VERSION_DAY 7 +#define CARL9170FW_VERSION_GIT "1.9.6"  #endif /* __CARL9170_SHARED_VERSION_H */ diff --git a/drivers/net/wireless/ath/key.c b/drivers/net/wireless/ath/key.c index 0e81904956c..5c54aa43ca2 100644 --- a/drivers/net/wireless/ath/key.c +++ b/drivers/net/wireless/ath/key.c @@ -556,6 +556,9 @@ int ath_key_config(struct ath_common *common,  		return -EIO;  	set_bit(idx, common->keymap); +	if (key->cipher == WLAN_CIPHER_SUITE_CCMP) +		set_bit(idx, common->ccmp_keymap); +  	if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {  		set_bit(idx + 64, common->keymap);  		set_bit(idx, common->tkip_keymap); @@ -582,6 +585,7 @@ void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key)  		return;  	clear_bit(key->hw_key_idx, common->keymap); +	clear_bit(key->hw_key_idx, common->ccmp_keymap);  	if (key->cipher != WLAN_CIPHER_SUITE_TKIP)  		return;  |