static int CFG80211_VirtualIF_Open(PNET_DEV dev_p) { void *pAdSrc; PRTMP_ADAPTER pAd; pAdSrc = RtmpOsGetNetDevPriv(dev_p); ASSERT(pAdSrc); pAd = (PRTMP_ADAPTER)pAdSrc; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %d,%s\n", __FUNCTION__, dev_p->ifindex, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); //if (VIRTUAL_IF_UP(pAd) != 0) // return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); #ifdef RT_CFG80211_P2P_SUPPORT if (dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_CLIENT) { DBGPRINT(RT_DEBUG_TRACE, ("CFG80211_VirtualIF_Open\n")); pAd->flg_apcli_init = TRUE; ApCli_Open(pAd, dev_p); return 0; } #endif /* RT_CFG80211_P2P_SUPPORT */ RTMP_OS_NETDEV_START_QUEUE(dev_p); DBGPRINT(RT_DEBUG_TRACE, ("%s: <=== %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); return 0; }
static INT CFG80211_VirtualIF_Open(PNET_DEV dev_p) { VOID *pAdSrc; pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAdSrc); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %d,%s\n", __FUNCTION__, dev_p->ifindex, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); //if (VIRTUAL_IF_UP(pAd) != 0) // return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); if ((dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_CLIENT) #ifdef CFG80211_MULTI_STA || (dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_STATION) #endif /* CFG80211_MULTI_STA */ ) { DBGPRINT(RT_DEBUG_TRACE, ("CFG80211_VirtualIF_Open\n")); pAd->flg_apcli_init = TRUE; ApCli_Open(pAd, dev_p); return 0; } RTMP_OS_NETDEV_START_QUEUE(dev_p); DBGPRINT(RT_DEBUG_TRACE, ("%s: <=== %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); return 0; }
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: dev_p which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT ApCli_VirtualIF_Open( IN PNET_DEV dev_p) { UCHAR ifIndex; PRTMP_ADAPTER pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); if (VIRTUAL_IF_UP(pAd) != 0) return -1; // increase MODULE use count RT_MOD_INC_USE_COUNT(); for (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++) { if (pAd->ApCfg.ApCliTab[ifIndex].dev == dev_p) { RTMP_OS_NETDEV_START_QUEUE(dev_p); ApCliIfUp(pAd); } } return 0; } /* End of ApCli_VirtualIF_Open */
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT MBSS_VirtualIF_Open( IN PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev))); pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; pAd->ApCfg.MBSSID[BssId].bBcnSntReq = TRUE; if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(pDev); return 0; } /* End of MBSS_VirtualIF_Open */
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: dev_p which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ int P2P_VirtualIF_Open( IN PNET_DEV dev_p) { VOID *pAd; /*PMULTISSID_STRUCT pMbss; */ pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_OPEN_PRE, 0, dev_p, 0) != NDIS_STATUS_SUCCESS) return -1; if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(dev_p); if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_OPEN_POST, 0, dev_p, 0) != NDIS_STATUS_SUCCESS) return -1; DBGPRINT(RT_DEBUG_TRACE, ("%s: <=== %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); return 0; }
/* ======================================================================== Routine Description: Open raxx interface. Arguments: *net_dev the raxx interface pointer Return Value: 0 Open OK otherwise Open Fail Note: 1. if open fail, kernel will not call the close function. 2. Free memory for (1) Mlme Memory Handler: MlmeHalt() (2) TX & RX: RTMPFreeTxRxRingMemory() (3) BA Reordering: ba_reordering_resource_release() ======================================================================== */ int MainVirtualIF_open(IN struct net_device *net_dev) { RTMP_ADAPTER *pAd = NULL; GET_PAD_FROM_NET_DEV(pAd, net_dev); // Sanity check for pAd if (pAd == NULL) return 0; // close ok #ifdef CONFIG_AP_SUPPORT pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE; #endif // CONFIG_AP_SUPPORT // if (VIRTUAL_IF_UP(pAd) != 0) return -1; // increase MODULE use count RT_MOD_INC_USE_COUNT(); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); return 0; }
INT WdsVirtualIF_open(PNET_DEV dev) { VOID *pAd; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: ===> VirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(dev))); pAd = RTMP_OS_NETDEV_GET_PRIV(dev); if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(dev); return 0; }
INT WdsVirtualIF_open( IN PNET_DEV dev) { VOID *pAd; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> VirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(dev))); pAd = RTMP_OS_NETDEV_GET_PRIV(dev); if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(dev); return 0; }
static INT CFG80211_VirtualIF_Open(PNET_DEV dev_p) { VOID *pAdSrc; pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAdSrc); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %d,%s\n", __FUNCTION__, dev_p->ifindex, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); //if (VIRTUAL_IF_UP(pAd) != 0) // return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); #ifdef RT_CFG80211_P2P_SUPPORT if (dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_CLIENT) { DBGPRINT(RT_DEBUG_TRACE, ("CFG80211_VirtualIF_Open\n")); pAd->flg_apcli_init = TRUE; ApCli_Open(pAd, dev_p); return 0; } #endif /* RT_CFG80211_P2P_SUPPORT */ #ifdef CONFIG_SNIFFER_SUPPORT #ifdef CONFIG_AP_SUPPORT if(dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_MONITOR) { pAd->ApCfg.BssType = BSS_MONITOR; pAd->sniffer_ctl.sniffer_type = RADIOTAP_TYPE; AsicSetRxFilter(pAd); } #endif /*CONFIG_AP_SUPPORT*/ #endif /* CONFIG_SNIFFER_SUPPORT */ RTMP_OS_NETDEV_START_QUEUE(dev_p); DBGPRINT(RT_DEBUG_TRACE, ("%s: <=== %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); return 0; }
/* ======================================================================== Routine Description: Open raxx interface. Arguments: *net_dev the raxx interface pointer Return Value: 0 Open OK otherwise Open Fail Note: 1. if open fail, kernel will not call the close function. 2. Free memory for (1) Mlme Memory Handler: MlmeHalt() (2) TX & RX: RTMPFreeTxRxRingMemory() (3) BA Reordering: ba_reordering_resource_release() ======================================================================== */ int MainVirtualIF_open(IN struct net_device *net_dev) { RTMP_ADAPTER *pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); // Sanity check for pAd if (pAd == NULL) return 0; // close ok if (VIRTUAL_IF_UP(pAd) != 0) return -1; // increase MODULE use count RT_MOD_INC_USE_COUNT(); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); return 0; }
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: dev_p which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT ApCli_VirtualIF_Open(PNET_DEV dev_p) { VOID *pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_OPEN, 0, dev_p, 0); return 0; }
int MainVirtualIF_open(IN struct net_device *net_dev) { RTMP_ADAPTER *pAd = net_dev->ml_priv; if (pAd == NULL) return 0; if (VIRTUAL_IF_UP(pAd) != 0) return -1; RT_MOD_INC_USE_COUNT(); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); return 0; }
static INT CFG80211_VirtualIF_Open(struct net_device *dev_p) { struct rtmp_adapter *pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %d,%s\n", __FUNCTION__, dev_p->ifindex, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); //if (VIRTUAL_IF_UP(pAd) != 0) // return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(dev_p); DBGPRINT(RT_DEBUG_TRACE, ("%s: <=== %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); return 0; }
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT MBSS_VirtualIF_Open(struct net_device *pDev) { VOID *pAd; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev))); pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_OPEN, 0, pDev, 0); if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(pDev); return 0; }
INT WdsVirtualIF_open( IN PNET_DEV dev) { PRTMP_ADAPTER pAd; #ifdef RTL865X_SOC INT index; unsigned int linkid; #endif DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> VirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(dev))); pAd = RTMP_OS_NETDEV_GET_PRIV(dev); if (VIRTUAL_IF_UP(pAd) != 0) return -1; // increase MODULE use count RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(dev); return 0; }
/* ======================================================================== Routine Description: Open raxx interface. Arguments: *net_dev the raxx interface pointer Return Value: 0 Open OK otherwise Open Fail Note: 1. if open fail, kernel will not call the close function. 2. Free memory for (1) Mlme Memory Handler: MlmeHalt() (2) TX & RX: RTMPFreeTxRxRingMemory() (3) BA Reordering: ba_reordering_resource_release() ======================================================================== */ int MainVirtualIF_open(IN struct net_device *net_dev) { struct rt_rtmp_adapter *pAd = NULL; GET_PAD_FROM_NET_DEV(pAd, net_dev); /* Sanity check for pAd */ if (pAd == NULL) return 0; /* close ok */ if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); return 0; }
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: dev_p which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ int ApCli_VirtualIF_Open( IN PNET_DEV dev_p) { /* UCHAR ifIndex; */ VOID *pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_OPEN, 0, dev_p, 0); return 0; } /* End of ApCli_VirtualIF_Open */
static INT CFG80211_DummyP2pIf_Open( IN PNET_DEV dev_p) { struct wireless_dev *wdev = dev_p->ieee80211_ptr; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE VOID *pAdSrc; printk("CFG80211_DummyP2pIf_Open=======> Open\n"); pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ if (!wdev) return -EINVAL; wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO)); #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(dev_p); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetDevMac(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) wdev->wiphy->interface_modes |= BIT(RT_CMD_80211_IFTYPE_P2P_DEVICE); #endif /* LINUX_VERSION_CODE: 3.7.0 */ #ifndef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE wdev->iftype = RT_CMD_80211_IFTYPE_P2P_CLIENT; #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ return 0; }
static int rt2860_resume( struct pci_dev *pci_dev) { struct net_device *net_dev = pci_get_drvdata(pci_dev); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) INT32 retval; retval = pci_set_power_state(pci_dev, PCI_D0); pci_restore_state(pci_dev); if (pci_enable_device(pci_dev)) { printk("pci enable fail!\n"); return 0; } #endif DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n")); if (net_dev == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); } else pAd = (PRTMP_ADAPTER)RTMP_OS_NETDEV_GET_PRIV(net_dev); if (pAd != NULL) { if (VIRTUAL_IF_NUM(pAd) > 0) { netif_device_attach(net_dev); if (rt28xx_open((PNET_DEV)net_dev) != 0) { DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); return 0; } RT_MOD_INC_USE_COUNT(); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); } } DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); return 0; }
static int rt2860_resume( struct pci_dev *pci_dev) { struct net_device *net_dev = pci_get_drvdata(pci_dev); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) INT32 retval; // set the power state of a PCI device // PCI has 4 power states, DO (normal) ~ D3(less power) // in include/linux/pci.h, you can find that // #define PCI_D0 ((pci_power_t __force) 0) // #define PCI_D1 ((pci_power_t __force) 1) // #define PCI_D2 ((pci_power_t __force) 2) // #define PCI_D3hot ((pci_power_t __force) 3) // #define PCI_D3cold ((pci_power_t __force) 4) // #define PCI_UNKNOWN ((pci_power_t __force) 5) // #define PCI_POWER_ERROR ((pci_power_t __force) -1) retval = pci_set_power_state(pci_dev, PCI_D0); // restore the saved state of a PCI device pci_restore_state(pci_dev); // initialize device before it's used by a driver if (pci_enable_device(pci_dev)) { printk("pci enable fail!\n"); return 0; } #endif DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n")); if (net_dev == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); } else GET_PAD_FROM_NET_DEV(pAd, net_dev); if (pAd != NULL) { /* we can not use IFF_UP because ra0 down but ra1 up */ /* and 1 suspend/resume function for 1 module, not for each interface */ /* so Linux will call suspend/resume function once */ if (VIRTUAL_IF_NUM(pAd) > 0) { // mark device as attached from system and restart if needed netif_device_attach(net_dev); if (rt28xx_open((PNET_DEV)net_dev) != 0) { // open fail DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); return 0; } // increase MODULE use count RT_MOD_INC_USE_COUNT(); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); } } DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); return 0; }
static int rt_pci_resume(struct pci_dev *pci_dev) { struct net_device *net_dev = pci_get_drvdata(pci_dev); VOID *pAd = NULL; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) INT32 retval; /* Set the power state of a PCI device PCI has 4 power states, DO (normal) ~ D3(less power) you can find that in include/linux/pci.h #define PCI_D0 ((pci_power_t __force) 0) #define PCI_D1 ((pci_power_t __force) 1) #define PCI_D2 ((pci_power_t __force) 2) #define PCI_D3hot ((pci_power_t __force) 3) #define PCI_D3cold ((pci_power_t __force) 4) #define PCI_UNKNOWN ((pci_power_t __force) 5) #define PCI_POWER_ERROR ((pci_power_t __force) -1) */ retval = pci_set_power_state(pci_dev, PCI_D0); /* restore the saved state of a PCI device */ pci_restore_state(pci_dev); /* initialize device before it's used by a driver */ if (pci_enable_device(pci_dev)) { printk("pci enable fail!\n"); return 0; } #endif DBGPRINT(RT_DEBUG_TRACE, ("===>%s()\n", __FUNCTION__)); if (net_dev == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); } else GET_PAD_FROM_NET_DEV(pAd, net_dev); if (pAd != NULL) { ULONG IfNum; /* we can not use IFF_UP because ra0 down but ra1 up and 1 suspend/resume function for 1 module, not for each interface so Linux will call suspend/resume function once */ RTMP_DRIVER_VIRTUAL_INF_NUM_GET(pAd, &IfNum); if (IfNum > 0) /* if (VIRTUAL_IF_NUM(pAd) > 0) */ { /* mark device as attached from system and restart if needed */ netif_device_attach(net_dev); if (rt28xx_open((PNET_DEV)net_dev) != 0) { /* open fail */ DBGPRINT(RT_DEBUG_TRACE, ("<===%s()\n", __FUNCTION__)); return 0; } /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); /* RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); */ /* RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); */ RTMP_DRIVER_PCI_RESUME(pAd); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); } } DBGPRINT(RT_DEBUG_TRACE, ("<=== %s()\n", __FUNCTION__)); return 0; }
BOOLEAN CFG80211DRV_OpsChgVirtualInf(RTMP_ADAPTER *pAd, VOID *pData) { PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; UINT newType, oldType; CMD_RTPRIV_IOCTL_80211_VIF_PARM *pVifParm; pVifParm = (CMD_RTPRIV_IOCTL_80211_VIF_PARM *)pData; newType = pVifParm->newIfType; oldType = pVifParm->oldIfType; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE APCLI_STRUCT *pApCliEntry; struct wifi_dev *wdev; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; UINT apidx = 1; CHAR tr_tb_idx = MAX_LEN_OF_MAC_TABLE + apidx; printk(" CFG80211DRV_OpsChgVirtualInf newType %d oldType %d \n",newType,oldType); if (strcmp(pVifParm->net_dev->name, "p2p0") == 0) { switch (newType) { case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_TRACE, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; case RT_CMD_80211_IFTYPE_STATION: RTMP_CFG80211_RemoveVifEntry(pAd,cfg80211_ctrl->dummy_p2p_net_dev); RTMP_CFG80211_AddVifEntry(pAd, cfg80211_ctrl->dummy_p2p_net_dev, newType); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); break; case RT_CMD_80211_IFTYPE_P2P_CLIENT: pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev.if_dev = NULL; pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; pApCliEntry->wdev.if_dev= cfg80211_ctrl->dummy_p2p_net_dev; wdev = &pApCliEntry->wdev; wdev->wdev_type = WDEV_TYPE_STA; wdev->func_dev = pApCliEntry; wdev->sys_handle = (void *)pAd; DBGPRINT(RT_DEBUG_TRACE, ("ApCli_Open\n")); RTMP_CFG80211_RemoveVifEntry(pAd,cfg80211_ctrl->dummy_p2p_net_dev); /* TX */ RTMP_CFG80211_AddVifEntry(pAd, cfg80211_ctrl->dummy_p2p_net_dev, newType); wdev->tx_pkt_allowed = ApCliAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = sta_rx_pkt_allow; wdev->rx_pkt_foward = sta_rx_fwd_hnd; RTMP_OS_NETDEV_SET_PRIV(cfg80211_ctrl->dummy_p2p_net_dev, pAd); RTMP_OS_NETDEV_SET_WDEV(cfg80211_ctrl->dummy_p2p_net_dev, wdev); COPY_MAC_ADDR(wdev->if_addr,pAd->cfg80211_ctrl.P2PCurrentAddress); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(cfg80211_ctrl->dummy_p2p_net_dev))); RtmpOSNetDevFree(cfg80211_ctrl->dummy_p2p_net_dev); break; } pAd->flg_apcli_init = TRUE; ApCli_Open(pAd, cfg80211_ctrl->dummy_p2p_net_dev); // COPY_MAC_ADDR(wdev->if_addr,pAd->cfg80211_ctrl.P2PCurrentAddress); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); break; case RT_CMD_80211_IFTYPE_P2P_GO: // pNetDevOps->priv_flags = INT_P2P; /* The Behivaor in SetBeacon Ops */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; wdev = &pAd->ApCfg.MBSSID[apidx].wdev; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = &pAd->ApCfg.MBSSID[apidx]; wdev->func_idx = apidx; wdev->sys_handle = (void *)pAd; wdev->if_dev = cfg80211_ctrl->dummy_p2p_net_dev; /* BC/MC Handling */ wdev->tr_tb_idx = tr_tb_idx; tr_tb_set_mcast_entry(pAd, tr_tb_idx, wdev); RTMP_CFG80211_RemoveVifEntry(pAd,cfg80211_ctrl->dummy_p2p_net_dev); /* TX */ RTMP_CFG80211_AddVifEntry(pAd, cfg80211_ctrl->dummy_p2p_net_dev, newType); // RT_MOD_INC_USE_COUNT(); /* TX */ wdev->tx_pkt_allowed = ApAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = ap_rx_pkt_allow; wdev->rx_pkt_foward = ap_rx_foward_handle; wdev->rx_ps_handle = ap_rx_ps_handle; // RTMP_OS_NETDEV_START_QUEUE(cfg80211_ctrl->dummy_p2p_net_dev); RTMP_OS_NETDEV_SET_PRIV(cfg80211_ctrl->dummy_p2p_net_dev, pAd); RTMP_OS_NETDEV_SET_WDEV(cfg80211_ctrl->dummy_p2p_net_dev, wdev); wdev_bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); RTMP_OS_NETDEV_SET_PRIV(cfg80211_ctrl->dummy_p2p_net_dev, pAd); RTMP_OS_NETDEV_SET_WDEV(cfg80211_ctrl->dummy_p2p_net_dev, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(cfg80211_ctrl->dummy_p2p_net_dev))); RtmpOSNetDevFree(cfg80211_ctrl->dummy_p2p_net_dev); break; } COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.if_addr, pAd->cfg80211_ctrl.P2PCurrentAddress); COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.bssid, pAd->cfg80211_ctrl.P2PCurrentAddress); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); break; default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", newType)); } } if ((newType == RT_CMD_80211_IFTYPE_STATION) && (oldType == RT_CMD_80211_IFTYPE_P2P_CLIENT) && (pAd->flg_apcli_init == TRUE)) { DBGPRINT(RT_DEBUG_TRACE, ("ApCli_Close\n")); CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); // RT_MOD_DEC_USE_COUNT(); pAd->flg_apcli_init = FALSE; RT_MOD_INC_USE_COUNT(); printk("iverson ApCli_Close \n"); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; return ApCli_Close(pAd, cfg80211_ctrl->dummy_p2p_net_dev); } else if ((newType == RT_CMD_80211_IFTYPE_STATION) && (oldType == RT_CMD_80211_IFTYPE_P2P_GO)) { DBGPRINT(RT_DEBUG_TRACE, ("GOi_Close\n")); wdev_bcn_buf_deinit(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); // rtmp_wdev_idx_unreg(pAd, Wdev); // Wdev->if_dev = NULL; } #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE #ifndef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE /* After P2P NEGO phase, the device type may be change from GC to GO or no change. We remove the GC in VIF list if nego as GO case. */ if ((newType == RT_CMD_80211_IFTYPE_P2P_GO) && (oldType == RT_CMD_80211_IFTYPE_P2P_CLIENT)) { RTMP_CFG80211_VirtualIF_CancelP2pClient(pAd); } #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ #ifdef RT_CFG80211_P2P_SINGLE_DEVICE CFG80211DBG(RT_DEBUG_TRACE, ("80211> @@@ Change from %u to %u Mode\n",oldType,newType)); pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_DISABLE; if (newType == RT_CMD_80211_IFTYPE_P2P_CLIENT) { pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_CLI_UP; } else if (newType == RT_CMD_80211_IFTYPE_P2P_GO) { pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_GO_UP; } #endif /* RT_CFG80211_P2P_SINGLE_DEVICE */ /* Change Device Type */ #ifdef CONFIG_STA_SUPPORT if (newType == RT_CMD_80211_IFTYPE_ADHOC) { #ifdef DOT11_N_SUPPORT SetCommonHT(pAd); #endif /* DOT11_N_SUPPORT */ pAd->StaCfg.BssType = BSS_ADHOC; } else #endif /* CONFIG_STA_SUPPORT */ if ((newType == RT_CMD_80211_IFTYPE_STATION) || (newType == RT_CMD_80211_IFTYPE_P2P_CLIENT)) { CFG80211DBG(RT_DEBUG_TRACE, ("80211> Change the Interface to STA Mode\n")); #ifdef CONFIG_STA_SUPPORT if ((oldType == RT_CMD_80211_IFTYPE_ADHOC) && (newType == RT_CMD_80211_IFTYPE_STATION)) { /* DeviceType Change from adhoc to infra, only in StaCfg. CFG Todo: It should not bind by device. */ pAd->StaCfg.BssType = BSS_INFRA; } #endif /* CONFIG_STA_SUPPORT */ #ifdef CONFIG_AP_SUPPORT if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP) CFG80211DRV_DisableApInterface(pAd); #endif /* CONFIG_AP_SUPPORT */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; } else if ((newType == RT_CMD_80211_IFTYPE_AP) || (newType == RT_CMD_80211_IFTYPE_P2P_GO)) { CFG80211DBG(RT_DEBUG_TRACE, ("80211> Change the Interface to AP Mode\n")); pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; } #ifdef CONFIG_STA_SUPPORT else if (newType == RT_CMD_80211_IFTYPE_MONITOR) { /* set packet filter */ Set_NetworkType_Proc(pAd, "Monitor"); if (pVifParm->MonFilterFlag != 0) { UINT32 Filter = 0; #ifndef MT_MAC if (pAd->chipCap.hif_type != HIF_MT) { RTMP_IO_READ32(pAd, RX_FILTR_CFG, &Filter); if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_FCSFAIL) == RT_CMD_80211_FILTER_FCSFAIL) { Filter = Filter & (~0x01); } else { Filter = Filter | 0x01; } if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_PLCPFAIL) == RT_CMD_80211_FILTER_PLCPFAIL) { Filter = Filter & (~0x02); } else { Filter = Filter | 0x02; } if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_CONTROL) == RT_CMD_80211_FILTER_CONTROL) { Filter = Filter & (~0xFF00); } else { Filter = Filter | 0xFF00; } if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_OTHER_BSS) == RT_CMD_80211_FILTER_OTHER_BSS) { Filter = Filter & (~0x08); } else { Filter = Filter | 0x08; } RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Filter); } #endif /* MT_MAC */ pVifParm->MonFilterFlag = Filter; } } #endif /*CONFIG_STA_SUPPORT*/ if ((newType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (newType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pVifParm->net_dev->dev_addr); } else { #ifdef RT_CFG80211_P2P_SUPPORT pCfg80211_ctrl->bP2pCliPmEnable = FALSE; pCfg80211_ctrl->bPreKeepSlient = FALSE; pCfg80211_ctrl->bKeepSlient = FALSE; pCfg80211_ctrl->NoAIndex = MAX_LEN_OF_MAC_TABLE; pCfg80211_ctrl->MyGOwcid = MAX_LEN_OF_MAC_TABLE; pCfg80211_ctrl->CTWindows= 0; /* CTWindows and OppPS parameter field */ #endif /* RT_CFG80211_P2P_SUPPORT */ } if(pCfg80211_ctrl == NULL) CFG80211DBG(RT_DEBUG_TRACE, ("(%s)pCfg80211_ctrl is null",__FUNCTION__)); return TRUE; }