diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800pci.c')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 267 | 
1 files changed, 148 insertions, 119 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 808073aa9dc..cc4a54f571b 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c @@ -66,7 +66,7 @@ static void rt2800pci_mcu_status(struct rt2x00_dev *rt2x00dev, const u8 token)  		return;  	for (i = 0; i < 200; i++) { -		rt2800_register_read(rt2x00dev, H2M_MAILBOX_CID, ®); +		rt2x00pci_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) || @@ -80,8 +80,8 @@ 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"); -	rt2800_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0); -	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); +	rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0); +	rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);  }  #if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X) @@ -105,7 +105,7 @@ static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)  	struct rt2x00_dev *rt2x00dev = eeprom->data;  	u32 reg; -	rt2800_register_read(rt2x00dev, E2PROM_CSR, ®); +	rt2x00pci_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); @@ -127,7 +127,7 @@ static void rt2800pci_eepromregister_write(struct eeprom_93cx6 *eeprom)  	rt2x00_set_field32(®, E2PROM_CSR_CHIP_SELECT,  			   !!eeprom->reg_chip_select); -	rt2800_register_write(rt2x00dev, E2PROM_CSR, reg); +	rt2x00pci_register_write(rt2x00dev, E2PROM_CSR, reg);  }  static void rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev) @@ -135,7 +135,7 @@ static void rt2800pci_read_eeprom_pci(struct rt2x00_dev *rt2x00dev)  	struct eeprom_93cx6 eeprom;  	u32 reg; -	rt2800_register_read(rt2x00dev, E2PROM_CSR, ®); +	rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, ®);  	eeprom.data = rt2x00dev;  	eeprom.register_read = rt2800pci_eepromregister_read; @@ -195,9 +195,9 @@ static void rt2800pci_start_queue(struct data_queue *queue)  	switch (queue->qid) {  	case QID_RX: -		rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); +		rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);  		rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 1); -		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); +		rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);  		break;  	case QID_BEACON:  		/* @@ -207,15 +207,15 @@ static void rt2800pci_start_queue(struct data_queue *queue)  		tasklet_enable(&rt2x00dev->tbtt_tasklet);  		tasklet_enable(&rt2x00dev->pretbtt_tasklet); -		rt2800_register_read(rt2x00dev, BCN_TIME_CFG, ®); +		rt2x00pci_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); -		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); +		rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg); -		rt2800_register_read(rt2x00dev, INT_TIMER_EN, ®); +		rt2x00pci_register_read(rt2x00dev, INT_TIMER_EN, ®);  		rt2x00_set_field32(®, INT_TIMER_EN_PRE_TBTT_TIMER, 1); -		rt2800_register_write(rt2x00dev, INT_TIMER_EN, reg); +		rt2x00pci_register_write(rt2x00dev, INT_TIMER_EN, reg);  		break;  	default:  		break; @@ -233,11 +233,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); -		rt2800_register_write(rt2x00dev, TX_CTX_IDX(queue->qid), entry->entry_idx); +		rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX(queue->qid), +					 entry->entry_idx);  		break;  	case QID_MGMT:  		entry = rt2x00queue_get_entry(queue, Q_INDEX); -		rt2800_register_write(rt2x00dev, TX_CTX_IDX(5), entry->entry_idx); +		rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX(5), +					 entry->entry_idx);  		break;  	default:  		break; @@ -251,20 +253,20 @@ static void rt2800pci_stop_queue(struct data_queue *queue)  	switch (queue->qid) {  	case QID_RX: -		rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); +		rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);  		rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0); -		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); +		rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);  		break;  	case QID_BEACON: -		rt2800_register_read(rt2x00dev, BCN_TIME_CFG, ®); +		rt2x00pci_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); -		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); +		rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg); -		rt2800_register_read(rt2x00dev, INT_TIMER_EN, ®); +		rt2x00pci_register_read(rt2x00dev, INT_TIMER_EN, ®);  		rt2x00_set_field32(®, INT_TIMER_EN_PRE_TBTT_TIMER, 0); -		rt2800_register_write(rt2x00dev, INT_TIMER_EN, reg); +		rt2x00pci_register_write(rt2x00dev, INT_TIMER_EN, reg);  		/*  		 * Wait for tbtt tasklets to finish. @@ -295,19 +297,19 @@ static int rt2800pci_write_firmware(struct rt2x00_dev *rt2x00dev,  	 */  	reg = 0;  	rt2x00_set_field32(®, PBF_SYS_CTRL_HOST_RAM_WRITE, 1); -	rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, reg); +	rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, reg);  	/*  	 * Write firmware to device.  	 */ -	rt2800_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, -				   data, len); +	rt2x00pci_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, +				      data, len); -	rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000); -	rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001); +	rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000); +	rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001); -	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); -	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); +	rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0); +	rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);  	return 0;  } @@ -351,7 +353,7 @@ 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.  		 */ -		rt2800_register_write(rt2x00dev, RX_CRX_IDX, +		rt2x00pci_register_write(rt2x00dev, RX_CRX_IDX,  				      entry->entry_idx);  	} else {  		rt2x00_desc_read(entry_priv->desc, 1, &word); @@ -369,45 +371,51 @@ static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)  	 * Initialize registers.  	 */  	entry_priv = rt2x00dev->tx[0].entries[0].priv_data; -	rt2800_register_write(rt2x00dev, TX_BASE_PTR0, entry_priv->desc_dma); -	rt2800_register_write(rt2x00dev, TX_MAX_CNT0, rt2x00dev->tx[0].limit); -	rt2800_register_write(rt2x00dev, TX_CTX_IDX0, 0); -	rt2800_register_write(rt2x00dev, TX_DTX_IDX0, 0); +	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);  	entry_priv = rt2x00dev->tx[1].entries[0].priv_data; -	rt2800_register_write(rt2x00dev, TX_BASE_PTR1, entry_priv->desc_dma); -	rt2800_register_write(rt2x00dev, TX_MAX_CNT1, rt2x00dev->tx[1].limit); -	rt2800_register_write(rt2x00dev, TX_CTX_IDX1, 0); -	rt2800_register_write(rt2x00dev, TX_DTX_IDX1, 0); +	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);  	entry_priv = rt2x00dev->tx[2].entries[0].priv_data; -	rt2800_register_write(rt2x00dev, TX_BASE_PTR2, entry_priv->desc_dma); -	rt2800_register_write(rt2x00dev, TX_MAX_CNT2, rt2x00dev->tx[2].limit); -	rt2800_register_write(rt2x00dev, TX_CTX_IDX2, 0); -	rt2800_register_write(rt2x00dev, TX_DTX_IDX2, 0); +	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);  	entry_priv = rt2x00dev->tx[3].entries[0].priv_data; -	rt2800_register_write(rt2x00dev, TX_BASE_PTR3, entry_priv->desc_dma); -	rt2800_register_write(rt2x00dev, TX_MAX_CNT3, rt2x00dev->tx[3].limit); -	rt2800_register_write(rt2x00dev, TX_CTX_IDX3, 0); -	rt2800_register_write(rt2x00dev, TX_DTX_IDX3, 0); +	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);  	entry_priv = rt2x00dev->rx->entries[0].priv_data; -	rt2800_register_write(rt2x00dev, RX_BASE_PTR, entry_priv->desc_dma); -	rt2800_register_write(rt2x00dev, RX_MAX_CNT, rt2x00dev->rx[0].limit); -	rt2800_register_write(rt2x00dev, RX_CRX_IDX, rt2x00dev->rx[0].limit - 1); -	rt2800_register_write(rt2x00dev, RX_DRX_IDX, 0); +	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);  	/*  	 * Enable global DMA configuration  	 */ -	rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); +	rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);  	rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);  	rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);  	rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1); -	rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); +	rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); -	rt2800_register_write(rt2x00dev, DELAY_INT_CFG, 0); +	rt2x00pci_register_write(rt2x00dev, DELAY_INT_CFG, 0);  	return 0;  } @@ -427,8 +435,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) { -		rt2800_register_read(rt2x00dev, INT_SOURCE_CSR, ®); -		rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, reg); +		rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, ®); +		rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);  		/*  		 * Enable tasklets. The beacon related tasklets are @@ -440,7 +448,7 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev,  	}  	spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); -	rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); +	rt2x00pci_register_read(rt2x00dev, INT_MASK_CSR, ®);  	rt2x00_set_field32(®, INT_MASK_CSR_RXDELAYINT, 0);  	rt2x00_set_field32(®, INT_MASK_CSR_TXDELAYINT, 0);  	rt2x00_set_field32(®, INT_MASK_CSR_RX_DONE, mask); @@ -459,7 +467,7 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev,  	rt2x00_set_field32(®, INT_MASK_CSR_GPTIMER, 0);  	rt2x00_set_field32(®, INT_MASK_CSR_RX_COHERENT, 0);  	rt2x00_set_field32(®, INT_MASK_CSR_TX_COHERENT, 0); -	rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); +	rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);  	spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);  	if (state == STATE_RADIO_IRQ_OFF) { @@ -480,7 +488,7 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)  	/*  	 * Reset DMA indexes  	 */ -	rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, ®); +	rt2x00pci_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); @@ -488,26 +496,26 @@ 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); -	rt2800_register_write(rt2x00dev, WPDMA_RST_IDX, reg); +	rt2x00pci_register_write(rt2x00dev, WPDMA_RST_IDX, reg); -	rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f); -	rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00); +	rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f); +	rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);  	if (rt2x00_rt(rt2x00dev, RT5390)) { -		rt2800_register_read(rt2x00dev, AUX_CTRL, ®); +		rt2x00pci_register_read(rt2x00dev, AUX_CTRL, ®);  		rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1);  		rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); -		rt2800_register_write(rt2x00dev, AUX_CTRL, reg); +		rt2x00pci_register_write(rt2x00dev, AUX_CTRL, reg);  	} -	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003); +	rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003); -	rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); +	rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);  	rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1);  	rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1); -	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); +	rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg); -	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); +	rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);  	return 0;  } @@ -525,8 +533,8 @@ static void rt2800pci_disable_radio(struct rt2x00_dev *rt2x00dev)  {  	if (rt2x00_is_soc(rt2x00dev)) {  		rt2800_disable_radio(rt2x00dev); -		rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0); -		rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0); +		rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0); +		rt2x00pci_register_write(rt2x00dev, TX_PIN_CFG, 0);  	}  } @@ -537,8 +545,10 @@ static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev,  		rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0x02);  		rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKUP);  	} else if (state == STATE_SLEEP) { -		rt2800_register_write(rt2x00dev, H2M_MAILBOX_STATUS, 0xffffffff); -		rt2800_register_write(rt2x00dev, H2M_MAILBOX_CID, 0xffffffff); +		rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, +					 0xffffffff); +		rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, +					 0xffffffff);  		rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0x01, 0xff, 0x01);  	} @@ -717,12 +727,13 @@ static void rt2800pci_wakeup(struct rt2x00_dev *rt2x00dev)  	rt2800_config(rt2x00dev, &libconf, IEEE80211_CONF_CHANGE_PS);  } -static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev) +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;  	while (kfifo_get(&rt2x00dev->txstatus_fifo, &status)) {  		qid = rt2x00_get_field32(status, TX_STA_FIFO_PID_QUEUE); @@ -759,11 +770,16 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)  		entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);  		rt2800_txdone_entry(entry, status); + +		if (--max_tx_done == 0) +			break;  	} + +	return !max_tx_done;  } -static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev, -				       struct rt2x00_field32 irq_field) +static inline void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev, +					      struct rt2x00_field32 irq_field)  {  	u32 reg; @@ -772,15 +788,17 @@ static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,  	 * access needs locking.  	 */  	spin_lock_irq(&rt2x00dev->irqmask_lock); -	rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); +	rt2x00pci_register_read(rt2x00dev, INT_MASK_CSR, ®);  	rt2x00_set_field32(®, irq_field, 1); -	rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); +	rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);  	spin_unlock_irq(&rt2x00dev->irqmask_lock);  }  static void rt2800pci_txstatus_tasklet(unsigned long data)  { -	rt2800pci_txdone((struct rt2x00_dev *)data); +	struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; +	if (rt2800pci_txdone(rt2x00dev)) +		tasklet_schedule(&rt2x00dev->txstatus_tasklet);  	/*  	 * No need to enable the tx status interrupt here as we always @@ -806,8 +824,10 @@ static void rt2800pci_tbtt_tasklet(unsigned long data)  static void rt2800pci_rxdone_tasklet(unsigned long data)  {  	struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; -	rt2x00pci_rxdone(rt2x00dev); -	rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE); +	if (rt2x00pci_rxdone(rt2x00dev)) +		tasklet_schedule(&rt2x00dev->rxdone_tasklet); +	else +		rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE);  }  static void rt2800pci_autowake_tasklet(unsigned long data) @@ -841,7 +861,7 @@ static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)  	 * need to lock the kfifo.  	 */  	for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) { -		rt2800_register_read(rt2x00dev, TX_STA_FIFO, &status); +		rt2x00pci_register_read(rt2x00dev, TX_STA_FIFO, &status);  		if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))  			break; @@ -863,8 +883,8 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)  	u32 reg, mask;  	/* Read status and ACK all interrupts */ -	rt2800_register_read(rt2x00dev, INT_SOURCE_CSR, ®); -	rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, reg); +	rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, ®); +	rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);  	if (!reg)  		return IRQ_NONE; @@ -904,9 +924,9 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)  	 * the tasklet will reenable the appropriate interrupts.  	 */  	spin_lock(&rt2x00dev->irqmask_lock); -	rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); +	rt2x00pci_register_read(rt2x00dev, INT_MASK_CSR, ®);  	reg &= mask; -	rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); +	rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);  	spin_unlock(&rt2x00dev->irqmask_lock);  	return IRQ_HANDLED; @@ -956,28 +976,28 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev)  	 * This device has multiple filters for control frames  	 * and has a separate filter for PS Poll frames.  	 */ -	__set_bit(DRIVER_SUPPORT_CONTROL_FILTERS, &rt2x00dev->flags); -	__set_bit(DRIVER_SUPPORT_CONTROL_FILTER_PSPOLL, &rt2x00dev->flags); +	__set_bit(CAPABILITY_CONTROL_FILTERS, &rt2x00dev->cap_flags); +	__set_bit(CAPABILITY_CONTROL_FILTER_PSPOLL, &rt2x00dev->cap_flags);  	/*  	 * This device has a pre tbtt interrupt and thus fetches  	 * a new beacon directly prior to transmission.  	 */ -	__set_bit(DRIVER_SUPPORT_PRE_TBTT_INTERRUPT, &rt2x00dev->flags); +	__set_bit(CAPABILITY_PRE_TBTT_INTERRUPT, &rt2x00dev->cap_flags);  	/*  	 * This device requires firmware.  	 */  	if (!rt2x00_is_soc(rt2x00dev)) -		__set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags); -	__set_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags); -	__set_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags); -	__set_bit(DRIVER_REQUIRE_TXSTATUS_FIFO, &rt2x00dev->flags); -	__set_bit(DRIVER_REQUIRE_TASKLET_CONTEXT, &rt2x00dev->flags); +		__set_bit(REQUIRE_FIRMWARE, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_DMA, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_L2PAD, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_TXSTATUS_FIFO, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_TASKLET_CONTEXT, &rt2x00dev->cap_flags);  	if (!modparam_nohwcrypt) -		__set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags); -	__set_bit(DRIVER_SUPPORT_LINK_TUNING, &rt2x00dev->flags); -	__set_bit(DRIVER_REQUIRE_HT_TX_DESC, &rt2x00dev->flags); +		__set_bit(CAPABILITY_HW_CRYPTO, &rt2x00dev->cap_flags); +	__set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags); +	__set_bit(REQUIRE_HT_TX_DESC, &rt2x00dev->cap_flags);  	/*  	 * Set the rssi offset. @@ -1008,6 +1028,7 @@ static const struct ieee80211_ops rt2800pci_mac80211_ops = {  	.ampdu_action		= rt2800_ampdu_action,  	.flush			= rt2x00mac_flush,  	.get_survey		= rt2800_get_survey, +	.get_ringparam		= rt2x00mac_get_ringparam,  };  static const struct rt2800_ops rt2800pci_rt2800_ops = { @@ -1043,9 +1064,11 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {  	.link_stats		= rt2800_link_stats,  	.reset_tuner		= rt2800_reset_tuner,  	.link_tuner		= rt2800_link_tuner, +	.gain_calibration	= rt2800_gain_calibration,  	.start_queue		= rt2800pci_start_queue,  	.kick_queue		= rt2800pci_kick_queue,  	.stop_queue		= rt2800pci_stop_queue, +	.flush_queue		= rt2x00pci_flush_queue,  	.write_tx_desc		= rt2800pci_write_tx_desc,  	.write_tx_data		= rt2800_write_tx_data,  	.write_beacon		= rt2800_write_beacon, @@ -1105,36 +1128,36 @@ static const struct rt2x00_ops rt2800pci_ops = {   */  #ifdef CONFIG_PCI  static DEFINE_PCI_DEVICE_TABLE(rt2800pci_device_table) = { -	{ PCI_DEVICE(0x1814, 0x0601), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x0681), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x0701), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x0781), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3090), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3091), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3092), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7708), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7727), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7728), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7738), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7748), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7758), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7768), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1462, 0x891a), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1a3b, 0x1059), PCI_DEVICE_DATA(&rt2800pci_ops) }, +	{ PCI_DEVICE(0x1814, 0x0601) }, +	{ PCI_DEVICE(0x1814, 0x0681) }, +	{ PCI_DEVICE(0x1814, 0x0701) }, +	{ PCI_DEVICE(0x1814, 0x0781) }, +	{ PCI_DEVICE(0x1814, 0x3090) }, +	{ PCI_DEVICE(0x1814, 0x3091) }, +	{ PCI_DEVICE(0x1814, 0x3092) }, +	{ PCI_DEVICE(0x1432, 0x7708) }, +	{ PCI_DEVICE(0x1432, 0x7727) }, +	{ PCI_DEVICE(0x1432, 0x7728) }, +	{ PCI_DEVICE(0x1432, 0x7738) }, +	{ PCI_DEVICE(0x1432, 0x7748) }, +	{ PCI_DEVICE(0x1432, 0x7758) }, +	{ PCI_DEVICE(0x1432, 0x7768) }, +	{ PCI_DEVICE(0x1462, 0x891a) }, +	{ PCI_DEVICE(0x1a3b, 0x1059) },  #ifdef CONFIG_RT2800PCI_RT33XX -	{ PCI_DEVICE(0x1814, 0x3390), PCI_DEVICE_DATA(&rt2800pci_ops) }, +	{ PCI_DEVICE(0x1814, 0x3390) },  #endif  #ifdef CONFIG_RT2800PCI_RT35XX -	{ PCI_DEVICE(0x1432, 0x7711), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1432, 0x7722), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3060), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3062), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3562), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3592), PCI_DEVICE_DATA(&rt2800pci_ops) }, -	{ PCI_DEVICE(0x1814, 0x3593), PCI_DEVICE_DATA(&rt2800pci_ops) }, +	{ PCI_DEVICE(0x1432, 0x7711) }, +	{ PCI_DEVICE(0x1432, 0x7722) }, +	{ PCI_DEVICE(0x1814, 0x3060) }, +	{ PCI_DEVICE(0x1814, 0x3062) }, +	{ PCI_DEVICE(0x1814, 0x3562) }, +	{ PCI_DEVICE(0x1814, 0x3592) }, +	{ PCI_DEVICE(0x1814, 0x3593) },  #endif  #ifdef CONFIG_RT2800PCI_RT53XX -	{ PCI_DEVICE(0x1814, 0x5390), PCI_DEVICE_DATA(&rt2800pci_ops) }, +	{ PCI_DEVICE(0x1814, 0x5390) },  #endif  	{ 0, }  }; @@ -1170,10 +1193,16 @@ static struct platform_driver rt2800soc_driver = {  #endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */  #ifdef CONFIG_PCI +static int rt2800pci_probe(struct pci_dev *pci_dev, +			   const struct pci_device_id *id) +{ +	return rt2x00pci_probe(pci_dev, &rt2800pci_ops); +} +  static struct pci_driver rt2800pci_driver = {  	.name		= KBUILD_MODNAME,  	.id_table	= rt2800pci_device_table, -	.probe		= rt2x00pci_probe, +	.probe		= rt2800pci_probe,  	.remove		= __devexit_p(rt2x00pci_remove),  	.suspend	= rt2x00pci_suspend,  	.resume		= rt2x00pci_resume,  |