Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
518aa1b5
Commit
518aa1b5
authored
Jan 20, 2009
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
parents
66f9a259
67474303
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
170 additions
and
67 deletions
+170
-67
drivers/net/wireless/ath9k/rc.c
drivers/net/wireless/ath9k/rc.c
+1
-1
drivers/net/wireless/ath9k/regd_common.h
drivers/net/wireless/ath9k/regd_common.h
+1
-1
drivers/net/wireless/iwlwifi/iwl-hcmd.c
drivers/net/wireless/iwlwifi/iwl-hcmd.c
+1
-1
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
+1
-1
drivers/net/wireless/libertas/hostcmd.h
drivers/net/wireless/libertas/hostcmd.h
+45
-46
drivers/net/wireless/p54/p54common.c
drivers/net/wireless/p54/p54common.c
+3
-3
drivers/net/wireless/rt2x00/rt2x00rfkill.c
drivers/net/wireless/rt2x00/rt2x00rfkill.c
+1
-1
include/net/mac80211.h
include/net/mac80211.h
+0
-1
net/mac80211/sta_info.h
net/mac80211/sta_info.h
+0
-1
net/wireless/reg.c
net/wireless/reg.c
+117
-11
No files found.
drivers/net/wireless/ath9k/rc.c
View file @
518aa1b5
...
...
@@ -490,7 +490,7 @@ static inline int ath_rc_get_nextvalid_txrate(struct ath_rate_table *rate_table,
static
int
ath_rc_valid_phyrate
(
u32
phy
,
u32
capflag
,
int
ignore_cw
)
{
if
(
WLAN_RC_PHY_HT
(
phy
)
&
!
(
capflag
&
WLAN_RC_HT_FLAG
))
if
(
WLAN_RC_PHY_HT
(
phy
)
&
&
!
(
capflag
&
WLAN_RC_HT_FLAG
))
return
0
;
if
(
WLAN_RC_PHY_DS
(
phy
)
&&
!
(
capflag
&
WLAN_RC_DS_FLAG
))
return
0
;
...
...
drivers/net/wireless/ath9k/regd_common.h
View file @
518aa1b5
...
...
@@ -228,7 +228,7 @@ enum {
};
#define REG_DOMAIN_2GHZ_MASK (REQ_MASK & \
(
!
(ADHOC_NO_11A | DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB)))
(
~
(ADHOC_NO_11A | DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB)))
#define REG_DOMAIN_5GHZ_MASK REQ_MASK
static
struct
reg_dmn_pair_mapping
regDomainPairs
[]
=
{
...
...
drivers/net/wireless/iwlwifi/iwl-hcmd.c
View file @
518aa1b5
...
...
@@ -224,7 +224,7 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
IWL_ERROR
(
"Error: Response NULL in '%s'
\n
"
,
get_cmd_string
(
cmd
->
id
));
ret
=
-
EIO
;
goto
out
;
goto
cancel
;
}
ret
=
0
;
...
...
drivers/net/wireless/iwlwifi/iwl3945-base.c
View file @
518aa1b5
...
...
@@ -745,7 +745,7 @@ static int iwl3945_send_cmd_sync(struct iwl3945_priv *priv, struct iwl3945_host_
IWL_ERROR
(
"Error: Response NULL in '%s'
\n
"
,
get_cmd_string
(
cmd
->
id
));
ret
=
-
EIO
;
goto
out
;
goto
cancel
;
}
ret
=
0
;
...
...
drivers/net/wireless/libertas/hostcmd.h
View file @
518aa1b5
...
...
@@ -32,7 +32,7 @@ struct txpd {
u8
pktdelay_2ms
;
/* reserved */
u8
reserved1
;
};
}
__attribute__
((
packed
))
;
/* RxPD Descriptor */
struct
rxpd
{
...
...
@@ -63,7 +63,7 @@ struct rxpd {
/* Pkt Priority */
u8
priority
;
u8
reserved
[
3
];
};
}
__attribute__
((
packed
))
;
struct
cmd_header
{
__le16
command
;
...
...
@@ -97,7 +97,7 @@ struct enc_key {
struct
lbs_offset_value
{
u32
offset
;
u32
value
;
};
}
__attribute__
((
packed
))
;
/* Define general data structure */
/* cmd_DS_GEN */
...
...
@@ -107,7 +107,7 @@ struct cmd_ds_gen {
__le16
seqnum
;
__le16
result
;
void
*
cmdresp
[
0
];
};
}
__attribute__
((
packed
))
;
#define S_DS_GEN sizeof(struct cmd_ds_gen)
...
...
@@ -163,7 +163,7 @@ struct cmd_ds_802_11_subscribe_event {
* bump this up a bit.
*/
uint8_t
tlv
[
128
];
};
}
__attribute__
((
packed
))
;
/*
* This scan handle Country Information IE(802.11d compliant)
...
...
@@ -180,7 +180,7 @@ struct cmd_ds_802_11_scan {
mrvlietypes_chanlistparamset_t ChanListParamSet;
mrvlietypes_ratesparamset_t OpRateSet;
#endif
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_scan_rsp
{
struct
cmd_header
hdr
;
...
...
@@ -188,7 +188,7 @@ struct cmd_ds_802_11_scan_rsp {
__le16
bssdescriptsize
;
uint8_t
nr_sets
;
uint8_t
bssdesc_and_tlvbuffer
[
0
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_get_log
{
struct
cmd_header
hdr
;
...
...
@@ -206,33 +206,33 @@ struct cmd_ds_802_11_get_log {
__le32
fcserror
;
__le32
txframe
;
__le32
wepundecryptable
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_mac_control
{
struct
cmd_header
hdr
;
__le16
action
;
u16
reserved
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_mac_multicast_adr
{
struct
cmd_header
hdr
;
__le16
action
;
__le16
nr_of_adrs
;
u8
maclist
[
ETH_ALEN
*
MRVDRV_MAX_MULTICAST_LIST_SIZE
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_authenticate
{
u8
macaddr
[
ETH_ALEN
];
u8
authtype
;
u8
reserved
[
10
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_deauthenticate
{
struct
cmd_header
hdr
;
u8
macaddr
[
ETH_ALEN
];
__le16
reasoncode
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_associate
{
u8
peerstaaddr
[
6
];
...
...
@@ -251,7 +251,7 @@ struct cmd_ds_802_11_associate {
struct
cmd_ds_802_11_associate_rsp
{
struct
ieeetypes_assocrsp
assocRsp
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_set_wep
{
struct
cmd_header
hdr
;
...
...
@@ -265,7 +265,7 @@ struct cmd_ds_802_11_set_wep {
/* 40, 128bit or TXWEP */
uint8_t
keytype
[
4
];
uint8_t
keymaterial
[
4
][
16
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_3_get_stat
{
__le32
xmitok
;
...
...
@@ -274,7 +274,7 @@ struct cmd_ds_802_3_get_stat {
__le32
rcverror
;
__le32
rcvnobuffer
;
__le32
rcvcrcerror
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_get_stat
{
__le32
txfragmentcnt
;
...
...
@@ -294,7 +294,7 @@ struct cmd_ds_802_11_get_stat {
__le32
txbeacon
;
__le32
rxbeacon
;
__le32
wepundecryptable
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_snmp_mib
{
struct
cmd_header
hdr
;
...
...
@@ -303,58 +303,58 @@ struct cmd_ds_802_11_snmp_mib {
__le16
oid
;
__le16
bufsize
;
u8
value
[
128
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_mac_reg_map
{
__le16
buffersize
;
u8
regmap
[
128
];
__le16
reserved
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_bbp_reg_map
{
__le16
buffersize
;
u8
regmap
[
128
];
__le16
reserved
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_rf_reg_map
{
__le16
buffersize
;
u8
regmap
[
64
];
__le16
reserved
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_mac_reg_access
{
__le16
action
;
__le16
offset
;
__le32
value
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_bbp_reg_access
{
__le16
action
;
__le16
offset
;
u8
value
;
u8
reserved
[
3
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_rf_reg_access
{
__le16
action
;
__le16
offset
;
u8
value
;
u8
reserved
[
3
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_radio_control
{
struct
cmd_header
hdr
;
__le16
action
;
__le16
control
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_beacon_control
{
__le16
action
;
__le16
beacon_enable
;
__le16
beacon_period
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_sleep_params
{
struct
cmd_header
hdr
;
...
...
@@ -379,7 +379,7 @@ struct cmd_ds_802_11_sleep_params {
/* reserved field, should be set to zero */
__le16
reserved
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_inactivity_timeout
{
struct
cmd_header
hdr
;
...
...
@@ -389,7 +389,7 @@ struct cmd_ds_802_11_inactivity_timeout {
/* Inactivity timeout in msec */
__le16
timeout
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_rf_channel
{
struct
cmd_header
hdr
;
...
...
@@ -399,7 +399,7 @@ struct cmd_ds_802_11_rf_channel {
__le16
rftype
;
/* unused */
__le16
reserved
;
/* unused */
u8
channellist
[
32
];
/* unused */
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_rssi
{
/* weighting factor */
...
...
@@ -408,21 +408,21 @@ struct cmd_ds_802_11_rssi {
__le16
reserved_0
;
__le16
reserved_1
;
__le16
reserved_2
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_rssi_rsp
{
__le16
SNR
;
__le16
noisefloor
;
__le16
avgSNR
;
__le16
avgnoisefloor
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_mac_address
{
struct
cmd_header
hdr
;
__le16
action
;
u8
macadd
[
ETH_ALEN
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_rf_tx_power
{
struct
cmd_header
hdr
;
...
...
@@ -431,7 +431,7 @@ struct cmd_ds_802_11_rf_tx_power {
__le16
curlevel
;
s8
maxlevel
;
s8
minlevel
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_rf_antenna
{
__le16
action
;
...
...
@@ -439,33 +439,33 @@ struct cmd_ds_802_11_rf_antenna {
/* Number of antennas or 0xffff(diversity) */
__le16
antennamode
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_monitor_mode
{
__le16
action
;
__le16
mode
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_set_boot2_ver
{
struct
cmd_header
hdr
;
__le16
action
;
__le16
version
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_fw_wake_method
{
struct
cmd_header
hdr
;
__le16
action
;
__le16
method
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_sleep_period
{
struct
cmd_header
hdr
;
__le16
action
;
__le16
period
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_ps_mode
{
__le16
action
;
...
...
@@ -473,7 +473,7 @@ struct cmd_ds_802_11_ps_mode {
__le16
multipledtim
;
__le16
reserved
;
__le16
locallisteninterval
;
};
}
__attribute__
((
packed
))
;
struct
cmd_confirm_sleep
{
struct
cmd_header
hdr
;
...
...
@@ -483,7 +483,7 @@ struct cmd_confirm_sleep {
__le16
multipledtim
;
__le16
reserved
;
__le16
locallisteninterval
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_data_rate
{
struct
cmd_header
hdr
;
...
...
@@ -491,14 +491,14 @@ struct cmd_ds_802_11_data_rate {
__le16
action
;
__le16
reserved
;
u8
rates
[
MAX_RATES
];
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_rate_adapt_rateset
{
struct
cmd_header
hdr
;
__le16
action
;
__le16
enablehwauto
;
__le16
bitmap
;
};
}
__attribute__
((
packed
))
;
struct
cmd_ds_802_11_ad_hoc_start
{
struct
cmd_header
hdr
;
...
...
@@ -520,7 +520,7 @@ struct cmd_ds_802_11_ad_hoc_result {
u8
pad
[
3
];
u8
bssid
[
ETH_ALEN
];
};
}
__attribute__
((
packed
))
;
struct
adhoc_bssdesc
{
u8
bssid
[
ETH_ALEN
];
...
...
@@ -578,7 +578,7 @@ struct MrvlIEtype_keyParamSet {
/* key material of size keylen */
u8
key
[
32
];
};
}
__attribute__
((
packed
))
;
#define MAX_WOL_RULES 16
...
...
@@ -590,7 +590,7 @@ struct host_wol_rule {
__le16
reserve
;
__be32
sig_mask
;
__be32
signature
;
};
}
__attribute__
((
packed
))
;
struct
wol_config
{
uint8_t
action
;
...
...
@@ -598,8 +598,7 @@ struct wol_config {
uint8_t
no_rules_in_cmd
;
uint8_t
result
;
struct
host_wol_rule
rule
[
MAX_WOL_RULES
];
};
}
__attribute__
((
packed
));
struct
cmd_ds_host_sleep
{
struct
cmd_header
hdr
;
...
...
drivers/net/wireless/p54/p54common.c
View file @
518aa1b5
...
...
@@ -1147,7 +1147,7 @@ static int p54_set_tim(struct ieee80211_hw *dev, struct ieee80211_sta *sta,
skb
=
p54_alloc_skb
(
dev
,
P54_HDR_FLAG_CONTROL_OPSET
,
sizeof
(
struct
p54_hdr
)
+
sizeof
(
*
tim
),
P54_CONTROL_TYPE_TIM
,
GFP_
KERNEL
);
P54_CONTROL_TYPE_TIM
,
GFP_
ATOMIC
);
if
(
!
skb
)
return
-
ENOMEM
;
...
...
@@ -1610,7 +1610,7 @@ static int p54_scan(struct ieee80211_hw *dev, u16 mode, u16 dwell)
err:
printk
(
KERN_ERR
"%s: frequency change failed
\n
"
,
wiphy_name
(
dev
->
wiphy
));
kfree_skb
(
skb
);
p54_free_skb
(
dev
,
skb
);
return
-
EINVAL
;
}
...
...
@@ -2077,7 +2077,7 @@ static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
algo
=
P54_CRYPTO_AESCCMP
;
break
;
default:
return
-
E
INVAL
;
return
-
E
OPNOTSUPP
;
}
}
...
...
drivers/net/wireless/rt2x00/rt2x00rfkill.c
View file @
518aa1b5
...
...
@@ -162,7 +162,7 @@ void rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev)
void
rt2x00rfkill_free
(
struct
rt2x00_dev
*
rt2x00dev
)
{
if
(
!
test_bit
(
RFKILL_STATE_ALLOCATED
,
&
rt2x00dev
->
flags
))
if
(
!
test_bit
(
RFKILL_STATE_ALLOCATED
,
&
rt2x00dev
->
rfkill_state
))
return
;
cancel_delayed_work_sync
(
&
rt2x00dev
->
rfkill_work
);
...
...
include/net/mac80211.h
View file @
518aa1b5
...
...
@@ -322,7 +322,6 @@ struct ieee80211_tx_rate {
* @control: union for control data
* @status: union for status data
* @driver_data: array of driver_data pointers
* @retry_count: number of retries
* @ampdu_ack_len: number of aggregated frames.
* relevant only if IEEE80211_TX_STATUS_AMPDU was set.
* @ampdu_ack_map: block ack bit map for the aggregation.
...
...
net/mac80211/sta_info.h
View file @
518aa1b5
...
...
@@ -195,7 +195,6 @@ struct sta_ampdu_mlme {
* @tx_packets: number of RX/TX MSDUs
* @tx_bytes: number of bytes transmitted to this STA
* @tx_fragments: number of transmitted MPDUs
* @last_txrate: description of the last used transmit rate
* @tid_seq: per-TID sequence numbers for sending to this STA
* @ampdu_mlme: A-MPDU state machine state
* @timer_to_tid: identity mapping to ID timers
...
...
net/wireless/reg.c
View file @
518aa1b5
...
...
@@ -421,6 +421,31 @@ static u32 freq_max_bandwidth(const struct ieee80211_freq_range *freq_range,
return
0
;
}
/**
* freq_in_rule_band - tells us if a frequency is in a frequency band
* @freq_range: frequency rule we want to query
* @freq_khz: frequency we are inquiring about
*
* This lets us know if a specific frequency rule is or is not relevant to
* a specific frequency's band. Bands are device specific and artificial
* definitions (the "2.4 GHz band" and the "5 GHz band"), however it is
* safe for now to assume that a frequency rule should not be part of a
* frequency's band if the start freq or end freq are off by more than 2 GHz.
* This resolution can be lowered and should be considered as we add
* regulatory rule support for other "bands".
**/
static
bool
freq_in_rule_band
(
const
struct
ieee80211_freq_range
*
freq_range
,
u32
freq_khz
)
{
#define ONE_GHZ_IN_KHZ 1000000
if
(
abs
(
freq_khz
-
freq_range
->
start_freq_khz
)
<=
(
2
*
ONE_GHZ_IN_KHZ
))
return
true
;
if
(
abs
(
freq_khz
-
freq_range
->
end_freq_khz
)
<=
(
2
*
ONE_GHZ_IN_KHZ
))
return
true
;
return
false
;
#undef ONE_GHZ_IN_KHZ
}
/* Converts a country IE to a regulatory domain. A regulatory domain
* structure has a lot of information which the IE doesn't yet have,
* so for the other values we use upper max values as we will intersect
...
...
@@ -538,6 +563,7 @@ static struct ieee80211_regdomain *country_ie_2_rd(
/* This time around we fill in the rd */
while
(
country_ie_len
>=
3
)
{
int
end_channel
=
0
;
struct
ieee80211_country_ie_triplet
*
triplet
=
(
struct
ieee80211_country_ie_triplet
*
)
country_ie
;
struct
ieee80211_reg_rule
*
reg_rule
=
NULL
;
...
...
@@ -559,6 +585,23 @@ static struct ieee80211_regdomain *country_ie_2_rd(
reg_rule
->
flags
=
flags
;
/* 2 GHz */
if
(
triplet
->
chans
.
first_channel
<=
14
)
end_channel
=
triplet
->
chans
.
first_channel
+
triplet
->
chans
.
num_channels
;
else
/*
* 5 GHz -- For example in country IEs if the first
* channel given is 36 and the number of channels is 4
* then the individual channel numbers defined for the
* 5 GHz PHY by these parameters are: 36, 40, 44, and 48
* and not 36, 37, 38, 39.
*
* See: http://tinyurl.com/11d-clarification
*/
end_channel
=
triplet
->
chans
.
first_channel
+
(
4
*
(
triplet
->
chans
.
num_channels
-
1
));
/* The +10 is since the regulatory domain expects
* the actual band edge, not the center of freq for
* its start and end freqs, assuming 20 MHz bandwidth on
...
...
@@ -568,8 +611,7 @@ static struct ieee80211_regdomain *country_ie_2_rd(
triplet
->
chans
.
first_channel
)
-
10
);
freq_range
->
end_freq_khz
=
MHZ_TO_KHZ
(
ieee80211_channel_to_frequency
(
triplet
->
chans
.
first_channel
+
triplet
->
chans
.
num_channels
)
+
10
);
end_channel
)
+
10
);
/* Large arbitrary values, we intersect later */
/* Increment this if we ever support >= 40 MHz channels
...
...
@@ -748,12 +790,23 @@ static u32 map_regdom_flags(u32 rd_flags)
* this value to the maximum allowed bandwidth.
* @reg_rule: the regulatory rule which we have for this frequency
*
* Use this function to get the regulatory rule for a specific frequency.
* Use this function to get the regulatory rule for a specific frequency on
* a given wireless device. If the device has a specific regulatory domain
* it wants to follow we respect that unless a country IE has been received
* and processed already.
*
* Returns 0 if it was able to find a valid regulatory rule which does
* apply to the given center_freq otherwise it returns non-zero. It will
* also return -ERANGE if we determine the given center_freq does not even have
* a regulatory rule for a frequency range in the center_freq's band. See
* freq_in_rule_band() for our current definition of a band -- this is purely
* subjective and right now its 802.11 specific.
*/
static
int
freq_reg_info
(
u32
center_freq
,
u32
*
bandwidth
,
const
struct
ieee80211_reg_rule
**
reg_rule
)
{
int
i
;
bool
band_rule_found
=
false
;
u32
max_bandwidth
=
0
;
if
(
!
cfg80211_regdomain
)
...
...
@@ -767,7 +820,15 @@ static int freq_reg_info(u32 center_freq, u32 *bandwidth,
rr
=
&
cfg80211_regdomain
->
reg_rules
[
i
];
fr
=
&
rr
->
freq_range
;
pr
=
&
rr
->
power_rule
;
/* We only need to know if one frequency rule was
* was in center_freq's band, that's enough, so lets
* not overwrite it once found */
if
(
!
band_rule_found
)
band_rule_found
=
freq_in_rule_band
(
fr
,
center_freq
);
max_bandwidth
=
freq_max_bandwidth
(
fr
,
center_freq
);
if
(
max_bandwidth
&&
*
bandwidth
<=
max_bandwidth
)
{
*
reg_rule
=
rr
;
*
bandwidth
=
max_bandwidth
;
...
...
@@ -775,23 +836,64 @@ static int freq_reg_info(u32 center_freq, u32 *bandwidth,
}
}
if
(
!
band_rule_found
)
return
-
ERANGE
;
return
!
max_bandwidth
;
}
static
void
handle_channel
(
struct
ieee80211_channel
*
chan
)
static
void
handle_channel
(
struct
wiphy
*
wiphy
,
enum
ieee80211_band
band
,
unsigned
int
chan_idx
)
{
int
r
;
u32
flags
=
chan
->
orig_flags
;
u32
flags
;
u32
max_bandwidth
=
0
;
const
struct
ieee80211_reg_rule
*
reg_rule
=
NULL
;
const
struct
ieee80211_power_rule
*
power_rule
=
NULL
;
struct
ieee80211_supported_band
*
sband
;
struct
ieee80211_channel
*
chan
;
sband
=
wiphy
->
bands
[
band
];
BUG_ON
(
chan_idx
>=
sband
->
n_channels
);
chan
=
&
sband
->
channels
[
chan_idx
];
flags
=
chan
->
orig_flags
;
r
=
freq_reg_info
(
MHZ_TO_KHZ
(
chan
->
center_freq
),
&
max_bandwidth
,
&
reg_rule
);
if
(
r
)
{
flags
|=
IEEE80211_CHAN_DISABLED
;
chan
->
flags
=
flags
;
/* This means no regulatory rule was found in the country IE
* with a frequency range on the center_freq's band, since
* IEEE-802.11 allows for a country IE to have a subset of the
* regulatory information provided in a country we ignore
* disabling the channel unless at least one reg rule was
* found on the center_freq's band. For details see this
* clarification:
*
* http://tinyurl.com/11d-clarification
*/
if
(
r
==
-
ERANGE
&&
last_request
->
initiator
==
REGDOM_SET_BY_COUNTRY_IE
)
{
#ifdef CONFIG_CFG80211_REG_DEBUG
printk
(
KERN_DEBUG
"cfg80211: Leaving channel %d MHz "
"intact on %s - no rule found in band on "
"Country IE
\n
"
,
chan
->
center_freq
,
wiphy_name
(
wiphy
));
#endif
}
else
{
/* In this case we know the country IE has at least one reg rule
* for the band so we respect its band definitions */
#ifdef CONFIG_CFG80211_REG_DEBUG
if
(
last_request
->
initiator
==
REGDOM_SET_BY_COUNTRY_IE
)
printk
(
KERN_DEBUG
"cfg80211: Disabling "
"channel %d MHz on %s due to "
"Country IE
\n
"
,
chan
->
center_freq
,
wiphy_name
(
wiphy
));
#endif
flags
|=
IEEE80211_CHAN_DISABLED
;
chan
->
flags
=
flags
;
}
return
;
}
...
...
@@ -808,12 +910,16 @@ static void handle_channel(struct ieee80211_channel *chan)
chan
->
max_power
=
(
int
)
MBM_TO_DBM
(
power_rule
->
max_eirp
);
}
static
void
handle_band
(
struct
ieee80211_supported_band
*
s
band
)
static
void
handle_band
(
struct
wiphy
*
wiphy
,
enum
ieee80211_band
band
)
{
int
i
;
unsigned
int
i
;
struct
ieee80211_supported_band
*
sband
;
BUG_ON
(
!
wiphy
->
bands
[
band
]);
sband
=
wiphy
->
bands
[
band
];
for
(
i
=
0
;
i
<
sband
->
n_channels
;
i
++
)
handle_channel
(
&
sband
->
channels
[
i
]
);
handle_channel
(
wiphy
,
band
,
i
);
}
static
bool
ignore_reg_update
(
struct
wiphy
*
wiphy
,
enum
reg_set_by
setby
)
...
...
@@ -840,7 +946,7 @@ void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby)
enum
ieee80211_band
band
;
for
(
band
=
0
;
band
<
IEEE80211_NUM_BANDS
;
band
++
)
{
if
(
wiphy
->
bands
[
band
])
handle_band
(
wiphy
->
bands
[
band
]
);
handle_band
(
wiphy
,
band
);
if
(
wiphy
->
reg_notifier
)
wiphy
->
reg_notifier
(
wiphy
,
setby
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment