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;
}