mirror of
https://github.com/lwfinger/rtl8188eu.git
synced 2025-05-23 04:43:04 +00:00
rtl8188eu: Put the current kernel files into a new branch named kernel_code
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
This commit is contained in:
parent
18c80911a2
commit
adfd7de95d
113 changed files with 8126 additions and 34255 deletions
5266
os_dep/ioctl_linux.c
5266
os_dep/ioctl_linux.c
File diff suppressed because it is too large
Load diff
|
@ -25,48 +25,21 @@
|
|||
#include <drv_types.h>
|
||||
#include <mlme_osdep.h>
|
||||
|
||||
void rtw_join_timeout_handler (void *FunctionContext)
|
||||
{
|
||||
struct adapter *adapter = (struct adapter *)FunctionContext;
|
||||
|
||||
_rtw_join_timeout_handler(adapter);
|
||||
}
|
||||
|
||||
|
||||
void _rtw_scan_timeout_handler (void *FunctionContext)
|
||||
{
|
||||
struct adapter *adapter = (struct adapter *)FunctionContext;
|
||||
|
||||
rtw_scan_timeout_handler(adapter);
|
||||
}
|
||||
|
||||
static void _dynamic_check_timer_handlder(void *FunctionContext)
|
||||
{
|
||||
struct adapter *adapter = (struct adapter *)FunctionContext;
|
||||
|
||||
if (adapter->registrypriv.mp_mode == 1)
|
||||
return;
|
||||
rtw_dynamic_check_timer_handlder(adapter);
|
||||
_set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000);
|
||||
}
|
||||
|
||||
void rtw_init_mlme_timer(struct adapter *padapter)
|
||||
{
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
_init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, rtw_join_timeout_handler, padapter);
|
||||
_init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, _rtw_scan_timeout_handler, padapter);
|
||||
_init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter);
|
||||
_init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, _rtw_join_timeout_handler, padapter);
|
||||
_init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, rtw_scan_timeout_handler, padapter);
|
||||
_init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, rtw_dynamic_check_timer_handlder, padapter);
|
||||
}
|
||||
|
||||
void rtw_os_indicate_connect(struct adapter *adapter)
|
||||
{
|
||||
_func_enter_;
|
||||
rtw_indicate_wx_assoc_event(adapter);
|
||||
netif_carrier_on(adapter->pnetdev);
|
||||
if (adapter->pid[2] != 0)
|
||||
rtw_signal_process(adapter->pid[2], SIGALRM);
|
||||
_func_exit_;
|
||||
}
|
||||
|
||||
void rtw_os_indicate_scan_done(struct adapter *padapter, bool aborted)
|
||||
|
@ -87,12 +60,12 @@ void rtw_reset_securitypriv(struct adapter *adapter)
|
|||
/* We have to backup the PMK information for WiFi PMK Caching test item. */
|
||||
/* Backup the btkip_countermeasure information. */
|
||||
/* When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. */
|
||||
_rtw_memset(&backup_pmkid[0], 0x00, sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE);
|
||||
memset(&backup_pmkid[0], 0x00, sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE);
|
||||
memcpy(&backup_pmkid[0], &adapter->securitypriv.PMKIDList[0], sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE);
|
||||
backup_index = adapter->securitypriv.PMKIDIndex;
|
||||
backup_counter = adapter->securitypriv.btkip_countermeasure;
|
||||
backup_time = adapter->securitypriv.btkip_countermeasure_time;
|
||||
_rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof(struct security_priv));
|
||||
memset((unsigned char *)&adapter->securitypriv, 0, sizeof(struct security_priv));
|
||||
|
||||
/* Restore the PMK information to securitypriv structure for the following connection. */
|
||||
memcpy(&adapter->securitypriv.PMKIDList[0],
|
||||
|
@ -119,11 +92,9 @@ void rtw_reset_securitypriv(struct adapter *adapter)
|
|||
|
||||
void rtw_os_indicate_disconnect(struct adapter *adapter)
|
||||
{
|
||||
_func_enter_;
|
||||
netif_carrier_off(adapter->pnetdev); /* Do it first for tx broadcast pkt after disconnection issue! */
|
||||
rtw_indicate_wx_disassoc_event(adapter);
|
||||
rtw_reset_securitypriv(adapter);
|
||||
_func_exit_;
|
||||
}
|
||||
|
||||
void rtw_report_sec_ie(struct adapter *adapter, u8 authmode, u8 *sec_ie)
|
||||
|
@ -132,7 +103,6 @@ void rtw_report_sec_ie(struct adapter *adapter, u8 authmode, u8 *sec_ie)
|
|||
u8 *buff, *p, i;
|
||||
union iwreq_data wrqu;
|
||||
|
||||
_func_enter_;
|
||||
RT_TRACE(_module_mlme_osdep_c_, _drv_info_,
|
||||
("+rtw_report_sec_ie, authmode=%d\n", authmode));
|
||||
buff = NULL;
|
||||
|
@ -141,8 +111,8 @@ _func_enter_;
|
|||
("rtw_report_sec_ie, authmode=%d\n", authmode));
|
||||
buff = rtw_malloc(IW_CUSTOM_MAX);
|
||||
if (!buff)
|
||||
goto exit;
|
||||
_rtw_memset(buff, 0, IW_CUSTOM_MAX);
|
||||
return;
|
||||
memset(buff, 0, IW_CUSTOM_MAX);
|
||||
p = buff;
|
||||
p += sprintf(p, "ASSOCINFO(ReqIEs =");
|
||||
len = sec_ie[1]+2;
|
||||
|
@ -150,47 +120,26 @@ _func_enter_;
|
|||
for (i = 0; i < len; i++)
|
||||
p += sprintf(p, "%02x", sec_ie[i]);
|
||||
p += sprintf(p, ")");
|
||||
_rtw_memset(&wrqu, 0, sizeof(wrqu));
|
||||
memset(&wrqu, 0, sizeof(wrqu));
|
||||
wrqu.data.length = p-buff;
|
||||
wrqu.data.length = (wrqu.data.length < IW_CUSTOM_MAX) ?
|
||||
wrqu.data.length : IW_CUSTOM_MAX;
|
||||
wireless_send_event(adapter->pnetdev, IWEVCUSTOM, &wrqu, buff);
|
||||
kfree(buff);
|
||||
}
|
||||
exit:
|
||||
_func_exit_;
|
||||
}
|
||||
|
||||
static void _survey_timer_hdl(void *FunctionContext)
|
||||
{
|
||||
struct adapter *padapter = (struct adapter *)FunctionContext;
|
||||
|
||||
survey_timer_hdl(padapter);
|
||||
}
|
||||
|
||||
static void _link_timer_hdl(void *FunctionContext)
|
||||
{
|
||||
struct adapter *padapter = (struct adapter *)FunctionContext;
|
||||
link_timer_hdl(padapter);
|
||||
}
|
||||
|
||||
static void _addba_timer_hdl(void *FunctionContext)
|
||||
{
|
||||
struct sta_info *psta = (struct sta_info *)FunctionContext;
|
||||
addba_timer_hdl(psta);
|
||||
}
|
||||
|
||||
void init_addba_retry_timer(struct adapter *padapter, struct sta_info *psta)
|
||||
{
|
||||
_init_timer(&psta->addba_retry_timer, padapter->pnetdev, _addba_timer_hdl, psta);
|
||||
_init_timer(&psta->addba_retry_timer, padapter->pnetdev, addba_timer_hdl, psta);
|
||||
}
|
||||
|
||||
void init_mlme_ext_timer(struct adapter *padapter)
|
||||
{
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
|
||||
_init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter);
|
||||
_init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter);
|
||||
_init_timer(&pmlmeext->survey_timer, padapter->pnetdev, survey_timer_hdl, padapter);
|
||||
_init_timer(&pmlmeext->link_timer, padapter->pnetdev, link_timer_hdl, padapter);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_88EU_AP_MODE
|
||||
|
|
|
@ -19,26 +19,22 @@
|
|||
******************************************************************************/
|
||||
#define _OS_INTFS_C_
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <osdep_service.h>
|
||||
#include <osdep_intf.h>
|
||||
#include <drv_types.h>
|
||||
#include <xmit_osdep.h>
|
||||
#include <recv_osdep.h>
|
||||
#include <hal_intf.h>
|
||||
#include <rtw_ioctl.h>
|
||||
#include <rtw_version.h>
|
||||
#include <rtl8188e_hal.h>
|
||||
|
||||
#include <usb_osintf.h>
|
||||
#include <usb_hal.h>
|
||||
#include <rtw_br_ext.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
|
||||
MODULE_AUTHOR("Realtek Semiconductor Corp.");
|
||||
MODULE_VERSION(DRIVERVERSION);
|
||||
|
||||
#define CONFIG_BR_EXT_BRNAME "br0"
|
||||
#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
|
||||
|
||||
/* module param defaults */
|
||||
|
@ -71,8 +67,6 @@ static int rtw_short_retry_lmt = 7;
|
|||
static int rtw_busy_thresh = 40;
|
||||
static int rtw_ack_policy = NORMAL_ACK;
|
||||
|
||||
static int rtw_mp_mode;
|
||||
|
||||
static int rtw_software_encrypt;
|
||||
static int rtw_software_decrypt;
|
||||
|
||||
|
@ -86,9 +80,9 @@ static int rtw_uapsd_acbe_en;
|
|||
static int rtw_uapsd_acvi_en;
|
||||
static int rtw_uapsd_acvo_en;
|
||||
|
||||
int rtw_ht_enable = 1;
|
||||
int rtw_cbw40_enable = 3; /* 0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */
|
||||
int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
|
||||
static int rtw_ht_enable = 1;
|
||||
static int rtw_cbw40_enable = 3; /* 0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */
|
||||
static int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
|
||||
static int rtw_rx_stbc = 1;/* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */
|
||||
static int rtw_ampdu_amsdu;/* 0: disabled, 1:enabled, 2:auto */
|
||||
|
||||
|
@ -132,7 +126,6 @@ module_param(rtw_rfintfs, int, 0644);
|
|||
module_param(rtw_lbkmode, int, 0644);
|
||||
module_param(rtw_network_mode, int, 0644);
|
||||
module_param(rtw_channel, int, 0644);
|
||||
module_param(rtw_mp_mode, int, 0644);
|
||||
module_param(rtw_wmm_enable, int, 0644);
|
||||
module_param(rtw_vrtl_carrier_sense, int, 0644);
|
||||
module_param(rtw_vcs_type, int, 0644);
|
||||
|
@ -519,10 +512,8 @@ void rtw_proc_remove_one(struct net_device *dev)
|
|||
|
||||
static uint loadparam(struct adapter *padapter, struct net_device *pnetdev)
|
||||
{
|
||||
uint status = _SUCCESS;
|
||||
struct registry_priv *registry_par = &padapter->registrypriv;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
GlobalDebugLevel = rtw_debug;
|
||||
registry_par->chip_version = (u8)rtw_chip_version;
|
||||
|
@ -535,7 +526,7 @@ _func_enter_;
|
|||
|
||||
registry_par->channel = (u8)rtw_channel;
|
||||
registry_par->wireless_mode = (u8)rtw_wireless_mode;
|
||||
registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;
|
||||
registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense;
|
||||
registry_par->vcs_type = (u8)rtw_vcs_type;
|
||||
registry_par->rts_thresh = (u16)rtw_rts_thresh;
|
||||
registry_par->frag_thresh = (u16)rtw_frag_thresh;
|
||||
|
@ -551,7 +542,7 @@ _func_enter_;
|
|||
registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;
|
||||
registry_par->busy_thresh = (u16)rtw_busy_thresh;
|
||||
registry_par->ack_policy = (u8)rtw_ack_policy;
|
||||
registry_par->mp_mode = (u8)rtw_mp_mode;
|
||||
registry_par->mp_mode = 0;
|
||||
registry_par->software_encrypt = (u8)rtw_software_encrypt;
|
||||
registry_par->software_decrypt = (u8)rtw_software_decrypt;
|
||||
registry_par->acm_method = (u8)rtw_acm_method;
|
||||
|
@ -590,8 +581,7 @@ _func_enter_;
|
|||
snprintf(registry_par->ifname, 16, "%s", ifname);
|
||||
snprintf(registry_par->if2name, 16, "%s", if2name);
|
||||
registry_par->notch_filter = (u8)rtw_notch_filter;
|
||||
_func_exit_;
|
||||
return status;
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p)
|
||||
|
@ -654,12 +644,8 @@ static unsigned int rtw_classify8021d(struct sk_buff *skb)
|
|||
return dscp >> 5;
|
||||
}
|
||||
|
||||
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||
,void *unused
|
||||
,select_queue_fallback_t fallback
|
||||
#endif
|
||||
)
|
||||
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv, select_queue_fallback_t fallback)
|
||||
{
|
||||
struct adapter *padapter = rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
@ -714,27 +700,19 @@ int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,39)
|
||||
static const struct device_type wlan_type = {
|
||||
.name = "wlan",
|
||||
};
|
||||
#else
|
||||
static struct device_type wlan_type = {
|
||||
.name = "wlan",
|
||||
};
|
||||
#endif
|
||||
|
||||
struct net_device *rtw_init_netdev(struct adapter *old_padapter)
|
||||
{
|
||||
struct adapter *padapter;
|
||||
struct net_device *pnetdev;
|
||||
struct net_device *pnetdev = NULL;
|
||||
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+init_net_dev\n"));
|
||||
|
||||
if (old_padapter != NULL)
|
||||
pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(struct adapter), (void *)old_padapter);
|
||||
else
|
||||
pnetdev = rtw_alloc_etherdev(sizeof(struct adapter));
|
||||
|
||||
if (!pnetdev)
|
||||
return NULL;
|
||||
|
@ -765,7 +743,6 @@ u32 rtw_start_drv_threads(struct adapter *padapter)
|
|||
else
|
||||
_rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); /* wait for cmd_thread to run */
|
||||
|
||||
rtw_hal_start_thread(padapter);
|
||||
return _status;
|
||||
}
|
||||
|
||||
|
@ -774,16 +751,14 @@ void rtw_stop_drv_threads(struct adapter *padapter)
|
|||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_stop_drv_threads\n"));
|
||||
|
||||
/* Below is to termindate rtw_cmd_thread & event_thread... */
|
||||
_rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema);
|
||||
up(&padapter->cmdpriv.cmd_queue_sema);
|
||||
if (padapter->cmdThread)
|
||||
_rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema);
|
||||
|
||||
rtw_hal_stop_thread(padapter);
|
||||
}
|
||||
|
||||
static u8 rtw_init_default_value(struct adapter *padapter)
|
||||
{
|
||||
u8 ret = _SUCCESS;
|
||||
struct registry_priv *pregistrypriv = &padapter->registrypriv;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
@ -826,15 +801,11 @@ static u8 rtw_init_default_value(struct adapter *padapter)
|
|||
padapter->bWritePortCancel = false;
|
||||
padapter->bRxRSSIDisplay = 0;
|
||||
padapter->bNotifyChannelChange = 0;
|
||||
#ifdef CONFIG_88EU_P2P
|
||||
padapter->bShowGetP2PState = 1;
|
||||
#endif
|
||||
return ret;
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
u8 rtw_reset_drv_sw(struct adapter *padapter)
|
||||
{
|
||||
u8 ret8 = _SUCCESS;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
|
||||
|
||||
|
@ -851,8 +822,7 @@ u8 rtw_reset_drv_sw(struct adapter *padapter)
|
|||
pmlmepriv->LinkDetectInfo.bBusyTraffic = false;
|
||||
|
||||
_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING);
|
||||
|
||||
rtw_hal_sreset_reset_value(padapter);
|
||||
rtw_hal_sreset_init(padapter);
|
||||
pwrctrlpriv->pwr_state_check_cnts = 0;
|
||||
|
||||
/* mlmeextpriv */
|
||||
|
@ -860,14 +830,13 @@ u8 rtw_reset_drv_sw(struct adapter *padapter)
|
|||
|
||||
rtw_set_signal_stat_timer(&padapter->recvpriv);
|
||||
|
||||
return ret8;
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
u8 rtw_init_drv_sw(struct adapter *padapter)
|
||||
{
|
||||
u8 ret8 = _SUCCESS;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_init_drv_sw\n"));
|
||||
|
||||
|
@ -879,24 +848,12 @@ _func_enter_;
|
|||
|
||||
padapter->cmdpriv.padapter = padapter;
|
||||
|
||||
if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) {
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init evt_priv\n"));
|
||||
ret8 = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (rtw_init_mlme_priv(padapter) == _FAIL) {
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init mlme_priv\n"));
|
||||
ret8 = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_88EU_P2P
|
||||
rtw_init_wifidirect_timers(padapter);
|
||||
init_wifidirect_info(padapter, P2P_ROLE_DISABLE);
|
||||
reset_global_wifidirect_info(padapter);
|
||||
#endif /* CONFIG_88EU_P2P */
|
||||
|
||||
if (init_mlme_ext_priv(padapter) == _FAIL) {
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init mlme_ext_priv\n"));
|
||||
ret8 = _FAIL;
|
||||
|
@ -927,9 +884,6 @@ _func_enter_;
|
|||
|
||||
rtw_init_pwrctrl_priv(padapter);
|
||||
|
||||
if (init_mp_priv(padapter) == _FAIL)
|
||||
DBG_88E("%s: initialize MP private data Fail!\n", __func__);
|
||||
|
||||
ret8 = rtw_init_default_value(padapter);
|
||||
|
||||
rtw_hal_dm_init(padapter);
|
||||
|
@ -937,12 +891,11 @@ _func_enter_;
|
|||
|
||||
rtw_hal_sreset_init(padapter);
|
||||
|
||||
_rtw_spinlock_init(&padapter->br_ext_lock);
|
||||
spin_lock_init(&padapter->br_ext_lock);
|
||||
|
||||
exit:
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_init_drv_sw\n"));
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return ret8;
|
||||
}
|
||||
|
@ -951,54 +904,30 @@ void rtw_cancel_all_timer(struct adapter *padapter)
|
|||
{
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_cancel_all_timer\n"));
|
||||
|
||||
_cancel_timer_ex(&padapter->mlmepriv.assoc_timer);
|
||||
del_timer_sync(&padapter->mlmepriv.assoc_timer);
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel association timer complete!\n"));
|
||||
|
||||
_cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);
|
||||
del_timer_sync(&padapter->mlmepriv.scan_to_timer);
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel scan_to_timer!\n"));
|
||||
|
||||
_cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer);
|
||||
del_timer_sync(&padapter->mlmepriv.dynamic_chk_timer);
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel dynamic_chk_timer!\n"));
|
||||
|
||||
/* cancel sw led timer */
|
||||
rtw_hal_sw_led_deinit(padapter);
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel DeInitSwLeds!\n"));
|
||||
|
||||
_cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer);
|
||||
del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer);
|
||||
|
||||
_cancel_timer_ex(&padapter->recvpriv.signal_stat_timer);
|
||||
/* cancel dm timer */
|
||||
rtw_hal_dm_deinit(padapter);
|
||||
del_timer_sync(&padapter->recvpriv.signal_stat_timer);
|
||||
}
|
||||
|
||||
u8 rtw_free_drv_sw(struct adapter *padapter)
|
||||
{
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw"));
|
||||
|
||||
/* we can call rtw_p2p_enable here, but: */
|
||||
/* 1. rtw_p2p_enable may have IO operation */
|
||||
/* 2. rtw_p2p_enable is bundled with wext interface */
|
||||
#ifdef CONFIG_88EU_P2P
|
||||
{
|
||||
struct wifidirect_info *pwdinfo = &padapter->wdinfo;
|
||||
if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
|
||||
_cancel_timer_ex(&pwdinfo->find_phase_timer);
|
||||
_cancel_timer_ex(&pwdinfo->restore_p2p_state_timer);
|
||||
_cancel_timer_ex(&pwdinfo->pre_tx_scan_timer);
|
||||
rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
_rtw_spinlock_free(&padapter->br_ext_lock);
|
||||
|
||||
free_mlme_ext_priv(&padapter->mlmeextpriv);
|
||||
|
||||
rtw_free_cmd_priv(&padapter->cmdpriv);
|
||||
|
||||
rtw_free_evt_priv(&padapter->evtpriv);
|
||||
|
||||
rtw_free_mlme_priv(&padapter->mlmepriv);
|
||||
_rtw_free_xmit_priv(&padapter->xmitpriv);
|
||||
|
||||
|
@ -1006,8 +935,6 @@ u8 rtw_free_drv_sw(struct adapter *padapter)
|
|||
|
||||
_rtw_free_recv_priv(&padapter->recvpriv);
|
||||
|
||||
rtw_free_pwrctrl_priv(padapter);
|
||||
|
||||
rtw_hal_free_data(padapter);
|
||||
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("<== rtw_free_drv_sw\n"));
|
||||
|
@ -1018,44 +945,13 @@ u8 rtw_free_drv_sw(struct adapter *padapter)
|
|||
padapter->rereg_nd_name_priv.old_pnetdev = NULL;
|
||||
}
|
||||
|
||||
/* clear pbuddystruct adapter to avoid access wrong pointer. */
|
||||
if (padapter->pbuddy_adapter != NULL)
|
||||
padapter->pbuddy_adapter->pbuddy_adapter = NULL;
|
||||
mutex_destroy(&padapter->hw_init_mutex);
|
||||
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_free_drv_sw\n"));
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
void netdev_br_init(struct net_device *netdev)
|
||||
{
|
||||
struct adapter *adapter = (struct adapter *)rtw_netdev_priv(netdev);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
|
||||
if (rcu_dereference(adapter->pnetdev->rx_handler_data)) {
|
||||
#else
|
||||
if (rcu_dereference(adapter->pnetdev->br_port)) {
|
||||
#endif
|
||||
struct net_device *br_netdev;
|
||||
struct net *devnet = NULL;
|
||||
|
||||
devnet = dev_net(netdev);
|
||||
br_netdev = dev_get_by_name(devnet, CONFIG_BR_EXT_BRNAME);
|
||||
if (br_netdev) {
|
||||
memcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN);
|
||||
dev_put(br_netdev);
|
||||
} else {
|
||||
pr_info("%s()-%d: dev_get_by_name(%s) failed!",
|
||||
__func__, __LINE__, CONFIG_BR_EXT_BRNAME);
|
||||
}
|
||||
}
|
||||
adapter->ethBrExtInfo.addPPPoETag = 1;
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
int _netdev_open(struct net_device *pnetdev)
|
||||
{
|
||||
uint status;
|
||||
|
@ -1073,7 +969,6 @@ int _netdev_open(struct net_device *pnetdev)
|
|||
if (!padapter->bup) {
|
||||
padapter->bDriverStopped = false;
|
||||
padapter->bSurpriseRemoved = false;
|
||||
padapter->bCardDisableWOHSM = false;
|
||||
|
||||
status = rtw_hal_init(padapter);
|
||||
if (status == _FAIL) {
|
||||
|
@ -1109,11 +1004,9 @@ int _netdev_open(struct net_device *pnetdev)
|
|||
rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
|
||||
|
||||
if (!rtw_netif_queue_stopped(pnetdev))
|
||||
rtw_netif_start_queue(pnetdev);
|
||||
netif_tx_start_all_queues(pnetdev);
|
||||
else
|
||||
rtw_netif_wake_queue(pnetdev);
|
||||
|
||||
netdev_br_init(pnetdev);
|
||||
netif_tx_wake_all_queues(pnetdev);
|
||||
|
||||
netdev_open_normal_process:
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - dev_open\n"));
|
||||
|
@ -1123,7 +1016,7 @@ netdev_open_normal_process:
|
|||
netdev_open_error:
|
||||
padapter->bup = false;
|
||||
netif_carrier_off(pnetdev);
|
||||
rtw_netif_stop_queue(pnetdev);
|
||||
netif_tx_stop_all_queues(pnetdev);
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_err_, ("-88eu_drv - dev_open, fail!\n"));
|
||||
DBG_88E("-88eu_drv - drv_open fail, bup =%d\n", padapter->bup);
|
||||
return -1;
|
||||
|
@ -1134,9 +1027,9 @@ int netdev_open(struct net_device *pnetdev)
|
|||
int ret;
|
||||
struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
|
||||
|
||||
_enter_critical_mutex(padapter->hw_init_mutex, NULL);
|
||||
_enter_critical_mutex(&padapter->hw_init_mutex, NULL);
|
||||
ret = _netdev_open(pnetdev);
|
||||
_exit_critical_mutex(padapter->hw_init_mutex, NULL);
|
||||
mutex_unlock(&padapter->hw_init_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1148,7 +1041,6 @@ static int ips_netdrv_open(struct adapter *padapter)
|
|||
|
||||
padapter->bDriverStopped = false;
|
||||
padapter->bSurpriseRemoved = false;
|
||||
padapter->bCardDisableWOHSM = false;
|
||||
|
||||
status = rtw_hal_init(padapter);
|
||||
if (status == _FAIL) {
|
||||
|
@ -1174,7 +1066,7 @@ netdev_open_error:
|
|||
int rtw_ips_pwr_up(struct adapter *padapter)
|
||||
{
|
||||
int result;
|
||||
u32 start_time = rtw_get_current_time();
|
||||
u32 start_time = jiffies;
|
||||
DBG_88E("===> rtw_ips_pwr_up..............\n");
|
||||
rtw_reset_drv_sw(padapter);
|
||||
|
||||
|
@ -1188,16 +1080,14 @@ int rtw_ips_pwr_up(struct adapter *padapter)
|
|||
|
||||
void rtw_ips_pwr_down(struct adapter *padapter)
|
||||
{
|
||||
u32 start_time = rtw_get_current_time();
|
||||
u32 start_time = jiffies;
|
||||
DBG_88E("===> rtw_ips_pwr_down...................\n");
|
||||
|
||||
padapter->bCardDisableWOHSM = true;
|
||||
padapter->net_closed = true;
|
||||
|
||||
rtw_led_control(padapter, LED_CTL_POWER_OFF);
|
||||
|
||||
rtw_ips_dev_unload(padapter);
|
||||
padapter->bCardDisableWOHSM = false;
|
||||
DBG_88E("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time));
|
||||
}
|
||||
|
||||
|
@ -1229,7 +1119,7 @@ int pm_netdev_open(struct net_device *pnetdev, u8 bnormal)
|
|||
int netdev_close(struct net_device *pnetdev)
|
||||
{
|
||||
struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
||||
struct hal_data_8188e *rtlhal = GET_HAL_DATA(padapter);
|
||||
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - drv_close\n"));
|
||||
|
||||
|
@ -1246,7 +1136,7 @@ int netdev_close(struct net_device *pnetdev)
|
|||
/* s1. */
|
||||
if (pnetdev) {
|
||||
if (!rtw_netif_queue_stopped(pnetdev))
|
||||
rtw_netif_stop_queue(pnetdev);
|
||||
netif_tx_stop_all_queues(pnetdev);
|
||||
}
|
||||
|
||||
/* s2. */
|
||||
|
@ -1262,14 +1152,8 @@ int netdev_close(struct net_device *pnetdev)
|
|||
rtw_led_control(padapter, LED_CTL_POWER_OFF);
|
||||
}
|
||||
|
||||
nat25_db_cleanup(padapter);
|
||||
|
||||
#ifdef CONFIG_88EU_P2P
|
||||
rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
|
||||
#endif /* CONFIG_88EU_P2P */
|
||||
|
||||
kfree(dvobj->firmware.szFwBuffer);
|
||||
dvobj->firmware.szFwBuffer = NULL;
|
||||
kfree(rtlhal->pfirmware);
|
||||
rtlhal->pfirmware = NULL;
|
||||
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - drv_close\n"));
|
||||
DBG_88E("-88eu_drv - drv_close, bup =%d\n", padapter->bup);
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#define _OSDEP_SERVICE_C_
|
||||
|
||||
#include <osdep_service.h>
|
||||
#include <osdep_intf.h>
|
||||
#include <drv_types.h>
|
||||
#include <recv_osdep.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
@ -38,44 +39,6 @@ inline int RTW_STATUS_CODE(int error_code)
|
|||
return _FAIL;
|
||||
}
|
||||
|
||||
u32 rtw_atoi(u8 *s)
|
||||
{
|
||||
int num = 0, flag = 0;
|
||||
int i;
|
||||
for (i = 0; i <= strlen(s); i++) {
|
||||
if (s[i] >= '0' && s[i] <= '9')
|
||||
num = num * 10 + s[i] - '0';
|
||||
else if (s[0] == '-' && i == 0)
|
||||
flag = 1;
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (flag == 1)
|
||||
num = num * -1;
|
||||
return num;
|
||||
}
|
||||
|
||||
inline u8 *_rtw_vmalloc(u32 sz)
|
||||
{
|
||||
u8 *pbuf;
|
||||
pbuf = vmalloc(sz);
|
||||
return pbuf;
|
||||
}
|
||||
|
||||
inline u8 *_rtw_zvmalloc(u32 sz)
|
||||
{
|
||||
u8 *pbuf;
|
||||
pbuf = _rtw_vmalloc(sz);
|
||||
if (pbuf != NULL)
|
||||
memset(pbuf, 0, sz);
|
||||
return pbuf;
|
||||
}
|
||||
|
||||
inline void _rtw_vmfree(u8 *pbuf, u32 sz)
|
||||
{
|
||||
vfree(pbuf);
|
||||
}
|
||||
|
||||
u8 *_rtw_malloc(u32 sz)
|
||||
{
|
||||
u8 *pbuf = NULL;
|
||||
|
@ -84,20 +47,11 @@ u8 *_rtw_malloc(u32 sz)
|
|||
return pbuf;
|
||||
}
|
||||
|
||||
u8 *_rtw_zmalloc(u32 sz)
|
||||
{
|
||||
u8 *pbuf = _rtw_malloc(sz);
|
||||
|
||||
if (pbuf != NULL)
|
||||
memset(pbuf, 0, sz);
|
||||
return pbuf;
|
||||
}
|
||||
|
||||
void *rtw_malloc2d(int h, int w, int size)
|
||||
{
|
||||
int j;
|
||||
|
||||
void **a = (void **)rtw_zmalloc(h*sizeof(void *) + h*w*size);
|
||||
void **a = kzalloc(h*sizeof(void *) + h*w*size, GFP_KERNEL);
|
||||
if (a == NULL) {
|
||||
pr_info("%s: alloc memory fail!\n", __func__);
|
||||
return NULL;
|
||||
|
@ -109,72 +63,6 @@ void *rtw_malloc2d(int h, int w, int size)
|
|||
return a;
|
||||
}
|
||||
|
||||
void rtw_mfree2d(void *pbuf, int h, int w, int size)
|
||||
{
|
||||
kfree(pbuf);
|
||||
}
|
||||
|
||||
int _rtw_memcmp(void *dst, void *src, u32 sz)
|
||||
{
|
||||
/* under Linux/GNU/GLibc, the return value of memcmp for two same
|
||||
* mem. chunk is 0 */
|
||||
if (!(memcmp(dst, src, sz)))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void _rtw_memset(void *pbuf, int c, u32 sz)
|
||||
{
|
||||
memset(pbuf, c, sz);
|
||||
}
|
||||
|
||||
void _rtw_init_listhead(struct list_head *list)
|
||||
{
|
||||
INIT_LIST_HEAD(list);
|
||||
}
|
||||
|
||||
/*
|
||||
For the following list_xxx operations,
|
||||
caller must guarantee the atomic context.
|
||||
Otherwise, there will be racing condition.
|
||||
*/
|
||||
u32 rtw_is_list_empty(struct list_head *phead)
|
||||
{
|
||||
if (list_empty(phead))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void rtw_list_insert_head(struct list_head *plist, struct list_head *phead)
|
||||
{
|
||||
list_add(plist, phead);
|
||||
}
|
||||
|
||||
void rtw_list_insert_tail(struct list_head *plist, struct list_head *phead)
|
||||
{
|
||||
list_add_tail(plist, phead);
|
||||
}
|
||||
|
||||
/*
|
||||
Caller must check if the list is empty before calling rtw_list_delete
|
||||
*/
|
||||
|
||||
void _rtw_init_sema(struct semaphore *sema, int init_val)
|
||||
{
|
||||
sema_init(sema, init_val);
|
||||
}
|
||||
|
||||
void _rtw_free_sema(struct semaphore *sema)
|
||||
{
|
||||
}
|
||||
|
||||
void _rtw_up_sema(struct semaphore *sema)
|
||||
{
|
||||
up(sema);
|
||||
}
|
||||
|
||||
u32 _rtw_down_sema(struct semaphore *sema)
|
||||
{
|
||||
if (down_interruptible(sema))
|
||||
|
@ -183,183 +71,18 @@ u32 _rtw_down_sema(struct semaphore *sema)
|
|||
return _SUCCESS;
|
||||
}
|
||||
|
||||
void _rtw_mutex_init(struct mutex *pmutex)
|
||||
{
|
||||
mutex_init(pmutex);
|
||||
}
|
||||
|
||||
void _rtw_mutex_free(struct mutex *pmutex)
|
||||
{
|
||||
mutex_destroy(pmutex);
|
||||
}
|
||||
|
||||
void _rtw_spinlock_init(spinlock_t *plock)
|
||||
{
|
||||
spin_lock_init(plock);
|
||||
}
|
||||
|
||||
void _rtw_spinlock_free(spinlock_t *plock)
|
||||
{
|
||||
}
|
||||
|
||||
void _rtw_init_queue(struct __queue *pqueue)
|
||||
{
|
||||
_rtw_init_listhead(&(pqueue->queue));
|
||||
_rtw_spinlock_init(&(pqueue->lock));
|
||||
INIT_LIST_HEAD(&(pqueue->queue));
|
||||
spin_lock_init(&(pqueue->lock));
|
||||
}
|
||||
|
||||
u32 _rtw_queue_empty(struct __queue *pqueue)
|
||||
{
|
||||
return rtw_is_list_empty(&(pqueue->queue));
|
||||
}
|
||||
|
||||
u32 rtw_end_of_queue_search(struct list_head *head, struct list_head *plist)
|
||||
{
|
||||
if (head == plist)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
u32 rtw_get_current_time(void)
|
||||
{
|
||||
return jiffies;
|
||||
}
|
||||
|
||||
inline u32 rtw_systime_to_ms(u32 systime)
|
||||
{
|
||||
return systime * 1000 / HZ;
|
||||
}
|
||||
|
||||
inline u32 rtw_ms_to_systime(u32 ms)
|
||||
{
|
||||
return ms * HZ / 1000;
|
||||
}
|
||||
|
||||
/* the input parameter start use the same unit as returned by
|
||||
* rtw_get_current_time */
|
||||
/* the input parameter start must be in jiffies */
|
||||
inline s32 rtw_get_passing_time_ms(u32 start)
|
||||
{
|
||||
return rtw_systime_to_ms(jiffies-start);
|
||||
return jiffies_to_msecs(jiffies-start);
|
||||
}
|
||||
|
||||
inline s32 rtw_get_time_interval_ms(u32 start, u32 end)
|
||||
{
|
||||
return rtw_systime_to_ms(end-start);
|
||||
}
|
||||
|
||||
void rtw_sleep_schedulable(int ms)
|
||||
{
|
||||
u32 delta;
|
||||
|
||||
delta = (ms * HZ)/1000;/* ms) */
|
||||
if (delta == 0)
|
||||
delta = 1;/* 1 ms */
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (schedule_timeout(delta) != 0)
|
||||
return;
|
||||
}
|
||||
|
||||
void rtw_msleep_os(int ms)
|
||||
{
|
||||
msleep((unsigned int)ms);
|
||||
}
|
||||
|
||||
void rtw_usleep_os(int us)
|
||||
{
|
||||
if (1 < (us/1000))
|
||||
msleep(1);
|
||||
else
|
||||
msleep((us/1000) + 1);
|
||||
}
|
||||
|
||||
void rtw_mdelay_os(int ms)
|
||||
{
|
||||
mdelay((unsigned long)ms);
|
||||
}
|
||||
|
||||
void rtw_udelay_os(int us)
|
||||
{
|
||||
udelay((unsigned long)us);
|
||||
}
|
||||
|
||||
void rtw_yield_os(void)
|
||||
{
|
||||
yield();
|
||||
}
|
||||
|
||||
#define RTW_SUSPEND_LOCK_NAME "rtw_wifi"
|
||||
|
||||
inline void rtw_suspend_lock_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline void rtw_suspend_lock_uninit(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline void rtw_lock_suspend(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline void rtw_unlock_suspend(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline void ATOMIC_SET(ATOMIC_T *v, int i)
|
||||
{
|
||||
atomic_set(v, i);
|
||||
}
|
||||
|
||||
inline int ATOMIC_READ(ATOMIC_T *v)
|
||||
{
|
||||
return atomic_read(v);
|
||||
}
|
||||
|
||||
inline void ATOMIC_ADD(ATOMIC_T *v, int i)
|
||||
{
|
||||
atomic_add(i, v);
|
||||
}
|
||||
|
||||
inline void ATOMIC_SUB(ATOMIC_T *v, int i)
|
||||
{
|
||||
atomic_sub(i, v);
|
||||
}
|
||||
|
||||
inline void ATOMIC_INC(ATOMIC_T *v)
|
||||
{
|
||||
atomic_inc(v);
|
||||
}
|
||||
|
||||
inline void ATOMIC_DEC(ATOMIC_T *v)
|
||||
{
|
||||
atomic_dec(v);
|
||||
}
|
||||
|
||||
inline int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i)
|
||||
{
|
||||
return atomic_add_return(i, v);
|
||||
}
|
||||
|
||||
inline int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i)
|
||||
{
|
||||
return atomic_sub_return(i, v);
|
||||
}
|
||||
|
||||
inline int ATOMIC_INC_RETURN(ATOMIC_T *v)
|
||||
{
|
||||
return atomic_inc_return(v);
|
||||
}
|
||||
|
||||
inline int ATOMIC_DEC_RETURN(ATOMIC_T *v)
|
||||
{
|
||||
return atomic_dec_return(v);
|
||||
}
|
||||
|
||||
static const struct device_type wlan_type = {
|
||||
.name = "wlan",
|
||||
};
|
||||
|
||||
struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv,
|
||||
void *old_priv)
|
||||
{
|
||||
|
@ -370,7 +93,6 @@ struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv,
|
|||
if (!pnetdev)
|
||||
goto RETURN;
|
||||
|
||||
pnetdev->dev.type = &wlan_type;
|
||||
pnpi = netdev_priv(pnetdev);
|
||||
pnpi->priv = old_priv;
|
||||
pnpi->sizeof_priv = sizeof_priv;
|
||||
|
@ -379,29 +101,6 @@ RETURN:
|
|||
return pnetdev;
|
||||
}
|
||||
|
||||
struct net_device *rtw_alloc_etherdev(int sizeof_priv)
|
||||
{
|
||||
struct net_device *pnetdev;
|
||||
struct rtw_netdev_priv_indicator *pnpi;
|
||||
|
||||
pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
|
||||
if (!pnetdev)
|
||||
goto RETURN;
|
||||
|
||||
pnpi = netdev_priv(pnetdev);
|
||||
|
||||
pnpi->priv = rtw_zvmalloc(sizeof_priv);
|
||||
if (!pnpi->priv) {
|
||||
free_netdev(pnetdev);
|
||||
pnetdev = NULL;
|
||||
goto RETURN;
|
||||
}
|
||||
|
||||
pnpi->sizeof_priv = sizeof_priv;
|
||||
RETURN:
|
||||
return pnetdev;
|
||||
}
|
||||
|
||||
void rtw_free_netdev(struct net_device *netdev)
|
||||
{
|
||||
struct rtw_netdev_priv_indicator *pnpi;
|
||||
|
@ -414,79 +113,18 @@ void rtw_free_netdev(struct net_device *netdev)
|
|||
if (!pnpi->priv)
|
||||
goto RETURN;
|
||||
|
||||
rtw_vmfree(pnpi->priv, pnpi->sizeof_priv);
|
||||
vfree(pnpi->priv);
|
||||
free_netdev(netdev);
|
||||
|
||||
RETURN:
|
||||
return;
|
||||
}
|
||||
|
||||
int rtw_change_ifname(struct adapter *padapter, const char *ifname)
|
||||
{
|
||||
struct net_device *pnetdev;
|
||||
struct net_device *cur_pnetdev;
|
||||
struct rereg_nd_name_data *rereg_priv;
|
||||
int ret;
|
||||
|
||||
if (!padapter)
|
||||
goto error;
|
||||
|
||||
cur_pnetdev = padapter->pnetdev;
|
||||
rereg_priv = &padapter->rereg_nd_name_priv;
|
||||
|
||||
/* free the old_pnetdev */
|
||||
if (rereg_priv->old_pnetdev) {
|
||||
free_netdev(rereg_priv->old_pnetdev);
|
||||
rereg_priv->old_pnetdev = NULL;
|
||||
}
|
||||
|
||||
if (!rtnl_is_locked())
|
||||
unregister_netdev(cur_pnetdev);
|
||||
else
|
||||
unregister_netdevice(cur_pnetdev);
|
||||
|
||||
rtw_proc_remove_one(cur_pnetdev);
|
||||
|
||||
rereg_priv->old_pnetdev = cur_pnetdev;
|
||||
|
||||
pnetdev = rtw_init_netdev(padapter);
|
||||
if (!pnetdev) {
|
||||
ret = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
SET_NETDEV_DEV(pnetdev, dvobj_to_dev(adapter_to_dvobj(padapter)));
|
||||
|
||||
rtw_init_netdev_name(pnetdev, ifname);
|
||||
|
||||
memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
|
||||
|
||||
if (!rtnl_is_locked())
|
||||
ret = register_netdev(pnetdev);
|
||||
else
|
||||
ret = register_netdevice(pnetdev);
|
||||
if (ret != 0) {
|
||||
RT_TRACE(_module_hci_intfs_c_, _drv_err_,
|
||||
("register_netdev() failed\n"));
|
||||
goto error;
|
||||
}
|
||||
rtw_proc_init_one(pnetdev);
|
||||
return 0;
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
u64 rtw_modular64(u64 x, u64 y)
|
||||
{
|
||||
return do_div(x, y);
|
||||
}
|
||||
|
||||
u64 rtw_division64(u64 x, u64 y)
|
||||
{
|
||||
do_div(x, y);
|
||||
return x;
|
||||
}
|
||||
|
||||
void rtw_buf_free(u8 **buf, u32 *buf_len)
|
||||
{
|
||||
*buf_len = 0;
|
||||
|
@ -525,89 +163,3 @@ keep_ori:
|
|||
/* free ori */
|
||||
kfree(ori);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* rtw_cbuf_full - test if cbuf is full
|
||||
* @cbuf: pointer of struct rtw_cbuf
|
||||
*
|
||||
* Returns: true if cbuf is full
|
||||
*/
|
||||
inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)
|
||||
{
|
||||
return (cbuf->write == cbuf->read-1) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* rtw_cbuf_empty - test if cbuf is empty
|
||||
* @cbuf: pointer of struct rtw_cbuf
|
||||
*
|
||||
* Returns: true if cbuf is empty
|
||||
*/
|
||||
inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
|
||||
{
|
||||
return (cbuf->write == cbuf->read) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* rtw_cbuf_push - push a pointer into cbuf
|
||||
* @cbuf: pointer of struct rtw_cbuf
|
||||
* @buf: pointer to push in
|
||||
*
|
||||
* Lock free operation, be careful of the use scheme
|
||||
* Returns: true push success
|
||||
*/
|
||||
bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)
|
||||
{
|
||||
if (rtw_cbuf_full(cbuf))
|
||||
return _FAIL;
|
||||
|
||||
if (0)
|
||||
DBG_88E("%s on %u\n", __func__, cbuf->write);
|
||||
cbuf->bufs[cbuf->write] = buf;
|
||||
cbuf->write = (cbuf->write+1)%cbuf->size;
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* rtw_cbuf_pop - pop a pointer from cbuf
|
||||
* @cbuf: pointer of struct rtw_cbuf
|
||||
*
|
||||
* Lock free operation, be careful of the use scheme
|
||||
* Returns: pointer popped out
|
||||
*/
|
||||
void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
|
||||
{
|
||||
void *buf;
|
||||
if (rtw_cbuf_empty(cbuf))
|
||||
return NULL;
|
||||
|
||||
if (0)
|
||||
DBG_88E("%s on %u\n", __func__, cbuf->read);
|
||||
buf = cbuf->bufs[cbuf->read];
|
||||
cbuf->read = (cbuf->read+1)%cbuf->size;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* rtw_cbuf_alloc - allocate a rtw_cbuf with given size and do initialization
|
||||
* @size: size of pointer
|
||||
*
|
||||
* Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
|
||||
*/
|
||||
struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
|
||||
{
|
||||
struct rtw_cbuf *cbuf;
|
||||
|
||||
cbuf = (struct rtw_cbuf *)rtw_malloc(sizeof(*cbuf) +
|
||||
sizeof(void *)*size);
|
||||
|
||||
if (cbuf) {
|
||||
cbuf->write = 0;
|
||||
cbuf->read = 0;
|
||||
cbuf->size = size;
|
||||
}
|
||||
return cbuf;
|
||||
}
|
||||
|
|
|
@ -26,61 +26,31 @@
|
|||
#include <recv_osdep.h>
|
||||
|
||||
#include <osdep_intf.h>
|
||||
#include <ethernet.h>
|
||||
#include <usb_ops.h>
|
||||
#include <usb_ops_linux.h>
|
||||
|
||||
/* init os related resource in struct recv_priv */
|
||||
int rtw_os_recv_resource_init(struct recv_priv *precvpriv,
|
||||
struct adapter *padapter)
|
||||
{
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
/* alloc os related resource in union recv_frame */
|
||||
/* alloc os related resource in struct recv_frame */
|
||||
int rtw_os_recv_resource_alloc(struct adapter *padapter,
|
||||
union recv_frame *precvframe)
|
||||
struct recv_frame *precvframe)
|
||||
{
|
||||
precvframe->u.hdr.pkt_newalloc = NULL;
|
||||
precvframe->u.hdr.pkt = NULL;
|
||||
precvframe->pkt_newalloc = NULL;
|
||||
precvframe->pkt = NULL;
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
/* free os related resource in union recv_frame */
|
||||
void rtw_os_recv_resource_free(struct recv_priv *precvpriv)
|
||||
{
|
||||
}
|
||||
|
||||
/* alloc os related resource in struct recv_buf */
|
||||
int rtw_os_recvbuf_resource_alloc(struct adapter *padapter,
|
||||
struct recv_buf *precvbuf)
|
||||
{
|
||||
int res = _SUCCESS;
|
||||
|
||||
precvbuf->irp_pending = false;
|
||||
precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (precvbuf->purb == NULL)
|
||||
res = _FAIL;
|
||||
precvbuf->pskb = NULL;
|
||||
precvbuf->reuse = false;
|
||||
precvbuf->pallocated_buf = NULL;
|
||||
precvbuf->pbuf = NULL;
|
||||
precvbuf->pdata = NULL;
|
||||
precvbuf->phead = NULL;
|
||||
precvbuf->ptail = NULL;
|
||||
precvbuf->pend = NULL;
|
||||
precvbuf->transfer_len = 0;
|
||||
precvbuf->len = 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
/* free os related resource in struct recv_buf */
|
||||
int rtw_os_recvbuf_resource_free(struct adapter *padapter,
|
||||
struct recv_buf *precvbuf)
|
||||
{
|
||||
usb_free_urb(precvbuf->purb);
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup)
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
|
@ -90,20 +60,20 @@ void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup)
|
|||
u32 cur_time = 0;
|
||||
|
||||
if (psecuritypriv->last_mic_err_time == 0) {
|
||||
psecuritypriv->last_mic_err_time = rtw_get_current_time();
|
||||
psecuritypriv->last_mic_err_time = jiffies;
|
||||
} else {
|
||||
cur_time = rtw_get_current_time();
|
||||
cur_time = jiffies;
|
||||
|
||||
if (cur_time - psecuritypriv->last_mic_err_time < 60*HZ) {
|
||||
psecuritypriv->btkip_countermeasure = true;
|
||||
psecuritypriv->last_mic_err_time = 0;
|
||||
psecuritypriv->btkip_countermeasure_time = cur_time;
|
||||
} else {
|
||||
psecuritypriv->last_mic_err_time = rtw_get_current_time();
|
||||
psecuritypriv->last_mic_err_time = jiffies;
|
||||
}
|
||||
}
|
||||
|
||||
_rtw_memset(&ev, 0x00, sizeof(ev));
|
||||
memset(&ev, 0x00, sizeof(ev));
|
||||
if (bgroup)
|
||||
ev.flags |= IW_MICFAILURE_GROUP;
|
||||
else
|
||||
|
@ -111,31 +81,25 @@ void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup)
|
|||
|
||||
ev.src_addr.sa_family = ARPHRD_ETHER;
|
||||
memcpy(ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[0], ETH_ALEN);
|
||||
_rtw_memset(&wrqu, 0x00, sizeof(wrqu));
|
||||
memset(&wrqu, 0x00, sizeof(wrqu));
|
||||
wrqu.data.length = sizeof(ev);
|
||||
wireless_send_event(padapter->pnetdev, IWEVMICHAELMICFAILURE,
|
||||
&wrqu, (char *)&ev);
|
||||
}
|
||||
|
||||
void rtw_hostapd_mlme_rx(struct adapter *padapter,
|
||||
union recv_frame *precv_frame)
|
||||
{
|
||||
}
|
||||
|
||||
int rtw_recv_indicatepkt(struct adapter *padapter,
|
||||
union recv_frame *precv_frame)
|
||||
struct recv_frame *precv_frame)
|
||||
{
|
||||
struct recv_priv *precvpriv;
|
||||
struct __queue *pfree_recv_queue;
|
||||
struct sk_buff *skb;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
precvpriv = &(padapter->recvpriv);
|
||||
pfree_recv_queue = &(precvpriv->free_recv_queue);
|
||||
|
||||
skb = precv_frame->u.hdr.pkt;
|
||||
skb = precv_frame->pkt;
|
||||
if (skb == NULL) {
|
||||
RT_TRACE(_module_recv_osdep_c_, _drv_err_,
|
||||
("rtw_recv_indicatepkt():skb == NULL something wrong!!!!\n"));
|
||||
|
@ -145,18 +109,18 @@ _func_enter_;
|
|||
RT_TRACE(_module_recv_osdep_c_, _drv_info_,
|
||||
("rtw_recv_indicatepkt():skb != NULL !!!\n"));
|
||||
RT_TRACE(_module_recv_osdep_c_, _drv_info_,
|
||||
("rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head =%p precv_frame->hdr.rx_data =%p\n",
|
||||
precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data));
|
||||
("rtw_recv_indicatepkt():precv_frame->rx_head =%p precv_frame->hdr.rx_data =%p\n",
|
||||
precv_frame->rx_head, precv_frame->rx_data));
|
||||
RT_TRACE(_module_recv_osdep_c_, _drv_info_,
|
||||
("precv_frame->hdr.rx_tail =%p precv_frame->u.hdr.rx_end =%p precv_frame->hdr.len =%d\n",
|
||||
precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end,
|
||||
precv_frame->u.hdr.len));
|
||||
("precv_frame->hdr.rx_tail =%p precv_frame->rx_end =%p precv_frame->hdr.len =%d\n",
|
||||
precv_frame->rx_tail, precv_frame->rx_end,
|
||||
precv_frame->len));
|
||||
|
||||
skb->data = precv_frame->u.hdr.rx_data;
|
||||
skb->data = precv_frame->rx_data;
|
||||
|
||||
skb_set_tail_pointer(skb, precv_frame->u.hdr.len);
|
||||
skb_set_tail_pointer(skb, precv_frame->len);
|
||||
|
||||
skb->len = precv_frame->u.hdr.len;
|
||||
skb->len = precv_frame->len;
|
||||
|
||||
RT_TRACE(_module_recv_osdep_c_, _drv_info_,
|
||||
("skb->head =%p skb->data =%p skb->tail =%p skb->end =%p skb->len =%d\n",
|
||||
|
@ -167,11 +131,11 @@ _func_enter_;
|
|||
struct sk_buff *pskb2 = NULL;
|
||||
struct sta_info *psta = NULL;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
|
||||
struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
|
||||
int bmcast = IS_MCAST(pattrib->dst);
|
||||
|
||||
if (!_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv),
|
||||
ETH_ALEN)) {
|
||||
if (memcmp(pattrib->dst, myid(&padapter->eeprompriv),
|
||||
ETH_ALEN)) {
|
||||
if (bmcast) {
|
||||
psta = rtw_get_bcmc_stainfo(padapter);
|
||||
pskb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
|
@ -197,11 +161,7 @@ _func_enter_;
|
|||
}
|
||||
|
||||
rcu_read_lock();
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
|
||||
rcu_dereference(padapter->pnetdev->rx_handler_data);
|
||||
#else
|
||||
rcu_dereference(padapter->pnetdev->br_port);
|
||||
#endif
|
||||
rcu_read_unlock();
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
@ -213,51 +173,27 @@ _func_enter_;
|
|||
_recv_indicatepkt_end:
|
||||
|
||||
/* pointers to NULL before rtw_free_recvframe() */
|
||||
precv_frame->u.hdr.pkt = NULL;
|
||||
precv_frame->pkt = NULL;
|
||||
|
||||
rtw_free_recvframe(precv_frame, pfree_recv_queue);
|
||||
|
||||
RT_TRACE(_module_recv_osdep_c_, _drv_info_,
|
||||
("\n rtw_recv_indicatepkt :after netif_rx!!!!\n"));
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return _SUCCESS;
|
||||
|
||||
_recv_indicatepkt_drop:
|
||||
|
||||
/* enqueue back to free_recv_queue */
|
||||
rtw_free_recvframe(precv_frame, pfree_recv_queue);
|
||||
rtw_free_recvframe(precv_frame, pfree_recv_queue);
|
||||
|
||||
_func_exit_;
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
void rtw_os_read_port(struct adapter *padapter, struct recv_buf *precvbuf)
|
||||
{
|
||||
struct recv_priv *precvpriv = &padapter->recvpriv;
|
||||
|
||||
precvbuf->ref_cnt--;
|
||||
/* free skb in recv_buf */
|
||||
dev_kfree_skb_any(precvbuf->pskb);
|
||||
precvbuf->pskb = NULL;
|
||||
precvbuf->reuse = false;
|
||||
if (!precvbuf->irp_pending)
|
||||
rtw_read_port(padapter, precvpriv->ff_hwaddr, 0,
|
||||
(unsigned char *)precvbuf);
|
||||
}
|
||||
|
||||
static void _rtw_reordering_ctrl_timeout_handler(void *func_context)
|
||||
{
|
||||
struct recv_reorder_ctrl *preorder_ctrl;
|
||||
|
||||
preorder_ctrl = (struct recv_reorder_ctrl *)func_context;
|
||||
rtw_reordering_ctrl_timeout_handler(preorder_ctrl);
|
||||
}
|
||||
|
||||
void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)
|
||||
{
|
||||
struct adapter *padapter = preorder_ctrl->padapter;
|
||||
|
||||
_init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl);
|
||||
_init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, rtw_reordering_ctrl_timeout_handler, preorder_ctrl);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <rtw_android.h>
|
||||
#include <osdep_service.h>
|
||||
#include <rtw_debug.h>
|
||||
#include <ioctl_cfg80211.h>
|
||||
#include <rtw_ioctl_set.h>
|
||||
|
||||
static const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
|
||||
|
@ -80,7 +79,7 @@ int rtw_android_cmdstr_to_num(char *cmdstr)
|
|||
{
|
||||
int cmd_num;
|
||||
for (cmd_num = 0; cmd_num < ANDROID_WIFI_CMD_MAX; cmd_num++)
|
||||
if (0 == strnicmp(cmdstr , android_wifi_cmd_str[cmd_num],
|
||||
if (0 == strncasecmp(cmdstr , android_wifi_cmd_str[cmd_num],
|
||||
strlen(android_wifi_cmd_str[cmd_num])))
|
||||
break;
|
||||
return cmd_num;
|
||||
|
@ -107,23 +106,18 @@ static int rtw_android_get_link_speed(struct net_device *net, char *command,
|
|||
int total_len)
|
||||
{
|
||||
struct adapter *padapter = (struct adapter *)rtw_netdev_priv(net);
|
||||
int bytes_written;
|
||||
u16 link_speed;
|
||||
|
||||
link_speed = rtw_get_cur_max_rate(padapter) / 10;
|
||||
bytes_written = snprintf(command, total_len, "LinkSpeed %d",
|
||||
return snprintf(command, total_len, "LinkSpeed %d",
|
||||
link_speed);
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
static int rtw_android_get_macaddr(struct net_device *net, char *command,
|
||||
int total_len)
|
||||
{
|
||||
int bytes_written;
|
||||
|
||||
bytes_written = snprintf(command, total_len, "Macaddr = %pM",
|
||||
return snprintf(command, total_len, "Macaddr = %pM",
|
||||
net->dev_addr);
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
static int android_set_cntry(struct net_device *net, char *command,
|
||||
|
@ -154,37 +148,21 @@ static int rtw_android_set_block(struct net_device *net, char *command,
|
|||
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
char *command = NULL;
|
||||
char *command;
|
||||
int cmd_num;
|
||||
int bytes_written = 0;
|
||||
struct android_wifi_priv_cmd priv_cmd;
|
||||
|
||||
rtw_lock_suspend();
|
||||
if (!ifr->ifr_data) {
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
if (copy_from_user(&priv_cmd, ifr->ifr_data,
|
||||
sizeof(struct android_wifi_priv_cmd))) {
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
command = kmalloc(priv_cmd.total_len, GFP_KERNEL);
|
||||
if (!command) {
|
||||
DBG_88E("%s: failed to allocate memory\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {
|
||||
DBG_88E("%s: failed to access memory\n", __func__);
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
if (copy_from_user(command, (char __user *)priv_cmd.buf,
|
||||
priv_cmd.total_len)) {
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
if (!ifr->ifr_data)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(priv_cmd)))
|
||||
return -EFAULT;
|
||||
if (priv_cmd.total_len < 1)
|
||||
return -EINVAL;
|
||||
command = memdup_user(priv_cmd.buf, priv_cmd.total_len);
|
||||
if (IS_ERR(command))
|
||||
return PTR_ERR(command);
|
||||
command[priv_cmd.total_len - 1] = 0;
|
||||
DBG_88E("%s: Android private cmd \"%s\" on %s\n",
|
||||
__func__, command, ifr->ifr_name);
|
||||
cmd_num = rtw_android_cmdstr_to_num(command);
|
||||
|
@ -198,7 +176,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
|||
DBG_88E("%s: Ignore private cmd \"%s\" - iface %s is down\n",
|
||||
__func__, command, ifr->ifr_name);
|
||||
ret = 0;
|
||||
goto exit;
|
||||
goto free;
|
||||
}
|
||||
switch (cmd_num) {
|
||||
case ANDROID_WIFI_CMD_STOP:
|
||||
|
@ -286,8 +264,7 @@ response:
|
|||
} else {
|
||||
ret = bytes_written;
|
||||
}
|
||||
exit:
|
||||
rtw_unlock_suspend();
|
||||
free:
|
||||
kfree(command);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -24,26 +24,16 @@
|
|||
#include <recv_osdep.h>
|
||||
#include <xmit_osdep.h>
|
||||
#include <hal_intf.h>
|
||||
#include <rtw_version.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <osdep_intf.h>
|
||||
|
||||
#include <usb_vendor_req.h>
|
||||
#include <usb_ops.h>
|
||||
#include <usb_osintf.h>
|
||||
#include <usb_ops_linux.h>
|
||||
#include <usb_hal.h>
|
||||
#include <rtw_ioctl.h>
|
||||
|
||||
int ui_pid[3] = {0, 0, 0};
|
||||
|
||||
static int rtw_suspend(struct usb_interface *intf, pm_message_t message);
|
||||
static int rtw_resume(struct usb_interface *intf);
|
||||
|
||||
|
||||
static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid);
|
||||
static void rtw_dev_remove(struct usb_interface *pusb_intf);
|
||||
|
||||
|
||||
#define USB_VENDER_ID_REALTEK 0x0bda
|
||||
|
||||
/* DID_USB_v916_20130116 */
|
||||
|
@ -53,105 +43,16 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
|
|||
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
|
||||
/*=== Customer ID ===*/
|
||||
/****** 8188EUS ********/
|
||||
{USB_DEVICE(0x07B8, 0x8179)}, /* Abocom - Abocom */
|
||||
{USB_DEVICE(0x0DF6, 0x0076)}, /* Sitecom N150 v2 */
|
||||
{USB_DEVICE(0x056e, 0x4008)}, /* Elecom WDC-150SU2M */
|
||||
{USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */
|
||||
{USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
|
||||
{USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
|
||||
{USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */
|
||||
{USB_DEVICE(0x056E, 0x4008)}, /* Elecom WDC-150SU2M */
|
||||
{USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
|
||||
{USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl);
|
||||
|
||||
static struct specific_device_id specific_device_id_tbl[] = {
|
||||
{} /* empty table for now */
|
||||
};
|
||||
|
||||
struct rtw_usb_drv {
|
||||
struct usb_driver usbdrv;
|
||||
int drv_registered;
|
||||
struct mutex hw_init_mutex;
|
||||
};
|
||||
|
||||
static struct rtw_usb_drv rtl8188e_usb_drv = {
|
||||
.usbdrv.name = (char *)"r8188eu",
|
||||
.usbdrv.probe = rtw_drv_init,
|
||||
.usbdrv.disconnect = rtw_dev_remove,
|
||||
.usbdrv.id_table = rtw_usb_id_tbl,
|
||||
.usbdrv.suspend = rtw_suspend,
|
||||
.usbdrv.resume = rtw_resume,
|
||||
.usbdrv.reset_resume = rtw_resume,
|
||||
};
|
||||
|
||||
static struct rtw_usb_drv *usb_drv = &rtl8188e_usb_drv;
|
||||
|
||||
static inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN;
|
||||
}
|
||||
|
||||
static inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT;
|
||||
}
|
||||
|
||||
static inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT;
|
||||
}
|
||||
|
||||
static inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK;
|
||||
}
|
||||
|
||||
static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd);
|
||||
}
|
||||
|
||||
static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd);
|
||||
}
|
||||
|
||||
static inline int usb_endpoint_is_int(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd);
|
||||
}
|
||||
|
||||
static inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
|
||||
{
|
||||
return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
|
||||
}
|
||||
|
||||
static u8 rtw_init_intf_priv(struct dvobj_priv *dvobj)
|
||||
{
|
||||
u8 rst = _SUCCESS;
|
||||
|
||||
_rtw_mutex_init(&dvobj->usb_vendor_req_mutex);
|
||||
|
||||
dvobj->usb_alloc_vendor_req_buf = rtw_zmalloc(MAX_USB_IO_CTL_SIZE);
|
||||
if (dvobj->usb_alloc_vendor_req_buf == NULL) {
|
||||
DBG_88E("alloc usb_vendor_req_buf failed... /n");
|
||||
rst = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
dvobj->usb_vendor_req_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(dvobj->usb_alloc_vendor_req_buf), ALIGNMENT_UNIT);
|
||||
exit:
|
||||
return rst;
|
||||
}
|
||||
|
||||
static u8 rtw_deinit_intf_priv(struct dvobj_priv *dvobj)
|
||||
{
|
||||
u8 rst = _SUCCESS;
|
||||
|
||||
kfree(dvobj->usb_alloc_vendor_req_buf);
|
||||
_rtw_mutex_free(&dvobj->usb_vendor_req_mutex);
|
||||
return rst;
|
||||
}
|
||||
|
||||
static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf)
|
||||
{
|
||||
int i;
|
||||
|
@ -165,9 +66,8 @@ static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf)
|
|||
struct usb_endpoint_descriptor *pendp_desc;
|
||||
struct usb_device *pusbd;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
pdvobjpriv = (struct dvobj_priv *)rtw_zmalloc(sizeof(*pdvobjpriv));
|
||||
pdvobjpriv = kzalloc(sizeof(*pdvobjpriv), GFP_KERNEL);
|
||||
if (pdvobjpriv == NULL)
|
||||
goto exit;
|
||||
|
||||
|
@ -190,62 +90,37 @@ _func_enter_;
|
|||
pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints;
|
||||
|
||||
for (i = 0; i < pdvobjpriv->nr_endpoint; i++) {
|
||||
int ep_num;
|
||||
phost_endp = phost_iface->endpoint + i;
|
||||
|
||||
if (phost_endp) {
|
||||
pendp_desc = &phost_endp->desc;
|
||||
ep_num = usb_endpoint_num(pendp_desc);
|
||||
|
||||
DBG_88E("\nusb_endpoint_descriptor(%d):\n", i);
|
||||
DBG_88E("bLength=%x\n", pendp_desc->bLength);
|
||||
DBG_88E("bDescriptorType=%x\n",
|
||||
pendp_desc->bDescriptorType);
|
||||
DBG_88E("bEndpointAddress=%x\n",
|
||||
pendp_desc->bEndpointAddress);
|
||||
DBG_88E("wMaxPacketSize=%d\n",
|
||||
le16_to_cpu(pendp_desc->wMaxPacketSize));
|
||||
DBG_88E("bInterval=%x\n", pendp_desc->bInterval);
|
||||
|
||||
if (RT_usb_endpoint_is_bulk_in(pendp_desc)) {
|
||||
DBG_88E("RT_usb_endpoint_is_bulk_in = %x\n",
|
||||
RT_usb_endpoint_num(pendp_desc));
|
||||
pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = RT_usb_endpoint_num(pendp_desc);
|
||||
if (usb_endpoint_is_bulk_in(pendp_desc)) {
|
||||
pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = ep_num;
|
||||
pdvobjpriv->RtNumInPipes++;
|
||||
} else if (usb_endpoint_is_int(pendp_desc)) {
|
||||
DBG_88E("usb_endpoint_is_int = %x, Interval = %x\n",
|
||||
RT_usb_endpoint_num(pendp_desc),
|
||||
pendp_desc->bInterval);
|
||||
pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = RT_usb_endpoint_num(pendp_desc);
|
||||
} else if (usb_endpoint_is_int_in(pendp_desc)) {
|
||||
pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = ep_num;
|
||||
pdvobjpriv->RtNumInPipes++;
|
||||
} else if (RT_usb_endpoint_is_bulk_out(pendp_desc)) {
|
||||
DBG_88E("RT_usb_endpoint_is_bulk_out = %x\n",
|
||||
RT_usb_endpoint_num(pendp_desc));
|
||||
pdvobjpriv->RtOutPipe[pdvobjpriv->RtNumOutPipes] = RT_usb_endpoint_num(pendp_desc);
|
||||
} else if (usb_endpoint_is_bulk_out(pendp_desc)) {
|
||||
pdvobjpriv->RtOutPipe[pdvobjpriv->RtNumOutPipes] = ep_num;
|
||||
pdvobjpriv->RtNumOutPipes++;
|
||||
}
|
||||
pdvobjpriv->ep_num[i] = RT_usb_endpoint_num(pendp_desc);
|
||||
pdvobjpriv->ep_num[i] = ep_num;
|
||||
}
|
||||
}
|
||||
|
||||
DBG_88E("nr_endpoint=%d, in_num=%d, out_num=%d\n\n",
|
||||
pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes,
|
||||
pdvobjpriv->RtNumOutPipes);
|
||||
|
||||
if (pusbd->speed == USB_SPEED_HIGH) {
|
||||
if (pusbd->speed == USB_SPEED_HIGH)
|
||||
pdvobjpriv->ishighspeed = true;
|
||||
DBG_88E("USB_SPEED_HIGH\n");
|
||||
} else {
|
||||
else
|
||||
pdvobjpriv->ishighspeed = false;
|
||||
DBG_88E("NON USB_SPEED_HIGH\n");
|
||||
}
|
||||
|
||||
if (rtw_init_intf_priv(pdvobjpriv) == _FAIL) {
|
||||
RT_TRACE(_module_os_intfs_c_, _drv_err_,
|
||||
("\n Can't INIT rtw_init_intf_priv\n"));
|
||||
mutex_init(&pdvobjpriv->usb_vendor_req_mutex);
|
||||
pdvobjpriv->usb_vendor_req_buf = kzalloc(MAX_USB_IO_CTL_SIZE, GFP_KERNEL);
|
||||
|
||||
if (!pdvobjpriv->usb_vendor_req_buf)
|
||||
goto free_dvobj;
|
||||
}
|
||||
|
||||
/* 3 misc */
|
||||
_rtw_init_sema(&(pdvobjpriv->usb_suspend_sema), 0);
|
||||
rtw_reset_continual_urb_error(pdvobjpriv);
|
||||
|
||||
usb_get_dev(pusbd);
|
||||
|
||||
|
@ -258,7 +133,6 @@ free_dvobj:
|
|||
pdvobjpriv = NULL;
|
||||
}
|
||||
exit:
|
||||
_func_exit_;
|
||||
return pdvobjpriv;
|
||||
}
|
||||
|
||||
|
@ -266,7 +140,6 @@ static void usb_dvobj_deinit(struct usb_interface *usb_intf)
|
|||
{
|
||||
struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);
|
||||
|
||||
_func_enter_;
|
||||
|
||||
usb_set_intfdata(usb_intf, NULL);
|
||||
if (dvobj) {
|
||||
|
@ -285,20 +158,14 @@ _func_enter_;
|
|||
usb_reset_device(interface_to_usbdev(usb_intf));
|
||||
}
|
||||
}
|
||||
rtw_deinit_intf_priv(dvobj);
|
||||
|
||||
kfree(dvobj->usb_vendor_req_buf);
|
||||
mutex_destroy(&dvobj->usb_vendor_req_mutex);
|
||||
kfree(dvobj);
|
||||
}
|
||||
|
||||
usb_put_dev(interface_to_usbdev(usb_intf));
|
||||
|
||||
_func_exit_;
|
||||
}
|
||||
|
||||
static void chip_by_usb_id(struct adapter *padapter,
|
||||
const struct usb_device_id *pdid)
|
||||
{
|
||||
padapter->chip_type = NULL_CHIP_TYPE;
|
||||
hal_set_hw_type(padapter);
|
||||
}
|
||||
|
||||
static void usb_intf_start(struct adapter *padapter)
|
||||
|
@ -326,7 +193,7 @@ static void usb_intf_stop(struct adapter *padapter)
|
|||
rtw_hal_inirp_deinit(padapter);
|
||||
|
||||
/* cancel out irp */
|
||||
rtw_write_port_cancel(padapter);
|
||||
usb_write_port_cancel(padapter);
|
||||
|
||||
/* todo:cancel other irps */
|
||||
|
||||
|
@ -366,139 +233,6 @@ static void rtw_dev_unload(struct adapter *padapter)
|
|||
RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-rtw_dev_unload\n"));
|
||||
}
|
||||
|
||||
static void process_spec_devid(const struct usb_device_id *pdid)
|
||||
{
|
||||
u16 vid, pid;
|
||||
u32 flags;
|
||||
int i;
|
||||
int num = sizeof(specific_device_id_tbl) /
|
||||
sizeof(struct specific_device_id);
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
vid = specific_device_id_tbl[i].idVendor;
|
||||
pid = specific_device_id_tbl[i].idProduct;
|
||||
flags = specific_device_id_tbl[i].flags;
|
||||
|
||||
if ((pdid->idVendor == vid) && (pdid->idProduct == pid) &&
|
||||
(flags&SPEC_DEV_ID_DISABLE_HT)) {
|
||||
rtw_ht_enable = 0;
|
||||
rtw_cbw40_enable = 0;
|
||||
rtw_ampdu_enable = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int rtw_hw_suspend(struct adapter *padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
if ((!padapter->bup) || (padapter->bDriverStopped) ||
|
||||
(padapter->bSurpriseRemoved)) {
|
||||
DBG_88E("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n",
|
||||
padapter->bup, padapter->bDriverStopped,
|
||||
padapter->bSurpriseRemoved);
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
if (padapter) { /* system suspend */
|
||||
LeaveAllPowerSaveMode(padapter);
|
||||
|
||||
DBG_88E("==> rtw_hw_suspend\n");
|
||||
_enter_pwrlock(&pwrpriv->lock);
|
||||
pwrpriv->bips_processing = true;
|
||||
/* s1. */
|
||||
if (pnetdev) {
|
||||
netif_carrier_off(pnetdev);
|
||||
rtw_netif_stop_queue(pnetdev);
|
||||
}
|
||||
|
||||
/* s2. */
|
||||
rtw_disassoc_cmd(padapter, 500, false);
|
||||
|
||||
/* s2-2. indicate disconnect to os */
|
||||
{
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
_clr_fwstate_(pmlmepriv, _FW_LINKED);
|
||||
|
||||
rtw_led_control(padapter, LED_CTL_NO_LINK);
|
||||
|
||||
rtw_os_indicate_disconnect(padapter);
|
||||
|
||||
/* donnot enqueue cmd */
|
||||
rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0);
|
||||
}
|
||||
}
|
||||
/* s2-3. */
|
||||
rtw_free_assoc_resources(padapter, 1);
|
||||
|
||||
/* s2-4. */
|
||||
rtw_free_network_queue(padapter, true);
|
||||
rtw_ips_dev_unload(padapter);
|
||||
pwrpriv->rf_pwrstate = rf_off;
|
||||
pwrpriv->bips_processing = false;
|
||||
|
||||
_exit_pwrlock(&pwrpriv->lock);
|
||||
} else {
|
||||
goto error_exit;
|
||||
}
|
||||
_func_exit_;
|
||||
return 0;
|
||||
|
||||
error_exit:
|
||||
DBG_88E("%s, failed\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rtw_hw_resume(struct adapter *padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
if (padapter) { /* system resume */
|
||||
DBG_88E("==> rtw_hw_resume\n");
|
||||
_enter_pwrlock(&pwrpriv->lock);
|
||||
pwrpriv->bips_processing = true;
|
||||
rtw_reset_drv_sw(padapter);
|
||||
|
||||
if (pm_netdev_open(pnetdev, false) != 0) {
|
||||
_exit_pwrlock(&pwrpriv->lock);
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
netif_device_attach(pnetdev);
|
||||
netif_carrier_on(pnetdev);
|
||||
|
||||
if (!netif_queue_stopped(pnetdev))
|
||||
netif_start_queue(pnetdev);
|
||||
else
|
||||
netif_wake_queue(pnetdev);
|
||||
|
||||
pwrpriv->bkeepfwalive = false;
|
||||
pwrpriv->brfoffbyhw = false;
|
||||
|
||||
pwrpriv->rf_pwrstate = rf_on;
|
||||
pwrpriv->bips_processing = false;
|
||||
|
||||
_exit_pwrlock(&pwrpriv->lock);
|
||||
} else {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return 0;
|
||||
error_exit:
|
||||
DBG_88E("%s, Open net dev failed\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
|
||||
{
|
||||
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
|
||||
|
@ -508,9 +242,8 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
|
|||
struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
|
||||
|
||||
int ret = 0;
|
||||
u32 start_time = rtw_get_current_time();
|
||||
u32 start_time = jiffies;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
DBG_88E("==> %s (%s:%d)\n", __func__, current->comm, current->pid);
|
||||
|
||||
|
@ -530,7 +263,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
|
|||
/* s1. */
|
||||
if (pnetdev) {
|
||||
netif_carrier_off(pnetdev);
|
||||
rtw_netif_stop_queue(pnetdev);
|
||||
netif_tx_stop_all_queues(pnetdev);
|
||||
}
|
||||
|
||||
/* s2. */
|
||||
|
@ -567,31 +300,15 @@ exit:
|
|||
DBG_88E("<=== %s return %d.............. in %dms\n", __func__
|
||||
, ret, rtw_get_passing_time_ms(start_time));
|
||||
|
||||
_func_exit_;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_resume(struct usb_interface *pusb_intf)
|
||||
{
|
||||
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
|
||||
struct adapter *padapter = dvobj->if1;
|
||||
struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
|
||||
int ret = 0;
|
||||
|
||||
if (pwrpriv->bInternalAutoSuspend)
|
||||
ret = rtw_resume_process(padapter);
|
||||
else
|
||||
ret = rtw_resume_process(padapter);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw_resume_process(struct adapter *padapter)
|
||||
static int rtw_resume_process(struct adapter *padapter)
|
||||
{
|
||||
struct net_device *pnetdev;
|
||||
struct pwrctrl_priv *pwrpriv = NULL;
|
||||
int ret = -1;
|
||||
u32 start_time = rtw_get_current_time();
|
||||
_func_enter_;
|
||||
u32 start_time = jiffies;
|
||||
|
||||
DBG_88E("==> %s (%s:%d)\n", __func__, current->comm, current->pid);
|
||||
|
||||
|
@ -604,8 +321,7 @@ int rtw_resume_process(struct adapter *padapter)
|
|||
|
||||
_enter_pwrlock(&pwrpriv->lock);
|
||||
rtw_reset_drv_sw(padapter);
|
||||
if (pwrpriv)
|
||||
pwrpriv->bkeepfwalive = false;
|
||||
pwrpriv->bkeepfwalive = false;
|
||||
|
||||
DBG_88E("bkeepfwalive(%x)\n", pwrpriv->bkeepfwalive);
|
||||
if (pm_netdev_open(pnetdev, true) != 0)
|
||||
|
@ -630,11 +346,18 @@ exit:
|
|||
DBG_88E("<=== %s return %d.............. in %dms\n", __func__,
|
||||
ret, rtw_get_passing_time_ms(start_time));
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_resume(struct usb_interface *pusb_intf)
|
||||
{
|
||||
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
|
||||
struct adapter *padapter = dvobj->if1;
|
||||
|
||||
return rtw_resume_process(padapter);
|
||||
}
|
||||
|
||||
/*
|
||||
* drv_init() - a device potentially for us
|
||||
*
|
||||
|
@ -650,26 +373,19 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
|
|||
struct net_device *pnetdev = NULL;
|
||||
int status = _FAIL;
|
||||
|
||||
padapter = (struct adapter *)rtw_zvmalloc(sizeof(*padapter));
|
||||
padapter = (struct adapter *)vzalloc(sizeof(*padapter));
|
||||
if (padapter == NULL)
|
||||
goto exit;
|
||||
padapter->dvobj = dvobj;
|
||||
dvobj->if1 = padapter;
|
||||
|
||||
padapter->bDriverStopped = true;
|
||||
|
||||
padapter->hw_init_mutex = &usb_drv->hw_init_mutex;
|
||||
|
||||
/* step 1-1., decide the chip_type via vid/pid */
|
||||
padapter->interface_type = RTW_USB;
|
||||
chip_by_usb_id(padapter, pdid);
|
||||
|
||||
if (rtw_handle_dualmac(padapter, 1) != _SUCCESS)
|
||||
goto free_adapter;
|
||||
mutex_init(&padapter->hw_init_mutex);
|
||||
padapter->chip_type = RTL8188E;
|
||||
|
||||
pnetdev = rtw_init_netdev(padapter);
|
||||
if (pnetdev == NULL)
|
||||
goto handle_dualmac;
|
||||
goto free_adapter;
|
||||
SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj));
|
||||
padapter = rtw_netdev_priv(pnetdev);
|
||||
|
||||
|
@ -679,9 +395,6 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
|
|||
padapter->intf_start = &usb_intf_start;
|
||||
padapter->intf_stop = &usb_intf_stop;
|
||||
|
||||
/* step init_io_priv */
|
||||
rtw_init_io_priv(padapter, usb_set_intf_ops);
|
||||
|
||||
/* step read_chip_version */
|
||||
rtw_hal_read_chip_version(padapter);
|
||||
|
||||
|
@ -717,10 +430,6 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
|
|||
/* alloc dev name after read efuse. */
|
||||
rtw_init_netdev_name(pnetdev, padapter->registrypriv.ifname);
|
||||
rtw_macaddr_cfg(padapter->eeprompriv.mac_addr);
|
||||
#ifdef CONFIG_88EU_P2P
|
||||
rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr,
|
||||
padapter->eeprompriv.mac_addr);
|
||||
#endif
|
||||
memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
|
||||
DBG_88E("MAC Address from pnetdev->dev_addr = %pM\n",
|
||||
pnetdev->dev_addr);
|
||||
|
@ -743,15 +452,12 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
|
|||
free_hal_data:
|
||||
if (status != _SUCCESS)
|
||||
kfree(padapter->HalData);
|
||||
handle_dualmac:
|
||||
if (status != _SUCCESS)
|
||||
rtw_handle_dualmac(padapter, 0);
|
||||
free_adapter:
|
||||
if (status != _SUCCESS) {
|
||||
if (pnetdev)
|
||||
rtw_free_netdev(pnetdev);
|
||||
else if (padapter)
|
||||
rtw_vmfree((u8 *)padapter, sizeof(*padapter));
|
||||
vfree(padapter);
|
||||
padapter = NULL;
|
||||
}
|
||||
exit:
|
||||
|
@ -770,19 +476,16 @@ static void rtw_usb_if1_deinit(struct adapter *if1)
|
|||
free_mlme_ap_info(if1);
|
||||
#endif
|
||||
|
||||
if (if1->DriverState != DRIVER_DISAPPEAR) {
|
||||
if (pnetdev) {
|
||||
/* will call netdev_close() */
|
||||
unregister_netdev(pnetdev);
|
||||
rtw_proc_remove_one(pnetdev);
|
||||
}
|
||||
if (pnetdev) {
|
||||
/* will call netdev_close() */
|
||||
unregister_netdev(pnetdev);
|
||||
rtw_proc_remove_one(pnetdev);
|
||||
}
|
||||
rtw_cancel_all_timer(if1);
|
||||
|
||||
rtw_dev_unload(if1);
|
||||
DBG_88E("+r871xu_dev_remove, hw_init_completed=%d\n",
|
||||
if1->hw_init_completed);
|
||||
rtw_handle_dualmac(if1, 0);
|
||||
rtw_free_drv_sw(if1);
|
||||
if (pnetdev)
|
||||
rtw_free_netdev(pnetdev);
|
||||
|
@ -791,14 +494,11 @@ static void rtw_usb_if1_deinit(struct adapter *if1)
|
|||
static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid)
|
||||
{
|
||||
struct adapter *if1 = NULL;
|
||||
int status;
|
||||
int status = _FAIL;
|
||||
struct dvobj_priv *dvobj;
|
||||
|
||||
RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n"));
|
||||
|
||||
/* step 0. */
|
||||
process_spec_devid(pdid);
|
||||
|
||||
/* Initialize dvobj_priv */
|
||||
dvobj = usb_dvobj_init(pusb_intf);
|
||||
if (dvobj == NULL) {
|
||||
|
@ -822,8 +522,6 @@ static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device
|
|||
|
||||
status = _SUCCESS;
|
||||
|
||||
if (status != _SUCCESS && if1)
|
||||
rtw_usb_if1_deinit(if1);
|
||||
free_dvobj:
|
||||
if (status != _SUCCESS)
|
||||
usb_dvobj_deinit(pusb_intf);
|
||||
|
@ -840,12 +538,11 @@ static void rtw_dev_remove(struct usb_interface *pusb_intf)
|
|||
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
|
||||
struct adapter *padapter = dvobj->if1;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
DBG_88E("+rtw_dev_remove\n");
|
||||
RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+dev_remove()\n"));
|
||||
|
||||
if (usb_drv->drv_registered)
|
||||
if (!pusb_intf->unregistering)
|
||||
padapter->bSurpriseRemoved = true;
|
||||
|
||||
rtw_pm_set_ips(padapter, IPS_NONE);
|
||||
|
@ -859,38 +556,16 @@ _func_enter_;
|
|||
|
||||
RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-dev_remove()\n"));
|
||||
DBG_88E("-r871xu_dev_remove, done\n");
|
||||
_func_exit_;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int __init rtw_drv_entry(void)
|
||||
{
|
||||
RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_entry\n"));
|
||||
static struct usb_driver rtl8188e_usb_drv = {
|
||||
.name = "r8188eu",
|
||||
.probe = rtw_drv_init,
|
||||
.disconnect = rtw_dev_remove,
|
||||
.id_table = rtw_usb_id_tbl,
|
||||
.suspend = rtw_suspend,
|
||||
.resume = rtw_resume,
|
||||
.reset_resume = rtw_resume,
|
||||
};
|
||||
|
||||
DBG_88E(DRV_NAME " driver version=%s\n", DRIVERVERSION);
|
||||
|
||||
rtw_suspend_lock_init();
|
||||
|
||||
_rtw_mutex_init(&usb_drv->hw_init_mutex);
|
||||
|
||||
usb_drv->drv_registered = true;
|
||||
return usb_register(&usb_drv->usbdrv);
|
||||
}
|
||||
|
||||
static void __exit rtw_drv_halt(void)
|
||||
{
|
||||
RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_halt\n"));
|
||||
DBG_88E("+rtw_drv_halt\n");
|
||||
|
||||
rtw_suspend_lock_uninit();
|
||||
|
||||
usb_drv->drv_registered = false;
|
||||
usb_deregister(&usb_drv->usbdrv);
|
||||
|
||||
_rtw_mutex_free(&usb_drv->hw_init_mutex);
|
||||
DBG_88E("-rtw_drv_halt\n");
|
||||
}
|
||||
|
||||
module_init(rtw_drv_entry);
|
||||
module_exit(rtw_drv_halt);
|
||||
module_usb_driver(rtl8188e_usb_drv)
|
||||
|
|
|
@ -19,9 +19,197 @@
|
|||
#define _USB_OPS_LINUX_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
#include <usb_ops_linux.h>
|
||||
#include <recv_osdep.h>
|
||||
#include <rtw_sreset.h>
|
||||
|
||||
static void interrupt_handler_8188eu(struct adapter *adapt, u16 pkt_len, u8 *pbuf)
|
||||
{
|
||||
struct hal_data_8188e *haldata = GET_HAL_DATA(adapt);
|
||||
|
||||
if (pkt_len != INTERRUPT_MSG_FORMAT_LEN) {
|
||||
DBG_88E("%s Invalid interrupt content length (%d)!\n", __func__, pkt_len);
|
||||
return;
|
||||
}
|
||||
|
||||
/* HISR */
|
||||
memcpy(&(haldata->IntArray[0]), &(pbuf[USB_INTR_CONTENT_HISR_OFFSET]), 4);
|
||||
memcpy(&(haldata->IntArray[1]), &(pbuf[USB_INTR_CONTENT_HISRE_OFFSET]), 4);
|
||||
|
||||
/* C2H Event */
|
||||
if (pbuf[0] != 0)
|
||||
memcpy(&(haldata->C2hArray[0]), &(pbuf[USB_INTR_CONTENT_C2H_OFFSET]), 16);
|
||||
}
|
||||
|
||||
static int recvbuf2recvframe(struct adapter *adapt, struct sk_buff *pskb)
|
||||
{
|
||||
u8 *pbuf;
|
||||
u8 shift_sz = 0;
|
||||
u16 pkt_cnt;
|
||||
u32 pkt_offset, skb_len, alloc_sz;
|
||||
s32 transfer_len;
|
||||
struct recv_stat *prxstat;
|
||||
struct phy_stat *pphy_status = NULL;
|
||||
struct sk_buff *pkt_copy = NULL;
|
||||
struct recv_frame *precvframe = NULL;
|
||||
struct rx_pkt_attrib *pattrib = NULL;
|
||||
struct hal_data_8188e *haldata = GET_HAL_DATA(adapt);
|
||||
struct recv_priv *precvpriv = &adapt->recvpriv;
|
||||
struct __queue *pfree_recv_queue = &precvpriv->free_recv_queue;
|
||||
|
||||
transfer_len = (s32)pskb->len;
|
||||
pbuf = pskb->data;
|
||||
|
||||
prxstat = (struct recv_stat *)pbuf;
|
||||
pkt_cnt = (le32_to_cpu(prxstat->rxdw2) >> 16) & 0xff;
|
||||
|
||||
do {
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
|
||||
("recvbuf2recvframe: rxdesc=offsset 0:0x%08x, 4:0x%08x, 8:0x%08x, C:0x%08x\n",
|
||||
prxstat->rxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4));
|
||||
|
||||
prxstat = (struct recv_stat *)pbuf;
|
||||
|
||||
precvframe = rtw_alloc_recvframe(pfree_recv_queue);
|
||||
if (precvframe == NULL) {
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("recvbuf2recvframe: precvframe==NULL\n"));
|
||||
DBG_88E("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __func__, __LINE__);
|
||||
goto _exit_recvbuf2recvframe;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&precvframe->list);
|
||||
precvframe->len = 0;
|
||||
|
||||
update_recvframe_attrib_88e(precvframe, prxstat);
|
||||
|
||||
pattrib = &precvframe->attrib;
|
||||
|
||||
if ((pattrib->crc_err) || (pattrib->icv_err)) {
|
||||
DBG_88E("%s: RX Warning! crc_err=%d icv_err=%d, skip!\n", __func__, pattrib->crc_err, pattrib->icv_err);
|
||||
|
||||
rtw_free_recvframe(precvframe, pfree_recv_queue);
|
||||
goto _exit_recvbuf2recvframe;
|
||||
}
|
||||
|
||||
if ((pattrib->physt) && (pattrib->pkt_rpt_type == NORMAL_RX))
|
||||
pphy_status = (struct phy_stat *)(pbuf + RXDESC_OFFSET);
|
||||
|
||||
pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len;
|
||||
|
||||
if ((pattrib->pkt_len <= 0) || (pkt_offset > transfer_len)) {
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recvbuf2recvframe: pkt_len<=0\n"));
|
||||
DBG_88E("%s()-%d: RX Warning!,pkt_len<=0 or pkt_offset> transfoer_len\n", __func__, __LINE__);
|
||||
rtw_free_recvframe(precvframe, pfree_recv_queue);
|
||||
goto _exit_recvbuf2recvframe;
|
||||
}
|
||||
|
||||
/* Modified by Albert 20101213 */
|
||||
/* For 8 bytes IP header alignment. */
|
||||
if (pattrib->qos) /* Qos data, wireless lan header length is 26 */
|
||||
shift_sz = 6;
|
||||
else
|
||||
shift_sz = 0;
|
||||
|
||||
skb_len = pattrib->pkt_len;
|
||||
|
||||
/* for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. */
|
||||
/* modify alloc_sz for recvive crc error packet by thomas 2011-06-02 */
|
||||
if ((pattrib->mfrag == 1) && (pattrib->frag_num == 0)) {
|
||||
if (skb_len <= 1650)
|
||||
alloc_sz = 1664;
|
||||
else
|
||||
alloc_sz = skb_len + 14;
|
||||
} else {
|
||||
alloc_sz = skb_len;
|
||||
/* 6 is for IP header 8 bytes alignment in QoS packet case. */
|
||||
/* 8 is for skb->data 4 bytes alignment. */
|
||||
alloc_sz += 14;
|
||||
}
|
||||
|
||||
pkt_copy = netdev_alloc_skb(adapt->pnetdev, alloc_sz);
|
||||
if (pkt_copy) {
|
||||
pkt_copy->dev = adapt->pnetdev;
|
||||
precvframe->pkt = pkt_copy;
|
||||
precvframe->rx_head = pkt_copy->data;
|
||||
precvframe->rx_end = pkt_copy->data + alloc_sz;
|
||||
skb_reserve(pkt_copy, 8 - ((size_t)(pkt_copy->data) & 7));/* force pkt_copy->data at 8-byte alignment address */
|
||||
skb_reserve(pkt_copy, shift_sz);/* force ip_hdr at 8-byte alignment address according to shift_sz. */
|
||||
memcpy(pkt_copy->data, (pbuf + pattrib->drvinfo_sz + RXDESC_SIZE), skb_len);
|
||||
precvframe->rx_tail = pkt_copy->data;
|
||||
precvframe->rx_data = pkt_copy->data;
|
||||
} else {
|
||||
if ((pattrib->mfrag == 1) && (pattrib->frag_num == 0)) {
|
||||
DBG_88E("recvbuf2recvframe: alloc_skb fail , drop frag frame\n");
|
||||
rtw_free_recvframe(precvframe, pfree_recv_queue);
|
||||
goto _exit_recvbuf2recvframe;
|
||||
}
|
||||
precvframe->pkt = skb_clone(pskb, GFP_ATOMIC);
|
||||
if (precvframe->pkt) {
|
||||
precvframe->rx_tail = pbuf + pattrib->drvinfo_sz + RXDESC_SIZE;
|
||||
precvframe->rx_head = precvframe->rx_tail;
|
||||
precvframe->rx_data = precvframe->rx_tail;
|
||||
precvframe->rx_end = pbuf + pattrib->drvinfo_sz + RXDESC_SIZE + alloc_sz;
|
||||
} else {
|
||||
DBG_88E("recvbuf2recvframe: skb_clone fail\n");
|
||||
rtw_free_recvframe(precvframe, pfree_recv_queue);
|
||||
goto _exit_recvbuf2recvframe;
|
||||
}
|
||||
}
|
||||
|
||||
recvframe_put(precvframe, skb_len);
|
||||
|
||||
switch (haldata->UsbRxAggMode) {
|
||||
case USB_RX_AGG_DMA:
|
||||
case USB_RX_AGG_MIX:
|
||||
pkt_offset = (u16)round_up(pkt_offset, 128);
|
||||
break;
|
||||
case USB_RX_AGG_USB:
|
||||
pkt_offset = (u16)round_up(pkt_offset, 4);
|
||||
break;
|
||||
case USB_RX_AGG_DISABLE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (pattrib->pkt_rpt_type == NORMAL_RX) { /* Normal rx packet */
|
||||
if (pattrib->physt)
|
||||
update_recvframe_phyinfo_88e(precvframe, (struct phy_stat *)pphy_status);
|
||||
if (rtw_recv_entry(precvframe) != _SUCCESS) {
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
|
||||
("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n"));
|
||||
}
|
||||
} else {
|
||||
/* enqueue recvframe to txrtp queue */
|
||||
if (pattrib->pkt_rpt_type == TX_REPORT1) {
|
||||
/* CCX-TXRPT ack for xmit mgmt frames. */
|
||||
handle_txrpt_ccx_88e(adapt, precvframe->rx_data);
|
||||
} else if (pattrib->pkt_rpt_type == TX_REPORT2) {
|
||||
ODM_RA_TxRPT2Handle_8188E(
|
||||
&haldata->odmpriv,
|
||||
precvframe->rx_data,
|
||||
pattrib->pkt_len,
|
||||
pattrib->MacIDValidEntry[0],
|
||||
pattrib->MacIDValidEntry[1]
|
||||
);
|
||||
} else if (pattrib->pkt_rpt_type == HIS_REPORT) {
|
||||
interrupt_handler_8188eu(adapt, pattrib->pkt_len, precvframe->rx_data);
|
||||
}
|
||||
rtw_free_recvframe(precvframe, pfree_recv_queue);
|
||||
}
|
||||
pkt_cnt--;
|
||||
transfer_len -= pkt_offset;
|
||||
pbuf += pkt_offset;
|
||||
precvframe = NULL;
|
||||
pkt_copy = NULL;
|
||||
|
||||
if (transfer_len > 0 && pkt_cnt == 0)
|
||||
pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff;
|
||||
|
||||
} while ((transfer_len > 0) && (pkt_cnt > 0));
|
||||
|
||||
_exit_recvbuf2recvframe:
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
|
||||
{
|
||||
unsigned int pipe = 0, ep_num = 0;
|
||||
|
@ -39,26 +227,309 @@ unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
|
|||
return pipe;
|
||||
}
|
||||
|
||||
struct zero_bulkout_context {
|
||||
void *pbuf;
|
||||
void *purb;
|
||||
void *pirp;
|
||||
void *padapter;
|
||||
};
|
||||
|
||||
void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
|
||||
static int usbctrl_vendorreq(struct adapter *adapt, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
|
||||
{
|
||||
struct dvobj_priv *dvobjpriv = adapter_to_dvobj(adapt);
|
||||
struct usb_device *udev = dvobjpriv->pusbdev;
|
||||
unsigned int pipe;
|
||||
int status = 0;
|
||||
u8 reqtype;
|
||||
u8 *pIo_buf;
|
||||
int vendorreq_times = 0;
|
||||
|
||||
if ((adapt->bSurpriseRemoved) || (adapt->pwrctrlpriv.pnp_bstop_trx)) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usbctrl_vendorreq:(adapt->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
|
||||
status = -EPERM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (len > MAX_VENDOR_REQ_CMD_SIZE) {
|
||||
DBG_88E("[%s] Buffer len error ,vendor request failed\n", __func__);
|
||||
status = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
_enter_critical_mutex(&dvobjpriv->usb_vendor_req_mutex, NULL);
|
||||
|
||||
/* Acquire IO memory for vendorreq */
|
||||
pIo_buf = dvobjpriv->usb_vendor_req_buf;
|
||||
|
||||
if (pIo_buf == NULL) {
|
||||
DBG_88E("[%s] pIo_buf == NULL\n", __func__);
|
||||
status = -ENOMEM;
|
||||
goto release_mutex;
|
||||
}
|
||||
|
||||
while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) {
|
||||
memset(pIo_buf, 0, len);
|
||||
|
||||
if (requesttype == 0x01) {
|
||||
pipe = usb_rcvctrlpipe(udev, 0);/* read_in */
|
||||
reqtype = REALTEK_USB_VENQT_READ;
|
||||
} else {
|
||||
pipe = usb_sndctrlpipe(udev, 0);/* write_out */
|
||||
reqtype = REALTEK_USB_VENQT_WRITE;
|
||||
memcpy(pIo_buf, pdata, len);
|
||||
}
|
||||
|
||||
status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT);
|
||||
|
||||
if (status == len) { /* Success this control transfer. */
|
||||
if (requesttype == 0x01)
|
||||
memcpy(pdata, pIo_buf, len);
|
||||
} else { /* error cases */
|
||||
DBG_88E("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n",
|
||||
value, (requesttype == 0x01) ? "read" : "write",
|
||||
len, status, *(u32 *)pdata, vendorreq_times);
|
||||
|
||||
if (status < 0) {
|
||||
if (status == (-ESHUTDOWN) || status == -ENODEV) {
|
||||
adapt->bSurpriseRemoved = true;
|
||||
} else {
|
||||
struct hal_data_8188e *haldata = GET_HAL_DATA(adapt);
|
||||
haldata->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL;
|
||||
}
|
||||
} else { /* status != len && status >= 0 */
|
||||
if (status > 0) {
|
||||
if (requesttype == 0x01) {
|
||||
/* For Control read transfer, we have to copy the read data from pIo_buf to pdata. */
|
||||
memcpy(pdata, pIo_buf, len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* firmware download is checksumed, don't retry */
|
||||
if ((value >= FW_8188E_START_ADDRESS && value <= FW_8188E_END_ADDRESS) || status == len)
|
||||
break;
|
||||
}
|
||||
release_mutex:
|
||||
mutex_unlock(&dvobjpriv->usb_vendor_req_mutex);
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
|
||||
u8 usb_read8(struct adapter *adapter, u32 addr)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
u8 data = 0;
|
||||
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x01;/* read_in */
|
||||
index = 0;/* n/a */
|
||||
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = 1;
|
||||
|
||||
usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype);
|
||||
|
||||
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
void usb_read_port_cancel(struct intf_hdl *pintfhdl)
|
||||
u16 usb_read16(struct adapter *adapter, u32 addr)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
__le32 data;
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x01;/* read_in */
|
||||
index = 0;/* n/a */
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = 2;
|
||||
usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype);
|
||||
|
||||
return (u16)(le32_to_cpu(data)&0xffff);
|
||||
}
|
||||
|
||||
u32 usb_read32(struct adapter *adapter, u32 addr)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
__le32 data;
|
||||
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x01;/* read_in */
|
||||
index = 0;/* n/a */
|
||||
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = 4;
|
||||
|
||||
usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype);
|
||||
|
||||
|
||||
return le32_to_cpu(data);
|
||||
}
|
||||
|
||||
static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
|
||||
{
|
||||
struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
|
||||
struct adapter *adapt = (struct adapter *)precvbuf->adapter;
|
||||
struct recv_priv *precvpriv = &adapt->recvpriv;
|
||||
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete!!!\n"));
|
||||
|
||||
precvpriv->rx_pending_cnt--;
|
||||
|
||||
if (adapt->bSurpriseRemoved || adapt->bDriverStopped || adapt->bReadPortCancel) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
|
||||
("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",
|
||||
adapt->bDriverStopped, adapt->bSurpriseRemoved));
|
||||
|
||||
precvbuf->reuse = true;
|
||||
DBG_88E("%s() RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bReadPortCancel(%d)\n",
|
||||
__func__, adapt->bDriverStopped,
|
||||
adapt->bSurpriseRemoved, adapt->bReadPortCancel);
|
||||
return;
|
||||
}
|
||||
|
||||
if (purb->status == 0) { /* SUCCESS */
|
||||
if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
|
||||
("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));
|
||||
precvbuf->reuse = true;
|
||||
usb_read_port(adapt, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
|
||||
DBG_88E("%s()-%d: RX Warning!\n", __func__, __LINE__);
|
||||
} else {
|
||||
skb_put(precvbuf->pskb, purb->actual_length);
|
||||
skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb);
|
||||
|
||||
if (skb_queue_len(&precvpriv->rx_skb_queue) <= 1)
|
||||
tasklet_schedule(&precvpriv->recv_tasklet);
|
||||
|
||||
precvbuf->pskb = NULL;
|
||||
precvbuf->reuse = false;
|
||||
usb_read_port(adapt, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
|
||||
}
|
||||
} else {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete : purb->status(%d) != 0\n", purb->status));
|
||||
|
||||
DBG_88E("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
|
||||
skb_put(precvbuf->pskb, purb->actual_length);
|
||||
precvbuf->pskb = NULL;
|
||||
|
||||
switch (purb->status) {
|
||||
case -EINVAL:
|
||||
case -EPIPE:
|
||||
case -ENODEV:
|
||||
case -ESHUTDOWN:
|
||||
adapt->bSurpriseRemoved = true;
|
||||
case -ENOENT:
|
||||
adapt->bDriverStopped = true;
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete:bDriverStopped=true\n"));
|
||||
break;
|
||||
case -EPROTO:
|
||||
case -EOVERFLOW:
|
||||
{
|
||||
struct hal_data_8188e *haldata = GET_HAL_DATA(adapt);
|
||||
haldata->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;
|
||||
}
|
||||
precvbuf->reuse = true;
|
||||
usb_read_port(adapt, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
|
||||
break;
|
||||
case -EINPROGRESS:
|
||||
DBG_88E("ERROR: URB IS IN PROGRESS!\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u32 usb_read_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *rmem)
|
||||
{
|
||||
struct urb *purb = NULL;
|
||||
struct recv_buf *precvbuf = (struct recv_buf *)rmem;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
|
||||
struct recv_priv *precvpriv = &adapter->recvpriv;
|
||||
struct usb_device *pusbd = pdvobj->pusbdev;
|
||||
int err;
|
||||
unsigned int pipe;
|
||||
size_t tmpaddr = 0;
|
||||
size_t alignment = 0;
|
||||
u32 ret = _SUCCESS;
|
||||
|
||||
|
||||
if (adapter->bDriverStopped || adapter->bSurpriseRemoved ||
|
||||
adapter->pwrctrlpriv.pnp_bstop_trx) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
|
||||
("usb_read_port:(adapt->bDriverStopped ||adapt->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
if (!precvbuf) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
|
||||
("usb_read_port:precvbuf==NULL\n"));
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
if ((!precvbuf->reuse) || (precvbuf->pskb == NULL)) {
|
||||
precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue);
|
||||
if (NULL != precvbuf->pskb)
|
||||
precvbuf->reuse = true;
|
||||
}
|
||||
|
||||
/* re-assign for linux based on skb */
|
||||
if ((!precvbuf->reuse) || (precvbuf->pskb == NULL)) {
|
||||
precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
|
||||
if (precvbuf->pskb == NULL) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("init_recvbuf(): alloc_skb fail!\n"));
|
||||
DBG_88E("#### usb_read_port() alloc_skb fail!#####\n");
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
tmpaddr = (size_t)precvbuf->pskb->data;
|
||||
alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
|
||||
skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
|
||||
} else { /* reuse skb */
|
||||
precvbuf->reuse = false;
|
||||
}
|
||||
|
||||
precvpriv->rx_pending_cnt++;
|
||||
|
||||
purb = precvbuf->purb;
|
||||
|
||||
/* translate DMA FIFO addr to pipehandle */
|
||||
pipe = ffaddr2pipehdl(pdvobj, addr);
|
||||
|
||||
usb_fill_bulk_urb(purb, pusbd, pipe,
|
||||
precvbuf->pskb->data,
|
||||
MAX_RECVBUF_SZ,
|
||||
usb_read_port_complete,
|
||||
precvbuf);/* context is precvbuf */
|
||||
|
||||
err = usb_submit_urb(purb, GFP_ATOMIC);
|
||||
if ((err) && (err != (-EPERM))) {
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
|
||||
("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x",
|
||||
err, purb->status));
|
||||
DBG_88E("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",
|
||||
err, purb->status);
|
||||
ret = _FAIL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void usb_read_port_cancel(struct adapter *padapter)
|
||||
{
|
||||
int i;
|
||||
struct recv_buf *precvbuf;
|
||||
struct adapter *padapter = pintfhdl->padapter;
|
||||
precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf;
|
||||
|
||||
DBG_88E("%s\n", __func__);
|
||||
|
@ -73,14 +544,109 @@ void usb_read_port_cancel(struct intf_hdl *pintfhdl)
|
|||
}
|
||||
}
|
||||
|
||||
int usb_write8(struct adapter *adapter, u32 addr, u8 val)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
u8 data;
|
||||
int ret;
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x00;/* write_out */
|
||||
index = 0;/* n/a */
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = 1;
|
||||
data = val;
|
||||
ret = usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int usb_write16(struct adapter *adapter, u32 addr, u16 val)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
__le32 data;
|
||||
int ret;
|
||||
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x00;/* write_out */
|
||||
index = 0;/* n/a */
|
||||
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = 2;
|
||||
|
||||
data = cpu_to_le32(val & 0x0000ffff);
|
||||
|
||||
ret = usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype);
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int usb_write32(struct adapter *adapter, u32 addr, u32 val)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
__le32 data;
|
||||
int ret;
|
||||
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x00;/* write_out */
|
||||
index = 0;/* n/a */
|
||||
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = 4;
|
||||
data = cpu_to_le32(val);
|
||||
|
||||
ret = usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype);
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int usb_writeN(struct adapter *adapter, u32 addr, u32 length, u8 *pdata)
|
||||
{
|
||||
u8 request;
|
||||
u8 requesttype;
|
||||
u16 wvalue;
|
||||
u16 index;
|
||||
u16 len;
|
||||
u8 buf[VENDOR_CMD_MAX_DATA_LEN] = {0};
|
||||
int ret;
|
||||
|
||||
|
||||
request = 0x05;
|
||||
requesttype = 0x00;/* write_out */
|
||||
index = 0;/* n/a */
|
||||
|
||||
wvalue = (u16)(addr&0x0000ffff);
|
||||
len = length;
|
||||
memcpy(buf, pdata, len);
|
||||
|
||||
ret = usbctrl_vendorreq(adapter, request, wvalue, index, buf, len, requesttype);
|
||||
|
||||
|
||||
return RTW_STATUS_CODE(ret);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs)
|
||||
{
|
||||
struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context;
|
||||
struct adapter *padapter = pxmitbuf->padapter;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct hal_data_8188e *haldata;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
switch (pxmitbuf->flags) {
|
||||
case VO_QUEUE_INX:
|
||||
|
@ -145,9 +711,6 @@ _func_enter_;
|
|||
}
|
||||
}
|
||||
|
||||
haldata = GET_HAL_DATA(padapter);
|
||||
haldata->srestpriv.last_tx_complete_time = rtw_get_current_time();
|
||||
|
||||
check_completion:
|
||||
rtw_sctx_done_err(&pxmitbuf->sctx,
|
||||
purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR :
|
||||
|
@ -156,25 +719,21 @@ check_completion:
|
|||
rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
|
||||
|
||||
tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
|
||||
|
||||
_func_exit_;
|
||||
}
|
||||
|
||||
u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
|
||||
u32 usb_write_port(struct adapter *padapter, u32 addr, u32 cnt, u8 *wmem)
|
||||
{
|
||||
unsigned long irqL;
|
||||
unsigned int pipe;
|
||||
int status;
|
||||
u32 ret = _FAIL;
|
||||
struct urb *purb = NULL;
|
||||
struct adapter *padapter = (struct adapter *)pintfhdl->padapter;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem;
|
||||
struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
|
||||
struct usb_device *pusbd = pdvobj->pusbdev;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("+usb_write_port\n"));
|
||||
|
||||
|
@ -186,7 +745,7 @@ _func_enter_;
|
|||
goto exit;
|
||||
}
|
||||
|
||||
_enter_critical(&pxmitpriv->lock, &irqL);
|
||||
spin_lock_irqsave(&pxmitpriv->lock, irqL);
|
||||
|
||||
switch (addr) {
|
||||
case VO_QUEUE_INX:
|
||||
|
@ -213,7 +772,7 @@ _func_enter_;
|
|||
break;
|
||||
}
|
||||
|
||||
_exit_critical(&pxmitpriv->lock, &irqL);
|
||||
spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
|
||||
|
||||
purb = pxmitbuf->pxmit_urb[0];
|
||||
|
||||
|
@ -227,11 +786,7 @@ _func_enter_;
|
|||
pxmitbuf);/* context is pxmitbuf */
|
||||
|
||||
status = usb_submit_urb(purb, GFP_ATOMIC);
|
||||
if (!status) {
|
||||
struct hal_data_8188e *haldata = GET_HAL_DATA(padapter);
|
||||
|
||||
haldata->srestpriv.last_tx_time = rtw_get_current_time();
|
||||
} else {
|
||||
if (status) {
|
||||
rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);
|
||||
DBG_88E("usb_write_port, status =%d\n", status);
|
||||
RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_write_port(): usb_submit_urb, status =%x\n", status));
|
||||
|
@ -255,14 +810,12 @@ _func_enter_;
|
|||
exit:
|
||||
if (ret != _SUCCESS)
|
||||
rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
|
||||
_func_exit_;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void usb_write_port_cancel(struct intf_hdl *pintfhdl)
|
||||
void usb_write_port_cancel(struct adapter *padapter)
|
||||
{
|
||||
int i, j;
|
||||
struct adapter *padapter = pintfhdl->padapter;
|
||||
struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf;
|
||||
|
||||
DBG_88E("%s\n", __func__);
|
||||
|
@ -286,3 +839,46 @@ void usb_write_port_cancel(struct intf_hdl *pintfhdl)
|
|||
pxmitbuf++;
|
||||
}
|
||||
}
|
||||
|
||||
void rtl8188eu_recv_tasklet(void *priv)
|
||||
{
|
||||
struct sk_buff *pskb;
|
||||
struct adapter *adapt = priv;
|
||||
struct recv_priv *precvpriv = &adapt->recvpriv;
|
||||
|
||||
while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) {
|
||||
if ((adapt->bDriverStopped) || (adapt->bSurpriseRemoved)) {
|
||||
DBG_88E("recv_tasklet => bDriverStopped or bSurpriseRemoved\n");
|
||||
dev_kfree_skb_any(pskb);
|
||||
break;
|
||||
}
|
||||
recvbuf2recvframe(adapt, pskb);
|
||||
skb_reset_tail_pointer(pskb);
|
||||
pskb->len = 0;
|
||||
skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
|
||||
}
|
||||
}
|
||||
|
||||
void rtl8188eu_xmit_tasklet(void *priv)
|
||||
{
|
||||
int ret = false;
|
||||
struct adapter *adapt = priv;
|
||||
struct xmit_priv *pxmitpriv = &adapt->xmitpriv;
|
||||
|
||||
if (check_fwstate(&adapt->mlmepriv, _FW_UNDER_SURVEY))
|
||||
return;
|
||||
|
||||
while (1) {
|
||||
if ((adapt->bDriverStopped) ||
|
||||
(adapt->bSurpriseRemoved) ||
|
||||
(adapt->bWritePortCancel)) {
|
||||
DBG_88E("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n");
|
||||
break;
|
||||
}
|
||||
|
||||
ret = rtl8188eu_xmitframe_complete(adapt, pxmitpriv, NULL);
|
||||
|
||||
if (!ret)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,17 +19,13 @@
|
|||
******************************************************************************/
|
||||
#define _XMIT_OSDEP_C_
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <osdep_service.h>
|
||||
#include <drv_types.h>
|
||||
|
||||
#include <if_ether.h>
|
||||
#include <ip.h>
|
||||
#include <wifi.h>
|
||||
#include <mlme_osdep.h>
|
||||
#include <xmit_osdep.h>
|
||||
#include <osdep_intf.h>
|
||||
#include <usb_osintf.h>
|
||||
|
||||
uint rtw_remainder_len(struct pkt_file *pfile)
|
||||
{
|
||||
|
@ -39,7 +35,6 @@ uint rtw_remainder_len(struct pkt_file *pfile)
|
|||
|
||||
void _rtw_open_pktfile(struct sk_buff *pktptr, struct pkt_file *pfile)
|
||||
{
|
||||
_func_enter_;
|
||||
|
||||
pfile->pkt = pktptr;
|
||||
pfile->cur_addr = pktptr->data;
|
||||
|
@ -49,14 +44,12 @@ _func_enter_;
|
|||
|
||||
pfile->cur_buffer = pfile->buf_start;
|
||||
|
||||
_func_exit_;
|
||||
}
|
||||
|
||||
uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen)
|
||||
uint _rtw_pktfile_read(struct pkt_file *pfile, u8 *rmem, uint rlen)
|
||||
{
|
||||
uint len = 0;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
len = rtw_remainder_len(pfile);
|
||||
len = (rlen > len) ? len : rlen;
|
||||
|
@ -67,34 +60,26 @@ _func_enter_;
|
|||
pfile->cur_addr += len;
|
||||
pfile->pkt_len -= len;
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int rtw_endofpktfile(struct pkt_file *pfile)
|
||||
{
|
||||
_func_enter_;
|
||||
|
||||
if (pfile->pkt_len == 0) {
|
||||
_func_exit_;
|
||||
return true;
|
||||
}
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void rtw_set_tx_chksum_offload(struct sk_buff *pkt, struct pkt_attrib *pattrib)
|
||||
{
|
||||
}
|
||||
|
||||
int rtw_os_xmit_resource_alloc(struct adapter *padapter, struct xmit_buf *pxmitbuf, u32 alloc_sz)
|
||||
{
|
||||
int i;
|
||||
|
||||
pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz);
|
||||
pxmitbuf->pallocated_buf = kzalloc(alloc_sz, GFP_KERNEL);
|
||||
if (pxmitbuf->pallocated_buf == NULL)
|
||||
return _FAIL;
|
||||
|
||||
|
@ -126,7 +111,6 @@ void rtw_os_xmit_resource_free(struct adapter *padapter,
|
|||
|
||||
void rtw_os_pkt_complete(struct adapter *padapter, struct sk_buff *pkt)
|
||||
{
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
|
||||
u16 queue;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
|
@ -139,10 +123,6 @@ void rtw_os_pkt_complete(struct adapter *padapter, struct sk_buff *pkt)
|
|||
if (__netif_subqueue_stopped(padapter->pnetdev, queue))
|
||||
netif_wake_subqueue(padapter->pnetdev, queue);
|
||||
}
|
||||
#else
|
||||
if (netif_queue_stopped(padapter->pnetdev))
|
||||
netif_wake_queue(padapter->pnetdev);
|
||||
#endif
|
||||
|
||||
dev_kfree_skb_any(pkt);
|
||||
}
|
||||
|
@ -156,7 +136,6 @@ void rtw_os_xmit_complete(struct adapter *padapter, struct xmit_frame *pxframe)
|
|||
|
||||
void rtw_os_xmit_schedule(struct adapter *padapter)
|
||||
{
|
||||
unsigned long irql;
|
||||
struct xmit_priv *pxmitpriv;
|
||||
|
||||
if (!padapter)
|
||||
|
@ -164,12 +143,12 @@ void rtw_os_xmit_schedule(struct adapter *padapter)
|
|||
|
||||
pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
_enter_critical_bh(&pxmitpriv->lock, &irql);
|
||||
spin_lock_bh(&pxmitpriv->lock);
|
||||
|
||||
if (rtw_txframes_pending(padapter))
|
||||
tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
|
||||
|
||||
_exit_critical_bh(&pxmitpriv->lock, &irql);
|
||||
spin_unlock_bh(&pxmitpriv->lock);
|
||||
}
|
||||
|
||||
static void rtw_check_xmit_resource(struct adapter *padapter, struct sk_buff *pkt)
|
||||
|
@ -194,21 +173,20 @@ static int rtw_mlcst2unicst(struct adapter *padapter, struct sk_buff *skb)
|
|||
{
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
unsigned long irql;
|
||||
struct list_head *phead, *plist;
|
||||
struct sk_buff *newskb;
|
||||
struct sta_info *psta = NULL;
|
||||
s32 res;
|
||||
|
||||
_enter_critical_bh(&pstapriv->asoc_list_lock, &irql);
|
||||
spin_lock_bh(&pstapriv->asoc_list_lock);
|
||||
phead = &pstapriv->asoc_list;
|
||||
plist = get_next(phead);
|
||||
plist = phead->next;
|
||||
|
||||
/* free sta asoc_queue */
|
||||
while (!rtw_end_of_queue_search(phead, plist)) {
|
||||
psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
|
||||
while (phead != plist) {
|
||||
psta = container_of(plist, struct sta_info, asoc_list);
|
||||
|
||||
plist = get_next(plist);
|
||||
plist = plist->next;
|
||||
|
||||
/* avoid come from STA1 and send back STA1 */
|
||||
if (!memcmp(psta->hwaddr, &skb->data[6], 6))
|
||||
|
@ -230,12 +208,12 @@ static int rtw_mlcst2unicst(struct adapter *padapter, struct sk_buff *skb)
|
|||
DBG_88E("%s-%d: skb_copy() failed!\n", __func__, __LINE__);
|
||||
pxmitpriv->tx_drop++;
|
||||
|
||||
_exit_critical_bh(&pstapriv->asoc_list_lock, &irql);
|
||||
spin_unlock_bh(&pstapriv->asoc_list_lock);
|
||||
return false; /* Caller shall tx this multicast frame via normal way. */
|
||||
}
|
||||
}
|
||||
|
||||
_exit_critical_bh(&pstapriv->asoc_list_lock, &irql);
|
||||
spin_unlock_bh(&pstapriv->asoc_list_lock);
|
||||
dev_kfree_skb_any(skb);
|
||||
return true;
|
||||
}
|
||||
|
@ -248,7 +226,6 @@ int rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev)
|
|||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
s32 res = 0;
|
||||
|
||||
_func_enter_;
|
||||
|
||||
RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n"));
|
||||
|
||||
|
@ -284,7 +261,6 @@ drop_packet:
|
|||
|
||||
exit:
|
||||
|
||||
_func_exit_;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue