diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500pci.c')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 739 | 
1 files changed, 435 insertions, 304 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 3e7f2034624..a511cccc9f0 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c @@ -13,9 +13,7 @@  	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. +	along with this program; if not, see <http://www.gnu.org/licenses/>.   */  /* @@ -26,7 +24,6 @@  #include <linux/delay.h>  #include <linux/etherdevice.h> -#include <linux/init.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/pci.h> @@ -34,13 +31,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 +49,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 +71,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 +98,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 +126,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 +138,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 +160,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,8 +202,8 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)  {  	u32 reg; -	rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); -	return rt2x00_get_field32(reg, GPIOCSR_BIT0); +	rt2x00mmio_register_read(rt2x00dev, GPIOCSR, ®); +	return rt2x00_get_field32(reg, GPIOCSR_VAL0);  }  #ifdef CONFIG_RT2X00_LIB_LEDS @@ -217,14 +215,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 +233,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 +267,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 +283,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, @@ -293,7 +291,7 @@ static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev,  				  struct rt2x00intf_conf *conf,  				  const unsigned int flags)  { -	struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, QID_BEACON); +	struct data_queue *queue = rt2x00dev->bcn;  	unsigned int bcn_preload;  	u32 reg; @@ -302,27 +300,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, ®); -		rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); +		rt2x00mmio_register_read(rt2x00dev, CSR14, ®);  		rt2x00_set_field32(®, CSR14_TSF_SYNC, conf->sync); -		rt2x00_set_field32(®, CSR14_TBCN, 1); -		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));  } @@ -339,68 +335,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);  	}  } @@ -419,7 +415,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); @@ -471,7 +467,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);  } @@ -542,7 +538,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, @@ -560,12 +556,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, @@ -577,7 +573,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, @@ -585,14 +581,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); @@ -626,13 +622,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);  } @@ -723,11 +719,98 @@ dynamic_cca_tune:  }  /* + * Queue handlers. + */ +static void rt2500pci_start_queue(struct data_queue *queue) +{ +	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; +	u32 reg; + +	switch (queue->qid) { +	case QID_RX: +		rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®); +		rt2x00_set_field32(®, RXCSR0_DISABLE_RX, 0); +		rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg); +		break; +	case QID_BEACON: +		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); +		rt2x00mmio_register_write(rt2x00dev, CSR14, reg); +		break; +	default: +		break; +	} +} + +static void rt2500pci_kick_queue(struct data_queue *queue) +{ +	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; +	u32 reg; + +	switch (queue->qid) { +	case QID_AC_VO: +		rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®); +		rt2x00_set_field32(®, TXCSR0_KICK_PRIO, 1); +		rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg); +		break; +	case QID_AC_VI: +		rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®); +		rt2x00_set_field32(®, TXCSR0_KICK_TX, 1); +		rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg); +		break; +	case QID_ATIM: +		rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®); +		rt2x00_set_field32(®, TXCSR0_KICK_ATIM, 1); +		rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg); +		break; +	default: +		break; +	} +} + +static void rt2500pci_stop_queue(struct data_queue *queue) +{ +	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; +	u32 reg; + +	switch (queue->qid) { +	case QID_AC_VO: +	case QID_AC_VI: +	case QID_ATIM: +		rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®); +		rt2x00_set_field32(®, TXCSR0_ABORT, 1); +		rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg); +		break; +	case QID_RX: +		rt2x00mmio_register_read(rt2x00dev, RXCSR0, ®); +		rt2x00_set_field32(®, RXCSR0_DISABLE_RX, 1); +		rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg); +		break; +	case QID_BEACON: +		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); +		rt2x00mmio_register_write(rt2x00dev, CSR14, reg); + +		/* +		 * Wait for possibly running tbtt tasklets. +		 */ +		tasklet_kill(&rt2x00dev->tbtt_tasklet); +		break; +	default: +		break; +	} +} + +/*   * Initialization functions.   */  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) { @@ -744,7 +827,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; @@ -766,53 +849,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->bcn[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->bcn[1].entries[0].priv_data; -	rt2x00pci_register_read(rt2x00dev, TXCSR4, ®); +	entry_priv = rt2x00dev->atim->entries[0].priv_data; +	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[0].entries[0].priv_data; -	rt2x00pci_register_read(rt2x00dev, TXCSR6, ®); +	entry_priv = rt2x00dev->bcn->entries[0].priv_data; +	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;  } @@ -821,30 +904,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); @@ -853,11 +936,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); @@ -866,30 +949,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 */ @@ -898,9 +981,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); @@ -908,54 +991,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;  } @@ -972,7 +1055,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;  } @@ -1033,44 +1116,46 @@ static int rt2500pci_init_bbp(struct rt2x00_dev *rt2x00dev)  /*   * Device state switch handlers.   */ -static void rt2500pci_toggle_rx(struct rt2x00_dev *rt2x00dev, -				enum dev_state state) -{ -	u32 reg; - -	rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); -	rt2x00_set_field32(®, RXCSR0_DISABLE_RX, -			   (state == STATE_RADIO_RX_OFF)); -	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); -} -  static void rt2500pci_toggle_irq(struct rt2x00_dev *rt2x00dev,  				 enum dev_state state)  { -	int mask = (state == STATE_RADIO_IRQ_OFF) || -		   (state == STATE_RADIO_IRQ_OFF_ISR); +	int mask = (state == STATE_RADIO_IRQ_OFF);  	u32 reg; +	unsigned long flags;  	/*  	 * When interrupts are being enabled, the interrupt registers  	 * 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);  	}  	/*  	 * Only toggle the interrupts bits we are going to use.  	 * Non-checked interrupt bits are disabled by default.  	 */ -	rt2x00pci_register_read(rt2x00dev, CSR8, ®); +	spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); + +	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); + +	if (state == STATE_RADIO_IRQ_OFF) { +		/* +		 * Ensure that all tasklets are finished. +		 */ +		tasklet_kill(&rt2x00dev->txstatus_tasklet); +		tasklet_kill(&rt2x00dev->rxdone_tasklet); +		tasklet_kill(&rt2x00dev->tbtt_tasklet); +	}  }  static int rt2500pci_enable_radio(struct rt2x00_dev *rt2x00dev) @@ -1091,7 +1176,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, @@ -1105,12 +1190,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. @@ -1118,12 +1203,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);  	} @@ -1142,14 +1227,8 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev,  	case STATE_RADIO_OFF:  		rt2500pci_disable_radio(rt2x00dev);  		break; -	case STATE_RADIO_RX_ON: -	case STATE_RADIO_RX_OFF: -		rt2500pci_toggle_rx(rt2x00dev, state); -		break;  	case STATE_RADIO_IRQ_ON: -	case STATE_RADIO_IRQ_ON_ISR:  	case STATE_RADIO_IRQ_OFF: -	case STATE_RADIO_IRQ_OFF_ISR:  		rt2500pci_toggle_irq(rt2x00dev, state);  		break;  	case STATE_DEEP_SLEEP: @@ -1164,8 +1243,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;  } @@ -1177,7 +1256,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; @@ -1196,10 +1275,12 @@ static void rt2500pci_write_tx_desc(struct queue_entry *entry,  	rt2x00_desc_write(txd, 2, word);  	rt2x00_desc_read(txd, 3, &word); -	rt2x00_set_field32(&word, TXD_W3_PLCP_SIGNAL, txdesc->signal); -	rt2x00_set_field32(&word, TXD_W3_PLCP_SERVICE, txdesc->service); -	rt2x00_set_field32(&word, TXD_W3_PLCP_LENGTH_LOW, txdesc->length_low); -	rt2x00_set_field32(&word, TXD_W3_PLCP_LENGTH_HIGH, txdesc->length_high); +	rt2x00_set_field32(&word, TXD_W3_PLCP_SIGNAL, txdesc->u.plcp.signal); +	rt2x00_set_field32(&word, TXD_W3_PLCP_SERVICE, txdesc->u.plcp.service); +	rt2x00_set_field32(&word, TXD_W3_PLCP_LENGTH_LOW, +			   txdesc->u.plcp.length_low); +	rt2x00_set_field32(&word, TXD_W3_PLCP_LENGTH_HIGH, +			   txdesc->u.plcp.length_high);  	rt2x00_desc_write(txd, 3, word);  	rt2x00_desc_read(txd, 10, &word); @@ -1224,7 +1305,7 @@ static void rt2500pci_write_tx_desc(struct queue_entry *entry,  	rt2x00_set_field32(&word, TXD_W0_OFDM,  			   (txdesc->rate_mode == RATE_MODE_OFDM));  	rt2x00_set_field32(&word, TXD_W0_CIPHER_OWNER, 1); -	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); +	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->u.plcp.ifs);  	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,  			   test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));  	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length); @@ -1251,11 +1332,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. @@ -1266,40 +1350,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_TSF_COUNT, 1); -	rt2x00_set_field32(®, CSR14_TBCN, 1);  	rt2x00_set_field32(®, CSR14_BEACON_GEN, 1); -	rt2x00pci_register_write(rt2x00dev, CSR14, reg); -} - -static void rt2500pci_kick_tx_queue(struct data_queue *queue) -{ -	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; -	u32 reg; - -	rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); -	rt2x00_set_field32(®, TXCSR0_KICK_PRIO, (queue->qid == QID_AC_BE)); -	rt2x00_set_field32(®, TXCSR0_KICK_TX, (queue->qid == QID_AC_BK)); -	rt2x00_set_field32(®, TXCSR0_KICK_ATIM, (queue->qid == QID_ATIM)); -	rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); -} - -static void rt2500pci_kill_tx_queue(struct data_queue *queue) -{ -	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; -	u32 reg; - -	if (queue->qid == QID_BEACON) { -		rt2x00pci_register_write(rt2x00dev, CSR14, 0); -	} else { -		rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); -		rt2x00_set_field32(®, TXCSR0_ABORT, 1); -		rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); -	} +	rt2x00mmio_register_write(rt2x00dev, CSR14, reg);  }  /* @@ -1308,7 +1364,7 @@ static void rt2500pci_kill_tx_queue(struct data_queue *queue)  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; @@ -1345,8 +1401,8 @@ static void rt2500pci_fill_rxdone(struct queue_entry *entry,  static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev,  			     const enum data_queue_qid queue_idx)  { -	struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, queue_idx); -	struct queue_entry_priv_pci *entry_priv; +	struct data_queue *queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx); +	struct queue_entry_priv_mmio *entry_priv;  	struct queue_entry *entry;  	struct txdone_entry_desc txdesc;  	u32 word; @@ -1381,65 +1437,80 @@ static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev,  	}  } -static irqreturn_t rt2500pci_interrupt_thread(int irq, void *dev_instance) +static inline void rt2500pci_enable_interrupt(struct rt2x00_dev *rt2x00dev, +					      struct rt2x00_field32 irq_field)  { -	struct rt2x00_dev *rt2x00dev = dev_instance; -	u32 reg = rt2x00dev->irqvalue[0]; +	u32 reg;  	/* -	 * Handle interrupts, walk through all bits -	 * and run the tasks, the bits are checked in order of -	 * priority. +	 * Enable a single interrupt. The interrupt mask register +	 * access needs locking.  	 */ +	spin_lock_irq(&rt2x00dev->irqmask_lock); -	/* -	 * 1 - Beacon timer expired interrupt. -	 */ -	if (rt2x00_get_field32(reg, CSR7_TBCN_EXPIRE)) -		rt2x00lib_beacondone(rt2x00dev); +	rt2x00mmio_register_read(rt2x00dev, CSR8, ®); +	rt2x00_set_field32(®, irq_field, 0); +	rt2x00mmio_register_write(rt2x00dev, CSR8, reg); -	/* -	 * 2 - Rx ring done interrupt. -	 */ -	if (rt2x00_get_field32(reg, CSR7_RXDONE)) -		rt2x00pci_rxdone(rt2x00dev); +	spin_unlock_irq(&rt2x00dev->irqmask_lock); +} -	/* -	 * 3 - Atim ring transmit done interrupt. -	 */ -	if (rt2x00_get_field32(reg, CSR7_TXDONE_ATIMRING)) -		rt2500pci_txdone(rt2x00dev, QID_ATIM); +static void rt2500pci_txstatus_tasklet(unsigned long data) +{ +	struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; +	u32 reg;  	/* -	 * 4 - Priority ring transmit done interrupt. +	 * Handle all tx queues.  	 */ -	if (rt2x00_get_field32(reg, CSR7_TXDONE_PRIORING)) -		rt2500pci_txdone(rt2x00dev, QID_AC_BE); +	rt2500pci_txdone(rt2x00dev, QID_ATIM); +	rt2500pci_txdone(rt2x00dev, QID_AC_VO); +	rt2500pci_txdone(rt2x00dev, QID_AC_VI);  	/* -	 * 5 - Tx ring transmit done interrupt. +	 * Enable all TXDONE interrupts again.  	 */ -	if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) -		rt2500pci_txdone(rt2x00dev, QID_AC_BK); +	if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) { +		spin_lock_irq(&rt2x00dev->irqmask_lock); -	/* Enable interrupts again. */ -	rt2x00dev->ops->lib->set_device_state(rt2x00dev, -					      STATE_RADIO_IRQ_ON_ISR); +		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); +		rt2x00mmio_register_write(rt2x00dev, CSR8, reg); -	return IRQ_HANDLED; +		spin_unlock_irq(&rt2x00dev->irqmask_lock); +	} +} + +static void rt2500pci_tbtt_tasklet(unsigned long data) +{ +	struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; +	rt2x00lib_beacondone(rt2x00dev); +	if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) +		rt2500pci_enable_interrupt(rt2x00dev, CSR8_TBCN_EXPIRE); +} + +static void rt2500pci_rxdone_tasklet(unsigned long data) +{ +	struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; +	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);  }  static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)  {  	struct rt2x00_dev *rt2x00dev = dev_instance; -	u32 reg; +	u32 reg, mask;  	/*  	 * 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; @@ -1447,14 +1518,42 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)  	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))  		return IRQ_HANDLED; -	/* Store irqvalues for use in the interrupt thread. */ -	rt2x00dev->irqvalue[0] = reg; +	mask = reg; + +	/* +	 * Schedule tasklets for interrupt handling. +	 */ +	if (rt2x00_get_field32(reg, CSR7_TBCN_EXPIRE)) +		tasklet_hi_schedule(&rt2x00dev->tbtt_tasklet); + +	if (rt2x00_get_field32(reg, CSR7_RXDONE)) +		tasklet_schedule(&rt2x00dev->rxdone_tasklet); + +	if (rt2x00_get_field32(reg, CSR7_TXDONE_ATIMRING) || +	    rt2x00_get_field32(reg, CSR7_TXDONE_PRIORING) || +	    rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) { +		tasklet_schedule(&rt2x00dev->txstatus_tasklet); +		/* +		 * Mask out all txdone interrupts. +		 */ +		rt2x00_set_field32(&mask, CSR8_TXDONE_TXRING, 1); +		rt2x00_set_field32(&mask, CSR8_TXDONE_ATIMRING, 1); +		rt2x00_set_field32(&mask, CSR8_TXDONE_PRIORING, 1); +	} + +	/* +	 * Disable all interrupts for which a tasklet was scheduled right now, +	 * the tasklet will reenable the appropriate interrupts. +	 */ +	spin_lock(&rt2x00dev->irqmask_lock); + +	rt2x00mmio_register_read(rt2x00dev, CSR8, ®); +	reg |= mask; +	rt2x00mmio_register_write(rt2x00dev, CSR8, reg); -	/* Disable interrupts, will be enabled again in the interrupt thread. */ -	rt2x00dev->ops->lib->set_device_state(rt2x00dev, -					      STATE_RADIO_IRQ_OFF_ISR); +	spin_unlock(&rt2x00dev->irqmask_lock); -	return IRQ_WAKE_THREAD; +	return IRQ_HANDLED;  }  /* @@ -1467,7 +1566,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; @@ -1487,8 +1586,8 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)  	 */  	mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);  	if (!is_valid_ether_addr(mac)) { -		random_ether_addr(mac); -		EEPROM(rt2x00dev, "MAC: %pM\n", mac); +		eth_random_addr(mac); +		rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);  	}  	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word); @@ -1504,7 +1603,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); @@ -1513,7 +1612,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); @@ -1521,7 +1620,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; @@ -1542,7 +1642,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)); @@ -1552,7 +1652,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;  	} @@ -1581,15 +1681,20 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)  	/*  	 * Detect if this device has an hardware controlled radio.  	 */ -	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) -		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); +	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) { +		__set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags); +		/* +		 * On this device RFKILL initialized during probe does not work. +		 */ +		__set_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags); +	}  	/*  	 * Check if the BBP tuning should be enabled.  	 */  	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom);  	if (!rt2x00_get_field16(eeprom, EEPROM_NIC_DYN_BBP_TUNE)) -		__set_bit(DRIVER_SUPPORT_LINK_TUNING, &rt2x00dev->flags); +		__set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags);  	/*  	 * Read the RSSI <-> dBm offset information. @@ -1777,6 +1882,11 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)  						   EEPROM_MAC_ADDR_0));  	/* +	 * Disable powersaving as default. +	 */ +	rt2x00dev->hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; + +	/*  	 * Initialize hw_mode information.  	 */  	spec->supported_bands = SUPPORT_BAND_2GHZ; @@ -1831,6 +1941,7 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)  static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)  {  	int retval; +	u32 reg;  	/*  	 * Allocate eeprom data. @@ -1844,6 +1955,14 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)  		return retval;  	/* +	 * Enable rfkill polling by setting GPIO direction of the +	 * rfkill switch GPIO pin correctly. +	 */ +	rt2x00mmio_register_read(rt2x00dev, GPIOCSR, ®); +	rt2x00_set_field32(®, GPIOCSR_DIR0, 1); +	rt2x00mmio_register_write(rt2x00dev, GPIOCSR, reg); + +	/*  	 * Initialize hw specifications.  	 */  	retval = rt2500pci_probe_hw_mode(rt2x00dev); @@ -1853,8 +1972,9 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)  	/*  	 * This device requires the atim queue and DMA-mapped skbs.  	 */ -	__set_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); -	__set_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags); +	__set_bit(REQUIRE_ATIM_QUEUE, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_DMA, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_SW_SEQNO, &rt2x00dev->cap_flags);  	/*  	 * Set the rssi offset. @@ -1867,15 +1987,16 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)  /*   * IEEE80211 stack callback functions.   */ -static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw) +static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw, +			     struct ieee80211_vif *vif)  {  	struct rt2x00_dev *rt2x00dev = hw->priv;  	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; @@ -1886,7 +2007,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);  } @@ -1907,14 +2028,20 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = {  	.tx_last_beacon		= rt2500pci_tx_last_beacon,  	.rfkill_poll		= rt2x00mac_rfkill_poll,  	.flush			= rt2x00mac_flush, +	.set_antenna		= rt2x00mac_set_antenna, +	.get_antenna		= rt2x00mac_get_antenna, +	.get_ringparam		= rt2x00mac_get_ringparam, +	.tx_frames_pending	= rt2x00mac_tx_frames_pending,  };  static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {  	.irq_handler		= rt2500pci_interrupt, -	.irq_handler_thread	= rt2500pci_interrupt_thread, +	.txstatus_tasklet	= rt2500pci_txstatus_tasklet, +	.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, @@ -1922,10 +2049,12 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {  	.link_stats		= rt2500pci_link_stats,  	.reset_tuner		= rt2500pci_reset_tuner,  	.link_tuner		= rt2500pci_link_tuner, +	.start_queue		= rt2500pci_start_queue, +	.kick_queue		= rt2500pci_kick_queue, +	.stop_queue		= rt2500pci_stop_queue, +	.flush_queue		= rt2x00mmio_flush_queue,  	.write_tx_desc		= rt2500pci_write_tx_desc,  	.write_beacon		= rt2500pci_write_beacon, -	.kick_tx_queue		= rt2500pci_kick_tx_queue, -	.kill_tx_queue		= rt2500pci_kill_tx_queue,  	.fill_rxdone		= rt2500pci_fill_rxdone,  	.config_filter		= rt2500pci_config_filter,  	.config_intf		= rt2500pci_config_intf, @@ -1934,46 +2063,53 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {  	.config			= rt2500pci_config,  }; -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), -}; +static void rt2500pci_queue_init(struct data_queue *queue) +{ +	switch (queue->qid) { +	case QID_RX: +		queue->limit = 32; +		queue->data_size = DATA_FRAME_SIZE; +		queue->desc_size = RXD_DESC_SIZE; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; -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), -}; +	case QID_AC_VO: +	case QID_AC_VI: +	case QID_AC_BE: +	case QID_AC_BK: +		queue->limit = 32; +		queue->data_size = DATA_FRAME_SIZE; +		queue->desc_size = TXD_DESC_SIZE; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; -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), -}; +	case QID_BEACON: +		queue->limit = 1; +		queue->data_size = MGMT_FRAME_SIZE; +		queue->desc_size = TXD_DESC_SIZE; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; -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), -}; +	case QID_ATIM: +		queue->limit = 8; +		queue->data_size = DATA_FRAME_SIZE; +		queue->desc_size = TXD_DESC_SIZE; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; + +	default: +		BUG(); +		break; +	} +}  static const struct rt2x00_ops rt2500pci_ops = {  	.name			= KBUILD_MODNAME, -	.max_sta_intf		= 1,  	.max_ap_intf		= 1,  	.eeprom_size		= EEPROM_SIZE,  	.rf_size		= RF_SIZE,  	.tx_queues		= NUM_TX_QUEUES, -	.extra_tx_headroom	= 0, -	.rx			= &rt2500pci_queue_rx, -	.tx			= &rt2500pci_queue_tx, -	.bcn			= &rt2500pci_queue_bcn, -	.atim			= &rt2500pci_queue_atim, +	.queue_init		= rt2500pci_queue_init,  	.lib			= &rt2500pci_rt2x00_ops,  	.hw			= &rt2500pci_mac80211_ops,  #ifdef CONFIG_RT2X00_LIB_DEBUGFS @@ -1985,7 +2121,7 @@ static const struct rt2x00_ops rt2500pci_ops = {   * RT2500pci module information.   */  static DEFINE_PCI_DEVICE_TABLE(rt2500pci_device_table) = { -	{ PCI_DEVICE(0x1814, 0x0201), PCI_DEVICE_DATA(&rt2500pci_ops) }, +	{ PCI_DEVICE(0x1814, 0x0201) },  	{ 0, }  }; @@ -1996,24 +2132,19 @@ MODULE_SUPPORTED_DEVICE("Ralink RT2560 PCI & PCMCIA chipset based cards");  MODULE_DEVICE_TABLE(pci, rt2500pci_device_table);  MODULE_LICENSE("GPL"); +static int rt2500pci_probe(struct pci_dev *pci_dev, +			   const struct pci_device_id *id) +{ +	return rt2x00pci_probe(pci_dev, &rt2500pci_ops); +} +  static struct pci_driver rt2500pci_driver = {  	.name		= KBUILD_MODNAME,  	.id_table	= rt2500pci_device_table, -	.probe		= rt2x00pci_probe, -	.remove		= __devexit_p(rt2x00pci_remove), +	.probe		= rt2500pci_probe, +	.remove		= rt2x00pci_remove,  	.suspend	= rt2x00pci_suspend,  	.resume		= rt2x00pci_resume,  }; -static int __init rt2500pci_init(void) -{ -	return pci_register_driver(&rt2500pci_driver); -} - -static void __exit rt2500pci_exit(void) -{ -	pci_unregister_driver(&rt2500pci_driver); -} - -module_init(rt2500pci_init); -module_exit(rt2500pci_exit); +module_pci_driver(rt2500pci_driver);  | 
