BOOLEAN CFG80211DRV_OpsChgVirtualInf(RTMP_ADAPTER *pAd, VOID *pData) { PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; CFG80211_CB *p80211CB = pAd->pCfg80211_CB; 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_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_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 */ #ifdef CONFIG_STA_SUPPORT /* Change Device Type */ if (newType == RT_CMD_80211_IFTYPE_ADHOC) { Set_NetworkType_Proc(pAd, "Adhoc"); } else 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_AP_SUPPORT if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP && RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) CFG80211DRV_DisableApInterface(pAd); #endif /* CONFIG_AP_SUPPORT */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; } else #endif /*CONFIG_STA_SUPPORT*/ 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; 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); 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 */ } return TRUE; }
bool CFG80211DRV_OpsChgVirtualInf(struct rtmp_adapter *pAd, VOID *pData) { PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; struct mt7612u_cfg80211_cb *p80211CB = pAd->pCfg80211_CB; 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_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_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 */ #ifdef CONFIG_STA_SUPPORT /* Change Device Type */ if (newType == RT_CMD_80211_IFTYPE_ADHOC) { Set_NetworkType_Proc(pAd, "Adhoc"); } else 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_AP_SUPPORT if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP && RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) CFG80211DRV_DisableApInterface(pAd); #endif /* CONFIG_AP_SUPPORT */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; } else #endif /*CONFIG_STA_SUPPORT*/ 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_t Filter; Filter = mt76u_reg_read(pAd, RX_FILTR_CFG); 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; } mt76u_reg_write(pAd, RX_FILTR_CFG, Filter); 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 { } return true; }
BOOLEAN CFG80211DRV_Connect( VOID *pAdOrg, VOID *pData) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_CONNECT *pConnInfo; UCHAR SSID[NDIS_802_11_LENGTH_SSID]; UINT32 SSIDLen; pConnInfo = (CMD_RTPRIV_IOCTL_80211_CONNECT *)pData; /* change to infrastructure mode if we are in ADHOC mode */ Set_NetworkType_Proc(pAd, "Infra"); /* set authentication mode */ if (pConnInfo->WpaVer == 2) { if (pConnInfo->FlgIs8021x == TRUE) Set_AuthMode_Proc(pAd, "WPA2"); else Set_AuthMode_Proc(pAd, "WPA2PSK"); /* End of if */ } else if (pConnInfo->WpaVer == 1) { if (pConnInfo->FlgIs8021x == TRUE) Set_AuthMode_Proc(pAd, "WPA"); else Set_AuthMode_Proc(pAd, "WPAPSK"); /* End of if */ } else if (pConnInfo->FlgIsAuthOpen == FALSE) Set_AuthMode_Proc(pAd, "SHARED"); else Set_AuthMode_Proc(pAd, "OPEN"); /* End of if */ CFG80211DBG(RT_DEBUG_ERROR, ("80211> AuthMode = %d\n", pAd->StaCfg.AuthMode)); /* set encryption mode */ if (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_CCMP) Set_EncrypType_Proc(pAd, "AES"); else if (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_TKIP) Set_EncrypType_Proc(pAd, "TKIP"); else if (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_WEP) { Set_EncrypType_Proc(pAd, "WEP"); } else if (pConnInfo->GroupwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_CCMP) Set_EncrypType_Proc(pAd, "AES"); else if (pConnInfo->GroupwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_TKIP) Set_EncrypType_Proc(pAd, "TKIP"); else Set_EncrypType_Proc(pAd, "NONE"); /* End of if */ CFG80211DBG(RT_DEBUG_ERROR, ("80211> EncrypType = %d\n", pAd->StaCfg.WepStatus)); /* set channel: STATION will auto-scan */ /* set WEP key */ if (pConnInfo->pKey && ((pConnInfo->GroupwiseEncrypType | pConnInfo->PairwiseEncrypType) & RT_CMD_80211_CONN_ENCRYPT_WEP)) { UCHAR KeyBuf[50]; /* reset AuthMode and EncrypType */ Set_AuthMode_Proc(pAd, "SHARED"); Set_EncrypType_Proc(pAd, "WEP"); /* reset key */ #ifdef RT_CFG80211_DEBUG hex_dump("KeyBuf=", (UINT8 *)pConnInfo->pKey, pConnInfo->KeyLen); #endif /* RT_CFG80211_DEBUG */ pAd->StaCfg.DefaultKeyId = pConnInfo->KeyIdx; /* base 0 */ if (pConnInfo->KeyLen >= sizeof(KeyBuf)) return FALSE; /* End of if */ memcpy(KeyBuf, pConnInfo->pKey, pConnInfo->KeyLen); KeyBuf[pConnInfo->KeyLen] = 0x00; CFG80211DBG(RT_DEBUG_ERROR, ("80211> pAd->StaCfg.DefaultKeyId = %d\n", pAd->StaCfg.DefaultKeyId)); switch(pConnInfo->KeyIdx) { case 1: default: Set_Key1_Proc(pAd, (PSTRING)KeyBuf); break; case 2: Set_Key2_Proc(pAd, (PSTRING)KeyBuf); break; case 3: Set_Key3_Proc(pAd, (PSTRING)KeyBuf); break; case 4: Set_Key4_Proc(pAd, (PSTRING)KeyBuf); break; } /* End of switch */ } /* End of if */ /* TODO: We need to provide a command to set BSSID to associate a AP */ /* re-set SSID */ pAd->StaCfg.bAutoReconnect = TRUE; pAd->FlgCfg80211Connecting = TRUE; SSIDLen = pConnInfo->SsidLen; if (SSIDLen > NDIS_802_11_LENGTH_SSID) SSIDLen = NDIS_802_11_LENGTH_SSID; /* End of if */ memset(&SSID, 0, sizeof(SSID)); memcpy(SSID, pConnInfo->pSsid, SSIDLen); Set_SSID_Proc(pAd, (PSTRING)SSID); CFG80211DBG(RT_DEBUG_ERROR, ("80211> SSID = %s\n", SSID)); #endif /* CONFIG_STA_SUPPORT */ return TRUE; }
BOOLEAN CFG80211DRV_OpsChgVirtualInf( VOID *pAdOrg, VOID *pFlgFilter, UINT8 IfType) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; UINT32 FlgFilter = *(UINT32 *)pFlgFilter; /* change type */ if (IfType == RT_CMD_80211_IFTYPE_ADHOC) Set_NetworkType_Proc(pAd, "Adhoc"); else if (IfType == RT_CMD_80211_IFTYPE_STATION) Set_NetworkType_Proc(pAd, "Infra"); else if (IfType == RT_CMD_80211_IFTYPE_MONITOR) { /* set packet filter */ Set_NetworkType_Proc(pAd, "Monitor"); if (FlgFilter != 0) { UINT32 Filter; RTMP_IO_READ32(pAd, RX_FILTR_CFG, &Filter); if ((FlgFilter & RT_CMD_80211_FILTER_FCSFAIL) == \ RT_CMD_80211_FILTER_FCSFAIL) { Filter = Filter & (~0x01); } else Filter = Filter | 0x01; /* End of if */ if ((FlgFilter & RT_CMD_80211_FILTER_PLCPFAIL) == \ RT_CMD_80211_FILTER_PLCPFAIL) { Filter = Filter & (~0x02); } else Filter = Filter | 0x02; /* End of if */ if ((FlgFilter & RT_CMD_80211_FILTER_CONTROL) == \ RT_CMD_80211_FILTER_CONTROL) { Filter = Filter & (~0xFF00); } else Filter = Filter | 0xFF00; /* End of if */ if ((FlgFilter & RT_CMD_80211_FILTER_OTHER_BSS) == \ RT_CMD_80211_FILTER_OTHER_BSS) { Filter = Filter & (~0x08); } else Filter = Filter | 0x08; /* End of if */ RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Filter); *(UINT32 *)pFlgFilter = Filter; } /* End of if */ return TRUE; /* not need to set SSID */ } /* End of if */ pAd->StaCfg.bAutoReconnect = TRUE; CFG80211DBG(RT_DEBUG_ERROR, ("80211> SSID = %s\n", pAd->CommonCfg.Ssid)); Set_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid); #endif /* CONFIG_STA_SUPPORT */ return TRUE; }
BOOLEAN CFG80211DRV_OpsSetChannel( VOID *pAdOrg, VOID *pData) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_CHAN *pChan; UINT8 ChanId; UINT8 IfType; UINT8 ChannelType; STRING ChStr[5] = { 0 }; #ifdef DOT11_N_SUPPORT UCHAR BW_Old; BOOLEAN FlgIsChanged; #endif /* DOT11_N_SUPPORT */ /* init */ pChan = (CMD_RTPRIV_IOCTL_80211_CHAN *)pData; ChanId = pChan->ChanId; IfType = pChan->IfType; ChannelType = pChan->ChanType; #ifdef DOT11_N_SUPPORT if (IfType != RT_CMD_80211_IFTYPE_MONITOR) { /* get channel BW */ FlgIsChanged = FALSE; BW_Old = pAd->CommonCfg.RegTransmitSetting.field.BW; /* set to new channel BW */ if (ChannelType == RT_CMD_80211_CHANTYPE_HT20) { pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; FlgIsChanged = TRUE; } else if ((ChannelType == RT_CMD_80211_CHANTYPE_HT40MINUS) || (ChannelType == RT_CMD_80211_CHANTYPE_HT40PLUS)) { /* not support NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS */ /* i.e. primary channel = 36, secondary channel must be 40 */ pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; FlgIsChanged = TRUE; } /* End of if */ CFG80211DBG(RT_DEBUG_ERROR, ("80211> New BW = %d\n", pAd->CommonCfg.RegTransmitSetting.field.BW)); /* change HT/non-HT mode (do NOT change wireless mode here) */ if (((ChannelType == RT_CMD_80211_CHANTYPE_NOHT) && (pAd->CommonCfg.HT_Disable == 0)) || ((ChannelType != RT_CMD_80211_CHANTYPE_NOHT) && (pAd->CommonCfg.HT_Disable == 1))) { if (ChannelType == RT_CMD_80211_CHANTYPE_NOHT) pAd->CommonCfg.HT_Disable = 1; else pAd->CommonCfg.HT_Disable = 0; /* End of if */ FlgIsChanged = TRUE; CFG80211DBG(RT_DEBUG_ERROR, ("80211> HT Disable = %d\n", pAd->CommonCfg.HT_Disable)); } /* End of if */ } else { /* for monitor mode */ FlgIsChanged = TRUE; pAd->CommonCfg.HT_Disable = 0; pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; } /* End of if */ if (FlgIsChanged == TRUE) SetCommonHT(pAd); /* End of if */ #endif /* DOT11_N_SUPPORT */ /* switch to the channel */ sprintf(ChStr, "%d", ChanId); if (Set_Channel_Proc(pAd, ChStr) == FALSE) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> Change channel fail!\n")); } /* End of if */ #ifdef CONFIG_STA_SUPPORT #ifdef DOT11_N_SUPPORT if ((IfType == RT_CMD_80211_IFTYPE_STATION) && (FlgIsChanged == TRUE)) { /* 1. Station mode; 2. New BW settings is 20MHz but current BW is not 20MHz; 3. New BW settings is 40MHz but current BW is 20MHz; Re-connect to the AP due to BW 20/40 or HT/non-HT change. */ Set_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid); } /* End of if */ #endif /* DOT11_N_SUPPORT */ if (IfType == RT_CMD_80211_IFTYPE_ADHOC) { /* update IBSS beacon */ MlmeUpdateTxRates(pAd, FALSE, 0); MakeIbssBeacon(pAd); AsicEnableIbssSync(pAd); Set_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid); } /* End of if */ if (IfType == RT_CMD_80211_IFTYPE_MONITOR) { /* reset monitor mode in the new channel */ Set_NetworkType_Proc(pAd, "Monitor"); RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, pChan->MonFilterFlag); } /* End of if */ #endif /* CONFIG_STA_SUPPORT */ return TRUE; }
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; }