]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rtlwifi: rtl8192ee: Fix problems with calculating free space in FIFO
authorLarry Finger <Larry.Finger@lwfinger.net>
Tue, 3 Feb 2015 17:15:18 +0000 (11:15 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Mar 2015 22:57:19 +0000 (14:57 -0800)
commit 6d4beca3775222884e1ee9d48ef586c438c3dfa1 upstream.

This driver utilizes a FIFO buffer for RX descriptors. There are four places
in the code where it calculates the number of free slots. Several of those
locations do the calculation incorrectly. To fix these and to prevent future
mistakes, a common inline routine is created.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/rtlwifi/pci.h
drivers/net/wireless/rtlwifi/rtl8192ee/trx.c

index 5e832306dba956c7b29fffc9cf9d1b3c9a66b2e8..d4567d12e07ebd13f17f0097baeec41a25702d31 100644 (file)
@@ -325,4 +325,11 @@ static inline void pci_write32_async(struct rtl_priv *rtlpriv,
        writel(val, (u8 __iomem *) rtlpriv->io.pci_mem_start + addr);
 }
 
+static inline u16 calc_fifo_space(u16 rp, u16 wp)
+{
+       if (rp <= wp)
+               return RTL_PCI_MAX_RX_COUNT - 1 + rp - wp;
+       return rp - wp - 1;
+}
+
 #endif
index 03def29efb7f151eff7bbd52e151e370af2f2d6a..00690040be3781a884edf8ada2d10ba6b6319e64 100644 (file)
@@ -658,14 +658,7 @@ u16 rtl92ee_rx_desc_buff_remained_cnt(struct ieee80211_hw *hw, u8 queue_index)
        if (!start_rx)
                return 0;
 
-       if ((last_read_point > (RX_DESC_NUM_92E / 2)) &&
-           (read_point <= (RX_DESC_NUM_92E / 2))) {
-               remind_cnt = RX_DESC_NUM_92E - write_point;
-       } else {
-               remind_cnt = (read_point >= write_point) ?
-                            (read_point - write_point) :
-                            (RX_DESC_NUM_92E - write_point + read_point);
-       }
+       remind_cnt = calc_fifo_space(read_point, write_point);
 
        if (remind_cnt == 0)
                return 0;