mirror of
https://github.com/Mange/rtl8192eu-linux-driver
synced 2025-12-10 00:04:17 +00:00
Updated to v4.3.8_12406.20140929
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <drv_types.h>
|
||||
|
||||
#define DBG_DUMP_OS_QUEUE_CTL 0
|
||||
|
||||
uint rtw_remainder_len(struct pkt_file *pfile)
|
||||
{
|
||||
@@ -143,11 +144,11 @@ int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u3
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if(pxmitbuf->pxmit_urb[i] == NULL)
|
||||
{
|
||||
DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
|
||||
return _FAIL;
|
||||
}
|
||||
if(pxmitbuf->pxmit_urb[i] == NULL)
|
||||
{
|
||||
DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
|
||||
return _FAIL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -187,28 +188,78 @@ void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32
|
||||
}
|
||||
}
|
||||
|
||||
void dump_os_queue(void *sel, _adapter *padapter)
|
||||
{
|
||||
struct net_device *ndev = padapter->pnetdev;
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
||||
int i;
|
||||
|
||||
for (i=0;i<4;i++) {
|
||||
DBG_871X_SEL_NL(sel, "os_queue[%d]:%s\n"
|
||||
, i, __netif_subqueue_stopped(ndev, i)?"stopped":"waked");
|
||||
}
|
||||
#else
|
||||
DBG_871X_SEL_NL(sel, "os_queue:%s\n"
|
||||
, netif_queue_stopped(ndev)?"stopped":"waked");
|
||||
#endif
|
||||
}
|
||||
|
||||
#define WMM_XMIT_THRESHOLD (NR_XMITFRAME*2/5)
|
||||
|
||||
inline static bool rtw_os_need_wake_queue(_adapter *padapter, u16 qidx)
|
||||
{
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
if (padapter->registrypriv.wifi_spec) {
|
||||
if (pxmitpriv->hwxmits[qidx].accnt < WMM_XMIT_THRESHOLD)
|
||||
return _TRUE;
|
||||
} else {
|
||||
return _TRUE;
|
||||
}
|
||||
return _FALSE;
|
||||
#else
|
||||
return _TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline static bool rtw_os_need_stop_queue(_adapter *padapter, u16 qidx)
|
||||
{
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
||||
if (padapter->registrypriv.wifi_spec) {
|
||||
/* No free space for Tx, tx_worker is too slow */
|
||||
if (pxmitpriv->hwxmits[qidx].accnt > WMM_XMIT_THRESHOLD)
|
||||
return _TRUE;
|
||||
} else {
|
||||
if(pxmitpriv->free_xmitframe_cnt<=4)
|
||||
return _TRUE;
|
||||
}
|
||||
#else
|
||||
if(pxmitpriv->free_xmitframe_cnt<=4)
|
||||
return _TRUE;
|
||||
#endif
|
||||
return _FALSE;
|
||||
}
|
||||
|
||||
void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt)
|
||||
{
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
||||
u16 queue;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
u16 qidx;
|
||||
|
||||
queue = skb_get_queue_mapping(pkt);
|
||||
if (padapter->registrypriv.wifi_spec) {
|
||||
if(__netif_subqueue_stopped(padapter->pnetdev, queue) &&
|
||||
(pxmitpriv->hwxmits[queue].accnt < WMM_XMIT_THRESHOLD))
|
||||
{
|
||||
netif_wake_subqueue(padapter->pnetdev, queue);
|
||||
}
|
||||
} else {
|
||||
if(__netif_subqueue_stopped(padapter->pnetdev, queue))
|
||||
netif_wake_subqueue(padapter->pnetdev, queue);
|
||||
qidx = skb_get_queue_mapping(pkt);
|
||||
if (rtw_os_need_wake_queue(padapter, qidx)) {
|
||||
if (DBG_DUMP_OS_QUEUE_CTL)
|
||||
DBG_871X(FUNC_ADPT_FMT": netif_wake_subqueue[%d]\n", FUNC_ADPT_ARG(padapter), qidx);
|
||||
netif_wake_subqueue(padapter->pnetdev, qidx);
|
||||
}
|
||||
#else
|
||||
if (netif_queue_stopped(padapter->pnetdev))
|
||||
if (rtw_os_need_wake_queue(padapter, 0)) {
|
||||
if (DBG_DUMP_OS_QUEUE_CTL)
|
||||
DBG_871X(FUNC_ADPT_FMT": netif_wake_queue\n", FUNC_ADPT_ARG(padapter));
|
||||
netif_wake_queue(padapter->pnetdev);
|
||||
}
|
||||
#endif
|
||||
|
||||
rtw_skb_free(pkt);
|
||||
@@ -259,30 +310,53 @@ void rtw_os_xmit_schedule(_adapter *padapter)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void rtw_check_xmit_resource(_adapter *padapter, _pkt *pkt)
|
||||
static bool rtw_check_xmit_resource(_adapter *padapter, _pkt *pkt)
|
||||
{
|
||||
bool busy = _FALSE;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
|
||||
u16 queue;
|
||||
u16 qidx;
|
||||
|
||||
queue = skb_get_queue_mapping(pkt);
|
||||
if (padapter->registrypriv.wifi_spec) {
|
||||
/* No free space for Tx, tx_worker is too slow */
|
||||
if (pxmitpriv->hwxmits[queue].accnt > WMM_XMIT_THRESHOLD) {
|
||||
//DBG_871X("%s(): stop netif_subqueue[%d]\n", __FUNCTION__, queue);
|
||||
netif_stop_subqueue(padapter->pnetdev, queue);
|
||||
}
|
||||
} else {
|
||||
if(pxmitpriv->free_xmitframe_cnt<=4) {
|
||||
if (!netif_tx_queue_stopped(netdev_get_tx_queue(padapter->pnetdev, queue)))
|
||||
netif_stop_subqueue(padapter->pnetdev, queue);
|
||||
qidx = skb_get_queue_mapping(pkt);
|
||||
if (rtw_os_need_stop_queue(padapter, qidx)) {
|
||||
if (DBG_DUMP_OS_QUEUE_CTL)
|
||||
DBG_871X(FUNC_ADPT_FMT": netif_stop_subqueue[%d]\n", FUNC_ADPT_ARG(padapter), qidx);
|
||||
netif_stop_subqueue(padapter->pnetdev, qidx);
|
||||
busy = _TRUE;
|
||||
}
|
||||
#else
|
||||
if (rtw_os_need_stop_queue(padapter, 0)) {
|
||||
if (DBG_DUMP_OS_QUEUE_CTL)
|
||||
DBG_871X(FUNC_ADPT_FMT": netif_stop_queue\n", FUNC_ADPT_ARG(padapter));
|
||||
rtw_netif_stop_queue(padapter->pnetdev);
|
||||
busy = _TRUE;
|
||||
}
|
||||
#endif
|
||||
return busy;
|
||||
}
|
||||
|
||||
void rtw_os_wake_queue_at_free_stainfo(_adapter *padapter, int *qcnt_freed)
|
||||
{
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
||||
int i;
|
||||
|
||||
for (i=0;i<4;i++) {
|
||||
if (qcnt_freed[i] == 0)
|
||||
continue;
|
||||
|
||||
if(rtw_os_need_wake_queue(padapter, i)) {
|
||||
if (DBG_DUMP_OS_QUEUE_CTL)
|
||||
DBG_871X(FUNC_ADPT_FMT": netif_wake_subqueue[%d]\n", FUNC_ADPT_ARG(padapter), i);
|
||||
netif_wake_subqueue(padapter->pnetdev, i);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if(pxmitpriv->free_xmitframe_cnt<=4)
|
||||
{
|
||||
if (!rtw_netif_queue_stopped(padapter->pnetdev))
|
||||
rtw_netif_stop_queue(padapter->pnetdev);
|
||||
if (qcnt_freed[0] || qcnt_freed[1] || qcnt_freed[2] || qcnt_freed[3]) {
|
||||
if(rtw_os_need_wake_queue(padapter, 0)) {
|
||||
if (DBG_DUMP_OS_QUEUE_CTL)
|
||||
DBG_871X(FUNC_ADPT_FMT": netif_wake_queue\n", FUNC_ADPT_ARG(padapter));
|
||||
netif_wake_queue(padapter->pnetdev);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -304,6 +378,8 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
|
||||
int i;
|
||||
s32 res;
|
||||
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u);
|
||||
|
||||
_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
|
||||
phead = &pstapriv->asoc_list;
|
||||
plist = get_next(phead);
|
||||
@@ -324,14 +400,22 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
|
||||
for (i = 0; i < chk_alive_num; i++) {
|
||||
psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
|
||||
if(!(psta->state &_FW_LINKED))
|
||||
{
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_fw_linked);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* avoid come from STA1 and send back STA1 */
|
||||
if (_rtw_memcmp(psta->hwaddr, &skb->data[6], 6) == _TRUE
|
||||
|| _rtw_memcmp(psta->hwaddr, null_addr, 6) == _TRUE
|
||||
|| _rtw_memcmp(psta->hwaddr, bc_addr, 6) == _TRUE
|
||||
)
|
||||
{
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_self);
|
||||
continue;
|
||||
}
|
||||
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry);
|
||||
|
||||
newskb = rtw_skb_copy(skb);
|
||||
|
||||
@@ -339,11 +423,13 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
|
||||
_rtw_memcpy(newskb->data, psta->hwaddr, 6);
|
||||
res = rtw_xmit(padapter, &newskb);
|
||||
if (res < 0) {
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_xmit);
|
||||
DBG_871X("%s()-%d: rtw_xmit() return error!\n", __FUNCTION__, __LINE__);
|
||||
pxmitpriv->tx_drop++;
|
||||
rtw_skb_free(newskb);
|
||||
}
|
||||
} else {
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_skb);
|
||||
DBG_871X("%s-%d: rtw_skb_copy() failed!\n", __FUNCTION__, __LINE__);
|
||||
pxmitpriv->tx_drop++;
|
||||
//rtw_skb_free(skb);
|
||||
@@ -372,9 +458,16 @@ int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
|
||||
|
||||
_func_enter_;
|
||||
|
||||
if(padapter->registrypriv.mp_mode)
|
||||
{
|
||||
DBG_871X("MP_TX_DROP_OS_FRAME\n");
|
||||
goto drop_packet;
|
||||
}
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx);
|
||||
RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n"));
|
||||
|
||||
if (rtw_if_up(padapter) == _FALSE) {
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_err_up);
|
||||
RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n"));
|
||||
#ifdef DBG_TX_DROP_FRAME
|
||||
DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__);
|
||||
@@ -388,7 +481,11 @@ _func_enter_;
|
||||
if ( !rtw_mc2u_disable
|
||||
&& check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
|
||||
&& ( IP_MCAST_MAC(pkt->data)
|
||||
|| ICMPV6_MCAST_MAC(pkt->data) )
|
||||
|| ICMPV6_MCAST_MAC(pkt->data)
|
||||
#ifdef CONFIG_TX_BCAST2UNI
|
||||
|| is_broadcast_mac_addr(pkt->data)
|
||||
#endif
|
||||
)
|
||||
&& (padapter->registrypriv.wifi_spec == 0)
|
||||
)
|
||||
{
|
||||
@@ -400,6 +497,7 @@ _func_enter_;
|
||||
} else {
|
||||
//DBG_871X("Stop M2U(%d, %d)! ", pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmitbuf_cnt);
|
||||
//DBG_871X("!m2u );
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_stop);
|
||||
}
|
||||
}
|
||||
#endif // CONFIG_TX_MCAST2UNI
|
||||
@@ -417,7 +515,7 @@ _func_enter_;
|
||||
|
||||
drop_packet:
|
||||
pxmitpriv->tx_drop++;
|
||||
rtw_skb_free(pkt);
|
||||
rtw_os_pkt_complete(padapter, pkt);
|
||||
RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop));
|
||||
|
||||
exit:
|
||||
|
||||
Reference in New Issue
Block a user