VOID AndesAppendCmdMsg(struct cmd_msg *msg, char *data, unsigned int len) { PNDIS_PACKET net_pkt = msg->net_pkt; if (data) memcpy(OS_PKT_TAIL_BUF_EXTEND(net_pkt, len), data, len); }
/* Must be run in Interrupt context This function handle RT2870 specific TxDesc and cpu index update and kick the packet out. */ int RtmpUSBMgmtKickOut( IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, IN PNDIS_PACKET pPacket, IN UCHAR *pSrcBufVA, IN UINT SrcBufLen) { TXINFO_STRUC *pTxInfo; ULONG BulkOutSize; UCHAR padLen; PUCHAR pDest; ULONG SwIdx = pAd->MgmtRing.TxCpuIdx; TX_CONTEXT *pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[SwIdx].AllocVa; ULONG IrqFlags; pTxInfo = (TXINFO_STRUC *)(pSrcBufVA); /* Build our URB for USBD*/ BulkOutSize = (SrcBufLen + 3) & (~3); rlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(BulkOutSize - TXINFO_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE); BulkOutSize += 4; /* Always add 4 extra bytes at every packet.*/ //+++Add by shiang for debug if (0) { DBGPRINT(RT_DEBUG_OFF, ("-->%s():shiang-6590, QueIdx=%d, SrcBufLen=%d\n", __FUNCTION__, QueIdx, SrcBufLen)); dump_txinfo(pAd, pTxInfo); dumpTxWI(pAd, (TXWI_STRUC *)(pSrcBufVA + TXINFO_SIZE)); } //---Add by shiang for debug /* WY , it cause Tx hang on Amazon_SE , Max said the padding is useless*/ /* If BulkOutSize is multiple of BulkOutMaxPacketSize, add extra 4 bytes again.*/ /* if ((BulkOutSize % pAd->BulkOutMaxPacketSize) == 0)*/ /* BulkOutSize += 4;*/ padLen = BulkOutSize - SrcBufLen; ASSERT((padLen <= RTMP_PKT_TAIL_PADDING)); /* Now memzero all extra padding bytes.*/ pDest = (PUCHAR)(pSrcBufVA + SrcBufLen); OS_PKT_TAIL_BUF_EXTEND(pPacket, padLen); NdisZeroMemory(pDest, padLen); RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags); pAd->MgmtRing.Cell[pAd->MgmtRing.TxCpuIdx].pNdisPacket = pPacket; pMLMEContext->TransferBuffer = (PTX_BUFFER)(GET_OS_PKT_DATAPTR(pPacket)); /* Length in TxInfo should be 8 less than bulkout size.*/ pMLMEContext->BulkOutSize = BulkOutSize; pMLMEContext->InUse = TRUE; pMLMEContext->bWaitingBulkOut = TRUE; #ifdef UAPSD_SUPPORT /* If the packet is QoS Null frame, we mark the packet with its WCID; If not, we mark the packet with bc/mc WCID = 0. We will handle it in rtusb_mgmt_dma_done_tasklet(). Even AP send a QoS Null frame but not EOSP frame in USB mode, then we will call UAPSD_SP_Close() and we will check pEntry->bAPSDFlagSPStart() so do not worry about it. */ #endif /* UAPSD_SUPPORT */ /*hex_dump("RtmpUSBMgmtKickOut", &pMLMEContext->TransferBuffer->field.WirelessPacket[0], (pMLMEContext->BulkOutSize > 16 ? 16 : pMLMEContext->BulkOutSize));*/ /* pAd->RalinkCounters.KickTxCount++; pAd->RalinkCounters.OneSecTxDoneCount++; if (pAd->MgmtRing.TxSwFreeIdx == MGMT_RING_SIZE) needKickOut = TRUE; */ /* Decrease the TxSwFreeIdx and Increase the TX_CTX_IDX*/ pAd->MgmtRing.TxSwFreeIdx--; INC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE); RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags); RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); /*if (needKickOut)*/ RTUSBKickBulkOut(pAd); return 0; }