rt2x00: Fix rt2400pci signal
[safe/jmp/linux-2.6] / drivers / net / wireless / rt2x00 / rt2500usb.c
index b9e2f3a..c8216d7 100644 (file)
@@ -343,7 +343,9 @@ static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev,
                rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
 
                rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
+               rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
                rt2x00_set_field16(&reg, TXRX_CSR19_TSF_SYNC, conf->sync);
+               rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
                rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
        }
 
@@ -356,10 +358,8 @@ static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev,
                                              (3 * sizeof(__le16)));
 }
 
-static int rt2500usb_config_preamble(struct rt2x00_dev *rt2x00dev,
-                                    const int short_preamble,
-                                    const int ack_timeout,
-                                    const int ack_consume_time)
+static int rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev,
+                               struct rt2x00lib_erp *erp)
 {
        u16 reg;
 
@@ -371,12 +371,12 @@ static int rt2500usb_config_preamble(struct rt2x00_dev *rt2x00dev,
                return -EAGAIN;
 
        rt2500usb_register_read(rt2x00dev, TXRX_CSR1, &reg);
-       rt2x00_set_field16(&reg, TXRX_CSR1_ACK_TIMEOUT, ack_timeout);
+       rt2x00_set_field16(&reg, TXRX_CSR1_ACK_TIMEOUT, erp->ack_timeout);
        rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg);
 
        rt2500usb_register_read(rt2x00dev, TXRX_CSR10, &reg);
        rt2x00_set_field16(&reg, TXRX_CSR10_AUTORESPOND_PREAMBLE,
-                          !!short_preamble);
+                          !!erp->short_preamble);
        rt2500usb_register_write(rt2x00dev, TXRX_CSR10, reg);
 
        return 0;
@@ -437,6 +437,13 @@ static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev,
        u16 csr5;
        u16 csr6;
 
+       /*
+        * We should never come here because rt2x00lib is supposed
+        * to catch this and send us the correct antenna explicitely.
+        */
+       BUG_ON(ant->rx == ANTENNA_SW_DIVERSITY ||
+              ant->tx == ANTENNA_SW_DIVERSITY);
+
        rt2500usb_bbp_read(rt2x00dev, 2, &r2);
        rt2500usb_bbp_read(rt2x00dev, 14, &r14);
        rt2500usb_register_read(rt2x00dev, PHY_CSR5, &csr5);
@@ -456,14 +463,8 @@ static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev,
                rt2x00_set_field16(&csr5, PHY_CSR5_CCK, 0);
                rt2x00_set_field16(&csr6, PHY_CSR6_OFDM, 0);
                break;
-       case ANTENNA_SW_DIVERSITY:
-               /*
-                * NOTE: We should never come here because rt2x00lib is
-                * supposed to catch this and send us the correct antenna
-                * explicitely. However we are nog going to bug about this.
-                * Instead, just default to antenna B.
-                */
        case ANTENNA_B:
+       default:
                rt2x00_set_field8(&r2, BBP_R2_TX_ANTENNA, 2);
                rt2x00_set_field16(&csr5, PHY_CSR5_CCK, 2);
                rt2x00_set_field16(&csr6, PHY_CSR6_OFDM, 2);
@@ -480,14 +481,8 @@ static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev,
        case ANTENNA_A:
                rt2x00_set_field8(&r14, BBP_R14_RX_ANTENNA, 0);
                break;
-       case ANTENNA_SW_DIVERSITY:
-               /*
-                * NOTE: We should never come here because rt2x00lib is
-                * supposed to catch this and send us the correct antenna
-                * explicitely. However we are nog going to bug about this.
-                * Instead, just default to antenna B.
-                */
        case ANTENNA_B:
+       default:
                rt2x00_set_field8(&r14, BBP_R14_RX_ANTENNA, 2);
                break;
        }
@@ -1140,11 +1135,15 @@ static void rt2500usb_fill_rxdone(struct queue_entry *entry,
 
        /*
         * Obtain the status about this packet.
+        * When frame was received with an OFDM bitrate,
+        * the signal is the PLCP value. If it was received with
+        * a CCK bitrate the signal is the rate in 100kbit/s.
         */
+       rxdesc->ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
        rxdesc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
+       rxdesc->signal_plcp = rxdesc->ofdm;
        rxdesc->rssi = rt2x00_get_field32(word1, RXD_W1_RSSI) -
            entry->queue->rt2x00dev->rssi_offset;
-       rxdesc->ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
        rxdesc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
        rxdesc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS);
 
@@ -1847,7 +1846,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
        .kick_tx_queue          = rt2500usb_kick_tx_queue,
        .fill_rxdone            = rt2500usb_fill_rxdone,
        .config_intf            = rt2500usb_config_intf,
-       .config_preamble        = rt2500usb_config_preamble,
+       .config_erp             = rt2500usb_config_erp,
        .config                 = rt2500usb_config,
 };