undefined4 rt28xx_init(int param_1,undefined4 param_2)
{
bool bVar1;
undefined1 uVar2;
int iVar3;
uint uVar4;
code *pcVar5;
char cVar6;
int iVar7;
uint uVar8;
char *pcVar9;
uint uVar10;
uint uVar11;
uint uVar12;
if (param_1 == 0) {
return 0;
}
*(undefined4 *)(param_1 + 0x76904) = 0;
AutoChBssTableInit();
ChannelInfoInit(param_1);
iVar3 = ba_reordering_resource_init(param_1,0x200);
if (iVar3 != 1) goto LAB_0002de5c;
iVar3 = 0;
do {
iVar7 = 0;
if (*(char *)(param_1 + 0xec) == '\0') {
iVar7 = *(int *)(*(int *)(param_1 + 0xdc) + 0x1000);
}
*(int *)(param_1 + 0x4a94) = iVar7;
if (iVar7 - 1U < 0xfffffffe) break;
if ((*(uint *)(param_1 + 0x76904) & 0x100) != 0) goto LAB_0002de5c;
RTMPusecDelay(10);
bVar1 = iVar3 != 100;
iVar3 = iVar3 + 1;
} while (bVar1);
if (2 < RTDebugLevel) {
printk("MAC_CSR0 [ Ver:Rev=0x%08x]\n",*(undefined4 *)(param_1 + 0x4a94));
}
RtmpChipOpsHook(param_1);
if ((int)(*(byte *)(param_1 + 0xb0) - 4) < 0x20) {
if (RTDebugLevel != 0) {
printk("MAX_LEN_OF_MAC_TABLE can not be larger than MAX_AVAILABLE_CLIENT_WCID!!!!\n");
}
goto LAB_0002de5c;
}
if (*(char *)(param_1 + 0xec) == '\0') {
*(undefined4 *)(*(int *)(param_1 + 0xdc) + 0x1204) = 2;
}
RT28XXDMADisable(param_1);
iVar3 = NICLoadFirmware(param_1);
if (iVar3 != 0) {
printk("ERROR!!! ");
printk("NICLoadFirmware failed, Status[=0x%08x]\n",iVar3);
goto LAB_0002de5c;
}
NICLoadRateSwitchingParams(param_1);
if ((*(uint *)(param_1 + 0x76904) & 0x2000) != 0) {
if (*(char *)(param_1 + 0xec) == '\0') {
*(undefined4 *)(*(int *)(param_1 + 0xdc) + 0x204) = 0;
}
*(uint *)(param_1 + 0x76904) = *(uint *)(param_1 + 0x76904) & 0xffffdfff;
}
iVar3 = RTMPAllocTxRxRingMemory(param_1);
if (iVar3 == 0) {
*(uint *)(param_1 + 0x76904) = *(uint *)(param_1 + 0x76904) | 2;
iVar3 = RtmpMgmtTaskInit(param_1);
if (iVar3 == 0) {
iVar3 = MlmeInit(param_1);
if (iVar3 == 0) {
UserCfgInit(param_1);
iVar3 = RtmpNetTaskInit(param_1);
if (iVar3 == 0) {
CfgInitHook(param_1);
APInitialize(param_1);
iVar3 = MeasureReqTabInit(param_1);
if (iVar3 == 0) {
iVar3 = TpcReqTabInit(param_1);
if (iVar3 != 0) {
printk("ERROR!!! ");
pcVar9 = "TpcReqTabInit failed, Status[=0x%08x]\n";
goto LAB_0002d33c;
}
iVar3 = NICInitializeAdapter(param_1,1);
if (iVar3 == 0) {
*(undefined1 *)(param_1 + 0x4bd4) = 0xff;
iVar3 = RTMPReadParametersHook(param_1);
printk("1. Phy Mode = %d\n",*(undefined1 *)(param_1 + 0x16982));
if (iVar3 != 0) {
printk("ERROR!!! ");
pcVar9 = "RTMPReadParametersHook failed, Status[=0x%08x]\n";
goto LAB_0002d3e0;
}
iVar3 = *(int *)(param_1 + 0x16a64);
uVar8 = *(uint *)(RTMPCheckRates + param_1);
uVar4 = *(uint *)(param_1 + 0x16afc);
uVar11 = (uint)(iVar3 << 6) >> 0x1e;
uVar12 = *(uint *)(param_1 + 0x16b00);
uVar10 = (uint)(iVar3 << 10) >> 0x1d;
uVar2 = *(undefined1 *)(param_1 + 0x16982);
*(uint *)(param_1 + 0x16af8) = *(uint *)(param_1 + 0x16af8) & 0xffffffe3 | uVar10 << 2
;
*(uint *)(RTMPCheckRates + param_1) =
uVar8 & 0xf9f9ffff | ((uint)(iVar3 << 9) >> 0x1f) << 0x19 |
((uint)(iVar3 << 8) >> 0x1f) << 0x1a | uVar11 << 0x11;
*(uint *)(param_1 + 0x16b00) = uVar12 & 0xffffffe3 | uVar10 << 2;
*(uint *)(param_1 + 0x16afc) =
uVar4 & 0xf7f3ffff | uVar11 << 0x12 | ((uint)(iVar3 << 8) >> 0x1f) << 0x1b;
printk("2. Phy Mode = %d\n",uVar2);
NICReadEEPROMParameters(param_1,param_2);
printk("3. Phy Mode = %d\n",*(undefined1 *)(param_1 + 0x16982));
RTMPInitLEDMode(param_1);
NICInitAsicFromEEPROM(param_1);
if (*(code **)(param_1 + 0x68) != (code *)0x0) {
(**(code **)(param_1 + 0x68))(param_1);
}
uVar2 = *(undefined1 *)(param_1 + 0x16982);
*(undefined1 *)(param_1 + 0x16982) = 0xff;
RTMPSetPhyMode(param_1,uVar2);
SetCommonHT(param_1);
if (*(char *)(param_1 + 0x5058) != '\0') {
printk("MCS Set = %02x %02x %02x %02x %02x\n",*(undefined1 *)(param_1 + 0x16b01),
*(undefined1 *)(param_1 + 0x16b02),*(undefined1 *)(param_1 + 0x16b03),
*(undefined1 *)(param_1 + 0x16b04),*(undefined1 *)(param_1 + 0x16b05));
QBSS_LoadInit(param_1);
if (*(char *)(param_1 + 0x16964) == '\x01') {
AsicSwitchChannel(param_1,*(undefined1 *)(param_1 + 0x169ec),0);
AsicLockChannel(param_1,*(undefined1 *)(param_1 + 0x169ec));
}
*(uint *)(param_1 + 0x16abc) = *(uint *)(param_1 + 0x16abc) & 0xffdfff7f;
*(uint *)(param_1 + 0x76904) = *(uint *)(param_1 + 0x76904) | 0x20000000;
if (2 < RTDebugLevel) {
printk("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n");
}
if (*(char *)(param_1 + 0x16614) == '\0') {
if (*(char *)(param_1 + 0x169ec) != '\0') goto LAB_0002dc50;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
else {
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
if (cVar6 == '\0') {
*(undefined4 *)(*(int *)(param_1 + 0xdc) + 0x200) = 0xffffffff;
}
uVar11 = Status & 1;
if (*(char *)(param_1 + 0xec) == '\0') {
*(undefined4 *)(*(int *)(param_1 + 0xdc) + 0x204) =
*(undefined4 *)(param_1 + 0xf0);
}
*(uint *)(param_1 + 0x76904) = *(uint *)(param_1 + 0x76904) | 0x2000;
Status = Status & 0xfffffffe;
if (uVar11 != 0) {
Status = Status | 1;
}
RTMPEnableRxTx(param_1);
uVar11 = Status;
*(uint *)(param_1 + 0x76904) = *(uint *)(param_1 + 0x76904) | 0x10000000;
uVar10 = 0;
if (*(char *)(param_1 + 0xec) == '\0') {
if (*(int *)(param_1 + 0x29f8) == 4) {
uVar4 = 0;
if (*(char *)(param_1 + 0xad) == '\x01') {
Status = Status & 0xfffffffe;
uVar4 = uVar11 & 1;
}
iVar3 = 0;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
while( true ) {
uVar11 = 0;
if (cVar6 == '\0') {
uVar11 = *(uint *)(*(int *)(param_1 + 0xdc) + 0x101c);
}
if ((uVar11 & 0x20000) == 0) {
if (cVar6 == '\0') {
*(undefined4 *)(*(int *)(param_1 + 0xdc) + 0x101c) = 0xb0400;
}
iVar7 = 1;
while( true ) {
uVar11 = 0;
if (*(char *)(param_1 + 0xec) == '\0') {
uVar11 = *(uint *)(*(int *)(param_1 + 0xdc) + 0x101c);
}
if (((uVar11 & 0x20000) == 0) || (iVar7 == 100)) break;
iVar7 = iVar7 + 1;
}
if ((uVar11 & 0x2ff00) == 0x400) {
uVar10 = uVar11 & 0xff;
goto LAB_0002d788;
}
}
iVar3 = iVar3 + 1;
if (iVar3 == 100) break;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
uVar10 = 0;
LAB_0002d788:
if ((int)(uVar11 << 0xe) < 0) {
printk("ERROR!!! ");
printk("BBP(viaMCU=%d) read R%d fail\n",0,4);
uVar10 = (uint)*(byte *)(param_1 + 0x4acd);
LAB_0002d920:
cVar6 = *(char *)(param_1 + 0xad) //possible issue identified - semgrep
}
else {
cVar6 = *(char *)(param_1 + 0xad) //possible issue identified - semgrep
}
}
else {
uVar4 = 0;
if (*(char *)(param_1 + 0xad) == '\x01') {
Status = Status & 0xfffffffe;
uVar4 = uVar11 & 1;
}
iVar3 = 0;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
while( true ) {
uVar11 = 0;
if (cVar6 == '\0') {
uVar11 = *(uint *)(*(int *)(param_1 + 0xdc) + 0x7028);
}
if ((uVar11 & 0x20000) == 0) {
if (cVar6 == '\0') {
*(undefined4 *)(*(int *)(param_1 + 0xdc) + 0x7028) = 0xb0400;
}
AsicSendCommandToMcuBBP(param_1,0x80,0xff,0,0,0);
RTMPusecDelay(1000);
iVar7 = 1;
while( true ) {
uVar11 = 0;
if (*(char *)(param_1 + 0xec) == '\0') {
uVar11 = *(uint *)(*(int *)(param_1 + 0xdc) + 0x7028);
}
if (((uVar11 & 0x20000) == 0) || (iVar7 == 100)) break;
iVar7 = iVar7 + 1;
}
if ((uVar11 & 0x2ff00) == 0x400) {
uVar10 = uVar11 & 0xff;
goto LAB_0002d8c8;
}
}
iVar3 = iVar3 + 1;
if (iVar3 == 100) break;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
uVar10 = 0;
LAB_0002d8c8:
if ((int)(uVar11 << 0xe) < 0) {
printk("ERROR!!! ");
printk("BBP(viaMCU=%d) read R%d fail\n",1,4);
uVar10 = (uint)*(byte *)(param_1 + 0x4acd);
if (*(char *)(param_1 + 0xec) == '\0') {
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) =
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) & 0xfffdffff;
}
goto LAB_0002d920;
}
cVar6 = *(char *)(param_1 + 0xad) //possible issue identified - semgrep
}
if (cVar6 == '\x01') {
Status = Status & 0xfffffffe;
if (uVar4 != 0) {
Status = Status | 1;
}
goto LAB_0002d944;
}
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
else {
LAB_0002d944:
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
uVar11 = Status;
if (cVar6 == '\0') {
uVar10 = uVar10 & 0xe7;
if (*(int *)(param_1 + 0x29f8) == 4) {
uVar4 = 0;
if (*(char *)(param_1 + 0xad) == '\x01') {
Status = Status & 0xfffffffe;
uVar4 = uVar11 & 1;
}
iVar3 = 1;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
while( true ) {
uVar11 = 0;
if (cVar6 == '\0') {
uVar11 = *(uint *)(*(int *)(param_1 + 0xdc) + 0x101c);
}
if ((uVar11 & 0x20000) == 0) break;
iVar3 = iVar3 + 1;
printk(&_LC20) //possible issue identified - semgrep
if (iVar3 == 100) goto LAB_0002da1c;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
if (cVar6 == '\0') {
*(uint *)(*(int *)(param_1 + 0xdc) + 0x101c) = uVar10 | 0xa0400;
}
*(char *)(param_1 + 0x4acd) = (char)uVar10;
if (iVar3 != 100) goto LAB_0002da3c;
LAB_0002da1c:
printk("ERROR!!! ");
printk("BBP write R%d fail\n",4);
LAB_0002da3c:
cVar6 = *(char *)(param_1 + 0xad) //possible issue identified - semgrep
}
else {
uVar4 = 0;
if (*(char *)(param_1 + 0xad) == '\x01') {
Status = Status & 0xfffffffe;
uVar4 = uVar11 & 1;
}
iVar3 = 1;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
while( true ) {
uVar11 = 0;
if (cVar6 == '\0') {
uVar11 = *(uint *)(*(int *)(param_1 + 0xdc) + 0x7028);
}
if ((uVar11 & 0x20000) == 0) break;
iVar7 = iVar3 % 0x14;
iVar3 = iVar3 + 1;
if ((iVar7 == 0) && (cVar6 == '\0')) {
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) = uVar11 & 0xfffdffff;
}
printk(&_LC20) //possible issue identified - semgrep
if (iVar3 == 100) goto LAB_0002db98;
cVar6 = *(char *)(param_1 + 0xec) //possible issue identified - semgrep
}
if (cVar6 == '\0') {
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) = uVar10 | 0xa0400;
}
iVar7 = AsicSendCommandToMcuBBP(param_1,0x80,0xff,0,0,0);
if (*(char *)(param_1 + 0x16964) == '\x01') {
RTMPusecDelay(1000);
}
if ((iVar7 == 0) && (*(char *)(param_1 + 0xec) == '\0')) {
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) = uVar10 | 0x80400;
}
*(char *)(param_1 + 0x4acd) = (char)uVar10;
if (iVar3 != 100) goto LAB_0002dbe0;
LAB_0002db98:
printk("ERROR!!! ");
printk("BBP write R%d fail\n",4);
if (*(char *)(param_1 + 0xec) == '\0') {
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) =
*(uint *)(*(int *)(param_1 + 0xdc) + 0x7028) & 0xfffdffff;
LAB_0002dbe0:
cVar6 = *(char *)(param_1 + 0xad) //possible issue identified - semgrep
}
else {
cVar6 = *(char *)(param_1 + 0xad) //possible issue identified - semgrep
}
}
if ((cVar6 == '\x01') && (Status = Status & 0xfffffffe, uVar4 != 0)) {
Status = Status | 1;
}
}
if (RTDebugLevel != 0) {
printk("SYNC - BBP R4 to 20MHz.l\n");
}
uVar2 = APAutoSelectChannel(param_1,*(undefined4 *)(param_1 + 0x16618));
*(undefined1 *)(param_1 + 0x169ec) = uVar2;
*(undefined1 *)(param_1 + 0x16614) = 0;
LAB_0002dc50:
N_ChannelCheck(param_1);
if (*(char *)(param_1 + 0x16e07) == '\x01') {
if (2 < RTDebugLevel) {
printk("Disable 20/40 BSSCoex Channel Scan(BssCoex=%d, 40MHzIntolerant=%d)\n",
*(undefined1 *)(param_1 + 0x16b30),1);
}
}
else if (*(char *)(param_1 + 0x16b30) == '\x01') {
if (2 < RTDebugLevel) {
printk("Enable 20/40 BSSCoex Channel Scan(BssCoex=%d)\n",1);
}
APOverlappingBSSScan(param_1);
}
RTMP_11N_D3_TimerInit(param_1);
APStartUp(param_1);
printk("Main bssid = %02x:%02x:%02x:%02x:%02x:%02x\n",
*(undefined1 *)(param_1 + 0x51ac),*(undefined1 *)(param_1 + 0x51ad),
*(undefined1 *)(param_1 + 0x51ae),*(undefined1 *)(param_1 + 0x51af),
*(undefined1 *)(param_1 + 0x51b0),*(undefined1 *)(param_1 + 0x51b1));
RtmpOSNetDevAddrSet(*(undefined1 *)(param_1 + 0x16964),*(undefined4 *)(param_1 + 4),
param_1 + 0x16973,0);
UAPSD_Init(param_1);
if (*(char *)(param_1 + 0xd9) == '\x01') {
SetHWAntennaDivsersity(param_1,*(undefined1 *)(param_1 + 0x76e85));
pcVar5 = *(code **)(param_1 + 0x94);
}
else {
pcVar5 = *(code **)(param_1 + 0x94);
}
if (pcVar5 != (code *)0x0) {
(*pcVar5)(param_1,2,1,0,0);
}
printk("<==== rt28xx_init, Status=%x\n",0);
return 1;
}
if (RTDebugLevel != 0) {
printk(
"Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n"
);
}
}
else {
printk("ERROR!!! ");
pcVar9 = "NICInitializeAdapter failed, Status[=0x%08x]\n";
LAB_0002d3e0:
printk(pcVar9,iVar3);
}
}
else {
printk("ERROR!!! ");
pcVar9 = "MeasureReqTabInit failed, Status[=0x%08x]\n";
LAB_0002d33c:
printk(pcVar9,iVar3);
}
MeasureReqTabExit(param_1);
TpcReqTabExit(param_1);
}
RtmpNetTaskExit(param_1);
UserCfgExit(param_1);
}
else {
printk("ERROR!!! ");
printk("MlmeInit failed, Status[=0x%08x]\n",iVar3);
}
MlmeHalt(param_1);
}
RtmpMgmtTaskExit(param_1);
}
else {
printk("ERROR!!! ");
printk("RTMPAllocTxRxMemory failed, Status[=0x%08x]\n",iVar3);
}
RTMPFreeTxRxRingMemory(param_1);
LAB_0002de5c:
AutoChBssTableDestroy(param_1);
ChannelInfoDestroy(param_1);
if (*(int *)(param_1 + 0x76b04) != 0) {
os_free_mem(param_1);
}
if (RTDebugLevel != 0) {
printk("!!! rt28xx Initialized fail !!!\n");
return 0;
}
return 0;
}