rtusb_io.c
来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,909 行 · 第 1/4 页
C
1,909 行
{ BBP_CSR_CFG_STRUC BbpCsr; int i, k; for (i=0; i<MAX_BUSY_COUNT; i++) { RTUSBReadMACRegister(pAd, H2M_BBP_AGENT, &BbpCsr.word); if (BbpCsr.field.Busy == BUSY) { continue; } BbpCsr.word = 0; BbpCsr.field.fRead = 1; BbpCsr.field.BBP_RW_MODE = 1; BbpCsr.field.Busy = 1; BbpCsr.field.RegNum = Id; RTUSBWriteMACRegister(pAd, H2M_BBP_AGENT, BbpCsr.word); AsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0); for (k=0; k<MAX_BUSY_COUNT; k++) { RTUSBReadMACRegister(pAd, H2M_BBP_AGENT, &BbpCsr.word); if (BbpCsr.field.Busy == IDLE) break; } if ((BbpCsr.field.Busy == IDLE) && (BbpCsr.field.RegNum == Id)) { *pValue = (UCHAR)BbpCsr.field.Value; break; } } if (BbpCsr.field.Busy == BUSY) { DBGPRINT_ERR(("BBP read R%d=0x%x fail\n", Id, BbpCsr.word)); *pValue = pAd->BbpWriteLatch[Id]; return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS;}#endif#if 1/* ======================================================================== Routine Description: Write 8-bit BBP register Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBWriteBBPRegister( IN PRTMP_ADAPTER pAd, IN UCHAR Id, IN UCHAR Value){ BBP_CSR_CFG_STRUC BbpCsr; UINT i = 0; NTSTATUS status; // Verify the busy condition do { status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word); if (status >= 0) { if (!(BbpCsr.field.Busy == BUSY)) break; } printk("RTUSBWriteBBPRegister(BBP_CSR_CFG):retry count=%d!\n", i); i++; } while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) { DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); return STATUS_UNSUCCESSFUL; } // Prepare for write material BbpCsr.word = 0; BbpCsr.field.fRead = 0; BbpCsr.field.Value = Value; BbpCsr.field.Busy = 1; BbpCsr.field.RegNum = Id; RTUSBWriteMACRegister(pAd, BBP_CSR_CFG, BbpCsr.word); pAd->BbpWriteLatch[Id] = Value; return STATUS_SUCCESS;}#else/* ======================================================================== Routine Description: Write 8-bit BBP register via firmware Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBWriteBBPRegister( IN PRTMP_ADAPTER pAd, IN UCHAR Id, IN UCHAR Value){ BBP_CSR_CFG_STRUC BbpCsr; int BusyCnt; for (BusyCnt=0; BusyCnt<MAX_BUSY_COUNT; BusyCnt++) { RTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word); if (BbpCsr.field.Busy == BUSY) continue; BbpCsr.word = 0; BbpCsr.field.fRead = 0; BbpCsr.field.BBP_RW_MODE = 1; BbpCsr.field.Busy = 1; BbpCsr.field.Value = Value; BbpCsr.field.RegNum = Id; RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word); AsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0); pAd->BbpWriteLatch[Id] = Value; break; } if (BusyCnt == MAX_BUSY_COUNT) { DBGPRINT_ERR(("BBP write R%d=0x%x fail\n", Id, BbpCsr.word)); return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS;}#endif/* ======================================================================== Routine Description: Write RF register through MAC Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBWriteRFRegister( IN PRTMP_ADAPTER pAd, IN UINT32 Value){ PHY_CSR4_STRUC PhyCsr4; UINT i = 0; NTSTATUS status; NdisZeroMemory(&PhyCsr4, sizeof(PHY_CSR4_STRUC)); do { status = RTUSBReadMACRegister(pAd, RF_CSR_CFG0, &PhyCsr4.word); if (status >= 0) { if (!(PhyCsr4.field.Busy)) break; } printk("RTUSBWriteRFRegister(RF_CSR_CFG0):retry count=%d!\n", i); i++; } while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) { DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); return STATUS_UNSUCCESSFUL; } RTUSBWriteMACRegister(pAd, RF_CSR_CFG0, Value); return STATUS_SUCCESS;}/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBReadEEPROM( IN PRTMP_ADAPTER pAd, IN USHORT Offset, OUT PUCHAR pData, IN USHORT length){ NTSTATUS Status = STATUS_SUCCESS;#ifdef RT30xx if(pAd->bUseEfuse) { Status =eFuseRead(pAd, Offset, pData, length); } else#endif // RT30xx // { Status = RTUSB_VendorRequest( pAd, (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK), DEVICE_VENDOR_REQUEST_IN, 0x9, 0, Offset, pData, length); } return Status;}/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBWriteEEPROM( IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN PUCHAR pData, IN USHORT length){ NTSTATUS Status = STATUS_SUCCESS;#ifdef RT30xx if(pAd->bUseEfuse) { Status = eFuseWrite(pAd, Offset, pData, length); } else#endif // RT30xx // { Status = RTUSB_VendorRequest( pAd, USBD_TRANSFER_DIRECTION_OUT, DEVICE_VENDOR_REQUEST_OUT, 0x8, 0, Offset, pData, length); } return Status;}/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/VOID RTUSBPutToSleep( IN PRTMP_ADAPTER pAd){ UINT32 value; // Timeout 0x40 x 50us value = (SLEEPCID<<16)+(OWNERMCU<<24)+ (0x40<<8)+1; RTUSBWriteMACRegister(pAd, 0x7010, value); RTUSBWriteMACRegister(pAd, 0x404, 0x30); //RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); DBGPRINT_RAW(RT_DEBUG_ERROR, ("Sleep Mailbox testvalue %x\n", value)); }/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBWakeUp( IN PRTMP_ADAPTER pAd){ NTSTATUS Status; Status = RTUSB_VendorRequest( pAd, USBD_TRANSFER_DIRECTION_OUT, DEVICE_VENDOR_REQUEST_OUT, 0x01, 0x09, 0, NULL, 0); return Status;}/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/VOID RTUSBInitializeCmdQ( IN PCmdQ cmdq){ cmdq->head = NULL; cmdq->tail = NULL; cmdq->size = 0; cmdq->CmdQState = RT2870_THREAD_INITED;}/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/NDIS_STATUS RTUSBEnqueueCmdFromNdis( IN PRTMP_ADAPTER pAd, IN NDIS_OID Oid, IN BOOLEAN SetInformation, IN PVOID pInformationBuffer, IN UINT32 InformationBufferLength){ NDIS_STATUS status; PCmdQElmt cmdqelmt = NULL; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; if (pObj->RTUSBCmdThr_pid < 0) return (NDIS_STATUS_RESOURCES); status = RTMPAllocateMemory((PVOID *)&cmdqelmt, sizeof(CmdQElmt)); if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL)) return (NDIS_STATUS_RESOURCES); cmdqelmt->buffer = NULL; if (pInformationBuffer != NULL) { status = RTMPAllocateMemory((PVOID *)&cmdqelmt->buffer, InformationBufferLength); if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL)) { kfree(cmdqelmt); return (NDIS_STATUS_RESOURCES); } else { NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength); cmdqelmt->bufferlength = InformationBufferLength; } } else cmdqelmt->bufferlength = 0; cmdqelmt->command = Oid; cmdqelmt->CmdFromNdis = TRUE; if (SetInformation == TRUE) cmdqelmt->SetOperation = TRUE; else cmdqelmt->SetOperation = FALSE; NdisAcquireSpinLock(&pAd->CmdQLock); if (pAd->CmdQ.CmdQState & RT2870_THREAD_CAN_DO_INSERT) { EnqueueCmd((&pAd->CmdQ), cmdqelmt); status = NDIS_STATUS_SUCCESS; } else { status = NDIS_STATUS_FAILURE; } NdisReleaseSpinLock(&pAd->CmdQLock); if (status == NDIS_STATUS_FAILURE) { if (cmdqelmt->buffer) NdisFreeMemory(cmdqelmt->buffer, cmdqelmt->bufferlength, 0); NdisFreeMemory(cmdqelmt, sizeof(CmdQElmt), 0); } else RTUSBCMDUp(pAd); return(NDIS_STATUS_SUCCESS);}/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ========================================================================*/NDIS_STATUS RTUSBEnqueueInternalCmd( IN PRTMP_ADAPTER pAd, IN NDIS_OID Oid, IN PVOID pInformationBuffer, IN UINT32 InformationBufferLength) { NDIS_STATUS status; PCmdQElmt cmdqelmt = NULL;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?