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

Commit 4a80f278 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.26

parents 03a64c93 e4861829
Loading
Loading
Loading
Loading
+17 −27
Original line number Diff line number Diff line
@@ -147,10 +147,13 @@ config IPW2100

          <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.

          If you want to compile the driver as a module ( = code which can be
          inserted in and removed from the running kernel whenever you want),
          say M here and read <file:Documentation/kbuild/modules.txt>.
          The module will be called ipw2100.ko.
          It is recommended that you compile this driver as a module (M)
          rather than built-in (Y). This driver requires firmware at device
          initialization time, and when built-in this typically happens
          before the filesystem is accessible (hence firmware will be
          unavailable and initialization will fail). If you do choose to build
          this driver into your kernel image, you can avoid this problem by
          including the firmware and a firmware loader in an initramfs.
 
config IPW2100_MONITOR
        bool "Enable promiscuous mode"
@@ -202,10 +205,13 @@ config IPW2200

          <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.

          If you want to compile the driver as a module ( = code which can be
          inserted in and removed from the running kernel whenever you want),
          say M here and read <file:Documentation/kbuild/modules.txt>.
          The module will be called ipw2200.ko.
          It is recommended that you compile this driver as a module (M)
          rather than built-in (Y). This driver requires firmware at device
          initialization time, and when built-in this typically happens
          before the filesystem is accessible (hence firmware will be
          unavailable and initialization will fail). If you do choose to build
          this driver into your kernel image, you can avoid this problem by
          including the firmware and a firmware loader in an initramfs.

config IPW2200_MONITOR
        bool "Enable promiscuous mode"
@@ -732,23 +738,7 @@ config P54_PCI

	  If you choose to build a module, it'll be called p54pci.

config ATH5K
	tristate "Atheros 5xxx wireless cards support"
	depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
	---help---
	  This module adds support for wireless adapters based on
	  Atheros 5xxx chipset.

	  Currently the following chip versions are supported:

	  MAC: AR5211 AR5212
	  PHY: RF5111/2111 RF5112/2112 RF5413/2413

	  This driver uses the kernel's mac80211 subsystem.

	  If you choose to build a module, it'll be called ath5k. Say M if
	  unsure.

source "drivers/net/wireless/ath5k/Kconfig"
source "drivers/net/wireless/iwlwifi/Kconfig"
source "drivers/net/wireless/hostap/Kconfig"
source "drivers/net/wireless/bcm43xx/Kconfig"
+48 −40
Original line number Diff line number Diff line
@@ -48,6 +48,32 @@ static struct pci_device_id adm8211_pci_id_table[] __devinitdata = {
	{ 0 }
};

static struct ieee80211_rate adm8211_rates[] = {
	{ .bitrate = 10, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
	{ .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
	{ .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
	{ .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
	{ .bitrate = 220, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, /* XX ?? */
};

static const struct ieee80211_channel adm8211_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},
};


static void adm8211_eeprom_register_read(struct eeprom_93cx6 *eeprom)
{
	struct adm8211_priv *priv = eeprom->data;
@@ -155,17 +181,17 @@ static int adm8211_read_eeprom(struct ieee80211_hw *dev)
	printk(KERN_DEBUG "%s (adm8211): Channel range: %d - %d\n",
	       pci_name(priv->pdev), (int)chan_range.min, (int)chan_range.max);

	priv->modes[0].num_channels = chan_range.max - chan_range.min + 1;
	priv->modes[0].channels = priv->channels;
	BUILD_BUG_ON(sizeof(priv->channels) != sizeof(adm8211_channels));

	memcpy(priv->channels, adm8211_channels, sizeof(adm8211_channels));
	memcpy(priv->channels, adm8211_channels, sizeof(priv->channels));
	priv->band.channels = priv->channels;
	priv->band.n_channels = ARRAY_SIZE(adm8211_channels);
	priv->band.bitrates = adm8211_rates;
	priv->band.n_bitrates = ARRAY_SIZE(adm8211_rates);

	for (i = 1; i <= ARRAY_SIZE(adm8211_channels); i++)
		if (i >= chan_range.min && i <= chan_range.max)
			priv->channels[i - 1].flag =
				IEEE80211_CHAN_W_SCAN |
				IEEE80211_CHAN_W_ACTIVE_SCAN |
				IEEE80211_CHAN_W_IBSS;
		if (i < chan_range.min || i > chan_range.max)
			priv->channels[i - 1].flags |= IEEE80211_CHAN_DISABLED;

	switch (priv->eeprom->specific_bbptype) {
	case ADM8211_BBP_RFMD3000:
@@ -347,7 +373,6 @@ static void adm8211_interrupt_rci(struct ieee80211_hw *dev)
	unsigned int pktlen;
	struct sk_buff *skb, *newskb;
	unsigned int limit = priv->rx_ring_size;
	static const u8 rate_tbl[] = {10, 20, 55, 110, 220};
	u8 rssi, rate;

	while (!(priv->rx_ring[entry].status & cpu_to_le32(RDES0_STATUS_OWN))) {
@@ -425,12 +450,10 @@ static void adm8211_interrupt_rci(struct ieee80211_hw *dev)
			else
				rx_status.ssi = 100 - rssi;

			if (rate <= 4)
				rx_status.rate = rate_tbl[rate];
			rx_status.rate_idx = rate;

			rx_status.channel = priv->channel;
			rx_status.freq = adm8211_channels[priv->channel - 1].freq;
			rx_status.phymode = MODE_IEEE80211B;
			rx_status.freq = adm8211_channels[priv->channel - 1].center_freq;
			rx_status.band = IEEE80211_BAND_2GHZ;

			ieee80211_rx_irqsafe(dev, skb, &rx_status);
		}
@@ -1054,7 +1077,7 @@ static int adm8211_set_rate(struct ieee80211_hw *dev)
	if (priv->pdev->revision != ADM8211_REV_BA) {
		rate_buf[0] = ARRAY_SIZE(adm8211_rates);
		for (i = 0; i < ARRAY_SIZE(adm8211_rates); i++)
			rate_buf[i + 1] = (adm8211_rates[i].rate / 5) | 0x80;
			rate_buf[i + 1] = (adm8211_rates[i].bitrate / 5) | 0x80;
	} else {
		/* workaround for rev BA specific bug */
		rate_buf[0] = 0x04;
@@ -1086,7 +1109,7 @@ static void adm8211_hw_init(struct ieee80211_hw *dev)
	u32 reg;
	u8 cline;

	reg = le32_to_cpu(ADM8211_CSR_READ(PAR));
	reg = ADM8211_CSR_READ(PAR);
	reg |= ADM8211_PAR_MRLE | ADM8211_PAR_MRME;
	reg &= ~(ADM8211_PAR_BAR | ADM8211_PAR_CAL);

@@ -1303,9 +1326,10 @@ static int adm8211_set_ssid(struct ieee80211_hw *dev, u8 *ssid, size_t ssid_len)
static int adm8211_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf)
{
	struct adm8211_priv *priv = dev->priv;
	int channel = ieee80211_frequency_to_channel(conf->channel->center_freq);

	if (conf->channel != priv->channel) {
		priv->channel = conf->channel;
	if (channel != priv->channel) {
		priv->channel = channel;
		adm8211_rf_set_channel(dev, priv->channel);
	}

@@ -1678,13 +1702,9 @@ static int adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
	int plcp, dur, len, plcp_signal, short_preamble;
	struct ieee80211_hdr *hdr;

	if (control->tx_rate < 0) {
		short_preamble = 1;
		plcp_signal = -control->tx_rate;
	} else {
		short_preamble = 0;
		plcp_signal = control->tx_rate;
	}
	short_preamble = !!(control->tx_rate->flags &
					IEEE80211_TXCTL_SHORT_PREAMBLE);
	plcp_signal = control->tx_rate->bitrate;

	hdr = (struct ieee80211_hdr *)skb->data;
	fc = le16_to_cpu(hdr->frame_control) & ~IEEE80211_FCTL_PROTECTED;
@@ -1880,18 +1900,11 @@ static int __devinit adm8211_probe(struct pci_dev *pdev,
	SET_IEEE80211_PERM_ADDR(dev, perm_addr);

	dev->extra_tx_headroom = sizeof(struct adm8211_tx_hdr);
	dev->flags = IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED;
	/* IEEE80211_HW_RX_INCLUDES_FCS in promisc mode */
	/* dev->flags = IEEE80211_HW_RX_INCLUDES_FCS in promisc mode */

	dev->channel_change_time = 1000;
	dev->max_rssi = 100;	/* FIXME: find better value */

	priv->modes[0].mode = MODE_IEEE80211B;
	/* channel info filled in by adm8211_read_eeprom */
	memcpy(priv->rates, adm8211_rates, sizeof(adm8211_rates));
	priv->modes[0].num_rates = ARRAY_SIZE(adm8211_rates);
	priv->modes[0].rates = priv->rates;

	dev->queues = 1; /* ADM8211C supports more, maybe ADM8211B too */

	priv->retry_limit = 3;
@@ -1917,14 +1930,9 @@ static int __devinit adm8211_probe(struct pci_dev *pdev,
		goto err_free_desc;
	}

	priv->channel = priv->modes[0].channels[0].chan;
	priv->channel = 1;

	err = ieee80211_register_hwmode(dev, &priv->modes[0]);
	if (err) {
		printk(KERN_ERR "%s (adm8211): Can't register hwmode\n",
		       pci_name(pdev));
		goto err_free_desc;
	}
	dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band;

	err = ieee80211_register_hw(dev);
	if (err) {
+7 −58
Original line number Diff line number Diff line
@@ -534,61 +534,6 @@ struct adm8211_eeprom {
	u8	cis_data[0];		/* 0x80, 384 bytes */
} __attribute__ ((packed));

static const struct ieee80211_rate adm8211_rates[] = {
	{ .rate = 10,
	  .val = 10,
	  .val2 = -10,
	  .flags = IEEE80211_RATE_CCK_2 },
	{ .rate = 20,
	  .val = 20,
	  .val2 = -20,
	  .flags = IEEE80211_RATE_CCK_2 },
	{ .rate = 55,
	  .val = 55,
	  .val2 = -55,
	  .flags = IEEE80211_RATE_CCK_2 },
	{ .rate = 110,
	  .val = 110,
	  .val2 = -110,
	  .flags = IEEE80211_RATE_CCK_2 }
};

struct ieee80211_chan_range {
	u8 min;
	u8 max;
};

static const struct ieee80211_channel adm8211_channels[] = {
	{ .chan = 1,
	  .freq = 2412},
	{ .chan = 2,
	  .freq = 2417},
	{ .chan = 3,
	  .freq = 2422},
	{ .chan = 4,
	  .freq = 2427},
	{ .chan = 5,
	  .freq = 2432},
	{ .chan = 6,
	  .freq = 2437},
	{ .chan = 7,
	  .freq = 2442},
	{ .chan = 8,
	  .freq = 2447},
	{ .chan = 9,
	  .freq = 2452},
	{ .chan = 10,
	  .freq = 2457},
	{ .chan = 11,
	  .freq = 2462},
	{ .chan = 12,
	  .freq = 2467},
	{ .chan = 13,
	  .freq = 2472},
	{ .chan = 14,
	  .freq = 2484},
};

struct adm8211_priv {
	struct pci_dev *pdev;
	spinlock_t lock;
@@ -603,9 +548,8 @@ struct adm8211_priv {
	unsigned int cur_tx, dirty_tx, cur_rx;

	struct ieee80211_low_level_stats stats;
	struct ieee80211_hw_mode modes[1];
	struct ieee80211_channel channels[ARRAY_SIZE(adm8211_channels)];
	struct ieee80211_rate rates[ARRAY_SIZE(adm8211_rates)];
	struct ieee80211_supported_band band;
	struct ieee80211_channel channels[14];
	int mode;

	int channel;
@@ -643,6 +587,11 @@ struct adm8211_priv {
	} transceiver_type;
};

struct ieee80211_chan_range {
	u8 min;
	u8 max;
};

static const struct ieee80211_chan_range cranges[] = {
	{1,  11},	/* FCC */
	{1,  11},	/* IC */
+37 −0
Original line number Diff line number Diff line
config ATH5K
	tristate "Atheros 5xxx wireless cards support"
	depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
	---help---
	  This module adds support for wireless adapters based on
	  Atheros 5xxx chipset.

	  Currently the following chip versions are supported:

	  MAC: AR5211 AR5212
	  PHY: RF5111/2111 RF5112/2112 RF5413/2413

	  This driver uses the kernel's mac80211 subsystem.

	  If you choose to build a module, it'll be called ath5k. Say M if
	  unsure.

config ATH5K_DEBUG
	bool "Atheros 5xxx debugging"
	depends on ATH5K
	---help---
	  Atheros 5xxx debugging messages.

	  Say Y, if and you will get debug options for ath5k.
	  To use this, you need to mount debugfs:

	  mkdir /debug/
	  mount -t debugfs debug /debug/

	  You will get access to files under:
	  /debug/ath5k/phy0/

	  To enable debug, pass the debug level to the debug module
	  parameter. For example:

	  modprobe ath5k debug=0x00000400
+6 −2
Original line number Diff line number Diff line
ath5k-objs		= base.o hw.o regdom.o initvals.o phy.o debug.o
ath5k-y				+= base.o
ath5k-y				+= hw.o
ath5k-y				+= initvals.o
ath5k-y				+= phy.o
ath5k-$(CONFIG_ATH5K_DEBUG)	+= debug.o
obj-$(CONFIG_ATH5K)		+= ath5k.o
Loading