diff options
Diffstat (limited to 'drivers/staging/rtl8723au/os_dep/usb_intf.c')
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/usb_intf.c | 110 |
1 files changed, 39 insertions, 71 deletions
diff --git a/drivers/staging/rtl8723au/os_dep/usb_intf.c b/drivers/staging/rtl8723au/os_dep/usb_intf.c index 612806e0de2e..8b25c1aa2025 100644 --- a/drivers/staging/rtl8723au/os_dep/usb_intf.c +++ b/drivers/staging/rtl8723au/os_dep/usb_intf.c @@ -21,10 +21,8 @@ #include <hal_intf.h> #include <rtw_version.h> #include <osdep_intf.h> -#include <usb_vendor_req.h> #include <usb_ops.h> -#include <usb_osintf.h> -#include <usb_hal.h> +#include <rtl8723a_hal.h> static int rtw_suspend(struct usb_interface *intf, pm_message_t message); static int rtw_resume(struct usb_interface *intf); @@ -101,15 +99,15 @@ 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) +static int rtw_init_intf_priv(struct dvobj_priv *dvobj) { - u8 rst = _SUCCESS; + int rst = _SUCCESS; mutex_init(&dvobj->usb_vendor_req_mutex); dvobj->usb_alloc_vendor_req_buf = kzalloc(MAX_USB_IO_CTL_SIZE, GFP_KERNEL); if (dvobj->usb_alloc_vendor_req_buf == NULL) { - DBG_8723A("alloc usb_vendor_req_buf failed... /n"); + DBG_8723A("alloc usb_vendor_req_buf failed...\n"); rst = _FAIL; goto exit; } @@ -119,9 +117,9 @@ exit: return rst; } -static u8 rtw_deinit_intf_priv(struct dvobj_priv *dvobj) +static int rtw_deinit_intf_priv(struct dvobj_priv *dvobj) { - u8 rst = _SUCCESS; + int rst = _SUCCESS; kfree(dvobj->usb_alloc_vendor_req_buf); @@ -229,7 +227,6 @@ static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf) goto free_dvobj; } /* 3 misc */ - sema_init(&(pdvobjpriv->usb_suspend_sema), 0); rtw_reset_continual_urb_error(pdvobjpriv); usb_get_dev(pusbd); status = _SUCCESS; @@ -278,21 +275,7 @@ static void usb_dvobj_deinit(struct usb_interface *usb_intf) usb_put_dev(interface_to_usbdev(usb_intf)); } -static void decide_chip_type_by_usb_device_id(struct rtw_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 rtw_adapter *padapter) -{ - RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+usb_intf_start\n")); - rtw_hal_inirp_init23a(padapter); - RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-usb_intf_start\n")); -} - -static void usb_intf_stop(struct rtw_adapter *padapter) +void rtl8723a_usb_intf_stop(struct rtw_adapter *padapter) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+usb_intf_stop\n")); @@ -306,10 +289,10 @@ static void usb_intf_stop(struct rtw_adapter *padapter) } /* cancel in irp */ - rtw_hal_inirp_deinit23a(padapter); + rtl8723au_inirp_deinit(padapter); /* cancel out irp */ - rtw_write_port_cancel(padapter); + rtl8723au_write_port_cancel(padapter); /* todo:cancel other irps */ RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-usb_intf_stop\n")); @@ -328,12 +311,10 @@ static void rtw_dev_unload(struct rtw_adapter *padapter) RTW_SCTX_DONE_DRV_STOP); /* s3. */ - if (padapter->intf_stop) - padapter->intf_stop(padapter); + rtl8723a_usb_intf_stop(padapter); /* s4. */ - if (!padapter->pwrctrlpriv.bInternalAutoSuspend) - rtw_stop_drv_threads23a(padapter); + flush_workqueue(padapter->cmdpriv.wq); /* s5. */ if (!padapter->bSurpriseRemoved) { @@ -353,6 +334,7 @@ int rtw_hw_suspend23a(struct rtw_adapter *padapter) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; struct net_device *pnetdev = padapter->pnetdev; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; if ((!padapter->bup) || (padapter->bDriverStopped) || (padapter->bSurpriseRemoved)) { @@ -380,26 +362,22 @@ int rtw_hw_suspend23a(struct rtw_adapter *padapter) /* s2-2. indicate disconnect to os */ /* rtw_indicate_disconnect23a(padapter); */ - { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + if (check_fwstate(pmlmepriv, _FW_LINKED)) { + _clr_fwstate_(pmlmepriv, _FW_LINKED); - if (check_fwstate(pmlmepriv, _FW_LINKED)) { - _clr_fwstate_(pmlmepriv, _FW_LINKED); + rtw_led_control(padapter, LED_CTL_NO_LINK); - rtw_led_control(padapter, LED_CTL_NO_LINK); + rtw_os_indicate_disconnect23a(padapter); - rtw_os_indicate_disconnect23a(padapter); - - /* donnot enqueue cmd */ - rtw_lps_ctrl_wk_cmd23a(padapter, - LPS_CTRL_DISCONNECT, 0); - } + /* donnot enqueue cmd */ + rtw_lps_ctrl_wk_cmd23a(padapter, + LPS_CTRL_DISCONNECT, 0); } /* s2-3. */ rtw_free_assoc_resources23a(padapter, 1); /* s2-4. */ - rtw_free_network_queue23a(padapter, true); + rtw_free_network_queue23a(padapter); rtw_ips_dev_unload23a(padapter); pwrpriv->rf_pwrstate = rf_off; pwrpriv->bips_processing = false; @@ -503,13 +481,14 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) /* s2-3. */ rtw_free_assoc_resources23a(padapter, 1); /* s2-4. */ - rtw_free_network_queue23a(padapter, true); + rtw_free_network_queue23a(padapter); rtw_dev_unload(padapter); up(&pwrpriv->lock); if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - rtw_indicate_scan_done23a(padapter, 1); + rtw_cfg80211_indicate_scan_done( + wdev_to_priv(padapter->rtw_wdev), true); if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) rtw_indicate_disconnect23a(padapter); @@ -525,13 +504,9 @@ static int rtw_resume(struct usb_interface *pusb_intf) { struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); struct rtw_adapter *padapter = dvobj->if1; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - int ret = 0; + int ret; - if (pwrpriv->bInternalAutoSuspend) - ret = rtw_resume_process23a(padapter); - else - ret = rtw_resume_process23a(padapter); + ret = rtw_resume_process23a(padapter); return ret; } @@ -565,7 +540,7 @@ int rtw_resume_process23a(struct rtw_adapter *padapter) if (padapter->pid[1] != 0) { DBG_8723A("pid[1]:%d\n", padapter->pid[1]); - rtw_signal_process(padapter->pid[1], SIGUSR2); + kill_pid(find_vpid(padapter->pid[1]), SIGUSR2, 1); } rtw23a_roaming(padapter, NULL); @@ -606,8 +581,7 @@ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, dvobj->padapters[dvobj->iface_nums++] = padapter; padapter->iface_id = IFACE_ID0; - /* step 1-1., decide the chip_type via vid/pid */ - decide_chip_type_by_usb_device_id(padapter, pdid); + rtl8723au_set_hw_type(padapter); if (rtw_handle_dualmac23a(padapter, 1) != _SUCCESS) goto free_adapter; @@ -617,24 +591,19 @@ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, if (rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj))) goto handle_dualmac; - /* step 2. hook HalFunc, allocate HalData */ - if (rtl8723au_set_hal_ops(padapter)) - return NULL; - - padapter->intf_start = &usb_intf_start; - padapter->intf_stop = &usb_intf_stop; - - /* step init_io_priv */ - rtw_init_io_priv23a(padapter, usb_set_intf_ops); + /* step 2. allocate HalData */ + padapter->HalData = kzalloc(sizeof(struct hal_data_8723a), GFP_KERNEL); + if (!padapter->HalData) + goto free_wdev; /* step read_chip_version */ - rtw_hal_read_chip_version23a(padapter); + rtl8723a_read_chip_version(padapter); /* step usb endpoint mapping */ - rtw_hal_chip_configure23a(padapter); + rtl8723au_chip_configure(padapter); /* step read efuse/eeprom data and get mac_addr */ - rtw_hal_read_chip_info23a(padapter); + rtl8723a_read_adapter_info(padapter); /* step 5. */ if (rtw_init_drv_sw23a(padapter) == _FAIL) { @@ -662,12 +631,10 @@ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, padapter->pwrctrlpriv.autopm_cnt = 1; #endif - /* set mac addr */ - rtw_macaddr_cfg23a(padapter->eeprompriv.mac_addr); -#ifdef CONFIG_8723AU_P2P - rtw_init_wifidirect_addrs23a(padapter, padapter->eeprompriv.mac_addr, - padapter->eeprompriv.mac_addr); -#endif + /* If the eeprom mac address is corrupted, assign a random address */ + if (is_broadcast_ether_addr(padapter->eeprompriv.mac_addr) || + is_zero_ether_addr(padapter->eeprompriv.mac_addr)) + eth_random_addr(padapter->eeprompriv.mac_addr); DBG_8723A("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n", padapter->bDriverStopped, padapter->bSurpriseRemoved, @@ -678,6 +645,7 @@ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, free_hal_data: if (status != _SUCCESS) kfree(padapter->HalData); +free_wdev: if (status != _SUCCESS) { rtw_wdev_unregister(padapter->rtw_wdev); rtw_wdev_free(padapter->rtw_wdev); |