/* * Jeff: this function should be called under ioctl (rtnl_lock is accquired) while * LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */ int rtw_change_ifname(_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 (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) if(!rtnl_is_locked()) unregister_netdev(cur_pnetdev); else #endif unregister_netdevice(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); _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) if(!rtnl_is_locked()) ret = register_netdev(pnetdev); else #endif ret = register_netdevice(pnetdev); if ( ret != 0) { RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); goto error; } return 0; error: return -1; }
int rtl88eu_download_fw(struct adapter *adapt) { struct dvobj_priv *dvobj = adapter_to_dvobj(adapt); struct device *device = dvobj_to_dev(dvobj); const struct firmware *fw; const char fw_name[] = "rtlwifi/rtl8188eufw.bin"; struct rtl92c_firmware_header *pfwheader = NULL; u8 *download_data, *fw_data; size_t download_size; unsigned int trailing_zeros_length; if (request_firmware(&fw, fw_name, device)) { dev_err(device, "Firmware %s not available\n", fw_name); return -ENOENT; } if (fw->size > FW_8188E_SIZE) { dev_err(device, "Firmware size exceed 0x%X. Check it.\n", FW_8188E_SIZE); release_firmware(fw); return -1; } trailing_zeros_length = (4 - fw->size % 4) % 4; fw_data = kmalloc(fw->size + trailing_zeros_length, GFP_KERNEL); if (!fw_data) { release_firmware(fw); return -ENOMEM; } memcpy(fw_data, fw->data, fw->size); memset(fw_data + fw->size, 0, trailing_zeros_length); pfwheader = (struct rtl92c_firmware_header *)fw_data; if (IS_FW_HEADER_EXIST(pfwheader)) { download_data = fw_data + 32; download_size = fw->size + trailing_zeros_length - 32; } else { download_data = fw_data; download_size = fw->size + trailing_zeros_length; } release_firmware(fw); if (usb_read8(adapt, REG_MCUFWDL) & RAM_DL_SEL) { usb_write8(adapt, REG_MCUFWDL, 0); rtl88e_firmware_selfreset(adapt); } _rtl88e_enable_fw_download(adapt, true); usb_write8(adapt, REG_MCUFWDL, usb_read8(adapt, REG_MCUFWDL) | FWDL_ChkSum_rpt); _rtl88e_write_fw(adapt, download_data, download_size); _rtl88e_enable_fw_download(adapt, false); kfree(fw_data); return _rtl88e_fw_free_to_go(adapt); }
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; }
/* * drv_init() - a device potentially for us * * notes: drv_init() is called when the bus driver has located a card * for us to support. * We accept the new device by returning 0. */ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, struct usb_interface *pusb_intf, const struct usb_device_id *pdid) { struct rtw_adapter *padapter = NULL; struct net_device *pnetdev = NULL; int status = _FAIL; pnetdev = rtw_init_netdev23a(padapter); if (!pnetdev) goto free_adapter; padapter = netdev_priv(pnetdev); padapter->dvobj = dvobj; padapter->bDriverStopped = true; dvobj->if1 = padapter; dvobj->padapters[dvobj->iface_nums++] = padapter; padapter->iface_id = IFACE_ID0; rtl8723au_set_hw_type(padapter); SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); if (rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj))) goto free_adapter; /* step 2. allocate HalData */ padapter->HalData = kzalloc(sizeof(struct hal_data_8723a), GFP_KERNEL); if (!padapter->HalData) goto free_wdev; /* step read_chip_version */ rtl8723a_read_chip_version(padapter); /* step usb endpoint mapping */ if (!rtl8723au_chip_configure(padapter)) goto free_hal_data; /* step read efuse/eeprom data and get mac_addr */ rtl8723a_read_adapter_info(padapter); /* step 5. */ if (rtw_init_drv_sw23a(padapter) == _FAIL) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("Initialize driver software resource Failed!\n")); goto free_hal_data; } #ifdef CONFIG_PM if (padapter->pwrctrlpriv.bSupportRemoteWakeup) { dvobj->pusbdev->do_remote_wakeup = 1; pusb_intf->needs_remote_wakeup = 1; device_init_wakeup(&pusb_intf->dev, 1); DBG_8723A("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); DBG_8723A("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n", device_may_wakeup(&pusb_intf->dev)); } #endif /* 2012-07-11 Move here to prevent the 8723AS-VAU BT * auto suspend influence */ if (usb_autopm_get_interface(pusb_intf) < 0) DBG_8723A("can't get autopm:\n"); #ifdef CONFIG_8723AU_BT_COEXIST padapter->pwrctrlpriv.autopm_cnt = 1; #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, padapter->bup, padapter->hw_init_completed ); status = _SUCCESS; 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); } free_adapter: if (status != _SUCCESS) { if (pnetdev) free_netdev(pnetdev); padapter = NULL; } return padapter; }
static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, struct usb_interface *pusb_intf, const struct usb_device_id *pdid) { struct adapter *padapter = NULL; struct net_device *pnetdev = NULL; int status = _FAIL; padapter = (struct adapter *)vzalloc(sizeof(*padapter)); if (padapter == NULL) goto exit; padapter->dvobj = dvobj; dvobj->if1 = padapter; padapter->bDriverStopped = true; mutex_init(&padapter->hw_init_mutex); padapter->chip_type = RTL8188E; pnetdev = rtw_init_netdev(padapter); if (pnetdev == NULL) goto free_adapter; SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); padapter = rtw_netdev_priv(pnetdev); /* step 2. hook HalFunc, allocate HalData */ hal_set_hal_ops(padapter); padapter->intf_start = &usb_intf_start; padapter->intf_stop = &usb_intf_stop; /* step read_chip_version */ rtw_hal_read_chip_version(padapter); /* step usb endpoint mapping */ rtw_hal_chip_configure(padapter); /* step read efuse/eeprom data and get mac_addr */ rtw_hal_read_chip_info(padapter); /* step 5. */ if (rtw_init_drv_sw(padapter) == _FAIL) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("Initialize driver software resource Failed!\n")); goto free_hal_data; } #ifdef CONFIG_PM if (padapter->pwrctrlpriv.bSupportRemoteWakeup) { dvobj->pusbdev->do_remote_wakeup = 1; pusb_intf->needs_remote_wakeup = 1; device_init_wakeup(&pusb_intf->dev, 1); DBG_88E("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); DBG_88E("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n", device_may_wakeup(&pusb_intf->dev)); } #endif /* 2012-07-11 Move here to prevent the 8723AS-VAU BT auto * suspend influence */ if (usb_autopm_get_interface(pusb_intf) < 0) DBG_88E("can't get autopm:\n"); /* alloc dev name after read efuse. */ rtw_init_netdev_name(pnetdev, padapter->registrypriv.ifname); rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); DBG_88E("MAC Address from pnetdev->dev_addr = %pM\n", pnetdev->dev_addr); /* step 6. Tell the network stack we exist */ if (register_netdev(pnetdev) != 0) { RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("register_netdev() failed\n")); goto free_hal_data; } DBG_88E("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" , padapter->bDriverStopped , padapter->bSurpriseRemoved , padapter->bup , padapter->hw_init_completed ); status = _SUCCESS; free_hal_data: if (status != _SUCCESS) kfree(padapter->HalData); free_adapter: if (status != _SUCCESS) { if (pnetdev) rtw_free_netdev(pnetdev); else if (padapter) vfree(padapter); padapter = NULL; } exit: return padapter; }
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; }