📄 rtusb_main.c
字号:
else if(Antenna == 0)
{// Antenna A
TxValue = (TxValue & 0xFC) | 0x00;
Value5 = (Value5 & 0xFFFC) | 0x0000;
Value6 = (Value6 & 0xFFFC) | 0x0000;
}
else if(Antenna == 1)
{// Antenna B
TxValue = (TxValue & 0xFC) | 0x02;
Value5 = (Value5 & 0xFFFC) | 0x0002;
Value6 = (Value6 & 0xFFFC) | 0x0002;
}
RTUSBWriteBBPRegister(pAdapter, BBP_Tx_Configure, TxValue);
RTUSBWriteMACRegister(pAdapter, PHY_CSR5, Value5);
RTUSBWriteMACRegister(pAdapter, PHY_CSR6, Value6);
}
}
break;
case RT_OID_SINGLE_WRITE_MAC:
{
USHORT Offset, Value;
Offset = *((PUSHORT)pData);
Value = *((PUSHORT)(pData + 2));
DBGPRINT_RAW(RT_DEBUG_INFO, "offset = 0x%04x value = 0x%04x\n", Offset, Value);
RTUSBWriteMACRegister(pAdapter, Offset, Value);
}
break;
case RT_OID_SINGLE_READ_MAC:
{
USHORT Offset = *((PUSHORT)pData);
PUSHORT pValue = (PUSHORT)(pData + 2);
DBGPRINT_RAW(RT_DEBUG_INFO, "offset = 0x%04x\n", Offset);
RTUSBReadMACRegister(pAdapter, Offset, pValue);
DBGPRINT_RAW(RT_DEBUG_INFO, "value = 0x%04x\n", *pValue);
}
break;
case RT_OID_MULTI_READ_MAC:
{
USHORT Offset = *((PUSHORT)pData);
USHORT Length = *((PUSHORT)(pData + 2));
RTUSBMultiReadMAC(pAdapter, Offset, pData + 4, Length);
}
break;
case RT_OID_MULTI_WRITE_MAC:
{
USHORT Offset = *((PUSHORT)pData);
USHORT Length = *((PUSHORT)(pData + 2));
RTUSBMultiWriteMAC(pAdapter, Offset, pData + 4, Length);
}
break;
case RT_OID_USB_VENDOR_EEPROM_READ:
{
USHORT Offset = *((PUSHORT)pData);
USHORT Length = *((PUSHORT)(pData + 2));
RTUSBReadEEPROM(pAdapter, Offset, pData + 4, Length);
}
break;
case RT_OID_USB_VENDOR_EEPROM_WRITE:
{
USHORT Offset = *((PUSHORT)pData);
#if 0
USHORT Length = *((PUSHORT)(pData + 2));
RTUSBWriteEEPROM(pAdapter, 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(pAdapter, Offset, pData, 62);
Offset += 62;
Residual -= 62;
pData += 62;
}
RTUSBWriteEEPROM(pAdapter, Offset, pData, Residual);
#endif
}
break;
case RT_OID_USB_VENDOR_ENTER_TESTMODE:
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x1,
0x4,
0x1,
NULL,
0);
break;
case RT_OID_USB_VENDOR_EXIT_TESTMODE:
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x1,
0x4,
0x0,
NULL,
0);
break;
case RT_OID_USB_RESET_BULK_OUT:
DBGPRINT_RAW(RT_DEBUG_ERROR, "RT_OID_USB_RESET_BULK_OUT\n");
break;
case RT_OID_USB_RESET_BULK_IN:
{
int i;
DBGPRINT_RAW(RT_DEBUG_ERROR, "!!!!!RT_OID_USB_RESET_BULK_IN\n");
DBGPRINT_RAW(RT_DEBUG_ERROR, "!!!!!RT_OID_USB_RESET_BULK_IN\n");
DBGPRINT_RAW(RT_DEBUG_ERROR, "!!!!!RT_OID_USB_RESET_BULK_IN\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS);
RT2570InitializeAsic(pAdapter);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 1);
for (i = 0; i < RX_RING_SIZE; i++)
{
PRX_CONTEXT pRxContext = &(pAdapter->RxContext[i]);
if (pRxContext->pUrb != NULL)
{
usb_unlink_urb(pRxContext->pUrb);
usb_free_urb(pRxContext->pUrb);
pRxContext->pUrb = NULL;
}
if (pRxContext->TransferBuffer != NULL)
{
FreeMemory(pRxContext->TransferBuffer);
pRxContext->TransferBuffer = NULL;
}
}
NICInitRecv(pAdapter);
RTMP_CLEAR_FLAG(pAdapter, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS);
if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET))
{
RTMP_CLEAR_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET);
}
if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF))
{
RTUSBBulkReceive(pAdapter);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 0x7e);
}
}
break;
case RT_OID_802_11_STA_CONFIG:
{
RT_802_11_STA_CONFIG *pStaConfig = (RT_802_11_STA_CONFIG *)pData;
if (pStaConfig->EnableTxBurst != pAdapter->PortCfg.EnableTxBurst)
{
pAdapter->PortCfg.EnableTxBurst = pStaConfig->EnableTxBurst;
//Currently Tx burst mode is only implemented in infrastructure mode.
if (INFRA_ON(pAdapter))
{
if (pAdapter->PortCfg.EnableTxBurst)
{
//Extend slot time if any encryption method is used to give ASIC more time to do encryption/decryption during Tx burst mode.
if (pAdapter->PortCfg.WepStatus != Ndis802_11EncryptionDisabled)
RTUSBWriteMACRegister(pAdapter, MAC_CSR10, 0x20);
//Set CWmin/CWmax to 0.
RTUSBWriteMACRegister(pAdapter, MAC_CSR22, 0x100);
}
else
{
if (pAdapter->PortCfg.WepStatus != Ndis802_11EncryptionDisabled)
AsicSetSlotTime(pAdapter, (BOOLEAN)pAdapter->PortCfg.ShortSlotInUsed);
RTUSBWriteMACRegister(pAdapter, MAC_CSR22, 0x53);
}
}
}
pAdapter->PortCfg.EnableTurboRate = pStaConfig->EnableTurboRate;
pAdapter->PortCfg.UseBGProtection = pStaConfig->UseBGProtection;
//pAdapter->PortCfg.UseShortSlotTime = pStaConfig->UseShortSlotTime;
pAdapter->PortCfg.UseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable
if (pAdapter->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
pAdapter->PortCfg.AdhocMode = pStaConfig->AdhocMode;
if (pAdapter->PortCfg.BssType == BSS_INDEP)
{
MlmeUpdateTxRates(pAdapter, FALSE);
MakeIbssBeacon(pAdapter);
}
}
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_STA_CONFIG (Burst=%d,72/100=%d,Protection=%d,ShortSlot=%d,Adhoc=%d\n",
pStaConfig->EnableTxBurst,
pStaConfig->EnableTurboRate,
pStaConfig->UseBGProtection,
pStaConfig->UseShortSlotTime,
pStaConfig->AdhocMode);
}
break;
case RT_OID_SET_PSM_BIT_SAVE:
MlmeSetPsmBit(pAdapter, PWR_SAVE);
EnqueueNullFrame(pAdapter, pAdapter->PortCfg.TxRate);
break;
case RT_OID_SET_RADIO:
if (pAdapter->PortCfg.bRadio == TRUE){
MlmeRadioOn(pAdapter);
// Update extra information
pAdapter->ExtraInfo = EXTRA_INFO_CLEAR;
}
else{
MlmeRadioOff(pAdapter);
// Update extra information
pAdapter->ExtraInfo = SW_RADIO_OFF;
}
break;
case RT_OID_RESET_FROM_ERROR:
case RT_OID_RESET_FROM_NDIS:
{
UINT i = 0;
RTUSBRejectPendingPackets(pAdapter);//reject all NDIS packets waiting in TX queue
RTUSBCleanUpDataBulkOutQueue(pAdapter);
MlmeSuspend(pAdapter);
//Add code to access necessary registers here.
//disable Rx
RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 1);
//Ask our device to complete any pending bulk in IRP.
while ((atomic_read(&pAdapter->PendingRx) > 0) || (pAdapter->BulkOutPending == TRUE))
{
if (atomic_read(&pAdapter->PendingRx) > 0)
{
DBGPRINT_RAW(RT_DEBUG_TRACE, "BulkIn IRP Pending!!!\n");
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x0C,
0x0,
0x0,
NULL,
0);
}
if (pAdapter->BulkOutPending == TRUE)
{
DBGPRINT_RAW(RT_DEBUG_TRACE, "BulkOut IRP Pending!!!\n");
if (i == 0)
{
RTUSBCancelPendingBulkOutIRP(pAdapter);
i++;
}
}
NdisMSleep(500000);
}
NICResetFromError(pAdapter);
if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HARDWARE_ERROR))
{
RTMP_CLEAR_FLAG(pAdapter, fRTMP_ADAPTER_HARDWARE_ERROR);
}
if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET))
{
RTMP_CLEAR_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET);
}
if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET))
{
RTMP_CLEAR_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);
}
RTMP_CLEAR_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS);
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))
{
MlmeResume(pAdapter);
RTUSBBulkReceive(pAdapter);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 0x7e);
}
}
break;
case RT_OID_LINK_DOWN:
DBGPRINT_RAW(RT_DEBUG_TRACE, "LinkDown(RT_OID_LINK_DOWN)\n");
LinkDown(pAdapter);
break;
case RT_OID_VENDOR_WRITE_BBP:
{
UCHAR Offset, Value;
Offset = *((PUCHAR)pData);
Value = *((PUCHAR)(pData + 1));
RTUSBWriteBBPRegister(pAdapter, Offset, Value);
}
break;
case RT_OID_VENDOR_READ_BBP:
{
UCHAR Offset = *((PUCHAR)pData);
PUCHAR pValue = (PUCHAR)(pData + 1);
DBGPRINT_RAW(RT_DEBUG_INFO, "offset = 0x%02x\n", Offset);
RTUSBReadBBPRegister(pAdapter, Offset, pValue);
DBGPRINT_RAW(RT_DEBUG_INFO, "value = 0x%02x\n", *pValue);
}
break;
case RT_OID_VENDOR_WRITE_RF:
{
ULONG Value = *((PULONG)pData);
DBGPRINT_RAW(RT_DEBUG_INFO, "value = 0x%08x\n", Value);
RTUSBWriteRFRegister(pAdapter, Value);
}
break;
case RT_OID_802_11_RESET_COUNTERS:
{
UCHAR Value[22];
RTUSBMultiReadMAC(pAdapter, STA_CSR0, Value, 22);
}
break;
case RT_OID_USB_VENDOR_RESET:
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
1,
1,
0,
NULL,
0);
break;
case RT_OID_USB_VENDOR_UNPLUG:
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
1,
2,
0,
NULL,
0);
break;
case RT_OID_USB_VENDOR_SWITCH_FUNCTION:
RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0x2121);
RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0x1e1e);
RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 3);
RTUSBWriteMACRegister(pAdapter, PHY_CSR4, 0xf);
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
1,
3,
0,
NULL,
0);
break;
case RT_OID_VENDOR_FLIP_IQ:
{
USHORT Value1, Value2;
RTUSBReadMACRegister(pAdapter, PHY_CSR5, &Value1);
RTUSBReadMACRegister(pAdapter, PHY_CSR6, &Value2);
if (*pData == 1)
{
DBGPRINT_RAW(RT_DEBUG_INFO, "I/Q Flip\n");
Value1 = Value1 | 0x0004;
Value2 = Value2 | 0x0004;
}
else
{
DBGPRINT_RAW(RT_DEBUG_INFO, "I/Q Not Flip\n");
Value1 = Value1 & 0xFFFB;
Value2 = Value2 & 0xFFFB;
}
RTUSBWriteMACRegister(pAdapter, PHY_CSR5, Value1);
RTUSBWriteMACRegister(pAdapter, PHY_CSR6, Value2);
}
break;
case RT_OID_UPDATE_TX_RATE:
MlmeUpdateTxRates(pAdapter, FALSE);
if (ADHOC_ON(pAdapter))
MakeIbssBeacon(pAdapter);
break;
#if 0
case RT_OID_UPDATE_R17:
switch ((pAdapter->SET_R17_FLAG % 3))
{
case 1:
RTUSBWriteBBPRegister(pAdapter, 17, pAdapter->BBPTuningParameters.BBPR17LowSensitivity);
RTUSBWriteBBPRegister(pAdapter, 24, pAdapter->BBPTuningParameters.R24HigherValue);
RTUSBWriteBBPRegister(pAdapter, 25, pAdapter->BBPTuningParameters.R25HigherValue);
RTUSBWriteBBPRegister(pAdapter, 61, pAdapter->BBPTuningParameters.R61HigherValue);
DBGPRINT(RT_DEBUG_TRACE,("RT_OID_UPDATE_1 R17 = %x\n",pAdapter->BBPTuningParameters.BBPR17LowSensitivity));
break;
case 2:
RTUSBWriteBBPRegister(pAdapter, 17, pAdapter->PortCfg.BbpTuning.VgcUpperBound);
RTUSBWriteBBPRegister(pAdapter, 24, pAdapter->BBPTuningParameters.R24LowerValue);
RTUSBWriteBBPRegister(pAdapter, 25, pAdapter->BBPTuningParameters.R25LowerValue);
RTUSBWriteBBPRegister(pAdapter, 61, pAdapter->BBPTuningParameters.R61LowerValue);
DBGPRINT(RT_DEBUG_TRACE,("RT_OID_UPDATE_2 R17 = %x\n",pAdapter->PortCfg.BbpTuning.VgcUpperBound));
break;
case 0:
RTUSBWriteBBPRegister(pAdapter, 17, pAdapter->BBPR17InitValue);
RTUSBWriteBBPRegister(pAdapter, 24, pAdapter->BBPTuningParameters.R24LowerValue);
RTUSBWriteBBPRegister(pAdapter, 25, pAdapter->BBPTuningParameters.R25LowerValue);
RTUSBWriteBBPRegister(pAdapter, 61, pAdapter->BBPTuningParameters.R61LowerValue);
DBGPRINT(RT_DEBUG_TRACE,("RT_OID_UPDATE_0 R17 = %x\n",pAdapter->BBPR17InitValue));
break;
}
break;
#endif
case RT_OID_802_11_PREAMBLE:
{
ULONG Preamble = *((PULONG)(cmdqelmt->buffer));
if (Preamble == Rt802_11PreambleShort)
{
pAdapter->PortCfg.WindowsTxPreamble = Preamble;
MlmeSetTxPreamble(pAdapter, 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.
pAdapter->PortCfg.WindowsTxPreamble = Preamble;
MlmeSetTxPreamble(pAdapter, Rt802_11PreambleLong);
}
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_PREAMBLE (=%d)\n", Preamble);
}
break;
case OID_802_11_NETWORK_TYPE_IN_USE:
{
NDIS_802_11_NETWORK_TYPE NetType = *(PNDIS_802_11_NETWORK_TYPE)(cmdqelmt->buffer);
if (NetType == Ndis802_11DS)
RTMPSetPhyMode(pAdapter, PHY_11B);
else if (NetType == Ndis802_11OFDM24)
RTMPSetPhyMode(pAdapter, PHY_11BG_MIXED);
else if (NetType == Ndis802_11OFDM5)
RTMPSetPhyMode(pAdapter, PHY_11A);
DBGPRINT(RT_DEBUG_ERROR, "Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType);
}
break;
case RT_OID_802_11_PHY_MODE:
{
ULONG phymode = *(ULONG *)(cmdqelmt->buffer);
RTMPSetPhyMode(pAdapter, phymode);
DBGPRINT(RT_DEBUG_ERROR, "Set::RT_OID_802_11_SET_PHY_MODE (=%d)\n", phymode);
}
break;
case OID_802_11_WEP_STATUS:
{
USHORT Value;
NDIS_802_11_WEP_STATUS WepStatus = *(PNDIS_802_11_WEP_STATUS)pData;
if (pAdapter->PortCfg.WepStatus != WepStatus)
{
// Config has changed
pAdapter->bConfigChanged = TRUE;
pAdapter->PortCfg.WepStatus = WepStatus;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -