BOOLEAN CFG80211DRV_OpsExtraIesSet( VOID *pAdOrg) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CFG80211_CB *pCfg80211_CB = pAd->pCfg80211_CB; UINT ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len; CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> %d\n", ie_len)); if (pAd->StaCfg.pWpsProbeReqIe) { os_free_mem(NULL, pAd->StaCfg.pWpsProbeReqIe); pAd->StaCfg.pWpsProbeReqIe = NULL; } pAd->StaCfg.WpsProbeReqIeLen = 0; CFG80211DBG(RT_DEBUG_ERROR, ("80211> is_wpa_supplicant_up ==> %d\n", pAd->StaCfg.WpaSupplicantUP)); os_alloc_mem(pAd, (UCHAR **)&(pAd->StaCfg.pWpsProbeReqIe), ie_len); if (pAd->StaCfg.pWpsProbeReqIe) { memcpy(pAd->StaCfg.pWpsProbeReqIe, pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len); pAd->StaCfg.WpsProbeReqIeLen = ie_len; //hex_dump("WpsProbeReqIe", pAd->StaCfg.pWpsProbeReqIe, pAd->StaCfg.WpsProbeReqIeLen); DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPS_PROBE_REQ_IE, WpsProbeReqIeLen = %d!!\n", pAd->StaCfg.WpsProbeReqIeLen)); } else { CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail. \n")); return FALSE; } return TRUE; }
VOID CFG80211DRV_OpsChangeBssParm( VOID *pAdOrg, VOID *pData) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_BSS_PARM *pBssInfo; BOOLEAN TxPreamble; CFG80211DBG(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__)); pBssInfo = (CMD_RTPRIV_IOCTL_80211_BSS_PARM *)pData; /* Short Preamble */ if (pBssInfo->use_short_preamble != -1) { CFG80211DBG(RT_DEBUG_TRACE, ("%s: ShortPreamble %d\n", __FUNCTION__, pBssInfo->use_short_preamble)); pAd->CommonCfg.TxPreamble = (pBssInfo->use_short_preamble == 0 ? Rt802_11PreambleLong : Rt802_11PreambleShort); TxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1); MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); } /* CTS Protection */ if (pBssInfo->use_cts_prot != -1) { CFG80211DBG(RT_DEBUG_TRACE, ("%s: CTS Protection %d\n", __FUNCTION__, pBssInfo->use_cts_prot)); } /* Short Slot */ if (pBssInfo->use_short_slot_time != -1) { CFG80211DBG(RT_DEBUG_TRACE, ("%s: Short Slot %d\n", __FUNCTION__, pBssInfo->use_short_slot_time)); } }
/* ======================================================================== Routine Description: Get site survey information. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface Idx - pSurvey - Return Value: 0 - success -x - fail Note: For iw utility: survey dump ======================================================================== */ static int CFG80211_OpsSurveyGet( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN int Idx, IN struct survey_info *pSurvey) { struct rtmp_adapter *pAd; CMD_RTPRIV_IOCTL_80211_SURVEY SurveyInfo; if (Idx != 0) return -ENOENT; /* End of if */ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); /* get information from driver */ RTMP_DRIVER_80211_SURVEY_GET(pAd, &SurveyInfo); /* return the information to upper layer */ pSurvey->channel = ((CFG80211_CB *)(SurveyInfo.pCfg80211))->pCfg80211_Channels; pSurvey->filled = SURVEY_INFO_TIME_BUSY | SURVEY_INFO_TIME_EXT_BUSY; pSurvey->time_busy = SurveyInfo.ChannelTimeBusy; /* unit: us */ pSurvey->time_ext_busy = SurveyInfo.ChannelTimeExtBusy; CFG80211DBG(RT_DEBUG_ERROR, ("80211> busy time = %ld %ld\n", (ULONG)SurveyInfo.ChannelTimeBusy, (ULONG)SurveyInfo.ChannelTimeExtBusy)); return 0; } /* End of CFG80211_OpsSurveyGet */
/* ======================================================================== Routine Description: Join the specified IBSS (or create if necessary). Once done, call cfg80211_ibss_joined(), also call that function when changing BSSID due to a merge. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface pParams - IBSS parameters Return Value: 0 - success -x - fail Note: For iw utility: ibss join No fixed-freq and fixed-bssid support. ======================================================================== */ static int CFG80211_OpsIbssJoin( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN struct cfg80211_ibss_params *pParams) { struct rtmp_adapter *pAd; CMD_RTPRIV_IOCTL_80211_IBSS IbssInfo; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); CFG80211DBG(RT_DEBUG_ERROR, ("80211> SSID = %s\n", pParams->ssid)); CFG80211DBG(RT_DEBUG_ERROR, ("80211> Beacon Interval = %d\n", pParams->beacon_interval)); /* init */ memset(&IbssInfo, 0, sizeof(IbssInfo)); IbssInfo.BeaconInterval = pParams->beacon_interval; IbssInfo.pSsid = (char *) pParams->ssid; /* ibss join */ RTMP_DRIVER_80211_IBSS_JOIN(pAd, &IbssInfo); return 0; } /* End of CFG80211_OpsIbssJoin */
/* ======================================================================== Routine Description: Set channel. Arguments: pWiphy - Wireless hardware description pChan - Channel information ChannelType - Channel type Return Value: 0 - success -x - fail Note: For iw utility: set channel, set freq enum nl80211_channel_type { NL80211_CHAN_NO_HT, NL80211_CHAN_HT20, NL80211_CHAN_HT40MINUS, NL80211_CHAN_HT40PLUS }; ======================================================================== */ static int CFG80211_OpsChannelSet( IN struct wiphy *pWiphy, IN struct net_device *pDev, IN struct ieee80211_channel *pChan, IN enum nl80211_channel_type ChannelType) { struct rtmp_adapter *pAd; CFG80211_CB *p80211CB; CMD_RTPRIV_IOCTL_80211_CHAN ChanInfo; u32 ChanId; struct net_device *dev = NULL; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); RTMP_DRIVER_NET_DEV_GET(pAd, &dev); /* get channel number */ ChanId = ieee80211_frequency_to_channel(pChan->center_freq); CFG80211DBG(RT_DEBUG_ERROR, ("80211> Channel = %d\n", ChanId)); CFG80211DBG(RT_DEBUG_ERROR, ("80211> ChannelType = %d\n", ChannelType)); /* init */ memset(&ChanInfo, 0, sizeof(ChanInfo)); ChanInfo.ChanId = ChanId; p80211CB = NULL; RTMP_DRIVER_80211_CB_GET(pAd, &p80211CB); if (p80211CB == NULL) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> p80211CB == NULL!\n")); return 0; } if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_STATION) ChanInfo.IfType = RT_CMD_80211_IFTYPE_STATION; else if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_ADHOC) ChanInfo.IfType = RT_CMD_80211_IFTYPE_ADHOC; else if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_MONITOR) ChanInfo.IfType = RT_CMD_80211_IFTYPE_MONITOR; if (ChannelType == NL80211_CHAN_NO_HT) ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_NOHT; else if (ChannelType == NL80211_CHAN_HT20) ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT20; else if (ChannelType == NL80211_CHAN_HT40MINUS) ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40MINUS; else if (ChannelType == NL80211_CHAN_HT40PLUS) ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40PLUS; ChanInfo.MonFilterFlag = p80211CB->MonFilterFlag; /* set channel */ RTMP_DRIVER_80211_CHAN_SET(pAd, &ChanInfo); return 0; } /* End of CFG80211_OpsChannelSet */
static int CFG80211_OpsKeyAdd( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN UINT8 KeyIdx, IN const UINT8 *pMacAddr, IN struct key_params *pParams) #endif /* LINUX_VERSION_CODE */ { VOID *pAd; CMD_RTPRIV_IOCTL_80211_KEY KeyInfo; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); #ifdef RT_CFG80211_DEBUG hex_dump("KeyBuf=", (UINT8 *)pParams->key, pParams->key_len); #endif /* RT_CFG80211_DEBUG */ CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx)); if (pParams->key_len >= sizeof(KeyInfo.KeyBuf)) return -EINVAL; /* End of if */ #ifdef CONFIG_STA_SUPPORT /* init */ memset(&KeyInfo, 0, sizeof(KeyInfo)); memcpy(KeyInfo.KeyBuf, pParams->key, pParams->key_len); KeyInfo.KeyBuf[pParams->key_len] = 0x00; if ((pParams->cipher == WLAN_CIPHER_SUITE_WEP40) || (pParams->cipher == WLAN_CIPHER_SUITE_WEP104)) { KeyInfo.KeyType = RT_CMD_80211_KEY_WEP; } else if ((pParams->cipher == WLAN_CIPHER_SUITE_TKIP) || (pParams->cipher == WLAN_CIPHER_SUITE_CCMP)) { KeyInfo.KeyType = RT_CMD_80211_KEY_WPA; } else return -ENOTSUPP; KeyInfo.KeyId = KeyIdx+1; /* add key */ RTMP_DRIVER_80211_KEY_ADD(pAd, &KeyInfo); return 0; #endif /* CONFIG_STA_SUPPORT */ } /* End of CFG80211_OpsKeyAdd */
BOOLEAN CFG80211DRV_OpsScanCheckStatus( VOID *pAdOrg, UINT8 IfType) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; /* CFG_TODO */ if (CFG80211DRV_OpsScanRunning(pAd)) { CFG80211DBG(RT_DEBUG_ERROR, ("SCAN_FAIL: CFG80211 Internal SCAN Flag On\n")); return FALSE; } if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { CFG80211DBG(RT_DEBUG_ERROR, ("SCAN_FAIL: BSS_SCAN_IN_PROGRESS\n")); return FALSE; } /* To avoid the scan cmd come-in during driver init */ if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) { DBGPRINT(RT_DEBUG_TRACE, ("SCAN_FAIL: Scan cmd before Startup finish\n")); return FALSE; } #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE if (RTMP_CFG80211_VIF_P2P_CLI_ON(pAd) && (pAd->cfg80211_ctrl.FlgCfg80211Connecting == TRUE) && (IfType == RT_CMD_80211_IFTYPE_STATION)) { DBGPRINT(RT_DEBUG_ERROR,("SCAN_FAIL: P2P_CLIENT In Connecting & Canncel Scan with Infra Side\n")); return FALSE; } #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ #ifdef RT_CFG80211_SUPPORT if (pAd->cfg80211_ctrl.FlgCfg8021Disable2040Scan == TRUE && (IfType == RT_CMD_80211_IFTYPE_AP)) { DBGPRINT(RT_DEBUG_ERROR,("Disable 20/40 scan!!\n")); return FALSE; } #endif /* RT_CFG80211_SUPPORT */ /* do scan */ pAd->cfg80211_ctrl.FlgCfg80211Scanning = TRUE; #endif /*CONFIG_STA_SUPPORT*/ return TRUE; }
/* ======================================================================== Routine Description: List all stations known, e.g. the AP on managed interfaces. Arguments: pWiphy - Wireless hardware description pNdev - Idx - pMac - pSinfo - Return Value: 0 - success -x - fail Note: ======================================================================== */ static int CFG80211_OpsStaDump( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN int Idx, IN u8 *pMac, IN struct station_info *pSinfo) { struct rtmp_adapter *pAd; if (Idx != 0) return -ENOENT; /* End of if */ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); #ifdef CONFIG_STA_SUPPORT if (RTMP_DRIVER_AP_SSID_GET(pAd, pMac) != NDIS_STATUS_SUCCESS) return -EBUSY; else return CFG80211_OpsStaGet(pWiphy, pNdev, pMac, pSinfo); #endif /* CONFIG_STA_SUPPORT */ return -EOPNOTSUPP; } /* End of CFG80211_OpsStaDump */
/* ======================================================================== Routine Description: Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ. Arguments: pCB - CFG80211 control block pointer pBandInfo - Band information Return Value: true - re-init successfully false - re-init fail Note: CFG80211_SupBandInit() is called in xx_probe(). But we do not have complete chip information in xx_probe() so we need to re-init bands in xx_open(). ======================================================================== */ bool CFG80211OS_SupBandReInit( IN VOID *pCB, IN CFG80211_BAND *pBandInfo) { struct mt7612u_cfg80211_cb *pCfg80211_CB = (struct mt7612u_cfg80211_cb *)pCB; struct wiphy *pWiphy; if ((pCfg80211_CB == NULL) || (pCfg80211_CB->pCfg80211_Wdev == NULL)) return false; pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; if (pWiphy != NULL) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> re-init bands...\n")); /* re-init bands */ CFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWiphy, pCfg80211_CB->pCfg80211_Channels, pCfg80211_CB->pCfg80211_Rates); /* re-init PHY */ pWiphy->rts_threshold = pBandInfo->RtsThreshold; pWiphy->frag_threshold = pBandInfo->FragmentThreshold; pWiphy->retry_short = pBandInfo->RetryMaxCnt & 0xff; pWiphy->retry_long = (pBandInfo->RetryMaxCnt & 0xff00)>>8; return true; }
VOID CFG80211DRV_RegNotify( VOID *pAdOrg, VOID *pData) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *pRegInfo; pRegInfo = (CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *)pData; /* keep Alpha2 and we can re-call the function when interface is up */ pAd->Cfg80211_Alpha2[0] = pRegInfo->Alpha2[0]; pAd->Cfg80211_Alpha2[1] = pRegInfo->Alpha2[1]; /* apply the new regulatory rule */ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) { /* interface is up */ CFG80211_RegRuleApply(pAd, pRegInfo->pWiphy, (UCHAR *)pRegInfo->Alpha2); } else { CFG80211DBG(RT_DEBUG_ERROR, ("crda> interface is down!\n")); } /* End of if */ }
/* ======================================================================== Routine Description: Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ. Arguments: pCB - CFG80211 control block pointer pBandInfo - Band information Return Value: TRUE - re-init successfully FALSE - re-init fail Note: CFG80211_SupBandInit() is called in xx_probe(). But we do not have complete chip information in xx_probe() so we need to re-init bands in xx_open(). ======================================================================== */ BOOLEAN CFG80211OS_SupBandReInit(void *pCB, CFG80211_BAND *pBandInfo) { CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; struct wiphy *pWiphy; if ((pCfg80211_CB == NULL) || (pCfg80211_CB->pCfg80211_Wdev == NULL)) return FALSE; pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; if (pWiphy != NULL) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> re-init bands...\n")); /* re-init bands */ CFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWiphy, pCfg80211_CB->pCfg80211_Channels, pCfg80211_CB->pCfg80211_Rates); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) /* re-init PHY */ pWiphy->rts_threshold = pBandInfo->RtsThreshold; pWiphy->frag_threshold = pBandInfo->FragmentThreshold; pWiphy->retry_short = pBandInfo->RetryMaxCnt & 0xff; pWiphy->retry_long = (pBandInfo->RetryMaxCnt & 0xff00)>>8; #endif /* LINUX_VERSION_CODE */ return TRUE; }
/* ======================================================================== Routine Description: Delete a cached PMKID. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface pPmksa - PMKID information Return Value: 0 - success -x - fail Note: ======================================================================== */ static int CFG80211_OpsPmksaDel( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN struct cfg80211_pmksa *pPmksa) { #ifdef CONFIG_STA_SUPPORT struct rtmp_adapter *pAd; RT_CMD_STA_IOCTL_PMA_SA IoctlPmaSa, *pIoctlPmaSa = &IoctlPmaSa; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); if ((pPmksa->bssid == NULL) || (pPmksa->pmkid == NULL)) return -ENOENT; /* End of if */ pIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_REMOVE; memcpy(pIoctlPmaSa->Bssid, pPmksa->bssid, ETH_ALEN);; memcpy(pIoctlPmaSa->Pmkid, pPmksa->pmkid, IW_PMKID_LEN); RTMP_DRIVER_80211_PMKID_CTRL(pAd, pIoctlPmaSa); #endif /* CONFIG_STA_SUPPORT */ return 0; } /* End of CFG80211_OpsPmksaDel */
/* ======================================================================== Routine Description: Disconnect from the BSS/ESS. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface ReasonCode - Return Value: 0 - success -x - fail Note: For iw utility: connect ======================================================================== */ static int CFG80211_OpsDisconnect( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN u16 ReasonCode) { struct rtmp_adapter *pAd; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); CFG80211DBG(RT_DEBUG_ERROR, ("80211> ReasonCode = %d\n", ReasonCode)); MAC80211_PAD_GET(pAd, pWiphy); RTMP_DRIVER_80211_STA_LEAVE(pAd); return 0; } /* End of CFG80211_OpsDisconnect */
VOID CFG80211DRV_DisableApInterface(PRTMP_ADAPTER pAd) { /*CFG_TODO: IT Should be set fRTMP_ADAPTER_HALT_IN_PROGRESS */ MULTISSID_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; struct wifi_dev *wdev = &pMbss->wdev; pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = FALSE; wdev->Hostapd = Hostapd_Diable; /* For AP - STA switch */ if (pAd->CommonCfg.BBPCurrentBW != BW_40) { CFG80211DBG(RT_DEBUG_TRACE, ("80211> %s, switch to BW_20\n", __FUNCTION__)); bbp_set_bw(pAd, BW_20); } /* Disable pre-TBTT interrupt */ AsicSetPreTbtt(pAd, FALSE); if (!INFRA_ON(pAd)) { /* Disable piggyback */ RTMPSetPiggyBack(pAd, FALSE); AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE); } if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { AsicDisableSync(pAd); } OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); RTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected); }
/* ======================================================================== Routine Description: Notify that wiphy parameters have changed. Arguments: pWiphy - Wireless hardware description Changed - Return Value: 0 - success -x - fail Note: ======================================================================== */ static int CFG80211_OpsWiphyParamsSet( IN struct wiphy *pWiphy, IN u32 Changed) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -EOPNOTSUPP; } /* End of CFG80211_OpsWiphyParamsSet */
/* ======================================================================== Routine Description: Store the current TX power into the dbm variable. Arguments: pWiphy - Wireless hardware description pdBm - dBm Return Value: 0 - success -x - fail Note: ======================================================================== */ static int CFG80211_OpsTxPwrGet( IN struct wiphy *pWiphy, IN int *pdBm) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -EOPNOTSUPP; } /* End of CFG80211_OpsTxPwrGet */
/* ======================================================================== Routine Description: Cache a PMKID for a BSSID. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface pPmksa - PMKID information Return Value: 0 - success -x - fail Note: This is mostly useful for fullmac devices running firmwares capable of generating the (re) association RSN IE. It allows for faster roaming between WPA2 BSSIDs. ======================================================================== */ static int CFG80211_OpsPmksaSet( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN struct cfg80211_pmksa *pPmksa) { #ifdef CONFIG_STA_SUPPORT VOID *pAd; RT_CMD_STA_IOCTL_PMA_SA IoctlPmaSa, *pIoctlPmaSa = &IoctlPmaSa; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); if ((pPmksa->bssid == NULL) || (pPmksa->pmkid == NULL)) return -ENOENT; /* End of if */ pIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_ADD; pIoctlPmaSa->pBssid = (UCHAR *)pPmksa->bssid; pIoctlPmaSa->pPmkid = pPmksa->pmkid; RTMP_DRIVER_80211_PMKID_CTRL(pAd, pIoctlPmaSa); #endif /* CONFIG_STA_SUPPORT */ return 0; } /* End of CFG80211_OpsPmksaSet */
static int CFG80211_OpsKeyDefaultSet( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN UINT8 KeyIdx) #endif /* LINUX_VERSION_CODE */ { VOID *pAd; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx)); RTMP_DRIVER_80211_KEY_DEFAULT_SET(pAd, KeyIdx); return 0; } /* End of CFG80211_OpsKeyDefaultSet */
static int CFG80211_OpsTxPwrSet( IN struct wiphy *pWiphy, IN enum tx_power_setting Type, IN int dBm) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -EOPNOTSUPP; } /* End of CFG80211_OpsTxPwrSet */
/* ======================================================================== Routine Description: Set the default key on an interface. Arguments: pWiphy - Wireless hardware description pNdev - KeyIdx - Return Value: 0 - success -x - fail Note: ======================================================================== */ static int CFG80211_OpsKeyDefaultSet( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN u8 KeyIdx, IN bool Unicast, IN bool Multicast) { struct rtmp_adapter *pAd; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx)); RTMP_DRIVER_80211_KEY_DEFAULT_SET(pAd, KeyIdx); return 0; } /* End of CFG80211_OpsKeyDefaultSet */
/* ======================================================================== Routine Description: Power management. Arguments: pWiphy - Wireless hardware description pNdev - FlgIsEnabled - Timeout - Return Value: 0 - success -x - fail Note: ======================================================================== */ static int CFG80211_OpsPwrMgmt( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN bool FlgIsEnabled, IN int Timeout) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -EOPNOTSUPP; } /* End of CFG80211_OpsPwrMgmt */
/* ======================================================================== Routine Description: Remove a key given the pMacAddr (NULL for a group key) and KeyIdx. Arguments: pWiphy - Wireless hardware description pNdev - KeyIdx - pMacAddr - Return Value: 0 - success -x - fail Note: return -ENOENT if the key doesn't exist. ======================================================================== */ static int CFG80211_OpsKeyDel( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN u8 KeyIdx, IN bool Pairwise, IN const u8 *pMacAddr) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -ENOTSUPP; } /* End of CFG80211_OpsKeyDel */
static int CFG80211_OpsKeyDel( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN UINT8 KeyIdx, IN const UINT8 *pMacAddr) #endif /* LINUX_VERSION_CODE */ { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -ENOTSUPP; } /* End of CFG80211_OpsKeyDel */
/* ======================================================================== Routine Description: Inform us that a scan is got. Arguments: pAdCB - WLAN control block pointer Return Value: NONE Note: Call RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning ======================================================================== */ VOID CFG80211_Scaning( IN VOID *pAdCB, IN UINT32 BssIdx, IN UINT32 ChanId, IN UCHAR *pFrame, IN UINT32 FrameLen, IN INT32 RSSI) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; VOID *pCfg80211_CB = pAd->pCfg80211_CB; BOOLEAN FlgIsNMode; UINT8 BW; CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Scaning ==>\n")); if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) { DBGPRINT(RT_DEBUG_TRACE, ("80211> Network is down!\n")); return; } /* End of if */ /* In connect function, we also need to report BSS information to cfg80211; Not only scan function. */ if ((pAd->FlgCfg80211Scanning == FALSE) && (pAd->FlgCfg80211Connecting == FALSE)) { return; /* no scan is running */ } /* End of if */ /* init */ /* Note: Can not use local variable to do pChan */ if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) FlgIsNMode = TRUE; else FlgIsNMode = FALSE; if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20) BW = 0; else BW = 1; CFG80211OS_Scaning(pCfg80211_CB, &pAd->ScanTab.BssEntry[BssIdx].pCfg80211_Chan, ChanId, pFrame, FrameLen, RSSI, FlgIsNMode, BW); #endif /* CONFIG_STA_SUPPORT */ } /* End of CFG80211_Scaning */
BOOLEAN CFG80211DRV_OpsScanExtraIesSet( VOID *pAdOrg) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CFG80211_CB *pCfg80211_CB = pAd->pCfg80211_CB; UINT ie_len = 0; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; if (pCfg80211_CB->pCfg80211_ScanReq) ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len; CFG80211DBG(DBG_LVL_TRACE, ("80211> CFG80211DRV_OpsExtraIesSet ==> %d\n", ie_len)); CFG80211DBG(DBG_LVL_TRACE, ("80211> is_wpa_supplicant_up ==> %d\n", pAd->StaCfg.wpa_supplicant_info.WpaSupplicantUP)); if (ie_len == 0) return FALSE; /* Reset the ExtraIe and Len */ if (cfg80211_ctrl->pExtraIe) { os_free_mem(NULL, cfg80211_ctrl->pExtraIe); cfg80211_ctrl->pExtraIe = NULL; } cfg80211_ctrl->ExtraIeLen = 0; os_alloc_mem(pAd, (UCHAR **)&(cfg80211_ctrl->pExtraIe), ie_len); if (cfg80211_ctrl->pExtraIe) { NdisCopyMemory(cfg80211_ctrl->pExtraIe, pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len); cfg80211_ctrl->ExtraIeLen = ie_len; hex_dump("CFG8021_SCAN_EXTRAIE", cfg80211_ctrl->pExtraIe, cfg80211_ctrl->ExtraIeLen); } else { CFG80211DBG(DBG_LVL_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail. \n")); return FALSE; } #endif /* CONFIG_STA_SUPPORT */ return TRUE; }
bool CFG80211DRV_OpsScanExtraIesSet(struct rtmp_adapter *pAd) { struct mt7612u_cfg80211_cb *pCfg80211_CB = pAd->pCfg80211_CB; UINT ie_len = 0; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; if (pCfg80211_CB->pCfg80211_ScanReq) ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len; CFG80211DBG(RT_DEBUG_INFO, ("80211> CFG80211DRV_OpsExtraIesSet ==> %d\n", ie_len)); #ifdef CONFIG_STA_SUPPORT CFG80211DBG(RT_DEBUG_INFO, ("80211> is_wpa_supplicant_up ==> %d\n", pAd->StaCfg.wpa_supplicant_info.WpaSupplicantUP)); #endif /*CONFIG_STA_SUPPORT*/ if (ie_len == 0) return false; /* Reset the ExtraIe and Len */ if (cfg80211_ctrl->pExtraIe) { kfree(cfg80211_ctrl->pExtraIe); cfg80211_ctrl->pExtraIe = NULL; } cfg80211_ctrl->ExtraIeLen = 0; cfg80211_ctrl->pExtraIe = kmalloc(ie_len, GFP_ATOMIC); if (cfg80211_ctrl->pExtraIe) { memcpy(cfg80211_ctrl->pExtraIe, pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len); cfg80211_ctrl->ExtraIeLen = ie_len; hex_dump("CFG8021_SCAN_EXTRAIE", cfg80211_ctrl->pExtraIe, cfg80211_ctrl->ExtraIeLen); } else { CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail. \n")); return false; } return true; }
/* ======================================================================== Routine Description: Leave the IBSS. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface Return Value: 0 - success -x - fail Note: For iw utility: ibss leave ======================================================================== */ static int CFG80211_OpsIbssLeave( IN struct wiphy *pWiphy, IN struct net_device *pNdev) { struct rtmp_adapter *pAd; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); MAC80211_PAD_GET(pAd, pWiphy); RTMP_DRIVER_80211_STA_LEAVE(pAd); return 0; } /* End of CFG80211_OpsIbssLeave */
static int CFG80211_OpsKeyGet( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN UINT8 KeyIdx, IN const UINT8 *pMacAddr, IN void *pCookie, IN void (*pCallback)(void *cookie, struct key_params *)) #endif /* LINUX_VERSION_CODE */ { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -ENOTSUPP; } /* End of CFG80211_OpsKeyGet */
/* ======================================================================== Routine Description: Get information about the key with the given parameters. Arguments: pWiphy - Wireless hardware description pNdev - KeyIdx - Pairwise - pMacAddr - pCookie - pCallback - Return Value: 0 - success -x - fail Note: pMacAddr will be NULL when requesting information for a group key. All pointers given to the pCallback function need not be valid after it returns. This function should return an error if it is not possible to retrieve the key, -ENOENT if it doesn't exist. ======================================================================== */ static int CFG80211_OpsKeyGet( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN u8 KeyIdx, IN bool Pairwise, IN const u8 *pMacAddr, IN void *pCookie, IN void (*pCallback)(void *cookie, struct key_params *)) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); return -ENOTSUPP; } /* End of CFG80211_OpsKeyGet */
/* ======================================================================== Routine Description: Register MAC80211 Module. Arguments: pAdCB - WLAN control block pointer pDev - Generic device interface pNetDev - Network device Return Value: NONE Note: pDev != pNetDev #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) Can not use pNetDev to replace pDev; Or kernel panic. ======================================================================== */ bool CFG80211_Register( IN void *pAd, IN struct device *pDev, IN struct net_device *pNetDev) { CFG80211_CB *pCfg80211_CB = NULL; CFG80211_BAND BandInfo; /* allocate MAC80211 structure */ pCfg80211_CB = kmalloc(sizeof(CFG80211_CB), GFP_ATOMIC); if (pCfg80211_CB == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("80211> Allocate MAC80211 CB fail!\n")); return false; } /* End of if */ /* allocate wireless device */ RTMP_DRIVER_80211_BANDINFO_GET(pAd, &BandInfo); pCfg80211_CB->pCfg80211_Wdev = \ CFG80211_WdevAlloc(pCfg80211_CB, &BandInfo, pAd, pDev); if (pCfg80211_CB->pCfg80211_Wdev == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("80211> Allocate Wdev fail!\n")); kfree(pCfg80211_CB); return false; } /* End of if */ /* bind wireless device with net device */ #ifdef CONFIG_STA_SUPPORT /* default we are station mode */ pCfg80211_CB->pCfg80211_Wdev->iftype = NL80211_IFTYPE_STATION; #endif /* CONFIG_STA_SUPPORT */ pNetDev->ieee80211_ptr = pCfg80211_CB->pCfg80211_Wdev; SET_NETDEV_DEV(pNetDev, wiphy_dev(pCfg80211_CB->pCfg80211_Wdev->wiphy)); pCfg80211_CB->pCfg80211_Wdev->netdev = pNetDev; #ifdef RFKILL_HW_SUPPORT wiphy_rfkill_start_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy); #endif /* RFKILL_HW_SUPPORT */ RTMP_DRIVER_80211_CB_SET(pAd, pCfg80211_CB); CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Register\n")); return true; } /* End of CFG80211_Register */