📄 rtmp_main.c
字号:
else if(Antenna == 1) pAd->Antenna.field.RxDefaultAntenna = 2; // ant-B else pAd->Antenna.field.RxDefaultAntenna = 0; // diversity pAd->PortCfg.BandState = UNKNOWN_BAND; AsicAntennaSelect(pAd, pAd->LatchRfRegs.Channel); DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_RX_ANTENNA_SELECTED (=%d)\n", Antenna); } break; case OID_802_11_TX_ANTENNA_SELECTED: { NDIS_802_11_ANTENNA Antenna = *(NDIS_802_11_ANTENNA *)pData; if (Antenna == 0) pAd->Antenna.field.TxDefaultAntenna = 1; // ant-A else if(Antenna == 1) pAd->Antenna.field.TxDefaultAntenna = 2; // ant-B else pAd->Antenna.field.TxDefaultAntenna = 0; // diversity pAd->PortCfg.BandState = UNKNOWN_BAND; AsicAntennaSelect(pAd, pAd->LatchRfRegs.Channel); DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_TX_ANTENNA_SELECTED (=%d)\n", Antenna); } break;#if 0 case RT_OID_802_11_QUERY_HARDWARE_REGISTER: NdisStatus = RTUSBQueryHardWareRegister(pAd, pData); break; case RT_OID_802_11_SET_HARDWARE_REGISTER: NdisStatus = RTUSBSetHardWareRegister(pAd, pData); break;#endif case RT_OID_MULTI_READ_MAC: { USHORT Offset = *((PUSHORT)pData); USHORT Length = *((PUSHORT)(pData + 2)); RTUSBMultiRead(pAd, Offset, pData + 4, Length); } break; case RT_OID_MULTI_WRITE_MAC: { USHORT Offset = *((PUSHORT)pData); USHORT Length = *((PUSHORT)(pData + 2)); RTUSBMultiWrite(pAd, Offset, pData + 4, Length); } break; case RT_OID_USB_VENDOR_EEPROM_READ: { USHORT Offset = *((PUSHORT)pData); USHORT Length = *((PUSHORT)(pData + 2)); RTUSBReadEEPROM(pAd, Offset, pData + 4, Length); } break; case RT_OID_USB_VENDOR_EEPROM_WRITE: { USHORT Offset = *((PUSHORT)pData);#if 0 USHORT Length = *((PUSHORT)(pData + 2)); RTUSBWriteEEPROM(pAd, Offset, pData + 4, Length);#else//F/W restricts the max EEPROM write size to 62 bytes. USHORT Residual = *((PUSHORT)(pData + 2)); pData += 4; while (Residual > 62) { RTUSBWriteEEPROM(pAd, Offset, pData, 62); Offset += 62; Residual -= 62; pData += 62; } RTUSBWriteEEPROM(pAd, Offset, pData, Residual);#endif } break; case RT_OID_USB_VENDOR_ENTER_TESTMODE: RTUSB_VendorRequest(pAd, 0, DEVICE_VENDOR_REQUEST_OUT, 0x1, 0x4, 0x1, NULL, 0); break; case RT_OID_USB_VENDOR_EXIT_TESTMODE: RTUSB_VendorRequest(pAd, 0, DEVICE_VENDOR_REQUEST_OUT, 0x1, 0x4, 0x0, NULL, 0); break; case RT_OID_USB_RESET_BULK_OUT: { INT Index; DBGPRINT(RT_DEBUG_INFO, "RT_OID_USB_RESET_BULK_OUT\n"); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); RTUSBRejectPendingPackets(pAd); //reject all NDIS packets waiting in TX queue RTUSBCancelPendingBulkOutIRP(pAd); RTUSBCleanUpDataBulkOutQueue(pAd); NICInitializeAsic(pAd); //ReleaseAdapter(pAd, FALSE, TRUE); // unlink urb releated tx context //NICInitTransmit(pAd); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); } if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) { for (Index = 0; Index < 4; Index++) { if(!skb_queue_empty(&pAd->SendTxWaitQueue[Index])) { RTMPDeQueuePacket(pAd, Index); } } RTUSBKickBulkOut(pAd); } } break; case RT_OID_USB_RESET_BULK_IN: { int i; DBGPRINT(RT_DEBUG_INFO, "!!!!!RT_OID_USB_RESET_BULK_IN\n"); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); NICInitializeAsic(pAd); //RTUSBWriteMACRegister(pAd, TXRX_CSR0, 0x025eb032); // ?? for (i = 0; i < RX_RING_SIZE; i++) { PRX_CONTEXT pRxContext = &(pAd->RxContext[i]); if (pRxContext->pUrb != NULL) { RTUSB_UNLINK_URB(pRxContext->pUrb); usb_free_urb(pRxContext->pUrb); pRxContext->pUrb = NULL; } if (pRxContext->TransferBuffer != NULL) { kfree(pRxContext->TransferBuffer); pRxContext->TransferBuffer = NULL; } } NICInitRecv(pAd); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); } if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) { RTUSBBulkReceive(pAd); RTUSBWriteMACRegister(pAd, TXRX_CSR0, 0x0276b032); // enable RX of MAC block } } break; case RT_OID_802_11_STA_CONFIG: { RT_802_11_STA_CONFIG *pStaConfig = (RT_802_11_STA_CONFIG *)pData; if (pStaConfig->EnableTxBurst != pAd->PortCfg.bEnableTxBurst) { pAd->PortCfg.bEnableTxBurst = (pStaConfig->EnableTxBurst == 1); //Currently Tx burst mode is only implemented in infrastructure mode. if (INFRA_ON(pAd)) { if (pAd->PortCfg.bEnableTxBurst) { //Extend slot time if any encryption method is used to give ASIC more time to do encryption/decryption during Tx burst mode. if (pAd->PortCfg.WepStatus != Ndis802_11EncryptionDisabled) { // Nemo RT2573USBWriteMACRegister_old(pAd, MAC_CSR10, 0x20); } //Set CWmin/CWmax to 0. // Nemo 2004 RT2573USBWriteMACRegister_old(pAd, MAC_CSR22, 0x100); } else { if (pAd->PortCfg.WepStatus != Ndis802_11EncryptionDisabled) AsicSetSlotTime(pAd, (BOOLEAN)pAd->PortCfg.UseShortSlotTime); // Nemo 2004 RT2573USBWriteMACRegister_old(pAd, MAC_CSR22, 0x53); } } } //pAd->PortCfg.EnableTurboRate = pStaConfig->EnableTurboRate; pAd->PortCfg.UseBGProtection = pStaConfig->UseBGProtection; //pAd->PortCfg.UseShortSlotTime = pStaConfig->UseShortSlotTime; pAd->PortCfg.UseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable if (pAd->PortCfg.AdhocMode != pStaConfig->AdhocMode) { // allow dynamic change of "USE OFDM rate or not" in ADHOC mode // if setting changed, need to reset current TX rate as well as BEACON frame format pAd->PortCfg.AdhocMode = pStaConfig->AdhocMode; if (pAd->PortCfg.BssType == BSS_ADHOC) { MlmeUpdateTxRates(pAd, FALSE); MakeIbssBeacon(pAd); AsicEnableIbssSync(pAd); } } DBGPRINT(RT_DEBUG_TRACE, "CmdThread::RT_OID_802_11_SET_STA_CONFIG (Burst=%d,BGprot=%d,ShortSlot=%d,Adhoc=%d,Protection=%d\n", pStaConfig->EnableTxBurst, pStaConfig->UseBGProtection, pStaConfig->UseShortSlotTime, pStaConfig->AdhocMode, pAd->PortCfg.UseBGProtection); } break; case RT_OID_SET_PSM_BIT_SAVE: MlmeSetPsmBit(pAd, PWR_SAVE); RTMPSendNullFrame(pAd, pAd->PortCfg.TxRate); break; case RT_OID_SET_RADIO: if (pAd->PortCfg.bRadio == TRUE) { MlmeRadioOn(pAd); // Update extra information pAd->ExtraInfo = EXTRA_INFO_CLEAR; } else { disassocSTA(pAd); MlmeRadioOff(pAd); // Update extra information pAd->ExtraInfo = SW_RADIO_OFF; } break; case RT_OID_RESET_FROM_ERROR: case RT_OID_RESET_FROM_NDIS: { UINT i = 0; DBGPRINT(RT_DEBUG_TRACE, "- (%s)::RT_OID_RESET_FROM_ERROR\n", __FUNCTION__); RTUSBRejectPendingPackets(pAd);//reject all NDIS packets waiting in TX queue RTUSBCleanUpDataBulkOutQueue(pAd); MlmeSuspend(pAd, FALSE); //Add code to access necessary registers here. //disable Rx RTUSBWriteMACRegister(pAd, TXRX_CSR2, 1); //Ask our device to complete any pending bulk in IRP. while ((atomic_read(&pAd->PendingRx) > 0) || (pAd->BulkOutPending[0] == TRUE) || (pAd->BulkOutPending[1] == TRUE) || (pAd->BulkOutPending[2] == TRUE) || (pAd->BulkOutPending[3] == TRUE)) { if (atomic_read(&pAd->PendingRx) > 0) { DBGPRINT(RT_DEBUG_TRACE, "- (%s) BulkIn IRP Pending!!!\n", __FUNCTION__); RTUSB_VendorRequest(pAd, 0, DEVICE_VENDOR_REQUEST_OUT, 0x0C, 0x0, 0x0, NULL, 0); } if ((pAd->BulkOutPending[0] == TRUE) || (pAd->BulkOutPending[1] == TRUE) || (pAd->BulkOutPending[2] == TRUE) || (pAd->BulkOutPending[3] == TRUE)) { DBGPRINT(RT_DEBUG_TRACE, "- (%s) BulkOut IRP Pending!!!\n", __FUNCTION__); if (i == 0) { RTUSBCancelPendingBulkOutIRP(pAd); i++; } } RTMPusecDelay(500000); } NICResetFromError(pAd); if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR); } if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); } if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); } RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS); if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) { MlmeResume(pAd); RTUSBBulkReceive(pAd); RTUSBWriteMACRegister(pAd, TXRX_CSR2, 0x7e); } } break; case RT_OID_LINK_DOWN: DBGPRINT(RT_DEBUG_INFO, "LinkDown(RT_OID_LINK_DOWN)\n"); LinkDown(pAd, TRUE); break; case RT_OID_VENDOR_WRITE_BBP: { UCHAR Offset, Value; Offset = *((PUCHAR)pData); Value = *((PUCHAR)(pData + 1)); DBGPRINT(RT_DEBUG_INFO, "offset = 0x%02x value = 0x%02x\n", Offset, Value); RTUSBWriteBBPRegister(pAd, Offset, Value); } break; case RT_OID_VENDOR_READ_BBP: { UCHAR Offset = *((PUCHAR)pData); PUCHAR pValue = (PUCHAR)(pData + 1); DBGPRINT(RT_DEBUG_INFO, "offset = 0x%02x\n", Offset); RTUSBReadBBPRegister(pAd, Offset, pValue); DBGPRINT(RT_DEBUG_INFO, "value = 0x%02x\n", *pValue); } break; case RT_OID_VENDOR_WRITE_RF: { ULONG Value = *((PULONG)pData); DBGPRINT(RT_DEBUG_INFO, "value = 0x%08x\n", Value); RTUSBWriteRFRegister(pAd, Value); } break; case RT_OID_802_11_RESET_COUNTERS: { UCHAR Value[22]; RTUSBMultiRead(pAd, STA_CSR0, Value, 24); } break; case RT_OID_USB_VENDOR_RESET: RTUSB_VendorRequest(pAd, 0, DEVICE_VENDOR_REQUEST_OUT, 1, 1, 0, NULL, 0); break; case RT_OID_USB_VENDOR_UNPLUG: RTUSB_VendorRequest(pAd, 0, DEVICE_VENDOR_REQUEST_OUT, 1, 2, 0, NULL, 0); break;#if 0 case RT_OID_USB_VENDOR_SWITCH_FUNCTION: RTUSBWriteMACRegister(pAd, MAC_CSR13, 0x2121); RTUSBWriteMACRegister(pAd, MAC_CSR14, 0x1e1e); RTUSBWriteMACRegister(pAd, MAC_CSR1, 3); RTUSBWriteMACRegister(pAd, PHY_CSR4, 0xf); RTUSB_VendorRequest(pAd, 0, DEVICE_VENDOR_REQUEST_OUT, 1, 3, 0, NULL, 0); break;#endif case RT_OID_VENDOR_FLIP_IQ: { ULONG Value1, Value2; RTUSBReadMACRegister(pAd, PHY_CSR5, &Value1); RTUSBReadMACRegister(pAd, PHY_CSR6, &Value2); if (*pData == 1) { DBGPRINT(RT_DEBUG_INFO, "I/Q Flip\n"); Value1 = Value1 | 0x0004; Value2 = Value2 | 0x0004; } else { DBGPRINT(RT_DEBUG_INFO, "I/Q Not Flip\n"); Value1 = Value1 & 0xFFFB; Value2 = Value2 & 0xFFFB; } RTUSBWriteMACRegister(pAd, PHY_CSR5, Value1); RTUSBWriteMACRegister(pAd, PHY_CSR6, Value2); } break; case RT_OID_UPDATE_TX_RATE: MlmeUpdateTxRates(pAd, FALSE); if (ADHOC_ON(pAd)) MakeIbssBeacon(pAd); break; case RT_OID_802_11_PREAMBLE: { ULONG Preamble = *((PULONG)(cmdqelmt->buffer)); if (Preamble == Rt802_11PreambleShort) { pAd->PortCfg.TxPreamble = Preamble; MlmeSetTxPreamble(pAd, Rt802_11PreambleShort); } else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto)) { // if user wants AUTO, initialize to LONG here, then change according to AP's // capability upon association. pAd->PortCfg.TxPreamble = Preamble; MlmeSetTxPreamble(pAd, Rt802_11PreambleLong); } else NdisStatus = NDIS_STATUS_FAILURE; DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::RT_OID_802_11_SET_PREAMBLE (=%d)\n", Preamble); } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -