diff options
Diffstat (limited to 'drivers/staging/rtl8723au/os_dep/os_intfs.c')
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/os_intfs.c | 255 |
1 files changed, 84 insertions, 171 deletions
diff --git a/drivers/staging/rtl8723au/os_dep/os_intfs.c b/drivers/staging/rtl8723au/os_dep/os_intfs.c index 4fe751f7c2bf..4e32003a4437 100644 --- a/drivers/staging/rtl8723au/os_dep/os_intfs.c +++ b/drivers/staging/rtl8723au/os_dep/os_intfs.c @@ -20,10 +20,8 @@ #include <recv_osdep.h> #include <hal_intf.h> #include <rtw_version.h> -#include <ethernet.h> -#include <usb_osintf.h> -#include <linux/version.h> +#include <rtl8723a_hal.h> MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); @@ -66,10 +64,10 @@ static int rtw_acm_method;/* 0:By SW 1:By HW. */ static int rtw_wmm_enable = 1;/* default is set to enable the wmm. */ static int rtw_uapsd_enable; -int rtw_ht_enable23A = 1; +static int rtw_ht_enable = 1; /* 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g */ -int rtw_cbw40_enable23A = 3; -int rtw_ampdu_enable23A = 1;/* for enable tx_ampdu */ +static int rtw_cbw40_enable = 3; +static int rtw_ampdu_enable = 1;/* for enable tx_ampdu */ /* 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 */ @@ -130,9 +128,9 @@ module_param(rtw_wmm_enable, int, 0644); module_param(rtw_vrtl_carrier_sense, int, 0644); module_param(rtw_vcs_type, int, 0644); module_param(rtw_busy_thresh, int, 0644); -module_param(rtw_ht_enable23A, int, 0644); -module_param(rtw_cbw40_enable23A, int, 0644); -module_param(rtw_ampdu_enable23A, int, 0644); +module_param(rtw_ht_enable, int, 0644); +module_param(rtw_cbw40_enable, int, 0644); +module_param(rtw_ampdu_enable, int, 0644); module_param(rtw_rx_stbc, int, 0644); module_param(rtw_ampdu_amsdu, int, 0644); @@ -172,10 +170,10 @@ MODULE_PARM_DESC(debug, "Set debug level (1-9) (default 1)"); static int netdev_close(struct net_device *pnetdev); -static uint loadparam(struct rtw_adapter *padapter, struct net_device *pnetdev) +static int loadparam(struct rtw_adapter *padapter, struct net_device *pnetdev) { struct registry_priv *registry_par = &padapter->registrypriv; - uint status = _SUCCESS; + int status = _SUCCESS; GlobalDebugLevel23A = rtw_debug; registry_par->chip_version = (u8)rtw_chip_version; @@ -203,9 +201,9 @@ static uint loadparam(struct rtw_adapter *padapter, struct net_device *pnetdev) /* UAPSD */ registry_par->wmm_enable = (u8)rtw_wmm_enable; registry_par->uapsd_enable = (u8)rtw_uapsd_enable; - registry_par->ht_enable = (u8)rtw_ht_enable23A; - registry_par->cbw40_enable = (u8)rtw_cbw40_enable23A; - registry_par->ampdu_enable = (u8)rtw_ampdu_enable23A; + registry_par->ht_enable = (u8)rtw_ht_enable; + registry_par->cbw40_enable = (u8)rtw_cbw40_enable; + registry_par->ampdu_enable = (u8)rtw_ampdu_enable; registry_par->rx_stbc = (u8)rtw_rx_stbc; registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu; registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit; @@ -274,9 +272,9 @@ static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 }; /* Given a data frame determine the 802.1p/1d tag to use. */ -static unsigned int rtw_classify8021d(struct sk_buff *skb) +static u32 rtw_classify8021d(struct sk_buff *skb) { - unsigned int dscp; + u32 dscp; /* skb->priority values from 256->263 are magic values to * directly indicate a specific 802.1d priority. This is used @@ -312,14 +310,14 @@ static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, u16 rtw_recv_select_queue23a(struct sk_buff *skb) { struct iphdr *piphdr; + struct ethhdr *eth = (struct ethhdr *)skb->data; unsigned int dscp; - u16 eth_type; + u16 eth_type = get_unaligned_be16(ð->h_proto); u32 priority; u8 *pdata = skb->data; - memcpy(ð_type, pdata + (ETH_ALEN << 1), 2); switch (eth_type) { - case htons(ETH_P_IP): + case ETH_P_IP: piphdr = (struct iphdr *)(pdata + ETH_HLEN); dscp = piphdr->tos & 0xfc; priority = dscp >> 5; @@ -378,42 +376,13 @@ struct net_device *rtw_init_netdev23a(struct rtw_adapter *old_padapter) return pnetdev; } -u32 rtw_start_drv_threads23a(struct rtw_adapter *padapter) -{ - u32 _status = _SUCCESS; - - RT_TRACE(_module_os_intfs_c_, _drv_info_, - ("+rtw_start_drv_threads23a\n")); - padapter->cmdThread = kthread_run(rtw_cmd_thread23a, padapter, - "RTW_CMD_THREAD"); - if (IS_ERR(padapter->cmdThread)) { - _status = _FAIL; - } else { - /* wait for cmd_thread to run */ - down(&padapter->cmdpriv.terminate_cmdthread_sema); - } - rtw_hal_start_thread23a(padapter); - return _status; -} - -void rtw_stop_drv_threads23a(struct rtw_adapter *padapter) -{ - RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_stop_drv_threads23a\n")); - - /* Below is to termindate rtw_cmd_thread23a & event_thread... */ - up(&padapter->cmdpriv.cmd_queue_sema); - if (padapter->cmdThread) - down(&padapter->cmdpriv.terminate_cmdthread_sema); - rtw_hal_stop_thread23a(padapter); -} - -static u8 rtw_init_default_value(struct rtw_adapter *padapter) +static int rtw_init_default_value(struct rtw_adapter *padapter) { struct registry_priv *pregistrypriv = &padapter->registrypriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct security_priv *psecuritypriv = &padapter->securitypriv; - u8 ret = _SUCCESS; + int ret = _SUCCESS; /* xmit_priv */ pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; @@ -430,15 +399,15 @@ static u8 rtw_init_default_value(struct rtw_adapter *padapter) pmlmepriv->htpriv.ampdu_enable = false;/* set to disabled */ /* security_priv */ - psecuritypriv->binstallGrpkey = _FAIL; + psecuritypriv->binstallGrpkey = 0; /* open system */ psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psecuritypriv->dot11PrivacyAlgrthm = 0; psecuritypriv->dot11PrivacyKeyIndex = 0; - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpPrivacy = 0; psecuritypriv->dot118021XGrpKeyid = 1; psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; @@ -449,30 +418,24 @@ static u8 rtw_init_default_value(struct rtw_adapter *padapter) rtw_update_registrypriv_dev_network23a(padapter); /* hal_priv */ - rtw_hal_def_value_init23a(padapter); + rtl8723a_init_default_value(padapter); /* misc. */ padapter->bReadPortCancel = false; padapter->bWritePortCancel = false; - padapter->bRxRSSIDisplay = 0; padapter->bNotifyChannelChange = 0; -#ifdef CONFIG_8723AU_P2P - padapter->bShowGetP2PState = 1; -#endif return ret; } -u8 rtw_reset_drv_sw23a(struct rtw_adapter *padapter) +int rtw_reset_drv_sw23a(struct rtw_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - u8 ret8 = _SUCCESS; /* hal_priv */ - rtw_hal_def_value_init23a(padapter); + rtl8723a_init_default_value(padapter); padapter->bReadPortCancel = false; padapter->bWritePortCancel = false; - padapter->bRxRSSIDisplay = 0; pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ padapter->xmitpriv.tx_pkts = 0; @@ -482,23 +445,23 @@ u8 rtw_reset_drv_sw23a(struct rtw_adapter *padapter) _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); - rtw_hal_sreset_reset23a_value23a(padapter); + rtw_sreset_reset_value(padapter); pwrctrlpriv->pwr_state_check_cnts = 0; /* mlmeextpriv */ padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE; rtw_set_signal_stat_timer(&padapter->recvpriv); - return ret8; + return _SUCCESS; } -u8 rtw_init_drv_sw23a(struct rtw_adapter *padapter) +int rtw_init_drv_sw23a(struct rtw_adapter *padapter) { - u8 ret8 = _SUCCESS; + int ret8 = _SUCCESS; RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_init_drv_sw23a\n")); - if ((rtw_init_cmd_priv23a(&padapter->cmdpriv)) == _FAIL) { + if (rtw_init_cmd_priv23a(&padapter->cmdpriv) == _FAIL) { RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init cmd_priv\n")); ret8 = _FAIL; @@ -521,17 +484,6 @@ u8 rtw_init_drv_sw23a(struct rtw_adapter *padapter) goto exit; } -#ifdef CONFIG_8723AU_P2P - rtw_init_wifidirect_timers23a(padapter); - init_wifidirect_info23a(padapter, P2P_ROLE_DISABLE); - reset_global_wifidirect_info23a(padapter); - rtw_init_cfg80211_wifidirect_info(padapter); -#ifdef CONFIG_8723AU_P2P - if (rtw_init_wifi_display_info(padapter) == _FAIL) - RT_TRACE(_module_os_intfs_c_, _drv_err_, - ("\n Can't init init_wifi_display_info\n")); -#endif -#endif /* CONFIG_8723AU_P2P */ if (init_mlme_ext_priv23a(padapter) == _FAIL) { RT_TRACE(_module_os_intfs_c_, _drv_err_, @@ -566,10 +518,9 @@ u8 rtw_init_drv_sw23a(struct rtw_adapter *padapter) ret8 = rtw_init_default_value(padapter); - rtw_hal_dm_init23a(padapter); - rtw_hal_sw_led_init23a(padapter); + rtl8723a_init_dm_priv(padapter); - rtw_hal_sreset_init23a(padapter); + rtw_sreset_init(padapter); exit: @@ -579,89 +530,60 @@ exit: void rtw_cancel_all_timer23a(struct rtw_adapter *padapter) { - RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_cancel_all_timer23a\n")); + RT_TRACE(_module_os_intfs_c_, _drv_info_, + ("+rtw_cancel_all_timer23a\n")); del_timer_sync(&padapter->mlmepriv.assoc_timer); RT_TRACE(_module_os_intfs_c_, _drv_info_, - ("rtw_cancel_all_timer23a:cancel association timer complete!\n")); + ("%s:cancel association timer complete!\n", __func__)); del_timer_sync(&padapter->mlmepriv.scan_to_timer); RT_TRACE(_module_os_intfs_c_, _drv_info_, - ("rtw_cancel_all_timer23a:cancel scan_to_timer!\n")); + ("%s:cancel scan_to_timer!\n", __func__)); del_timer_sync(&padapter->mlmepriv.dynamic_chk_timer); RT_TRACE(_module_os_intfs_c_, _drv_info_, - ("rtw_cancel_all_timer23a:cancel dynamic_chk_timer!\n")); + ("%s:cancel dynamic_chk_timer!\n", __func__)); - /* cancel sw led timer */ - rtw_hal_sw_led_deinit23a(padapter); RT_TRACE(_module_os_intfs_c_, _drv_info_, - ("rtw_cancel_all_timer23a:cancel DeInitSwLeds!\n")); + ("%s:cancel DeInitSwLeds!\n", __func__)); del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer); -#ifdef CONFIG_8723AU_P2P - del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer); -#endif /* CONFIG_8723AU_P2P */ - del_timer_sync(&padapter->mlmepriv.set_scan_deny_timer); rtw_clear_scan_deny(padapter); RT_TRACE(_module_os_intfs_c_, _drv_info_, - ("rtw_cancel_all_timer23a:cancel set_scan_deny_timer!\n")); + ("%s:cancel set_scan_deny_timer!\n", __func__)); del_timer_sync(&padapter->recvpriv.signal_stat_timer); /* cancel dm timer */ - rtw_hal_dm_deinit23a(padapter); + rtl8723a_deinit_dm_priv(padapter); } -u8 rtw_free_drv_sw23a(struct rtw_adapter *padapter) +int rtw_free_drv_sw23a(struct rtw_adapter *padapter) { -#ifdef CONFIG_8723AU_P2P - struct wifidirect_info *pwdinfo; -#endif - RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw23a")); - /* we can call rtw_p2p_enable23a here, but: - * 1. rtw_p2p_enable23a may have IO operation - * 2. rtw_p2p_enable23a is bundled with wext interface - */ -#ifdef CONFIG_8723AU_P2P - pwdinfo = &padapter->wdinfo; - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - del_timer_sync(&pwdinfo->find_phase_timer); - del_timer_sync(&pwdinfo->restore_p2p_state_timer); - del_timer_sync(&pwdinfo->pre_tx_scan_timer); - rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); - } -#endif - free_mlme_ext_priv23a(&padapter->mlmeextpriv); - rtw_free_cmd_priv23a(&padapter->cmdpriv); - rtw_free_evt_priv23a(&padapter->evtpriv); rtw_free_mlme_priv23a(&padapter->mlmepriv); _rtw_free_xmit_priv23a(&padapter->xmitpriv); - _rtw_free_sta_priv23a(&padapter->stapriv);/* will free bcmc_stainfo here */ + /* will free bcmc_stainfo here */ + _rtw_free_sta_priv23a(&padapter->stapriv); _rtw_free_recv_priv23a(&padapter->recvpriv); rtw_free_pwrctrl_priv(padapter); - rtw_hal_free_data23a(padapter); + kfree(padapter->HalData); + padapter->HalData = NULL; RT_TRACE(_module_os_intfs_c_, _drv_info_, ("<== rtw_free_drv_sw23a\n")); - /* free the old_pnetdev */ - if (padapter->rereg_nd_name_priv.old_pnetdev) { - free_netdev(padapter->rereg_nd_name_priv.old_pnetdev); - padapter->rereg_nd_name_priv.old_pnetdev = NULL; - } - /* clear pbuddy_adapter to avoid access wrong pointer. */ if (padapter->pbuddy_adapter != NULL) padapter->pbuddy_adapter->pbuddy_adapter = NULL; @@ -681,7 +603,7 @@ static int _rtw_drv_register_netdev(struct rtw_adapter *padapter, char *name) /* Tell the network stack we exist */ if (register_netdev(pnetdev)) { - DBG_8723A(FUNC_NDEV_FMT "Failed!\n", FUNC_NDEV_ARG(pnetdev)); + DBG_8723A("%s(%s): Failed!\n", __func__, pnetdev->name); ret = _FAIL; goto error_register_netdev; } @@ -704,26 +626,30 @@ int rtw_drv_register_netdev(struct rtw_adapter *if1) struct dvobj_priv *dvobj = if1->dvobj; int i, status = _SUCCESS; - if (dvobj->iface_nums < IFACE_ID_MAX) { - for (i = 0; i < dvobj->iface_nums; i++) { - struct rtw_adapter *padapter = dvobj->padapters[i]; - - if (padapter) { - char *name; - - if (padapter->iface_id == IFACE_ID0) - name = if1->registrypriv.ifname; - else if (padapter->iface_id == IFACE_ID1) - name = if1->registrypriv.if2name; - else - name = "wlan%d"; - status = _rtw_drv_register_netdev(padapter, - name); - if (status != _SUCCESS) - break; - } + if (dvobj->iface_nums >= IFACE_ID_MAX) { + status = _FAIL; /* -EINVAL */ + goto exit; + } + + for (i = 0; i < dvobj->iface_nums; i++) { + struct rtw_adapter *padapter = dvobj->padapters[i]; + + if (padapter) { + char *name; + + if (padapter->iface_id == IFACE_ID0) + name = if1->registrypriv.ifname; + else if (padapter->iface_id == IFACE_ID1) + name = if1->registrypriv.if2name; + else + name = "wlan%d"; + status = _rtw_drv_register_netdev(padapter, name); + if (status != _SUCCESS) + break; } } + +exit: return status; } @@ -732,7 +658,7 @@ int netdev_open23a(struct net_device *pnetdev) struct rtw_adapter *padapter = netdev_priv(pnetdev); struct pwrctrl_priv *pwrctrlpriv; int ret = 0; - uint status; + int status; RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+871x_drv - dev_open\n")); DBG_8723A("+871x_drv - drv_open, bup =%d\n", padapter->bup); @@ -760,19 +686,12 @@ int netdev_open23a(struct net_device *pnetdev) DBG_8723A("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr)); - status = rtw_start_drv_threads23a(padapter); - if (status == _FAIL) { - DBG_8723A("Initialize driver software resource Failed!\n"); - goto netdev_open23a_error; - } - if (init_hw_mlme_ext23a(padapter) == _FAIL) { DBG_8723A("can't init mlme_ext_priv\n"); goto netdev_open23a_error; } - if (padapter->intf_start) - padapter->intf_start(padapter); + rtl8723au_inirp_init(padapter); rtw_cfg80211_init_wiphy(padapter); @@ -816,7 +735,7 @@ netdev_open23a_error: goto exit; } -static int ips_netdrv_open(struct rtw_adapter *padapter) +static int ips_netdrv_open(struct rtw_adapter *padapter) { int status = _SUCCESS; @@ -834,8 +753,7 @@ static int ips_netdrv_open(struct rtw_adapter *padapter) goto netdev_open23a_error; } - if (padapter->intf_start) - padapter->intf_start(padapter); + rtl8723au_inirp_init(padapter); rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); mod_timer(&padapter->mlmepriv.dynamic_chk_timer, @@ -887,10 +805,9 @@ void rtw_ips_pwr_down23a(struct rtw_adapter *padapter) void rtw_ips_dev_unload23a(struct rtw_adapter *padapter) { - rtw_hal_set_hwreg23a(padapter, HW_VAR_FIFO_CLEARN_UP, NULL); + rtl8723a_fifo_cleanup(padapter); - if (padapter->intf_stop) - padapter->intf_stop(padapter); + rtl8723a_usb_intf_stop(padapter); /* s5. */ if (!padapter->bSurpriseRemoved) @@ -916,15 +833,11 @@ static int netdev_close(struct net_device *pnetdev) RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+871x_drv - drv_close\n")); - if (padapter->pwrctrlpriv.bInternalAutoSuspend) { - if (padapter->pwrctrlpriv.rf_pwrstate == rf_off) - padapter->pwrctrlpriv.ps_flag = true; - } padapter->net_closed = true; if (padapter->pwrctrlpriv.rf_pwrstate == rf_on) { - DBG_8723A("(2)871x_drv - drv_close, bup =%d, hw_init_completed =%d\n", - padapter->bup, + DBG_8723A("(2)871x_drv - drv_close, bup =%d, " + "hw_init_completed =%d\n", padapter->bup, padapter->hw_init_completed); /* s1. */ @@ -941,17 +854,11 @@ static int netdev_close(struct net_device *pnetdev) /* s2-3. */ rtw_free_assoc_resources23a(padapter, 1); /* s2-4. */ - rtw_free_network_queue23a(padapter, true); + rtw_free_network_queue23a(padapter); /* Close LED */ rtw_led_control(padapter, LED_CTL_POWER_OFF); } -#ifdef CONFIG_8723AU_P2P - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = false; - rtw_p2p_enable23a(padapter, P2P_ROLE_DISABLE); -#endif /* CONFIG_8723AU_P2P */ - rtw_scan_abort23a(padapter); RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-871x_drv - drv_close\n")); @@ -962,7 +869,13 @@ static int netdev_close(struct net_device *pnetdev) void rtw_ndev_destructor(struct net_device *ndev) { - DBG_8723A(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); kfree(ndev->ieee80211_ptr); free_netdev(ndev); } + +void _rtw_init_queue23a(struct rtw_queue *pqueue) +{ + INIT_LIST_HEAD(&pqueue->queue); + spin_lock_init(&pqueue->lock); +} |