diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 66 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 66 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 66 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800.h | 12 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 835 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 68 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 127 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 56 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 32 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.h | 21 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 60 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 58 | 
14 files changed, 871 insertions, 614 deletions
| diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index f7143733d7e9..3d53a09da5a1 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c @@ -1767,33 +1767,45 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {  	.config			= rt2400pci_config,  }; -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_mmio), -}; +static void rt2400pci_queue_init(struct data_queue *queue) +{ +	switch (queue->qid) { +	case QID_RX: +		queue->limit = 24; +		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 rt2400pci_queue_tx = { -	.entry_num		= 24, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	case QID_AC_VO: +	case QID_AC_VI: +	case QID_AC_BE: +	case QID_AC_BK: +		queue->limit = 24; +		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 rt2400pci_queue_bcn = { -	.entry_num		= 1, -	.data_size		= MGMT_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	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 rt2400pci_queue_atim = { -	.entry_num		= 8, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	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 rt2400pci_ops = {  	.name			= KBUILD_MODNAME, @@ -1801,11 +1813,7 @@ static const struct rt2x00_ops rt2400pci_ops = {  	.eeprom_size		= EEPROM_SIZE,  	.rf_size		= RF_SIZE,  	.tx_queues		= NUM_TX_QUEUES, -	.extra_tx_headroom	= 0, -	.rx			= &rt2400pci_queue_rx, -	.tx			= &rt2400pci_queue_tx, -	.bcn			= &rt2400pci_queue_bcn, -	.atim			= &rt2400pci_queue_atim, +	.queue_init		= rt2400pci_queue_init,  	.lib			= &rt2400pci_rt2x00_ops,  	.hw			= &rt2400pci_mac80211_ops,  #ifdef CONFIG_RT2X00_LIB_DEBUGFS diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 77e45b223d15..0ac5c589ddce 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c @@ -2056,33 +2056,45 @@ 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_mmio), -}; +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_mmio), -}; +	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_mmio), -}; +	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_mmio), -}; +	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, @@ -2090,11 +2102,7 @@ static const struct rt2x00_ops rt2500pci_ops = {  	.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 diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index a7f7b365eff4..85acc79f68b8 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c @@ -1867,33 +1867,45 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {  	.config			= rt2500usb_config,  }; -static const struct data_queue_desc rt2500usb_queue_rx = { -	.entry_num		= 32, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= RXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +static void rt2500usb_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_usb); +		break; -static const struct data_queue_desc rt2500usb_queue_tx = { -	.entry_num		= 32, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +	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_usb); +		break; -static const struct data_queue_desc rt2500usb_queue_bcn = { -	.entry_num		= 1, -	.data_size		= MGMT_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb_bcn), -}; +	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_usb_bcn); +		break; -static const struct data_queue_desc rt2500usb_queue_atim = { -	.entry_num		= 8, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +	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_usb); +		break; + +	default: +		BUG(); +		break; +	} +}  static const struct rt2x00_ops rt2500usb_ops = {  	.name			= KBUILD_MODNAME, @@ -1901,11 +1913,7 @@ static const struct rt2x00_ops rt2500usb_ops = {  	.eeprom_size		= EEPROM_SIZE,  	.rf_size		= RF_SIZE,  	.tx_queues		= NUM_TX_QUEUES, -	.extra_tx_headroom	= TXD_DESC_SIZE, -	.rx			= &rt2500usb_queue_rx, -	.tx			= &rt2500usb_queue_tx, -	.bcn			= &rt2500usb_queue_bcn, -	.atim			= &rt2500usb_queue_atim, +	.queue_init		= rt2500usb_queue_init,  	.lib			= &rt2500usb_rt2x00_ops,  	.hw			= &rt2500usb_mac80211_ops,  #ifdef CONFIG_RT2X00_LIB_DEBUGFS diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h index a7630d5ec892..d78c495a86a0 100644 --- a/drivers/net/wireless/rt2x00/rt2800.h +++ b/drivers/net/wireless/rt2x00/rt2800.h @@ -100,7 +100,7 @@  #define CSR_REG_BASE			0x1000  #define CSR_REG_SIZE			0x0800  #define EEPROM_BASE			0x0000 -#define EEPROM_SIZE			0x0110 +#define EEPROM_SIZE			0x0200  #define BBP_BASE			0x0000  #define BBP_SIZE			0x00ff  #define RF_BASE				0x0004 @@ -2625,11 +2625,13 @@ struct mac_iveiv_entry {  /*   * DMA descriptor defines.   */ -#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)) +#define TXWI_DESC_SIZE_4WORDS		(4 * sizeof(__le32)) +#define TXWI_DESC_SIZE_5WORDS		(5 * sizeof(__le32)) + +#define RXWI_DESC_SIZE_4WORDS		(4 * sizeof(__le32)) +#define RXWI_DESC_SIZE_6WORDS		(6 * sizeof(__le32)) +  /*   * TX WI structure   */ diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 72f32e5caa4d..1f80ea5e29dd 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c @@ -840,7 +840,7 @@ static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev,  						unsigned int beacon_base)  {  	int i; -	const int txwi_desc_size = rt2x00dev->ops->bcn->winfo_size; +	const int txwi_desc_size = rt2x00dev->bcn->winfo_size;  	/*  	 * For the Beacon base registers we only need to clear @@ -2392,7 +2392,7 @@ static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev,  	rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);  	rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr); -	if (info->default_power1 > power_bound) +	if (info->default_power2 > power_bound)  		rt2x00_set_field8(&rfcsr, RFCSR50_TX, power_bound);  	else  		rt2x00_set_field8(&rfcsr, RFCSR50_TX, info->default_power2); @@ -2678,30 +2678,53 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,  	tx_pin = 0; -	/* Turn on unused PA or LNA when not using 1T or 1R */ -	if (rt2x00dev->default_ant.tx_chain_num == 2) { +	switch (rt2x00dev->default_ant.tx_chain_num) { +	case 3: +		/* Turn on tertiary PAs */ +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, +				   rf->channel > 14); +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, +				   rf->channel <= 14); +		/* fall-through */ +	case 2: +		/* Turn on secondary PAs */  		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN,  				   rf->channel > 14);  		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN,  				   rf->channel <= 14); +		/* fall-through */ +	case 1: +		/* Turn on primary PAs */ +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, +				   rf->channel > 14); +		if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) +			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1); +		else +			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, +					   rf->channel <= 14); +		break;  	} -	/* Turn on unused PA or LNA when not using 1T or 1R */ -	if (rt2x00dev->default_ant.rx_chain_num == 2) { +	switch (rt2x00dev->default_ant.rx_chain_num) { +	case 3: +		/* Turn on tertiary LNAs */ +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1); +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1); +		/* fall-through */ +	case 2: +		/* Turn on secondary LNAs */  		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);  		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1); +		/* fall-through */ +	case 1: +		/* Turn on primary LNAs */ +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1); +		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1); +		break;  	} -	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1); -	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);  	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);  	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1); -	if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) -		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1); -	else -		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, -				   rf->channel <= 14); -	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, rf->channel > 14);  	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); @@ -3960,379 +3983,577 @@ static void rt2800_init_bbp_early(struct rt2x00_dev *rt2x00dev)  	rt2800_bbp_write(rt2x00dev, 106, 0x35);  } -static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev) +static void rt2800_disable_unused_dac_adc(struct rt2x00_dev *rt2x00dev)  { -	int ant, div_mode;  	u16 eeprom;  	u8 value; -	rt2800_init_bbp_early(rt2x00dev); +	rt2800_bbp_read(rt2x00dev, 138, &value); +	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom); +	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1) +		value |= 0x20; +	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1) +		value &= ~0x02; +	rt2800_bbp_write(rt2x00dev, 138, value); +} -	rt2800_bbp_read(rt2x00dev, 105, &value); -	rt2x00_set_field8(&value, BBP105_MLD, -			  rt2x00dev->default_ant.rx_chain_num == 2); -	rt2800_bbp_write(rt2x00dev, 105, value); +static void rt2800_init_bbp_305x_soc(struct rt2x00_dev *rt2x00dev) +{ +	rt2800_bbp_write(rt2x00dev, 31, 0x08); + +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); + +	rt2800_bbp_write(rt2x00dev, 69, 0x12); +	rt2800_bbp_write(rt2x00dev, 73, 0x10); + +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); + +	rt2800_bbp_write(rt2x00dev, 78, 0x0e); +	rt2800_bbp_write(rt2x00dev, 80, 0x08); + +	rt2800_bbp_write(rt2x00dev, 82, 0x62); + +	rt2800_bbp_write(rt2x00dev, 83, 0x6a); + +	rt2800_bbp_write(rt2x00dev, 84, 0x99); + +	rt2800_bbp_write(rt2x00dev, 86, 0x00); + +	rt2800_bbp_write(rt2x00dev, 91, 0x04); + +	rt2800_bbp_write(rt2x00dev, 92, 0x00); + +	rt2800_bbp_write(rt2x00dev, 103, 0xc0); + +	rt2800_bbp_write(rt2x00dev, 105, 0x01); + +	rt2800_bbp_write(rt2x00dev, 106, 0x35); +} + +static void rt2800_init_bbp_28xx(struct rt2x00_dev *rt2x00dev) +{ +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); + +	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) { +		rt2800_bbp_write(rt2x00dev, 69, 0x16); +		rt2800_bbp_write(rt2x00dev, 73, 0x12); +	} else { +		rt2800_bbp_write(rt2x00dev, 69, 0x12); +		rt2800_bbp_write(rt2x00dev, 73, 0x10); +	} + +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); + +	rt2800_bbp_write(rt2x00dev, 81, 0x37); + +	rt2800_bbp_write(rt2x00dev, 82, 0x62); + +	rt2800_bbp_write(rt2x00dev, 83, 0x6a); + +	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D)) +		rt2800_bbp_write(rt2x00dev, 84, 0x19); +	else +		rt2800_bbp_write(rt2x00dev, 84, 0x99); + +	rt2800_bbp_write(rt2x00dev, 86, 0x00); + +	rt2800_bbp_write(rt2x00dev, 91, 0x04); + +	rt2800_bbp_write(rt2x00dev, 92, 0x00); + +	rt2800_bbp_write(rt2x00dev, 103, 0x00); + +	rt2800_bbp_write(rt2x00dev, 105, 0x05); + +	rt2800_bbp_write(rt2x00dev, 106, 0x35); +} + +static void rt2800_init_bbp_30xx(struct rt2x00_dev *rt2x00dev) +{ +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); + +	rt2800_bbp_write(rt2x00dev, 69, 0x12); +	rt2800_bbp_write(rt2x00dev, 73, 0x10); + +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); + +	rt2800_bbp_write(rt2x00dev, 79, 0x13); +	rt2800_bbp_write(rt2x00dev, 80, 0x05); +	rt2800_bbp_write(rt2x00dev, 81, 0x33); + +	rt2800_bbp_write(rt2x00dev, 82, 0x62); + +	rt2800_bbp_write(rt2x00dev, 83, 0x6a); + +	rt2800_bbp_write(rt2x00dev, 84, 0x99); + +	rt2800_bbp_write(rt2x00dev, 86, 0x00); + +	rt2800_bbp_write(rt2x00dev, 91, 0x04); + +	rt2800_bbp_write(rt2x00dev, 92, 0x00); + +	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) || +	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) || +	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E)) +		rt2800_bbp_write(rt2x00dev, 103, 0xc0); +	else +		rt2800_bbp_write(rt2x00dev, 103, 0x00); + +	rt2800_bbp_write(rt2x00dev, 105, 0x05); + +	rt2800_bbp_write(rt2x00dev, 106, 0x35); + +	if (rt2x00_rt(rt2x00dev, RT3071) || +	    rt2x00_rt(rt2x00dev, RT3090)) +		rt2800_disable_unused_dac_adc(rt2x00dev); +} + +static void rt2800_init_bbp_3290(struct rt2x00_dev *rt2x00dev) +{ +	u8 value;  	rt2800_bbp4_mac_if_ctrl(rt2x00dev); -	rt2800_bbp_write(rt2x00dev, 20, 0x06);  	rt2800_bbp_write(rt2x00dev, 31, 0x08); -	rt2800_bbp_write(rt2x00dev, 65, 0x2C); -	rt2800_bbp_write(rt2x00dev, 68, 0xDD); -	rt2800_bbp_write(rt2x00dev, 69, 0x1A); -	rt2800_bbp_write(rt2x00dev, 70, 0x05); + +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); + +	rt2800_bbp_write(rt2x00dev, 68, 0x0b); + +	rt2800_bbp_write(rt2x00dev, 69, 0x12);  	rt2800_bbp_write(rt2x00dev, 73, 0x13); -	rt2800_bbp_write(rt2x00dev, 74, 0x0F); -	rt2800_bbp_write(rt2x00dev, 75, 0x4F); +	rt2800_bbp_write(rt2x00dev, 75, 0x46);  	rt2800_bbp_write(rt2x00dev, 76, 0x28); + +	rt2800_bbp_write(rt2x00dev, 77, 0x58); + +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); + +	rt2800_bbp_write(rt2x00dev, 74, 0x0b); +	rt2800_bbp_write(rt2x00dev, 79, 0x18); +	rt2800_bbp_write(rt2x00dev, 80, 0x09); +	rt2800_bbp_write(rt2x00dev, 81, 0x33); + +	rt2800_bbp_write(rt2x00dev, 82, 0x62); + +	rt2800_bbp_write(rt2x00dev, 83, 0x7a); + +	rt2800_bbp_write(rt2x00dev, 84, 0x9a); + +	rt2800_bbp_write(rt2x00dev, 86, 0x38); + +	rt2800_bbp_write(rt2x00dev, 91, 0x04); + +	rt2800_bbp_write(rt2x00dev, 92, 0x02); + +	rt2800_bbp_write(rt2x00dev, 103, 0xc0); + +	rt2800_bbp_write(rt2x00dev, 104, 0x92); + +	rt2800_bbp_write(rt2x00dev, 105, 0x1c); + +	rt2800_bbp_write(rt2x00dev, 106, 0x03); + +	rt2800_bbp_write(rt2x00dev, 128, 0x12); + +	rt2800_bbp_write(rt2x00dev, 67, 0x24); +	rt2800_bbp_write(rt2x00dev, 143, 0x04); +	rt2800_bbp_write(rt2x00dev, 142, 0x99); +	rt2800_bbp_write(rt2x00dev, 150, 0x30); +	rt2800_bbp_write(rt2x00dev, 151, 0x2e); +	rt2800_bbp_write(rt2x00dev, 152, 0x20); +	rt2800_bbp_write(rt2x00dev, 153, 0x34); +	rt2800_bbp_write(rt2x00dev, 154, 0x40); +	rt2800_bbp_write(rt2x00dev, 155, 0x3b); +	rt2800_bbp_write(rt2x00dev, 253, 0x04); + +	rt2800_bbp_read(rt2x00dev, 47, &value); +	rt2x00_set_field8(&value, BBP47_TSSI_ADC6, 1); +	rt2800_bbp_write(rt2x00dev, 47, value); + +	/* Use 5-bit ADC for Acquisition and 8-bit ADC for data */ +	rt2800_bbp_read(rt2x00dev, 3, &value); +	rt2x00_set_field8(&value, BBP3_ADC_MODE_SWITCH, 1); +	rt2x00_set_field8(&value, BBP3_ADC_INIT_MODE, 1); +	rt2800_bbp_write(rt2x00dev, 3, value); +} + +static void rt2800_init_bbp_3352(struct rt2x00_dev *rt2x00dev) +{ +	rt2800_bbp_write(rt2x00dev, 3, 0x00); +	rt2800_bbp_write(rt2x00dev, 4, 0x50); + +	rt2800_bbp_write(rt2x00dev, 31, 0x08); + +	rt2800_bbp_write(rt2x00dev, 47, 0x48); + +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); + +	rt2800_bbp_write(rt2x00dev, 68, 0x0b); + +	rt2800_bbp_write(rt2x00dev, 69, 0x12); +	rt2800_bbp_write(rt2x00dev, 73, 0x13); +	rt2800_bbp_write(rt2x00dev, 75, 0x46); +	rt2800_bbp_write(rt2x00dev, 76, 0x28); +  	rt2800_bbp_write(rt2x00dev, 77, 0x59); -	rt2800_bbp_write(rt2x00dev, 84, 0x9A); + +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); + +	rt2800_bbp_write(rt2x00dev, 78, 0x0e); +	rt2800_bbp_write(rt2x00dev, 80, 0x08); +	rt2800_bbp_write(rt2x00dev, 81, 0x37); + +	rt2800_bbp_write(rt2x00dev, 82, 0x62); + +	rt2800_bbp_write(rt2x00dev, 83, 0x6a); + +	rt2800_bbp_write(rt2x00dev, 84, 0x99); +  	rt2800_bbp_write(rt2x00dev, 86, 0x38); +  	rt2800_bbp_write(rt2x00dev, 88, 0x90); +  	rt2800_bbp_write(rt2x00dev, 91, 0x04); +  	rt2800_bbp_write(rt2x00dev, 92, 0x02); -	rt2800_bbp_write(rt2x00dev, 95, 0x9a); -	rt2800_bbp_write(rt2x00dev, 98, 0x12); -	rt2800_bbp_write(rt2x00dev, 103, 0xC0); + +	rt2800_bbp_write(rt2x00dev, 103, 0xc0); +  	rt2800_bbp_write(rt2x00dev, 104, 0x92); -	/* FIXME BBP105 owerwrite */ -	rt2800_bbp_write(rt2x00dev, 105, 0x3C); -	rt2800_bbp_write(rt2x00dev, 106, 0x35); -	rt2800_bbp_write(rt2x00dev, 128, 0x12); -	rt2800_bbp_write(rt2x00dev, 134, 0xD0); -	rt2800_bbp_write(rt2x00dev, 135, 0xF6); -	rt2800_bbp_write(rt2x00dev, 137, 0x0F); -	/* Initialize GLRT (Generalized Likehood Radio Test) */ -	rt2800_init_bbp_5592_glrt(rt2x00dev); +	rt2800_bbp_write(rt2x00dev, 105, 0x34); + +	rt2800_bbp_write(rt2x00dev, 106, 0x05); + +	rt2800_bbp_write(rt2x00dev, 120, 0x50); + +	rt2800_bbp_write(rt2x00dev, 137, 0x0f); + +	rt2800_bbp_write(rt2x00dev, 163, 0xbd); +	/* Set ITxBF timeout to 0x9c40=1000msec */ +	rt2800_bbp_write(rt2x00dev, 179, 0x02); +	rt2800_bbp_write(rt2x00dev, 180, 0x00); +	rt2800_bbp_write(rt2x00dev, 182, 0x40); +	rt2800_bbp_write(rt2x00dev, 180, 0x01); +	rt2800_bbp_write(rt2x00dev, 182, 0x9c); +	rt2800_bbp_write(rt2x00dev, 179, 0x00); +	/* Reprogram the inband interface to put right values in RXWI */ +	rt2800_bbp_write(rt2x00dev, 142, 0x04); +	rt2800_bbp_write(rt2x00dev, 143, 0x3b); +	rt2800_bbp_write(rt2x00dev, 142, 0x06); +	rt2800_bbp_write(rt2x00dev, 143, 0xa0); +	rt2800_bbp_write(rt2x00dev, 142, 0x07); +	rt2800_bbp_write(rt2x00dev, 143, 0xa1); +	rt2800_bbp_write(rt2x00dev, 142, 0x08); +	rt2800_bbp_write(rt2x00dev, 143, 0xa2); + +	rt2800_bbp_write(rt2x00dev, 148, 0xc8); +} -	rt2800_bbp4_mac_if_ctrl(rt2x00dev); +static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev) +{ +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); -	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); -	div_mode = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY); -	ant = (div_mode == 3) ? 1 : 0; -	rt2800_bbp_read(rt2x00dev, 152, &value); -	if (ant == 0) { -		/* Main antenna */ -		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1); -	} else { -		/* Auxiliary antenna */ -		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0); -	} -	rt2800_bbp_write(rt2x00dev, 152, value); +	rt2800_bbp_write(rt2x00dev, 69, 0x12); +	rt2800_bbp_write(rt2x00dev, 73, 0x10); -	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) { -		rt2800_bbp_read(rt2x00dev, 254, &value); -		rt2x00_set_field8(&value, BBP254_BIT7, 1); -		rt2800_bbp_write(rt2x00dev, 254, value); -	} +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); -	rt2800_init_freq_calibration(rt2x00dev); +	rt2800_bbp_write(rt2x00dev, 79, 0x13); +	rt2800_bbp_write(rt2x00dev, 80, 0x05); +	rt2800_bbp_write(rt2x00dev, 81, 0x33); -	rt2800_bbp_write(rt2x00dev, 84, 0x19); -	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) +	rt2800_bbp_write(rt2x00dev, 82, 0x62); + +	rt2800_bbp_write(rt2x00dev, 83, 0x6a); + +	rt2800_bbp_write(rt2x00dev, 84, 0x99); + +	rt2800_bbp_write(rt2x00dev, 86, 0x00); + +	rt2800_bbp_write(rt2x00dev, 91, 0x04); + +	rt2800_bbp_write(rt2x00dev, 92, 0x00); + +	if (rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E))  		rt2800_bbp_write(rt2x00dev, 103, 0xc0); +	else +		rt2800_bbp_write(rt2x00dev, 103, 0x00); + +	rt2800_bbp_write(rt2x00dev, 105, 0x05); + +	rt2800_bbp_write(rt2x00dev, 106, 0x35); + +	rt2800_disable_unused_dac_adc(rt2x00dev);  } -static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) +static void rt2800_init_bbp_3572(struct rt2x00_dev *rt2x00dev)  { -	unsigned int i; -	u16 eeprom; -	u8 reg_id; -	u8 value; +	rt2800_bbp_write(rt2x00dev, 31, 0x08); -	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev) || -		     rt2800_wait_bbp_ready(rt2x00dev))) -		return -EACCES; +	rt2800_bbp_write(rt2x00dev, 65, 0x2c); +	rt2800_bbp_write(rt2x00dev, 66, 0x38); -	if (rt2x00_rt(rt2x00dev, RT5592)) { -		rt2800_init_bbp_5592(rt2x00dev); -		return 0; -	} +	rt2800_bbp_write(rt2x00dev, 69, 0x12); +	rt2800_bbp_write(rt2x00dev, 73, 0x10); -	if (rt2x00_rt(rt2x00dev, RT3352)) { -		rt2800_bbp_write(rt2x00dev, 3, 0x00); -		rt2800_bbp_write(rt2x00dev, 4, 0x50); -	} +	rt2800_bbp_write(rt2x00dev, 70, 0x0a); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp4_mac_if_ctrl(rt2x00dev); +	rt2800_bbp_write(rt2x00dev, 79, 0x13); +	rt2800_bbp_write(rt2x00dev, 80, 0x05); +	rt2800_bbp_write(rt2x00dev, 81, 0x33); -	if (rt2800_is_305x_soc(rt2x00dev) || -	    rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT3572) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 31, 0x08); +	rt2800_bbp_write(rt2x00dev, 82, 0x62); -	if (rt2x00_rt(rt2x00dev, RT3352)) -		rt2800_bbp_write(rt2x00dev, 47, 0x48); +	rt2800_bbp_write(rt2x00dev, 83, 0x6a); + +	rt2800_bbp_write(rt2x00dev, 84, 0x99); + +	rt2800_bbp_write(rt2x00dev, 86, 0x00); + +	rt2800_bbp_write(rt2x00dev, 91, 0x04); + +	rt2800_bbp_write(rt2x00dev, 92, 0x00); + +	rt2800_bbp_write(rt2x00dev, 103, 0xc0); + +	rt2800_bbp_write(rt2x00dev, 105, 0x05); + +	rt2800_bbp_write(rt2x00dev, 106, 0x35); + +	rt2800_disable_unused_dac_adc(rt2x00dev); +} + +static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) +{ +	int ant, div_mode; +	u16 eeprom; +	u8 value; + +	rt2800_bbp4_mac_if_ctrl(rt2x00dev); + +	rt2800_bbp_write(rt2x00dev, 31, 0x08);  	rt2800_bbp_write(rt2x00dev, 65, 0x2c);  	rt2800_bbp_write(rt2x00dev, 66, 0x38); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 68, 0x0b); +	rt2800_bbp_write(rt2x00dev, 68, 0x0b); -	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) { -		rt2800_bbp_write(rt2x00dev, 69, 0x16); -		rt2800_bbp_write(rt2x00dev, 73, 0x12); -	} else if (rt2x00_rt(rt2x00dev, RT3290) || -		   rt2x00_rt(rt2x00dev, RT3352) || -		   rt2x00_rt(rt2x00dev, RT5390) || -		   rt2x00_rt(rt2x00dev, RT5392)) { -		rt2800_bbp_write(rt2x00dev, 69, 0x12); -		rt2800_bbp_write(rt2x00dev, 73, 0x13); -		rt2800_bbp_write(rt2x00dev, 75, 0x46); -		rt2800_bbp_write(rt2x00dev, 76, 0x28); +	rt2800_bbp_write(rt2x00dev, 69, 0x12); +	rt2800_bbp_write(rt2x00dev, 73, 0x13); +	rt2800_bbp_write(rt2x00dev, 75, 0x46); +	rt2800_bbp_write(rt2x00dev, 76, 0x28); -		if (rt2x00_rt(rt2x00dev, RT3290)) -			rt2800_bbp_write(rt2x00dev, 77, 0x58); -		else -			rt2800_bbp_write(rt2x00dev, 77, 0x59); -	} else { -		rt2800_bbp_write(rt2x00dev, 69, 0x12); -		rt2800_bbp_write(rt2x00dev, 73, 0x10); -	} +	rt2800_bbp_write(rt2x00dev, 77, 0x59);  	rt2800_bbp_write(rt2x00dev, 70, 0x0a); -	if (rt2x00_rt(rt2x00dev, RT3070) || -	    rt2x00_rt(rt2x00dev, RT3071) || -	    rt2x00_rt(rt2x00dev, RT3090) || -	    rt2x00_rt(rt2x00dev, RT3390) || -	    rt2x00_rt(rt2x00dev, RT3572) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) { -		rt2800_bbp_write(rt2x00dev, 79, 0x13); -		rt2800_bbp_write(rt2x00dev, 80, 0x05); -		rt2800_bbp_write(rt2x00dev, 81, 0x33); -	} else if (rt2800_is_305x_soc(rt2x00dev)) { -		rt2800_bbp_write(rt2x00dev, 78, 0x0e); -		rt2800_bbp_write(rt2x00dev, 80, 0x08); -	} else if (rt2x00_rt(rt2x00dev, RT3290)) { -		rt2800_bbp_write(rt2x00dev, 74, 0x0b); -		rt2800_bbp_write(rt2x00dev, 79, 0x18); -		rt2800_bbp_write(rt2x00dev, 80, 0x09); -		rt2800_bbp_write(rt2x00dev, 81, 0x33); -	} else if (rt2x00_rt(rt2x00dev, RT3352)) { -		rt2800_bbp_write(rt2x00dev, 78, 0x0e); -		rt2800_bbp_write(rt2x00dev, 80, 0x08); -		rt2800_bbp_write(rt2x00dev, 81, 0x37); -	} else { -		rt2800_bbp_write(rt2x00dev, 81, 0x37); -	} +	rt2800_bbp_write(rt2x00dev, 79, 0x13); +	rt2800_bbp_write(rt2x00dev, 80, 0x05); +	rt2800_bbp_write(rt2x00dev, 81, 0x33);  	rt2800_bbp_write(rt2x00dev, 82, 0x62); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 83, 0x7a); -	else -		rt2800_bbp_write(rt2x00dev, 83, 0x6a); -	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D)) -		rt2800_bbp_write(rt2x00dev, 84, 0x19); -	else if (rt2x00_rt(rt2x00dev, RT3290) || -		 rt2x00_rt(rt2x00dev, RT5390) || -		 rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 84, 0x9a); -	else -		rt2800_bbp_write(rt2x00dev, 84, 0x99); +	rt2800_bbp_write(rt2x00dev, 83, 0x7a); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 86, 0x38); -	else -		rt2800_bbp_write(rt2x00dev, 86, 0x00); +	rt2800_bbp_write(rt2x00dev, 84, 0x9a); -	if (rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT5392)) +	rt2800_bbp_write(rt2x00dev, 86, 0x38); + +	if (rt2x00_rt(rt2x00dev, RT5392))  		rt2800_bbp_write(rt2x00dev, 88, 0x90);  	rt2800_bbp_write(rt2x00dev, 91, 0x04); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 92, 0x02); -	else -		rt2800_bbp_write(rt2x00dev, 92, 0x00); +	rt2800_bbp_write(rt2x00dev, 92, 0x02);  	if (rt2x00_rt(rt2x00dev, RT5392)) {  		rt2800_bbp_write(rt2x00dev, 95, 0x9a);  		rt2800_bbp_write(rt2x00dev, 98, 0x12);  	} -	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) || -	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) || -	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) || -	    rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) || -	    rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT3572) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392) || -	    rt2800_is_305x_soc(rt2x00dev)) -		rt2800_bbp_write(rt2x00dev, 103, 0xc0); -	else -		rt2800_bbp_write(rt2x00dev, 103, 0x00); +	rt2800_bbp_write(rt2x00dev, 103, 0xc0); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT3352) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 104, 0x92); +	rt2800_bbp_write(rt2x00dev, 104, 0x92); -	if (rt2800_is_305x_soc(rt2x00dev)) -		rt2800_bbp_write(rt2x00dev, 105, 0x01); -	else if (rt2x00_rt(rt2x00dev, RT3290)) -		rt2800_bbp_write(rt2x00dev, 105, 0x1c); -	else if (rt2x00_rt(rt2x00dev, RT3352)) -		rt2800_bbp_write(rt2x00dev, 105, 0x34); -	else if (rt2x00_rt(rt2x00dev, RT5390) || -		 rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 105, 0x3c); -	else -		rt2800_bbp_write(rt2x00dev, 105, 0x05); +	rt2800_bbp_write(rt2x00dev, 105, 0x3c); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT5390)) +	if (rt2x00_rt(rt2x00dev, RT5390))  		rt2800_bbp_write(rt2x00dev, 106, 0x03); -	else if (rt2x00_rt(rt2x00dev, RT3352)) -		rt2800_bbp_write(rt2x00dev, 106, 0x05);  	else if (rt2x00_rt(rt2x00dev, RT5392))  		rt2800_bbp_write(rt2x00dev, 106, 0x12);  	else -		rt2800_bbp_write(rt2x00dev, 106, 0x35); - -	if (rt2x00_rt(rt2x00dev, RT3352)) -		rt2800_bbp_write(rt2x00dev, 120, 0x50); +		WARN_ON(1); -	if (rt2x00_rt(rt2x00dev, RT3290) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) -		rt2800_bbp_write(rt2x00dev, 128, 0x12); +	rt2800_bbp_write(rt2x00dev, 128, 0x12);  	if (rt2x00_rt(rt2x00dev, RT5392)) {  		rt2800_bbp_write(rt2x00dev, 134, 0xd0);  		rt2800_bbp_write(rt2x00dev, 135, 0xf6);  	} -	if (rt2x00_rt(rt2x00dev, RT3352)) -		rt2800_bbp_write(rt2x00dev, 137, 0x0f); +	rt2800_disable_unused_dac_adc(rt2x00dev); -	if (rt2x00_rt(rt2x00dev, RT3071) || -	    rt2x00_rt(rt2x00dev, RT3090) || -	    rt2x00_rt(rt2x00dev, RT3390) || -	    rt2x00_rt(rt2x00dev, RT3572) || -	    rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) { -		rt2800_bbp_read(rt2x00dev, 138, &value); +	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); +	div_mode = rt2x00_get_field16(eeprom, +				      EEPROM_NIC_CONF1_ANT_DIVERSITY); +	ant = (div_mode == 3) ? 1 : 0; -		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom); -		if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1) -			value |= 0x20; -		if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1) -			value &= ~0x02; +	/* check if this is a Bluetooth combo card */ +	if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) { +		u32 reg; -		rt2800_bbp_write(rt2x00dev, 138, value); +		rt2800_register_read(rt2x00dev, GPIO_CTRL, ®); +		rt2x00_set_field32(®, GPIO_CTRL_DIR3, 0); +		rt2x00_set_field32(®, GPIO_CTRL_DIR6, 0); +		rt2x00_set_field32(®, GPIO_CTRL_VAL3, 0); +		rt2x00_set_field32(®, GPIO_CTRL_VAL6, 0); +		if (ant == 0) +			rt2x00_set_field32(®, GPIO_CTRL_VAL3, 1); +		else if (ant == 1) +			rt2x00_set_field32(®, GPIO_CTRL_VAL6, 1); +		rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);  	} -	if (rt2x00_rt(rt2x00dev, RT3290)) { -		rt2800_bbp_write(rt2x00dev, 67, 0x24); -		rt2800_bbp_write(rt2x00dev, 143, 0x04); -		rt2800_bbp_write(rt2x00dev, 142, 0x99); -		rt2800_bbp_write(rt2x00dev, 150, 0x30); -		rt2800_bbp_write(rt2x00dev, 151, 0x2e); -		rt2800_bbp_write(rt2x00dev, 152, 0x20); -		rt2800_bbp_write(rt2x00dev, 153, 0x34); -		rt2800_bbp_write(rt2x00dev, 154, 0x40); -		rt2800_bbp_write(rt2x00dev, 155, 0x3b); -		rt2800_bbp_write(rt2x00dev, 253, 0x04); - -		rt2800_bbp_read(rt2x00dev, 47, &value); -		rt2x00_set_field8(&value, BBP47_TSSI_ADC6, 1); -		rt2800_bbp_write(rt2x00dev, 47, value); - -		/* Use 5-bit ADC for Acquisition and 8-bit ADC for data */ -		rt2800_bbp_read(rt2x00dev, 3, &value); -		rt2x00_set_field8(&value, BBP3_ADC_MODE_SWITCH, 1); -		rt2x00_set_field8(&value, BBP3_ADC_INIT_MODE, 1); -		rt2800_bbp_write(rt2x00dev, 3, value); +	/* This chip has hardware antenna diversity*/ +	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R)) { +		rt2800_bbp_write(rt2x00dev, 150, 0); /* Disable Antenna Software OFDM */ +		rt2800_bbp_write(rt2x00dev, 151, 0); /* Disable Antenna Software CCK */ +		rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */  	} -	if (rt2x00_rt(rt2x00dev, RT3352)) { -		rt2800_bbp_write(rt2x00dev, 163, 0xbd); -		/* Set ITxBF timeout to 0x9c40=1000msec */ -		rt2800_bbp_write(rt2x00dev, 179, 0x02); -		rt2800_bbp_write(rt2x00dev, 180, 0x00); -		rt2800_bbp_write(rt2x00dev, 182, 0x40); -		rt2800_bbp_write(rt2x00dev, 180, 0x01); -		rt2800_bbp_write(rt2x00dev, 182, 0x9c); -		rt2800_bbp_write(rt2x00dev, 179, 0x00); -		/* Reprogram the inband interface to put right values in RXWI */ -		rt2800_bbp_write(rt2x00dev, 142, 0x04); -		rt2800_bbp_write(rt2x00dev, 143, 0x3b); -		rt2800_bbp_write(rt2x00dev, 142, 0x06); -		rt2800_bbp_write(rt2x00dev, 143, 0xa0); -		rt2800_bbp_write(rt2x00dev, 142, 0x07); -		rt2800_bbp_write(rt2x00dev, 143, 0xa1); -		rt2800_bbp_write(rt2x00dev, 142, 0x08); -		rt2800_bbp_write(rt2x00dev, 143, 0xa2); - -		rt2800_bbp_write(rt2x00dev, 148, 0xc8); +	rt2800_bbp_read(rt2x00dev, 152, &value); +	if (ant == 0) +		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1); +	else +		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0); +	rt2800_bbp_write(rt2x00dev, 152, value); + +	rt2800_init_freq_calibration(rt2x00dev); +} + +static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev) +{ +	int ant, div_mode; +	u16 eeprom; +	u8 value; + +	rt2800_init_bbp_early(rt2x00dev); + +	rt2800_bbp_read(rt2x00dev, 105, &value); +	rt2x00_set_field8(&value, BBP105_MLD, +			  rt2x00dev->default_ant.rx_chain_num == 2); +	rt2800_bbp_write(rt2x00dev, 105, value); + +	rt2800_bbp4_mac_if_ctrl(rt2x00dev); + +	rt2800_bbp_write(rt2x00dev, 20, 0x06); +	rt2800_bbp_write(rt2x00dev, 31, 0x08); +	rt2800_bbp_write(rt2x00dev, 65, 0x2C); +	rt2800_bbp_write(rt2x00dev, 68, 0xDD); +	rt2800_bbp_write(rt2x00dev, 69, 0x1A); +	rt2800_bbp_write(rt2x00dev, 70, 0x05); +	rt2800_bbp_write(rt2x00dev, 73, 0x13); +	rt2800_bbp_write(rt2x00dev, 74, 0x0F); +	rt2800_bbp_write(rt2x00dev, 75, 0x4F); +	rt2800_bbp_write(rt2x00dev, 76, 0x28); +	rt2800_bbp_write(rt2x00dev, 77, 0x59); +	rt2800_bbp_write(rt2x00dev, 84, 0x9A); +	rt2800_bbp_write(rt2x00dev, 86, 0x38); +	rt2800_bbp_write(rt2x00dev, 88, 0x90); +	rt2800_bbp_write(rt2x00dev, 91, 0x04); +	rt2800_bbp_write(rt2x00dev, 92, 0x02); +	rt2800_bbp_write(rt2x00dev, 95, 0x9a); +	rt2800_bbp_write(rt2x00dev, 98, 0x12); +	rt2800_bbp_write(rt2x00dev, 103, 0xC0); +	rt2800_bbp_write(rt2x00dev, 104, 0x92); +	/* FIXME BBP105 owerwrite */ +	rt2800_bbp_write(rt2x00dev, 105, 0x3C); +	rt2800_bbp_write(rt2x00dev, 106, 0x35); +	rt2800_bbp_write(rt2x00dev, 128, 0x12); +	rt2800_bbp_write(rt2x00dev, 134, 0xD0); +	rt2800_bbp_write(rt2x00dev, 135, 0xF6); +	rt2800_bbp_write(rt2x00dev, 137, 0x0F); + +	/* Initialize GLRT (Generalized Likehood Radio Test) */ +	rt2800_init_bbp_5592_glrt(rt2x00dev); + +	rt2800_bbp4_mac_if_ctrl(rt2x00dev); + +	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); +	div_mode = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY); +	ant = (div_mode == 3) ? 1 : 0; +	rt2800_bbp_read(rt2x00dev, 152, &value); +	if (ant == 0) { +		/* Main antenna */ +		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1); +	} else { +		/* Auxiliary antenna */ +		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0);  	} +	rt2800_bbp_write(rt2x00dev, 152, value); -	if (rt2x00_rt(rt2x00dev, RT5390) || -	    rt2x00_rt(rt2x00dev, RT5392)) { -		int ant, div_mode; +	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) { +		rt2800_bbp_read(rt2x00dev, 254, &value); +		rt2x00_set_field8(&value, BBP254_BIT7, 1); +		rt2800_bbp_write(rt2x00dev, 254, value); +	} -		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); -		div_mode = rt2x00_get_field16(eeprom, -					      EEPROM_NIC_CONF1_ANT_DIVERSITY); -		ant = (div_mode == 3) ? 1 : 0; +	rt2800_init_freq_calibration(rt2x00dev); -		/* check if this is a Bluetooth combo card */ -		if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) { -			u32 reg; - -			rt2800_register_read(rt2x00dev, GPIO_CTRL, ®); -			rt2x00_set_field32(®, GPIO_CTRL_DIR3, 0); -			rt2x00_set_field32(®, GPIO_CTRL_DIR6, 0); -			rt2x00_set_field32(®, GPIO_CTRL_VAL3, 0); -			rt2x00_set_field32(®, GPIO_CTRL_VAL6, 0); -			if (ant == 0) -				rt2x00_set_field32(®, GPIO_CTRL_VAL3, 1); -			else if (ant == 1) -				rt2x00_set_field32(®, GPIO_CTRL_VAL6, 1); -			rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); -		} +	rt2800_bbp_write(rt2x00dev, 84, 0x19); +	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) +		rt2800_bbp_write(rt2x00dev, 103, 0xc0); +} -		/* This chip has hardware antenna diversity*/ -		if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R)) { -			rt2800_bbp_write(rt2x00dev, 150, 0); /* Disable Antenna Software OFDM */ -			rt2800_bbp_write(rt2x00dev, 151, 0); /* Disable Antenna Software CCK */ -			rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */ -		} +static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) +{ +	unsigned int i; +	u16 eeprom; +	u8 reg_id; +	u8 value; -		rt2800_bbp_read(rt2x00dev, 152, &value); -		if (ant == 0) -			rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1); -		else -			rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0); -		rt2800_bbp_write(rt2x00dev, 152, value); +	if (rt2800_is_305x_soc(rt2x00dev)) +		rt2800_init_bbp_305x_soc(rt2x00dev); -		rt2800_init_freq_calibration(rt2x00dev); +	switch (rt2x00dev->chip.rt) { +	case RT2860: +	case RT2872: +	case RT2883: +		rt2800_init_bbp_28xx(rt2x00dev); +		break; +	case RT3070: +	case RT3071: +	case RT3090: +		rt2800_init_bbp_30xx(rt2x00dev); +		break; +	case RT3290: +		rt2800_init_bbp_3290(rt2x00dev); +		break; +	case RT3352: +		rt2800_init_bbp_3352(rt2x00dev); +		break; +	case RT3390: +		rt2800_init_bbp_3390(rt2x00dev); +		break; +	case RT3572: +		rt2800_init_bbp_3572(rt2x00dev); +		break; +	case RT5390: +	case RT5392: +		rt2800_init_bbp_53xx(rt2x00dev); +		break; +	case RT5592: +		rt2800_init_bbp_5592(rt2x00dev); +		return;  	}  	for (i = 0; i < EEPROM_BBP_SIZE; i++) { @@ -4344,8 +4565,6 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)  			rt2800_bbp_write(rt2x00dev, reg_id, value);  		}  	} - -	return 0;  }  static void rt2800_led_open_drain_enable(struct rt2x00_dev *rt2x00dev) @@ -5196,9 +5415,11 @@ int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev)  	}  	msleep(1); -	if (unlikely(rt2800_init_bbp(rt2x00dev))) +	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev) || +		     rt2800_wait_bbp_ready(rt2x00dev)))  		return -EIO; +	rt2800_init_bbp(rt2x00dev);  	rt2800_init_rfcsr(rt2x00dev);  	if (rt2x00_is_usb(rt2x00dev) && @@ -6056,8 +6277,8 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)  		default_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);  		for (i = 14; i < spec->num_channels; i++) { -			info[i].default_power1 = default_power1[i]; -			info[i].default_power2 = default_power2[i]; +			info[i].default_power1 = default_power1[i - 14]; +			info[i].default_power2 = default_power2[i - 14];  		}  	} diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 6f4a861af336..00055627eb8d 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c @@ -637,6 +637,7 @@ static void rt2800pci_write_tx_desc(struct queue_entry *entry,  	struct queue_entry_priv_mmio *entry_priv = entry->priv_data;  	__le32 *txd = entry_priv->desc;  	u32 word; +	const unsigned int txwi_size = entry->queue->winfo_size;  	/*  	 * The buffers pointed by SD_PTR0/SD_LEN0 and SD_PTR1/SD_LEN1 @@ -659,14 +660,14 @@ static void rt2800pci_write_tx_desc(struct queue_entry *entry,  			   !test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));  	rt2x00_set_field32(&word, TXD_W1_BURST,  			   test_bit(ENTRY_TXD_BURST, &txdesc->flags)); -	rt2x00_set_field32(&word, TXD_W1_SD_LEN0, TXWI_DESC_SIZE); +	rt2x00_set_field32(&word, TXD_W1_SD_LEN0, txwi_size);  	rt2x00_set_field32(&word, TXD_W1_LAST_SEC0, 0);  	rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 0);  	rt2x00_desc_write(txd, 1, word);  	word = 0;  	rt2x00_set_field32(&word, TXD_W2_SD_PTR1, -			   skbdesc->skb_dma + TXWI_DESC_SIZE); +			   skbdesc->skb_dma + txwi_size);  	rt2x00_desc_write(txd, 2, word);  	word = 0; @@ -1014,7 +1015,7 @@ static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)  	 * Since we have only one producer and one consumer we don't  	 * need to lock the kfifo.  	 */ -	for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) { +	for (i = 0; i < rt2x00dev->tx->limit; i++) {  		rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status);  		if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) @@ -1186,29 +1187,43 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {  	.sta_remove		= rt2800_sta_remove,  }; -static const struct data_queue_desc rt2800pci_queue_rx = { -	.entry_num		= 128, -	.data_size		= AGGREGATION_SIZE, -	.desc_size		= RXD_DESC_SIZE, -	.winfo_size		= RXWI_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +static void rt2800pci_queue_init(struct data_queue *queue) +{ +	switch (queue->qid) { +	case QID_RX: +		queue->limit = 128; +		queue->data_size = AGGREGATION_SIZE; +		queue->desc_size = RXD_DESC_SIZE; +		queue->winfo_size = RXWI_DESC_SIZE_4WORDS; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; -static const struct data_queue_desc rt2800pci_queue_tx = { -	.entry_num		= 64, -	.data_size		= AGGREGATION_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.winfo_size		= TXWI_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	case QID_AC_VO: +	case QID_AC_VI: +	case QID_AC_BE: +	case QID_AC_BK: +		queue->limit = 64; +		queue->data_size = AGGREGATION_SIZE; +		queue->desc_size = TXD_DESC_SIZE; +		queue->winfo_size = TXWI_DESC_SIZE_4WORDS; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; -static const struct data_queue_desc rt2800pci_queue_bcn = { -	.entry_num		= 8, -	.data_size		= 0, /* No DMA required for beacons */ -	.desc_size		= TXD_DESC_SIZE, -	.winfo_size		= TXWI_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	case QID_BEACON: +		queue->limit = 8; +		queue->data_size = 0; /* No DMA required for beacons */ +		queue->desc_size = TXD_DESC_SIZE; +		queue->winfo_size = TXWI_DESC_SIZE_4WORDS; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; + +	case QID_ATIM: +		/* fallthrough */ +	default: +		BUG(); +		break; +	} +}  static const struct rt2x00_ops rt2800pci_ops = {  	.name			= KBUILD_MODNAME, @@ -1217,10 +1232,7 @@ static const struct rt2x00_ops rt2800pci_ops = {  	.eeprom_size		= EEPROM_SIZE,  	.rf_size		= RF_SIZE,  	.tx_queues		= NUM_TX_QUEUES, -	.extra_tx_headroom	= TXWI_DESC_SIZE, -	.rx			= &rt2800pci_queue_rx, -	.tx			= &rt2800pci_queue_tx, -	.bcn			= &rt2800pci_queue_bcn, +	.queue_init		= rt2800pci_queue_init,  	.lib			= &rt2800pci_rt2x00_ops,  	.drv			= &rt2800pci_rt2800_ops,  	.hw			= &rt2800pci_mac80211_ops, diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index ac854d75bd6c..840833b26bfa 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c @@ -327,7 +327,7 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev)  	 * this limit so reduce the number to prevent errors.  	 */  	rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_LIMIT, -			   ((rt2x00dev->ops->rx->entry_num * DATA_FRAME_SIZE) +			   ((rt2x00dev->rx->limit * DATA_FRAME_SIZE)  			    / 1024) - 3);  	rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_EN, 1);  	rt2x00_set_field32(®, USB_DMA_CFG_TX_BULK_EN, 1); @@ -849,85 +849,63 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {  	.sta_remove		= rt2800_sta_remove,  }; -static const struct data_queue_desc rt2800usb_queue_rx = { -	.entry_num		= 128, -	.data_size		= AGGREGATION_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, -	.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, -	.winfo_size		= TXWI_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +static void rt2800usb_queue_init(struct data_queue *queue) +{ +	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; +	unsigned short txwi_size, rxwi_size; -static const struct rt2x00_ops rt2800usb_ops = { -	.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, -	.rx			= &rt2800usb_queue_rx, -	.tx			= &rt2800usb_queue_tx, -	.bcn			= &rt2800usb_queue_bcn, -	.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 */ -}; +	if (rt2x00_rt(rt2x00dev, RT5592)) { +		txwi_size = TXWI_DESC_SIZE_5WORDS; +		rxwi_size = RXWI_DESC_SIZE_6WORDS; +	} else { +		txwi_size = TXWI_DESC_SIZE_4WORDS; +		rxwi_size = RXWI_DESC_SIZE_4WORDS; +	} -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), -}; +	switch (queue->qid) { +	case QID_RX: +		queue->limit = 128; +		queue->data_size = AGGREGATION_SIZE; +		queue->desc_size = RXINFO_DESC_SIZE; +		queue->winfo_size = rxwi_size; +		queue->priv_size = sizeof(struct queue_entry_priv_usb); +		break; -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), -}; +	case QID_AC_VO: +	case QID_AC_VI: +	case QID_AC_BE: +	case QID_AC_BK: +		queue->limit = 16; +		queue->data_size = AGGREGATION_SIZE; +		queue->desc_size = TXINFO_DESC_SIZE; +		queue->winfo_size = txwi_size; +		queue->priv_size = sizeof(struct queue_entry_priv_usb); +		break; -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), -}; +	case QID_BEACON: +		queue->limit = 8; +		queue->data_size = MGMT_FRAME_SIZE; +		queue->desc_size = TXINFO_DESC_SIZE; +		queue->winfo_size = txwi_size; +		queue->priv_size = sizeof(struct queue_entry_priv_usb); +		break; +	case QID_ATIM: +		/* fallthrough */ +	default: +		BUG(); +		break; +	} +} -static const struct rt2x00_ops rt2800usb_ops_5592 = { +static const struct rt2x00_ops rt2800usb_ops = {  	.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, +	.queue_init		= rt2800usb_queue_init,  	.lib			= &rt2800usb_rt2x00_ops,  	.drv			= &rt2800usb_rt2800_ops,  	.hw			= &rt2800usb_mac80211_ops, @@ -1248,15 +1226,15 @@ static struct usb_device_id rt2800usb_device_table[] = {  #endif  #ifdef CONFIG_RT2800USB_RT55XX  	/* Arcadyan */ -	{ USB_DEVICE(0x043e, 0x7a32), .driver_info = 5592 }, +	{ USB_DEVICE(0x043e, 0x7a32) },  	/* AVM GmbH */ -	{ USB_DEVICE(0x057c, 0x8501), .driver_info = 5592 }, +	{ USB_DEVICE(0x057c, 0x8501) },  	/* D-Link DWA-160-B2 */ -	{ USB_DEVICE(0x2001, 0x3c1a), .driver_info = 5592 }, +	{ USB_DEVICE(0x2001, 0x3c1a) },  	/* Proware */ -	{ USB_DEVICE(0x043e, 0x7a13), .driver_info = 5592 }, +	{ USB_DEVICE(0x043e, 0x7a13) },  	/* Ralink */ -	{ USB_DEVICE(0x148f, 0x5572), .driver_info = 5592 }, +	{ USB_DEVICE(0x148f, 0x5572) },  #endif  #ifdef CONFIG_RT2800USB_UNKNOWN  	/* @@ -1361,9 +1339,6 @@ 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);  } diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 7510723a8c37..ee3fc570b11d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h @@ -648,11 +648,7 @@ struct rt2x00_ops {  	const unsigned int eeprom_size;  	const unsigned int rf_size;  	const unsigned int tx_queues; -	const unsigned int extra_tx_headroom; -	const struct data_queue_desc *rx; -	const struct data_queue_desc *tx; -	const struct data_queue_desc *bcn; -	const struct data_queue_desc *atim; +	void (*queue_init)(struct data_queue *queue);  	const struct rt2x00lib_ops *lib;  	const void *drv;  	const struct ieee80211_ops *hw; @@ -1010,6 +1006,9 @@ struct rt2x00_dev {  	 */  	struct list_head bar_list;  	spinlock_t bar_list_lock; + +	/* Extra TX headroom required for alignment purposes. */ +	unsigned int extra_tx_headroom;  };  struct rt2x00_bar_list_entry { diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 90dc14336980..b16521e6bf4a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -334,7 +334,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,  	/*  	 * Remove the extra tx headroom from the skb.  	 */ -	skb_pull(entry->skb, rt2x00dev->ops->extra_tx_headroom); +	skb_pull(entry->skb, rt2x00dev->extra_tx_headroom);  	/*  	 * Signal that the TX descriptor is no longer in the skb. @@ -1049,7 +1049,7 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)  	 */  	rt2x00dev->hw->extra_tx_headroom =  		max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM, -		      rt2x00dev->ops->extra_tx_headroom); +		      rt2x00dev->extra_tx_headroom);  	/*  	 * Take TX headroom required for alignment into account. @@ -1077,7 +1077,7 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)  		 */  		int kfifo_size =  			roundup_pow_of_two(rt2x00dev->ops->tx_queues * -					   rt2x00dev->ops->tx->entry_num * +					   rt2x00dev->tx->limit *  					   sizeof(u32));  		status = kfifo_alloc(&rt2x00dev->txstatus_fifo, kfifo_size, @@ -1256,6 +1256,17 @@ static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)  	rt2x00dev->hw->wiphy->n_iface_combinations = 1;  } +static unsigned int rt2x00dev_extra_tx_headroom(struct rt2x00_dev *rt2x00dev) +{ +	if (WARN_ON(!rt2x00dev->tx)) +		return 0; + +	if (rt2x00_is_usb(rt2x00dev)) +		return rt2x00dev->tx[0].winfo_size + rt2x00dev->tx[0].desc_size; + +	return rt2x00dev->tx[0].winfo_size; +} +  /*   * driver allocation handlers.   */ @@ -1301,27 +1312,10 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)  		(rt2x00dev->ops->max_ap_intf - 1);  	/* -	 * Determine which operating modes are supported, all modes -	 * which require beaconing, depend on the availability of -	 * beacon entries. -	 */ -	rt2x00dev->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); -	if (rt2x00dev->ops->bcn->entry_num > 0) -		rt2x00dev->hw->wiphy->interface_modes |= -		    BIT(NL80211_IFTYPE_ADHOC) | -		    BIT(NL80211_IFTYPE_AP) | -#ifdef CONFIG_MAC80211_MESH -		    BIT(NL80211_IFTYPE_MESH_POINT) | -#endif -		    BIT(NL80211_IFTYPE_WDS); - -	rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; - -	/*  	 * Initialize work.  	 */  	rt2x00dev->workqueue = -	    alloc_ordered_workqueue(wiphy_name(rt2x00dev->hw->wiphy), 0); +	    alloc_ordered_workqueue("%s", 0, wiphy_name(rt2x00dev->hw->wiphy));  	if (!rt2x00dev->workqueue) {  		retval = -ENOMEM;  		goto exit; @@ -1347,6 +1341,26 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)  	if (retval)  		goto exit; +	/* Cache TX headroom value */ +	rt2x00dev->extra_tx_headroom = rt2x00dev_extra_tx_headroom(rt2x00dev); + +	/* +	 * Determine which operating modes are supported, all modes +	 * which require beaconing, depend on the availability of +	 * beacon entries. +	 */ +	rt2x00dev->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); +	if (rt2x00dev->bcn->limit > 0) +		rt2x00dev->hw->wiphy->interface_modes |= +		    BIT(NL80211_IFTYPE_ADHOC) | +		    BIT(NL80211_IFTYPE_AP) | +#ifdef CONFIG_MAC80211_MESH +		    BIT(NL80211_IFTYPE_MESH_POINT) | +#endif +		    BIT(NL80211_IFTYPE_WDS); + +	rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; +  	/*  	 * Initialize ieee80211 structure.  	 */ diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index dc49e525ae5e..76d95deb274b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c @@ -105,11 +105,13 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)  		goto exit_release_regions;  	} +	pci_enable_msi(pci_dev); +  	hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);  	if (!hw) {  		rt2x00_probe_err("Failed to allocate hardware\n");  		retval = -ENOMEM; -		goto exit_release_regions; +		goto exit_disable_msi;  	}  	pci_set_drvdata(pci_dev, hw); @@ -150,6 +152,9 @@ exit_free_reg:  exit_free_device:  	ieee80211_free_hw(hw); +exit_disable_msi: +	pci_disable_msi(pci_dev); +  exit_release_regions:  	pci_release_regions(pci_dev); @@ -174,6 +179,8 @@ void rt2x00pci_remove(struct pci_dev *pci_dev)  	rt2x00pci_free_reg(rt2x00dev);  	ieee80211_free_hw(hw); +	pci_disable_msi(pci_dev); +  	/*  	 * Free the PCI device data.  	 */ diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 2c12311467a9..6c0a91ff963c 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c @@ -542,8 +542,8 @@ static int rt2x00queue_write_tx_data(struct queue_entry *entry,  	/*  	 * Add the requested extra tx headroom in front of the skb.  	 */ -	skb_push(entry->skb, rt2x00dev->ops->extra_tx_headroom); -	memset(entry->skb->data, 0, rt2x00dev->ops->extra_tx_headroom); +	skb_push(entry->skb, rt2x00dev->extra_tx_headroom); +	memset(entry->skb->data, 0, rt2x00dev->extra_tx_headroom);  	/*  	 * Call the driver's write_tx_data function, if it exists. @@ -596,7 +596,7 @@ 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); +				    rt2x00dev->extra_tx_headroom);  	struct rt2x00_bar_list_entry *bar_entry;  	if (likely(!ieee80211_is_back_req(bar->frame_control))) @@ -1161,8 +1161,7 @@ void rt2x00queue_init_queues(struct rt2x00_dev *rt2x00dev)  	}  } -static int rt2x00queue_alloc_entries(struct data_queue *queue, -				     const struct data_queue_desc *qdesc) +static int rt2x00queue_alloc_entries(struct data_queue *queue)  {  	struct queue_entry *entries;  	unsigned int entry_size; @@ -1170,16 +1169,10 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,  	rt2x00queue_reset(queue); -	queue->limit = qdesc->entry_num; -	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.  	 */ -	entry_size = sizeof(*entries) + qdesc->priv_size; +	entry_size = sizeof(*entries) + queue->priv_size;  	entries = kcalloc(queue->limit, entry_size, GFP_KERNEL);  	if (!entries)  		return -ENOMEM; @@ -1195,7 +1188,7 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,  		entries[i].entry_idx = i;  		entries[i].priv_data =  		    QUEUE_ENTRY_PRIV_OFFSET(entries, i, queue->limit, -					    sizeof(*entries), qdesc->priv_size); +					    sizeof(*entries), queue->priv_size);  	}  #undef QUEUE_ENTRY_PRIV_OFFSET @@ -1237,23 +1230,22 @@ int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev)  	struct data_queue *queue;  	int status; -	status = rt2x00queue_alloc_entries(rt2x00dev->rx, rt2x00dev->ops->rx); +	status = rt2x00queue_alloc_entries(rt2x00dev->rx);  	if (status)  		goto exit;  	tx_queue_for_each(rt2x00dev, queue) { -		status = rt2x00queue_alloc_entries(queue, rt2x00dev->ops->tx); +		status = rt2x00queue_alloc_entries(queue);  		if (status)  			goto exit;  	} -	status = rt2x00queue_alloc_entries(rt2x00dev->bcn, rt2x00dev->ops->bcn); +	status = rt2x00queue_alloc_entries(rt2x00dev->bcn);  	if (status)  		goto exit;  	if (test_bit(REQUIRE_ATIM_QUEUE, &rt2x00dev->cap_flags)) { -		status = rt2x00queue_alloc_entries(rt2x00dev->atim, -						   rt2x00dev->ops->atim); +		status = rt2x00queue_alloc_entries(rt2x00dev->atim);  		if (status)  			goto exit;  	} @@ -1297,6 +1289,10 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,  	queue->aifs = 2;  	queue->cw_min = 5;  	queue->cw_max = 10; + +	rt2x00dev->ops->queue_init(queue); + +	queue->threshold = DIV_ROUND_UP(queue->limit, 10);  }  int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev) diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h index 4a7b34e9261b..ebe117224979 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h @@ -453,6 +453,7 @@ enum data_queue_flags {   * @cw_max: The cw max value for outgoing frames (field ignored in RX queue).   * @data_size: Maximum data size for the frames in this queue.   * @desc_size: Hardware descriptor size for the data in this queue. + * @priv_size: Size of per-queue_entry private data.   * @usb_endpoint: Device endpoint used for communication (USB only)   * @usb_maxpacket: Max packet size for given endpoint (USB only)   */ @@ -481,31 +482,13 @@ struct data_queue {  	unsigned short data_size;  	unsigned char  desc_size;  	unsigned char  winfo_size; +	unsigned short priv_size;  	unsigned short usb_endpoint;  	unsigned short usb_maxpacket;  };  /** - * struct data_queue_desc: Data queue description - * - * The information in this structure is used by drivers - * to inform rt2x00lib about the creation of the data queue. - * - * @entry_num: Maximum number of entries for a queue. - * @data_size: Maximum data size for the frames in this queue. - * @desc_size: Hardware descriptor size for the data in this queue. - * @priv_size: Size of per-queue_entry private data. - */ -struct data_queue_desc { -	unsigned short entry_num; -	unsigned short data_size; -	unsigned char  desc_size; -	unsigned char  winfo_size; -	unsigned short priv_size; -}; - -/**   * queue_end - Return pointer to the last queue (HELPER MACRO).   * @__dev: Pointer to &struct rt2x00_dev   * diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 0dc8180e251b..54d3ddfc9888 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c @@ -2175,7 +2175,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)  	 * that the TX_STA_FIFO stack has a size of 16. We stick to our  	 * tx ring size for now.  	 */ -	for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) { +	for (i = 0; i < rt2x00dev->tx->limit; i++) {  		rt2x00mmio_register_read(rt2x00dev, STA_CSR4, ®);  		if (!rt2x00_get_field32(reg, STA_CSR4_VALID))  			break; @@ -2825,7 +2825,8 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)  		tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);  		for (i = 14; i < spec->num_channels; i++) {  			info[i].max_power = MAX_TXPOWER; -			info[i].default_power1 = TXPOWER_FROM_DEV(tx_power[i]); +			info[i].default_power1 = +					TXPOWER_FROM_DEV(tx_power[i - 14]);  		}  	} @@ -3025,26 +3026,40 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {  	.config			= rt61pci_config,  }; -static const struct data_queue_desc rt61pci_queue_rx = { -	.entry_num		= 32, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= RXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +static void rt61pci_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 rt61pci_queue_tx = { -	.entry_num		= 32, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	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 rt61pci_queue_bcn = { -	.entry_num		= 4, -	.data_size		= 0, /* No DMA required for beacons */ -	.desc_size		= TXINFO_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_mmio), -}; +	case QID_BEACON: +		queue->limit = 4; +		queue->data_size = 0; /* No DMA required for beacons */ +		queue->desc_size = TXINFO_SIZE; +		queue->priv_size = sizeof(struct queue_entry_priv_mmio); +		break; + +	case QID_ATIM: +		/* fallthrough */ +	default: +		BUG(); +		break; +	} +}  static const struct rt2x00_ops rt61pci_ops = {  	.name			= KBUILD_MODNAME, @@ -3052,10 +3067,7 @@ static const struct rt2x00_ops rt61pci_ops = {  	.eeprom_size		= EEPROM_SIZE,  	.rf_size		= RF_SIZE,  	.tx_queues		= NUM_TX_QUEUES, -	.extra_tx_headroom	= 0, -	.rx			= &rt61pci_queue_rx, -	.tx			= &rt61pci_queue_tx, -	.bcn			= &rt61pci_queue_bcn, +	.queue_init		= rt61pci_queue_init,  	.lib			= &rt61pci_rt2x00_ops,  	.hw			= &rt61pci_mac80211_ops,  #ifdef CONFIG_RT2X00_LIB_DEBUGFS diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 377e09bb0b81..1d3880e09a13 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c @@ -2167,7 +2167,8 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)  		tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);  		for (i = 14; i < spec->num_channels; i++) {  			info[i].max_power = MAX_TXPOWER; -			info[i].default_power1 = TXPOWER_FROM_DEV(tx_power[i]); +			info[i].default_power1 = +					TXPOWER_FROM_DEV(tx_power[i - 14]);  		}  	} @@ -2359,26 +2360,40 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {  	.config			= rt73usb_config,  }; -static const struct data_queue_desc rt73usb_queue_rx = { -	.entry_num		= 32, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= RXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +static void rt73usb_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_usb); +		break; -static const struct data_queue_desc rt73usb_queue_tx = { -	.entry_num		= 32, -	.data_size		= DATA_FRAME_SIZE, -	.desc_size		= TXD_DESC_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +	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_usb); +		break; -static const struct data_queue_desc rt73usb_queue_bcn = { -	.entry_num		= 4, -	.data_size		= MGMT_FRAME_SIZE, -	.desc_size		= TXINFO_SIZE, -	.priv_size		= sizeof(struct queue_entry_priv_usb), -}; +	case QID_BEACON: +		queue->limit = 4; +		queue->data_size = MGMT_FRAME_SIZE; +		queue->desc_size = TXINFO_SIZE; +		queue->priv_size = sizeof(struct queue_entry_priv_usb); +		break; + +	case QID_ATIM: +		/* fallthrough */ +	default: +		BUG(); +		break; +	} +}  static const struct rt2x00_ops rt73usb_ops = {  	.name			= KBUILD_MODNAME, @@ -2386,10 +2401,7 @@ static const struct rt2x00_ops rt73usb_ops = {  	.eeprom_size		= EEPROM_SIZE,  	.rf_size		= RF_SIZE,  	.tx_queues		= NUM_TX_QUEUES, -	.extra_tx_headroom	= TXD_DESC_SIZE, -	.rx			= &rt73usb_queue_rx, -	.tx			= &rt73usb_queue_tx, -	.bcn			= &rt73usb_queue_bcn, +	.queue_init		= rt73usb_queue_init,  	.lib			= &rt73usb_rt2x00_ops,  	.hw			= &rt73usb_mac80211_ops,  #ifdef CONFIG_RT2X00_LIB_DEBUGFS |