diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2010-05-22 02:36:56 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-05-22 02:36:56 -0400 |
commit | cf9b59e9d3e008591d1f54830f570982bb307a0d (patch) | |
tree | 113478ce8fd8c832ba726ffdf59b82cb46356476 /drivers/net/wireless/rt2x00/rt73usb.c | |
parent | 44504b2bebf8b5823c59484e73096a7d6574471d (diff) | |
parent | f4b87dee923342505e1ddba8d34ce9de33e75050 (diff) |
Merge remote branch 'origin' into secretlab/next-devicetree
Merging in current state of Linus' tree to deal with merge conflicts and
build failures in vio.c after merge.
Conflicts:
drivers/i2c/busses/i2c-cpm.c
drivers/i2c/busses/i2c-mpc.c
drivers/net/gianfar.c
Also fixed up one line in arch/powerpc/kernel/vio.c to use the
correct node pointer.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 128 |
1 files changed, 58 insertions, 70 deletions
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index bb58d797fb72..e35bd19c3c5a 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -861,15 +861,15 @@ static void rt73usb_config_ps(struct rt2x00_dev *rt2x00dev, | |||
861 | rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, | 861 | rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, |
862 | USB_MODE_SLEEP, REGISTER_TIMEOUT); | 862 | USB_MODE_SLEEP, REGISTER_TIMEOUT); |
863 | } else { | 863 | } else { |
864 | rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, | ||
865 | USB_MODE_WAKEUP, REGISTER_TIMEOUT); | ||
866 | |||
867 | rt2x00usb_register_read(rt2x00dev, MAC_CSR11, ®); | 864 | rt2x00usb_register_read(rt2x00dev, MAC_CSR11, ®); |
868 | rt2x00_set_field32(®, MAC_CSR11_DELAY_AFTER_TBCN, 0); | 865 | rt2x00_set_field32(®, MAC_CSR11_DELAY_AFTER_TBCN, 0); |
869 | rt2x00_set_field32(®, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0); | 866 | rt2x00_set_field32(®, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0); |
870 | rt2x00_set_field32(®, MAC_CSR11_AUTOWAKE, 0); | 867 | rt2x00_set_field32(®, MAC_CSR11_AUTOWAKE, 0); |
871 | rt2x00_set_field32(®, MAC_CSR11_WAKEUP_LATENCY, 0); | 868 | rt2x00_set_field32(®, MAC_CSR11_WAKEUP_LATENCY, 0); |
872 | rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg); | 869 | rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg); |
870 | |||
871 | rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, | ||
872 | USB_MODE_WAKEUP, REGISTER_TIMEOUT); | ||
873 | } | 873 | } |
874 | } | 874 | } |
875 | 875 | ||
@@ -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,51 +1501,24 @@ 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, skb->len); | ||
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 | /* |
1506 | * TX data initialization | 1512 | * TX data initialization |
1507 | */ | 1513 | */ |
1508 | static void rt73usb_write_beacon(struct queue_entry *entry) | 1514 | static void rt73usb_write_beacon(struct queue_entry *entry, |
1515 | struct txentry_desc *txdesc) | ||
1509 | { | 1516 | { |
1510 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 1517 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
1511 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
1512 | unsigned int beacon_base; | 1518 | unsigned int beacon_base; |
1513 | u32 reg; | 1519 | u32 reg; |
1514 | 1520 | ||
1515 | /* | 1521 | /* |
1516 | * Add the descriptor in front of the skb. | ||
1517 | */ | ||
1518 | skb_push(entry->skb, entry->queue->desc_size); | ||
1519 | memcpy(entry->skb->data, skbdesc->desc, skbdesc->desc_len); | ||
1520 | skbdesc->desc = entry->skb->data; | ||
1521 | |||
1522 | /* | ||
1523 | * Disable beaconing while we are reloading the beacon data, | 1522 | * Disable beaconing while we are reloading the beacon data, |
1524 | * otherwise we might be sending out invalid data. | 1523 | * otherwise we might be sending out invalid data. |
1525 | */ | 1524 | */ |
@@ -1528,6 +1527,11 @@ static void rt73usb_write_beacon(struct queue_entry *entry) | |||
1528 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); | 1527 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); |
1529 | 1528 | ||
1530 | /* | 1529 | /* |
1530 | * Take the descriptor in front of the skb into account. | ||
1531 | */ | ||
1532 | skb_push(entry->skb, TXD_DESC_SIZE); | ||
1533 | |||
1534 | /* | ||
1531 | * Write entire beacon with descriptor to register. | 1535 | * Write entire beacon with descriptor to register. |
1532 | */ | 1536 | */ |
1533 | beacon_base = HW_BEACON_OFFSET(entry->entry_idx); | 1537 | beacon_base = HW_BEACON_OFFSET(entry->entry_idx); |
@@ -1537,6 +1541,19 @@ static void rt73usb_write_beacon(struct queue_entry *entry) | |||
1537 | REGISTER_TIMEOUT32(entry->skb->len)); | 1541 | REGISTER_TIMEOUT32(entry->skb->len)); |
1538 | 1542 | ||
1539 | /* | 1543 | /* |
1544 | * Enable beaconing again. | ||
1545 | * | ||
1546 | * For Wi-Fi faily generated beacons between participating stations. | ||
1547 | * Set TBTT phase adaptive adjustment step to 8us (default 16us) | ||
1548 | */ | ||
1549 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR10, 0x00001008); | ||
1550 | |||
1551 | rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1); | ||
1552 | rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 1); | ||
1553 | rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 1); | ||
1554 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); | ||
1555 | |||
1556 | /* | ||
1540 | * Clean up the beacon skb. | 1557 | * Clean up the beacon skb. |
1541 | */ | 1558 | */ |
1542 | dev_kfree_skb(entry->skb); | 1559 | dev_kfree_skb(entry->skb); |
@@ -1557,31 +1574,6 @@ static int rt73usb_get_tx_data_len(struct queue_entry *entry) | |||
1557 | return length; | 1574 | return length; |
1558 | } | 1575 | } |
1559 | 1576 | ||
1560 | static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | ||
1561 | const enum data_queue_qid queue) | ||
1562 | { | ||
1563 | u32 reg; | ||
1564 | |||
1565 | if (queue != QID_BEACON) { | ||
1566 | rt2x00usb_kick_tx_queue(rt2x00dev, queue); | ||
1567 | return; | ||
1568 | } | ||
1569 | |||
1570 | /* | ||
1571 | * For Wi-Fi faily generated beacons between participating stations. | ||
1572 | * Set TBTT phase adaptive adjustment step to 8us (default 16us) | ||
1573 | */ | ||
1574 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR10, 0x00001008); | ||
1575 | |||
1576 | rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, ®); | ||
1577 | if (!rt2x00_get_field32(reg, TXRX_CSR9_BEACON_GEN)) { | ||
1578 | rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1); | ||
1579 | rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 1); | ||
1580 | rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 1); | ||
1581 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); | ||
1582 | } | ||
1583 | } | ||
1584 | |||
1585 | /* | 1577 | /* |
1586 | * RX control handlers | 1578 | * RX control handlers |
1587 | */ | 1579 | */ |
@@ -1645,12 +1637,8 @@ static void rt73usb_fill_rxdone(struct queue_entry *entry, | |||
1645 | if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR)) | 1637 | if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR)) |
1646 | rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC; | 1638 | rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC; |
1647 | 1639 | ||
1648 | if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) { | 1640 | rxdesc->cipher = rt2x00_get_field32(word0, RXD_W0_CIPHER_ALG); |
1649 | rxdesc->cipher = | 1641 | rxdesc->cipher_status = rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR); |
1650 | rt2x00_get_field32(word0, RXD_W0_CIPHER_ALG); | ||
1651 | rxdesc->cipher_status = | ||
1652 | rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR); | ||
1653 | } | ||
1654 | 1642 | ||
1655 | if (rxdesc->cipher != CIPHER_NONE) { | 1643 | if (rxdesc->cipher != CIPHER_NONE) { |
1656 | _rt2x00_desc_read(rxd, 2, &rxdesc->iv[0]); | 1644 | _rt2x00_desc_read(rxd, 2, &rxdesc->iv[0]); |
@@ -2266,7 +2254,7 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { | |||
2266 | .write_tx_data = rt2x00usb_write_tx_data, | 2254 | .write_tx_data = rt2x00usb_write_tx_data, |
2267 | .write_beacon = rt73usb_write_beacon, | 2255 | .write_beacon = rt73usb_write_beacon, |
2268 | .get_tx_data_len = rt73usb_get_tx_data_len, | 2256 | .get_tx_data_len = rt73usb_get_tx_data_len, |
2269 | .kick_tx_queue = rt73usb_kick_tx_queue, | 2257 | .kick_tx_queue = rt2x00usb_kick_tx_queue, |
2270 | .kill_tx_queue = rt2x00usb_kill_tx_queue, | 2258 | .kill_tx_queue = rt2x00usb_kill_tx_queue, |
2271 | .fill_rxdone = rt73usb_fill_rxdone, | 2259 | .fill_rxdone = rt73usb_fill_rxdone, |
2272 | .config_shared_key = rt73usb_config_shared_key, | 2260 | .config_shared_key = rt73usb_config_shared_key, |