static void sd_intf_stop(PADAPTER padapter) { if (padapter == NULL) { DBG_871X(KERN_ERR "%s: padapter is NULL!\n", __func__); return; } // hal dep rtw_hal_disable_interrupt(padapter); }
static void gspi_intf_stop(PADAPTER padapter) { PGSPI_DATA pgspi; if (padapter == NULL) { DBG_871X(KERN_ERR "%s: padapter is NULL!\n", __FUNCTION__); return; } pgspi = &adapter_to_dvobj(padapter)->intf_data; if (pgspi->priv_wq) { cancel_delayed_work_sync(&pgspi->irq_work); flush_workqueue(pgspi->priv_wq); destroy_workqueue(pgspi->priv_wq); pgspi->priv_wq = NULL; } //hal dep rtw_hal_disable_interrupt(padapter); disable_irq(oob_irq); }
int rtw_resume_process(_adapter *padapter) { struct net_device *pnetdev; struct pwrctrl_priv *pwrpriv; u8 is_pwrlock_hold_by_caller; u8 is_directly_called_by_auto_resume; int ret = 0; u32 start_time = rtw_get_current_time(); _func_enter_; DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); rtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_ON); rtw_mdelay_os(1); { u32 ret = 0; DBG_8192C("read start:\n"); //spi_write8_endian(padapter, SPI_LOCAL_OFFSET | 0xF0, 0x01, 1); rtw_write8(padapter, SPI_LOCAL_OFFSET | 0xF0, 0x03); ret = rtw_read32(padapter, SPI_LOCAL_OFFSET | 0xF0); DBG_8192C("read end 0xF0 read32:%x:\n", ret); DBG_8192C("read end 0xF0 read8:%x:\n", rtw_read8(padapter, SPI_LOCAL_OFFSET | 0xF0)); } if (padapter) { pnetdev = padapter->pnetdev; pwrpriv = &padapter->pwrctrlpriv; } else { ret = -1; goto exit; } // interface init if (gspi_init(adapter_to_dvobj(padapter)) != _SUCCESS) { ret = -1; RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__)); goto exit; } rtw_hal_disable_interrupt(padapter); if (gspi_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) { ret = -1; RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: gspi_alloc_irq Failed!!\n", __FUNCTION__)); goto exit; } rtw_reset_drv_sw(padapter); pwrpriv->bkeepfwalive = _FALSE; DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); if(pm_netdev_open(pnetdev,_TRUE) != 0) { ret = -1; goto exit; } netif_device_attach(pnetdev); netif_carrier_on(pnetdev); if( padapter->pid[1]!=0) { DBG_871X("pid[1]:%d\n",padapter->pid[1]); rtw_signal_process(padapter->pid[1], SIGUSR2); } #ifdef CONFIG_LAYER2_ROAMING_RESUME rtw_roaming(padapter, NULL); #endif #ifdef CONFIG_RESUME_IN_WORKQUEUE rtw_unlock_suspend(); #endif //CONFIG_RESUME_IN_WORKQUEUE exit: pwrpriv->bInSuspend = _FALSE; DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ , ret, rtw_get_passing_time_ms(start_time)); _func_exit_; return ret; }
static PADAPTER rtw_gspi_if1_init(struct dvobj_priv *dvobj) { int status = _FAIL; struct net_device *pnetdev; PADAPTER padapter = NULL; padapter = (PADAPTER)rtw_zvmalloc(sizeof(*padapter)); if (NULL == padapter) { goto exit; } padapter->dvobj = dvobj; dvobj->if1 = padapter; padapter->bDriverStopped = _TRUE; #if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) //set adapter_type/iface type for primary padapter padapter->isprimary = _TRUE; padapter->adapter_type = PRIMARY_ADAPTER; #ifndef CONFIG_HWPORT_SWAP padapter->iface_type = IFACE_PORT0; #else padapter->iface_type = IFACE_PORT1; #endif #endif padapter->hw_init_mutex = &drvpriv.hw_init_mutex; #ifdef CONFIG_CONCURRENT_MODE //set global variable to primary adapter padapter->ph2c_fwcmd_mutex = &drvpriv.h2c_fwcmd_mutex; padapter->psetch_mutex = &drvpriv.setch_mutex; padapter->psetbw_mutex = &drvpriv.setbw_mutex; #endif padapter->interface_type = RTW_GSPI; decide_chip_type_by_device_id(padapter); //3 1. init network device data pnetdev = rtw_init_netdev(padapter); if (!pnetdev) goto free_adapter; SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); #ifdef CONFIG_IOCTL_CFG80211 rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)); #endif //3 3. init driver special setting, interface, OS and hardware relative //4 3.1 set hardware operation functions hal_set_hal_ops(padapter); //3 5. initialize Chip version padapter->intf_start = &gspi_intf_start; padapter->intf_stop = &gspi_intf_stop; if (rtw_init_io_priv(padapter, spi_set_intf_ops) == _FAIL) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("rtw_drv_init: Can't init io_priv\n")); goto free_hal_data; } { u32 ret = 0; DBG_8192C("read start:\n"); //spi_write8_endian(padapter, SPI_LOCAL_OFFSET | 0xF0, 0x01, 1); rtw_write8(padapter, SPI_LOCAL_OFFSET | 0xF0, 0x03); ret = rtw_read32(padapter, SPI_LOCAL_OFFSET | 0xF0); DBG_8192C("read end 0xF0 read32:%x:\n", ret); DBG_8192C("read end 0xF0 read8:%x:\n", rtw_read8(padapter, SPI_LOCAL_OFFSET | 0xF0)); } rtw_hal_read_chip_version(padapter); rtw_hal_chip_configure(padapter); //3 6. read efuse/eeprom data rtw_hal_read_chip_info(padapter); //3 7. init driver common data if (rtw_init_drv_sw(padapter) == _FAIL) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("rtw_drv_init: Initialize driver software resource Failed!\n")); goto free_hal_data; } //3 8. get WLan MAC address // alloc dev name after read efuse. rtw_init_netdev_name(pnetdev, padapter->registrypriv.ifname); rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); rtw_hal_disable_interrupt(padapter); //3 9. Tell the network stack we exist if (register_netdev(pnetdev) != 0) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("rtw_drv_init: register_netdev() failed\n")); goto free_hal_data; } DBG_871X("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" ,padapter->bDriverStopped ,padapter->bSurpriseRemoved ,padapter->bup ,padapter->hw_init_completed ); #ifdef CONFIG_HOSTAPD_MLME hostapd_mode_init(padapter); #endif status = _SUCCESS; free_hal_data: if (status != _SUCCESS && padapter->HalData) rtw_mfree(padapter->HalData, sizeof(*(padapter->HalData))); free_wdev: if (status != _SUCCESS) { #ifdef CONFIG_IOCTL_CFG80211 rtw_wdev_free(padapter->rtw_wdev); #endif } free_adapter: if (status != _SUCCESS) { if (pnetdev) rtw_free_netdev(pnetdev); else if (padapter) rtw_vmfree((u8*)padapter, sizeof(*padapter)); padapter = NULL; } exit: return padapter; }
_adapter *rtw_sdio_if1_init(struct dvobj_priv *dvobj, const struct sdio_device_id *pdid){ int status = _FAIL; struct net_device *pnetdev; PADAPTER padapter = NULL; u8 mac_addr[ETH_ALEN]; u16 fw_ready; u32 i; _func_enter_; if ((padapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter))) == NULL) { DBG_871X("%s: vmalloc for padapter failed!\n", __FUNCTION__); goto exit; } padapter->dvobj = dvobj; dvobj->if1 = padapter; padapter->interface_type = RTW_SDIO; // 1. init network device data pnetdev = rtw_init_netdev(padapter); if (!pnetdev) goto free_adapter; SET_NETDEV_DEV(pnetdev, &dvobj->intf_data.func->dev); padapter = rtw_netdev_priv(pnetdev); // 2. init driver special setting, interface, OS and hardware relative rtw_set_hal_ops(padapter); // 3. initialize Chip version padapter->intf_start = &sd_intf_start; padapter->intf_stop = &sd_intf_stop; padapter->intf_init = &sdio_init; padapter->intf_deinit = &sdio_deinit; padapter->intf_alloc_irq = &sdio_alloc_irq; padapter->intf_free_irq = &sdio_free_irq; sdio_set_intf_ops(padapter, &padapter->io_ops); // 4. init driver common data if (rtw_init_drv_sw(padapter) == _FAIL) { goto free_adapter; } // 5. get MAC address mac_addr[0] = 0x00; mac_addr[1] = 0xe0; mac_addr[2] = 0x4c; mac_addr[3] = 0xB7; mac_addr[4] = 0x23; mac_addr[5] = 0x00; _rtw_memcpy(pnetdev->dev_addr, mac_addr, ETH_ALEN); #ifdef CONFIG_FWDL // wait for the device boot code ready for (i=0;i<100;i++) { fw_ready = rtw_read16(padapter, SDIO_REG_HCPWM2); if (fw_ready & SDIO_INIT_DONE) { break; } rtw_msleep_os(10); } if (i==100) { DBG_871X("%s: Wait Device Firmware Ready Timeout!!SDIO_REG_HCPWM2 @ 0x%04x\n", __FUNCTION__, fw_ready); goto free_adapter; } #else // wait for the device firmware ready for (i=0;i<100;i++) { fw_ready = rtw_read8(padapter, SDIO_REG_CPU_IND); if (fw_ready & SDIO_SYSTEM_TRX_RDY_IND) { break; } rtw_msleep_os(10); } if (i==100) { DBG_871X("%s: Wait Device Firmware Ready Timeout!!SDIO_REG_CPU_IND @ 0x%04x\n", __FUNCTION__, fw_ready); goto free_adapter; } #endif rtw_hal_disable_interrupt(padapter); DBG_871X("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d\n" ,padapter->bDriverStopped ,padapter->bSurpriseRemoved ,padapter->bup ); status = _SUCCESS; free_adapter: if (status != _SUCCESS) { if (pnetdev) rtw_free_netdev(pnetdev); else rtw_vmfree((u8*)padapter, sizeof(*padapter)); padapter = NULL; } exit: _func_exit_; return padapter; }