Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / drivers / net / wireless / rtlwifi / rtl8192ce / trx.c
index bf5852f..aa2b581 100644 (file)
@@ -36,7 +36,7 @@
 #include "trx.h"
 #include "led.h"
 
-static enum rtl_desc_qsel _rtl92ce_map_hwqueue_to_fwqueue(u16 fc,
+static enum rtl_desc_qsel _rtl92ce_map_hwqueue_to_fwqueue(__le16 fc,
                                                          unsigned int
                                                          skb_queue)
 {
@@ -245,24 +245,24 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
                                       struct rtl_stats *pstats,
                                       struct rx_desc_92c *pdesc,
                                       struct rx_fwinfo_92c *p_drvinfo,
-                                      bool bpacket_match_bssid,
-                                      bool bpacket_toself,
-                                      bool b_packet_beacon)
+                                      bool packet_match_bssid,
+                                      bool packet_toself,
+                                      bool packet_beacon)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct phy_sts_cck_8192s_t *cck_buf;
        s8 rx_pwr_all, rx_pwr[4];
-       u8 rf_rx_num, evm, pwdb_all;
+       u8 evm, pwdb_all, rf_rx_num = 0;
        u8 i, max_spatial_stream;
-       u32 rssi, total_rssi;
+       u32 rssi, total_rssi = 0;
        bool is_cck_rate;
 
        is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc);
-       pstats->b_packet_matchbssid = bpacket_match_bssid;
-       pstats->b_packet_toself = bpacket_toself;
-       pstats->b_is_cck = is_cck_rate;
-       pstats->b_packet_beacon = b_packet_beacon;
-       pstats->b_is_cck = is_cck_rate;
+       pstats->packet_matchbssid = packet_match_bssid;
+       pstats->packet_toself = packet_toself;
+       pstats->is_cck = is_cck_rate;
+       pstats->packet_beacon = packet_beacon;
+       pstats->is_cck = is_cck_rate;
        pstats->rx_mimo_signalquality[0] = -1;
        pstats->rx_mimo_signalquality[1] = -1;
 
@@ -315,7 +315,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
                pstats->rx_pwdb_all = pwdb_all;
                pstats->recvsignalpower = rx_pwr_all;
 
-               if (bpacket_match_bssid) {
+               if (packet_match_bssid) {
                        u8 sq;
                        if (pstats->rx_pwdb_all > 40)
                                sq = 100;
@@ -334,10 +334,10 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
                        pstats->rx_mimo_signalquality[1] = -1;
                }
        } else {
-               rtlpriv->dm.brfpath_rxenable[0] =
-                   rtlpriv->dm.brfpath_rxenable[1] = true;
+               rtlpriv->dm.rfpath_rxenable[0] =
+                   rtlpriv->dm.rfpath_rxenable[1] = true;
                for (i = RF90_PATH_A; i < RF90_PATH_MAX; i++) {
-                       if (rtlpriv->dm.brfpath_rxenable[i])
+                       if (rtlpriv->dm.rfpath_rxenable[i])
                                rf_rx_num++;
 
                        rx_pwr[i] =
@@ -347,7 +347,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
                        rtlpriv->stats.rx_snr_db[i] =
                            (long)(p_drvinfo->rxsnr[i] / 2);
 
-                       if (bpacket_match_bssid)
+                       if (packet_match_bssid)
                                pstats->rx_mimo_signalstrength[i] = (u8) rssi;
                }
 
@@ -366,7 +366,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
                for (i = 0; i < max_spatial_stream; i++) {
                        evm = _rtl92c_evm_db_to_percentage(p_drvinfo->rxevm[i]);
 
-                       if (bpacket_match_bssid) {
+                       if (packet_match_bssid) {
                                if (i == 0)
                                        pstats->signalquality =
                                            (u8) (evm & 0xff);
@@ -393,7 +393,7 @@ static void _rtl92ce_process_ui_rssi(struct ieee80211_hw *hw,
        u8 rfpath;
        u32 last_rssi, tmpval;
 
-       if (pstats->b_packet_toself || pstats->b_packet_beacon) {
+       if (pstats->packet_toself || pstats->packet_beacon) {
                rtlpriv->stats.rssi_calculate_cnt++;
 
                if (rtlpriv->stats.ui_rssi.total_num++ >=
@@ -421,7 +421,7 @@ static void _rtl92ce_process_ui_rssi(struct ieee80211_hw *hw,
                pstats->rssi = rtlpriv->stats.signal_strength;
        }
 
-       if (!pstats->b_is_cck && pstats->b_packet_toself) {
+       if (!pstats->is_cck && pstats->packet_toself) {
                for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
                     rfpath++) {
 
@@ -463,7 +463,7 @@ static void _rtl92ce_update_rxsignalstatistics(struct ieee80211_hw *hw,
                                               struct rtl_stats *pstats)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
-       int weighting;
+       int weighting = 0;
 
        if (rtlpriv->stats.recv_signal_power == 0)
                rtlpriv->stats.recv_signal_power = pstats->recvsignalpower;
@@ -493,7 +493,7 @@ static void _rtl92ce_process_pwdb(struct ieee80211_hw *hw,
                    rtlpriv->dm.undecorated_smoothed_pwdb;
        }
 
-       if (pstats->b_packet_toself || pstats->b_packet_beacon) {
+       if (pstats->packet_toself || pstats->packet_beacon) {
                if (undecorated_smoothed_pwdb < 0)
                        undecorated_smoothed_pwdb = pstats->rx_pwdb_all;
 
@@ -525,7 +525,7 @@ static void _rtl92ce_process_ui_link_quality(struct ieee80211_hw *hw,
        u32 last_evm, n_spatialstream, tmpval;
 
        if (pstats->signalquality != 0) {
-               if (pstats->b_packet_toself || pstats->b_packet_beacon) {
+               if (pstats->packet_toself || pstats->packet_beacon) {
 
                        if (rtlpriv->stats.ui_link_quality.total_num++ >=
                            PHY_LINKQUALITY_SLID_WIN_MAX) {
@@ -595,8 +595,8 @@ static void _rtl92ce_process_phyinfo(struct ieee80211_hw *hw,
                                     struct rtl_stats *pcurrent_stats)
 {
 
-       if (!pcurrent_stats->b_packet_matchbssid &&
-           !pcurrent_stats->b_packet_beacon)
+       if (!pcurrent_stats->packet_matchbssid &&
+           !pcurrent_stats->packet_beacon)
                return;
 
        _rtl92ce_process_ui_rssi(hw, pcurrent_stats);
@@ -617,34 +617,36 @@ static void _rtl92ce_translate_rx_signal_stuff(struct ieee80211_hw *hw,
        u8 *tmp_buf;
        u8 *praddr;
        u8 *psaddr;
-       u16 fc, type;
-       bool b_packet_matchbssid, b_packet_toself, b_packet_beacon;
+       __le16 fc;
+       u16 type, c_fc;
+       bool packet_matchbssid, packet_toself, packet_beacon;
 
        tmp_buf = skb->data + pstats->rx_drvinfo_size + pstats->rx_bufshift;
 
        hdr = (struct ieee80211_hdr *)tmp_buf;
-       fc = le16_to_cpu(hdr->frame_control);
+       fc = hdr->frame_control;
+       c_fc = le16_to_cpu(fc);
        type = WLAN_FC_GET_TYPE(fc);
        praddr = hdr->addr1;
        psaddr = hdr->addr2;
 
-       b_packet_matchbssid =
+       packet_matchbssid =
            ((IEEE80211_FTYPE_CTL != type) &&
             (!compare_ether_addr(mac->bssid,
-                                 (fc & IEEE80211_FCTL_TODS) ?
-                                 hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ?
+                                 (c_fc & IEEE80211_FCTL_TODS) ?
+                                 hdr->addr1 : (c_fc & IEEE80211_FCTL_FROMDS) ?
                                  hdr->addr2 : hdr->addr3)) &&
-            (!pstats->b_hwerror) && (!pstats->b_crc) && (!pstats->b_icv));
+            (!pstats->hwerror) && (!pstats->crc) && (!pstats->icv));
 
-       b_packet_toself = b_packet_matchbssid &&
+       packet_toself = packet_matchbssid &&
            (!compare_ether_addr(praddr, rtlefuse->dev_addr));
 
        if (ieee80211_is_beacon(fc))
-               b_packet_beacon = true;
+               packet_beacon = true;
 
        _rtl92ce_query_rxphystatus(hw, pstats, pdesc, p_drvinfo,
-                                  b_packet_matchbssid, b_packet_toself,
-                                  b_packet_beacon);
+                                  packet_matchbssid, packet_toself,
+                                  packet_beacon);
 
        _rtl92ce_process_phyinfo(hw, tmp_buf, pstats);
 }
@@ -662,14 +664,14 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
        stats->rx_drvinfo_size = (u8) GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
            RX_DRV_INFO_SIZE_UNIT;
        stats->rx_bufshift = (u8) (GET_RX_DESC_SHIFT(pdesc) & 0x03);
-       stats->b_icv = (u16) GET_RX_DESC_ICV(pdesc);
-       stats->b_crc = (u16) GET_RX_DESC_CRC32(pdesc);
-       stats->b_hwerror = (stats->b_crc | stats->b_icv);
+       stats->icv = (u16) GET_RX_DESC_ICV(pdesc);
+       stats->crc = (u16) GET_RX_DESC_CRC32(pdesc);
+       stats->hwerror = (stats->crc | stats->icv);
        stats->decrypted = !GET_RX_DESC_SWDEC(pdesc);
        stats->rate = (u8) GET_RX_DESC_RXMCS(pdesc);
-       stats->b_shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc);
-       stats->b_isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1);
-       stats->b_isampdu = (bool) ((GET_RX_DESC_PAGGR(pdesc) == 1)
+       stats->shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc);
+       stats->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1);
+       stats->isampdu = (bool) ((GET_RX_DESC_PAGGR(pdesc) == 1)
                                   && (GET_RX_DESC_FAGGR(pdesc) == 1));
        stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
        stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
@@ -689,7 +691,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
        if (GET_RX_DESC_RXHT(pdesc))
                rx_status->flag |= RX_FLAG_HT;
 
-       rx_status->flag |= RX_FLAG_TSFT;
+       rx_status->flag |= RX_FLAG_MACTIME_MPDU;
 
        if (stats->decrypted)
                rx_status->flag |= RX_FLAG_DECRYPTED;
@@ -727,27 +729,24 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
-       bool b_defaultadapter = true;
-
-       struct ieee80211_sta *sta = ieee80211_find_sta(mac->vif, mac->bssid);
-
+       bool defaultadapter = true;
+       struct ieee80211_sta *sta;
        u8 *pdesc = (u8 *) pdesc_tx;
        struct rtl_tcb_desc tcb_desc;
        u8 *qc = ieee80211_get_qos_ctl(hdr);
        u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
        u16 seq_number;
-       u16 fc = le16_to_cpu(hdr->frame_control);
+       __le16 fc = hdr->frame_control;
        u8 rate_flag = info->control.rates[0].flags;
 
        enum rtl_desc_qsel fw_qsel =
-           _rtl92ce_map_hwqueue_to_fwqueue(le16_to_cpu(hdr->frame_control),
-                                           queue_index);
+           _rtl92ce_map_hwqueue_to_fwqueue(fc, queue_index);
 
-       bool b_firstseg = ((hdr->seq_ctrl &
-                           cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
+       bool firstseg = ((hdr->seq_ctrl &
+                         cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
 
-       bool b_lastseg = ((hdr->frame_control &
-                          cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
+       bool lastseg = ((hdr->frame_control &
+                        cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
 
        dma_addr_t mapping = pci_map_single(rtlpci->pdev,
                                            skb->data, skb->len,
@@ -759,7 +758,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
 
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92c));
 
-       if (b_firstseg) {
+       if (firstseg) {
                SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
 
                SET_TX_DESC_TX_RATE(pdesc, tcb_desc.hw_rate);
@@ -774,25 +773,25 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
                }
                SET_TX_DESC_SEQ(pdesc, seq_number);
 
-               SET_TX_DESC_RTS_ENABLE(pdesc, ((tcb_desc.b_rts_enable &&
+               SET_TX_DESC_RTS_ENABLE(pdesc, ((tcb_desc.rts_enable &&
                                                !tcb_desc.
-                                               b_cts_enable) ? 1 : 0));
+                                               cts_enable) ? 1 : 0));
                SET_TX_DESC_HW_RTS_ENABLE(pdesc,
-                                         ((tcb_desc.b_rts_enable
-                                           || tcb_desc.b_cts_enable) ? 1 : 0));
-               SET_TX_DESC_CTS2SELF(pdesc, ((tcb_desc.b_cts_enable) ? 1 : 0));
-               SET_TX_DESC_RTS_STBC(pdesc, ((tcb_desc.b_rts_stbc) ? 1 : 0));
+                                         ((tcb_desc.rts_enable
+                                           || tcb_desc.cts_enable) ? 1 : 0));
+               SET_TX_DESC_CTS2SELF(pdesc, ((tcb_desc.cts_enable) ? 1 : 0));
+               SET_TX_DESC_RTS_STBC(pdesc, ((tcb_desc.rts_stbc) ? 1 : 0));
 
                SET_TX_DESC_RTS_RATE(pdesc, tcb_desc.rts_rate);
                SET_TX_DESC_RTS_BW(pdesc, 0);
                SET_TX_DESC_RTS_SC(pdesc, tcb_desc.rts_sc);
                SET_TX_DESC_RTS_SHORT(pdesc,
                                      ((tcb_desc.rts_rate <= DESC92C_RATE54M) ?
-                                     (tcb_desc.b_rts_use_shortpreamble ? 1 : 0)
-                                     : (tcb_desc.b_rts_use_shortgi ? 1 : 0)));
+                                     (tcb_desc.rts_use_shortpreamble ? 1 : 0)
+                                     : (tcb_desc.rts_use_shortgi ? 1 : 0)));
 
                if (mac->bw_40) {
-                       if (tcb_desc.b_packet_bw) {
+                       if (tcb_desc.packet_bw) {
                                SET_TX_DESC_DATA_BW(pdesc, 1);
                                SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
                        } else {
@@ -811,10 +810,13 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
                SET_TX_DESC_LINIP(pdesc, 0);
                SET_TX_DESC_PKT_SIZE(pdesc, (u16) skb->len);
 
+               rcu_read_lock();
+               sta = ieee80211_find_sta(mac->vif, mac->bssid);
                if (sta) {
                        u8 ampdu_density = sta->ht_cap.ampdu_density;
                        SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
                }
+               rcu_read_unlock();
 
                if (info->control.hw_key) {
                        struct ieee80211_key_conf *keyconf =
@@ -854,14 +856,14 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
                }
        }
 
-       SET_TX_DESC_FIRST_SEG(pdesc, (b_firstseg ? 1 : 0));
-       SET_TX_DESC_LAST_SEG(pdesc, (b_lastseg ? 1 : 0));
+       SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
+       SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
 
        SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) skb->len);
 
        SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, cpu_to_le32(mapping));
 
-       if (rtlpriv->dm.b_useramask) {
+       if (rtlpriv->dm.useramask) {
                SET_TX_DESC_RATE_ID(pdesc, tcb_desc.ratr_index);
                SET_TX_DESC_MACID(pdesc, tcb_desc.mac_id);
        } else {
@@ -869,16 +871,16 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
                SET_TX_DESC_MACID(pdesc, tcb_desc.ratr_index);
        }
 
-       if ((!ieee80211_is_data_qos(fc)) && ppsc->b_leisure_ps &&
-           ppsc->b_fwctrl_lps) {
+       if ((!ieee80211_is_data_qos(fc)) && ppsc->leisure_ps &&
+           ppsc->fwctrl_lps) {
                SET_TX_DESC_HWSEQ_EN(pdesc, 1);
                SET_TX_DESC_PKT_ID(pdesc, 8);
 
-               if (!b_defaultadapter)
+               if (!defaultadapter)
                        SET_TX_DESC_QOS(pdesc, 1);
        }
 
-       SET_TX_DESC_MORE_FRAG(pdesc, (b_lastseg ? 0 : 1));
+       SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
 
        if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
            is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
@@ -889,8 +891,8 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
 }
 
 void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
-                            u8 *pdesc, bool b_firstseg,
-                            bool b_lastseg, struct sk_buff *skb)
+                            u8 *pdesc, bool firstseg,
+                            bool lastseg, struct sk_buff *skb)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -901,11 +903,11 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
                                            PCI_DMA_TODEVICE);
 
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
-       u16 fc = le16_to_cpu(hdr->frame_control);
+       __le16 fc = hdr->frame_control;
 
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
 
-       if (b_firstseg)
+       if (firstseg)
                SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
 
        SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M);
@@ -1029,3 +1031,36 @@ void rtl92ce_tx_polling(struct ieee80211_hw *hw, unsigned int hw_queue)
                               BIT(0) << (hw_queue));
        }
 }
+
+bool _rtl92c_cmd_send_packet(struct ieee80211_hw *hw,
+                            struct sk_buff *skb)
+{
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+       struct rtl8192_tx_ring *ring;
+       struct rtl_tx_desc *pdesc;
+       u8 own;
+       unsigned long flags;
+       struct sk_buff *pskb = NULL;
+
+       ring = &rtlpci->tx_ring[BEACON_QUEUE];
+
+       spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
+
+       pskb = __skb_dequeue(&ring->queue);
+       if (pskb)
+               kfree_skb(pskb);
+
+       pdesc = &ring->desc[0];
+       own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) pdesc, true, HW_DESC_OWN);
+
+       rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb);
+
+       __skb_queue_tail(&ring->queue, skb);
+
+       spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
+
+       rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
+
+       return true;
+}