mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-04 03:33:58 +08:00
Here's a first set of fixes for the 4.5-rc cycle:
* make regulatory messages much less verbose by default * various remain-on-channel fixes * scheduled scanning fixes with hardware restart * a PS-Poll handling fix; was broken just recently * bugfix to avoid buffering non-bufferable MMPDUs * world regulatory domain data fix * a fix for scanning causing other work to get stuck * hwsim: revert an older problematic patch that caused some userspace tools to have issues - not that big a deal as it's a debug only driver though -----BEGIN PGP SIGNATURE----- iQIcBAABCgAGBQJWp05DAAoJEGt7eEactAAdDkkP/0aZQOVRV/TSfn33LiYUoWR7 lYeGptAUITc2y1sWnGspycDDT0aM9/Mdu/A0O0qLZ1Ra60OaIQCmfyV3SlTDna0n k5Jrm7z9wc1IkQWGSLC1FPbpHPjGHkKL1Ux3lU9dJGz3cDreGhfKPcWuRP30fAns c4XbkhYQVtdPQZl6Dz8xv8javwi2mJ9HizeHrTt1uDPh770ai4wLF6vcpLj2/Ear YkPr61ueQS+DfltsBg3ygqasimtdPW+TG8q0oxaX3VA5j9q6zR8e/vAEAUj4X1Yr gQ6e9N/lVHniCuq5csS+XHnh2qDPIHHbm5T6zDhA8f35CRfAXh/Nnbj/AI/wK3ef R88D8FU5NKoliqfFDywtOnYWYvc+NwFQ9HT+aB/QW9O4PYWpiqetL2TX3ieiFi6X LuQ6z7E1fr6DmpUdBnAbdyx4AMkoaalZPCjql5SkZquHBvBuqV9GXrhf4NeGCi4M KQExOFbIXu6fpD5c/QBpcxJwSwfJEs72E9WCiZEtOfGzOEgf4fetVfRL2mpN9lmU hBqFYnvLpwK76hJRk0RcSEL3PuDwC6hpfGWs4ngyKa+anY3/2HaiGcp8k+ZoVuN9 WDgudLKnwSb5WE/kcVQkCmYyQu3nkoSKL5fDWuDauRJ2+TNW4Wnhh2ak2q8Azrzp n15dzktEk/yhkagsNj5C =6M7a -----END PGP SIGNATURE----- Merge tag 'mac80211-for-davem-2016-01-26' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211 Johannes Berg says: ==================== Here's a first set of fixes for the 4.5-rc cycle: * make regulatory messages much less verbose by default * various remain-on-channel fixes * scheduled scanning fixes with hardware restart * a PS-Poll handling fix; was broken just recently * bugfix to avoid buffering non-bufferable MMPDUs * world regulatory domain data fix * a fix for scanning causing other work to get stuck * hwsim: revert an older problematic patch that caused some userspace tools to have issues - not that big a deal as it's a debug only driver though ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
bd7c5e3155
@ -991,7 +991,8 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
|
|||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER, ETH_ALEN, hdr->addr2))
|
if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER,
|
||||||
|
ETH_ALEN, data->addresses[1].addr))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
/* We get the skb->data */
|
/* We get the skb->data */
|
||||||
@ -2736,7 +2737,7 @@ static struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(const u8 *addr)
|
|||||||
|
|
||||||
spin_lock_bh(&hwsim_radio_lock);
|
spin_lock_bh(&hwsim_radio_lock);
|
||||||
list_for_each_entry(data, &hwsim_radios, list) {
|
list_for_each_entry(data, &hwsim_radios, list) {
|
||||||
if (mac80211_hwsim_addr_match(data, addr)) {
|
if (memcmp(data->addresses[1].addr, addr, ETH_ALEN) == 0) {
|
||||||
_found = true;
|
_found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1733,7 +1733,6 @@ void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
|
|||||||
if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
||||||
continue;
|
continue;
|
||||||
sdata->u.ibss.last_scan_completed = jiffies;
|
sdata->u.ibss.last_scan_completed = jiffies;
|
||||||
ieee80211_queue_work(&local->hw, &sdata->work);
|
|
||||||
}
|
}
|
||||||
mutex_unlock(&local->iflist_mtx);
|
mutex_unlock(&local->iflist_mtx);
|
||||||
}
|
}
|
||||||
|
@ -248,6 +248,7 @@ static void ieee80211_restart_work(struct work_struct *work)
|
|||||||
|
|
||||||
/* wait for scan work complete */
|
/* wait for scan work complete */
|
||||||
flush_workqueue(local->workqueue);
|
flush_workqueue(local->workqueue);
|
||||||
|
flush_work(&local->sched_scan_stopped_work);
|
||||||
|
|
||||||
WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
|
WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
|
||||||
"%s called with hardware scan in progress\n", __func__);
|
"%s called with hardware scan in progress\n", __func__);
|
||||||
@ -256,6 +257,11 @@ static void ieee80211_restart_work(struct work_struct *work)
|
|||||||
list_for_each_entry(sdata, &local->interfaces, list)
|
list_for_each_entry(sdata, &local->interfaces, list)
|
||||||
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
|
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
|
||||||
ieee80211_scan_cancel(local);
|
ieee80211_scan_cancel(local);
|
||||||
|
|
||||||
|
/* make sure any new ROC will consider local->in_reconfig */
|
||||||
|
flush_delayed_work(&local->roc_work);
|
||||||
|
flush_work(&local->hw_roc_done);
|
||||||
|
|
||||||
ieee80211_reconfig(local);
|
ieee80211_reconfig(local);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
|
@ -1370,17 +1370,6 @@ out:
|
|||||||
sdata_unlock(sdata);
|
sdata_unlock(sdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local)
|
|
||||||
{
|
|
||||||
struct ieee80211_sub_if_data *sdata;
|
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
list_for_each_entry_rcu(sdata, &local->interfaces, list)
|
|
||||||
if (ieee80211_vif_is_mesh(&sdata->vif) &&
|
|
||||||
ieee80211_sdata_running(sdata))
|
|
||||||
ieee80211_queue_work(&local->hw, &sdata->work);
|
|
||||||
rcu_read_unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
|
void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
|
@ -362,14 +362,10 @@ static inline bool mesh_path_sel_is_hwmp(struct ieee80211_sub_if_data *sdata)
|
|||||||
return sdata->u.mesh.mesh_pp_id == IEEE80211_PATH_PROTOCOL_HWMP;
|
return sdata->u.mesh.mesh_pp_id == IEEE80211_PATH_PROTOCOL_HWMP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local);
|
|
||||||
|
|
||||||
void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata);
|
void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata);
|
||||||
void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata);
|
void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata);
|
||||||
void ieee80211s_stop(void);
|
void ieee80211s_stop(void);
|
||||||
#else
|
#else
|
||||||
static inline void
|
|
||||||
ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) {}
|
|
||||||
static inline bool mesh_path_sel_is_hwmp(struct ieee80211_sub_if_data *sdata)
|
static inline bool mesh_path_sel_is_hwmp(struct ieee80211_sub_if_data *sdata)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
static inline void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata)
|
static inline void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata)
|
||||||
|
@ -4005,8 +4005,6 @@ static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
|
|||||||
if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
||||||
ieee80211_queue_work(&sdata->local->hw,
|
ieee80211_queue_work(&sdata->local->hw,
|
||||||
&sdata->u.mgd.monitor_work);
|
&sdata->u.mgd.monitor_work);
|
||||||
/* and do all the other regular work too */
|
|
||||||
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,14 +252,11 @@ static bool ieee80211_recalc_sw_work(struct ieee80211_local *local,
|
|||||||
static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc,
|
static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc,
|
||||||
unsigned long start_time)
|
unsigned long start_time)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = roc->sdata->local;
|
|
||||||
|
|
||||||
if (WARN_ON(roc->notified))
|
if (WARN_ON(roc->notified))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
roc->start_time = start_time;
|
roc->start_time = start_time;
|
||||||
roc->started = true;
|
roc->started = true;
|
||||||
roc->hw_begun = true;
|
|
||||||
|
|
||||||
if (roc->mgmt_tx_cookie) {
|
if (roc->mgmt_tx_cookie) {
|
||||||
if (!WARN_ON(!roc->frame)) {
|
if (!WARN_ON(!roc->frame)) {
|
||||||
@ -274,9 +271,6 @@ static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
roc->notified = true;
|
roc->notified = true;
|
||||||
|
|
||||||
if (!local->ops->remain_on_channel)
|
|
||||||
ieee80211_recalc_sw_work(local, start_time);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ieee80211_hw_roc_start(struct work_struct *work)
|
static void ieee80211_hw_roc_start(struct work_struct *work)
|
||||||
@ -291,6 +285,7 @@ static void ieee80211_hw_roc_start(struct work_struct *work)
|
|||||||
if (!roc->started)
|
if (!roc->started)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
roc->hw_begun = true;
|
||||||
ieee80211_handle_roc_started(roc, local->hw_roc_start_time);
|
ieee80211_handle_roc_started(roc, local->hw_roc_start_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -413,6 +408,10 @@ void ieee80211_start_next_roc(struct ieee80211_local *local)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* defer roc if driver is not started (i.e. during reconfig) */
|
||||||
|
if (local->in_reconfig)
|
||||||
|
return;
|
||||||
|
|
||||||
roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work,
|
roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work,
|
||||||
list);
|
list);
|
||||||
|
|
||||||
@ -534,8 +533,10 @@ ieee80211_coalesce_hw_started_roc(struct ieee80211_local *local,
|
|||||||
* begin, otherwise they'll both be marked properly by the work
|
* begin, otherwise they'll both be marked properly by the work
|
||||||
* struct that runs once the driver notifies us of the beginning
|
* struct that runs once the driver notifies us of the beginning
|
||||||
*/
|
*/
|
||||||
if (cur_roc->hw_begun)
|
if (cur_roc->hw_begun) {
|
||||||
|
new_roc->hw_begun = true;
|
||||||
ieee80211_handle_roc_started(new_roc, now);
|
ieee80211_handle_roc_started(new_roc, now);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -658,6 +659,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
|||||||
queued = true;
|
queued = true;
|
||||||
roc->on_channel = tmp->on_channel;
|
roc->on_channel = tmp->on_channel;
|
||||||
ieee80211_handle_roc_started(roc, now);
|
ieee80211_handle_roc_started(roc, now);
|
||||||
|
ieee80211_recalc_sw_work(local, now);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,6 +314,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
|
|||||||
bool was_scanning = local->scanning;
|
bool was_scanning = local->scanning;
|
||||||
struct cfg80211_scan_request *scan_req;
|
struct cfg80211_scan_request *scan_req;
|
||||||
struct ieee80211_sub_if_data *scan_sdata;
|
struct ieee80211_sub_if_data *scan_sdata;
|
||||||
|
struct ieee80211_sub_if_data *sdata;
|
||||||
|
|
||||||
lockdep_assert_held(&local->mtx);
|
lockdep_assert_held(&local->mtx);
|
||||||
|
|
||||||
@ -373,7 +374,16 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
|
|||||||
|
|
||||||
ieee80211_mlme_notify_scan_completed(local);
|
ieee80211_mlme_notify_scan_completed(local);
|
||||||
ieee80211_ibss_notify_scan_completed(local);
|
ieee80211_ibss_notify_scan_completed(local);
|
||||||
ieee80211_mesh_notify_scan_completed(local);
|
|
||||||
|
/* Requeue all the work that might have been ignored while
|
||||||
|
* the scan was in progress; if there was none this will
|
||||||
|
* just be a no-op for the particular interface.
|
||||||
|
*/
|
||||||
|
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||||
|
if (ieee80211_sdata_running(sdata))
|
||||||
|
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
||||||
|
}
|
||||||
|
|
||||||
if (was_scanning)
|
if (was_scanning)
|
||||||
ieee80211_start_next_roc(local);
|
ieee80211_start_next_roc(local);
|
||||||
}
|
}
|
||||||
@ -1213,6 +1223,14 @@ void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
|
|||||||
|
|
||||||
trace_api_sched_scan_stopped(local);
|
trace_api_sched_scan_stopped(local);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this shouldn't really happen, so for simplicity
|
||||||
|
* simply ignore it, and let mac80211 reconfigure
|
||||||
|
* the sched scan later on.
|
||||||
|
*/
|
||||||
|
if (local->in_reconfig)
|
||||||
|
return;
|
||||||
|
|
||||||
schedule_work(&local->sched_scan_stopped_work);
|
schedule_work(&local->sched_scan_stopped_work);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_sched_scan_stopped);
|
EXPORT_SYMBOL(ieee80211_sched_scan_stopped);
|
||||||
|
@ -1453,7 +1453,7 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
|
|||||||
|
|
||||||
more_data = ieee80211_sta_ps_more_data(sta, ignored_acs, reason, driver_release_tids);
|
more_data = ieee80211_sta_ps_more_data(sta, ignored_acs, reason, driver_release_tids);
|
||||||
|
|
||||||
if (reason == IEEE80211_FRAME_RELEASE_PSPOLL)
|
if (driver_release_tids && reason == IEEE80211_FRAME_RELEASE_PSPOLL)
|
||||||
driver_release_tids =
|
driver_release_tids =
|
||||||
BIT(find_highest_prio_tid(driver_release_tids));
|
BIT(find_highest_prio_tid(driver_release_tids));
|
||||||
|
|
||||||
|
@ -51,6 +51,11 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
|
|||||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||||
int ac;
|
int ac;
|
||||||
|
|
||||||
|
if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER) {
|
||||||
|
ieee80211_free_txskb(&local->hw, skb);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This skb 'survived' a round-trip through the driver, and
|
* This skb 'survived' a round-trip through the driver, and
|
||||||
* hopefully the driver didn't mangle it too badly. However,
|
* hopefully the driver didn't mangle it too badly. However,
|
||||||
|
@ -2043,16 +2043,26 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||||||
*/
|
*/
|
||||||
if (sched_scan_req->n_scan_plans > 1 ||
|
if (sched_scan_req->n_scan_plans > 1 ||
|
||||||
__ieee80211_request_sched_scan_start(sched_scan_sdata,
|
__ieee80211_request_sched_scan_start(sched_scan_sdata,
|
||||||
sched_scan_req))
|
sched_scan_req)) {
|
||||||
|
RCU_INIT_POINTER(local->sched_scan_sdata, NULL);
|
||||||
|
RCU_INIT_POINTER(local->sched_scan_req, NULL);
|
||||||
sched_scan_stopped = true;
|
sched_scan_stopped = true;
|
||||||
|
}
|
||||||
mutex_unlock(&local->mtx);
|
mutex_unlock(&local->mtx);
|
||||||
|
|
||||||
if (sched_scan_stopped)
|
if (sched_scan_stopped)
|
||||||
cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy);
|
cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy);
|
||||||
|
|
||||||
wake_up:
|
wake_up:
|
||||||
local->in_reconfig = false;
|
if (local->in_reconfig) {
|
||||||
barrier();
|
local->in_reconfig = false;
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
/* Restart deferred ROCs */
|
||||||
|
mutex_lock(&local->mtx);
|
||||||
|
ieee80211_start_next_roc(local);
|
||||||
|
mutex_unlock(&local->mtx);
|
||||||
|
}
|
||||||
|
|
||||||
if (local->monitors == local->open_count && local->monitors > 0)
|
if (local->monitors == local->open_count && local->monitors > 0)
|
||||||
ieee80211_add_virtual_monitor(local);
|
ieee80211_add_virtual_monitor(local);
|
||||||
|
@ -1095,17 +1095,6 @@ static unsigned int rfkill_fop_poll(struct file *file, poll_table *wait)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rfkill_readable(struct rfkill_data *data)
|
|
||||||
{
|
|
||||||
bool r;
|
|
||||||
|
|
||||||
mutex_lock(&data->mtx);
|
|
||||||
r = !list_empty(&data->events);
|
|
||||||
mutex_unlock(&data->mtx);
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t rfkill_fop_read(struct file *file, char __user *buf,
|
static ssize_t rfkill_fop_read(struct file *file, char __user *buf,
|
||||||
size_t count, loff_t *pos)
|
size_t count, loff_t *pos)
|
||||||
{
|
{
|
||||||
@ -1122,8 +1111,11 @@ static ssize_t rfkill_fop_read(struct file *file, char __user *buf,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
mutex_unlock(&data->mtx);
|
mutex_unlock(&data->mtx);
|
||||||
|
/* since we re-check and it just compares pointers,
|
||||||
|
* using !list_empty() without locking isn't a problem
|
||||||
|
*/
|
||||||
ret = wait_event_interruptible(data->read_wait,
|
ret = wait_event_interruptible(data->read_wait,
|
||||||
rfkill_readable(data));
|
!list_empty(&data->events));
|
||||||
mutex_lock(&data->mtx);
|
mutex_lock(&data->mtx);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -231,20 +231,22 @@ static const struct ieee80211_regdomain world_regdom = {
|
|||||||
/* IEEE 802.11b/g, channels 1..11 */
|
/* IEEE 802.11b/g, channels 1..11 */
|
||||||
REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
|
REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
|
||||||
/* IEEE 802.11b/g, channels 12..13. */
|
/* IEEE 802.11b/g, channels 12..13. */
|
||||||
REG_RULE(2467-10, 2472+10, 40, 6, 20,
|
REG_RULE(2467-10, 2472+10, 20, 6, 20,
|
||||||
NL80211_RRF_NO_IR),
|
NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),
|
||||||
/* IEEE 802.11 channel 14 - Only JP enables
|
/* IEEE 802.11 channel 14 - Only JP enables
|
||||||
* this and for 802.11b only */
|
* this and for 802.11b only */
|
||||||
REG_RULE(2484-10, 2484+10, 20, 6, 20,
|
REG_RULE(2484-10, 2484+10, 20, 6, 20,
|
||||||
NL80211_RRF_NO_IR |
|
NL80211_RRF_NO_IR |
|
||||||
NL80211_RRF_NO_OFDM),
|
NL80211_RRF_NO_OFDM),
|
||||||
/* IEEE 802.11a, channel 36..48 */
|
/* IEEE 802.11a, channel 36..48 */
|
||||||
REG_RULE(5180-10, 5240+10, 160, 6, 20,
|
REG_RULE(5180-10, 5240+10, 80, 6, 20,
|
||||||
NL80211_RRF_NO_IR),
|
NL80211_RRF_NO_IR |
|
||||||
|
NL80211_RRF_AUTO_BW),
|
||||||
|
|
||||||
/* IEEE 802.11a, channel 52..64 - DFS required */
|
/* IEEE 802.11a, channel 52..64 - DFS required */
|
||||||
REG_RULE(5260-10, 5320+10, 160, 6, 20,
|
REG_RULE(5260-10, 5320+10, 80, 6, 20,
|
||||||
NL80211_RRF_NO_IR |
|
NL80211_RRF_NO_IR |
|
||||||
|
NL80211_RRF_AUTO_BW |
|
||||||
NL80211_RRF_DFS),
|
NL80211_RRF_DFS),
|
||||||
|
|
||||||
/* IEEE 802.11a, channel 100..144 - DFS required */
|
/* IEEE 802.11a, channel 100..144 - DFS required */
|
||||||
@ -2745,7 +2747,7 @@ static void print_rd_rules(const struct ieee80211_regdomain *rd)
|
|||||||
const struct ieee80211_power_rule *power_rule = NULL;
|
const struct ieee80211_power_rule *power_rule = NULL;
|
||||||
char bw[32], cac_time[32];
|
char bw[32], cac_time[32];
|
||||||
|
|
||||||
pr_info(" (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
|
pr_debug(" (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
|
||||||
|
|
||||||
for (i = 0; i < rd->n_reg_rules; i++) {
|
for (i = 0; i < rd->n_reg_rules; i++) {
|
||||||
reg_rule = &rd->reg_rules[i];
|
reg_rule = &rd->reg_rules[i];
|
||||||
@ -2772,7 +2774,7 @@ static void print_rd_rules(const struct ieee80211_regdomain *rd)
|
|||||||
* in certain regions
|
* in certain regions
|
||||||
*/
|
*/
|
||||||
if (power_rule->max_antenna_gain)
|
if (power_rule->max_antenna_gain)
|
||||||
pr_info(" (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
|
pr_debug(" (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
|
||||||
freq_range->start_freq_khz,
|
freq_range->start_freq_khz,
|
||||||
freq_range->end_freq_khz,
|
freq_range->end_freq_khz,
|
||||||
bw,
|
bw,
|
||||||
@ -2780,7 +2782,7 @@ static void print_rd_rules(const struct ieee80211_regdomain *rd)
|
|||||||
power_rule->max_eirp,
|
power_rule->max_eirp,
|
||||||
cac_time);
|
cac_time);
|
||||||
else
|
else
|
||||||
pr_info(" (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
|
pr_debug(" (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
|
||||||
freq_range->start_freq_khz,
|
freq_range->start_freq_khz,
|
||||||
freq_range->end_freq_khz,
|
freq_range->end_freq_khz,
|
||||||
bw,
|
bw,
|
||||||
@ -2813,35 +2815,35 @@ static void print_regdomain(const struct ieee80211_regdomain *rd)
|
|||||||
struct cfg80211_registered_device *rdev;
|
struct cfg80211_registered_device *rdev;
|
||||||
rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
|
rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
|
||||||
if (rdev) {
|
if (rdev) {
|
||||||
pr_info("Current regulatory domain updated by AP to: %c%c\n",
|
pr_debug("Current regulatory domain updated by AP to: %c%c\n",
|
||||||
rdev->country_ie_alpha2[0],
|
rdev->country_ie_alpha2[0],
|
||||||
rdev->country_ie_alpha2[1]);
|
rdev->country_ie_alpha2[1]);
|
||||||
} else
|
} else
|
||||||
pr_info("Current regulatory domain intersected:\n");
|
pr_debug("Current regulatory domain intersected:\n");
|
||||||
} else
|
} else
|
||||||
pr_info("Current regulatory domain intersected:\n");
|
pr_debug("Current regulatory domain intersected:\n");
|
||||||
} else if (is_world_regdom(rd->alpha2)) {
|
} else if (is_world_regdom(rd->alpha2)) {
|
||||||
pr_info("World regulatory domain updated:\n");
|
pr_debug("World regulatory domain updated:\n");
|
||||||
} else {
|
} else {
|
||||||
if (is_unknown_alpha2(rd->alpha2))
|
if (is_unknown_alpha2(rd->alpha2))
|
||||||
pr_info("Regulatory domain changed to driver built-in settings (unknown country)\n");
|
pr_debug("Regulatory domain changed to driver built-in settings (unknown country)\n");
|
||||||
else {
|
else {
|
||||||
if (reg_request_cell_base(lr))
|
if (reg_request_cell_base(lr))
|
||||||
pr_info("Regulatory domain changed to country: %c%c by Cell Station\n",
|
pr_debug("Regulatory domain changed to country: %c%c by Cell Station\n",
|
||||||
rd->alpha2[0], rd->alpha2[1]);
|
rd->alpha2[0], rd->alpha2[1]);
|
||||||
else
|
else
|
||||||
pr_info("Regulatory domain changed to country: %c%c\n",
|
pr_debug("Regulatory domain changed to country: %c%c\n",
|
||||||
rd->alpha2[0], rd->alpha2[1]);
|
rd->alpha2[0], rd->alpha2[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_info(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
|
pr_debug(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
|
||||||
print_rd_rules(rd);
|
print_rd_rules(rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_regdomain_info(const struct ieee80211_regdomain *rd)
|
static void print_regdomain_info(const struct ieee80211_regdomain *rd)
|
||||||
{
|
{
|
||||||
pr_info("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
|
pr_debug("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
|
||||||
print_rd_rules(rd);
|
print_rd_rules(rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2862,7 +2864,8 @@ static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
|
|||||||
return -EALREADY;
|
return -EALREADY;
|
||||||
|
|
||||||
if (!is_valid_rd(rd)) {
|
if (!is_valid_rd(rd)) {
|
||||||
pr_err("Invalid regulatory domain detected:\n");
|
pr_err("Invalid regulatory domain detected: %c%c\n",
|
||||||
|
rd->alpha2[0], rd->alpha2[1]);
|
||||||
print_regdomain_info(rd);
|
print_regdomain_info(rd);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -2898,7 +2901,8 @@ static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
|
|||||||
return -EALREADY;
|
return -EALREADY;
|
||||||
|
|
||||||
if (!is_valid_rd(rd)) {
|
if (!is_valid_rd(rd)) {
|
||||||
pr_err("Invalid regulatory domain detected:\n");
|
pr_err("Invalid regulatory domain detected: %c%c\n",
|
||||||
|
rd->alpha2[0], rd->alpha2[1]);
|
||||||
print_regdomain_info(rd);
|
print_regdomain_info(rd);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -2956,7 +2960,8 @@ static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (!is_valid_rd(rd)) {
|
if (!is_valid_rd(rd)) {
|
||||||
pr_err("Invalid regulatory domain detected:\n");
|
pr_err("Invalid regulatory domain detected: %c%c\n",
|
||||||
|
rd->alpha2[0], rd->alpha2[1]);
|
||||||
print_regdomain_info(rd);
|
print_regdomain_info(rd);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user