/* ======================================================================== Routine Description: Write Firmware to NIC. Arguments: Return Value: IRQL = Note: ======================================================================== */ NTSTATUS RTUSBFirmwareWrite( IN PRTMP_ADAPTER pAd, IN PUCHAR pFwImage, IN ULONG FwLen) { UINT32 MacReg; NTSTATUS Status; // ULONG i; USHORT writeLen; Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg); writeLen = FwLen; RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen); Status = RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff); Status = RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff); Status = RTUSBFirmwareRun(pAd); #ifdef RT30xx RTMPusecDelay(10000); RTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0); AsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00);//reset rf by MCU supported by new firmware #endif return Status; }
/* ======================================================================== Routine Description: write high memory. if firmware do not support auto high/low memory switching, we should switch to high memory by ourself. Arguments: pAd - WLAN control block pointer Offset - Memory offsets Value - Written value Unit - Unit in "Byte" Return Value: None Note: ======================================================================== */ VOID RtmpChipWriteHighMemory( IN RTMP_ADAPTER *pAd, IN USHORT Offset, IN UINT32 Value, IN UINT8 Unit) { #ifdef RTMP_MAC_USB switch(Unit) { case 1: RTUSBSingleWrite(pAd, Offset, Value, TRUE); break; case 2: { UINT16 ShortVal = (UINT16)Value; RTUSBMultiWrite(pAd, Offset, (UCHAR *) &ShortVal, 2, TRUE); break; } case 4: RTUSBWriteMACRegister(pAd, Offset, Value, TRUE); default: break; } #endif /* RTMP_MAC_USB */ }
/* ======================================================================== Routine Description: Write Firmware to NIC. Arguments: Return Value: IRQL = Note: ======================================================================== */ NTSTATUS RTUSBFirmwareWrite( IN PRTMP_ADAPTER pAd, IN PUCHAR pFwImage, IN ULONG FwLen) { UINT32 MacReg; NTSTATUS Status; /* ULONG i;*/ USHORT writeLen; /*ULONG FMode = 0;*/ Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg); /* write firmware */ writeLen = FwLen; #if defined(USB_FIRMWARE_MULTIBYTE_WRITE) || defined(DPA_S) DBGPRINT(RT_DEBUG_TRACE, ("USB_FIRMWARE_MULTIBYTE_WRITE defined! Write_Bytes = %d\n", writeLen)); RTUSBMultiWrite_nBytes(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen, 64); #else DBGPRINT(RT_DEBUG_TRACE, ("USB_FIRMWARE_MULTIBYTE_WRITE not defined!\n")); RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen, FALSE); #endif Status = RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff, FALSE); Status = RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff, FALSE); /* change 8051 from ROM to RAM */ Status = RTUSBFirmwareRun(pAd); return Status; }
/* ======================================================================== Routine Description: Write Firmware to NIC. Arguments: Return Value: IRQL = Note: ======================================================================== */ NTSTATUS RTUSBFirmwareWrite( IN PRTMP_ADAPTER pAd, IN PUCHAR pFwImage, IN ULONG FwLen) { UINT32 MacReg; NTSTATUS Status; /* ULONG i;*/ USHORT writeLen; /*ULONG FMode = 0;*/ Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg); /* write firmware */ writeLen = FwLen; RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen); Status = RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff); Status = RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff); /* change 8051 from ROM to RAM */ Status = RTUSBFirmwareRun(pAd); return Status; }
/* ======================================================================== Routine Description: write high memory. if firmware do not support auto high/low memory switching, we should switch to high memory by ourself. Arguments: pAd - WLAN control block pointer Offset - Memory offsets Value - Written value Unit - Unit in "Byte" Return Value: None Note: ======================================================================== */ void RtmpChipWriteHighMemory( IN RTMP_ADAPTER *pAd, IN unsigned short Offset, IN unsigned int Value, IN unsigned char Unit) { #ifdef RTMP_MAC_USB switch(Unit) { case 1: RTUSBSingleWrite(pAd, Offset, Value, TRUE); break; case 2: { unsigned short ShortVal = (unsigned short)Value; RTUSBMultiWrite(pAd, Offset, (unsigned char *) &ShortVal, 2, TRUE); break; } case 4: RTUSBWriteMACRegister(pAd, Offset, Value, TRUE); default: break; } #endif /* RTMP_MAC_USB */ }
/* ======================================================================== Routine Description: As STA's BSSID is a WC too, it uses shared key table. This function write correct unicast TX key to ASIC WCID. And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey. Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key) Caller guarantee WEP calls this function when set Txkey, default key index=0~3. Arguments: pAd Pointer to our adapter pKey Pointer to the where the key stored Return Value: NDIS_SUCCESS Add key successfully Note: ======================================================================== */ VOID RTMPAddBSSIDCipher( IN PRTMP_ADAPTER pAd, IN UCHAR Aid, IN PNDIS_802_11_KEY pKey, IN UCHAR CipherAlg) { PUCHAR pTxMic, pRxMic; BOOLEAN bKeyRSC, bAuthenticator; // indicate the receive SC set by KeyRSC value // UCHAR CipherAlg; UCHAR i; ULONG WCIDAttri; USHORT offset; UCHAR KeyIdx, IVEIV[8]; UINT32 Value; DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddBSSIDCipher==> Aid = %d\n",Aid)); // Bit 29 of Add-key KeyRSC bKeyRSC = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE; // Bit 28 of Add-key Authenticator bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE; KeyIdx = (UCHAR)pKey->KeyIndex&0xff; if (KeyIdx > 4) return; if (pAd->MacTab.Content[Aid].PairwiseKey.CipherAlg == CIPHER_TKIP) { if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) { // for WPA-None Tx, Rx MIC is the same pTxMic = (PUCHAR) (&pKey->KeyMaterial) + 16; pRxMic = pTxMic; } else if (bAuthenticator == TRUE) { pTxMic = (PUCHAR) (&pKey->KeyMaterial) + 16; pRxMic = (PUCHAR) (&pKey->KeyMaterial) + 24; } else { pRxMic = (PUCHAR) (&pKey->KeyMaterial) + 16; pTxMic = (PUCHAR) (&pKey->KeyMaterial) + 24; } offset = PAIRWISE_KEY_TABLE_BASE + (Aid * HW_KEY_ENTRY_SIZE) + 0x10; for (i=0; i<8; ) { Value = *(pTxMic+i); Value += (*(pTxMic+i+1)<<8); Value += (*(pTxMic+i+2)<<16); Value += (*(pTxMic+i+3)<<24); RTUSBWriteMACRegister(pAd, offset+i, Value); i+=4; } offset = PAIRWISE_KEY_TABLE_BASE + (Aid * HW_KEY_ENTRY_SIZE) + 0x18; for (i=0; i<8; ) { Value = *(pRxMic+i); Value += (*(pRxMic+i+1)<<8); Value += (*(pRxMic+i+2)<<16); Value += (*(pRxMic+i+3)<<24); RTUSBWriteMACRegister(pAd, offset+i, Value); i+=4; } // Only Key lenth equal to TKIP key have these NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.RxMic, pRxMic, 8); NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.TxMic, pTxMic, 8); DBGPRINT(RT_DEBUG_TRACE, (" TxMIC = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", pTxMic[0],pTxMic[1],pTxMic[2],pTxMic[3], pTxMic[4],pTxMic[5],pTxMic[6],pTxMic[7])); DBGPRINT(RT_DEBUG_TRACE, (" RxMIC = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", pRxMic[0],pRxMic[1],pRxMic[2],pRxMic[3], pRxMic[4],pRxMic[5],pRxMic[6],pRxMic[7])); } // 2. Record Security Key. pAd->MacTab.Content[BSSID_WCID].PairwiseKey.KeyLen= (UCHAR)pKey->KeyLength; NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength); // 3. Check RxTsc. And used to init to ASIC IV. if (bKeyRSC == TRUE) NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.RxTsc, &pKey->KeyRSC, 6); else NdisZeroMemory(pAd->MacTab.Content[Aid].PairwiseKey.RxTsc, 6); // 4. Init TxTsc to one based on WiFi WPA specs pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[0] = 1; pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[1] = 0; pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[2] = 0; pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[3] = 0; pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[4] = 0; pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[5] = 0; CipherAlg = pAd->MacTab.Content[Aid].PairwiseKey.CipherAlg; offset = PAIRWISE_KEY_TABLE_BASE + (Aid * HW_KEY_ENTRY_SIZE); RTUSBMultiWrite(pAd, (USHORT) offset, pKey->KeyMaterial, ((pKey->KeyLength == LEN_TKIP_KEY) ? 16 : (USHORT)pKey->KeyLength)); offset = SHARED_KEY_TABLE_BASE + (KeyIdx * HW_KEY_ENTRY_SIZE); RTUSBMultiWrite(pAd, (USHORT) offset, pKey->KeyMaterial, (USHORT)pKey->KeyLength); offset = PAIRWISE_IVEIV_TABLE_BASE + (Aid * HW_IVEIV_ENTRY_SIZE); NdisZeroMemory(IVEIV, 8); // IV/EIV if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC) || (CipherAlg == CIPHER_AES)) { IVEIV[3] = 0x20; // Eiv bit on. keyid always 0 for pairwise key } // default key idx needs to set. // in TKIP/AES KeyIdx = 0 , WEP KeyIdx is default tx key. else { IVEIV[3] |= (KeyIdx<< 6); } RTUSBMultiWrite(pAd, (USHORT) offset, IVEIV, 8); // WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:1=PAIRWISE KEY, BSSIdx is 0 if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC) || (CipherAlg == CIPHER_AES)) { WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE; } else WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE; offset = MAC_WCID_ATTRIBUTE_BASE + (Aid* HW_WCID_ATTRI_SIZE); RTUSBWriteMACRegister(pAd, offset, WCIDAttri); RTUSBReadMACRegister(pAd, offset, &Value); DBGPRINT(RT_DEBUG_TRACE, ("BSSID_WCID : offset = %x, WCIDAttri = %lx\n", offset, WCIDAttri)); // pAddr // Add Bssid mac address at linkup. not here. check! /*offset = MAC_WCID_BASE + (BSSID_WCID * HW_WCID_ENTRY_SIZE); *for (i=0; i<MAC_ADDR_LEN; i++) { RTMP_IO_WRITE8(pAd, offset+i, pKey->BSSID[i]); } */ DBGPRINT(RT_DEBUG_ERROR, ("AddBSSIDasWCIDEntry: Alg=%s, KeyLength = %d\n", CipherName[CipherAlg], pKey->KeyLength)); DBGPRINT(RT_DEBUG_TRACE, ("Key [idx=%x] [KeyLen = %d]\n", pKey->KeyIndex, pKey->KeyLength)); for(i=0; i<pKey->KeyLength; i++) DBGPRINT_RAW(RT_DEBUG_TRACE,(" %x:", pKey->KeyMaterial[i])); DBGPRINT(RT_DEBUG_TRACE,(" \n")); }