/* * Description *Transmit xmitframe from queue * * Return *_SUCCESS ok *_FAIL something error */ static s32 rtl8723bs_xmit_handler(struct adapter *padapter) { struct xmit_priv *pxmitpriv; s32 ret; pxmitpriv = &padapter->xmitpriv; if (down_interruptible(&pxmitpriv->SdioXmitSema)) { DBG_871X_LEVEL(_drv_emerg_, "%s: down sema fail!\n", __func__); return _FAIL; } next: if ( (padapter->bDriverStopped == true) || (padapter->bSurpriseRemoved == true) ) { RT_TRACE( _module_hal_xmit_c_, _drv_notice_, ( "%s: bDriverStopped(%d) bSurpriseRemoved(%d)\n", __func__, padapter->bDriverStopped, padapter->bSurpriseRemoved ) ); return _FAIL; } spin_lock_bh(&pxmitpriv->lock); ret = rtw_txframes_pending(padapter); spin_unlock_bh(&pxmitpriv->lock); if (ret == 0) { return _SUCCESS; } /* dequeue frame and write to hardware */ ret = xmit_xmitframes(padapter, pxmitpriv); if (ret == -2) { /* here sleep 1ms will cause big TP loss of TX */ /* from 50+ to 40+ */ if (padapter->registrypriv.wifi_spec) msleep(1); else yield(); goto next; } spin_lock_bh(&pxmitpriv->lock); ret = rtw_txframes_pending(padapter); spin_unlock_bh(&pxmitpriv->lock); if (ret == 1) { goto next; } return _SUCCESS; }
/* * Description * Transmit xmitframe from queue * * Return * _SUCCESS ok * _FAIL something error */ s32 rtl8723bs_xmit_handler(PADAPTER padapter) { struct xmit_priv *pxmitpriv; s32 ret; _irqL irql; pxmitpriv = &padapter->xmitpriv; wait: ret = _rtw_down_sema(&pxmitpriv->SdioXmitSema); if (_FAIL == ret) { DBG_871X_LEVEL(_drv_emerg_, "%s: down sema fail!\n", __FUNCTION__); return _FAIL; } next: if ((padapter->bDriverStopped == _TRUE) || (padapter->bSurpriseRemoved == _TRUE)) { RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("%s: bDriverStopped(%d) bSurpriseRemoved(%d)\n", __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved)); return _FAIL; } _enter_critical_bh(&pxmitpriv->lock, &irql); ret = rtw_txframes_pending(padapter); _exit_critical_bh(&pxmitpriv->lock, &irql); if (ret == 0) { if(!padapter->registrypriv.wifi_spec) rtw_yield_os(); return _SUCCESS; } // dequeue frame and write to hardware ret = xmit_xmitframes(padapter, pxmitpriv); if (ret == -2) { //here sleep 1ms will cause big TP loss of TX //from 50+ to 40+ if(padapter->registrypriv.wifi_spec) rtw_msleep_os(1); else rtw_yield_os(); goto next; } _enter_critical_bh(&pxmitpriv->lock, &irql); ret = rtw_txframes_pending(padapter); _exit_critical_bh(&pxmitpriv->lock, &irql); if (ret == 1) { //rtw_msleep_os(1); goto next; } return _SUCCESS; }
/* * Description * Transmit xmitframe from queue * * Return * _SUCCESS ok * _FAIL something error */ s32 rtl8723as_xmit_handler(PADAPTER padapter) { struct xmit_priv *pxmitpriv; PHAL_DATA_TYPE phal; s32 ret; _irqL irql; pxmitpriv = &padapter->xmitpriv; phal = GET_HAL_DATA(padapter); wait: ret = _rtw_down_sema(&phal->SdioXmitSema); if (_FAIL == ret) { RT_TRACE(_module_hal_xmit_c_, _drv_emerg_, ("%s: down sema fail!\n", __FUNCTION__)); return _FAIL; } next: if ((padapter->bDriverStopped == _TRUE) || (padapter->bSurpriseRemoved == _TRUE)) { RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("%s: bDriverStopped(%d) bSurpriseRemoved(%d)\n", __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved)); return _FAIL; } _enter_critical_bh(&pxmitpriv->lock, &irql); ret = rtw_txframes_pending(padapter); _exit_critical_bh(&pxmitpriv->lock, &irql); if (ret == 0) { return _SUCCESS; } // dequeue frame and write to hardware ret = xmit_xmitframes(padapter, pxmitpriv); if (ret == -2) { rtw_msleep_os(1); goto next; } _enter_critical_bh(&pxmitpriv->lock, &irql); ret = rtw_txframes_pending(padapter); _exit_critical_bh(&pxmitpriv->lock, &irql); if (ret == 1) { rtw_msleep_os(1); goto next; } return _SUCCESS; }