mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
net/wireless: drop new rt2x00 drivers from 3.10
Change-Id: Ic90ce6437bb413379d7f0ebf63f449ccb93f23ca
This commit is contained in:
@@ -20,6 +20,7 @@ if RT2X00
|
||||
config RT2400PCI
|
||||
tristate "Ralink rt2400 (PCI/PCMCIA) support"
|
||||
depends on PCI
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_PCI
|
||||
select EEPROM_93CX6
|
||||
---help---
|
||||
@@ -31,6 +32,7 @@ config RT2400PCI
|
||||
config RT2500PCI
|
||||
tristate "Ralink rt2500 (PCI/PCMCIA) support"
|
||||
depends on PCI
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_PCI
|
||||
select EEPROM_93CX6
|
||||
---help---
|
||||
@@ -43,6 +45,7 @@ config RT61PCI
|
||||
tristate "Ralink rt2501/rt61 (PCI/PCMCIA) support"
|
||||
depends on PCI
|
||||
select RT2X00_LIB_PCI
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_FIRMWARE
|
||||
select RT2X00_LIB_CRYPTO
|
||||
select CRC_ITU_T
|
||||
@@ -55,10 +58,11 @@ config RT61PCI
|
||||
|
||||
config RT2800PCI
|
||||
tristate "Ralink rt27xx/rt28xx/rt30xx (PCI/PCIe/PCMCIA) support"
|
||||
depends on PCI || RALINK_RT288X || RALINK_RT305X
|
||||
depends on PCI || SOC_RT288X || SOC_RT305X
|
||||
select RT2800_LIB
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_PCI if PCI
|
||||
select RT2X00_LIB_SOC if RALINK_RT288X || RALINK_RT305X
|
||||
select RT2X00_LIB_SOC if SOC_RT288X || SOC_RT305X
|
||||
select RT2X00_LIB_FIRMWARE
|
||||
select RT2X00_LIB_CRYPTO
|
||||
select CRC_CCITT
|
||||
@@ -82,7 +86,6 @@ config RT2800PCI_RT33XX
|
||||
|
||||
config RT2800PCI_RT35XX
|
||||
bool "rt2800pci - Include support for rt35xx devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default y
|
||||
---help---
|
||||
This adds support for rt35xx wireless chipset family to the
|
||||
@@ -92,7 +95,6 @@ config RT2800PCI_RT35XX
|
||||
|
||||
config RT2800PCI_RT53XX
|
||||
bool "rt2800pci - Include support for rt53xx devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default y
|
||||
---help---
|
||||
This adds support for rt53xx wireless chipset family to the
|
||||
@@ -101,7 +103,6 @@ config RT2800PCI_RT53XX
|
||||
|
||||
config RT2800PCI_RT3290
|
||||
bool "rt2800pci - Include support for rt3290 devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default y
|
||||
---help---
|
||||
This adds support for rt3290 wireless chipset family to the
|
||||
@@ -159,7 +160,6 @@ config RT2800USB_RT33XX
|
||||
|
||||
config RT2800USB_RT35XX
|
||||
bool "rt2800usb - Include support for rt35xx devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default y
|
||||
---help---
|
||||
This adds support for rt35xx wireless chipset family to the
|
||||
@@ -168,12 +168,18 @@ config RT2800USB_RT35XX
|
||||
|
||||
config RT2800USB_RT53XX
|
||||
bool "rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
---help---
|
||||
This adds support for rt53xx wireless chipset family to the
|
||||
rt2800usb driver.
|
||||
Supported chips: RT5370
|
||||
|
||||
config RT2800USB_RT55XX
|
||||
bool "rt2800usb - Include support for rt55xx devices (EXPERIMENTAL)"
|
||||
---help---
|
||||
This adds support for rt55xx wireless chipset family to the
|
||||
rt2800usb driver.
|
||||
Supported chips: RT5572
|
||||
|
||||
config RT2800USB_UNKNOWN
|
||||
bool "rt2800usb - Include support for unknown (USB) devices"
|
||||
default n
|
||||
@@ -190,6 +196,9 @@ endif
|
||||
config RT2800_LIB
|
||||
tristate
|
||||
|
||||
config RT2X00_LIB_MMIO
|
||||
tristate
|
||||
|
||||
config RT2X00_LIB_PCI
|
||||
tristate
|
||||
select RT2X00_LIB
|
||||
|
||||
@@ -9,6 +9,7 @@ rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o
|
||||
rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS) += rt2x00leds.o
|
||||
|
||||
obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
|
||||
obj-$(CONFIG_RT2X00_LIB_MMIO) += rt2x00mmio.o
|
||||
obj-$(CONFIG_RT2X00_LIB_PCI) += rt2x00pci.o
|
||||
obj-$(CONFIG_RT2X00_LIB_SOC) += rt2x00soc.o
|
||||
obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00usb.o
|
||||
|
||||
@@ -34,13 +34,14 @@
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00mmio.h"
|
||||
#include "rt2x00pci.h"
|
||||
#include "rt2400pci.h"
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
* All access to the CSR registers will go through the methods
|
||||
* rt2x00pci_register_read and rt2x00pci_register_write.
|
||||
* rt2x00mmio_register_read and rt2x00mmio_register_write.
|
||||
* BBP and RF register require indirect register access,
|
||||
* and use the CSR registers BBPCSR and RFCSR to achieve this.
|
||||
* These indirect registers work with busy bits,
|
||||
@@ -51,9 +52,9 @@
|
||||
* and we will print an error.
|
||||
*/
|
||||
#define WAIT_FOR_BBP(__dev, __reg) \
|
||||
rt2x00pci_regbusy_read((__dev), BBPCSR, BBPCSR_BUSY, (__reg))
|
||||
rt2x00mmio_regbusy_read((__dev), BBPCSR, BBPCSR_BUSY, (__reg))
|
||||
#define WAIT_FOR_RF(__dev, __reg) \
|
||||
rt2x00pci_regbusy_read((__dev), RFCSR, RFCSR_BUSY, (__reg))
|
||||
rt2x00mmio_regbusy_read((__dev), RFCSR, RFCSR_BUSY, (__reg))
|
||||
|
||||
static void rt2400pci_bbp_write(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int word, const u8 value)
|
||||
@@ -73,7 +74,7 @@ static void rt2400pci_bbp_write(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, BBPCSR_BUSY, 1);
|
||||
rt2x00_set_field32(®, BBPCSR_WRITE_CONTROL, 1);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, BBPCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BBPCSR, reg);
|
||||
}
|
||||
|
||||
mutex_unlock(&rt2x00dev->csr_mutex);
|
||||
@@ -100,7 +101,7 @@ static void rt2400pci_bbp_read(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, BBPCSR_BUSY, 1);
|
||||
rt2x00_set_field32(®, BBPCSR_WRITE_CONTROL, 0);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, BBPCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BBPCSR, reg);
|
||||
|
||||
WAIT_FOR_BBP(rt2x00dev, ®);
|
||||
}
|
||||
@@ -128,7 +129,7 @@ static void rt2400pci_rf_write(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, RFCSR_IF_SELECT, 0);
|
||||
rt2x00_set_field32(®, RFCSR_BUSY, 1);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, RFCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RFCSR, reg);
|
||||
rt2x00_rf_write(rt2x00dev, word, value);
|
||||
}
|
||||
|
||||
@@ -140,7 +141,7 @@ static void rt2400pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
|
||||
struct rt2x00_dev *rt2x00dev = eeprom->data;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR21, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR21, ®);
|
||||
|
||||
eeprom->reg_data_in = !!rt2x00_get_field32(reg, CSR21_EEPROM_DATA_IN);
|
||||
eeprom->reg_data_out = !!rt2x00_get_field32(reg, CSR21_EEPROM_DATA_OUT);
|
||||
@@ -162,15 +163,15 @@ static void rt2400pci_eepromregister_write(struct eeprom_93cx6 *eeprom)
|
||||
rt2x00_set_field32(®, CSR21_EEPROM_CHIP_SELECT,
|
||||
!!eeprom->reg_chip_select);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, CSR21, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR21, reg);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RT2X00_LIB_DEBUGFS
|
||||
static const struct rt2x00debug rt2400pci_rt2x00debug = {
|
||||
.owner = THIS_MODULE,
|
||||
.csr = {
|
||||
.read = rt2x00pci_register_read,
|
||||
.write = rt2x00pci_register_write,
|
||||
.read = rt2x00mmio_register_read,
|
||||
.write = rt2x00mmio_register_write,
|
||||
.flags = RT2X00DEBUGFS_OFFSET,
|
||||
.word_base = CSR_REG_BASE,
|
||||
.word_size = sizeof(u32),
|
||||
@@ -204,7 +205,7 @@ static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
return rt2x00_get_field32(reg, GPIOCSR_VAL0);
|
||||
}
|
||||
|
||||
@@ -217,14 +218,14 @@ static void rt2400pci_brightness_set(struct led_classdev *led_cdev,
|
||||
unsigned int enabled = brightness != LED_OFF;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
rt2x00mmio_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
|
||||
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC)
|
||||
rt2x00_set_field32(®, LEDCSR_LINK, enabled);
|
||||
else if (led->type == LED_TYPE_ACTIVITY)
|
||||
rt2x00_set_field32(®, LEDCSR_ACTIVITY, enabled);
|
||||
|
||||
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
rt2x00mmio_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
}
|
||||
|
||||
static int rt2400pci_blink_set(struct led_classdev *led_cdev,
|
||||
@@ -235,10 +236,10 @@ static int rt2400pci_blink_set(struct led_classdev *led_cdev,
|
||||
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
rt2x00mmio_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
rt2x00_set_field32(®, LEDCSR_ON_PERIOD, *delay_on);
|
||||
rt2x00_set_field32(®, LEDCSR_OFF_PERIOD, *delay_off);
|
||||
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
rt2x00mmio_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -268,7 +269,7 @@ static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
||||
* Note that the version error will always be dropped
|
||||
* since there is no filter for it at this time.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_CRC,
|
||||
!(filter_flags & FIF_FCSFAIL));
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL,
|
||||
@@ -281,7 +282,7 @@ static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
||||
!(filter_flags & FIF_PROMISC_IN_BSS) &&
|
||||
!rt2x00dev->intf_ap_count);
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||
}
|
||||
|
||||
static void rt2400pci_config_intf(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -297,25 +298,26 @@ static void rt2400pci_config_intf(struct rt2x00_dev *rt2x00dev,
|
||||
* Enable beacon config
|
||||
*/
|
||||
bcn_preload = PREAMBLE + GET_DURATION(IEEE80211_HEADER, 20);
|
||||
rt2x00pci_register_read(rt2x00dev, BCNCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BCNCSR1, ®);
|
||||
rt2x00_set_field32(®, BCNCSR1_PRELOAD, bcn_preload);
|
||||
rt2x00pci_register_write(rt2x00dev, BCNCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BCNCSR1, reg);
|
||||
|
||||
/*
|
||||
* Enable synchronisation.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_SYNC, conf->sync);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
}
|
||||
|
||||
if (flags & CONFIG_UPDATE_MAC)
|
||||
rt2x00pci_register_multiwrite(rt2x00dev, CSR3,
|
||||
conf->mac, sizeof(conf->mac));
|
||||
rt2x00mmio_register_multiwrite(rt2x00dev, CSR3,
|
||||
conf->mac, sizeof(conf->mac));
|
||||
|
||||
if (flags & CONFIG_UPDATE_BSSID)
|
||||
rt2x00pci_register_multiwrite(rt2x00dev, CSR5,
|
||||
conf->bssid, sizeof(conf->bssid));
|
||||
rt2x00mmio_register_multiwrite(rt2x00dev, CSR5,
|
||||
conf->bssid,
|
||||
sizeof(conf->bssid));
|
||||
}
|
||||
|
||||
static void rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -331,68 +333,68 @@ static void rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev,
|
||||
if (changed & BSS_CHANGED_ERP_PREAMBLE) {
|
||||
preamble_mask = erp->short_preamble << 3;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR1, ®);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_TIMEOUT, 0x1ff);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_CONSUME_TIME, 0x13a);
|
||||
rt2x00_set_field32(®, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);
|
||||
rt2x00_set_field32(®, TXCSR1_AUTORESPONDER, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR1, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR2, ®);
|
||||
rt2x00_set_field32(®, ARCSR2_SIGNAL, 0x00);
|
||||
rt2x00_set_field32(®, ARCSR2_SERVICE, 0x04);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 10));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR2, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR3, ®);
|
||||
rt2x00_set_field32(®, ARCSR3_SIGNAL, 0x01 | preamble_mask);
|
||||
rt2x00_set_field32(®, ARCSR3_SERVICE, 0x04);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 20));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR3, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR3, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR4, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR4, ®);
|
||||
rt2x00_set_field32(®, ARCSR4_SIGNAL, 0x02 | preamble_mask);
|
||||
rt2x00_set_field32(®, ARCSR4_SERVICE, 0x04);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 55));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR4, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR4, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR5, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR5, ®);
|
||||
rt2x00_set_field32(®, ARCSR5_SIGNAL, 0x03 | preamble_mask);
|
||||
rt2x00_set_field32(®, ARCSR5_SERVICE, 0x84);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 110));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR5, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR5, reg);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES)
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR1, erp->basic_rates);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR1, erp->basic_rates);
|
||||
|
||||
if (changed & BSS_CHANGED_ERP_SLOT) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00_set_field32(®, CSR11_SLOT_TIME, erp->slot_time);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR11, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR18, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR18, ®);
|
||||
rt2x00_set_field32(®, CSR18_SIFS, erp->sifs);
|
||||
rt2x00_set_field32(®, CSR18_PIFS, erp->pifs);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR18, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR18, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR19, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR19, ®);
|
||||
rt2x00_set_field32(®, CSR19_DIFS, erp->difs);
|
||||
rt2x00_set_field32(®, CSR19_EIFS, erp->eifs);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR19, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR19, reg);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_INT) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR12, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR12, ®);
|
||||
rt2x00_set_field32(®, CSR12_BEACON_INTERVAL,
|
||||
erp->beacon_int * 16);
|
||||
rt2x00_set_field32(®, CSR12_CFP_MAX_DURATION,
|
||||
erp->beacon_int * 16);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR12, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR12, reg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -496,7 +498,7 @@ static void rt2400pci_config_channel(struct rt2x00_dev *rt2x00dev,
|
||||
/*
|
||||
* Clear false CRC during channel switch.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT0, &rf->rf1);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT0, &rf->rf1);
|
||||
}
|
||||
|
||||
static void rt2400pci_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower)
|
||||
@@ -509,12 +511,12 @@ static void rt2400pci_config_retry_limit(struct rt2x00_dev *rt2x00dev,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00_set_field32(®, CSR11_LONG_RETRY,
|
||||
libconf->conf->long_frame_max_tx_count);
|
||||
rt2x00_set_field32(®, CSR11_SHORT_RETRY,
|
||||
libconf->conf->short_frame_max_tx_count);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR11, reg);
|
||||
}
|
||||
|
||||
static void rt2400pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -526,7 +528,7 @@ static void rt2400pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
||||
u32 reg;
|
||||
|
||||
if (state == STATE_SLEEP) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00_set_field32(®, CSR20_DELAY_AFTER_TBCN,
|
||||
(rt2x00dev->beacon_int - 20) * 16);
|
||||
rt2x00_set_field32(®, CSR20_TBCN_BEFORE_WAKEUP,
|
||||
@@ -534,14 +536,14 @@ static void rt2400pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
/* We must first disable autowake before it can be enabled */
|
||||
rt2x00_set_field32(®, CSR20_AUTOWAKE, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR20, reg);
|
||||
|
||||
rt2x00_set_field32(®, CSR20_AUTOWAKE, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR20, reg);
|
||||
} else {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00_set_field32(®, CSR20_AUTOWAKE, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR20, reg);
|
||||
}
|
||||
|
||||
rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
||||
@@ -567,10 +569,10 @@ static void rt2400pci_config_cw(struct rt2x00_dev *rt2x00dev,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00_set_field32(®, CSR11_CWMIN, cw_min);
|
||||
rt2x00_set_field32(®, CSR11_CWMAX, cw_max);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR11, reg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -585,7 +587,7 @@ static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev,
|
||||
/*
|
||||
* Update FCS error count from register.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT0, ®);
|
||||
qual->rx_failed = rt2x00_get_field32(reg, CNT0_FCS_ERROR);
|
||||
|
||||
/*
|
||||
@@ -640,16 +642,16 @@ static void rt2400pci_start_queue(struct data_queue *queue)
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_RX:
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00_set_field32(®, RXCSR0_DISABLE_RX, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||
break;
|
||||
case QID_BEACON:
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
|
||||
rt2x00_set_field32(®, CSR14_TBCN, 1);
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -663,19 +665,19 @@ static void rt2400pci_kick_queue(struct data_queue *queue)
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_AC_VO:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_KICK_PRIO, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
case QID_AC_VI:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_KICK_TX, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
case QID_ATIM:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_KICK_ATIM, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -691,21 +693,21 @@ static void rt2400pci_stop_queue(struct data_queue *queue)
|
||||
case QID_AC_VO:
|
||||
case QID_AC_VI:
|
||||
case QID_ATIM:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_ABORT, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
case QID_RX:
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00_set_field32(®, RXCSR0_DISABLE_RX, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||
break;
|
||||
case QID_BEACON:
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_COUNT, 0);
|
||||
rt2x00_set_field32(®, CSR14_TBCN, 0);
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
/*
|
||||
* Wait for possibly running tbtt tasklets.
|
||||
@@ -722,7 +724,7 @@ static void rt2400pci_stop_queue(struct data_queue *queue)
|
||||
*/
|
||||
static bool rt2400pci_get_entry_state(struct queue_entry *entry)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
u32 word;
|
||||
|
||||
if (entry->queue->qid == QID_RX) {
|
||||
@@ -739,7 +741,7 @@ static bool rt2400pci_get_entry_state(struct queue_entry *entry)
|
||||
|
||||
static void rt2400pci_clear_entry(struct queue_entry *entry)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
u32 word;
|
||||
|
||||
@@ -765,53 +767,53 @@ static void rt2400pci_clear_entry(struct queue_entry *entry)
|
||||
|
||||
static int rt2400pci_init_queues(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
* Initialize registers.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR2, ®);
|
||||
rt2x00_set_field32(®, TXCSR2_TXD_SIZE, rt2x00dev->tx[0].desc_size);
|
||||
rt2x00_set_field32(®, TXCSR2_NUM_TXD, rt2x00dev->tx[1].limit);
|
||||
rt2x00_set_field32(®, TXCSR2_NUM_ATIM, rt2x00dev->atim->limit);
|
||||
rt2x00_set_field32(®, TXCSR2_NUM_PRIO, rt2x00dev->tx[0].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR2, reg);
|
||||
|
||||
entry_priv = rt2x00dev->tx[1].entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR3, ®);
|
||||
rt2x00_set_field32(®, TXCSR3_TX_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR3, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR3, reg);
|
||||
|
||||
entry_priv = rt2x00dev->tx[0].entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR5, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR5, ®);
|
||||
rt2x00_set_field32(®, TXCSR5_PRIO_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR5, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR5, reg);
|
||||
|
||||
entry_priv = rt2x00dev->atim->entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR4, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR4, ®);
|
||||
rt2x00_set_field32(®, TXCSR4_ATIM_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR4, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR4, reg);
|
||||
|
||||
entry_priv = rt2x00dev->bcn->entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR6, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR6, ®);
|
||||
rt2x00_set_field32(®, TXCSR6_BEACON_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR6, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR6, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR1, ®);
|
||||
rt2x00_set_field32(®, RXCSR1_RXD_SIZE, rt2x00dev->rx->desc_size);
|
||||
rt2x00_set_field32(®, RXCSR1_NUM_RXD, rt2x00dev->rx->limit);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR1, reg);
|
||||
|
||||
entry_priv = rt2x00dev->rx->entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR2, ®);
|
||||
rt2x00_set_field32(®, RXCSR2_RX_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR2, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -820,23 +822,23 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR0, 0x00020002);
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR1, 0x00000002);
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR2, 0x00023f20);
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR3, 0x00000002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR0, 0x00020002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR1, 0x00000002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR2, 0x00023f20);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR3, 0x00000002);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TIMECSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TIMECSR, ®);
|
||||
rt2x00_set_field32(®, TIMECSR_US_COUNT, 33);
|
||||
rt2x00_set_field32(®, TIMECSR_US_64_COUNT, 63);
|
||||
rt2x00_set_field32(®, TIMECSR_BEACON_EXPECT, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TIMECSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TIMECSR, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR9, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR9, ®);
|
||||
rt2x00_set_field32(®, CSR9_MAX_FRAME_UNIT,
|
||||
(rt2x00dev->rx->data_size / 128));
|
||||
rt2x00pci_register_write(rt2x00dev, CSR9, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR9, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_COUNT, 0);
|
||||
rt2x00_set_field32(®, CSR14_TSF_SYNC, 0);
|
||||
rt2x00_set_field32(®, CSR14_TBCN, 0);
|
||||
@@ -845,63 +847,63 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
|
||||
rt2x00_set_field32(®, CSR14_CFP_COUNT_PRELOAD, 0);
|
||||
rt2x00_set_field32(®, CSR14_TBCM_PRELOAD, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000);
|
||||
rt2x00mmio_register_write(rt2x00dev, CNT3, 0x3f080000);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR0, ®);
|
||||
rt2x00_set_field32(®, ARCSR0_AR_BBP_DATA0, 133);
|
||||
rt2x00_set_field32(®, ARCSR0_AR_BBP_ID0, 134);
|
||||
rt2x00_set_field32(®, ARCSR0_AR_BBP_DATA1, 136);
|
||||
rt2x00_set_field32(®, ARCSR0_AR_BBP_ID1, 135);
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR0, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR3, ®);
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID0, 3); /* Tx power.*/
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID0_VALID, 1);
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID1, 32); /* Signal */
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID1_VALID, 1);
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID2, 36); /* Rssi */
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID2_VALID, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR3, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR3, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);
|
||||
|
||||
if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
|
||||
return -EBUSY;
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00217223);
|
||||
rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518);
|
||||
rt2x00mmio_register_write(rt2x00dev, MACCSR0, 0x00217223);
|
||||
rt2x00mmio_register_write(rt2x00dev, MACCSR1, 0x00235518);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, MACCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, MACCSR2, ®);
|
||||
rt2x00_set_field32(®, MACCSR2_DELAY, 64);
|
||||
rt2x00pci_register_write(rt2x00dev, MACCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, MACCSR2, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, RALINKCSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RALINKCSR, ®);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_DATA0, 17);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_ID0, 154);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_DATA1, 0);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_ID1, 154);
|
||||
rt2x00pci_register_write(rt2x00dev, RALINKCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RALINKCSR, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00_set_field32(®, CSR1_SOFT_RESET, 1);
|
||||
rt2x00_set_field32(®, CSR1_BBP_RESET, 0);
|
||||
rt2x00_set_field32(®, CSR1_HOST_READY, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR1, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00_set_field32(®, CSR1_SOFT_RESET, 0);
|
||||
rt2x00_set_field32(®, CSR1_HOST_READY, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR1, reg);
|
||||
|
||||
/*
|
||||
* We must clear the FCS and FIFO error count.
|
||||
* These registers are cleared on read,
|
||||
* so we may pass a useless variable to store the value.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT0, ®);
|
||||
rt2x00pci_register_read(rt2x00dev, CNT4, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT4, ®);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -918,7 +920,7 @@ static int rt2400pci_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
|
||||
rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@@ -975,8 +977,8 @@ static void rt2400pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
|
||||
* should clear the register to assure a clean state.
|
||||
*/
|
||||
if (state == STATE_RADIO_IRQ_ON) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR7, reg);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR7, reg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -985,13 +987,13 @@ static void rt2400pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00_set_field32(®, CSR8_TBCN_EXPIRE, mask);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_TXRING, mask);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_ATIMRING, mask);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_PRIORING, mask);
|
||||
rt2x00_set_field32(®, CSR8_RXDONE, mask);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
|
||||
|
||||
@@ -1024,7 +1026,7 @@ static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||
/*
|
||||
* Disable power
|
||||
*/
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR0, 0);
|
||||
}
|
||||
|
||||
static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -1038,12 +1040,12 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
put_to_sleep = (state != STATE_AWAKE);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, PWRCSR1, ®);
|
||||
rt2x00_set_field32(®, PWRCSR1_SET_STATE, 1);
|
||||
rt2x00_set_field32(®, PWRCSR1_BBP_DESIRE_STATE, state);
|
||||
rt2x00_set_field32(®, PWRCSR1_RF_DESIRE_STATE, state);
|
||||
rt2x00_set_field32(®, PWRCSR1_PUT_TO_SLEEP, put_to_sleep);
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
|
||||
/*
|
||||
* Device is not guaranteed to be in the requested state yet.
|
||||
@@ -1051,12 +1053,12 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
* device has entered the correct state.
|
||||
*/
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||
rt2x00mmio_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||
bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
|
||||
rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
|
||||
if (bbp_state == state && rf_state == state)
|
||||
return 0;
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
@@ -1091,8 +1093,8 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (unlikely(retval))
|
||||
ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
|
||||
state, retval);
|
||||
rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
|
||||
state, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -1104,7 +1106,7 @@ static void rt2400pci_write_tx_desc(struct queue_entry *entry,
|
||||
struct txentry_desc *txdesc)
|
||||
{
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
__le32 *txd = entry_priv->desc;
|
||||
u32 word;
|
||||
|
||||
@@ -1181,12 +1183,18 @@ static void rt2400pci_write_beacon(struct queue_entry *entry,
|
||||
* Disable beaconing while we are reloading the beacon data,
|
||||
* otherwise we might be sending out invalid data.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
rt2x00queue_map_txskb(entry);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
if (rt2x00queue_map_txskb(entry)) {
|
||||
rt2x00_err(rt2x00dev, "Fail to map beacon, aborting\n");
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* Enable beaconing again.
|
||||
*/
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
|
||||
/*
|
||||
* Write the TX descriptor for the beacon.
|
||||
*/
|
||||
@@ -1196,12 +1204,12 @@ static void rt2400pci_write_beacon(struct queue_entry *entry,
|
||||
* Dump beacon to userspace through debugfs.
|
||||
*/
|
||||
rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb);
|
||||
|
||||
out:
|
||||
/*
|
||||
* Enable beaconing again.
|
||||
*/
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1211,7 +1219,7 @@ static void rt2400pci_fill_rxdone(struct queue_entry *entry,
|
||||
struct rxdone_entry_desc *rxdesc)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
u32 word0;
|
||||
u32 word2;
|
||||
u32 word3;
|
||||
@@ -1269,7 +1277,7 @@ static void rt2400pci_txdone(struct rt2x00_dev *rt2x00dev,
|
||||
const enum data_queue_qid queue_idx)
|
||||
{
|
||||
struct data_queue *queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
struct queue_entry *entry;
|
||||
struct txdone_entry_desc txdesc;
|
||||
u32 word;
|
||||
@@ -1315,9 +1323,9 @@ static inline void rt2400pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
spin_lock_irq(&rt2x00dev->irqmask_lock);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00_set_field32(®, irq_field, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock_irq(&rt2x00dev->irqmask_lock);
|
||||
}
|
||||
@@ -1340,11 +1348,11 @@ static void rt2400pci_txstatus_tasklet(unsigned long data)
|
||||
if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) {
|
||||
spin_lock_irq(&rt2x00dev->irqmask_lock);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_TXRING, 0);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_ATIMRING, 0);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_PRIORING, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock_irq(&rt2x00dev->irqmask_lock);
|
||||
}
|
||||
@@ -1361,7 +1369,7 @@ static void rt2400pci_tbtt_tasklet(unsigned long data)
|
||||
static void rt2400pci_rxdone_tasklet(unsigned long data)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||
if (rt2x00pci_rxdone(rt2x00dev))
|
||||
if (rt2x00mmio_rxdone(rt2x00dev))
|
||||
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
|
||||
else if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
rt2400pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
|
||||
@@ -1376,8 +1384,8 @@ static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
|
||||
* Get the interrupt sources & saved to local variable.
|
||||
* Write register value back to clear pending interrupts.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR7, reg);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR7, reg);
|
||||
|
||||
if (!reg)
|
||||
return IRQ_NONE;
|
||||
@@ -1414,9 +1422,9 @@ static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
|
||||
*/
|
||||
spin_lock(&rt2x00dev->irqmask_lock);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
reg |= mask;
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock(&rt2x00dev->irqmask_lock);
|
||||
|
||||
@@ -1435,7 +1443,7 @@ static int rt2400pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
u16 word;
|
||||
u8 *mac;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR21, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR21, ®);
|
||||
|
||||
eeprom.data = rt2x00dev;
|
||||
eeprom.register_read = rt2400pci_eepromregister_read;
|
||||
@@ -1456,12 +1464,12 @@ static int rt2400pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
EEPROM(rt2x00dev, "MAC: %pM\n", mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
if (word == 0xffff) {
|
||||
ERROR(rt2x00dev, "Invalid EEPROM data detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid EEPROM data detected\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1483,12 +1491,12 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Identify RF chipset.
|
||||
*/
|
||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
|
||||
rt2x00pci_register_read(rt2x00dev, CSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR0, ®);
|
||||
rt2x00_set_chip(rt2x00dev, RT2460, value,
|
||||
rt2x00_get_field32(reg, CSR0_REVISION));
|
||||
|
||||
if (!rt2x00_rf(rt2x00dev, RF2420) && !rt2x00_rf(rt2x00dev, RF2421)) {
|
||||
ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid RF chipset detected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1628,9 +1636,9 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
* Enable rfkill polling by setting GPIO direction of the
|
||||
* rfkill switch GPIO pin correctly.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
rt2x00_set_field32(®, GPIOCSR_DIR0, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, GPIOCSR, reg);
|
||||
|
||||
/*
|
||||
* Initialize hw specifications.
|
||||
@@ -1690,9 +1698,9 @@ static u64 rt2400pci_get_tsf(struct ieee80211_hw *hw,
|
||||
u64 tsf;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR17, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR17, ®);
|
||||
tsf = (u64) rt2x00_get_field32(reg, CSR17_HIGH_TSFTIMER) << 32;
|
||||
rt2x00pci_register_read(rt2x00dev, CSR16, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR16, ®);
|
||||
tsf |= rt2x00_get_field32(reg, CSR16_LOW_TSFTIMER);
|
||||
|
||||
return tsf;
|
||||
@@ -1703,7 +1711,7 @@ static int rt2400pci_tx_last_beacon(struct ieee80211_hw *hw)
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR15, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR15, ®);
|
||||
return rt2x00_get_field32(reg, CSR15_BEACON_SENT);
|
||||
}
|
||||
|
||||
@@ -1736,8 +1744,8 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
|
||||
.tbtt_tasklet = rt2400pci_tbtt_tasklet,
|
||||
.rxdone_tasklet = rt2400pci_rxdone_tasklet,
|
||||
.probe_hw = rt2400pci_probe_hw,
|
||||
.initialize = rt2x00pci_initialize,
|
||||
.uninitialize = rt2x00pci_uninitialize,
|
||||
.initialize = rt2x00mmio_initialize,
|
||||
.uninitialize = rt2x00mmio_uninitialize,
|
||||
.get_entry_state = rt2400pci_get_entry_state,
|
||||
.clear_entry = rt2400pci_clear_entry,
|
||||
.set_device_state = rt2400pci_set_device_state,
|
||||
@@ -1748,7 +1756,7 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
|
||||
.start_queue = rt2400pci_start_queue,
|
||||
.kick_queue = rt2400pci_kick_queue,
|
||||
.stop_queue = rt2400pci_stop_queue,
|
||||
.flush_queue = rt2x00pci_flush_queue,
|
||||
.flush_queue = rt2x00mmio_flush_queue,
|
||||
.write_tx_desc = rt2400pci_write_tx_desc,
|
||||
.write_beacon = rt2400pci_write_beacon,
|
||||
.fill_rxdone = rt2400pci_fill_rxdone,
|
||||
@@ -1763,28 +1771,28 @@ static const struct data_queue_desc rt2400pci_queue_rx = {
|
||||
.entry_num = 24,
|
||||
.data_size = DATA_FRAME_SIZE,
|
||||
.desc_size = RXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2400pci_queue_tx = {
|
||||
.entry_num = 24,
|
||||
.data_size = DATA_FRAME_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2400pci_queue_bcn = {
|
||||
.entry_num = 1,
|
||||
.data_size = MGMT_FRAME_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2400pci_queue_atim = {
|
||||
.entry_num = 8,
|
||||
.data_size = DATA_FRAME_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct rt2x00_ops rt2400pci_ops = {
|
||||
|
||||
@@ -34,13 +34,14 @@
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00mmio.h"
|
||||
#include "rt2x00pci.h"
|
||||
#include "rt2500pci.h"
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
* All access to the CSR registers will go through the methods
|
||||
* rt2x00pci_register_read and rt2x00pci_register_write.
|
||||
* rt2x00mmio_register_read and rt2x00mmio_register_write.
|
||||
* BBP and RF register require indirect register access,
|
||||
* and use the CSR registers BBPCSR and RFCSR to achieve this.
|
||||
* These indirect registers work with busy bits,
|
||||
@@ -51,9 +52,9 @@
|
||||
* and we will print an error.
|
||||
*/
|
||||
#define WAIT_FOR_BBP(__dev, __reg) \
|
||||
rt2x00pci_regbusy_read((__dev), BBPCSR, BBPCSR_BUSY, (__reg))
|
||||
rt2x00mmio_regbusy_read((__dev), BBPCSR, BBPCSR_BUSY, (__reg))
|
||||
#define WAIT_FOR_RF(__dev, __reg) \
|
||||
rt2x00pci_regbusy_read((__dev), RFCSR, RFCSR_BUSY, (__reg))
|
||||
rt2x00mmio_regbusy_read((__dev), RFCSR, RFCSR_BUSY, (__reg))
|
||||
|
||||
static void rt2500pci_bbp_write(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int word, const u8 value)
|
||||
@@ -73,7 +74,7 @@ static void rt2500pci_bbp_write(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, BBPCSR_BUSY, 1);
|
||||
rt2x00_set_field32(®, BBPCSR_WRITE_CONTROL, 1);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, BBPCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BBPCSR, reg);
|
||||
}
|
||||
|
||||
mutex_unlock(&rt2x00dev->csr_mutex);
|
||||
@@ -100,7 +101,7 @@ static void rt2500pci_bbp_read(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, BBPCSR_BUSY, 1);
|
||||
rt2x00_set_field32(®, BBPCSR_WRITE_CONTROL, 0);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, BBPCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BBPCSR, reg);
|
||||
|
||||
WAIT_FOR_BBP(rt2x00dev, ®);
|
||||
}
|
||||
@@ -128,7 +129,7 @@ static void rt2500pci_rf_write(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, RFCSR_IF_SELECT, 0);
|
||||
rt2x00_set_field32(®, RFCSR_BUSY, 1);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, RFCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RFCSR, reg);
|
||||
rt2x00_rf_write(rt2x00dev, word, value);
|
||||
}
|
||||
|
||||
@@ -140,7 +141,7 @@ static void rt2500pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
|
||||
struct rt2x00_dev *rt2x00dev = eeprom->data;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR21, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR21, ®);
|
||||
|
||||
eeprom->reg_data_in = !!rt2x00_get_field32(reg, CSR21_EEPROM_DATA_IN);
|
||||
eeprom->reg_data_out = !!rt2x00_get_field32(reg, CSR21_EEPROM_DATA_OUT);
|
||||
@@ -162,15 +163,15 @@ static void rt2500pci_eepromregister_write(struct eeprom_93cx6 *eeprom)
|
||||
rt2x00_set_field32(®, CSR21_EEPROM_CHIP_SELECT,
|
||||
!!eeprom->reg_chip_select);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, CSR21, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR21, reg);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RT2X00_LIB_DEBUGFS
|
||||
static const struct rt2x00debug rt2500pci_rt2x00debug = {
|
||||
.owner = THIS_MODULE,
|
||||
.csr = {
|
||||
.read = rt2x00pci_register_read,
|
||||
.write = rt2x00pci_register_write,
|
||||
.read = rt2x00mmio_register_read,
|
||||
.write = rt2x00mmio_register_write,
|
||||
.flags = RT2X00DEBUGFS_OFFSET,
|
||||
.word_base = CSR_REG_BASE,
|
||||
.word_size = sizeof(u32),
|
||||
@@ -204,7 +205,7 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
return rt2x00_get_field32(reg, GPIOCSR_VAL0);
|
||||
}
|
||||
|
||||
@@ -217,14 +218,14 @@ static void rt2500pci_brightness_set(struct led_classdev *led_cdev,
|
||||
unsigned int enabled = brightness != LED_OFF;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
rt2x00mmio_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
|
||||
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC)
|
||||
rt2x00_set_field32(®, LEDCSR_LINK, enabled);
|
||||
else if (led->type == LED_TYPE_ACTIVITY)
|
||||
rt2x00_set_field32(®, LEDCSR_ACTIVITY, enabled);
|
||||
|
||||
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
rt2x00mmio_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
}
|
||||
|
||||
static int rt2500pci_blink_set(struct led_classdev *led_cdev,
|
||||
@@ -235,10 +236,10 @@ static int rt2500pci_blink_set(struct led_classdev *led_cdev,
|
||||
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
rt2x00mmio_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||
rt2x00_set_field32(®, LEDCSR_ON_PERIOD, *delay_on);
|
||||
rt2x00_set_field32(®, LEDCSR_OFF_PERIOD, *delay_off);
|
||||
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
rt2x00mmio_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -269,7 +270,7 @@ static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
||||
* and broadcast frames will always be accepted since
|
||||
* there is no filter for it at this time.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_CRC,
|
||||
!(filter_flags & FIF_FCSFAIL));
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL,
|
||||
@@ -285,7 +286,7 @@ static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_MCAST,
|
||||
!(filter_flags & FIF_ALLMULTI));
|
||||
rt2x00_set_field32(®, RXCSR0_DROP_BCAST, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||
}
|
||||
|
||||
static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -302,25 +303,25 @@ static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev,
|
||||
* Enable beacon config
|
||||
*/
|
||||
bcn_preload = PREAMBLE + GET_DURATION(IEEE80211_HEADER, 20);
|
||||
rt2x00pci_register_read(rt2x00dev, BCNCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BCNCSR1, ®);
|
||||
rt2x00_set_field32(®, BCNCSR1_PRELOAD, bcn_preload);
|
||||
rt2x00_set_field32(®, BCNCSR1_BEACON_CWMIN, queue->cw_min);
|
||||
rt2x00pci_register_write(rt2x00dev, BCNCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BCNCSR1, reg);
|
||||
|
||||
/*
|
||||
* Enable synchronisation.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_SYNC, conf->sync);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
}
|
||||
|
||||
if (flags & CONFIG_UPDATE_MAC)
|
||||
rt2x00pci_register_multiwrite(rt2x00dev, CSR3,
|
||||
rt2x00mmio_register_multiwrite(rt2x00dev, CSR3,
|
||||
conf->mac, sizeof(conf->mac));
|
||||
|
||||
if (flags & CONFIG_UPDATE_BSSID)
|
||||
rt2x00pci_register_multiwrite(rt2x00dev, CSR5,
|
||||
rt2x00mmio_register_multiwrite(rt2x00dev, CSR5,
|
||||
conf->bssid, sizeof(conf->bssid));
|
||||
}
|
||||
|
||||
@@ -337,68 +338,68 @@ static void rt2500pci_config_erp(struct rt2x00_dev *rt2x00dev,
|
||||
if (changed & BSS_CHANGED_ERP_PREAMBLE) {
|
||||
preamble_mask = erp->short_preamble << 3;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR1, ®);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_TIMEOUT, 0x162);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_CONSUME_TIME, 0xa2);
|
||||
rt2x00_set_field32(®, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);
|
||||
rt2x00_set_field32(®, TXCSR1_AUTORESPONDER, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR1, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR2, ®);
|
||||
rt2x00_set_field32(®, ARCSR2_SIGNAL, 0x00);
|
||||
rt2x00_set_field32(®, ARCSR2_SERVICE, 0x04);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 10));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR2, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR3, ®);
|
||||
rt2x00_set_field32(®, ARCSR3_SIGNAL, 0x01 | preamble_mask);
|
||||
rt2x00_set_field32(®, ARCSR3_SERVICE, 0x04);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 20));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR3, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR3, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR4, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR4, ®);
|
||||
rt2x00_set_field32(®, ARCSR4_SIGNAL, 0x02 | preamble_mask);
|
||||
rt2x00_set_field32(®, ARCSR4_SERVICE, 0x04);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 55));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR4, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR4, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARCSR5, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARCSR5, ®);
|
||||
rt2x00_set_field32(®, ARCSR5_SIGNAL, 0x03 | preamble_mask);
|
||||
rt2x00_set_field32(®, ARCSR5_SERVICE, 0x84);
|
||||
rt2x00_set_field32(®, ARCSR2_LENGTH,
|
||||
GET_DURATION(ACK_SIZE, 110));
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR5, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR5, reg);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES)
|
||||
rt2x00pci_register_write(rt2x00dev, ARCSR1, erp->basic_rates);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARCSR1, erp->basic_rates);
|
||||
|
||||
if (changed & BSS_CHANGED_ERP_SLOT) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00_set_field32(®, CSR11_SLOT_TIME, erp->slot_time);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR11, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR18, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR18, ®);
|
||||
rt2x00_set_field32(®, CSR18_SIFS, erp->sifs);
|
||||
rt2x00_set_field32(®, CSR18_PIFS, erp->pifs);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR18, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR18, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR19, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR19, ®);
|
||||
rt2x00_set_field32(®, CSR19_DIFS, erp->difs);
|
||||
rt2x00_set_field32(®, CSR19_EIFS, erp->eifs);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR19, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR19, reg);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_INT) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR12, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR12, ®);
|
||||
rt2x00_set_field32(®, CSR12_BEACON_INTERVAL,
|
||||
erp->beacon_int * 16);
|
||||
rt2x00_set_field32(®, CSR12_CFP_MAX_DURATION,
|
||||
erp->beacon_int * 16);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR12, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR12, reg);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -417,7 +418,7 @@ static void rt2500pci_config_ant(struct rt2x00_dev *rt2x00dev,
|
||||
BUG_ON(ant->rx == ANTENNA_SW_DIVERSITY ||
|
||||
ant->tx == ANTENNA_SW_DIVERSITY);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, BBPCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BBPCSR1, ®);
|
||||
rt2500pci_bbp_read(rt2x00dev, 14, &r14);
|
||||
rt2500pci_bbp_read(rt2x00dev, 2, &r2);
|
||||
|
||||
@@ -469,7 +470,7 @@ static void rt2500pci_config_ant(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, BBPCSR1_OFDM_FLIP, 0);
|
||||
}
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, BBPCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BBPCSR1, reg);
|
||||
rt2500pci_bbp_write(rt2x00dev, 14, r14);
|
||||
rt2500pci_bbp_write(rt2x00dev, 2, r2);
|
||||
}
|
||||
@@ -540,7 +541,7 @@ static void rt2500pci_config_channel(struct rt2x00_dev *rt2x00dev,
|
||||
/*
|
||||
* Clear false CRC during channel switch.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT0, &rf->rf1);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT0, &rf->rf1);
|
||||
}
|
||||
|
||||
static void rt2500pci_config_txpower(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -558,12 +559,12 @@ static void rt2500pci_config_retry_limit(struct rt2x00_dev *rt2x00dev,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00_set_field32(®, CSR11_LONG_RETRY,
|
||||
libconf->conf->long_frame_max_tx_count);
|
||||
rt2x00_set_field32(®, CSR11_SHORT_RETRY,
|
||||
libconf->conf->short_frame_max_tx_count);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR11, reg);
|
||||
}
|
||||
|
||||
static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -575,7 +576,7 @@ static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
||||
u32 reg;
|
||||
|
||||
if (state == STATE_SLEEP) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00_set_field32(®, CSR20_DELAY_AFTER_TBCN,
|
||||
(rt2x00dev->beacon_int - 20) * 16);
|
||||
rt2x00_set_field32(®, CSR20_TBCN_BEFORE_WAKEUP,
|
||||
@@ -583,14 +584,14 @@ static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
/* We must first disable autowake before it can be enabled */
|
||||
rt2x00_set_field32(®, CSR20_AUTOWAKE, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR20, reg);
|
||||
|
||||
rt2x00_set_field32(®, CSR20_AUTOWAKE, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR20, reg);
|
||||
} else {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR20, ®);
|
||||
rt2x00_set_field32(®, CSR20_AUTOWAKE, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR20, reg);
|
||||
}
|
||||
|
||||
rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
||||
@@ -624,13 +625,13 @@ static void rt2500pci_link_stats(struct rt2x00_dev *rt2x00dev,
|
||||
/*
|
||||
* Update FCS error count from register.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT0, ®);
|
||||
qual->rx_failed = rt2x00_get_field32(reg, CNT0_FCS_ERROR);
|
||||
|
||||
/*
|
||||
* Update False CCA count from register.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT3, ®);
|
||||
qual->false_cca = rt2x00_get_field32(reg, CNT3_FALSE_CCA);
|
||||
}
|
||||
|
||||
@@ -730,16 +731,16 @@ static void rt2500pci_start_queue(struct data_queue *queue)
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_RX:
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00_set_field32(®, RXCSR0_DISABLE_RX, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||
break;
|
||||
case QID_BEACON:
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
|
||||
rt2x00_set_field32(®, CSR14_TBCN, 1);
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -753,19 +754,19 @@ static void rt2500pci_kick_queue(struct data_queue *queue)
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_AC_VO:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_KICK_PRIO, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
case QID_AC_VI:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_KICK_TX, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
case QID_ATIM:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_KICK_ATIM, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -781,21 +782,21 @@ static void rt2500pci_stop_queue(struct data_queue *queue)
|
||||
case QID_AC_VO:
|
||||
case QID_AC_VI:
|
||||
case QID_ATIM:
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
|
||||
rt2x00_set_field32(®, TXCSR0_ABORT, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
|
||||
break;
|
||||
case QID_RX:
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®);
|
||||
rt2x00_set_field32(®, RXCSR0_DISABLE_RX, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||
break;
|
||||
case QID_BEACON:
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_COUNT, 0);
|
||||
rt2x00_set_field32(®, CSR14_TBCN, 0);
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
/*
|
||||
* Wait for possibly running tbtt tasklets.
|
||||
@@ -812,7 +813,7 @@ static void rt2500pci_stop_queue(struct data_queue *queue)
|
||||
*/
|
||||
static bool rt2500pci_get_entry_state(struct queue_entry *entry)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
u32 word;
|
||||
|
||||
if (entry->queue->qid == QID_RX) {
|
||||
@@ -829,7 +830,7 @@ static bool rt2500pci_get_entry_state(struct queue_entry *entry)
|
||||
|
||||
static void rt2500pci_clear_entry(struct queue_entry *entry)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
u32 word;
|
||||
|
||||
@@ -851,53 +852,53 @@ static void rt2500pci_clear_entry(struct queue_entry *entry)
|
||||
|
||||
static int rt2500pci_init_queues(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
* Initialize registers.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR2, ®);
|
||||
rt2x00_set_field32(®, TXCSR2_TXD_SIZE, rt2x00dev->tx[0].desc_size);
|
||||
rt2x00_set_field32(®, TXCSR2_NUM_TXD, rt2x00dev->tx[1].limit);
|
||||
rt2x00_set_field32(®, TXCSR2_NUM_ATIM, rt2x00dev->atim->limit);
|
||||
rt2x00_set_field32(®, TXCSR2_NUM_PRIO, rt2x00dev->tx[0].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR2, reg);
|
||||
|
||||
entry_priv = rt2x00dev->tx[1].entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR3, ®);
|
||||
rt2x00_set_field32(®, TXCSR3_TX_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR3, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR3, reg);
|
||||
|
||||
entry_priv = rt2x00dev->tx[0].entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR5, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR5, ®);
|
||||
rt2x00_set_field32(®, TXCSR5_PRIO_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR5, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR5, reg);
|
||||
|
||||
entry_priv = rt2x00dev->atim->entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR4, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR4, ®);
|
||||
rt2x00_set_field32(®, TXCSR4_ATIM_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR4, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR4, reg);
|
||||
|
||||
entry_priv = rt2x00dev->bcn->entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR6, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR6, ®);
|
||||
rt2x00_set_field32(®, TXCSR6_BEACON_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR6, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR6, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR1, ®);
|
||||
rt2x00_set_field32(®, RXCSR1_RXD_SIZE, rt2x00dev->rx->desc_size);
|
||||
rt2x00_set_field32(®, RXCSR1_NUM_RXD, rt2x00dev->rx->limit);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR1, reg);
|
||||
|
||||
entry_priv = rt2x00dev->rx->entries[0].priv_data;
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR2, ®);
|
||||
rt2x00_set_field32(®, RXCSR2_RX_RING_REGISTER,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR2, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -906,30 +907,30 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR0, 0x00020002);
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR1, 0x00000002);
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR2, 0x00020002);
|
||||
rt2x00pci_register_write(rt2x00dev, PSCSR3, 0x00000002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR0, 0x00020002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR1, 0x00000002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR2, 0x00020002);
|
||||
rt2x00mmio_register_write(rt2x00dev, PSCSR3, 0x00000002);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TIMECSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TIMECSR, ®);
|
||||
rt2x00_set_field32(®, TIMECSR_US_COUNT, 33);
|
||||
rt2x00_set_field32(®, TIMECSR_US_64_COUNT, 63);
|
||||
rt2x00_set_field32(®, TIMECSR_BEACON_EXPECT, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TIMECSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TIMECSR, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR9, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR9, ®);
|
||||
rt2x00_set_field32(®, CSR9_MAX_FRAME_UNIT,
|
||||
rt2x00dev->rx->data_size / 128);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR9, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR9, reg);
|
||||
|
||||
/*
|
||||
* Always use CWmin and CWmax set in descriptor.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR11, ®);
|
||||
rt2x00_set_field32(®, CSR11_CW_SELECT, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR11, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_TSF_COUNT, 0);
|
||||
rt2x00_set_field32(®, CSR14_TSF_SYNC, 0);
|
||||
rt2x00_set_field32(®, CSR14_TBCN, 0);
|
||||
@@ -938,11 +939,11 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
|
||||
rt2x00_set_field32(®, CSR14_CFP_COUNT_PRELOAD, 0);
|
||||
rt2x00_set_field32(®, CSR14_TBCM_PRELOAD, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, CNT3, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, CNT3, 0);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, TXCSR8, ®);
|
||||
rt2x00_set_field32(®, TXCSR8_BBP_ID0, 10);
|
||||
rt2x00_set_field32(®, TXCSR8_BBP_ID0_VALID, 1);
|
||||
rt2x00_set_field32(®, TXCSR8_BBP_ID1, 11);
|
||||
@@ -951,30 +952,30 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, TXCSR8_BBP_ID2_VALID, 1);
|
||||
rt2x00_set_field32(®, TXCSR8_BBP_ID3, 12);
|
||||
rt2x00_set_field32(®, TXCSR8_BBP_ID3_VALID, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXCSR8, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARTCSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARTCSR0, ®);
|
||||
rt2x00_set_field32(®, ARTCSR0_ACK_CTS_1MBS, 112);
|
||||
rt2x00_set_field32(®, ARTCSR0_ACK_CTS_2MBS, 56);
|
||||
rt2x00_set_field32(®, ARTCSR0_ACK_CTS_5_5MBS, 20);
|
||||
rt2x00_set_field32(®, ARTCSR0_ACK_CTS_11MBS, 10);
|
||||
rt2x00pci_register_write(rt2x00dev, ARTCSR0, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARTCSR0, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARTCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARTCSR1, ®);
|
||||
rt2x00_set_field32(®, ARTCSR1_ACK_CTS_6MBS, 45);
|
||||
rt2x00_set_field32(®, ARTCSR1_ACK_CTS_9MBS, 37);
|
||||
rt2x00_set_field32(®, ARTCSR1_ACK_CTS_12MBS, 33);
|
||||
rt2x00_set_field32(®, ARTCSR1_ACK_CTS_18MBS, 29);
|
||||
rt2x00pci_register_write(rt2x00dev, ARTCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARTCSR1, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, ARTCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, ARTCSR2, ®);
|
||||
rt2x00_set_field32(®, ARTCSR2_ACK_CTS_24MBS, 29);
|
||||
rt2x00_set_field32(®, ARTCSR2_ACK_CTS_36MBS, 25);
|
||||
rt2x00_set_field32(®, ARTCSR2_ACK_CTS_48MBS, 25);
|
||||
rt2x00_set_field32(®, ARTCSR2_ACK_CTS_54MBS, 25);
|
||||
rt2x00pci_register_write(rt2x00dev, ARTCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, ARTCSR2, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, RXCSR3, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RXCSR3, ®);
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID0, 47); /* CCK Signal */
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID0_VALID, 1);
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID1, 51); /* Rssi */
|
||||
@@ -983,9 +984,9 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID2_VALID, 1);
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID3, 51); /* RSSI */
|
||||
rt2x00_set_field32(®, RXCSR3_BBP_ID3_VALID, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RXCSR3, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RXCSR3, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, PCICSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, PCICSR, ®);
|
||||
rt2x00_set_field32(®, PCICSR_BIG_ENDIAN, 0);
|
||||
rt2x00_set_field32(®, PCICSR_RX_TRESHOLD, 0);
|
||||
rt2x00_set_field32(®, PCICSR_TX_TRESHOLD, 3);
|
||||
@@ -993,54 +994,54 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, PCICSR_ENABLE_CLK, 1);
|
||||
rt2x00_set_field32(®, PCICSR_READ_MULTIPLE, 1);
|
||||
rt2x00_set_field32(®, PCICSR_WRITE_INVALID, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, PCICSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, PCICSR, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, GPIOCSR, 0x0000ff00);
|
||||
rt2x00pci_register_write(rt2x00dev, TESTCSR, 0x000000f0);
|
||||
rt2x00mmio_register_write(rt2x00dev, GPIOCSR, 0x0000ff00);
|
||||
rt2x00mmio_register_write(rt2x00dev, TESTCSR, 0x000000f0);
|
||||
|
||||
if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
|
||||
return -EBUSY;
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00213223);
|
||||
rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518);
|
||||
rt2x00mmio_register_write(rt2x00dev, MACCSR0, 0x00213223);
|
||||
rt2x00mmio_register_write(rt2x00dev, MACCSR1, 0x00235518);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, MACCSR2, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, MACCSR2, ®);
|
||||
rt2x00_set_field32(®, MACCSR2_DELAY, 64);
|
||||
rt2x00pci_register_write(rt2x00dev, MACCSR2, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, MACCSR2, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, RALINKCSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, RALINKCSR, ®);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_DATA0, 17);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_ID0, 26);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_VALID0, 1);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_DATA1, 0);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_ID1, 26);
|
||||
rt2x00_set_field32(®, RALINKCSR_AR_BBP_VALID1, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RALINKCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, RALINKCSR, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, BBPCSR1, 0x82188200);
|
||||
rt2x00mmio_register_write(rt2x00dev, BBPCSR1, 0x82188200);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, TXACKCSR0, 0x00000020);
|
||||
rt2x00mmio_register_write(rt2x00dev, TXACKCSR0, 0x00000020);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00_set_field32(®, CSR1_SOFT_RESET, 1);
|
||||
rt2x00_set_field32(®, CSR1_BBP_RESET, 0);
|
||||
rt2x00_set_field32(®, CSR1_HOST_READY, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR1, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR1, ®);
|
||||
rt2x00_set_field32(®, CSR1_SOFT_RESET, 0);
|
||||
rt2x00_set_field32(®, CSR1_HOST_READY, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR1, reg);
|
||||
|
||||
/*
|
||||
* We must clear the FCS and FIFO error count.
|
||||
* These registers are cleared on read,
|
||||
* so we may pass a useless variable to store the value.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CNT0, ®);
|
||||
rt2x00pci_register_read(rt2x00dev, CNT4, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CNT4, ®);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1057,7 +1058,7 @@ static int rt2500pci_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
|
||||
rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@@ -1130,8 +1131,8 @@ static void rt2500pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
|
||||
* should clear the register to assure a clean state.
|
||||
*/
|
||||
if (state == STATE_RADIO_IRQ_ON) {
|
||||
rt2x00pci_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR7, reg);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR7, reg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1140,13 +1141,13 @@ static void rt2500pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00_set_field32(®, CSR8_TBCN_EXPIRE, mask);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_TXRING, mask);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_ATIMRING, mask);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_PRIORING, mask);
|
||||
rt2x00_set_field32(®, CSR8_RXDONE, mask);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
|
||||
|
||||
@@ -1178,7 +1179,7 @@ static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||
/*
|
||||
* Disable power
|
||||
*/
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR0, 0);
|
||||
}
|
||||
|
||||
static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -1192,12 +1193,12 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
put_to_sleep = (state != STATE_AWAKE);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, PWRCSR1, ®);
|
||||
rt2x00_set_field32(®, PWRCSR1_SET_STATE, 1);
|
||||
rt2x00_set_field32(®, PWRCSR1_BBP_DESIRE_STATE, state);
|
||||
rt2x00_set_field32(®, PWRCSR1_RF_DESIRE_STATE, state);
|
||||
rt2x00_set_field32(®, PWRCSR1_PUT_TO_SLEEP, put_to_sleep);
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
|
||||
/*
|
||||
* Device is not guaranteed to be in the requested state yet.
|
||||
@@ -1205,12 +1206,12 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
* device has entered the correct state.
|
||||
*/
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||
rt2x00mmio_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||
bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
|
||||
rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
|
||||
if (bbp_state == state && rf_state == state)
|
||||
return 0;
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
@@ -1245,8 +1246,8 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (unlikely(retval))
|
||||
ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
|
||||
state, retval);
|
||||
rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
|
||||
state, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -1258,7 +1259,7 @@ static void rt2500pci_write_tx_desc(struct queue_entry *entry,
|
||||
struct txentry_desc *txdesc)
|
||||
{
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
__le32 *txd = entry_priv->desc;
|
||||
u32 word;
|
||||
|
||||
@@ -1334,11 +1335,14 @@ static void rt2500pci_write_beacon(struct queue_entry *entry,
|
||||
* Disable beaconing while we are reloading the beacon data,
|
||||
* otherwise we might be sending out invalid data.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR14, ®);
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
|
||||
rt2x00queue_map_txskb(entry);
|
||||
if (rt2x00queue_map_txskb(entry)) {
|
||||
rt2x00_err(rt2x00dev, "Fail to map beacon, aborting\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write the TX descriptor for the beacon.
|
||||
@@ -1349,12 +1353,12 @@ static void rt2500pci_write_beacon(struct queue_entry *entry,
|
||||
* Dump beacon to userspace through debugfs.
|
||||
*/
|
||||
rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb);
|
||||
|
||||
out:
|
||||
/*
|
||||
* Enable beaconing again.
|
||||
*/
|
||||
rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR14, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR14, reg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1363,7 +1367,7 @@ static void rt2500pci_write_beacon(struct queue_entry *entry,
|
||||
static void rt2500pci_fill_rxdone(struct queue_entry *entry,
|
||||
struct rxdone_entry_desc *rxdesc)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
u32 word0;
|
||||
u32 word2;
|
||||
|
||||
@@ -1401,7 +1405,7 @@ static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev,
|
||||
const enum data_queue_qid queue_idx)
|
||||
{
|
||||
struct data_queue *queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
struct queue_entry *entry;
|
||||
struct txdone_entry_desc txdesc;
|
||||
u32 word;
|
||||
@@ -1447,9 +1451,9 @@ static inline void rt2500pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
spin_lock_irq(&rt2x00dev->irqmask_lock);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00_set_field32(®, irq_field, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock_irq(&rt2x00dev->irqmask_lock);
|
||||
}
|
||||
@@ -1472,11 +1476,11 @@ static void rt2500pci_txstatus_tasklet(unsigned long data)
|
||||
if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) {
|
||||
spin_lock_irq(&rt2x00dev->irqmask_lock);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_TXRING, 0);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_ATIMRING, 0);
|
||||
rt2x00_set_field32(®, CSR8_TXDONE_PRIORING, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock_irq(&rt2x00dev->irqmask_lock);
|
||||
}
|
||||
@@ -1493,7 +1497,7 @@ static void rt2500pci_tbtt_tasklet(unsigned long data)
|
||||
static void rt2500pci_rxdone_tasklet(unsigned long data)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||
if (rt2x00pci_rxdone(rt2x00dev))
|
||||
if (rt2x00mmio_rxdone(rt2x00dev))
|
||||
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
|
||||
else if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
rt2500pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
|
||||
@@ -1508,8 +1512,8 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
|
||||
* Get the interrupt sources & saved to local variable.
|
||||
* Write register value back to clear pending interrupts.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00pci_register_write(rt2x00dev, CSR7, reg);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR7, ®);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR7, reg);
|
||||
|
||||
if (!reg)
|
||||
return IRQ_NONE;
|
||||
@@ -1546,9 +1550,9 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
|
||||
*/
|
||||
spin_lock(&rt2x00dev->irqmask_lock);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR8, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR8, ®);
|
||||
reg |= mask;
|
||||
rt2x00pci_register_write(rt2x00dev, CSR8, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, CSR8, reg);
|
||||
|
||||
spin_unlock(&rt2x00dev->irqmask_lock);
|
||||
|
||||
@@ -1565,7 +1569,7 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
u16 word;
|
||||
u8 *mac;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR21, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR21, ®);
|
||||
|
||||
eeprom.data = rt2x00dev;
|
||||
eeprom.register_read = rt2500pci_eepromregister_read;
|
||||
@@ -1586,7 +1590,7 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
EEPROM(rt2x00dev, "MAC: %pM\n", mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
@@ -1602,7 +1606,7 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_ANTENNA_HARDWARE_RADIO, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_ANTENNA_RF_TYPE, RF2522);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_ANTENNA, word);
|
||||
EEPROM(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &word);
|
||||
@@ -1611,7 +1615,7 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_NIC_DYN_BBP_TUNE, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_NIC_CCK_TX_POWER, 0);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC, word);
|
||||
EEPROM(rt2x00dev, "NIC: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &word);
|
||||
@@ -1619,7 +1623,8 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_CALIBRATE_OFFSET_RSSI,
|
||||
DEFAULT_RSSI_OFFSET);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_CALIBRATE_OFFSET, word);
|
||||
EEPROM(rt2x00dev, "Calibrate offset: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Calibrate offset: 0x%04x\n",
|
||||
word);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1640,7 +1645,7 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Identify RF chipset.
|
||||
*/
|
||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
|
||||
rt2x00pci_register_read(rt2x00dev, CSR0, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR0, ®);
|
||||
rt2x00_set_chip(rt2x00dev, RT2560, value,
|
||||
rt2x00_get_field32(reg, CSR0_REVISION));
|
||||
|
||||
@@ -1650,7 +1655,7 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
!rt2x00_rf(rt2x00dev, RF2525) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2525E) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5222)) {
|
||||
ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid RF chipset detected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1951,9 +1956,9 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
* Enable rfkill polling by setting GPIO direction of the
|
||||
* rfkill switch GPIO pin correctly.
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, GPIOCSR, ®);
|
||||
rt2x00_set_field32(®, GPIOCSR_DIR0, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, GPIOCSR, reg);
|
||||
|
||||
/*
|
||||
* Initialize hw specifications.
|
||||
@@ -1987,9 +1992,9 @@ static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw,
|
||||
u64 tsf;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR17, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR17, ®);
|
||||
tsf = (u64) rt2x00_get_field32(reg, CSR17_HIGH_TSFTIMER) << 32;
|
||||
rt2x00pci_register_read(rt2x00dev, CSR16, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR16, ®);
|
||||
tsf |= rt2x00_get_field32(reg, CSR16_LOW_TSFTIMER);
|
||||
|
||||
return tsf;
|
||||
@@ -2000,7 +2005,7 @@ static int rt2500pci_tx_last_beacon(struct ieee80211_hw *hw)
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, CSR15, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, CSR15, ®);
|
||||
return rt2x00_get_field32(reg, CSR15_BEACON_SENT);
|
||||
}
|
||||
|
||||
@@ -2033,8 +2038,8 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
|
||||
.tbtt_tasklet = rt2500pci_tbtt_tasklet,
|
||||
.rxdone_tasklet = rt2500pci_rxdone_tasklet,
|
||||
.probe_hw = rt2500pci_probe_hw,
|
||||
.initialize = rt2x00pci_initialize,
|
||||
.uninitialize = rt2x00pci_uninitialize,
|
||||
.initialize = rt2x00mmio_initialize,
|
||||
.uninitialize = rt2x00mmio_uninitialize,
|
||||
.get_entry_state = rt2500pci_get_entry_state,
|
||||
.clear_entry = rt2500pci_clear_entry,
|
||||
.set_device_state = rt2500pci_set_device_state,
|
||||
@@ -2045,7 +2050,7 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
|
||||
.start_queue = rt2500pci_start_queue,
|
||||
.kick_queue = rt2500pci_kick_queue,
|
||||
.stop_queue = rt2500pci_stop_queue,
|
||||
.flush_queue = rt2x00pci_flush_queue,
|
||||
.flush_queue = rt2x00mmio_flush_queue,
|
||||
.write_tx_desc = rt2500pci_write_tx_desc,
|
||||
.write_beacon = rt2500pci_write_beacon,
|
||||
.fill_rxdone = rt2500pci_fill_rxdone,
|
||||
@@ -2060,28 +2065,28 @@ static const struct data_queue_desc rt2500pci_queue_rx = {
|
||||
.entry_num = 32,
|
||||
.data_size = DATA_FRAME_SIZE,
|
||||
.desc_size = RXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2500pci_queue_tx = {
|
||||
.entry_num = 32,
|
||||
.data_size = DATA_FRAME_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2500pci_queue_bcn = {
|
||||
.entry_num = 1,
|
||||
.data_size = MGMT_FRAME_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2500pci_queue_atim = {
|
||||
.entry_num = 8,
|
||||
.data_size = DATA_FRAME_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct rt2x00_ops rt2500pci_ops = {
|
||||
|
||||
@@ -134,8 +134,8 @@ static int rt2500usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev, "Indirect register access failed: "
|
||||
"offset=0x%.08x, value=0x%.08x\n", offset, *reg);
|
||||
rt2x00_err(rt2x00dev, "Indirect register access failed: offset=0x%.08x, value=0x%.08x\n",
|
||||
offset, *reg);
|
||||
*reg = ~0;
|
||||
|
||||
return 0;
|
||||
@@ -916,7 +916,7 @@ static int rt2500usb_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
|
||||
rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@@ -1069,8 +1069,8 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (unlikely(retval))
|
||||
ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
|
||||
state, retval);
|
||||
rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
|
||||
state, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -1353,7 +1353,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
EEPROM(rt2x00dev, "MAC: %pM\n", mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
@@ -1369,7 +1369,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_ANTENNA_HARDWARE_RADIO, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_ANTENNA_RF_TYPE, RF2522);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_ANTENNA, word);
|
||||
EEPROM(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &word);
|
||||
@@ -1378,7 +1378,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_NIC_DYN_BBP_TUNE, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_NIC_CCK_TX_POWER, 0);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC, word);
|
||||
EEPROM(rt2x00dev, "NIC: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &word);
|
||||
@@ -1386,14 +1386,15 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_CALIBRATE_OFFSET_RSSI,
|
||||
DEFAULT_RSSI_OFFSET);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_CALIBRATE_OFFSET, word);
|
||||
EEPROM(rt2x00dev, "Calibrate offset: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Calibrate offset: 0x%04x\n",
|
||||
word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE, &word);
|
||||
if (word == 0xffff) {
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_THRESHOLD, 45);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE, word);
|
||||
EEPROM(rt2x00dev, "BBPtune: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "BBPtune: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1408,7 +1409,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCUPPER, 0x40);
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word);
|
||||
EEPROM(rt2x00dev, "BBPtune vgc: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "BBPtune vgc: 0x%04x\n", word);
|
||||
} else {
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word);
|
||||
@@ -1419,7 +1420,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R17_LOW, 0x48);
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R17_HIGH, 0x41);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R17, word);
|
||||
EEPROM(rt2x00dev, "BBPtune r17: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r17: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &word);
|
||||
@@ -1427,7 +1428,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R24_LOW, 0x40);
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R24_HIGH, 0x80);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R24, word);
|
||||
EEPROM(rt2x00dev, "BBPtune r24: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r24: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &word);
|
||||
@@ -1435,7 +1436,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R25_LOW, 0x40);
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R25_HIGH, 0x50);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R25, word);
|
||||
EEPROM(rt2x00dev, "BBPtune r25: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r25: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &word);
|
||||
@@ -1443,7 +1444,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R61_LOW, 0x60);
|
||||
rt2x00_set_field16(&word, EEPROM_BBPTUNE_R61_HIGH, 0x6d);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R61, word);
|
||||
EEPROM(rt2x00dev, "BBPtune r61: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r61: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1468,7 +1469,7 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_chip(rt2x00dev, RT2570, value, reg);
|
||||
|
||||
if (((reg & 0xfff0) != 0) || ((reg & 0x0000000f) == 0)) {
|
||||
ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid RT chipset detected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1478,7 +1479,7 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
!rt2x00_rf(rt2x00dev, RF2525) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2525E) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5222)) {
|
||||
ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid RF chipset detected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
* RF3320 2.4G 1T1R(RT3350/RT3370/RT3390)
|
||||
* RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392)
|
||||
* RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662)
|
||||
* RF5592 2.4G/5G 2T2R
|
||||
* RF5360 2.4G 1T1R
|
||||
* RF5370 2.4G 1T1R
|
||||
* RF5390 2.4G 1T1R
|
||||
@@ -68,6 +69,7 @@
|
||||
#define RF3320 0x000b
|
||||
#define RF3322 0x000c
|
||||
#define RF3053 0x000d
|
||||
#define RF5592 0x000f
|
||||
#define RF3290 0x3290
|
||||
#define RF5360 0x5360
|
||||
#define RF5370 0x5370
|
||||
@@ -88,11 +90,8 @@
|
||||
#define REV_RT3390E 0x0211
|
||||
#define REV_RT5390F 0x0502
|
||||
#define REV_RT5390R 0x1502
|
||||
#define REV_RT5592C 0x0221
|
||||
|
||||
/*
|
||||
* Signal information.
|
||||
* Default offset is required for RSSI <-> dBm conversion.
|
||||
*/
|
||||
#define DEFAULT_RSSI_OFFSET 120
|
||||
|
||||
/*
|
||||
@@ -689,6 +688,12 @@
|
||||
#define GPIO_SWITCH_6 FIELD32(0x00000040)
|
||||
#define GPIO_SWITCH_7 FIELD32(0x00000080)
|
||||
|
||||
/*
|
||||
* FIXME: where the DEBUG_INDEX name come from?
|
||||
*/
|
||||
#define MAC_DEBUG_INDEX 0x05e8
|
||||
#define MAC_DEBUG_INDEX_XTAL FIELD32(0x80000000)
|
||||
|
||||
/*
|
||||
* MAC Control/Status Registers(CSR).
|
||||
* Some values are set in TU, whereas 1 TU == 1024 us.
|
||||
@@ -1934,6 +1939,9 @@ struct mac_iveiv_entry {
|
||||
#define BBP4_BANDWIDTH FIELD8(0x18)
|
||||
#define BBP4_MAC_IF_CTRL FIELD8(0x40)
|
||||
|
||||
/* BBP27 */
|
||||
#define BBP27_RX_CHAIN_SEL FIELD8(0x60)
|
||||
|
||||
/*
|
||||
* BBP 47: Bandwidth
|
||||
*/
|
||||
@@ -1947,6 +1955,20 @@ struct mac_iveiv_entry {
|
||||
*/
|
||||
#define BBP49_UPDATE_FLAG FIELD8(0x01)
|
||||
|
||||
/*
|
||||
* BBP 105:
|
||||
* - bit0: detect SIG on primary channel only (on 40MHz bandwidth)
|
||||
* - bit1: FEQ (Feed Forward Compensation) for independend streams
|
||||
* - bit2: MLD (Maximum Likehood Detection) for 2 streams (reserved on single
|
||||
* stream)
|
||||
* - bit4: channel estimation updates based on remodulation of
|
||||
* L-SIG and HT-SIG symbols
|
||||
*/
|
||||
#define BBP105_DETECT_SIG_ON_PRIMARY FIELD8(0x01)
|
||||
#define BBP105_FEQ FIELD8(0x02)
|
||||
#define BBP105_MLD FIELD8(0x04)
|
||||
#define BBP105_SIG_REMODULATION FIELD8(0x08)
|
||||
|
||||
/*
|
||||
* BBP 109
|
||||
*/
|
||||
@@ -1966,6 +1988,11 @@ struct mac_iveiv_entry {
|
||||
*/
|
||||
#define BBP152_RX_DEFAULT_ANT FIELD8(0x80)
|
||||
|
||||
/*
|
||||
* BBP 254: unknown
|
||||
*/
|
||||
#define BBP254_BIT7 FIELD8(0x80)
|
||||
|
||||
/*
|
||||
* RFCSR registers
|
||||
* The wordsize of the RFCSR is 8 bits.
|
||||
@@ -2021,10 +2048,19 @@ struct mac_iveiv_entry {
|
||||
#define RFCSR7_BIT5 FIELD8(0x20)
|
||||
#define RFCSR7_BITS67 FIELD8(0xc0)
|
||||
|
||||
/*
|
||||
* RFCSR 9:
|
||||
*/
|
||||
#define RFCSR9_K FIELD8(0x0f)
|
||||
#define RFCSR9_N FIELD8(0x10)
|
||||
#define RFCSR9_UNKNOWN FIELD8(0x60)
|
||||
#define RFCSR9_MOD FIELD8(0x80)
|
||||
|
||||
/*
|
||||
* RFCSR 11:
|
||||
*/
|
||||
#define RFCSR11_R FIELD8(0x03)
|
||||
#define RFCSR11_MOD FIELD8(0xc0)
|
||||
|
||||
/*
|
||||
* RFCSR 12:
|
||||
@@ -2130,11 +2166,13 @@ struct mac_iveiv_entry {
|
||||
* RFCSR 49:
|
||||
*/
|
||||
#define RFCSR49_TX FIELD8(0x3f)
|
||||
#define RFCSR49_EP FIELD8(0xc0)
|
||||
|
||||
/*
|
||||
* RFCSR 50:
|
||||
*/
|
||||
#define RFCSR50_TX FIELD8(0x3f)
|
||||
#define RFCSR50_EP FIELD8(0xc0)
|
||||
|
||||
/*
|
||||
* RF registers
|
||||
@@ -2496,6 +2534,61 @@ struct mac_iveiv_entry {
|
||||
#define EEPROM_BBP_VALUE FIELD16(0x00ff)
|
||||
#define EEPROM_BBP_REG_ID FIELD16(0xff00)
|
||||
|
||||
/*
|
||||
* EEPROM IQ Calibration, unlike other entries those are byte addresses.
|
||||
*/
|
||||
|
||||
#define EEPROM_IQ_GAIN_CAL_TX0_2G 0x130
|
||||
#define EEPROM_IQ_PHASE_CAL_TX0_2G 0x131
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX0_2G 0x132
|
||||
#define EEPROM_IQ_GAIN_CAL_TX1_2G 0x133
|
||||
#define EEPROM_IQ_PHASE_CAL_TX1_2G 0x134
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX1_2G 0x135
|
||||
#define EEPROM_IQ_GAIN_CAL_RX0_2G 0x136
|
||||
#define EEPROM_IQ_PHASE_CAL_RX0_2G 0x137
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX0_2G 0x138
|
||||
#define EEPROM_IQ_GAIN_CAL_RX1_2G 0x139
|
||||
#define EEPROM_IQ_PHASE_CAL_RX1_2G 0x13A
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX1_2G 0x13B
|
||||
#define EEPROM_RF_IQ_COMPENSATION_CONTROL 0x13C
|
||||
#define EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL 0x13D
|
||||
#define EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5G 0x144
|
||||
#define EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5G 0x145
|
||||
#define EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5G 0X146
|
||||
#define EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5G 0x147
|
||||
#define EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5G 0x148
|
||||
#define EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5G 0x149
|
||||
#define EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5G 0x14A
|
||||
#define EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5G 0x14B
|
||||
#define EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5G 0X14C
|
||||
#define EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5G 0x14D
|
||||
#define EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5G 0x14E
|
||||
#define EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5G 0x14F
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX0_CH36_TO_CH64_5G 0x150
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX1_CH36_TO_CH64_5G 0x151
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX0_CH100_TO_CH138_5G 0x152
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX1_CH100_TO_CH138_5G 0x153
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX0_CH140_TO_CH165_5G 0x154
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_TX1_CH140_TO_CH165_5G 0x155
|
||||
#define EEPROM_IQ_GAIN_CAL_RX0_CH36_TO_CH64_5G 0x156
|
||||
#define EEPROM_IQ_PHASE_CAL_RX0_CH36_TO_CH64_5G 0x157
|
||||
#define EEPROM_IQ_GAIN_CAL_RX0_CH100_TO_CH138_5G 0X158
|
||||
#define EEPROM_IQ_PHASE_CAL_RX0_CH100_TO_CH138_5G 0x159
|
||||
#define EEPROM_IQ_GAIN_CAL_RX0_CH140_TO_CH165_5G 0x15A
|
||||
#define EEPROM_IQ_PHASE_CAL_RX0_CH140_TO_CH165_5G 0x15B
|
||||
#define EEPROM_IQ_GAIN_CAL_RX1_CH36_TO_CH64_5G 0x15C
|
||||
#define EEPROM_IQ_PHASE_CAL_RX1_CH36_TO_CH64_5G 0x15D
|
||||
#define EEPROM_IQ_GAIN_CAL_RX1_CH100_TO_CH138_5G 0X15E
|
||||
#define EEPROM_IQ_PHASE_CAL_RX1_CH100_TO_CH138_5G 0x15F
|
||||
#define EEPROM_IQ_GAIN_CAL_RX1_CH140_TO_CH165_5G 0x160
|
||||
#define EEPROM_IQ_PHASE_CAL_RX1_CH140_TO_CH165_5G 0x161
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX0_CH36_TO_CH64_5G 0x162
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX1_CH36_TO_CH64_5G 0x163
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX0_CH100_TO_CH138_5G 0x164
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX1_CH100_TO_CH138_5G 0x165
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX0_CH140_TO_CH165_5G 0x166
|
||||
#define EEPROM_IQ_GROUPDELAY_CAL_RX1_CH140_TO_CH165_5G 0x167
|
||||
|
||||
/*
|
||||
* MCU mailbox commands.
|
||||
* MCU_SLEEP - go to power-save mode.
|
||||
@@ -2535,6 +2628,8 @@ struct mac_iveiv_entry {
|
||||
#define TXWI_DESC_SIZE (4 * sizeof(__le32))
|
||||
#define RXWI_DESC_SIZE (4 * sizeof(__le32))
|
||||
|
||||
#define TXWI_DESC_SIZE_5592 (5 * sizeof(__le32))
|
||||
#define RXWI_DESC_SIZE_5592 (6 * sizeof(__le32))
|
||||
/*
|
||||
* TX WI structure
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -43,7 +43,7 @@ struct rt2800_ops {
|
||||
const unsigned int offset,
|
||||
const struct rt2x00_field32 field, u32 *reg);
|
||||
|
||||
void (*read_eeprom)(struct rt2x00_dev *rt2x00dev);
|
||||
int (*read_eeprom)(struct rt2x00_dev *rt2x00dev);
|
||||
bool (*hwcrypt_disabled)(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -117,11 +117,11 @@ static inline int rt2800_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
return rt2800ops->regbusy_read(rt2x00dev, offset, field, reg);
|
||||
}
|
||||
|
||||
static inline void rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
static inline int rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
|
||||
|
||||
rt2800ops->read_eeprom(rt2x00dev);
|
||||
return rt2800ops->read_eeprom(rt2x00dev);
|
||||
}
|
||||
|
||||
static inline bool rt2800_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
|
||||
@@ -207,7 +207,7 @@ int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev);
|
||||
void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev);
|
||||
void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev);
|
||||
int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <linux/eeprom_93cx6.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00mmio.h"
|
||||
#include "rt2x00pci.h"
|
||||
#include "rt2x00soc.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -71,7 +72,7 @@ static void rt2800pci_mcu_status(struct rt2x00_dev *rt2x00dev, const u8 token)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 200; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, H2M_MAILBOX_CID, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, H2M_MAILBOX_CID, ®);
|
||||
|
||||
if ((rt2x00_get_field32(reg, H2M_MAILBOX_CID_CMD0) == token) ||
|
||||
(rt2x00_get_field32(reg, H2M_MAILBOX_CID_CMD1) == token) ||
|
||||
@@ -83,26 +84,31 @@ static void rt2800pci_mcu_status(struct rt2x00_dev *rt2x00dev, const u8 token)
|
||||
}
|
||||
|
||||
if (i == 200)
|
||||
ERROR(rt2x00dev, "MCU request failed, no response from hardware\n");
|
||||
rt2x00_err(rt2x00dev, "MCU request failed, no response from hardware\n");
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
|
||||
static void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
|
||||
static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
|
||||
|
||||
if (!base_addr)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
|
||||
|
||||
iounmap(base_addr);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
static inline int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
|
||||
#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
|
||||
@@ -110,7 +116,7 @@ static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
|
||||
struct rt2x00_dev *rt2x00dev = eeprom->data;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, ®);
|
||||
|
||||
eeprom->reg_data_in = !!rt2x00_get_field32(reg, E2PROM_CSR_DATA_IN);
|
||||
eeprom->reg_data_out = !!rt2x00_get_field32(reg, E2PROM_CSR_DATA_OUT);
|
||||
@@ -132,15 +138,15 @@ static void rt2800pci_eepromregister_write(struct eeprom_93cx6 *eeprom)
|
||||
rt2x00_set_field32(®, E2PROM_CSR_CHIP_SELECT,
|
||||
!!eeprom->reg_chip_select);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, E2PROM_CSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, E2PROM_CSR, reg);
|
||||
}
|
||||
|
||||
static void rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev)
|
||||
static int rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct eeprom_93cx6 eeprom;
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, ®);
|
||||
|
||||
eeprom.data = rt2x00dev;
|
||||
eeprom.register_read = rt2800pci_eepromregister_read;
|
||||
@@ -164,6 +170,8 @@ static void rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
eeprom_93cx6_multiread(&eeprom, EEPROM_BASE, rt2x00dev->eeprom,
|
||||
EEPROM_SIZE / sizeof(u16));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt2800pci_efuse_detect(struct rt2x00_dev *rt2x00dev)
|
||||
@@ -171,13 +179,14 @@ static int rt2800pci_efuse_detect(struct rt2x00_dev *rt2x00dev)
|
||||
return rt2800_efuse_detect(rt2x00dev);
|
||||
}
|
||||
|
||||
static inline void rt2800pci_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
|
||||
static inline int rt2800pci_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
rt2800_read_eeprom_efuse(rt2x00dev);
|
||||
return rt2800_read_eeprom_efuse(rt2x00dev);
|
||||
}
|
||||
#else
|
||||
static inline void rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev)
|
||||
static inline int rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int rt2800pci_efuse_detect(struct rt2x00_dev *rt2x00dev)
|
||||
@@ -185,8 +194,9 @@ static inline int rt2800pci_efuse_detect(struct rt2x00_dev *rt2x00dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void rt2800pci_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
|
||||
static inline int rt2800pci_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
@@ -200,20 +210,20 @@ static void rt2800pci_start_queue(struct data_queue *queue)
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_RX:
|
||||
rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
break;
|
||||
case QID_BEACON:
|
||||
rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 1);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 1);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_GEN, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, INT_TIMER_EN, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, INT_TIMER_EN, ®);
|
||||
rt2x00_set_field32(®, INT_TIMER_EN_PRE_TBTT_TIMER, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, INT_TIMER_EN, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_TIMER_EN, reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -231,13 +241,13 @@ static void rt2800pci_kick_queue(struct data_queue *queue)
|
||||
case QID_AC_BE:
|
||||
case QID_AC_BK:
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
|
||||
entry->entry_idx);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
|
||||
entry->entry_idx);
|
||||
break;
|
||||
case QID_MGMT:
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX(5),
|
||||
entry->entry_idx);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(5),
|
||||
entry->entry_idx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -251,20 +261,20 @@ static void rt2800pci_stop_queue(struct data_queue *queue)
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_RX:
|
||||
rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
break;
|
||||
case QID_BEACON:
|
||||
rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 0);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 0);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_GEN, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, INT_TIMER_EN, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, INT_TIMER_EN, ®);
|
||||
rt2x00_set_field32(®, INT_TIMER_EN_PRE_TBTT_TIMER, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, INT_TIMER_EN, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_TIMER_EN, reg);
|
||||
|
||||
/*
|
||||
* Wait for current invocation to finish. The tasklet
|
||||
@@ -304,19 +314,19 @@ static int rt2800pci_write_firmware(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
reg = 0;
|
||||
rt2x00_set_field32(®, PBF_SYS_CTRL_HOST_RAM_WRITE, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
|
||||
|
||||
/*
|
||||
* Write firmware to device.
|
||||
*/
|
||||
rt2x00pci_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
|
||||
data, len);
|
||||
rt2x00mmio_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
|
||||
data, len);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000);
|
||||
rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001);
|
||||
rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000);
|
||||
rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -326,7 +336,7 @@ static int rt2800pci_write_firmware(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
static bool rt2800pci_get_entry_state(struct queue_entry *entry)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
u32 word;
|
||||
|
||||
if (entry->queue->qid == QID_RX) {
|
||||
@@ -342,7 +352,7 @@ static bool rt2800pci_get_entry_state(struct queue_entry *entry)
|
||||
|
||||
static void rt2800pci_clear_entry(struct queue_entry *entry)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
u32 word;
|
||||
@@ -360,8 +370,8 @@ static void rt2800pci_clear_entry(struct queue_entry *entry)
|
||||
* Set RX IDX in register to inform hardware that we have
|
||||
* handled this entry and it is available for reuse again.
|
||||
*/
|
||||
rt2x00pci_register_write(rt2x00dev, RX_CRX_IDX,
|
||||
entry->entry_idx);
|
||||
rt2x00mmio_register_write(rt2x00dev, RX_CRX_IDX,
|
||||
entry->entry_idx);
|
||||
} else {
|
||||
rt2x00_desc_read(entry_priv->desc, 1, &word);
|
||||
rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 1);
|
||||
@@ -371,60 +381,65 @@ static void rt2800pci_clear_entry(struct queue_entry *entry)
|
||||
|
||||
static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
|
||||
/*
|
||||
* Initialize registers.
|
||||
*/
|
||||
entry_priv = rt2x00dev->tx[0].entries[0].priv_data;
|
||||
rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR0, entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT0,
|
||||
rt2x00dev->tx[0].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX0, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX0, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR0,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT0,
|
||||
rt2x00dev->tx[0].limit);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX0, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX0, 0);
|
||||
|
||||
entry_priv = rt2x00dev->tx[1].entries[0].priv_data;
|
||||
rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR1, entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT1,
|
||||
rt2x00dev->tx[1].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX1, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX1, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR1,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT1,
|
||||
rt2x00dev->tx[1].limit);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX1, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX1, 0);
|
||||
|
||||
entry_priv = rt2x00dev->tx[2].entries[0].priv_data;
|
||||
rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR2, entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT2,
|
||||
rt2x00dev->tx[2].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX2, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX2, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR2,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT2,
|
||||
rt2x00dev->tx[2].limit);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX2, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX2, 0);
|
||||
|
||||
entry_priv = rt2x00dev->tx[3].entries[0].priv_data;
|
||||
rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR3, entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT3,
|
||||
rt2x00dev->tx[3].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX3, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX3, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR3,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT3,
|
||||
rt2x00dev->tx[3].limit);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX3, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX3, 0);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR4, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT4, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX4, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX4, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR4, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT4, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX4, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX4, 0);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR5, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT5, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX5, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX5, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR5, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT5, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX5, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX5, 0);
|
||||
|
||||
entry_priv = rt2x00dev->rx->entries[0].priv_data;
|
||||
rt2x00pci_register_write(rt2x00dev, RX_BASE_PTR, entry_priv->desc_dma);
|
||||
rt2x00pci_register_write(rt2x00dev, RX_MAX_CNT,
|
||||
rt2x00dev->rx[0].limit);
|
||||
rt2x00pci_register_write(rt2x00dev, RX_CRX_IDX,
|
||||
rt2x00dev->rx[0].limit - 1);
|
||||
rt2x00pci_register_write(rt2x00dev, RX_DRX_IDX, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, RX_BASE_PTR,
|
||||
entry_priv->desc_dma);
|
||||
rt2x00mmio_register_write(rt2x00dev, RX_MAX_CNT,
|
||||
rt2x00dev->rx[0].limit);
|
||||
rt2x00mmio_register_write(rt2x00dev, RX_CRX_IDX,
|
||||
rt2x00dev->rx[0].limit - 1);
|
||||
rt2x00mmio_register_write(rt2x00dev, RX_DRX_IDX, 0);
|
||||
|
||||
rt2800_disable_wpdma(rt2x00dev);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, DELAY_INT_CFG, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, DELAY_INT_CFG, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -443,8 +458,8 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
|
||||
* should clear the register to assure a clean state.
|
||||
*/
|
||||
if (state == STATE_RADIO_IRQ_ON) {
|
||||
rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, ®);
|
||||
rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
|
||||
rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, ®);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
|
||||
@@ -456,7 +471,7 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(®, INT_MASK_CSR_TX_FIFO_STATUS, 1);
|
||||
rt2x00_set_field32(®, INT_MASK_CSR_AUTO_WAKEUP, 1);
|
||||
}
|
||||
rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
||||
spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
|
||||
|
||||
if (state == STATE_RADIO_IRQ_OFF) {
|
||||
@@ -478,7 +493,7 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
/*
|
||||
* Reset DMA indexes
|
||||
*/
|
||||
rt2x00pci_register_read(rt2x00dev, WPDMA_RST_IDX, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, WPDMA_RST_IDX, ®);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, 1);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, 1);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX2, 1);
|
||||
@@ -486,29 +501,29 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX4, 1);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX5, 1);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DRX_IDX0, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
|
||||
rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
|
||||
rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
|
||||
rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
|
||||
|
||||
if (rt2x00_is_pcie(rt2x00dev) &&
|
||||
(rt2x00_rt(rt2x00dev, RT3572) ||
|
||||
rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392))) {
|
||||
rt2x00pci_register_read(rt2x00dev, AUX_CTRL, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, AUX_CTRL, ®);
|
||||
rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1);
|
||||
rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, AUX_CTRL, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, AUX_CTRL, reg);
|
||||
}
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
|
||||
|
||||
reg = 0;
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1);
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
|
||||
rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
|
||||
rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -528,8 +543,8 @@ static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev)
|
||||
return retval;
|
||||
|
||||
/* After resume MCU_BOOT_SIGNAL will trash these. */
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
|
||||
rt2800_mcu_request(rt2x00dev, MCU_SLEEP, TOKEN_RADIO_OFF, 0xff, 0x02);
|
||||
rt2800pci_mcu_status(rt2x00dev, TOKEN_RADIO_OFF);
|
||||
@@ -544,8 +559,8 @@ static void rt2800pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
if (rt2x00_is_soc(rt2x00dev)) {
|
||||
rt2800_disable_radio(rt2x00dev);
|
||||
rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0);
|
||||
rt2x00pci_register_write(rt2x00dev, TX_PIN_CFG, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -557,10 +572,10 @@ static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
0, 0x02);
|
||||
rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKEUP);
|
||||
} else if (state == STATE_SLEEP) {
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS,
|
||||
0xffffffff);
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID,
|
||||
0xffffffff);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_STATUS,
|
||||
0xffffffff);
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID,
|
||||
0xffffffff);
|
||||
rt2800_mcu_request(rt2x00dev, MCU_SLEEP, TOKEN_SLEEP,
|
||||
0xff, 0x01);
|
||||
}
|
||||
@@ -601,8 +616,8 @@ static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (unlikely(retval))
|
||||
ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
|
||||
state, retval);
|
||||
rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
|
||||
state, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -619,7 +634,7 @@ static void rt2800pci_write_tx_desc(struct queue_entry *entry,
|
||||
struct txentry_desc *txdesc)
|
||||
{
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
__le32 *txd = entry_priv->desc;
|
||||
u32 word;
|
||||
|
||||
@@ -673,7 +688,7 @@ static void rt2800pci_write_tx_desc(struct queue_entry *entry,
|
||||
static void rt2800pci_fill_rxdone(struct queue_entry *entry,
|
||||
struct rxdone_entry_desc *rxdesc)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv = entry->priv_data;
|
||||
struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
|
||||
__le32 *rxd = entry_priv->desc;
|
||||
u32 word;
|
||||
|
||||
@@ -733,10 +748,90 @@ static void rt2800pci_wakeup(struct rt2x00_dev *rt2x00dev)
|
||||
rt2800_config(rt2x00dev, &libconf, IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
|
||||
static bool rt2800pci_txdone_entry_check(struct queue_entry *entry, u32 status)
|
||||
{
|
||||
__le32 *txwi;
|
||||
u32 word;
|
||||
int wcid, tx_wcid;
|
||||
|
||||
wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID);
|
||||
|
||||
txwi = rt2800_drv_get_txwi(entry);
|
||||
rt2x00_desc_read(txwi, 1, &word);
|
||||
tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
|
||||
|
||||
return (tx_wcid == wcid);
|
||||
}
|
||||
|
||||
static bool rt2800pci_txdone_find_entry(struct queue_entry *entry, void *data)
|
||||
{
|
||||
u32 status = *(u32 *)data;
|
||||
|
||||
/*
|
||||
* rt2800pci hardware might reorder frames when exchanging traffic
|
||||
* with multiple BA enabled STAs.
|
||||
*
|
||||
* For example, a tx queue
|
||||
* [ STA1 | STA2 | STA1 | STA2 ]
|
||||
* can result in tx status reports
|
||||
* [ STA1 | STA1 | STA2 | STA2 ]
|
||||
* when the hw decides to aggregate the frames for STA1 into one AMPDU.
|
||||
*
|
||||
* To mitigate this effect, associate the tx status to the first frame
|
||||
* in the tx queue with a matching wcid.
|
||||
*/
|
||||
if (rt2800pci_txdone_entry_check(entry, status) &&
|
||||
!test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
|
||||
/*
|
||||
* Got a matching frame, associate the tx status with
|
||||
* the frame
|
||||
*/
|
||||
entry->status = status;
|
||||
set_bit(ENTRY_DATA_STATUS_SET, &entry->flags);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check the next frame */
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool rt2800pci_txdone_match_first(struct queue_entry *entry, void *data)
|
||||
{
|
||||
u32 status = *(u32 *)data;
|
||||
|
||||
/*
|
||||
* Find the first frame without tx status and assign this status to it
|
||||
* regardless if it matches or not.
|
||||
*/
|
||||
if (!test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
|
||||
/*
|
||||
* Got a matching frame, associate the tx status with
|
||||
* the frame
|
||||
*/
|
||||
entry->status = status;
|
||||
set_bit(ENTRY_DATA_STATUS_SET, &entry->flags);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check the next frame */
|
||||
return false;
|
||||
}
|
||||
static bool rt2800pci_txdone_release_entries(struct queue_entry *entry,
|
||||
void *data)
|
||||
{
|
||||
if (test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
|
||||
rt2800_txdone_entry(entry, entry->status,
|
||||
rt2800pci_get_txwi(entry));
|
||||
return false;
|
||||
}
|
||||
|
||||
/* No more frames to release */
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
struct queue_entry *entry;
|
||||
u32 status;
|
||||
u8 qid;
|
||||
int max_tx_done = 16;
|
||||
@@ -748,8 +843,8 @@ static bool rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
* Unknown queue, this shouldn't happen. Just drop
|
||||
* this tx status.
|
||||
*/
|
||||
WARNING(rt2x00dev, "Got TX status report with "
|
||||
"unexpected pid %u, dropping\n", qid);
|
||||
rt2x00_warn(rt2x00dev, "Got TX status report with unexpected pid %u, dropping\n",
|
||||
qid);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -759,8 +854,8 @@ static bool rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
* The queue is NULL, this shouldn't happen. Stop
|
||||
* processing here and drop the tx status
|
||||
*/
|
||||
WARNING(rt2x00dev, "Got TX status for an unavailable "
|
||||
"queue %u, dropping\n", qid);
|
||||
rt2x00_warn(rt2x00dev, "Got TX status for an unavailable queue %u, dropping\n",
|
||||
qid);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -769,13 +864,37 @@ static bool rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
* The queue is empty. Stop processing here
|
||||
* and drop the tx status.
|
||||
*/
|
||||
WARNING(rt2x00dev, "Got TX status for an empty "
|
||||
"queue %u, dropping\n", qid);
|
||||
rt2x00_warn(rt2x00dev, "Got TX status for an empty queue %u, dropping\n",
|
||||
qid);
|
||||
break;
|
||||
}
|
||||
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
|
||||
rt2800_txdone_entry(entry, status, rt2800pci_get_txwi(entry));
|
||||
/*
|
||||
* Let's associate this tx status with the first
|
||||
* matching frame.
|
||||
*/
|
||||
if (!rt2x00queue_for_each_entry(queue, Q_INDEX_DONE,
|
||||
Q_INDEX, &status,
|
||||
rt2800pci_txdone_find_entry)) {
|
||||
/*
|
||||
* We cannot match the tx status to any frame, so just
|
||||
* use the first one.
|
||||
*/
|
||||
if (!rt2x00queue_for_each_entry(queue, Q_INDEX_DONE,
|
||||
Q_INDEX, &status,
|
||||
rt2800pci_txdone_match_first)) {
|
||||
rt2x00_warn(rt2x00dev, "No frame found for TX status on queue %u, dropping\n",
|
||||
qid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Release all frames with a valid tx status.
|
||||
*/
|
||||
rt2x00queue_for_each_entry(queue, Q_INDEX_DONE,
|
||||
Q_INDEX, NULL,
|
||||
rt2800pci_txdone_release_entries);
|
||||
|
||||
if (--max_tx_done == 0)
|
||||
break;
|
||||
@@ -794,9 +913,9 @@ static inline void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,
|
||||
* access needs locking.
|
||||
*/
|
||||
spin_lock_irq(&rt2x00dev->irqmask_lock);
|
||||
rt2x00pci_register_read(rt2x00dev, INT_MASK_CSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, INT_MASK_CSR, ®);
|
||||
rt2x00_set_field32(®, irq_field, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
||||
spin_unlock_irq(&rt2x00dev->irqmask_lock);
|
||||
}
|
||||
|
||||
@@ -837,15 +956,15 @@ static void rt2800pci_tbtt_tasklet(unsigned long data)
|
||||
* interval every 64 beacons by 64us to mitigate this effect.
|
||||
*/
|
||||
if (drv_data->tbtt_tick == (BCN_TBTT_OFFSET - 2)) {
|
||||
rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_INTERVAL,
|
||||
(rt2x00dev->beacon_int * 16) - 1);
|
||||
rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
} else if (drv_data->tbtt_tick == (BCN_TBTT_OFFSET - 1)) {
|
||||
rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG, ®);
|
||||
rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_INTERVAL,
|
||||
(rt2x00dev->beacon_int * 16));
|
||||
rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
|
||||
}
|
||||
drv_data->tbtt_tick++;
|
||||
drv_data->tbtt_tick %= BCN_TBTT_OFFSET;
|
||||
@@ -858,7 +977,7 @@ static void rt2800pci_tbtt_tasklet(unsigned long data)
|
||||
static void rt2800pci_rxdone_tasklet(unsigned long data)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||
if (rt2x00pci_rxdone(rt2x00dev))
|
||||
if (rt2x00mmio_rxdone(rt2x00dev))
|
||||
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
|
||||
else if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE);
|
||||
@@ -896,14 +1015,13 @@ static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
|
||||
* need to lock the kfifo.
|
||||
*/
|
||||
for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, TX_STA_FIFO, &status);
|
||||
rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status);
|
||||
|
||||
if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
|
||||
break;
|
||||
|
||||
if (!kfifo_put(&rt2x00dev->txstatus_fifo, &status)) {
|
||||
WARNING(rt2x00dev, "TX status FIFO overrun,"
|
||||
"drop tx status report.\n");
|
||||
rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx status report\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -918,8 +1036,8 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)
|
||||
u32 reg, mask;
|
||||
|
||||
/* Read status and ACK all interrupts */
|
||||
rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, ®);
|
||||
rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
|
||||
rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, ®);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
|
||||
|
||||
if (!reg)
|
||||
return IRQ_NONE;
|
||||
@@ -959,9 +1077,9 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)
|
||||
* the tasklet will reenable the appropriate interrupts.
|
||||
*/
|
||||
spin_lock(&rt2x00dev->irqmask_lock);
|
||||
rt2x00pci_register_read(rt2x00dev, INT_MASK_CSR, ®);
|
||||
rt2x00mmio_register_read(rt2x00dev, INT_MASK_CSR, ®);
|
||||
reg &= mask;
|
||||
rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
||||
rt2x00mmio_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
||||
spin_unlock(&rt2x00dev->irqmask_lock);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -970,14 +1088,18 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)
|
||||
/*
|
||||
* Device probe functions.
|
||||
*/
|
||||
static void rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
static int rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (rt2x00_is_soc(rt2x00dev))
|
||||
rt2800pci_read_eeprom_soc(rt2x00dev);
|
||||
retval = rt2800pci_read_eeprom_soc(rt2x00dev);
|
||||
else if (rt2800pci_efuse_detect(rt2x00dev))
|
||||
rt2800pci_read_eeprom_efuse(rt2x00dev);
|
||||
retval = rt2800pci_read_eeprom_efuse(rt2x00dev);
|
||||
else
|
||||
rt2800pci_read_eeprom_pci(rt2x00dev);
|
||||
retval = rt2800pci_read_eeprom_pci(rt2x00dev);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static const struct ieee80211_ops rt2800pci_mac80211_ops = {
|
||||
@@ -1008,13 +1130,13 @@ static const struct ieee80211_ops rt2800pci_mac80211_ops = {
|
||||
};
|
||||
|
||||
static const struct rt2800_ops rt2800pci_rt2800_ops = {
|
||||
.register_read = rt2x00pci_register_read,
|
||||
.register_read_lock = rt2x00pci_register_read, /* same for PCI */
|
||||
.register_write = rt2x00pci_register_write,
|
||||
.register_write_lock = rt2x00pci_register_write, /* same for PCI */
|
||||
.register_multiread = rt2x00pci_register_multiread,
|
||||
.register_multiwrite = rt2x00pci_register_multiwrite,
|
||||
.regbusy_read = rt2x00pci_regbusy_read,
|
||||
.register_read = rt2x00mmio_register_read,
|
||||
.register_read_lock = rt2x00mmio_register_read, /* same for PCI */
|
||||
.register_write = rt2x00mmio_register_write,
|
||||
.register_write_lock = rt2x00mmio_register_write, /* same for PCI */
|
||||
.register_multiread = rt2x00mmio_register_multiread,
|
||||
.register_multiwrite = rt2x00mmio_register_multiwrite,
|
||||
.regbusy_read = rt2x00mmio_regbusy_read,
|
||||
.read_eeprom = rt2800pci_read_eeprom,
|
||||
.hwcrypt_disabled = rt2800pci_hwcrypt_disabled,
|
||||
.drv_write_firmware = rt2800pci_write_firmware,
|
||||
@@ -1033,8 +1155,8 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
|
||||
.get_firmware_name = rt2800pci_get_firmware_name,
|
||||
.check_firmware = rt2800_check_firmware,
|
||||
.load_firmware = rt2800_load_firmware,
|
||||
.initialize = rt2x00pci_initialize,
|
||||
.uninitialize = rt2x00pci_uninitialize,
|
||||
.initialize = rt2x00mmio_initialize,
|
||||
.uninitialize = rt2x00mmio_uninitialize,
|
||||
.get_entry_state = rt2800pci_get_entry_state,
|
||||
.clear_entry = rt2800pci_clear_entry,
|
||||
.set_device_state = rt2800pci_set_device_state,
|
||||
@@ -1047,7 +1169,7 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
|
||||
.start_queue = rt2800pci_start_queue,
|
||||
.kick_queue = rt2800pci_kick_queue,
|
||||
.stop_queue = rt2800pci_stop_queue,
|
||||
.flush_queue = rt2x00pci_flush_queue,
|
||||
.flush_queue = rt2x00mmio_flush_queue,
|
||||
.write_tx_desc = rt2800pci_write_tx_desc,
|
||||
.write_tx_data = rt2800_write_tx_data,
|
||||
.write_beacon = rt2800_write_beacon,
|
||||
@@ -1068,21 +1190,24 @@ static const struct data_queue_desc rt2800pci_queue_rx = {
|
||||
.entry_num = 128,
|
||||
.data_size = AGGREGATION_SIZE,
|
||||
.desc_size = RXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.winfo_size = RXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800pci_queue_tx = {
|
||||
.entry_num = 64,
|
||||
.data_size = AGGREGATION_SIZE,
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.winfo_size = TXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800pci_queue_bcn = {
|
||||
.entry_num = 8,
|
||||
.data_size = 0, /* No DMA required for beacons */
|
||||
.desc_size = TXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_pci),
|
||||
.desc_size = TXD_DESC_SIZE,
|
||||
.winfo_size = TXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_mmio),
|
||||
};
|
||||
|
||||
static const struct rt2x00_ops rt2800pci_ops = {
|
||||
@@ -1139,6 +1264,7 @@ static DEFINE_PCI_DEVICE_TABLE(rt2800pci_device_table) = {
|
||||
{ PCI_DEVICE(0x1814, 0x3562) },
|
||||
{ PCI_DEVICE(0x1814, 0x3592) },
|
||||
{ PCI_DEVICE(0x1814, 0x3593) },
|
||||
{ PCI_DEVICE(0x1814, 0x359f) },
|
||||
#endif
|
||||
#ifdef CONFIG_RT2800PCI_RT53XX
|
||||
{ PCI_DEVICE(0x1814, 0x5360) },
|
||||
@@ -1163,7 +1289,7 @@ MODULE_DEVICE_TABLE(pci, rt2800pci_device_table);
|
||||
#endif /* CONFIG_PCI */
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
|
||||
#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
|
||||
static int rt2800soc_probe(struct platform_device *pdev)
|
||||
{
|
||||
return rt2x00soc_probe(pdev, &rt2800pci_ops);
|
||||
@@ -1180,7 +1306,7 @@ static struct platform_driver rt2800soc_driver = {
|
||||
.suspend = rt2x00soc_suspend,
|
||||
.resume = rt2x00soc_resume,
|
||||
};
|
||||
#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
|
||||
#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static int rt2800pci_probe(struct pci_dev *pci_dev,
|
||||
@@ -1203,7 +1329,7 @@ static int __init rt2800pci_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
|
||||
#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
|
||||
ret = platform_driver_register(&rt2800soc_driver);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -1211,7 +1337,7 @@ static int __init rt2800pci_init(void)
|
||||
#ifdef CONFIG_PCI
|
||||
ret = pci_register_driver(&rt2800pci_driver);
|
||||
if (ret) {
|
||||
#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
|
||||
#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
|
||||
platform_driver_unregister(&rt2800soc_driver);
|
||||
#endif
|
||||
return ret;
|
||||
@@ -1226,7 +1352,7 @@ static void __exit rt2800pci_exit(void)
|
||||
#ifdef CONFIG_PCI
|
||||
pci_unregister_driver(&rt2800pci_driver);
|
||||
#endif
|
||||
#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
|
||||
#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
|
||||
platform_driver_unregister(&rt2800soc_driver);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -128,9 +128,9 @@ static inline bool rt2800usb_entry_txstatus_timeout(struct queue_entry *entry)
|
||||
|
||||
tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(100));
|
||||
if (unlikely(tout))
|
||||
WARNING(entry->queue->rt2x00dev,
|
||||
"TX status timeout for entry %d in queue %d\n",
|
||||
entry->entry_idx, entry->queue->qid);
|
||||
rt2x00_warn(entry->queue->rt2x00dev,
|
||||
"TX status timeout for entry %d in queue %d\n",
|
||||
entry->entry_idx, entry->queue->qid);
|
||||
return tout;
|
||||
|
||||
}
|
||||
@@ -156,7 +156,8 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
|
||||
bool valid;
|
||||
|
||||
if (urb_status) {
|
||||
WARNING(rt2x00dev, "TX status read failed %d\n", urb_status);
|
||||
rt2x00_warn(rt2x00dev, "TX status read failed %d\n",
|
||||
urb_status);
|
||||
|
||||
goto stop_reading;
|
||||
}
|
||||
@@ -164,7 +165,7 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
|
||||
valid = rt2x00_get_field32(tx_status, TX_STA_FIFO_VALID);
|
||||
if (valid) {
|
||||
if (!kfifo_put(&rt2x00dev->txstatus_fifo, &tx_status))
|
||||
WARNING(rt2x00dev, "TX status FIFO overrun\n");
|
||||
rt2x00_warn(rt2x00dev, "TX status FIFO overrun\n");
|
||||
|
||||
queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
|
||||
|
||||
@@ -273,7 +274,7 @@ static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev,
|
||||
0, USB_MODE_FIRMWARE,
|
||||
REGISTER_TIMEOUT_FIRMWARE);
|
||||
if (status < 0) {
|
||||
ERROR(rt2x00dev, "Failed to write Firmware to device.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to write Firmware to device\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -396,8 +397,8 @@ static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (unlikely(retval))
|
||||
ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
|
||||
state, retval);
|
||||
rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
|
||||
state, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -412,8 +413,7 @@ static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, TXRXQ_PCNT, ®);
|
||||
if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) {
|
||||
WARNING(rt2x00dev, "TX HW queue 0 timed out,"
|
||||
" invoke forced kick\n");
|
||||
rt2x00_warn(rt2x00dev, "TX HW queue 0 timed out, invoke forced kick\n");
|
||||
|
||||
rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40012);
|
||||
|
||||
@@ -428,8 +428,7 @@ static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, TXRXQ_PCNT, ®);
|
||||
if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) {
|
||||
WARNING(rt2x00dev, "TX HW queue 1 timed out,"
|
||||
" invoke forced kick\n");
|
||||
rt2x00_warn(rt2x00dev, "TX HW queue 1 timed out, invoke forced kick\n");
|
||||
|
||||
rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf4000a);
|
||||
|
||||
@@ -489,7 +488,7 @@ static void rt2800usb_write_tx_desc(struct queue_entry *entry,
|
||||
*/
|
||||
skbdesc->flags |= SKBDESC_DESC_IN_SKB;
|
||||
skbdesc->desc = txi;
|
||||
skbdesc->desc_len = TXINFO_DESC_SIZE + TXWI_DESC_SIZE;
|
||||
skbdesc->desc_len = TXINFO_DESC_SIZE + entry->queue->winfo_size;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -544,9 +543,9 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
|
||||
tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID);
|
||||
|
||||
if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) {
|
||||
WARNING(entry->queue->rt2x00dev,
|
||||
"TX status report missed for queue %d entry %d\n",
|
||||
entry->queue->qid, entry->entry_idx);
|
||||
rt2x00_dbg(entry->queue->rt2x00dev,
|
||||
"TX status report missed for queue %d entry %d\n",
|
||||
entry->queue->qid, entry->entry_idx);
|
||||
return TXDONE_UNKNOWN;
|
||||
}
|
||||
|
||||
@@ -570,8 +569,8 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
|
||||
|
||||
if (unlikely(rt2x00queue_empty(queue))) {
|
||||
WARNING(rt2x00dev, "Got TX status for an empty "
|
||||
"queue %u, dropping\n", qid);
|
||||
rt2x00_warn(rt2x00dev, "Got TX status for an empty queue %u, dropping\n",
|
||||
qid);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -579,8 +578,8 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
if (unlikely(test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
|
||||
!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))) {
|
||||
WARNING(rt2x00dev, "Data pending for entry %u "
|
||||
"in queue %u\n", entry->entry_idx, qid);
|
||||
rt2x00_warn(rt2x00dev, "Data pending for entry %u in queue %u\n",
|
||||
entry->entry_idx, qid);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -681,8 +680,8 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry,
|
||||
*/
|
||||
if (unlikely(rx_pkt_len == 0 ||
|
||||
rx_pkt_len > entry->queue->data_size)) {
|
||||
ERROR(entry->queue->rt2x00dev,
|
||||
"Bad frame size %d, forcing to 0\n", rx_pkt_len);
|
||||
rt2x00_err(entry->queue->rt2x00dev,
|
||||
"Bad frame size %d, forcing to 0\n", rx_pkt_len);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -739,13 +738,17 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry,
|
||||
/*
|
||||
* Device probe functions.
|
||||
*/
|
||||
static void rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
static int rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (rt2800_efuse_detect(rt2x00dev))
|
||||
rt2800_read_eeprom_efuse(rt2x00dev);
|
||||
retval = rt2800_read_eeprom_efuse(rt2x00dev);
|
||||
else
|
||||
rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom,
|
||||
EEPROM_SIZE);
|
||||
retval = rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom,
|
||||
EEPROM_SIZE);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
@@ -853,21 +856,24 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
|
||||
static const struct data_queue_desc rt2800usb_queue_rx = {
|
||||
.entry_num = 128,
|
||||
.data_size = AGGREGATION_SIZE,
|
||||
.desc_size = RXINFO_DESC_SIZE + RXWI_DESC_SIZE,
|
||||
.desc_size = RXINFO_DESC_SIZE,
|
||||
.winfo_size = RXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_usb),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800usb_queue_tx = {
|
||||
.entry_num = 16,
|
||||
.data_size = AGGREGATION_SIZE,
|
||||
.desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
|
||||
.desc_size = TXINFO_DESC_SIZE,
|
||||
.winfo_size = TXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_usb),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800usb_queue_bcn = {
|
||||
.entry_num = 8,
|
||||
.data_size = MGMT_FRAME_SIZE,
|
||||
.desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
|
||||
.desc_size = TXINFO_DESC_SIZE,
|
||||
.winfo_size = TXWI_DESC_SIZE,
|
||||
.priv_size = sizeof(struct queue_entry_priv_usb),
|
||||
};
|
||||
|
||||
@@ -890,6 +896,50 @@ static const struct rt2x00_ops rt2800usb_ops = {
|
||||
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800usb_queue_rx_5592 = {
|
||||
.entry_num = 128,
|
||||
.data_size = AGGREGATION_SIZE,
|
||||
.desc_size = RXINFO_DESC_SIZE,
|
||||
.winfo_size = RXWI_DESC_SIZE_5592,
|
||||
.priv_size = sizeof(struct queue_entry_priv_usb),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800usb_queue_tx_5592 = {
|
||||
.entry_num = 16,
|
||||
.data_size = AGGREGATION_SIZE,
|
||||
.desc_size = TXINFO_DESC_SIZE,
|
||||
.winfo_size = TXWI_DESC_SIZE_5592,
|
||||
.priv_size = sizeof(struct queue_entry_priv_usb),
|
||||
};
|
||||
|
||||
static const struct data_queue_desc rt2800usb_queue_bcn_5592 = {
|
||||
.entry_num = 8,
|
||||
.data_size = MGMT_FRAME_SIZE,
|
||||
.desc_size = TXINFO_DESC_SIZE,
|
||||
.winfo_size = TXWI_DESC_SIZE_5592,
|
||||
.priv_size = sizeof(struct queue_entry_priv_usb),
|
||||
};
|
||||
|
||||
|
||||
static const struct rt2x00_ops rt2800usb_ops_5592 = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.drv_data_size = sizeof(struct rt2800_drv_data),
|
||||
.max_ap_intf = 8,
|
||||
.eeprom_size = EEPROM_SIZE,
|
||||
.rf_size = RF_SIZE,
|
||||
.tx_queues = NUM_TX_QUEUES,
|
||||
.extra_tx_headroom = TXINFO_DESC_SIZE + TXWI_DESC_SIZE_5592,
|
||||
.rx = &rt2800usb_queue_rx_5592,
|
||||
.tx = &rt2800usb_queue_tx_5592,
|
||||
.bcn = &rt2800usb_queue_bcn_5592,
|
||||
.lib = &rt2800usb_rt2x00_ops,
|
||||
.drv = &rt2800usb_rt2800_ops,
|
||||
.hw = &rt2800usb_mac80211_ops,
|
||||
#ifdef CONFIG_RT2X00_LIB_DEBUGFS
|
||||
.debugfs = &rt2800_rt2x00debug,
|
||||
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
|
||||
};
|
||||
|
||||
/*
|
||||
* rt2800usb module information.
|
||||
*/
|
||||
@@ -968,6 +1018,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x07d1, 0x3c13) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c15) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c16) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c17) },
|
||||
{ USB_DEVICE(0x2001, 0x3c1b) },
|
||||
/* Draytek */
|
||||
{ USB_DEVICE(0x07fa, 0x7712) },
|
||||
@@ -1098,9 +1149,11 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x15a9, 0x0006) },
|
||||
/* Sweex */
|
||||
{ USB_DEVICE(0x177f, 0x0153) },
|
||||
{ USB_DEVICE(0x177f, 0x0164) },
|
||||
{ USB_DEVICE(0x177f, 0x0302) },
|
||||
{ USB_DEVICE(0x177f, 0x0313) },
|
||||
{ USB_DEVICE(0x177f, 0x0323) },
|
||||
{ USB_DEVICE(0x177f, 0x0324) },
|
||||
/* U-Media */
|
||||
{ USB_DEVICE(0x157e, 0x300e) },
|
||||
{ USB_DEVICE(0x157e, 0x3013) },
|
||||
@@ -1115,6 +1168,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
/* Zyxel */
|
||||
{ USB_DEVICE(0x0586, 0x3416) },
|
||||
{ USB_DEVICE(0x0586, 0x3418) },
|
||||
{ USB_DEVICE(0x0586, 0x341a) },
|
||||
{ USB_DEVICE(0x0586, 0x341e) },
|
||||
{ USB_DEVICE(0x0586, 0x343e) },
|
||||
#ifdef CONFIG_RT2800USB_RT33XX
|
||||
@@ -1131,6 +1185,9 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x148f, 0x8070) },
|
||||
/* Sitecom */
|
||||
{ USB_DEVICE(0x0df6, 0x0050) },
|
||||
/* Sweex */
|
||||
{ USB_DEVICE(0x177f, 0x0163) },
|
||||
{ USB_DEVICE(0x177f, 0x0165) },
|
||||
#endif
|
||||
#ifdef CONFIG_RT2800USB_RT35XX
|
||||
/* Allwin */
|
||||
@@ -1166,6 +1223,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
#ifdef CONFIG_RT2800USB_RT53XX
|
||||
/* Arcadyan */
|
||||
{ USB_DEVICE(0x043e, 0x7a12) },
|
||||
{ USB_DEVICE(0x043e, 0x7a32) },
|
||||
/* Azurewave */
|
||||
{ USB_DEVICE(0x13d3, 0x3329) },
|
||||
{ USB_DEVICE(0x13d3, 0x3365) },
|
||||
@@ -1177,16 +1235,32 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x2001, 0x3c1e) },
|
||||
/* LG innotek */
|
||||
{ USB_DEVICE(0x043e, 0x7a22) },
|
||||
{ USB_DEVICE(0x043e, 0x7a42) },
|
||||
/* Panasonic */
|
||||
{ USB_DEVICE(0x04da, 0x1801) },
|
||||
{ USB_DEVICE(0x04da, 0x1800) },
|
||||
{ USB_DEVICE(0x04da, 0x23f6) },
|
||||
/* Philips */
|
||||
{ USB_DEVICE(0x0471, 0x2104) },
|
||||
{ USB_DEVICE(0x0471, 0x2126) },
|
||||
{ USB_DEVICE(0x0471, 0x2180) },
|
||||
{ USB_DEVICE(0x0471, 0x2181) },
|
||||
{ USB_DEVICE(0x0471, 0x2182) },
|
||||
/* Ralink */
|
||||
{ USB_DEVICE(0x148f, 0x5370) },
|
||||
{ USB_DEVICE(0x148f, 0x5372) },
|
||||
/* Unknown */
|
||||
{ USB_DEVICE(0x04da, 0x23f6) },
|
||||
#endif
|
||||
#ifdef CONFIG_RT2800USB_RT55XX
|
||||
/* Arcadyan */
|
||||
{ USB_DEVICE(0x043e, 0x7a32), .driver_info = 5592 },
|
||||
/* AVM GmbH */
|
||||
{ USB_DEVICE(0x057c, 0x8501), .driver_info = 5592 },
|
||||
/* D-Link DWA-160-B2 */
|
||||
{ USB_DEVICE(0x2001, 0x3c1a), .driver_info = 5592 },
|
||||
/* Proware */
|
||||
{ USB_DEVICE(0x043e, 0x7a13), .driver_info = 5592 },
|
||||
/* Ralink */
|
||||
{ USB_DEVICE(0x148f, 0x5572), .driver_info = 5592 },
|
||||
#endif
|
||||
#ifdef CONFIG_RT2800USB_UNKNOWN
|
||||
/*
|
||||
@@ -1207,10 +1281,15 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x0b05, 0x1760) },
|
||||
{ USB_DEVICE(0x0b05, 0x1761) },
|
||||
{ USB_DEVICE(0x0b05, 0x1790) },
|
||||
{ USB_DEVICE(0x0b05, 0x17a7) },
|
||||
/* AzureWave */
|
||||
{ USB_DEVICE(0x13d3, 0x3262) },
|
||||
{ USB_DEVICE(0x13d3, 0x3284) },
|
||||
{ USB_DEVICE(0x13d3, 0x3322) },
|
||||
{ USB_DEVICE(0x13d3, 0x3340) },
|
||||
{ USB_DEVICE(0x13d3, 0x3399) },
|
||||
{ USB_DEVICE(0x13d3, 0x3400) },
|
||||
{ USB_DEVICE(0x13d3, 0x3401) },
|
||||
/* Belkin */
|
||||
{ USB_DEVICE(0x050d, 0x1003) },
|
||||
/* Buffalo */
|
||||
@@ -1223,13 +1302,17 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x18c5, 0x0008) },
|
||||
/* D-Link */
|
||||
{ USB_DEVICE(0x07d1, 0x3c0b) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c17) },
|
||||
/* Encore */
|
||||
{ USB_DEVICE(0x203d, 0x14a1) },
|
||||
/* EnGenius */
|
||||
{ USB_DEVICE(0x1740, 0x0600) },
|
||||
{ USB_DEVICE(0x1740, 0x0602) },
|
||||
/* Gemtek */
|
||||
{ USB_DEVICE(0x15a9, 0x0010) },
|
||||
/* Gigabyte */
|
||||
{ USB_DEVICE(0x1044, 0x800c) },
|
||||
/* Hercules */
|
||||
{ USB_DEVICE(0x06f8, 0xe036) },
|
||||
/* Huawei */
|
||||
{ USB_DEVICE(0x148f, 0xf101) },
|
||||
/* I-O DATA */
|
||||
@@ -1256,13 +1339,17 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x0df6, 0x004a) },
|
||||
{ USB_DEVICE(0x0df6, 0x004d) },
|
||||
{ USB_DEVICE(0x0df6, 0x0053) },
|
||||
{ USB_DEVICE(0x0df6, 0x0069) },
|
||||
{ USB_DEVICE(0x0df6, 0x006f) },
|
||||
/* SMC */
|
||||
{ USB_DEVICE(0x083a, 0xa512) },
|
||||
{ USB_DEVICE(0x083a, 0xc522) },
|
||||
{ USB_DEVICE(0x083a, 0xd522) },
|
||||
{ USB_DEVICE(0x083a, 0xf511) },
|
||||
/* Zyxel */
|
||||
{ USB_DEVICE(0x0586, 0x341a) },
|
||||
/* Sweex */
|
||||
{ USB_DEVICE(0x177f, 0x0254) },
|
||||
/* TP-LINK */
|
||||
{ USB_DEVICE(0xf201, 0x5370) },
|
||||
#endif
|
||||
{ 0, }
|
||||
};
|
||||
@@ -1278,6 +1365,9 @@ MODULE_LICENSE("GPL");
|
||||
static int rt2800usb_probe(struct usb_interface *usb_intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
if (id->driver_info == 5592)
|
||||
return rt2x00usb_probe(usb_intf, &rt2800usb_ops_5592);
|
||||
|
||||
return rt2x00usb_probe(usb_intf, &rt2800usb_ops);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,49 +54,36 @@
|
||||
#define DRV_VERSION "2.3.0"
|
||||
#define DRV_PROJECT "http://rt2x00.serialmonkey.com"
|
||||
|
||||
/*
|
||||
* Debug definitions.
|
||||
/* Debug definitions.
|
||||
* Debug output has to be enabled during compile time.
|
||||
*/
|
||||
#define DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, __args...) \
|
||||
printk(__kernlvl "%s -> %s: %s - " __msg, \
|
||||
wiphy_name((__dev)->hw->wiphy), __func__, __lvl, ##__args)
|
||||
|
||||
#define DEBUG_PRINTK_PROBE(__kernlvl, __lvl, __msg, __args...) \
|
||||
printk(__kernlvl "%s -> %s: %s - " __msg, \
|
||||
KBUILD_MODNAME, __func__, __lvl, ##__args)
|
||||
|
||||
#ifdef CONFIG_RT2X00_DEBUG
|
||||
#define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...) \
|
||||
DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, ##__args)
|
||||
#else
|
||||
#define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...) \
|
||||
do { } while (0)
|
||||
#define DEBUG
|
||||
#endif /* CONFIG_RT2X00_DEBUG */
|
||||
|
||||
/*
|
||||
* Various debug levels.
|
||||
* The debug levels PANIC and ERROR both indicate serious problems,
|
||||
* for this reason they should never be ignored.
|
||||
* The special ERROR_PROBE message is for messages that are generated
|
||||
* when the rt2x00_dev is not yet initialized.
|
||||
/* Utility printing macros
|
||||
* rt2x00_probe_err is for messages when rt2x00_dev is uninitialized
|
||||
*/
|
||||
#define PANIC(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK_MSG(__dev, KERN_CRIT, "Panic", __msg, ##__args)
|
||||
#define ERROR(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK_MSG(__dev, KERN_ERR, "Error", __msg, ##__args)
|
||||
#define ERROR_PROBE(__msg, __args...) \
|
||||
DEBUG_PRINTK_PROBE(KERN_ERR, "Error", __msg, ##__args)
|
||||
#define WARNING(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK(__dev, KERN_WARNING, "Warning", __msg, ##__args)
|
||||
#define NOTICE(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK(__dev, KERN_NOTICE, "Notice", __msg, ##__args)
|
||||
#define INFO(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK(__dev, KERN_INFO, "Info", __msg, ##__args)
|
||||
#define DEBUG(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK(__dev, KERN_DEBUG, "Debug", __msg, ##__args)
|
||||
#define EEPROM(__dev, __msg, __args...) \
|
||||
DEBUG_PRINTK(__dev, KERN_DEBUG, "EEPROM recovery", __msg, ##__args)
|
||||
#define rt2x00_probe_err(fmt, ...) \
|
||||
printk(KERN_ERR KBUILD_MODNAME ": %s: Error - " fmt, \
|
||||
__func__, ##__VA_ARGS__)
|
||||
#define rt2x00_err(dev, fmt, ...) \
|
||||
wiphy_err((dev)->hw->wiphy, "%s: Error - " fmt, \
|
||||
__func__, ##__VA_ARGS__)
|
||||
#define rt2x00_warn(dev, fmt, ...) \
|
||||
wiphy_warn((dev)->hw->wiphy, "%s: Warning - " fmt, \
|
||||
__func__, ##__VA_ARGS__)
|
||||
#define rt2x00_info(dev, fmt, ...) \
|
||||
wiphy_info((dev)->hw->wiphy, "%s: Info - " fmt, \
|
||||
__func__, ##__VA_ARGS__)
|
||||
|
||||
/* Various debug levels */
|
||||
#define rt2x00_dbg(dev, fmt, ...) \
|
||||
wiphy_dbg((dev)->hw->wiphy, "%s: Debug - " fmt, \
|
||||
__func__, ##__VA_ARGS__)
|
||||
#define rt2x00_eeprom_dbg(dev, fmt, ...) \
|
||||
wiphy_dbg((dev)->hw->wiphy, "%s: EEPROM recovery - " fmt, \
|
||||
__func__, ##__VA_ARGS__)
|
||||
|
||||
/*
|
||||
* Duration calculations
|
||||
@@ -195,6 +182,7 @@ struct rt2x00_chip {
|
||||
#define RT3883 0x3883 /* WSOC */
|
||||
#define RT5390 0x5390 /* 2.4GHz */
|
||||
#define RT5392 0x5392 /* 2.4GHz */
|
||||
#define RT5592 0x5592
|
||||
|
||||
u16 rf;
|
||||
u16 rev;
|
||||
@@ -1017,6 +1005,26 @@ struct rt2x00_dev {
|
||||
* Protect the interrupt mask register.
|
||||
*/
|
||||
spinlock_t irqmask_lock;
|
||||
|
||||
/*
|
||||
* List of BlockAckReq TX entries that need driver BlockAck processing.
|
||||
*/
|
||||
struct list_head bar_list;
|
||||
spinlock_t bar_list_lock;
|
||||
};
|
||||
|
||||
struct rt2x00_bar_list_entry {
|
||||
struct list_head list;
|
||||
struct rcu_head head;
|
||||
|
||||
struct queue_entry *entry;
|
||||
int block_acked;
|
||||
|
||||
/* Relevant parts of the IEEE80211 BAR header */
|
||||
__u8 ra[6];
|
||||
__u8 ta[6];
|
||||
__le16 control;
|
||||
__le16 start_seq_num;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -1047,8 +1055,7 @@ static inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic EEPROM access.
|
||||
* The EEPROM is being accessed by word index.
|
||||
* Generic EEPROM access. The EEPROM is being accessed by word or byte index.
|
||||
*/
|
||||
static inline void *rt2x00_eeprom_addr(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int word)
|
||||
@@ -1068,6 +1075,12 @@ static inline void rt2x00_eeprom_write(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00dev->eeprom[word] = cpu_to_le16(data);
|
||||
}
|
||||
|
||||
static inline u8 rt2x00_eeprom_byte(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int byte)
|
||||
{
|
||||
return *(((u8 *)rt2x00dev->eeprom) + byte);
|
||||
}
|
||||
|
||||
/*
|
||||
* Chipset handlers
|
||||
*/
|
||||
@@ -1078,9 +1091,27 @@ static inline void rt2x00_set_chip(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00dev->chip.rf = rf;
|
||||
rt2x00dev->chip.rev = rev;
|
||||
|
||||
INFO(rt2x00dev,
|
||||
"Chipset detected - rt: %04x, rf: %04x, rev: %04x.\n",
|
||||
rt2x00dev->chip.rt, rt2x00dev->chip.rf, rt2x00dev->chip.rev);
|
||||
rt2x00_info(rt2x00dev, "Chipset detected - rt: %04x, rf: %04x, rev: %04x\n",
|
||||
rt2x00dev->chip.rt, rt2x00dev->chip.rf,
|
||||
rt2x00dev->chip.rev);
|
||||
}
|
||||
|
||||
static inline void rt2x00_set_rt(struct rt2x00_dev *rt2x00dev,
|
||||
const u16 rt, const u16 rev)
|
||||
{
|
||||
rt2x00dev->chip.rt = rt;
|
||||
rt2x00dev->chip.rev = rev;
|
||||
|
||||
rt2x00_info(rt2x00dev, "RT chipset %04x, rev %04x detected\n",
|
||||
rt2x00dev->chip.rt, rt2x00dev->chip.rev);
|
||||
}
|
||||
|
||||
static inline void rt2x00_set_rf(struct rt2x00_dev *rt2x00dev, const u16 rf)
|
||||
{
|
||||
rt2x00dev->chip.rf = rf;
|
||||
|
||||
rt2x00_info(rt2x00dev, "RF chipset %04x detected\n",
|
||||
rt2x00dev->chip.rf);
|
||||
}
|
||||
|
||||
static inline bool rt2x00_rt(struct rt2x00_dev *rt2x00dev, const u16 rt)
|
||||
@@ -1152,8 +1183,10 @@ static inline bool rt2x00_is_soc(struct rt2x00_dev *rt2x00dev)
|
||||
/**
|
||||
* rt2x00queue_map_txskb - Map a skb into DMA for TX purposes.
|
||||
* @entry: Pointer to &struct queue_entry
|
||||
*
|
||||
* Returns -ENOMEM if mapping fail, 0 otherwise.
|
||||
*/
|
||||
void rt2x00queue_map_txskb(struct queue_entry *entry);
|
||||
int rt2x00queue_map_txskb(struct queue_entry *entry);
|
||||
|
||||
/**
|
||||
* rt2x00queue_unmap_skb - Unmap a skb from DMA.
|
||||
@@ -1341,7 +1374,7 @@ int rt2x00mac_conf_tx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif, u16 queue,
|
||||
const struct ieee80211_tx_queue_params *params);
|
||||
void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw);
|
||||
void rt2x00mac_flush(struct ieee80211_hw *hw, bool drop);
|
||||
void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop);
|
||||
int rt2x00mac_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant);
|
||||
int rt2x00mac_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant);
|
||||
void rt2x00mac_get_ringparam(struct ieee80211_hw *hw,
|
||||
|
||||
@@ -184,7 +184,7 @@ static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev,
|
||||
/*
|
||||
* Initialize center channel to current channel.
|
||||
*/
|
||||
center_channel = spec->channels[conf->channel->hw_value].channel;
|
||||
center_channel = spec->channels[conf->chandef.chan->hw_value].channel;
|
||||
|
||||
/*
|
||||
* Adjust center channel to HT40+ and HT40- operation.
|
||||
@@ -199,7 +199,7 @@ static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev,
|
||||
return i;
|
||||
|
||||
WARN_ON(1);
|
||||
return conf->channel->hw_value;
|
||||
return conf->chandef.chan->hw_value;
|
||||
}
|
||||
|
||||
void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -227,7 +227,7 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
|
||||
hw_value = rt2x00ht_center_channel(rt2x00dev, conf);
|
||||
} else {
|
||||
clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
|
||||
hw_value = conf->channel->hw_value;
|
||||
hw_value = conf->chandef.chan->hw_value;
|
||||
}
|
||||
|
||||
memcpy(&libconf.rf,
|
||||
@@ -279,8 +279,8 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
|
||||
else
|
||||
clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags);
|
||||
|
||||
rt2x00dev->curr_band = conf->channel->band;
|
||||
rt2x00dev->curr_freq = conf->channel->center_freq;
|
||||
rt2x00dev->curr_band = conf->chandef.chan->band;
|
||||
rt2x00dev->curr_freq = conf->chandef.chan->center_freq;
|
||||
rt2x00dev->tx_power = conf->power_level;
|
||||
rt2x00dev->short_retry = conf->short_frame_max_tx_count;
|
||||
rt2x00dev->long_retry = conf->long_frame_max_tx_count;
|
||||
|
||||
@@ -174,7 +174,7 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
|
||||
do_gettimeofday(×tamp);
|
||||
|
||||
if (skb_queue_len(&intf->frame_dump_skbqueue) > 20) {
|
||||
DEBUG(rt2x00dev, "txrx dump queue length exceeded.\n");
|
||||
rt2x00_dbg(rt2x00dev, "txrx dump queue length exceeded\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
|
||||
skbcopy = alloc_skb(sizeof(*dump_hdr) + skbdesc->desc_len + data_len,
|
||||
GFP_ATOMIC);
|
||||
if (!skbcopy) {
|
||||
DEBUG(rt2x00dev, "Failed to copy skb for dump.\n");
|
||||
rt2x00_dbg(rt2x00dev, "Failed to copy skb for dump\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -657,7 +657,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
intf = kzalloc(sizeof(struct rt2x00debug_intf), GFP_KERNEL);
|
||||
if (!intf) {
|
||||
ERROR(rt2x00dev, "Failed to allocate debug handler.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to allocate debug handler\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -760,7 +760,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
exit:
|
||||
rt2x00debug_deregister(rt2x00dev);
|
||||
ERROR(rt2x00dev, "Failed to register debug handler.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to register debug handler\n");
|
||||
}
|
||||
|
||||
void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
@@ -171,7 +171,7 @@ static void rt2x00lib_autowakeup(struct work_struct *work)
|
||||
return;
|
||||
|
||||
if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
|
||||
ERROR(rt2x00dev, "Device failed to wakeup.\n");
|
||||
rt2x00_err(rt2x00dev, "Device failed to wakeup\n");
|
||||
clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags);
|
||||
}
|
||||
|
||||
@@ -272,6 +272,50 @@ void rt2x00lib_dmadone(struct queue_entry *entry)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00lib_dmadone);
|
||||
|
||||
static inline int rt2x00lib_txdone_bar_status(struct queue_entry *entry)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct ieee80211_bar *bar = (void *) entry->skb->data;
|
||||
struct rt2x00_bar_list_entry *bar_entry;
|
||||
int ret;
|
||||
|
||||
if (likely(!ieee80211_is_back_req(bar->frame_control)))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Unlike all other frames, the status report for BARs does
|
||||
* not directly come from the hardware as it is incapable of
|
||||
* matching a BA to a previously send BAR. The hardware will
|
||||
* report all BARs as if they weren't acked at all.
|
||||
*
|
||||
* Instead the RX-path will scan for incoming BAs and set the
|
||||
* block_acked flag if it sees one that was likely caused by
|
||||
* a BAR from us.
|
||||
*
|
||||
* Remove remaining BARs here and return their status for
|
||||
* TX done processing.
|
||||
*/
|
||||
ret = 0;
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(bar_entry, &rt2x00dev->bar_list, list) {
|
||||
if (bar_entry->entry != entry)
|
||||
continue;
|
||||
|
||||
spin_lock_bh(&rt2x00dev->bar_list_lock);
|
||||
/* Return whether this BAR was blockacked or not */
|
||||
ret = bar_entry->block_acked;
|
||||
/* Remove the BAR from our checklist */
|
||||
list_del_rcu(&bar_entry->list);
|
||||
spin_unlock_bh(&rt2x00dev->bar_list_lock);
|
||||
kfree_rcu(bar_entry, head);
|
||||
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void rt2x00lib_txdone(struct queue_entry *entry,
|
||||
struct txdone_entry_desc *txdesc)
|
||||
{
|
||||
@@ -325,9 +369,12 @@ void rt2x00lib_txdone(struct queue_entry *entry,
|
||||
rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry->skb);
|
||||
|
||||
/*
|
||||
* Determine if the frame has been successfully transmitted.
|
||||
* Determine if the frame has been successfully transmitted and
|
||||
* remove BARs from our check list while checking for their
|
||||
* TX status.
|
||||
*/
|
||||
success =
|
||||
rt2x00lib_txdone_bar_status(entry) ||
|
||||
test_bit(TXDONE_SUCCESS, &txdesc->flags) ||
|
||||
test_bit(TXDONE_UNKNOWN, &txdesc->flags);
|
||||
|
||||
@@ -492,6 +539,50 @@ static void rt2x00lib_sleep(struct work_struct *work)
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
|
||||
static void rt2x00lib_rxdone_check_ba(struct rt2x00_dev *rt2x00dev,
|
||||
struct sk_buff *skb,
|
||||
struct rxdone_entry_desc *rxdesc)
|
||||
{
|
||||
struct rt2x00_bar_list_entry *entry;
|
||||
struct ieee80211_bar *ba = (void *)skb->data;
|
||||
|
||||
if (likely(!ieee80211_is_back(ba->frame_control)))
|
||||
return;
|
||||
|
||||
if (rxdesc->size < sizeof(*ba) + FCS_LEN)
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(entry, &rt2x00dev->bar_list, list) {
|
||||
|
||||
if (ba->start_seq_num != entry->start_seq_num)
|
||||
continue;
|
||||
|
||||
#define TID_CHECK(a, b) ( \
|
||||
((a) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK)) == \
|
||||
((b) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK))) \
|
||||
|
||||
if (!TID_CHECK(ba->control, entry->control))
|
||||
continue;
|
||||
|
||||
#undef TID_CHECK
|
||||
|
||||
if (compare_ether_addr(ba->ra, entry->ta))
|
||||
continue;
|
||||
|
||||
if (compare_ether_addr(ba->ta, entry->ra))
|
||||
continue;
|
||||
|
||||
/* Mark BAR since we received the according BA */
|
||||
spin_lock_bh(&rt2x00dev->bar_list_lock);
|
||||
entry->block_acked = 1;
|
||||
spin_unlock_bh(&rt2x00dev->bar_list_lock);
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
}
|
||||
|
||||
static void rt2x00lib_rxdone_check_ps(struct rt2x00_dev *rt2x00dev,
|
||||
struct sk_buff *skb,
|
||||
struct rxdone_entry_desc *rxdesc)
|
||||
@@ -583,9 +674,8 @@ static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev,
|
||||
break;
|
||||
}
|
||||
|
||||
WARNING(rt2x00dev, "Frame received with unrecognized signal, "
|
||||
"mode=0x%.4x, signal=0x%.4x, type=%d.\n",
|
||||
rxdesc->rate_mode, signal, type);
|
||||
rt2x00_warn(rt2x00dev, "Frame received with unrecognized signal, mode=0x%.4x, signal=0x%.4x, type=%d\n",
|
||||
rxdesc->rate_mode, signal, type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -630,8 +720,8 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp)
|
||||
*/
|
||||
if (unlikely(rxdesc.size == 0 ||
|
||||
rxdesc.size > entry->queue->data_size)) {
|
||||
ERROR(rt2x00dev, "Wrong frame size %d max %d.\n",
|
||||
rxdesc.size, entry->queue->data_size);
|
||||
rt2x00_err(rt2x00dev, "Wrong frame size %d max %d\n",
|
||||
rxdesc.size, entry->queue->data_size);
|
||||
dev_kfree_skb(entry->skb);
|
||||
goto renew_skb;
|
||||
}
|
||||
@@ -674,6 +764,12 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp)
|
||||
*/
|
||||
rt2x00lib_rxdone_check_ps(rt2x00dev, entry->skb, &rxdesc);
|
||||
|
||||
/*
|
||||
* Check for incoming BlockAcks to match to the BlockAckReqs
|
||||
* we've send out.
|
||||
*/
|
||||
rt2x00lib_rxdone_check_ba(rt2x00dev, entry->skb, &rxdesc);
|
||||
|
||||
/*
|
||||
* Update extra components
|
||||
*/
|
||||
@@ -910,7 +1006,7 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
exit_free_channels:
|
||||
kfree(channels);
|
||||
ERROR(rt2x00dev, "Allocation ieee80211 modes failed.\n");
|
||||
rt2x00_err(rt2x00dev, "Allocation ieee80211 modes failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -1148,6 +1244,9 @@ static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)
|
||||
if_limit = &rt2x00dev->if_limits_ap;
|
||||
if_limit->max = rt2x00dev->ops->max_ap_intf;
|
||||
if_limit->types = BIT(NL80211_IFTYPE_AP);
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
if_limit->types |= BIT(NL80211_IFTYPE_MESH_POINT);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Build up AP interface combinations structure.
|
||||
@@ -1191,6 +1290,8 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
spin_lock_init(&rt2x00dev->irqmask_lock);
|
||||
mutex_init(&rt2x00dev->csr_mutex);
|
||||
INIT_LIST_HEAD(&rt2x00dev->bar_list);
|
||||
spin_lock_init(&rt2x00dev->bar_list_lock);
|
||||
|
||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
|
||||
@@ -1243,7 +1344,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
*/
|
||||
retval = rt2x00dev->ops->lib->probe_hw(rt2x00dev);
|
||||
if (retval) {
|
||||
ERROR(rt2x00dev, "Failed to allocate device.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to allocate device\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -1259,7 +1360,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
*/
|
||||
retval = rt2x00lib_probe_hw(rt2x00dev);
|
||||
if (retval) {
|
||||
ERROR(rt2x00dev, "Failed to initialize hw.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to initialize hw\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -1368,7 +1469,7 @@ EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
|
||||
#ifdef CONFIG_PM
|
||||
int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state)
|
||||
{
|
||||
NOTICE(rt2x00dev, "Going to sleep.\n");
|
||||
rt2x00_dbg(rt2x00dev, "Going to sleep\n");
|
||||
|
||||
/*
|
||||
* Prevent mac80211 from accessing driver while suspended.
|
||||
@@ -1399,8 +1500,7 @@ int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state)
|
||||
* device is as good as disabled.
|
||||
*/
|
||||
if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_SLEEP))
|
||||
WARNING(rt2x00dev, "Device failed to enter sleep state, "
|
||||
"continue suspending.\n");
|
||||
rt2x00_warn(rt2x00dev, "Device failed to enter sleep state, continue suspending\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1408,7 +1508,7 @@ EXPORT_SYMBOL_GPL(rt2x00lib_suspend);
|
||||
|
||||
int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
NOTICE(rt2x00dev, "Waking up.\n");
|
||||
rt2x00_dbg(rt2x00dev, "Waking up\n");
|
||||
|
||||
/*
|
||||
* Restore/enable extra components.
|
||||
|
||||
@@ -42,28 +42,28 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev)
|
||||
*/
|
||||
fw_name = rt2x00dev->ops->lib->get_firmware_name(rt2x00dev);
|
||||
if (!fw_name) {
|
||||
ERROR(rt2x00dev,
|
||||
"Invalid firmware filename.\n"
|
||||
"Please file bug report to %s.\n", DRV_PROJECT);
|
||||
rt2x00_err(rt2x00dev,
|
||||
"Invalid firmware filename\n"
|
||||
"Please file bug report to %s\n", DRV_PROJECT);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
INFO(rt2x00dev, "Loading firmware file '%s'.\n", fw_name);
|
||||
rt2x00_info(rt2x00dev, "Loading firmware file '%s'\n", fw_name);
|
||||
|
||||
retval = request_firmware(&fw, fw_name, device);
|
||||
if (retval) {
|
||||
ERROR(rt2x00dev, "Failed to request Firmware.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to request Firmware\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (!fw || !fw->size || !fw->data) {
|
||||
ERROR(rt2x00dev, "Failed to read Firmware.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to read Firmware\n");
|
||||
release_firmware(fw);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
INFO(rt2x00dev, "Firmware detected - version: %d.%d.\n",
|
||||
fw->data[fw->size - 4], fw->data[fw->size - 3]);
|
||||
rt2x00_info(rt2x00dev, "Firmware detected - version: %d.%d\n",
|
||||
fw->data[fw->size - 4], fw->data[fw->size - 3]);
|
||||
snprintf(rt2x00dev->hw->wiphy->fw_version,
|
||||
sizeof(rt2x00dev->hw->wiphy->fw_version), "%d.%d",
|
||||
fw->data[fw->size - 4], fw->data[fw->size - 3]);
|
||||
@@ -73,15 +73,14 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev)
|
||||
case FW_OK:
|
||||
break;
|
||||
case FW_BAD_CRC:
|
||||
ERROR(rt2x00dev, "Firmware checksum error.\n");
|
||||
rt2x00_err(rt2x00dev, "Firmware checksum error\n");
|
||||
goto exit;
|
||||
case FW_BAD_LENGTH:
|
||||
ERROR(rt2x00dev,
|
||||
"Invalid firmware file length (len=%zu)\n", fw->size);
|
||||
rt2x00_err(rt2x00dev, "Invalid firmware file length (len=%zu)\n",
|
||||
fw->size);
|
||||
goto exit;
|
||||
case FW_BAD_VERSION:
|
||||
ERROR(rt2x00dev,
|
||||
"Current firmware does not support detected chipset.\n");
|
||||
rt2x00_err(rt2x00dev, "Current firmware does not support detected chipset\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ static int rt2x00leds_register_led(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
retval = led_classdev_register(device, &led->led_dev);
|
||||
if (retval) {
|
||||
ERROR(rt2x00dev, "Failed to register led handler.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to register led handler\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
skb = dev_alloc_skb(data_length + rt2x00dev->hw->extra_tx_headroom);
|
||||
if (unlikely(!skb)) {
|
||||
WARNING(rt2x00dev, "Failed to create RTS/CTS frame.\n");
|
||||
rt2x00_warn(rt2x00dev, "Failed to create RTS/CTS frame\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
|
||||
retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true);
|
||||
if (retval) {
|
||||
dev_kfree_skb_any(skb);
|
||||
WARNING(rt2x00dev, "Failed to send RTS/CTS frame.\n");
|
||||
rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n");
|
||||
}
|
||||
|
||||
return retval;
|
||||
@@ -126,9 +126,9 @@ void rt2x00mac_tx(struct ieee80211_hw *hw,
|
||||
|
||||
queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
|
||||
if (unlikely(!queue)) {
|
||||
ERROR(rt2x00dev,
|
||||
"Attempt to send packet over invalid queue %d.\n"
|
||||
"Please file bug report to %s.\n", qid, DRV_PROJECT);
|
||||
rt2x00_err(rt2x00dev,
|
||||
"Attempt to send packet over invalid queue %d\n"
|
||||
"Please file bug report to %s\n", qid, DRV_PROJECT);
|
||||
goto exit_free_skb;
|
||||
}
|
||||
|
||||
@@ -735,9 +735,10 @@ int rt2x00mac_conf_tx(struct ieee80211_hw *hw,
|
||||
queue->aifs = params->aifs;
|
||||
queue->txop = params->txop;
|
||||
|
||||
INFO(rt2x00dev,
|
||||
"Configured TX queue %d - CWmin: %d, CWmax: %d, Aifs: %d, TXop: %d.\n",
|
||||
queue_idx, queue->cw_min, queue->cw_max, queue->aifs, queue->txop);
|
||||
rt2x00_dbg(rt2x00dev,
|
||||
"Configured TX queue %d - CWmin: %d, CWmax: %d, Aifs: %d, TXop: %d\n",
|
||||
queue_idx, queue->cw_min, queue->cw_max, queue->aifs,
|
||||
queue->txop);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -752,7 +753,7 @@ void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mac_rfkill_poll);
|
||||
|
||||
void rt2x00mac_flush(struct ieee80211_hw *hw, bool drop)
|
||||
void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
struct data_queue *queue;
|
||||
|
||||
216
drivers/net/wireless/rt2x00/rt2x00mmio.c
Normal file
216
drivers/net/wireless/rt2x00/rt2x00mmio.c
Normal file
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
|
||||
<http://rt2x00.serialmonkey.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the
|
||||
Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
Module: rt2x00mmio
|
||||
Abstract: rt2x00 generic mmio device routines.
|
||||
*/
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00mmio.h"
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
*/
|
||||
int rt2x00mmio_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
const struct rt2x00_field32 field,
|
||||
u32 *reg)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00mmio_register_read(rt2x00dev, offset, reg);
|
||||
if (!rt2x00_get_field32(*reg, field))
|
||||
return 1;
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
printk_once(KERN_ERR "%s() Indirect register access failed: "
|
||||
"offset=0x%.08x, value=0x%.08x\n", __func__, offset, *reg);
|
||||
*reg = ~0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mmio_regbusy_read);
|
||||
|
||||
bool rt2x00mmio_rxdone(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue = rt2x00dev->rx;
|
||||
struct queue_entry *entry;
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
struct skb_frame_desc *skbdesc;
|
||||
int max_rx = 16;
|
||||
|
||||
while (--max_rx) {
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
entry_priv = entry->priv_data;
|
||||
|
||||
if (rt2x00dev->ops->lib->get_entry_state(entry))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Fill in desc fields of the skb descriptor
|
||||
*/
|
||||
skbdesc = get_skb_frame_desc(entry->skb);
|
||||
skbdesc->desc = entry_priv->desc;
|
||||
skbdesc->desc_len = entry->queue->desc_size;
|
||||
|
||||
/*
|
||||
* DMA is already done, notify rt2x00lib that
|
||||
* it finished successfully.
|
||||
*/
|
||||
rt2x00lib_dmastart(entry);
|
||||
rt2x00lib_dmadone(entry);
|
||||
|
||||
/*
|
||||
* Send the frame to rt2x00lib for further processing.
|
||||
*/
|
||||
rt2x00lib_rxdone(entry, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
return !max_rx;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mmio_rxdone);
|
||||
|
||||
void rt2x00mmio_flush_queue(struct data_queue *queue, bool drop)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; !rt2x00queue_empty(queue) && i < 10; i++)
|
||||
msleep(10);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mmio_flush_queue);
|
||||
|
||||
/*
|
||||
* Device initialization handlers.
|
||||
*/
|
||||
static int rt2x00mmio_alloc_queue_dma(struct rt2x00_dev *rt2x00dev,
|
||||
struct data_queue *queue)
|
||||
{
|
||||
struct queue_entry_priv_mmio *entry_priv;
|
||||
void *addr;
|
||||
dma_addr_t dma;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* Allocate DMA memory for descriptor and buffer.
|
||||
*/
|
||||
addr = dma_alloc_coherent(rt2x00dev->dev,
|
||||
queue->limit * queue->desc_size,
|
||||
&dma, GFP_KERNEL);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(addr, 0, queue->limit * queue->desc_size);
|
||||
|
||||
/*
|
||||
* Initialize all queue entries to contain valid addresses.
|
||||
*/
|
||||
for (i = 0; i < queue->limit; i++) {
|
||||
entry_priv = queue->entries[i].priv_data;
|
||||
entry_priv->desc = addr + i * queue->desc_size;
|
||||
entry_priv->desc_dma = dma + i * queue->desc_size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rt2x00mmio_free_queue_dma(struct rt2x00_dev *rt2x00dev,
|
||||
struct data_queue *queue)
|
||||
{
|
||||
struct queue_entry_priv_mmio *entry_priv =
|
||||
queue->entries[0].priv_data;
|
||||
|
||||
if (entry_priv->desc)
|
||||
dma_free_coherent(rt2x00dev->dev,
|
||||
queue->limit * queue->desc_size,
|
||||
entry_priv->desc, entry_priv->desc_dma);
|
||||
entry_priv->desc = NULL;
|
||||
}
|
||||
|
||||
int rt2x00mmio_initialize(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
int status;
|
||||
|
||||
/*
|
||||
* Allocate DMA
|
||||
*/
|
||||
queue_for_each(rt2x00dev, queue) {
|
||||
status = rt2x00mmio_alloc_queue_dma(rt2x00dev, queue);
|
||||
if (status)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register interrupt handler.
|
||||
*/
|
||||
status = request_irq(rt2x00dev->irq,
|
||||
rt2x00dev->ops->lib->irq_handler,
|
||||
IRQF_SHARED, rt2x00dev->name, rt2x00dev);
|
||||
if (status) {
|
||||
rt2x00_err(rt2x00dev, "IRQ %d allocation failed (error %d)\n",
|
||||
rt2x00dev->irq, status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
queue_for_each(rt2x00dev, queue)
|
||||
rt2x00mmio_free_queue_dma(rt2x00dev, queue);
|
||||
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mmio_initialize);
|
||||
|
||||
void rt2x00mmio_uninitialize(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
|
||||
/*
|
||||
* Free irq line.
|
||||
*/
|
||||
free_irq(rt2x00dev->irq, rt2x00dev);
|
||||
|
||||
/*
|
||||
* Free DMA
|
||||
*/
|
||||
queue_for_each(rt2x00dev, queue)
|
||||
rt2x00mmio_free_queue_dma(rt2x00dev, queue);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mmio_uninitialize);
|
||||
|
||||
/*
|
||||
* rt2x00mmio module information.
|
||||
*/
|
||||
MODULE_AUTHOR(DRV_PROJECT);
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
MODULE_DESCRIPTION("rt2x00 mmio library");
|
||||
MODULE_LICENSE("GPL");
|
||||
119
drivers/net/wireless/rt2x00/rt2x00mmio.h
Normal file
119
drivers/net/wireless/rt2x00/rt2x00mmio.h
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
|
||||
<http://rt2x00.serialmonkey.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the
|
||||
Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
Module: rt2x00mmio
|
||||
Abstract: Data structures for the rt2x00mmio module.
|
||||
*/
|
||||
|
||||
#ifndef RT2X00MMIO_H
|
||||
#define RT2X00MMIO_H
|
||||
|
||||
#include <linux/io.h>
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
*/
|
||||
static inline void rt2x00mmio_register_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
u32 *value)
|
||||
{
|
||||
*value = readl(rt2x00dev->csr.base + offset);
|
||||
}
|
||||
|
||||
static inline void rt2x00mmio_register_multiread(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
void *value, const u32 length)
|
||||
{
|
||||
memcpy_fromio(value, rt2x00dev->csr.base + offset, length);
|
||||
}
|
||||
|
||||
static inline void rt2x00mmio_register_write(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
u32 value)
|
||||
{
|
||||
writel(value, rt2x00dev->csr.base + offset);
|
||||
}
|
||||
|
||||
static inline void rt2x00mmio_register_multiwrite(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
const void *value,
|
||||
const u32 length)
|
||||
{
|
||||
__iowrite32_copy(rt2x00dev->csr.base + offset, value, length >> 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* rt2x00mmio_regbusy_read - Read from register with busy check
|
||||
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
|
||||
* @offset: Register offset
|
||||
* @field: Field to check if register is busy
|
||||
* @reg: Pointer to where register contents should be stored
|
||||
*
|
||||
* This function will read the given register, and checks if the
|
||||
* register is busy. If it is, it will sleep for a couple of
|
||||
* microseconds before reading the register again. If the register
|
||||
* is not read after a certain timeout, this function will return
|
||||
* FALSE.
|
||||
*/
|
||||
int rt2x00mmio_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
const struct rt2x00_field32 field,
|
||||
u32 *reg);
|
||||
|
||||
/**
|
||||
* struct queue_entry_priv_mmio: Per entry PCI specific information
|
||||
*
|
||||
* @desc: Pointer to device descriptor
|
||||
* @desc_dma: DMA pointer to &desc.
|
||||
* @data: Pointer to device's entry memory.
|
||||
* @data_dma: DMA pointer to &data.
|
||||
*/
|
||||
struct queue_entry_priv_mmio {
|
||||
__le32 *desc;
|
||||
dma_addr_t desc_dma;
|
||||
};
|
||||
|
||||
/**
|
||||
* rt2x00mmio_rxdone - Handle RX done events
|
||||
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
|
||||
*
|
||||
* Returns true if there are still rx frames pending and false if all
|
||||
* pending rx frames were processed.
|
||||
*/
|
||||
bool rt2x00mmio_rxdone(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
/**
|
||||
* rt2x00mmio_flush_queue - Flush data queue
|
||||
* @queue: Data queue to stop
|
||||
* @drop: True to drop all pending frames.
|
||||
*
|
||||
* This will wait for a maximum of 100ms, waiting for the queues
|
||||
* to become empty.
|
||||
*/
|
||||
void rt2x00mmio_flush_queue(struct data_queue *queue, bool drop);
|
||||
|
||||
/*
|
||||
* Device initialization handlers.
|
||||
*/
|
||||
int rt2x00mmio_initialize(struct rt2x00_dev *rt2x00dev);
|
||||
void rt2x00mmio_uninitialize(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
#endif /* RT2X00MMIO_H */
|
||||
@@ -32,182 +32,6 @@
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00pci.h"
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
*/
|
||||
int rt2x00pci_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
const struct rt2x00_field32 field,
|
||||
u32 *reg)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, offset, reg);
|
||||
if (!rt2x00_get_field32(*reg, field))
|
||||
return 1;
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
printk_once(KERN_ERR "%s() Indirect register access failed: "
|
||||
"offset=0x%.08x, value=0x%.08x\n", __func__, offset, *reg);
|
||||
*reg = ~0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_regbusy_read);
|
||||
|
||||
bool rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue = rt2x00dev->rx;
|
||||
struct queue_entry *entry;
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
struct skb_frame_desc *skbdesc;
|
||||
int max_rx = 16;
|
||||
|
||||
while (--max_rx) {
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
entry_priv = entry->priv_data;
|
||||
|
||||
if (rt2x00dev->ops->lib->get_entry_state(entry))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Fill in desc fields of the skb descriptor
|
||||
*/
|
||||
skbdesc = get_skb_frame_desc(entry->skb);
|
||||
skbdesc->desc = entry_priv->desc;
|
||||
skbdesc->desc_len = entry->queue->desc_size;
|
||||
|
||||
/*
|
||||
* DMA is already done, notify rt2x00lib that
|
||||
* it finished successfully.
|
||||
*/
|
||||
rt2x00lib_dmastart(entry);
|
||||
rt2x00lib_dmadone(entry);
|
||||
|
||||
/*
|
||||
* Send the frame to rt2x00lib for further processing.
|
||||
*/
|
||||
rt2x00lib_rxdone(entry, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
return !max_rx;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_rxdone);
|
||||
|
||||
void rt2x00pci_flush_queue(struct data_queue *queue, bool drop)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; !rt2x00queue_empty(queue) && i < 10; i++)
|
||||
msleep(10);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_flush_queue);
|
||||
|
||||
/*
|
||||
* Device initialization handlers.
|
||||
*/
|
||||
static int rt2x00pci_alloc_queue_dma(struct rt2x00_dev *rt2x00dev,
|
||||
struct data_queue *queue)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv;
|
||||
void *addr;
|
||||
dma_addr_t dma;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* Allocate DMA memory for descriptor and buffer.
|
||||
*/
|
||||
addr = dma_alloc_coherent(rt2x00dev->dev,
|
||||
queue->limit * queue->desc_size,
|
||||
&dma, GFP_KERNEL);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(addr, 0, queue->limit * queue->desc_size);
|
||||
|
||||
/*
|
||||
* Initialize all queue entries to contain valid addresses.
|
||||
*/
|
||||
for (i = 0; i < queue->limit; i++) {
|
||||
entry_priv = queue->entries[i].priv_data;
|
||||
entry_priv->desc = addr + i * queue->desc_size;
|
||||
entry_priv->desc_dma = dma + i * queue->desc_size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rt2x00pci_free_queue_dma(struct rt2x00_dev *rt2x00dev,
|
||||
struct data_queue *queue)
|
||||
{
|
||||
struct queue_entry_priv_pci *entry_priv =
|
||||
queue->entries[0].priv_data;
|
||||
|
||||
if (entry_priv->desc)
|
||||
dma_free_coherent(rt2x00dev->dev,
|
||||
queue->limit * queue->desc_size,
|
||||
entry_priv->desc, entry_priv->desc_dma);
|
||||
entry_priv->desc = NULL;
|
||||
}
|
||||
|
||||
int rt2x00pci_initialize(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
int status;
|
||||
|
||||
/*
|
||||
* Allocate DMA
|
||||
*/
|
||||
queue_for_each(rt2x00dev, queue) {
|
||||
status = rt2x00pci_alloc_queue_dma(rt2x00dev, queue);
|
||||
if (status)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register interrupt handler.
|
||||
*/
|
||||
status = request_irq(rt2x00dev->irq,
|
||||
rt2x00dev->ops->lib->irq_handler,
|
||||
IRQF_SHARED, rt2x00dev->name, rt2x00dev);
|
||||
if (status) {
|
||||
ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n",
|
||||
rt2x00dev->irq, status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
queue_for_each(rt2x00dev, queue)
|
||||
rt2x00pci_free_queue_dma(rt2x00dev, queue);
|
||||
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_initialize);
|
||||
|
||||
void rt2x00pci_uninitialize(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
|
||||
/*
|
||||
* Free irq line.
|
||||
*/
|
||||
free_irq(rt2x00dev->irq, rt2x00dev);
|
||||
|
||||
/*
|
||||
* Free DMA
|
||||
*/
|
||||
queue_for_each(rt2x00dev, queue)
|
||||
rt2x00pci_free_queue_dma(rt2x00dev, queue);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize);
|
||||
|
||||
/*
|
||||
* PCI driver handlers.
|
||||
*/
|
||||
@@ -244,7 +68,7 @@ static int rt2x00pci_alloc_reg(struct rt2x00_dev *rt2x00dev)
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
ERROR_PROBE("Failed to allocate registers.\n");
|
||||
rt2x00_probe_err("Failed to allocate registers\n");
|
||||
|
||||
rt2x00pci_free_reg(rt2x00dev);
|
||||
|
||||
@@ -260,30 +84,30 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
|
||||
|
||||
retval = pci_enable_device(pci_dev);
|
||||
if (retval) {
|
||||
ERROR_PROBE("Enable device failed.\n");
|
||||
rt2x00_probe_err("Enable device failed\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
retval = pci_request_regions(pci_dev, pci_name(pci_dev));
|
||||
if (retval) {
|
||||
ERROR_PROBE("PCI request regions failed.\n");
|
||||
rt2x00_probe_err("PCI request regions failed\n");
|
||||
goto exit_disable_device;
|
||||
}
|
||||
|
||||
pci_set_master(pci_dev);
|
||||
|
||||
if (pci_set_mwi(pci_dev))
|
||||
ERROR_PROBE("MWI not available.\n");
|
||||
rt2x00_probe_err("MWI not available\n");
|
||||
|
||||
if (dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {
|
||||
ERROR_PROBE("PCI DMA not supported.\n");
|
||||
rt2x00_probe_err("PCI DMA not supported\n");
|
||||
retval = -EIO;
|
||||
goto exit_release_regions;
|
||||
}
|
||||
|
||||
hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
|
||||
if (!hw) {
|
||||
ERROR_PROBE("Failed to allocate hardware.\n");
|
||||
rt2x00_probe_err("Failed to allocate hardware\n");
|
||||
retval = -ENOMEM;
|
||||
goto exit_release_regions;
|
||||
}
|
||||
@@ -383,7 +207,7 @@ int rt2x00pci_resume(struct pci_dev *pci_dev)
|
||||
|
||||
if (pci_set_power_state(pci_dev, PCI_D0) ||
|
||||
pci_enable_device(pci_dev)) {
|
||||
ERROR(rt2x00dev, "Failed to resume device.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to resume device\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,94 +35,6 @@
|
||||
*/
|
||||
#define PCI_DEVICE_DATA(__ops) .driver_data = (kernel_ulong_t)(__ops)
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
*/
|
||||
static inline void rt2x00pci_register_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
u32 *value)
|
||||
{
|
||||
*value = readl(rt2x00dev->csr.base + offset);
|
||||
}
|
||||
|
||||
static inline void rt2x00pci_register_multiread(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
void *value, const u32 length)
|
||||
{
|
||||
memcpy_fromio(value, rt2x00dev->csr.base + offset, length);
|
||||
}
|
||||
|
||||
static inline void rt2x00pci_register_write(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
u32 value)
|
||||
{
|
||||
writel(value, rt2x00dev->csr.base + offset);
|
||||
}
|
||||
|
||||
static inline void rt2x00pci_register_multiwrite(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
const void *value,
|
||||
const u32 length)
|
||||
{
|
||||
__iowrite32_copy(rt2x00dev->csr.base + offset, value, length >> 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* rt2x00pci_regbusy_read - Read from register with busy check
|
||||
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
|
||||
* @offset: Register offset
|
||||
* @field: Field to check if register is busy
|
||||
* @reg: Pointer to where register contents should be stored
|
||||
*
|
||||
* This function will read the given register, and checks if the
|
||||
* register is busy. If it is, it will sleep for a couple of
|
||||
* microseconds before reading the register again. If the register
|
||||
* is not read after a certain timeout, this function will return
|
||||
* FALSE.
|
||||
*/
|
||||
int rt2x00pci_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset,
|
||||
const struct rt2x00_field32 field,
|
||||
u32 *reg);
|
||||
|
||||
/**
|
||||
* struct queue_entry_priv_pci: Per entry PCI specific information
|
||||
*
|
||||
* @desc: Pointer to device descriptor
|
||||
* @desc_dma: DMA pointer to &desc.
|
||||
* @data: Pointer to device's entry memory.
|
||||
* @data_dma: DMA pointer to &data.
|
||||
*/
|
||||
struct queue_entry_priv_pci {
|
||||
__le32 *desc;
|
||||
dma_addr_t desc_dma;
|
||||
};
|
||||
|
||||
/**
|
||||
* rt2x00pci_rxdone - Handle RX done events
|
||||
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
|
||||
*
|
||||
* Returns true if there are still rx frames pending and false if all
|
||||
* pending rx frames were processed.
|
||||
*/
|
||||
bool rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
/**
|
||||
* rt2x00pci_flush_queue - Flush data queue
|
||||
* @queue: Data queue to stop
|
||||
* @drop: True to drop all pending frames.
|
||||
*
|
||||
* This will wait for a maximum of 100ms, waiting for the queues
|
||||
* to become empty.
|
||||
*/
|
||||
void rt2x00pci_flush_queue(struct data_queue *queue, bool drop);
|
||||
|
||||
/*
|
||||
* Device initialization handlers.
|
||||
*/
|
||||
int rt2x00pci_initialize(struct rt2x00_dev *rt2x00dev);
|
||||
void rt2x00pci_uninitialize(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
/*
|
||||
* PCI driver handlers.
|
||||
*/
|
||||
|
||||
@@ -35,7 +35,8 @@
|
||||
|
||||
struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct data_queue *queue = entry->queue;
|
||||
struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
|
||||
struct sk_buff *skb;
|
||||
struct skb_frame_desc *skbdesc;
|
||||
unsigned int frame_size;
|
||||
@@ -46,7 +47,7 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
|
||||
* The frame size includes descriptor size, because the
|
||||
* hardware directly receive the frame into the skbuffer.
|
||||
*/
|
||||
frame_size = entry->queue->data_size + entry->queue->desc_size;
|
||||
frame_size = queue->data_size + queue->desc_size + queue->winfo_size;
|
||||
|
||||
/*
|
||||
* The payload should be aligned to a 4-byte boundary,
|
||||
@@ -87,24 +88,35 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
|
||||
skbdesc->entry = entry;
|
||||
|
||||
if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags)) {
|
||||
skbdesc->skb_dma = dma_map_single(rt2x00dev->dev,
|
||||
skb->data,
|
||||
skb->len,
|
||||
DMA_FROM_DEVICE);
|
||||
dma_addr_t skb_dma;
|
||||
|
||||
skb_dma = dma_map_single(rt2x00dev->dev, skb->data, skb->len,
|
||||
DMA_FROM_DEVICE);
|
||||
if (unlikely(dma_mapping_error(rt2x00dev->dev, skb_dma))) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
skbdesc->skb_dma = skb_dma;
|
||||
skbdesc->flags |= SKBDESC_DMA_MAPPED_RX;
|
||||
}
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
void rt2x00queue_map_txskb(struct queue_entry *entry)
|
||||
int rt2x00queue_map_txskb(struct queue_entry *entry)
|
||||
{
|
||||
struct device *dev = entry->queue->rt2x00dev->dev;
|
||||
struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
|
||||
|
||||
skbdesc->skb_dma =
|
||||
dma_map_single(dev, entry->skb->data, entry->skb->len, DMA_TO_DEVICE);
|
||||
|
||||
if (unlikely(dma_mapping_error(dev, skbdesc->skb_dma)))
|
||||
return -ENOMEM;
|
||||
|
||||
skbdesc->flags |= SKBDESC_DMA_MAPPED_TX;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00queue_map_txskb);
|
||||
|
||||
@@ -343,10 +355,7 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
|
||||
* when using more then one tx stream (>MCS7).
|
||||
*/
|
||||
if (sta && txdesc->u.ht.mcs > 7 &&
|
||||
((sta->ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SM_PS) >>
|
||||
IEEE80211_HT_CAP_SM_PS_SHIFT) ==
|
||||
WLAN_HT_CAP_SM_PS_DYNAMIC)
|
||||
sta->smps_mode == IEEE80211_SMPS_DYNAMIC)
|
||||
__set_bit(ENTRY_TXD_HT_MIMO_PS, &txdesc->flags);
|
||||
} else {
|
||||
txdesc->u.ht.mcs = rt2x00_get_rate_mcs(hwrate->mcs);
|
||||
@@ -523,10 +532,10 @@ static int rt2x00queue_write_tx_data(struct queue_entry *entry,
|
||||
*/
|
||||
if (unlikely(rt2x00dev->ops->lib->get_entry_state &&
|
||||
rt2x00dev->ops->lib->get_entry_state(entry))) {
|
||||
ERROR(rt2x00dev,
|
||||
"Corrupt queue %d, accessing entry which is not ours.\n"
|
||||
"Please file bug report to %s.\n",
|
||||
entry->queue->qid, DRV_PROJECT);
|
||||
rt2x00_err(rt2x00dev,
|
||||
"Corrupt queue %d, accessing entry which is not ours\n"
|
||||
"Please file bug report to %s\n",
|
||||
entry->queue->qid, DRV_PROJECT);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -545,8 +554,9 @@ static int rt2x00queue_write_tx_data(struct queue_entry *entry,
|
||||
/*
|
||||
* Map the skb to DMA.
|
||||
*/
|
||||
if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags))
|
||||
rt2x00queue_map_txskb(entry);
|
||||
if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags) &&
|
||||
rt2x00queue_map_txskb(entry))
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -582,6 +592,48 @@ static void rt2x00queue_kick_tx_queue(struct data_queue *queue,
|
||||
queue->rt2x00dev->ops->lib->kick_queue(queue);
|
||||
}
|
||||
|
||||
static void rt2x00queue_bar_check(struct queue_entry *entry)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct ieee80211_bar *bar = (void *) (entry->skb->data +
|
||||
rt2x00dev->ops->extra_tx_headroom);
|
||||
struct rt2x00_bar_list_entry *bar_entry;
|
||||
|
||||
if (likely(!ieee80211_is_back_req(bar->frame_control)))
|
||||
return;
|
||||
|
||||
bar_entry = kmalloc(sizeof(*bar_entry), GFP_ATOMIC);
|
||||
|
||||
/*
|
||||
* If the alloc fails we still send the BAR out but just don't track
|
||||
* it in our bar list. And as a result we will report it to mac80211
|
||||
* back as failed.
|
||||
*/
|
||||
if (!bar_entry)
|
||||
return;
|
||||
|
||||
bar_entry->entry = entry;
|
||||
bar_entry->block_acked = 0;
|
||||
|
||||
/*
|
||||
* Copy the relevant parts of the 802.11 BAR into out check list
|
||||
* such that we can use RCU for less-overhead in the RX path since
|
||||
* sending BARs and processing the according BlockAck should be
|
||||
* the exception.
|
||||
*/
|
||||
memcpy(bar_entry->ra, bar->ra, sizeof(bar->ra));
|
||||
memcpy(bar_entry->ta, bar->ta, sizeof(bar->ta));
|
||||
bar_entry->control = bar->control;
|
||||
bar_entry->start_seq_num = bar->start_seq_num;
|
||||
|
||||
/*
|
||||
* Insert BAR into our BAR check list.
|
||||
*/
|
||||
spin_lock_bh(&rt2x00dev->bar_list_lock);
|
||||
list_add_tail_rcu(&bar_entry->list, &rt2x00dev->bar_list);
|
||||
spin_unlock_bh(&rt2x00dev->bar_list_lock);
|
||||
}
|
||||
|
||||
int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
|
||||
struct ieee80211_sta *sta, bool local)
|
||||
{
|
||||
@@ -647,8 +699,8 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
|
||||
spin_lock(&queue->tx_lock);
|
||||
|
||||
if (unlikely(rt2x00queue_full(queue))) {
|
||||
ERROR(queue->rt2x00dev,
|
||||
"Dropping frame due to full tx queue %d.\n", queue->qid);
|
||||
rt2x00_err(queue->rt2x00dev, "Dropping frame due to full tx queue %d\n",
|
||||
queue->qid);
|
||||
ret = -ENOBUFS;
|
||||
goto out;
|
||||
}
|
||||
@@ -657,10 +709,10 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
|
||||
|
||||
if (unlikely(test_and_set_bit(ENTRY_OWNER_DEVICE_DATA,
|
||||
&entry->flags))) {
|
||||
ERROR(queue->rt2x00dev,
|
||||
"Arrived at non-free entry in the non-full queue %d.\n"
|
||||
"Please file bug report to %s.\n",
|
||||
queue->qid, DRV_PROJECT);
|
||||
rt2x00_err(queue->rt2x00dev,
|
||||
"Arrived at non-free entry in the non-full queue %d\n"
|
||||
"Please file bug report to %s\n",
|
||||
queue->qid, DRV_PROJECT);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -680,6 +732,11 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Put BlockAckReqs into our check list for driver BA processing.
|
||||
*/
|
||||
rt2x00queue_bar_check(entry);
|
||||
|
||||
set_bit(ENTRY_DATA_PENDING, &entry->flags);
|
||||
|
||||
rt2x00queue_index_inc(entry, Q_INDEX);
|
||||
@@ -776,7 +833,9 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
|
||||
bool rt2x00queue_for_each_entry(struct data_queue *queue,
|
||||
enum queue_index start,
|
||||
enum queue_index end,
|
||||
bool (*fn)(struct queue_entry *entry))
|
||||
void *data,
|
||||
bool (*fn)(struct queue_entry *entry,
|
||||
void *data))
|
||||
{
|
||||
unsigned long irqflags;
|
||||
unsigned int index_start;
|
||||
@@ -784,9 +843,9 @@ bool rt2x00queue_for_each_entry(struct data_queue *queue,
|
||||
unsigned int i;
|
||||
|
||||
if (unlikely(start >= Q_INDEX_MAX || end >= Q_INDEX_MAX)) {
|
||||
ERROR(queue->rt2x00dev,
|
||||
"Entry requested from invalid index range (%d - %d)\n",
|
||||
start, end);
|
||||
rt2x00_err(queue->rt2x00dev,
|
||||
"Entry requested from invalid index range (%d - %d)\n",
|
||||
start, end);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -807,17 +866,17 @@ bool rt2x00queue_for_each_entry(struct data_queue *queue,
|
||||
*/
|
||||
if (index_start < index_end) {
|
||||
for (i = index_start; i < index_end; i++) {
|
||||
if (fn(&queue->entries[i]))
|
||||
if (fn(&queue->entries[i], data))
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
for (i = index_start; i < queue->limit; i++) {
|
||||
if (fn(&queue->entries[i]))
|
||||
if (fn(&queue->entries[i], data))
|
||||
return true;
|
||||
}
|
||||
|
||||
for (i = 0; i < index_end; i++) {
|
||||
if (fn(&queue->entries[i]))
|
||||
if (fn(&queue->entries[i], data))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -833,8 +892,8 @@ struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue,
|
||||
unsigned long irqflags;
|
||||
|
||||
if (unlikely(index >= Q_INDEX_MAX)) {
|
||||
ERROR(queue->rt2x00dev,
|
||||
"Entry requested from invalid index type (%d)\n", index);
|
||||
rt2x00_err(queue->rt2x00dev, "Entry requested from invalid index type (%d)\n",
|
||||
index);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -854,8 +913,8 @@ void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index)
|
||||
unsigned long irqflags;
|
||||
|
||||
if (unlikely(index >= Q_INDEX_MAX)) {
|
||||
ERROR(queue->rt2x00dev,
|
||||
"Index change on invalid index type (%d)\n", index);
|
||||
rt2x00_err(queue->rt2x00dev,
|
||||
"Index change on invalid index type (%d)\n", index);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1019,7 +1078,8 @@ void rt2x00queue_flush_queue(struct data_queue *queue, bool drop)
|
||||
* The queue flush has failed...
|
||||
*/
|
||||
if (unlikely(!rt2x00queue_empty(queue)))
|
||||
WARNING(queue->rt2x00dev, "Queue %d failed to flush\n", queue->qid);
|
||||
rt2x00_warn(queue->rt2x00dev, "Queue %d failed to flush\n",
|
||||
queue->qid);
|
||||
|
||||
/*
|
||||
* Restore the queue to the previous status
|
||||
@@ -1118,6 +1178,7 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,
|
||||
queue->threshold = DIV_ROUND_UP(qdesc->entry_num, 10);
|
||||
queue->data_size = qdesc->data_size;
|
||||
queue->desc_size = qdesc->desc_size;
|
||||
queue->winfo_size = qdesc->winfo_size;
|
||||
|
||||
/*
|
||||
* Allocate all queue entries.
|
||||
@@ -1208,7 +1269,7 @@ int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev)
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
ERROR(rt2x00dev, "Queue entries allocation failed.\n");
|
||||
rt2x00_err(rt2x00dev, "Queue entries allocation failed\n");
|
||||
|
||||
rt2x00queue_uninitialize(rt2x00dev);
|
||||
|
||||
@@ -1260,7 +1321,7 @@ int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
queue = kcalloc(rt2x00dev->data_queues, sizeof(*queue), GFP_KERNEL);
|
||||
if (!queue) {
|
||||
ERROR(rt2x00dev, "Queue allocation failed.\n");
|
||||
rt2x00_err(rt2x00dev, "Queue allocation failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
@@ -359,6 +359,7 @@ enum queue_entry_flags {
|
||||
ENTRY_DATA_PENDING,
|
||||
ENTRY_DATA_IO_FAILED,
|
||||
ENTRY_DATA_STATUS_PENDING,
|
||||
ENTRY_DATA_STATUS_SET,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -372,6 +373,7 @@ enum queue_entry_flags {
|
||||
* @entry_idx: The entry index number.
|
||||
* @priv_data: Private data belonging to this queue entry. The pointer
|
||||
* points to data specific to a particular driver and queue type.
|
||||
* @status: Device specific status
|
||||
*/
|
||||
struct queue_entry {
|
||||
unsigned long flags;
|
||||
@@ -383,6 +385,8 @@ struct queue_entry {
|
||||
|
||||
unsigned int entry_idx;
|
||||
|
||||
u32 status;
|
||||
|
||||
void *priv_data;
|
||||
};
|
||||
|
||||
@@ -475,7 +479,8 @@ struct data_queue {
|
||||
unsigned short cw_max;
|
||||
|
||||
unsigned short data_size;
|
||||
unsigned short desc_size;
|
||||
unsigned char desc_size;
|
||||
unsigned char winfo_size;
|
||||
|
||||
unsigned short usb_endpoint;
|
||||
unsigned short usb_maxpacket;
|
||||
@@ -495,7 +500,8 @@ struct data_queue {
|
||||
struct data_queue_desc {
|
||||
unsigned short entry_num;
|
||||
unsigned short data_size;
|
||||
unsigned short desc_size;
|
||||
unsigned char desc_size;
|
||||
unsigned char winfo_size;
|
||||
unsigned short priv_size;
|
||||
};
|
||||
|
||||
@@ -584,6 +590,7 @@ struct data_queue_desc {
|
||||
* @queue: Pointer to @data_queue
|
||||
* @start: &enum queue_index Pointer to start index
|
||||
* @end: &enum queue_index Pointer to end index
|
||||
* @data: Data to pass to the callback function
|
||||
* @fn: The function to call for each &struct queue_entry
|
||||
*
|
||||
* This will walk through all entries in the queue, in chronological
|
||||
@@ -596,7 +603,9 @@ struct data_queue_desc {
|
||||
bool rt2x00queue_for_each_entry(struct data_queue *queue,
|
||||
enum queue_index start,
|
||||
enum queue_index end,
|
||||
bool (*fn)(struct queue_entry *entry));
|
||||
void *data,
|
||||
bool (*fn)(struct queue_entry *entry,
|
||||
void *data));
|
||||
|
||||
/**
|
||||
* rt2x00queue_empty - Check if the queue is empty.
|
||||
|
||||
@@ -68,7 +68,7 @@ static int rt2x00soc_alloc_reg(struct rt2x00_dev *rt2x00dev)
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
ERROR_PROBE("Failed to allocate registers.\n");
|
||||
rt2x00_probe_err("Failed to allocate registers\n");
|
||||
rt2x00soc_free_reg(rt2x00dev);
|
||||
|
||||
return -ENOMEM;
|
||||
@@ -82,7 +82,7 @@ int rt2x00soc_probe(struct platform_device *pdev, const struct rt2x00_ops *ops)
|
||||
|
||||
hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
|
||||
if (!hw) {
|
||||
ERROR_PROBE("Failed to allocate hardware.\n");
|
||||
rt2x00_probe_err("Failed to allocate hardware\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,9 +70,9 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev,
|
||||
"Vendor Request 0x%02x failed for offset 0x%04x with error %d.\n",
|
||||
request, offset, status);
|
||||
rt2x00_err(rt2x00dev,
|
||||
"Vendor Request 0x%02x failed for offset 0x%04x with error %d\n",
|
||||
request, offset, status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -91,7 +91,7 @@ int rt2x00usb_vendor_req_buff_lock(struct rt2x00_dev *rt2x00dev,
|
||||
* Check for Cache availability.
|
||||
*/
|
||||
if (unlikely(!rt2x00dev->csr.cache || buffer_length > CSR_CACHE_SIZE)) {
|
||||
ERROR(rt2x00dev, "CSR cache not available.\n");
|
||||
rt2x00_err(rt2x00dev, "CSR cache not available\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -157,8 +157,8 @@ int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev, "Indirect register access failed: "
|
||||
"offset=0x%.08x, value=0x%.08x\n", offset, *reg);
|
||||
rt2x00_err(rt2x00dev, "Indirect register access failed: offset=0x%.08x, value=0x%.08x\n",
|
||||
offset, *reg);
|
||||
*reg = ~0;
|
||||
|
||||
return 0;
|
||||
@@ -285,7 +285,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)
|
||||
queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
|
||||
}
|
||||
|
||||
static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry)
|
||||
static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void *data)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
|
||||
@@ -307,7 +307,7 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry)
|
||||
status = skb_padto(entry->skb, length);
|
||||
if (unlikely(status)) {
|
||||
/* TODO: report something more appropriate than IO_FAILED. */
|
||||
WARNING(rt2x00dev, "TX SKB padding error, out of memory\n");
|
||||
rt2x00_warn(rt2x00dev, "TX SKB padding error, out of memory\n");
|
||||
set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
|
||||
rt2x00lib_dmadone(entry);
|
||||
|
||||
@@ -390,7 +390,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
|
||||
queue_work(rt2x00dev->workqueue, &rt2x00dev->rxdone_work);
|
||||
}
|
||||
|
||||
static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry)
|
||||
static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
|
||||
@@ -427,12 +427,18 @@ void rt2x00usb_kick_queue(struct data_queue *queue)
|
||||
case QID_AC_BE:
|
||||
case QID_AC_BK:
|
||||
if (!rt2x00queue_empty(queue))
|
||||
rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, Q_INDEX,
|
||||
rt2x00queue_for_each_entry(queue,
|
||||
Q_INDEX_DONE,
|
||||
Q_INDEX,
|
||||
NULL,
|
||||
rt2x00usb_kick_tx_entry);
|
||||
break;
|
||||
case QID_RX:
|
||||
if (!rt2x00queue_full(queue))
|
||||
rt2x00queue_for_each_entry(queue, Q_INDEX, Q_INDEX_DONE,
|
||||
rt2x00queue_for_each_entry(queue,
|
||||
Q_INDEX,
|
||||
Q_INDEX_DONE,
|
||||
NULL,
|
||||
rt2x00usb_kick_rx_entry);
|
||||
break;
|
||||
default:
|
||||
@@ -441,7 +447,7 @@ void rt2x00usb_kick_queue(struct data_queue *queue)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00usb_kick_queue);
|
||||
|
||||
static bool rt2x00usb_flush_entry(struct queue_entry *entry)
|
||||
static bool rt2x00usb_flush_entry(struct queue_entry *entry, void *data)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
struct queue_entry_priv_usb *entry_priv = entry->priv_data;
|
||||
@@ -468,7 +474,7 @@ void rt2x00usb_flush_queue(struct data_queue *queue, bool drop)
|
||||
unsigned int i;
|
||||
|
||||
if (drop)
|
||||
rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, Q_INDEX,
|
||||
rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, Q_INDEX, NULL,
|
||||
rt2x00usb_flush_entry);
|
||||
|
||||
/*
|
||||
@@ -514,8 +520,8 @@ EXPORT_SYMBOL_GPL(rt2x00usb_flush_queue);
|
||||
|
||||
static void rt2x00usb_watchdog_tx_dma(struct data_queue *queue)
|
||||
{
|
||||
WARNING(queue->rt2x00dev, "TX queue %d DMA timed out,"
|
||||
" invoke forced forced reset\n", queue->qid);
|
||||
rt2x00_warn(queue->rt2x00dev, "TX queue %d DMA timed out, invoke forced forced reset\n",
|
||||
queue->qid);
|
||||
|
||||
rt2x00queue_flush_queue(queue, true);
|
||||
}
|
||||
@@ -559,7 +565,7 @@ void rt2x00usb_clear_entry(struct queue_entry *entry)
|
||||
entry->flags = 0;
|
||||
|
||||
if (entry->queue->qid == QID_RX)
|
||||
rt2x00usb_kick_rx_entry(entry);
|
||||
rt2x00usb_kick_rx_entry(entry, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00usb_clear_entry);
|
||||
|
||||
@@ -616,7 +622,7 @@ static int rt2x00usb_find_endpoints(struct rt2x00_dev *rt2x00dev)
|
||||
* At least 1 endpoint for RX and 1 endpoint for TX must be available.
|
||||
*/
|
||||
if (!rt2x00dev->rx->usb_endpoint || !rt2x00dev->tx->usb_endpoint) {
|
||||
ERROR(rt2x00dev, "Bulk-in/Bulk-out endpoints not found\n");
|
||||
rt2x00_err(rt2x00dev, "Bulk-in/Bulk-out endpoints not found\n");
|
||||
return -EPIPE;
|
||||
}
|
||||
|
||||
@@ -769,7 +775,7 @@ static int rt2x00usb_alloc_reg(struct rt2x00_dev *rt2x00dev)
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
ERROR_PROBE("Failed to allocate registers.\n");
|
||||
rt2x00_probe_err("Failed to allocate registers\n");
|
||||
|
||||
rt2x00usb_free_reg(rt2x00dev);
|
||||
|
||||
@@ -789,7 +795,7 @@ int rt2x00usb_probe(struct usb_interface *usb_intf,
|
||||
|
||||
hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
|
||||
if (!hw) {
|
||||
ERROR_PROBE("Failed to allocate hardware.\n");
|
||||
rt2x00_probe_err("Failed to allocate hardware\n");
|
||||
retval = -ENOMEM;
|
||||
goto exit_put_device;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -739,7 +739,7 @@ static void rt73usb_config_lna_gain(struct rt2x00_dev *rt2x00dev,
|
||||
u16 eeprom;
|
||||
short lna_gain = 0;
|
||||
|
||||
if (libconf->conf->channel->band == IEEE80211_BAND_2GHZ) {
|
||||
if (libconf->conf->chandef.chan->band == IEEE80211_BAND_2GHZ) {
|
||||
if (test_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags))
|
||||
lna_gain += 14;
|
||||
|
||||
@@ -1122,7 +1122,7 @@ static int rt73usb_load_firmware(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (!reg) {
|
||||
ERROR(rt2x00dev, "Unstable hardware.\n");
|
||||
rt2x00_err(rt2x00dev, "Unstable hardware\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@@ -1139,7 +1139,7 @@ static int rt73usb_load_firmware(struct rt2x00_dev *rt2x00dev,
|
||||
0, USB_MODE_FIRMWARE,
|
||||
REGISTER_TIMEOUT_FIRMWARE);
|
||||
if (status < 0) {
|
||||
ERROR(rt2x00dev, "Failed to write Firmware to device.\n");
|
||||
rt2x00_err(rt2x00dev, "Failed to write Firmware to device\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1305,7 +1305,7 @@ static int rt73usb_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
|
||||
udelay(REGISTER_BUSY_DELAY);
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
|
||||
rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@@ -1443,8 +1443,8 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
|
||||
if (unlikely(retval))
|
||||
ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
|
||||
state, retval);
|
||||
rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
|
||||
state, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -1567,7 +1567,7 @@ static void rt73usb_write_beacon(struct queue_entry *entry,
|
||||
*/
|
||||
padding_len = roundup(entry->skb->len, 4) - entry->skb->len;
|
||||
if (padding_len && skb_pad(entry->skb, padding_len)) {
|
||||
ERROR(rt2x00dev, "Failure padding beacon, aborting\n");
|
||||
rt2x00_err(rt2x00dev, "Failure padding beacon, aborting\n");
|
||||
/* skb freed by skb_pad() on failure */
|
||||
entry->skb = NULL;
|
||||
rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, orig_reg);
|
||||
@@ -1771,7 +1771,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
EEPROM(rt2x00dev, "MAC: %pM\n", mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
@@ -1786,14 +1786,14 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_ANTENNA_HARDWARE_RADIO, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_ANTENNA_RF_TYPE, RF5226);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_ANTENNA, word);
|
||||
EEPROM(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &word);
|
||||
if (word == 0xffff) {
|
||||
rt2x00_set_field16(&word, EEPROM_NIC_EXTERNAL_LNA, 0);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC, word);
|
||||
EEPROM(rt2x00dev, "NIC: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &word);
|
||||
@@ -1809,7 +1809,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_LED_LED_MODE,
|
||||
LED_MODE_DEFAULT);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_LED, word);
|
||||
EEPROM(rt2x00dev, "Led: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Led: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &word);
|
||||
@@ -1817,7 +1817,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_FREQ_SEQ, 0);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
|
||||
EEPROM(rt2x00dev, "Freq: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Freq: 0x%04x\n", word);
|
||||
}
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &word);
|
||||
@@ -1825,7 +1825,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_BG_1, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_BG_2, 0);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_OFFSET_BG, word);
|
||||
EEPROM(rt2x00dev, "RSSI OFFSET BG: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "RSSI OFFSET BG: 0x%04x\n", word);
|
||||
} else {
|
||||
value = rt2x00_get_field16(word, EEPROM_RSSI_OFFSET_BG_1);
|
||||
if (value < -10 || value > 10)
|
||||
@@ -1841,7 +1841,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_A_1, 0);
|
||||
rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_A_2, 0);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_OFFSET_A, word);
|
||||
EEPROM(rt2x00dev, "RSSI OFFSET A: 0x%04x\n", word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "RSSI OFFSET A: 0x%04x\n", word);
|
||||
} else {
|
||||
value = rt2x00_get_field16(word, EEPROM_RSSI_OFFSET_A_1);
|
||||
if (value < -10 || value > 10)
|
||||
@@ -1875,7 +1875,7 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
value, rt2x00_get_field32(reg, MAC_CSR0_REVISION));
|
||||
|
||||
if (!rt2x00_rt(rt2x00dev, RT2573) || (rt2x00_rev(rt2x00dev) == 0)) {
|
||||
ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid RT chipset detected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1883,7 +1883,7 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
!rt2x00_rf(rt2x00dev, RF2528) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5225) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2527)) {
|
||||
ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
|
||||
rt2x00_err(rt2x00dev, "Invalid RF chipset detected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user