forked from Minki/linux
libertas: Update 11d info only when interface is active
reg_notifier can be called before the interface is up. Handle this correctly by storing the requested country code, then apply the relevant configuration when the interface is brought up. Signed-off-by: Daniel Drake <dsd@laptop.org> Acked-by: Dan Williams <dcbw@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
08a4a1ab07
commit
20d2ebe512
@ -2180,13 +2180,15 @@ int lbs_reg_notifier(struct wiphy *wiphy,
|
||||
struct regulatory_request *request)
|
||||
{
|
||||
struct lbs_private *priv = wiphy_priv(wiphy);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
lbs_deb_enter_args(LBS_DEB_CFG80211, "cfg80211 regulatory domain "
|
||||
"callback for domain %c%c\n", request->alpha2[0],
|
||||
request->alpha2[1]);
|
||||
|
||||
ret = lbs_set_11d_domain_info(priv, request, wiphy->bands);
|
||||
memcpy(priv->country_code, request->alpha2, sizeof(request->alpha2));
|
||||
if (lbs_iface_active(priv))
|
||||
ret = lbs_set_11d_domain_info(priv);
|
||||
|
||||
lbs_deb_leave(LBS_DEB_CFG80211);
|
||||
return ret;
|
||||
|
@ -733,15 +733,13 @@ int lbs_get_rssi(struct lbs_private *priv, s8 *rssi, s8 *nf)
|
||||
* to the firmware
|
||||
*
|
||||
* @priv: pointer to &struct lbs_private
|
||||
* @request: cfg80211 regulatory request structure
|
||||
* @bands: the device's supported bands and channels
|
||||
*
|
||||
* returns: 0 on success, error code on failure
|
||||
*/
|
||||
int lbs_set_11d_domain_info(struct lbs_private *priv,
|
||||
struct regulatory_request *request,
|
||||
struct ieee80211_supported_band **bands)
|
||||
int lbs_set_11d_domain_info(struct lbs_private *priv)
|
||||
{
|
||||
struct wiphy *wiphy = priv->wdev->wiphy;
|
||||
struct ieee80211_supported_band **bands = wiphy->bands;
|
||||
struct cmd_ds_802_11d_domain_info cmd;
|
||||
struct mrvl_ie_domain_param_set *domain = &cmd.domain;
|
||||
struct ieee80211_country_ie_triplet *t;
|
||||
@ -752,21 +750,23 @@ int lbs_set_11d_domain_info(struct lbs_private *priv,
|
||||
u8 first_channel = 0, next_chan = 0, max_pwr = 0;
|
||||
u8 i, flag = 0;
|
||||
size_t triplet_size;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
lbs_deb_enter(LBS_DEB_11D);
|
||||
if (!priv->country_code[0])
|
||||
goto out;
|
||||
|
||||
memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.action = cpu_to_le16(CMD_ACT_SET);
|
||||
|
||||
lbs_deb_11d("Setting country code '%c%c'\n",
|
||||
request->alpha2[0], request->alpha2[1]);
|
||||
priv->country_code[0], priv->country_code[1]);
|
||||
|
||||
domain->header.type = cpu_to_le16(TLV_TYPE_DOMAIN);
|
||||
|
||||
/* Set country code */
|
||||
domain->country_code[0] = request->alpha2[0];
|
||||
domain->country_code[1] = request->alpha2[1];
|
||||
domain->country_code[0] = priv->country_code[0];
|
||||
domain->country_code[1] = priv->country_code[1];
|
||||
domain->country_code[2] = ' ';
|
||||
|
||||
/* Now set up the channel triplets; firmware is somewhat picky here
|
||||
@ -848,6 +848,7 @@ int lbs_set_11d_domain_info(struct lbs_private *priv,
|
||||
|
||||
ret = lbs_cmd_with_response(priv, CMD_802_11D_DOMAIN_INFO, &cmd);
|
||||
|
||||
out:
|
||||
lbs_deb_leave_args(LBS_DEB_11D, "ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -128,9 +128,7 @@ int lbs_set_monitor_mode(struct lbs_private *priv, int enable);
|
||||
|
||||
int lbs_get_rssi(struct lbs_private *priv, s8 *snr, s8 *nf);
|
||||
|
||||
int lbs_set_11d_domain_info(struct lbs_private *priv,
|
||||
struct regulatory_request *request,
|
||||
struct ieee80211_supported_band **bands);
|
||||
int lbs_set_11d_domain_info(struct lbs_private *priv);
|
||||
|
||||
int lbs_get_reg(struct lbs_private *priv, u16 reg, u16 offset, u32 *value);
|
||||
|
||||
|
@ -49,6 +49,7 @@ struct lbs_private {
|
||||
bool wiphy_registered;
|
||||
struct cfg80211_scan_request *scan_req;
|
||||
u8 assoc_bss[ETH_ALEN];
|
||||
u8 country_code[IEEE80211_COUNTRY_STRING_LEN];
|
||||
u8 disassoc_reason;
|
||||
|
||||
/* Mesh */
|
||||
|
@ -152,6 +152,12 @@ int lbs_start_iface(struct lbs_private *priv)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = lbs_set_11d_domain_info(priv);
|
||||
if (ret) {
|
||||
lbs_deb_net("set 11d domain info failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
lbs_update_channel(priv);
|
||||
|
||||
priv->iface_running = true;
|
||||
|
Loading…
Reference in New Issue
Block a user