Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31562e80 authored by Ivo van Doorn's avatar Ivo van Doorn Committed by John W. Linville
Browse files

rt2x00: Cleanup mode registration



Don't wildly pass any number for num_rates to rt2x00lib,
instead pass which type of rates are supported (CCK, OFDM).
Same for num_modes but then for the 2GHZ and 5GHZ band.

This makes the interface look much nicer and makes
extending it later easier.

Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent de99ff82
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -1352,8 +1352,8 @@ static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
	/*
	/*
	 * Initialize hw_mode information.
	 * Initialize hw_mode information.
	 */
	 */
	spec->num_modes = 1;
	spec->supported_bands = SUPPORT_BAND_2GHZ;
	spec->num_rates = 4;
	spec->supported_rates = SUPPORT_RATE_CCK;
	spec->tx_power_a = NULL;
	spec->tx_power_a = NULL;
	spec->tx_power_bg = txpower;
	spec->tx_power_bg = txpower;
	spec->tx_power_default = DEFAULT_TXPOWER;
	spec->tx_power_default = DEFAULT_TXPOWER;
+3 −3
Original line number Original line Diff line number Diff line
@@ -1666,8 +1666,8 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
	/*
	/*
	 * Initialize hw_mode information.
	 * Initialize hw_mode information.
	 */
	 */
	spec->num_modes = 2;
	spec->supported_bands = SUPPORT_BAND_2GHZ;
	spec->num_rates = 12;
	spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
	spec->tx_power_a = NULL;
	spec->tx_power_a = NULL;
	spec->tx_power_bg = txpower;
	spec->tx_power_bg = txpower;
	spec->tx_power_default = DEFAULT_TXPOWER;
	spec->tx_power_default = DEFAULT_TXPOWER;
@@ -1688,9 +1688,9 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
		spec->channels = rf_vals_bg_2525e;
		spec->channels = rf_vals_bg_2525e;
	} else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {
	} else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {
		spec->supported_bands |= SUPPORT_BAND_5GHZ;
		spec->num_channels = ARRAY_SIZE(rf_vals_5222);
		spec->num_channels = ARRAY_SIZE(rf_vals_5222);
		spec->channels = rf_vals_5222;
		spec->channels = rf_vals_5222;
		spec->num_modes = 3;
	}
	}
}
}


+3 −3
Original line number Original line Diff line number Diff line
@@ -1586,8 +1586,8 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
	/*
	/*
	 * Initialize hw_mode information.
	 * Initialize hw_mode information.
	 */
	 */
	spec->num_modes = 2;
	spec->supported_bands = SUPPORT_BAND_2GHZ;
	spec->num_rates = 12;
	spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
	spec->tx_power_a = NULL;
	spec->tx_power_a = NULL;
	spec->tx_power_bg = txpower;
	spec->tx_power_bg = txpower;
	spec->tx_power_default = DEFAULT_TXPOWER;
	spec->tx_power_default = DEFAULT_TXPOWER;
@@ -1608,9 +1608,9 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
		spec->channels = rf_vals_bg_2525e;
		spec->channels = rf_vals_bg_2525e;
	} else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {
	} else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {
		spec->supported_bands |= SUPPORT_BAND_5GHZ;
		spec->num_channels = ARRAY_SIZE(rf_vals_5222);
		spec->num_channels = ARRAY_SIZE(rf_vals_5222);
		spec->channels = rf_vals_5222;
		spec->channels = rf_vals_5222;
		spec->num_modes = 3;
	}
	}
}
}


+23 −15
Original line number Original line Diff line number Diff line
@@ -392,30 +392,38 @@ static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
	return (struct rt2x00_intf *)vif->drv_priv;
	return (struct rt2x00_intf *)vif->drv_priv;
}
}


/*
/**
 * struct hw_mode_spec: Hardware specifications structure
 *
 * Details about the supported modes, rates and channels
 * Details about the supported modes, rates and channels
 * of a particular chipset. This is used by rt2x00lib
 * of a particular chipset. This is used by rt2x00lib
 * to build the ieee80211_hw_mode array for mac80211.
 * to build the ieee80211_hw_mode array for mac80211.
 *
 * @supported_bands: Bitmask contained the supported bands (2.4GHz, 5.2GHz).
 * @supported_rates: Rate types which are supported (CCK, OFDM).
 * @num_channels: Number of supported channels. This is used as array size
 *	for @tx_power_a, @tx_power_bg and @channels.
 * channels: Device/chipset specific channel values (See &struct rf_channel).
 * @tx_power_a: TX power values for all 5.2GHz channels (may be NULL).
 * @tx_power_bg: TX power values for all 2.4GHz channels (may be NULL).
 * @tx_power_default: Default TX power value to use when either
 *	@tx_power_a or @tx_power_bg is missing.
 */
 */
struct hw_mode_spec {
struct hw_mode_spec {
	/*
	unsigned int supported_bands;
	 * Number of modes, rates and channels.
#define SUPPORT_BAND_2GHZ	0x00000001
	 */
#define SUPPORT_BAND_5GHZ	0x00000002
	int num_modes;

	int num_rates;
	unsigned int supported_rates;
	int num_channels;
#define SUPPORT_RATE_CCK	0x00000001
#define SUPPORT_RATE_OFDM	0x00000002

	unsigned int num_channels;
	const struct rf_channel *channels;


	/*
	 * txpower values.
	 */
	const u8 *tx_power_a;
	const u8 *tx_power_a;
	const u8 *tx_power_bg;
	const u8 *tx_power_bg;
	u8 tx_power_default;
	u8 tx_power_default;

	/*
	 * Device/chipset specific value.
	 */
	const struct rf_channel *channels;
};
};


/*
/*
+40 −40
Original line number Original line Diff line number Diff line
@@ -767,25 +767,25 @@ EXPORT_SYMBOL_GPL(rt2x00lib_write_tx_desc);
 */
 */
const struct rt2x00_rate rt2x00_supported_rates[12] = {
const struct rt2x00_rate rt2x00_supported_rates[12] = {
	{
	{
		.flags = 0,
		.flags = DEV_RATE_CCK,
		.bitrate = 10,
		.bitrate = 10,
		.ratemask = DEV_RATEMASK_1MB,
		.ratemask = DEV_RATEMASK_1MB,
		.plcp = 0x00,
		.plcp = 0x00,
	},
	},
	{
	{
		.flags = DEV_RATE_SHORT_PREAMBLE,
		.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
		.bitrate = 20,
		.bitrate = 20,
		.ratemask = DEV_RATEMASK_2MB,
		.ratemask = DEV_RATEMASK_2MB,
		.plcp = 0x01,
		.plcp = 0x01,
	},
	},
	{
	{
		.flags = DEV_RATE_SHORT_PREAMBLE,
		.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
		.bitrate = 55,
		.bitrate = 55,
		.ratemask = DEV_RATEMASK_5_5MB,
		.ratemask = DEV_RATEMASK_5_5MB,
		.plcp = 0x02,
		.plcp = 0x02,
	},
	},
	{
	{
		.flags = DEV_RATE_SHORT_PREAMBLE,
		.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
		.bitrate = 110,
		.bitrate = 110,
		.ratemask = DEV_RATEMASK_11MB,
		.ratemask = DEV_RATEMASK_11MB,
		.plcp = 0x03,
		.plcp = 0x03,
@@ -868,67 +868,64 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
				    struct hw_mode_spec *spec)
				    struct hw_mode_spec *spec)
{
{
	struct ieee80211_hw *hw = rt2x00dev->hw;
	struct ieee80211_hw *hw = rt2x00dev->hw;
	struct ieee80211_supported_band *sbands;
	struct ieee80211_channel *channels;
	struct ieee80211_channel *channels;
	struct ieee80211_rate *rates;
	struct ieee80211_rate *rates;
	unsigned int num_rates;
	unsigned int i;
	unsigned int i;
	unsigned char tx_power;
	unsigned char tx_power;


	sbands = &rt2x00dev->bands[0];
	num_rates = 0;
	if (spec->supported_rates & SUPPORT_RATE_CCK)
		num_rates += 4;
	if (spec->supported_rates & SUPPORT_RATE_OFDM)
		num_rates += 8;


	channels = kzalloc(sizeof(*channels) * spec->num_channels, GFP_KERNEL);
	channels = kzalloc(sizeof(*channels) * spec->num_channels, GFP_KERNEL);
	if (!channels)
	if (!channels)
		return -ENOMEM;
		return -ENOMEM;


	rates = kzalloc(sizeof(*rates) * spec->num_rates, GFP_KERNEL);
	rates = kzalloc(sizeof(*rates) * num_rates, GFP_KERNEL);
	if (!rates)
	if (!rates)
		goto exit_free_channels;
		goto exit_free_channels;


	/*
	/*
	 * Initialize Rate list.
	 * Initialize Rate list.
	 */
	 */
	for (i = 0; i < spec->num_rates; i++)
	for (i = 0; i < num_rates; i++)
		rt2x00lib_rate(&rates[i], i, rt2x00_get_rate(i));
		rt2x00lib_rate(&rates[i], i, rt2x00_get_rate(i));


	/*
	/*
	 * Initialize Channel list.
	 * Initialize Channel list.
	 */
	 */
	for (i = 0; i < spec->num_channels; i++) {
	for (i = 0; i < spec->num_channels; i++) {
		if (spec->channels[i].channel <= 14)
		if (spec->channels[i].channel <= 14) {
			if (spec->tx_power_bg)
				tx_power = spec->tx_power_bg[i];
				tx_power = spec->tx_power_bg[i];
		else if (spec->tx_power_a)
			else
				tx_power = spec->tx_power_default;
		} else {
			if (spec->tx_power_a)
				tx_power = spec->tx_power_a[i];
				tx_power = spec->tx_power_a[i];
			else
			else
				tx_power = spec->tx_power_default;
				tx_power = spec->tx_power_default;
		}


		rt2x00lib_channel(&channels[i],
		rt2x00lib_channel(&channels[i],
				  spec->channels[i].channel, tx_power, i);
				  spec->channels[i].channel, tx_power, i);
	}
	}


	/*
	/*
	 * Intitialize 802.11b
	 * Intitialize 802.11b, 802.11g
	 * Rates: CCK.
	 * Channels: 2.4 GHz
	 */
	if (spec->num_modes > 0) {
		sbands[IEEE80211_BAND_2GHZ].n_channels = 14;
		sbands[IEEE80211_BAND_2GHZ].n_bitrates = 4;
		sbands[IEEE80211_BAND_2GHZ].channels = channels;
		sbands[IEEE80211_BAND_2GHZ].bitrates = rates;
		hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &rt2x00dev->bands[IEEE80211_BAND_2GHZ];
	}

	/*
	 * Intitialize 802.11g
	 * Rates: CCK, OFDM.
	 * Rates: CCK, OFDM.
	 * Channels: 2.4 GHz
	 * Channels: 2.4 GHz
	 */
	 */
	if (spec->num_modes > 1) {
	if (spec->supported_bands > SUPPORT_BAND_2GHZ) {
		sbands[IEEE80211_BAND_2GHZ].n_channels = 14;
		rt2x00dev->bands[IEEE80211_BAND_2GHZ].n_channels = 14;
		sbands[IEEE80211_BAND_2GHZ].n_bitrates = spec->num_rates;
		rt2x00dev->bands[IEEE80211_BAND_2GHZ].n_bitrates = num_rates;
		sbands[IEEE80211_BAND_2GHZ].channels = channels;
		rt2x00dev->bands[IEEE80211_BAND_2GHZ].channels = channels;
		sbands[IEEE80211_BAND_2GHZ].bitrates = rates;
		rt2x00dev->bands[IEEE80211_BAND_2GHZ].bitrates = rates;
		hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &rt2x00dev->bands[IEEE80211_BAND_2GHZ];
		hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
		    &rt2x00dev->bands[IEEE80211_BAND_2GHZ];
	}
	}


	/*
	/*
@@ -936,12 +933,15 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
	 * Rates: OFDM.
	 * Rates: OFDM.
	 * Channels: OFDM, UNII, HiperLAN2.
	 * Channels: OFDM, UNII, HiperLAN2.
	 */
	 */
	if (spec->num_modes > 2) {
	if (spec->supported_bands > SUPPORT_BAND_5GHZ) {
		sbands[IEEE80211_BAND_5GHZ].n_channels = spec->num_channels - 14;
		rt2x00dev->bands[IEEE80211_BAND_5GHZ].n_channels =
		sbands[IEEE80211_BAND_5GHZ].n_bitrates = spec->num_rates - 4;
		    spec->num_channels - 14;
		sbands[IEEE80211_BAND_5GHZ].channels = &channels[14];
		rt2x00dev->bands[IEEE80211_BAND_5GHZ].n_bitrates =
		sbands[IEEE80211_BAND_5GHZ].bitrates = &rates[4];
		    num_rates - 4;
		hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &rt2x00dev->bands[IEEE80211_BAND_5GHZ];
		rt2x00dev->bands[IEEE80211_BAND_5GHZ].channels = &channels[14];
		rt2x00dev->bands[IEEE80211_BAND_5GHZ].bitrates = &rates[4];
		hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
		    &rt2x00dev->bands[IEEE80211_BAND_5GHZ];
	}
	}


	return 0;
	return 0;
Loading