int MiniportMMRequest(int param_1,byte param_2,byte *param_3,uint param_4)

{
  bool bVar1;
  int iVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  int iVar6;
  uint uVar7;
  undefined4 uVar8;
  int local_48;
  undefined1 auStack_44 [20];
  uint local_30;
  byte *local_2c;
  
  uVar7 = (uint)param_2;
  if (0x640 < param_4) {
    printk("<4>/home/eric/release/dir600b5/progs.priv/rt2860v2/build/rt2860v2_ap/../rt2860v2/common/cmm_data.c:%d assert Length <= MGMT_DMA_BUFFER_SIZEfailed\n"
           ,0x5e);
  }
  bVar1 = (char)param_2 < '\0';
  iVar6 = 0;
  if (bVar1) {
    uVar7 = uVar7 & 0x7f;
    local_bh_disable();
    iVar6 = 3;
  }
  local_30 = (uint)bVar1;
  local_2c = param_3 + 4;
  iVar5 = 0;
  uVar8 = 0;
  do {
    if ((*(uint *)(param_1 + 0x76904) & 0x100001c0) != 0x10000000) {
      iVar5 = 1;
      break;
    }
    if (bVar1) {
      RTMPFreeTXDUponTxDmaDone(param_1,uVar7);
      iVar2 = uVar7 * 0x80c + param_1;
      uVar4 = *(uint *)(iVar2 + 0x980);
      uVar3 = *(uint *)(iVar2 + 0x988);
      if (uVar4 < uVar3) {
        uVar3 = uVar3 - 1;
      }
      else {
        uVar3 = uVar3 + 0x3f;
      }
    }
    else {
      uVar3 = *(uint *)(param_1 + 0x3a80);
      uVar4 = *(uint *)(param_1 + 0x3a78);
      if (uVar4 < uVar3) {
        uVar3 = uVar3 - 1;
      }
      else {
        uVar3 = uVar3 + 0x7f;
      }
    }
    if (uVar3 == uVar4) {
      *(int *)(param_1 + 0x76768) = *(int *)(param_1 + 0x76768) + 1;
      if (bVar1) {
        iVar6 = iVar6 + -1;
        if (2 < RTDebugLevel) {
          printk("retryCnt %d\n",iVar6);
        }
        if ((iVar6 == 0) && (RTDebugLevel != 0)) {
          printk("Qidx(%d), not enough space in DataRing, MgmtRingFullCount=%ld!\n",uVar7,
                 *(undefined4 *)(param_1 + 0x76768));
        }
      }
      if (RTDebugLevel != 0) {
        printk("Qidx(%d), not enough space in MgmtRing, MgmtRingFullCount=%ld!\n",uVar7,
               *(undefined4 *)(param_1 + 0x76768));
      }
    }
    else {
      memset(auStack_44,0,0x10)   //possible issue identified - semgrep
      iVar5 = RTMPAllocateNdisPacket(param_1,&local_48,auStack_44,0x10,param_3,param_4);
      if (iVar5 != 0) {
        if (1 < RTDebugLevel) {
          printk("MiniportMMRequest (error:: can\'t allocate NDIS PACKET)\n");
        }
        break;
      }
      if ((*param_3 & 0xf0) == 0xc0) {
        *(undefined1 *)(local_48 + 0x2b) = 0xff;
        iVar5 = MacTableLookup(param_1,local_2c);
        if (iVar5 != 0) {
          *(char *)(local_48 + 0x24) = (char)*(undefined2 *)(iVar5 + 0x27e);
        }
      }
      else {
        *(undefined1 *)(local_48 + 0x2b) = 0;
      }
      if (bVar1) {
        iVar6 = iVar6 + -1;
        uVar8 = 1;
      }
      iVar5 = MlmeHardTransmit(param_1,uVar7,local_48,uVar8,local_30);
      if (iVar5 == 0) break;
      RTMPFreeNdisPacket(param_1,local_48);
    }
  } while (0 < iVar6);
  if (bVar1) {
    local_bh_enable();
  }
  return iVar5;
}