diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 11c130748206..e35bd19c3c5a 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -1441,12 +1441,38 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1441 | struct txentry_desc *txdesc) | 1441 | struct txentry_desc *txdesc) |
1442 | { | 1442 | { |
1443 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 1443 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); |
1444 | __le32 *txd = skbdesc->desc; | 1444 | __le32 *txd = (__le32 *)(skb->data - TXD_DESC_SIZE); |
1445 | u32 word; | 1445 | u32 word; |
1446 | 1446 | ||
1447 | /* | 1447 | /* |
1448 | * Start writing the descriptor words. | 1448 | * Start writing the descriptor words. |
1449 | */ | 1449 | */ |
1450 | rt2x00_desc_read(txd, 0, &word); | ||
1451 | rt2x00_set_field32(&word, TXD_W0_BURST, | ||
1452 | test_bit(ENTRY_TXD_BURST, &txdesc->flags)); | ||
1453 | rt2x00_set_field32(&word, TXD_W0_VALID, 1); | ||
1454 | rt2x00_set_field32(&word, TXD_W0_MORE_FRAG, | ||
1455 | test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags)); | ||
1456 | rt2x00_set_field32(&word, TXD_W0_ACK, | ||
1457 | test_bit(ENTRY_TXD_ACK, &txdesc->flags)); | ||
1458 | rt2x00_set_field32(&word, TXD_W0_TIMESTAMP, | ||
1459 | test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags)); | ||
1460 | rt2x00_set_field32(&word, TXD_W0_OFDM, | ||
1461 | (txdesc->rate_mode == RATE_MODE_OFDM)); | ||
1462 | rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); | ||
1463 | rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, | ||
1464 | test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags)); | ||
1465 | rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, | ||
1466 | test_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags)); | ||
1467 | rt2x00_set_field32(&word, TXD_W0_KEY_TABLE, | ||
1468 | test_bit(ENTRY_TXD_ENCRYPT_PAIRWISE, &txdesc->flags)); | ||
1469 | rt2x00_set_field32(&word, TXD_W0_KEY_INDEX, txdesc->key_idx); | ||
1470 | rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length); | ||
1471 | rt2x00_set_field32(&word, TXD_W0_BURST2, | ||
1472 | test_bit(ENTRY_TXD_BURST, &txdesc->flags)); | ||
1473 | rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher); | ||
1474 | rt2x00_desc_write(txd, 0, word); | ||
1475 | |||
1450 | rt2x00_desc_read(txd, 1, &word); | 1476 | rt2x00_desc_read(txd, 1, &word); |
1451 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->queue); | 1477 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->queue); |
1452 | rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs); | 1478 | rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs); |
@@ -1475,31 +1501,11 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1475 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); | 1501 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); |
1476 | rt2x00_desc_write(txd, 5, word); | 1502 | rt2x00_desc_write(txd, 5, word); |
1477 | 1503 | ||
1478 | rt2x00_desc_read(txd, 0, &word); | 1504 | /* |
1479 | rt2x00_set_field32(&word, TXD_W0_BURST, | 1505 | * Register descriptor details in skb frame descriptor. |
1480 | test_bit(ENTRY_TXD_BURST, &txdesc->flags)); | 1506 | */ |
1481 | rt2x00_set_field32(&word, TXD_W0_VALID, 1); | 1507 | skbdesc->desc = txd; |
1482 | rt2x00_set_field32(&word, TXD_W0_MORE_FRAG, | 1508 | skbdesc->desc_len = TXD_DESC_SIZE; |
1483 | test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags)); | ||
1484 | rt2x00_set_field32(&word, TXD_W0_ACK, | ||
1485 | test_bit(ENTRY_TXD_ACK, &txdesc->flags)); | ||
1486 | rt2x00_set_field32(&word, TXD_W0_TIMESTAMP, | ||
1487 | test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags)); | ||
1488 | rt2x00_set_field32(&word, TXD_W0_OFDM, | ||
1489 | (txdesc->rate_mode == RATE_MODE_OFDM)); | ||
1490 | rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); | ||
1491 | rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, | ||
1492 | test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags)); | ||
1493 | rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, | ||
1494 | test_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags)); | ||
1495 | rt2x00_set_field32(&word, TXD_W0_KEY_TABLE, | ||
1496 | test_bit(ENTRY_TXD_ENCRYPT_PAIRWISE, &txdesc->flags)); | ||
1497 | rt2x00_set_field32(&word, TXD_W0_KEY_INDEX, txdesc->key_idx); | ||
1498 | rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length); | ||
1499 | rt2x00_set_field32(&word, TXD_W0_BURST2, | ||
1500 | test_bit(ENTRY_TXD_BURST, &txdesc->flags)); | ||
1501 | rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher); | ||
1502 | rt2x00_desc_write(txd, 0, word); | ||
1503 | } | 1509 | } |
1504 | 1510 | ||
1505 | /* | 1511 | /* |
@@ -1509,18 +1515,10 @@ static void rt73usb_write_beacon(struct queue_entry *entry, | |||
1509 | struct txentry_desc *txdesc) | 1515 | struct txentry_desc *txdesc) |
1510 | { | 1516 | { |
1511 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 1517 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
1512 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
1513 | unsigned int beacon_base; | 1518 | unsigned int beacon_base; |
1514 | u32 reg; | 1519 | u32 reg; |
1515 | 1520 | ||
1516 | /* | 1521 | /* |
1517 | * Add the descriptor in front of the skb. | ||
1518 | */ | ||
1519 | skb_push(entry->skb, entry->queue->desc_size); | ||
1520 | memcpy(entry->skb->data, skbdesc->desc, skbdesc->desc_len); | ||
1521 | skbdesc->desc = entry->skb->data; | ||
1522 | |||
1523 | /* | ||
1524 | * Disable beaconing while we are reloading the beacon data, | 1522 | * Disable beaconing while we are reloading the beacon data, |
1525 | * otherwise we might be sending out invalid data. | 1523 | * otherwise we might be sending out invalid data. |
1526 | */ | 1524 | */ |
@@ -1529,6 +1527,11 @@ static void rt73usb_write_beacon(struct queue_entry *entry, | |||
1529 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); | 1527 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); |
1530 | 1528 | ||
1531 | /* | 1529 | /* |
1530 | * Take the descriptor in front of the skb into account. | ||
1531 | */ | ||
1532 | skb_push(entry->skb, TXD_DESC_SIZE); | ||
1533 | |||
1534 | /* | ||
1532 | * Write entire beacon with descriptor to register. | 1535 | * Write entire beacon with descriptor to register. |
1533 | */ | 1536 | */ |
1534 | beacon_base = HW_BEACON_OFFSET(entry->entry_idx); | 1537 | beacon_base = HW_BEACON_OFFSET(entry->entry_idx); |