summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h
diff options
context:
space:
mode:
authorArtur Artamonov <freeartman@wechall.net>2013-08-21 16:52:55 +0300
committerArtur Artamonov <freeartman@wechall.net>2013-08-21 16:52:55 +0300
commitd4bc867ac3afd260e4256e1463b273083769a363 (patch)
tree81c868f33d397d9b61de9ef00c8303fecc9195ca /target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h
parent2789830761da86a4537ab198203138c082b3058e (diff)
parent6e8428d78c98c653f625aa0839437359306f99db (diff)
Merge branch 'realtek-unstable' of git://213.175.90.206/openwrt-realtek into realtek-unstable
Diffstat (limited to 'target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h')
-rw-r--r--target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h110
1 files changed, 108 insertions, 2 deletions
diff --git a/target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h b/target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h
index d85f80965..4e65f9dcf 100644
--- a/target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h
+++ b/target/linux/realtek/files/drivers/net/wireless/rtl8192cd/8192cd_rx.h
@@ -30,6 +30,69 @@
INIT_LIST_HEAD(&(pinfo->rx_list)); \
} while(0)
+
+#ifdef CONFIG_WLAN_HAL
+#define ALIGN_OFFSET_SKB_DATA 32 //It is necessary to be power of 2
+#define GetOffsetStartToRXDESC(priv, pskb) (ALIGN_OFFSET_SKB_DATA - ((((unsigned long)pskb->data) + sizeof(struct rx_frinfo)) & (ALIGN_OFFSET_SKB_DATA-1)))
+
+
+static __inline__
+__MIPS16
+__IRAM_IN_865X
+void init_rxdesc_88XX(
+ struct rtl8192cd_priv *priv,
+ struct sk_buff *pskb,
+ u2Byte i,
+ pu4Byte pBufAddr, // output
+ pu4Byte pBufLen // output
+ )
+{
+ struct rtl8192cd_hw *phw;
+ struct rx_frinfo *pfrinfo;
+ u4Byte offset;
+
+ phw = GET_HW(priv);
+
+ offset = GetOffsetStartToRXDESC(priv, pskb);
+ skb_reserve(pskb, sizeof(struct rx_frinfo) + offset);
+ pfrinfo = get_pfrinfo(pskb);
+ init_frinfo(pfrinfo);
+
+#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
+ pfrinfo->is_br_mgnt = 0;
+#endif
+#ifdef RX_BUFFER_GATHER
+ pfrinfo->gather_flag = 0;
+#endif
+ phw->rx_infoL[i].pbuf = (void *)pskb;
+ phw->rx_infoL[i].paddr = get_physical_addr(priv, pskb->data, (RX_BUF_LEN - sizeof(struct rx_frinfo) - offset), PCI_DMA_FROMDEVICE);
+
+ *pBufAddr = (u4Byte)pskb->data;
+#if 0
+ *pBufLen = RX_BUF_LEN - sizeof(struct rx_frinfo) - offset;
+#else
+
+ //3 this buf len must be 32 byte alignment in 8881A !!!!, If not, the fs/ls mechanism will be fail
+ *pBufLen = RX_BUF_LEN - sizeof(struct rx_frinfo) - 64;
+#ifdef CONFIG_WLAN_HAL_8881A
+ if(GET_CHIP_VER(priv) == VERSION_8881A) {
+ if ((*pBufLen & 0x1f) != 0) {
+ *pBufLen = (((*pBufLen) >> 5) << 5); // *pBufLen = *pBufLen / 32 * 32;
+ //printk("%s(%d): RX_BUF_LEN(%d) must be 32 byte alignment !!! \n", __FUNCTION__, __LINE__, *pBufLen);
+ }
+ }
+#endif
+
+#endif
+
+#if defined(CONFIG_NET_PCI) && !defined(USE_RTL8186_SDK)
+ rtl_cache_sync_wback(priv, bus_to_virt(phw->rx_infoL[i].paddr), RX_BUF_LEN - sizeof(struct rx_frinfo) - offset, PCI_DMA_FROMDEVICE);
+#else
+ rtl_cache_sync_wback(priv, phw->rx_infoL[i].paddr, RX_BUF_LEN - sizeof(struct rx_frinfo) - offset, PCI_DMA_FROMDEVICE);
+#endif
+}
+#endif //CONFIG_WLAN_HAL
+
static __inline__ void init_rxdesc(struct sk_buff *pskb, int i, struct rtl8192cd_priv *priv)
{
struct rtl8192cd_hw *phw;
@@ -52,7 +115,11 @@ static __inline__ void init_rxdesc(struct sk_buff *pskb, int i, struct rtl8192cd
phw->rx_infoL[i].pbuf = (void *)pskb;
phw->rx_infoL[i].paddr = get_physical_addr(priv, pskb->data, (RX_BUF_LEN - sizeof(struct rx_frinfo)), PCI_DMA_FROMDEVICE);
phw->rx_descL[i].Dword6 = set_desc(phw->rx_infoL[i].paddr);
- rtl_cache_sync_wback(priv, phw->rx_infoL[i].paddr, RX_BUF_LEN - sizeof(struct rx_frinfo)-64, PCI_DMA_FROMDEVICE);
+#if defined(CONFIG_NET_PCI) && !defined(USE_RTL8186_SDK)
+ rtl_cache_sync_wback(priv, (unsigned long)bus_to_virt(phw->rx_infoL[i].paddr), RX_BUF_LEN - sizeof(struct rx_frinfo)-64, PCI_DMA_FROMDEVICE);
+#else
+ rtl_cache_sync_wback(priv, (unsigned long)(phw->rx_infoL[i].paddr), RX_BUF_LEN - sizeof(struct rx_frinfo)-64, PCI_DMA_FROMDEVICE);
+#endif
phw->rx_descL[i].Dword0 = set_desc((i == (NUM_RX_DESC - 1)? RX_EOR : 0) | RX_OWN |((RX_BUF_LEN - sizeof(struct rx_frinfo)-64) & RX_PktLenMask)); //32 for alignment, 32 for TKIP MIC
}
@@ -84,10 +151,27 @@ static __inline__ void update_sta_rssi(struct rtl8192cd_priv *priv,
if (priv->pshare->rf_ft_var.rssi_dump) {
priv->pshare->mp_rssi = cal_rssi_avg(priv->pshare->mp_rssi, pfrinfo->rssi);
priv->pshare->mp_sq = pfrinfo->sq;
+#ifdef USE_OUT_SRC
+#ifdef _OUTSRC_COEXIST
+ if(IS_OUTSRC_CHIP(priv))
+#endif
+ {
+ for (i=0; i<2; i++)
+ priv->pshare->mp_rf_info.mimorssi[i] = cal_rssi_avg(priv->pshare->mp_rf_info.mimorssi[i], pfrinfo->rf_info.mimorssi[i]);
+ memcpy(&priv->pshare->mp_rf_info.mimosq[0], &pfrinfo->rf_info.mimosq[0], sizeof(struct rf_misc_info) - 2);
+ }
+#endif
+#if !defined(USE_OUT_SRC) || defined(_OUTSRC_COEXIST)
+#ifdef _OUTSRC_COEXIST
+ if(!IS_OUTSRC_CHIP(priv))
+#endif
+ {
for (i=0; i<2; i++)
priv->pshare->mp_rf_info.mimorssi[i] = cal_rssi_avg(priv->pshare->mp_rf_info.mimorssi[i], pfrinfo->rf_info.mimorssi[i]);
memcpy(&priv->pshare->mp_rf_info.mimosq[0], &pfrinfo->rf_info.mimosq[0], sizeof(struct rf_misc_info) - 2);
}
+#endif
+ }
return;
}
#endif
@@ -95,7 +179,7 @@ static __inline__ void update_sta_rssi(struct rtl8192cd_priv *priv,
if (pfrinfo->physt) {
if (pfrinfo->rssi) {
-#if defined(HW_ANT_SWITCH)
+#if defined(HW_ANT_SWITCH)&& (defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT))
if (pfrinfo->driver_info_size > 0) {
unsigned char *phystatus = (unsigned char*)pfrinfo->driver_info;
int i = 1&(phystatus[27]>>7);
@@ -123,12 +207,34 @@ static __inline__ void update_sta_rssi(struct rtl8192cd_priv *priv,
pstat->rx_bw = pfrinfo->rx_bw;
pstat->rx_splcp = pfrinfo->rx_splcp;
+
+#ifdef USE_OUT_SRC
+#ifdef _OUTSRC_COEXIST
+ if(IS_OUTSRC_CHIP(priv))
+#endif
+ {
+ if (pfrinfo->rf_info.mimorssi[0] != 0)
+ for (i=0; i<2; i++)
+ pstat->rf_info.mimorssi[i] = cal_rssi_avg(pstat->rf_info.mimorssi[i], pfrinfo->rf_info.mimorssi[i]);
+
+ if (priv->pshare->rf_ft_var.rssi_dump)
+ memcpy(&pstat->rf_info.mimosq[0], &pfrinfo->rf_info.mimosq[0], sizeof(struct rf_misc_info) - 2);
+ }
+#endif
+
+#if !defined(USE_OUT_SRC) || defined(_OUTSRC_COEXIST)
+#ifdef _OUTSRC_COEXIST
+ if(!IS_OUTSRC_CHIP(priv))
+#endif
+ {
if (pfrinfo->rf_info.mimorssi[0] != 0)
for (i=0; i<2; i++)
pstat->rf_info.mimorssi[i] = cal_rssi_avg(pstat->rf_info.mimorssi[i], pfrinfo->rf_info.mimorssi[i]);
if (priv->pshare->rf_ft_var.rssi_dump)
memcpy(&pstat->rf_info.mimosq[0], &pfrinfo->rf_info.mimosq[0], sizeof(struct rf_misc_info) - 2);
+ }
+#endif
if (pstat->highest_rx_rate < pstat->rx_rate)
pstat->highest_rx_rate = pstat->rx_rate;