UINT32 QBSS_LoadElementAppend_HSTEST( IN RTMP_ADAPTER *pAd, OUT UINT8 *pBeaconBuf, IN UCHAR apidx) { ELM_QBSS_LOAD load, *pLoad = &load; ULONG ElmLen; /* check whether channel busy time calculation is enabled */ if (pAd->phy_ctrl.FlgQloadEnable == 0) return 0; /* End of if */ /* init */ pLoad->ElementId = ELM_QBSS_LOAD_ID; pLoad->Length = ELM_QBSS_LOAD_LEN; pLoad->StationCount = le2cpu16(pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadStaCnt); pLoad->ChanUtil = pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadCU; /* because no ACM is supported, the available bandwidth is 1 sec */ pLoad->AvalAdmCap = le2cpu16(0xffff); /* 0x7a12 * 32us = 1 second */ /* copy the element to the frame */ MakeOutgoingFrame(pBeaconBuf, &ElmLen, sizeof(ELM_QBSS_LOAD), pLoad, END_OF_ARGS); return ElmLen; } /* End of QBSS_LoadElementAppend */
/* ======================================================================== Routine Description: Append the QBSS Load element to the beacon frame. Arguments: pAd - WLAN control block pointer *pBeaconBuf - the beacon or probe response frame Return Value: the element total Length Note: Append Condition: You must check whether WMM is enabled before the function is using. ======================================================================== */ UINT32 QBSS_LoadElementAppend( IN RTMP_ADAPTER *pAd, OUT UINT8 *pBeaconBuf) { ELM_QBSS_LOAD load, *pLoad = &load; ULONG ElmLen; /* check whether channel busy time calculation is enabled */ if (pAd->FlgQloadEnable == 0) return 0; /* End of if */ /* init */ pLoad->ElementId = ELM_QBSS_LOAD_ID; pLoad->Length = ELM_QBSS_LOAD_LEN; pLoad->StationCount = le2cpu16(MacTableAssocStaNumGet(pAd)); pLoad->ChanUtil = pAd->QloadChanUtil; /* because no ACM is supported, the available bandwidth is 1 sec */ pLoad->AvalAdmCap = le2cpu16(0x7a12); /* 0x7a12 * 32us = 1 second */ /* copy the element to the frame */ MakeOutgoingFrame(pBeaconBuf, &ElmLen, sizeof(ELM_QBSS_LOAD), pLoad, END_OF_ARGS); return ElmLen; } /* End of QBSS_LoadElementAppend */
VOID *RTMPFindHostPCIDev(VOID *pPciDevSrc) { struct pci_dev *pci_dev = (struct pci_dev *)pPciDevSrc; //struct pci_dev *parent_pci_dev; USHORT reg16; UCHAR reg8; UINT DevFn; PPCI_DEV pPci_dev; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s.===>\n", __FUNCTION__)); //parent_pci_dev = NULL; if (pci_dev->bus->parent) { for (DevFn = 0; DevFn < 255; DevFn++) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) pPci_dev = pci_get_slot(pci_dev->bus->parent, DevFn); #else pPci_dev = pci_find_slot(pci_dev->bus->parent->number, DevFn); #endif if (pPci_dev) { pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, ®16); reg16 = le2cpu16(reg16); pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, ®8); if ((reg16 == PCI_CLASS_BRIDGE_PCI) && (reg8 == pci_dev->bus->number)) return pPci_dev; } } } return NULL; }
NTSTATUS RTUSBReadEEPROM16(RTMP_ADAPTER *pAd, USHORT offset, USHORT *pData) { NTSTATUS status; USHORT localData; status = RTUSBReadEEPROM(pAd, offset, (PUCHAR)(&localData), 2); if (status == STATUS_SUCCESS) *pData = le2cpu16(localData); return status; }
u16 mt76u_read_eeprom(struct rtmp_adapter *pAd, u16 offset) { u16 localData; mt76u_vendor_request(pAd, DEVICE_VENDOR_REQUEST_IN, MT_VEND_READ_EEPROM, 0, offset, &localData, 2); return le2cpu16(localData); }
BOOLEAN RTUSBReadEEPROM16(RTMP_ADAPTER *pAd, USHORT offset, USHORT *pData) { NTSTATUS status; UINT16 localData; BOOLEAN IsEmpty = 0; status = RTUSBReadEEPROM(pAd, offset, (PUCHAR)(&localData), 2); if (status == STATUS_SUCCESS) *pData = le2cpu16(localData); if ((*pData == 0xffff) || (*pData == 0x0000)) IsEmpty = 1; return IsEmpty; }
/*************************************************************************** * * PCIe device initialization related procedures. * ***************************************************************************/ static VOID RTMPInitPCIeDevice( IN struct pci_dev *pci_dev, IN PRTMP_ADAPTER pAd) { USHORT device_id; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id); device_id = le2cpu16(device_id); pObj->DeviceID = device_id; OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); if ( #ifdef RT2860 (device_id == NIC2860_PCIe_DEVICE_ID) || (device_id == NIC2790_PCIe_DEVICE_ID) || (device_id == VEN_AWT_PCIe_DEVICE_ID) || #endif // RT2860 // 0) { UINT32 MacCsr0 = 0, Index= 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) break; RTMPusecDelay(10); } while (Index++ < 100); // Support advanced power save after 2892/2790. // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). if ((MacCsr0&0xffff0000) != 0x28600000) { #ifdef PCIE_PS_SUPPORT OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); #endif // PCIE_PS_SUPPORT // RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCIE); return; } } RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI); }
VOID *RTMPFindHostPCIDev( IN VOID *pPciDevSrc) { struct pci_dev *pci_dev = (struct pci_dev *)pPciDevSrc; struct pci_dev *parent_pci_dev; USHORT reg16; UCHAR reg8; UINT DevFn; PPCI_DEV pPci_dev; /* POS_COOKIE pObj; */ /* pObj = (POS_COOKIE) pAd->OS_Cookie; */ /* if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) */ /* return; */ DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__)); parent_pci_dev = NULL; if (pci_dev->bus->parent) { for (DevFn = 0; DevFn < 255; DevFn++) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) pPci_dev = pci_get_slot(pci_dev->bus->parent, DevFn); #else pPci_dev = pci_find_slot(pci_dev->bus->parent->number, DevFn); #endif if (pPci_dev) { pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, ®16); reg16 = le2cpu16(reg16); pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, ®8); if ((reg16 == PCI_CLASS_BRIDGE_PCI) && (reg8 == pci_dev->bus->number)) { return pPci_dev; } } } } return NULL; }
void init_dump(struct pcidev *dev, char *filename) { FILE *fd; uint32_t eeprom_size; int d; seteuid(ruid); if (!(fd = fopen(filename, "rb"))) die("Can't read file '%s'\n", filename); eeprom_size = 2 * fread(buf, 2, EEPROM_SIZE_MAX/2, fd); fclose(fd); seteuid(suid); for(d=0; !dev->ops && iodrivers[d]; d++) { if (dev->forced_driver) { if(!strcmp(dev->forced_driver, iodrivers[d]->name)) { dev->ops = iodrivers[d]; } } else { if ( iodrivers[d]->eeprom_signature == le2cpu16(*(uint16_t*)buf)) { dump_order = order_le; dev->ops = iodrivers[d]; } else if ( iodrivers[d]->eeprom_signature == be2cpu16(*(uint16_t*)buf)) { dump_order = order_be; dev->ops = iodrivers[d]; } } } if (!dev->ops) die("No usable IO driver found for this dump!\n"); printf(" Using IO driver%s: %s\n", dev->forced_driver ? " (forced)":"" ,dev->ops->name); dev->ops->eeprom_size = eeprom_size; dev->ops->eeprom_read16 = &buf_read16; dev->ops->eeprom_write16 = &buf_write16; printf(" byte order: %s ENDIAN\n", (dump_order == order_le) ? "LITTLE":"BIG"); }
/*************************************************************************** * * PCIe device initialization related procedures. * ***************************************************************************/ static void RTMPInitPCIeDevice(struct pci_dev *pci_dev, struct rt_rtmp_adapter *pAd) { u16 device_id; struct os_cookie *pObj; pObj = (struct os_cookie *)pAd->OS_Cookie; pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id); device_id = le2cpu16(device_id); pObj->DeviceID = device_id; if ( #ifdef RT2860 (device_id == NIC2860_PCIe_DEVICE_ID) || (device_id == NIC2790_PCIe_DEVICE_ID) || (device_id == VEN_AWT_PCIe_DEVICE_ID) || #endif #ifdef RT3090 (device_id == NIC3090_PCIe_DEVICE_ID) || (device_id == NIC3091_PCIe_DEVICE_ID) || (device_id == NIC3092_PCIe_DEVICE_ID) || #endif /* RT3090 // */ 0) { u32 MacCsr0 = 0, Index = 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) break; RTMPusecDelay(10); } while (Index++ < 100); /* Support advanced power save after 2892/2790. */ /* MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). */ if ((MacCsr0 & 0xffff0000) != 0x28600000) { OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); } } }
/*************************************************************************** * * PCIe device initialization related procedures. * ***************************************************************************/ static VOID RTMPInitPCIeDevice( IN struct pci_dev *pci_dev, IN PRTMP_ADAPTER pAd) { USHORT device_id; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id); device_id = le2cpu16(device_id); pObj->DeviceID = device_id; if ( #ifdef RT3090 (device_id == NIC3090_PCIe_DEVICE_ID) || (device_id == NIC3091_PCIe_DEVICE_ID) || (device_id == NIC3092_PCIe_DEVICE_ID) || #endif // RT3090 // 0) { UINT32 MacCsr0 = 0, Index= 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) break; RTMPusecDelay(10); } while (Index++ < 100); // Support advanced power save after 2892/2790. // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). if ((MacCsr0&0xffff0000) != 0x28600000) { OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); } } }
static VOID RTMPInitPCIeDevice( IN struct pci_dev *pci_dev, IN PRTMP_ADAPTER pAd) { USHORT device_id; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id); device_id = le2cpu16(device_id); pObj->DeviceID = device_id; if ( #ifdef RT3090 (device_id == NIC3090_PCIe_DEVICE_ID) || (device_id == NIC3091_PCIe_DEVICE_ID) || (device_id == NIC3092_PCIe_DEVICE_ID) || #endif 0) { UINT32 MacCsr0 = 0, Index= 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) break; RTMPusecDelay(10); } while (Index++ < 100); if ((MacCsr0&0xffff0000) != 0x28600000) { OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); } } }
static BOOLEAN USBDevConfigInit( IN struct usb_device *dev, IN struct usb_interface *intf, IN RTMP_ADAPTER *pAd) { struct usb_host_interface *iface_desc; ULONG BulkOutIdx; UINT32 i; /* get the active interface descriptor */ iface_desc = intf->cur_altsetting; /* get # of enpoints */ pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints; DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints)); /* Configure Pipes */ BulkOutIdx = 0; for(i=0; i<pAd->NumberOfPipes; i++) { if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) { pAd->BulkInEpAddr = iface_desc->endpoint[i].desc.bEndpointAddress; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) pAd->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); #else pAd->BulkInMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize; #endif // LINUX_VERSION_CODE // DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pAd->BulkInMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress)); } else if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)) { // there are 6 bulk out EP. EP6 highest priority. // EP1-4 is EDCA. EP5 is HCCA. pAd->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) pAd->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); #else pAd->BulkOutMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize; #endif DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pAd->BulkOutMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc.bEndpointAddress)); } } if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0])) { printk("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__); return FALSE; } pAd->config = &dev->config->desc; usb_set_intfdata(intf, pAd); RT28XXVendorSpecificCheck(dev, pAd); return TRUE; }
VOID CFG80211_ParseBeaconIE(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, struct wifi_dev *wdev, const UCHAR *wpa_ie, const UCHAR *rsn_ie) { PEID_STRUCT pEid; PUCHAR pTmp; NDIS_802_11_ENCRYPTION_STATUS TmpCipher; NDIS_802_11_ENCRYPTION_STATUS PairCipher; /* Unicast cipher 1, this one has more secured cipher suite */ NDIS_802_11_ENCRYPTION_STATUS PairCipherAux; /* Unicast cipher 2 if AP announce two unicast cipher suite */ //NDIS_802_11_ENCRYPTION_STATUS GroupCipher; /* Group cipher */ PAKM_SUITE_STRUCT pAKM; USHORT Count; BOOLEAN bWPA = FALSE; BOOLEAN bWPA2 = FALSE; BOOLEAN bMix = FALSE; /* Security */ PairCipher = Ndis802_11WEPDisabled; PairCipherAux = Ndis802_11WEPDisabled; if ((wpa_ie == NULL) && (rsn_ie == NULL)) //open case { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("%s:: Open/None case\n", __FUNCTION__)); wdev->AuthMode = Ndis802_11AuthModeOpen; wdev->WepStatus = Ndis802_11WEPDisabled; wdev->WpaMixPairCipher = MIX_CIPHER_NOTUSE; } if ((wpa_ie != NULL)) //wpapsk/tkipaes case { pEid = (PEID_STRUCT)wpa_ie; pTmp = (PUCHAR)pEid; if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) { wdev->AuthMode = Ndis802_11AuthModeOpen; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("%s:: WPA case\n", __FUNCTION__)); bWPA = TRUE; pTmp += 11; switch (*pTmp) { case 1: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Group Ndis802_11GroupWEP40Enabled\n")); wdev->GroupKeyWepStatus = Ndis802_11GroupWEP40Enabled; break; case 5: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Group Ndis802_11GroupWEP104Enabled\n")); wdev->GroupKeyWepStatus = Ndis802_11GroupWEP104Enabled; break; case 2: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Group Ndis802_11TKIPEnable\n")); wdev->GroupKeyWepStatus = Ndis802_11TKIPEnable; break; case 4: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,(" Group Ndis802_11AESEnable\n")); wdev->GroupKeyWepStatus = Ndis802_11AESEnable; break; default: break; } /* number of unicast suite*/ pTmp += 1; /* skip all unicast cipher suites*/ /*Count = *(PUSHORT) pTmp; */ Count = (pTmp[1]<<8) + pTmp[0]; pTmp += sizeof(USHORT); /* Parsing all unicast cipher suite*/ while (Count > 0) { /* Skip OUI*/ pTmp += 3; TmpCipher = Ndis802_11WEPDisabled; switch (*pTmp) { case 1: case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/ TmpCipher = Ndis802_11WEPEnabled; break; case 2: TmpCipher = Ndis802_11TKIPEnable; break; case 4: TmpCipher = Ndis802_11AESEnable; break; default: break; } if (TmpCipher > PairCipher) { /* Move the lower cipher suite to PairCipherAux*/ PairCipherAux = PairCipher; PairCipher = TmpCipher; } else { PairCipherAux = TmpCipher; } pTmp++; Count--; } switch (*pTmp) { case 1: /* Set AP support WPA-enterprise mode*/ wdev->AuthMode = Ndis802_11AuthModeWPA; break; case 2: /* Set AP support WPA-PSK mode*/ wdev->AuthMode = Ndis802_11AuthModeWPAPSK; break; default: break; } pTmp += 1; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("AuthMode = %s\n",GetAuthMode(wdev->AuthMode))); if (wdev->GroupKeyWepStatus == PairCipher) { wdev->WpaMixPairCipher = MIX_CIPHER_NOTUSE; pMbss->wdev.WepStatus=wdev->GroupKeyWepStatus; } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("WPA Mix TKIPAES\n")); bMix = TRUE; } pMbss->RSNIE_Len[0] = wpa_ie[1]; NdisMoveMemory(pMbss->RSN_IE[0], wpa_ie+2, wpa_ie[1]);//copy rsn ie } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("%s:: WPA Open/None case\n", __FUNCTION__)); wdev->AuthMode = Ndis802_11AuthModeOpen; } } if ((rsn_ie != NULL)) { PRSN_IE_HEADER_STRUCT pRsnHeader; PCIPHER_SUITE_STRUCT pCipher; pEid = (PEID_STRUCT)rsn_ie; pTmp = (PUCHAR)pEid; pRsnHeader = (PRSN_IE_HEADER_STRUCT) pTmp; /* 0. Version must be 1*/ if (le2cpu16(pRsnHeader->Version) == 1) { pTmp += sizeof(RSN_IE_HEADER_STRUCT); /* 1. Check group cipher*/ pCipher = (PCIPHER_SUITE_STRUCT) pTmp; if (NdisEqualMemory(pTmp, RSN_OUI, 3)) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("%s:: WPA2 case\n", __FUNCTION__)); bWPA2 = TRUE; wdev->AuthMode = Ndis802_11AuthModeOpen; switch (pCipher->Type) { case 1: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Ndis802_11GroupWEP40Enabled\n")); wdev->GroupKeyWepStatus = Ndis802_11GroupWEP40Enabled; break; case 5: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Ndis802_11GroupWEP104Enabled\n")); wdev->GroupKeyWepStatus = Ndis802_11GroupWEP104Enabled; break; case 2: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Ndis802_11TKIPEnable\n")); wdev->GroupKeyWepStatus = Ndis802_11TKIPEnable; break; case 4: MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Ndis802_11AESEnable\n")); wdev->GroupKeyWepStatus = Ndis802_11AESEnable; break; default: break; } /* set to correct offset for next parsing*/ pTmp += sizeof(CIPHER_SUITE_STRUCT); /* 2. Get pairwise cipher counts*/ /*Count = *(PUSHORT) pTmp;*/ Count = (pTmp[1]<<8) + pTmp[0]; pTmp += sizeof(USHORT); /* 3. Get pairwise cipher*/ /* Parsing all unicast cipher suite*/ while (Count > 0) { /* Skip OUI*/ pCipher = (PCIPHER_SUITE_STRUCT) pTmp; TmpCipher = Ndis802_11WEPDisabled; switch (pCipher->Type) { case 1: case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/ TmpCipher = Ndis802_11WEPEnabled; break; case 2: TmpCipher = Ndis802_11TKIPEnable; break; case 4: TmpCipher = Ndis802_11AESEnable; break; default: break; } //pMbss->wdev.WepStatus = TmpCipher; if (TmpCipher > PairCipher) { /* Move the lower cipher suite to PairCipherAux*/ PairCipherAux = PairCipher; PairCipher = TmpCipher; } else { PairCipherAux = TmpCipher; } pTmp += sizeof(CIPHER_SUITE_STRUCT); Count--; } /* 4. get AKM suite counts*/ /*Count = *(PUSHORT) pTmp;*/ Count = (pTmp[1]<<8) + pTmp[0]; pTmp += sizeof(USHORT); /* 5. Get AKM ciphers*/ /* Parsing all AKM ciphers*/ while (Count > 0) { pAKM = (PAKM_SUITE_STRUCT) pTmp; if (!RTMPEqualMemory(pTmp, RSN_OUI, 3)) break; switch (pAKM->Type) { case 0: wdev->AuthMode = Ndis802_11AuthModeWPANone; break; case 1: /* Set AP support WPA-enterprise mode*/ wdev->AuthMode = Ndis802_11AuthModeWPA2; break; case 2: /* Set AP support WPA-PSK mode*/ wdev->AuthMode = Ndis802_11AuthModeWPA2PSK; break; default: wdev->AuthMode = Ndis802_11AuthModeMax; break; } pTmp += sizeof(AKM_SUITE_STRUCT); Count--; } MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("AuthMode = %s\n",GetAuthMode(wdev->AuthMode))); if (wdev->GroupKeyWepStatus == PairCipher) { wdev->WpaMixPairCipher = MIX_CIPHER_NOTUSE; pMbss->wdev.WepStatus=wdev->GroupKeyWepStatus; } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("WPA2 Mix TKIPAES\n")); bMix= TRUE; } if (bWPA2 && bWPA) { pMbss->RSNIE_Len[1] = rsn_ie[1]; NdisMoveMemory(pMbss->RSN_IE[1], rsn_ie+2, rsn_ie[1]);//copy rsn ie } else { pMbss->RSNIE_Len[0] = rsn_ie[1]; NdisMoveMemory(pMbss->RSN_IE[0], rsn_ie+2, rsn_ie[1]);//copy rsn ie } } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("%s::RSN Open/None case\n", __FUNCTION__)); wdev->AuthMode = Ndis802_11AuthModeOpen; } } } if (bWPA2 && bWPA) { wdev->AuthMode = Ndis802_11AuthModeWPA1PSKWPA2PSK; if (bMix) { wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES; wdev->WepStatus = Ndis802_11TKIPAESMix; } } else if (bWPA2) { if (bMix) { wdev->WpaMixPairCipher = WPA_NONE_WPA2_TKIPAES; wdev->WepStatus = Ndis802_11TKIPAESMix; } } else if (bWPA) { if (bMix) { wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_NONE; wdev->WepStatus = Ndis802_11TKIPAESMix; } } MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("\n bwpa2 %d, bwpa %d, bmix %d,AuthMode = %s ,wdev->WpaMixPairCipher = %d\ wdev->WepStatus = %d wdev->GroupKeyWepStatus %d pMbss->wdev.WepStatus = %d\n" ,bWPA2,bWPA,bMix,GetAuthMode(wdev->AuthMode),wdev->WpaMixPairCipher,wdev->WepStatus,wdev->GroupKeyWepStatus,pMbss->wdev.WepStatus)); }
static BOOLEAN USBDevConfigInit(struct usb_device *dev, struct usb_interface *intf, VOID *pAd) { struct usb_host_interface *iface_desc; ULONG BulkOutIdx; ULONG BulkInIdx; UINT32 i; RT_CMD_USB_DEV_CONFIG Config, *pConfig = &Config; /* get the active interface descriptor */ iface_desc = intf->cur_altsetting; /* get # of enpoints */ pConfig->NumberOfPipes = iface_desc->desc.bNumEndpoints; DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints)); /* Configure Pipes */ BulkOutIdx = 0; BulkInIdx = 0; for (i = 0; i < pConfig->NumberOfPipes; i++) { if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) { if (BulkInIdx < 2) { pConfig->BulkInEpAddr[BulkInIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) pConfig->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); #else pConfig->BulkInMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize; #endif /* LINUX_VERSION_CODE */ DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pConfig->BulkInMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress)); } else { DBGPRINT(RT_DEBUG_ERROR, ("Bulk IN endpoint nums large than 2\n")); } } if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_INT) && ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) { pConfig->IntrInEpAddr = iface_desc->endpoint[i].desc.bEndpointAddress; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) pConfig->IntrInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); #else pConfig->IntrInMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize; #endif /* LINUX_VERSION_CODE */ DBGPRINT_RAW(RT_DEBUG_OFF, ("[Interrupt Transfer Type] IN MaxPacketSize = %d\n", pConfig->BulkInMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_OFF, ("[Interrupt Transfer Type] EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress)); } else if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)) { if (BulkOutIdx < 6) { /* there are 6 bulk out EP. EP6 highest priority. */ /* EP1-4 is EDCA. EP5 is HCCA. */ pConfig->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) pConfig->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); #else pConfig->BulkOutMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize; #endif DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pConfig->BulkOutMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc.bEndpointAddress)); } else { DBGPRINT(RT_DEBUG_ERROR, ("Bulk Out endpoint nums large than 6\n")); } } } if (!(pConfig->BulkInEpAddr && pConfig->BulkOutEpAddr[0])) { printk("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__); return FALSE; } pConfig->pConfig = &dev->config->desc; usb_set_intfdata(intf, pAd); RTMP_DRIVER_USB_CONFIG_INIT(pAd, pConfig); rtusb_vendor_specific_check(dev, pAd); return TRUE; }
/* ======================================================================== Routine Description: Handle the resource request. Arguments: pAd - WLAN control block pointer *pMacEntry - the source QSTA *pBufReq - the request packet buffer ReqLen - the length of request packet buffer *pBufRsp - the response packet buffer *pRspLen - the length of response content Return Value: non-zero - the frame length we handled zero - no request is found Note: 1. The start octet of the buffer is the element ID of RIC request or response. 2. Same resource type for all resource descriptors in the RDIE. 3. Suppose RDIEs are continual. ======================================================================== */ UINT32 BA_ResourceAllocate( IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pMacEntry, IN UCHAR *pBufRscReq, OUT UCHAR *pBufRscRsp, OUT ULONG *pBufRspLen) { extern BOOLEAN BARecSessionAdd( IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, IN PFRAME_ADDBA_REQ pFrame); UINT8 IEId = IE_FT_RIC_DESCRIPTOR; UINT8 RicType = FT_RIC_TYPE_BA; UINT8 Len = 7; UINT16 Status = 1; BA_PARM BaParm; /*0 - 2 */ USHORT TimeOutValue; FRAME_ADDBA_REQ AddreqFrame; FT_ELM_RIC_DESCP_INFO *pRicDesInfo; FT_RIC_DESCP_BLOCK_ACK *pRicBaInfo; if ((pAd->CommonCfg.bBADecline == FALSE) && IS_HT_STA(pMacEntry)) { UINT16 Value; pRicDesInfo = (FT_ELM_RIC_DESCP_INFO *)pBufRscReq; pRicBaInfo = (FT_RIC_DESCP_BLOCK_ACK *)pRicDesInfo->Container; Value = le2cpu16(*(UINT16 *)(&pRicBaInfo->BaParm)); NdisMoveMemory((PUCHAR)&AddreqFrame.BaParm, &Value, sizeof(UINT16)); AddreqFrame.TimeOutValue = le2cpu16(pRicBaInfo->TimeOutValue); AddreqFrame.BaStartSeq.word = le2cpu16(pRicBaInfo->BaStartSeq); DBGPRINT(RT_DEBUG_OFF, ("Rcv Wcid(%d) AddBAReq\n", pMacEntry->Aid)); if (BARecSessionAdd(pAd, pMacEntry, &AddreqFrame)) Status = 0; else Status = 38; /* more parameters have invalid values */ } else { Status = 37; /* the request has been declined. */ } if (Status != 0) return Status; BaParm.BAPolicy = IMMED_BA; BaParm.AMSDUSupported = 0; BaParm.TID = AddreqFrame.BaParm.TID; BaParm.BufSize = min(((UCHAR)AddreqFrame.BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit); if (BaParm.BufSize == 0) { BaParm.BufSize = 64; } TimeOutValue = 0; *(UINT16 *)(&BaParm) = cpu2le16(*(USHORT *)(&BaParm)); Status = cpu2le16(Status); TimeOutValue = cpu2le16(TimeOutValue); MakeOutgoingFrame( pBufRscRsp, pBufRspLen, 1, &IEId, 1, &Len, 1, &RicType, 2, &Status, 2, (UCHAR *)&BaParm, 2, &TimeOutValue, END_OF_ARGS); return Status; }
/*************************************************************************** * * PCIe device initialization related procedures. * ***************************************************************************/ static VOID RTMPInitPCIeDevice( IN struct pci_dev *pci_dev, IN PRTMP_ADAPTER pAd) { USHORT device_id; POS_COOKIE pObj; #ifdef RT3090 USHORT subDev_id, subVendor_id; #endif // RT3090 // pObj = (POS_COOKIE) pAd->OS_Cookie; pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id); device_id = le2cpu16(device_id); pObj->DeviceID = device_id; #ifdef RT3090 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subVendor_id); subVendor_id = le2cpu16(subVendor_id); pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &subDev_id); subDev_id = le2cpu16(subDev_id); #endif // RT3090 // OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); if ( #ifdef RT3090 (device_id == NIC3090_PCIe_DEVICE_ID) || (device_id == NIC3091_PCIe_DEVICE_ID) || (device_id == NIC3092_PCIe_DEVICE_ID) || #endif // RT3090 // #ifdef RT3390 (device_id == NIC3390_PCIe_DEVICE_ID)|| #endif // RT3390 // 0) { UINT32 MacCsr0 = 0, Index= 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) break; RTMPusecDelay(10); } while (Index++ < 100); // Support advanced power save after 2892/2790. // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). if ((MacCsr0&0xffff0000) != 0x28600000) { #ifdef PCIE_PS_SUPPORT OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); #endif // PCIE_PS_SUPPORT // #ifdef RT3090 if ((subVendor_id == 0x1462) && (subDev_id == 0x891A)) RTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N); else RTMP_CLEAR_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N); #endif // RT3090 // RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCIE); return; } } RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI); }
static BOOLEAN USBDevConfigInit(IN struct usb_device *dev, IN struct usb_interface *intf, struct rt_rtmp_adapter *pAd) { struct usb_host_interface *iface_desc; unsigned long BulkOutIdx; u32 i; /* get the active interface descriptor */ iface_desc = intf->cur_altsetting; /* get # of enpoints */ pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints; DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints)); /* Configure Pipes */ BulkOutIdx = 0; for (i = 0; i < pAd->NumberOfPipes; i++) { if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) { pAd->BulkInEpAddr = iface_desc->endpoint[i].desc.bEndpointAddress; pAd->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc. wMaxPacketSize); DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pAd->BulkInMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc. bEndpointAddress)); } else if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && ((iface_desc->endpoint[i].desc. bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)) { /* there are 6 bulk out EP. EP6 highest priority. */ /* EP1-4 is EDCA. EP5 is HCCA. */ pAd->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress; pAd->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc. wMaxPacketSize); DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pAd->BulkOutMaxPacketSize)); DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc. bEndpointAddress)); } } if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0])) { printk ("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__); return FALSE; } pAd->config = &dev->config->desc; usb_set_intfdata(intf, pAd); return TRUE; }