diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 8ca19f70aea7..87fb2201537b 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -1426,12 +1426,11 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1426 | /* | 1426 | /* |
1427 | * TX descriptor initialization | 1427 | * TX descriptor initialization |
1428 | */ | 1428 | */ |
1429 | static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | 1429 | static void rt73usb_write_tx_desc(struct queue_entry *entry, |
1430 | struct sk_buff *skb, | ||
1431 | struct txentry_desc *txdesc) | 1430 | struct txentry_desc *txdesc) |
1432 | { | 1431 | { |
1433 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 1432 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); |
1434 | __le32 *txd = (__le32 *) skb->data; | 1433 | __le32 *txd = (__le32 *) entry->skb->data; |
1435 | u32 word; | 1434 | u32 word; |
1436 | 1435 | ||
1437 | /* | 1436 | /* |
@@ -1464,7 +1463,7 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1464 | rt2x00_desc_write(txd, 0, word); | 1463 | rt2x00_desc_write(txd, 0, word); |
1465 | 1464 | ||
1466 | rt2x00_desc_read(txd, 1, &word); | 1465 | rt2x00_desc_read(txd, 1, &word); |
1467 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->queue); | 1466 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->qid); |
1468 | rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs); | 1467 | rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs); |
1469 | rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min); | 1468 | rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min); |
1470 | rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max); | 1469 | rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max); |
@@ -1487,7 +1486,7 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1487 | 1486 | ||
1488 | rt2x00_desc_read(txd, 5, &word); | 1487 | rt2x00_desc_read(txd, 5, &word); |
1489 | rt2x00_set_field32(&word, TXD_W5_TX_POWER, | 1488 | rt2x00_set_field32(&word, TXD_W5_TX_POWER, |
1490 | TXPOWER_TO_DEV(rt2x00dev->tx_power)); | 1489 | TXPOWER_TO_DEV(entry->queue->rt2x00dev->tx_power)); |
1491 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); | 1490 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); |
1492 | rt2x00_desc_write(txd, 5, word); | 1491 | rt2x00_desc_write(txd, 5, word); |
1493 | 1492 | ||
@@ -1526,7 +1525,7 @@ static void rt73usb_write_beacon(struct queue_entry *entry, | |||
1526 | /* | 1525 | /* |
1527 | * Write the TX descriptor for the beacon. | 1526 | * Write the TX descriptor for the beacon. |
1528 | */ | 1527 | */ |
1529 | rt73usb_write_tx_desc(rt2x00dev, entry->skb, txdesc); | 1528 | rt73usb_write_tx_desc(entry, txdesc); |
1530 | 1529 | ||
1531 | /* | 1530 | /* |
1532 | * Dump beacon to userspace through debugfs. | 1531 | * Dump beacon to userspace through debugfs. |
@@ -1574,6 +1573,14 @@ static int rt73usb_get_tx_data_len(struct queue_entry *entry) | |||
1574 | return length; | 1573 | return length; |
1575 | } | 1574 | } |
1576 | 1575 | ||
1576 | static void rt73usb_kill_tx_queue(struct data_queue *queue) | ||
1577 | { | ||
1578 | if (queue->qid == QID_BEACON) | ||
1579 | rt2x00usb_register_write(queue->rt2x00dev, TXRX_CSR9, 0); | ||
1580 | |||
1581 | rt2x00usb_kill_tx_queue(queue); | ||
1582 | } | ||
1583 | |||
1577 | /* | 1584 | /* |
1578 | * RX control handlers | 1585 | * RX control handlers |
1579 | */ | 1586 | */ |
@@ -2091,13 +2098,17 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
2091 | spec->channels_info = info; | 2098 | spec->channels_info = info; |
2092 | 2099 | ||
2093 | tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_G_START); | 2100 | tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_G_START); |
2094 | for (i = 0; i < 14; i++) | 2101 | for (i = 0; i < 14; i++) { |
2095 | info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]); | 2102 | info[i].max_power = MAX_TXPOWER; |
2103 | info[i].default_power1 = TXPOWER_FROM_DEV(tx_power[i]); | ||
2104 | } | ||
2096 | 2105 | ||
2097 | if (spec->num_channels > 14) { | 2106 | if (spec->num_channels > 14) { |
2098 | tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START); | 2107 | tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START); |
2099 | for (i = 14; i < spec->num_channels; i++) | 2108 | for (i = 14; i < spec->num_channels; i++) { |
2100 | info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]); | 2109 | info[i].max_power = MAX_TXPOWER; |
2110 | info[i].default_power1 = TXPOWER_FROM_DEV(tx_power[i]); | ||
2111 | } | ||
2101 | } | 2112 | } |
2102 | 2113 | ||
2103 | return 0; | 2114 | return 0; |
@@ -2259,7 +2270,7 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { | |||
2259 | .write_beacon = rt73usb_write_beacon, | 2270 | .write_beacon = rt73usb_write_beacon, |
2260 | .get_tx_data_len = rt73usb_get_tx_data_len, | 2271 | .get_tx_data_len = rt73usb_get_tx_data_len, |
2261 | .kick_tx_queue = rt2x00usb_kick_tx_queue, | 2272 | .kick_tx_queue = rt2x00usb_kick_tx_queue, |
2262 | .kill_tx_queue = rt2x00usb_kill_tx_queue, | 2273 | .kill_tx_queue = rt73usb_kill_tx_queue, |
2263 | .fill_rxdone = rt73usb_fill_rxdone, | 2274 | .fill_rxdone = rt73usb_fill_rxdone, |
2264 | .config_shared_key = rt73usb_config_shared_key, | 2275 | .config_shared_key = rt73usb_config_shared_key, |
2265 | .config_pairwise_key = rt73usb_config_pairwise_key, | 2276 | .config_pairwise_key = rt73usb_config_pairwise_key, |