NTSTATUS RTUSBMultiWrite( IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN PUCHAR pData, IN USHORT length) { NTSTATUS Status; USHORT index = 0,Value; PUCHAR pSrc = pData; USHORT resude = 0; resude = length % 2; length += resude; do { Value =(USHORT)( *pSrc | (*(pSrc + 1) << 8)); Status = RTUSBSingleWrite(pAd,Offset + index,Value); index +=2; length -= 2; pSrc = pSrc + 2; }while(length > 0); return Status; }
/* ======================================================================== Routine Description: Write 32-bit MAC register Arguments: Return Value: IRQL = Note: ======================================================================== */ NTSTATUS RTUSBWriteMACRegister( IN RTMP_ADAPTER *pAd, IN USHORT Offset, IN UINT32 Value, IN BOOLEAN bWriteHigh) { NTSTATUS Status; UINT32 localVal; localVal = Value; /* MT76xx HW has 4 byte alignment constrained */ if (IS_MT76xx(pAd)) { Status = RTUSBMultiWrite_nBytes( pAd, Offset, (UCHAR*)&Value, 4, 4); } else { Status = RTUSBSingleWrite(pAd, Offset, (USHORT)(localVal & 0xffff), bWriteHigh); Status = RTUSBSingleWrite(pAd, Offset + 2, (USHORT)((localVal & 0xffff0000) >> 16), bWriteHigh); } 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 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: Write 32-bit MAC register Arguments: Return Value: IRQL = Note: ======================================================================== */ NTSTATUS RTUSBWriteMACRegister( IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN UINT32 Value) { NTSTATUS Status; UINT32 localVal; localVal = Value; Status = RTUSBSingleWrite(pAd, Offset, (USHORT)(localVal & 0xffff)); Status = RTUSBSingleWrite(pAd, Offset + 2, (USHORT)((localVal & 0xffff0000) >> 16)); return Status; }