|
@@ -3175,10 +3175,21 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
|
|
{
|
|
|
struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
|
|
|
struct ath6kl *ar = ath6kl_priv(vif->ndev);
|
|
|
- u32 id;
|
|
|
+ u32 id, freq;
|
|
|
const struct ieee80211_mgmt *mgmt;
|
|
|
bool more_data, queued;
|
|
|
|
|
|
+ /* default to the current channel, but use the one specified as argument
|
|
|
+ * if any
|
|
|
+ */
|
|
|
+ freq = vif->ch_hint;
|
|
|
+ if (chan)
|
|
|
+ freq = chan->center_freq;
|
|
|
+
|
|
|
+ /* never send freq zero to the firmware */
|
|
|
+ if (WARN_ON(freq == 0))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
mgmt = (const struct ieee80211_mgmt *) buf;
|
|
|
if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) &&
|
|
|
ieee80211_is_probe_resp(mgmt->frame_control) &&
|
|
@@ -3188,8 +3199,7 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
|
|
* command to allow the target to fill in the generic IEs.
|
|
|
*/
|
|
|
*cookie = 0; /* TX status not supported */
|
|
|
- return ath6kl_send_go_probe_resp(vif, buf, len,
|
|
|
- chan->center_freq);
|
|
|
+ return ath6kl_send_go_probe_resp(vif, buf, len, freq);
|
|
|
}
|
|
|
|
|
|
id = vif->send_action_id++;
|
|
@@ -3205,17 +3215,14 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
|
|
|
|
|
/* AP mode Power saving processing */
|
|
|
if (vif->nw_type == AP_NETWORK) {
|
|
|
- queued = ath6kl_mgmt_powersave_ap(vif,
|
|
|
- id, chan->center_freq,
|
|
|
- wait, buf,
|
|
|
- len, &more_data, no_cck);
|
|
|
+ queued = ath6kl_mgmt_powersave_ap(vif, id, freq, wait, buf, len,
|
|
|
+ &more_data, no_cck);
|
|
|
if (queued)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id,
|
|
|
- chan->center_freq, wait,
|
|
|
- buf, len, no_cck);
|
|
|
+ return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id, freq,
|
|
|
+ wait, buf, len, no_cck);
|
|
|
}
|
|
|
|
|
|
static void ath6kl_mgmt_frame_register(struct wiphy *wiphy,
|