~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to drivers/net/wireless/rt2x00/rt73usb.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno
  • Date: 2011-06-07 12:14:05 UTC
  • mfrom: (43.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110607121405-i3h1rd7nrnd2b73h
Tags: 2.6.39-2
[ Ben Hutchings ]
* [x86] Enable BACKLIGHT_APPLE, replacing BACKLIGHT_MBP_NVIDIA
  (Closes: #627492)
* cgroups: Disable memory resource controller by default. Allow it
  to be enabled using kernel parameter 'cgroup_enable=memory'.
* rt2800usb: Enable support for more USB devices including
  Linksys WUSB600N (Closes: #596626) (this change was accidentally
  omitted from 2.6.39-1)
* [x86] Remove Celeron from list of processors supporting PAE. Most
  'Celeron M' models do not.
* Update debconf template translations:
  - Swedish (Martin Bagge) (Closes: #628932)
  - French (David Prévot) (Closes: #628191)
* aufs: Update for 2.6.39 (Closes: #627837)
* Add stable 2.6.39.1, including:
  - ext4: dont set PageUptodate in ext4_end_bio()
  - pata_cmd64x: fix boot crash on parisc (Closes: #622997, #622745)
  - ext3: Fix fs corruption when make_indexed_dir() fails
  - netfilter: nf_ct_sip: validate Content-Length in TCP SIP messages
  - sctp: fix race between sctp_bind_addr_free() and
    sctp_bind_addr_conflict()
  - sctp: fix memory leak of the ASCONF queue when free asoc
  - md/bitmap: fix saving of events_cleared and other state
  - cdc_acm: Fix oops when Droids MuIn LCD is connected
  - cx88: Fix conversion from BKL to fine-grained locks (Closes: #619827)
  - keys: Set cred->user_ns in key_replace_session_keyring (CVE-2011-2184)
  - tmpfs: fix race between truncate and writepage
  - nfs41: Correct offset for LAYOUTCOMMIT
  - xen/mmu: fix a race window causing leave_mm BUG()
  - ext4: fix possible use-after-free in ext4_remove_li_request()
  For the complete list of changes, see:
   http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.39.1
* Bump ABI to 2
* netfilter: Enable IP_SET, IP_SET_BITMAP_IP, IP_SET_BITMAP_IPMAC,
  IP_SET_BITMAP_PORT, IP_SET_HASH_IP, IP_SET_HASH_IPPORT,
  IP_SET_HASH_IPPORTIP, IP_SET_HASH_IPPORTNET, IP_SET_HASH_NET,
  IP_SET_HASH_NETPORT, IP_SET_LIST_SET, NETFILTER_XT_SET as modules
  (Closes: #629401)

[ Aurelien Jarno ]
* [mipsel/loongson-2f] Disable_SCSI_LPFC to workaround GCC ICE.

Show diffs side-by-side

added added

removed removed

Lines of Context:
502
502
                                struct rt2x00intf_conf *conf,
503
503
                                const unsigned int flags)
504
504
{
505
 
        unsigned int beacon_base;
506
505
        u32 reg;
507
506
 
508
507
        if (flags & CONFIG_UPDATE_TYPE) {
509
508
                /*
510
 
                 * Clear current synchronisation setup.
511
 
                 * For the Beacon base registers we only need to clear
512
 
                 * the first byte since that byte contains the VALID and OWNER
513
 
                 * bits which (when set to 0) will invalidate the entire beacon.
514
 
                 */
515
 
                beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx);
516
 
                rt2x00usb_register_write(rt2x00dev, beacon_base, 0);
517
 
 
518
 
                /*
519
509
                 * Enable synchronisation.
520
510
                 */
521
511
                rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, &reg);
522
 
                rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 1);
523
512
                rt2x00_set_field32(&reg, TXRX_CSR9_TSF_SYNC, conf->sync);
524
 
                rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 1);
525
513
                rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
526
514
        }
527
515
 
1440
1428
                rt73usb_disable_radio(rt2x00dev);
1441
1429
                break;
1442
1430
        case STATE_RADIO_IRQ_ON:
1443
 
        case STATE_RADIO_IRQ_ON_ISR:
1444
1431
        case STATE_RADIO_IRQ_OFF:
1445
 
        case STATE_RADIO_IRQ_OFF_ISR:
1446
1432
                /* No support, but no error either */
1447
1433
                break;
1448
1434
        case STATE_DEEP_SLEEP:
1488
1474
                           test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
1489
1475
        rt2x00_set_field32(&word, TXD_W0_OFDM,
1490
1476
                           (txdesc->rate_mode == RATE_MODE_OFDM));
1491
 
        rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
 
1477
        rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->u.plcp.ifs);
1492
1478
        rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
1493
1479
                           test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));
1494
1480
        rt2x00_set_field32(&word, TXD_W0_TKIP_MIC,
1513
1499
        rt2x00_desc_write(txd, 1, word);
1514
1500
 
1515
1501
        rt2x00_desc_read(txd, 2, &word);
1516
 
        rt2x00_set_field32(&word, TXD_W2_PLCP_SIGNAL, txdesc->signal);
1517
 
        rt2x00_set_field32(&word, TXD_W2_PLCP_SERVICE, txdesc->service);
1518
 
        rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_LOW, txdesc->length_low);
1519
 
        rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH, txdesc->length_high);
 
1502
        rt2x00_set_field32(&word, TXD_W2_PLCP_SIGNAL, txdesc->u.plcp.signal);
 
1503
        rt2x00_set_field32(&word, TXD_W2_PLCP_SERVICE, txdesc->u.plcp.service);
 
1504
        rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_LOW,
 
1505
                           txdesc->u.plcp.length_low);
 
1506
        rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH,
 
1507
                           txdesc->u.plcp.length_high);
1520
1508
        rt2x00_desc_write(txd, 2, word);
1521
1509
 
1522
1510
        if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags)) {
1547
1535
        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1548
1536
        unsigned int beacon_base;
1549
1537
        unsigned int padding_len;
1550
 
        u32 reg;
 
1538
        u32 orig_reg, reg;
1551
1539
 
1552
1540
        /*
1553
1541
         * Disable beaconing while we are reloading the beacon data,
1554
1542
         * otherwise we might be sending out invalid data.
1555
1543
         */
1556
1544
        rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, &reg);
 
1545
        orig_reg = reg;
1557
1546
        rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
1558
1547
        rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
1559
1548
 
1577
1566
         * Write entire beacon with descriptor and padding to register.
1578
1567
         */
1579
1568
        padding_len = roundup(entry->skb->len, 4) - entry->skb->len;
1580
 
        skb_pad(entry->skb, padding_len);
 
1569
        if (padding_len && skb_pad(entry->skb, padding_len)) {
 
1570
                ERROR(rt2x00dev, "Failure padding beacon, aborting\n");
 
1571
                /* skb freed by skb_pad() on failure */
 
1572
                entry->skb = NULL;
 
1573
                rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, orig_reg);
 
1574
                return;
 
1575
        }
 
1576
 
1581
1577
        beacon_base = HW_BEACON_OFFSET(entry->entry_idx);
1582
1578
        rt2x00usb_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
1583
1579
                                      entry->skb->len + padding_len);
1590
1586
         */
1591
1587
        rt2x00usb_register_write(rt2x00dev, TXRX_CSR10, 0x00001008);
1592
1588
 
1593
 
        rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 1);
1594
 
        rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 1);
1595
1589
        rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 1);
1596
1590
        rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
1597
1591
 
1602
1596
        entry->skb = NULL;
1603
1597
}
1604
1598
 
 
1599
static void rt73usb_clear_beacon(struct queue_entry *entry)
 
1600
{
 
1601
        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
 
1602
        unsigned int beacon_base;
 
1603
        u32 reg;
 
1604
 
 
1605
        /*
 
1606
         * Disable beaconing while we are reloading the beacon data,
 
1607
         * otherwise we might be sending out invalid data.
 
1608
         */
 
1609
        rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, &reg);
 
1610
        rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
 
1611
        rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
 
1612
 
 
1613
        /*
 
1614
         * Clear beacon.
 
1615
         */
 
1616
        beacon_base = HW_BEACON_OFFSET(entry->entry_idx);
 
1617
        rt2x00usb_register_write(rt2x00dev, beacon_base, 0);
 
1618
 
 
1619
        /*
 
1620
         * Enable beaconing again.
 
1621
         */
 
1622
        rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 1);
 
1623
        rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
 
1624
}
 
1625
 
1605
1626
static int rt73usb_get_tx_data_len(struct queue_entry *entry)
1606
1627
{
1607
1628
        int length;
1698
1719
                rxdesc->flags |= RX_FLAG_IV_STRIPPED;
1699
1720
 
1700
1721
                /*
1701
 
                 * FIXME: Legacy driver indicates that the frame does
1702
 
                 * contain the Michael Mic. Unfortunately, in rt2x00
1703
 
                 * the MIC seems to be missing completely...
 
1722
                 * The hardware has already checked the Michael Mic and has
 
1723
                 * stripped it from the frame. Signal this to mac80211.
1704
1724
                 */
1705
1725
                rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
1706
1726
 
2229
2249
        if (queue_idx >= 4)
2230
2250
                return 0;
2231
2251
 
2232
 
        queue = rt2x00queue_get_queue(rt2x00dev, queue_idx);
 
2252
        queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
2233
2253
 
2234
2254
        /* Update WMM TXOP register */
2235
2255
        offset = AC_TXOP_CSR0 + (sizeof(u32) * (!!(queue_idx & 2)));
2313
2333
        .flush_queue            = rt2x00usb_flush_queue,
2314
2334
        .write_tx_desc          = rt73usb_write_tx_desc,
2315
2335
        .write_beacon           = rt73usb_write_beacon,
 
2336
        .clear_beacon           = rt73usb_clear_beacon,
2316
2337
        .get_tx_data_len        = rt73usb_get_tx_data_len,
2317
2338
        .fill_rxdone            = rt73usb_fill_rxdone,
2318
2339
        .config_shared_key      = rt73usb_config_shared_key,