mac80211_hwsim: add support for 5 GHz
ACME Inc. is now selling a dual band radio. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
94041b2940
commit
22cad73587
|
@ -10,7 +10,6 @@
|
|||
/*
|
||||
* TODO:
|
||||
* - IBSS mode simulation (Beacon transmission with competition for "air time")
|
||||
* - IEEE 802.11a and 802.11n modes
|
||||
* - RX filtering based on filter configuration (data->rx_filter)
|
||||
*/
|
||||
|
||||
|
@ -86,22 +85,65 @@ static struct class *hwsim_class;
|
|||
|
||||
static struct net_device *hwsim_mon; /* global monitor netdev */
|
||||
|
||||
#define CHAN2G(_freq) { \
|
||||
.band = IEEE80211_BAND_2GHZ, \
|
||||
.center_freq = (_freq), \
|
||||
.hw_value = (_freq), \
|
||||
.max_power = 20, \
|
||||
}
|
||||
|
||||
static const struct ieee80211_channel hwsim_channels[] = {
|
||||
{ .center_freq = 2412 },
|
||||
{ .center_freq = 2417 },
|
||||
{ .center_freq = 2422 },
|
||||
{ .center_freq = 2427 },
|
||||
{ .center_freq = 2432 },
|
||||
{ .center_freq = 2437 },
|
||||
{ .center_freq = 2442 },
|
||||
{ .center_freq = 2447 },
|
||||
{ .center_freq = 2452 },
|
||||
{ .center_freq = 2457 },
|
||||
{ .center_freq = 2462 },
|
||||
{ .center_freq = 2467 },
|
||||
{ .center_freq = 2472 },
|
||||
{ .center_freq = 2484 },
|
||||
#define CHAN5G(_freq) { \
|
||||
.band = IEEE80211_BAND_5GHZ, \
|
||||
.center_freq = (_freq), \
|
||||
.hw_value = (_freq), \
|
||||
.max_power = 20, \
|
||||
}
|
||||
|
||||
static const struct ieee80211_channel hwsim_channels_2ghz[] = {
|
||||
CHAN2G(2412), /* Channel 1 */
|
||||
CHAN2G(2417), /* Channel 2 */
|
||||
CHAN2G(2422), /* Channel 3 */
|
||||
CHAN2G(2427), /* Channel 4 */
|
||||
CHAN2G(2432), /* Channel 5 */
|
||||
CHAN2G(2437), /* Channel 6 */
|
||||
CHAN2G(2442), /* Channel 7 */
|
||||
CHAN2G(2447), /* Channel 8 */
|
||||
CHAN2G(2452), /* Channel 9 */
|
||||
CHAN2G(2457), /* Channel 10 */
|
||||
CHAN2G(2462), /* Channel 11 */
|
||||
CHAN2G(2467), /* Channel 12 */
|
||||
CHAN2G(2472), /* Channel 13 */
|
||||
CHAN2G(2484), /* Channel 14 */
|
||||
};
|
||||
|
||||
static const struct ieee80211_channel hwsim_channels_5ghz[] = {
|
||||
CHAN5G(5180), /* Channel 36 */
|
||||
CHAN5G(5200), /* Channel 40 */
|
||||
CHAN5G(5220), /* Channel 44 */
|
||||
CHAN5G(5240), /* Channel 48 */
|
||||
|
||||
CHAN5G(5260), /* Channel 52 */
|
||||
CHAN5G(5280), /* Channel 56 */
|
||||
CHAN5G(5300), /* Channel 60 */
|
||||
CHAN5G(5320), /* Channel 64 */
|
||||
|
||||
CHAN5G(5500), /* Channel 100 */
|
||||
CHAN5G(5520), /* Channel 104 */
|
||||
CHAN5G(5540), /* Channel 108 */
|
||||
CHAN5G(5560), /* Channel 112 */
|
||||
CHAN5G(5580), /* Channel 116 */
|
||||
CHAN5G(5600), /* Channel 120 */
|
||||
CHAN5G(5620), /* Channel 124 */
|
||||
CHAN5G(5640), /* Channel 128 */
|
||||
CHAN5G(5660), /* Channel 132 */
|
||||
CHAN5G(5680), /* Channel 136 */
|
||||
CHAN5G(5700), /* Channel 140 */
|
||||
|
||||
CHAN5G(5745), /* Channel 149 */
|
||||
CHAN5G(5765), /* Channel 153 */
|
||||
CHAN5G(5785), /* Channel 157 */
|
||||
CHAN5G(5805), /* Channel 161 */
|
||||
CHAN5G(5825), /* Channel 165 */
|
||||
};
|
||||
|
||||
static const struct ieee80211_rate hwsim_rates[] = {
|
||||
|
@ -126,8 +168,9 @@ struct mac80211_hwsim_data {
|
|||
struct list_head list;
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
struct ieee80211_supported_band band;
|
||||
struct ieee80211_channel channels[ARRAY_SIZE(hwsim_channels)];
|
||||
struct ieee80211_supported_band bands[2];
|
||||
struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)];
|
||||
struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)];
|
||||
struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
|
@ -728,6 +771,7 @@ static int __init init_mac80211_hwsim(void)
|
|||
u8 addr[ETH_ALEN];
|
||||
struct mac80211_hwsim_data *data;
|
||||
struct ieee80211_hw *hw;
|
||||
enum ieee80211_band band;
|
||||
|
||||
if (radios < 1 || radios > 100)
|
||||
return -EINVAL;
|
||||
|
@ -785,25 +829,47 @@ static int __init init_mac80211_hwsim(void)
|
|||
hw->vif_data_size = sizeof(struct hwsim_vif_priv);
|
||||
hw->sta_data_size = sizeof(struct hwsim_sta_priv);
|
||||
|
||||
memcpy(data->channels, hwsim_channels, sizeof(hwsim_channels));
|
||||
memcpy(data->channels_2ghz, hwsim_channels_2ghz,
|
||||
sizeof(hwsim_channels_2ghz));
|
||||
memcpy(data->channels_5ghz, hwsim_channels_5ghz,
|
||||
sizeof(hwsim_channels_5ghz));
|
||||
memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
|
||||
data->band.channels = data->channels;
|
||||
data->band.n_channels = ARRAY_SIZE(hwsim_channels);
|
||||
data->band.bitrates = data->rates;
|
||||
data->band.n_bitrates = ARRAY_SIZE(hwsim_rates);
|
||||
data->band.ht_cap.ht_supported = true;
|
||||
data->band.ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
||||
IEEE80211_HT_CAP_GRN_FLD |
|
||||
IEEE80211_HT_CAP_SGI_40 |
|
||||
IEEE80211_HT_CAP_DSSSCCK40;
|
||||
data->band.ht_cap.ampdu_factor = 0x3;
|
||||
data->band.ht_cap.ampdu_density = 0x6;
|
||||
memset(&data->band.ht_cap.mcs, 0,
|
||||
sizeof(data->band.ht_cap.mcs));
|
||||
data->band.ht_cap.mcs.rx_mask[0] = 0xff;
|
||||
data->band.ht_cap.mcs.rx_mask[1] = 0xff;
|
||||
data->band.ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &data->band;
|
||||
|
||||
for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
|
||||
struct ieee80211_supported_band *sband = &data->bands[band];
|
||||
switch (band) {
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
sband->channels = data->channels_2ghz;
|
||||
sband->n_channels =
|
||||
ARRAY_SIZE(hwsim_channels_2ghz);
|
||||
break;
|
||||
case IEEE80211_BAND_5GHZ:
|
||||
sband->channels = data->channels_5ghz;
|
||||
sband->n_channels =
|
||||
ARRAY_SIZE(hwsim_channels_5ghz);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
sband->bitrates = data->rates;
|
||||
sband->n_bitrates = ARRAY_SIZE(hwsim_rates);
|
||||
|
||||
sband->ht_cap.ht_supported = true;
|
||||
sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
||||
IEEE80211_HT_CAP_GRN_FLD |
|
||||
IEEE80211_HT_CAP_SGI_40 |
|
||||
IEEE80211_HT_CAP_DSSSCCK40;
|
||||
sband->ht_cap.ampdu_factor = 0x3;
|
||||
sband->ht_cap.ampdu_density = 0x6;
|
||||
memset(&sband->ht_cap.mcs, 0,
|
||||
sizeof(sband->ht_cap.mcs));
|
||||
sband->ht_cap.mcs.rx_mask[0] = 0xff;
|
||||
sband->ht_cap.mcs.rx_mask[1] = 0xff;
|
||||
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
|
||||
hw->wiphy->bands[band] = sband;
|
||||
}
|
||||
|
||||
err = ieee80211_register_hw(hw);
|
||||
if (err < 0) {
|
||||
|
|
Loading…
Reference in New Issue