⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txproc.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 5 页
字号:
//  UCHAR  Buffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE];//  BOOLEAN bIsEtherPacket = TRUE;//  PUCHAR pDest = Buffer;//  PUCHAR pHeader = NULL;//   BOOLEAN      useBuffer = FALSE;//    ULONG        coBufferLength = 0;    //#ifdef IF_SDIO  SD_API_STATUS           sdstatus;          // intermediate status//    SDIO_TX_PKT          downloadPkt;//    UCHAR                   *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf;//#endif // IF_SDIO#ifdef WMM_UAPSD    if ( Adapter->bNullFrameSent )    {        return NDIS_STATUS_RESOURCES;    }#else  //++dralee_20060327  #ifdef PROPRIETARY_PERIODIC_PS    if(Adapter->TxLock == 1)  {       //RETAILMSG(1,(L"TxLock: reject sent\n\r"));       return NDIS_STATUS_RESOURCES;  }  #endif#endif // WMM_UAPSD  //// temporarily disable useBuffer optimization, it seems to cause problem // useBuffer = TRUE;    DBGPRINT(DBG_TXDATA | DBG_CRLF,("+SendSinglePacket()\n"));  //RETAILMSG(1,(TEXT("[Marvell]+SendSinglePacket()")));    //lykao, 060905, test     DBGPRINT(DBG_ALLEN,("[Marvell]SendSinglePacket Adapter->psState=%d\n",Adapter->psState));  if((Adapter->psState != PS_STATE_FULL_POWER) &&      (Adapter->psState != PS_STATE_WAKEUP))  {      DBGPRINT(DBG_TXDATA ,("Tx can not send in the power state \n"));      DBGPRINT(DBG_ALLEN ,("Tx can not send in the power state \n"));    //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Tx can not send in the power state")));      //070705      //Adapter->SendPSFlag=TRUE;    return NDIS_STATUS_RESOURCES;    //return NDIS_STATUS_FAILURE;  }/*  //BugFix  //if (sd_UseAndLockSDDownloadPath(Adapter) == FALSE)  //{  //    return NDIS_STATUS_RESOURCES;  //}     Status = NDIS_STATUS_SUCCESS;   pTxNode=&Adapter->TxNode;      //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryPacket")));  NdisQueryPacket(    Packet,    NULL,    &BufferCount,    &pBuffer,    &TotalPacketLength);  //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryPacket")));  if(!pBuffer || !BufferCount || !TotalPacketLength)  {    DBGPRINT(DBG_TXDATA|DBG_WARNING,("TX - NDIS buffer is not valid, return FAILURE \n"));               Status=NDIS_STATUS_FAILURE;         //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX - NDIS buffer is not valid, return FAILURE ")));         goto end;  }  //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryBuffer")));  NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length);  //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryBuffer")));  pHeader = (PUCHAR)pVirtualAddr;#ifndef MRVL_CHECK_TXPACKET#ifdef WPA    // check if in key absent state, if so, block all packet other than    // 802.1x    if ( Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent )      {        // no key yet, only allow 802.1x packets        if ( TotalPacketLength < 14 )         {            // malformed packet, blocked!            DBGPRINT(DBG_TXDATA|DBG_WARNING,("Got packet with size less than 14 bytes, reject!\n"));             Status =  NDIS_STATUS_FAILURE;       //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Got packet with size less than 14 bytes, reject! ")));                 goto end;        }        if ( (pHeader[12] != 0x88) || (pHeader[13] != 0x8E) )        {            DBGPRINT(DBG_TXDATA|DBG_WARNING,("Still no key and packet type(0x%x 0x%x)is not 802.1x , drop!\n",                                  pHeader[12],                                  pHeader[13]));      //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Still no key and packet typeis not 802.1x  drop! ")));                                  Status = NDIS_STATUS_FAILURE;       goto end;        }    }  #endif // #ifdef WPA#endif //#ifdef MRVL_CHECK_TXPACKET    DBGPRINT(DBG_TXDATA,("SendSinglePacket: buffers %d, packet len %d\n",BufferCount, TotalPacketLength));  pTxNode->NPTxPacket = Packet;  NdisZeroMemory(pTxNode->LocalWCB, sizeof(WCB));  pTxNode->LocalWCB->Status = MRVDRV_WCB_STATUS_USED;  pTxNode->LocalWCB->PktLen = (USHORT)TotalPacketLength;    DBGPRINT(DBG_DATARATE,("DataRate = %x\n", (ULONG)Adapter -> DataRate));#ifdef INTERFACE20    // number of retry is 3      //Ling++, 012706, Tx DataRate, Fix: Tx FixRate issue       //pTxNode->LocalWCB->TxControl = ( (3 << 12 ) | Adapter->DataRate);    pTxNode->LocalWCB->TxControl =0;    //Ling--, 012706    pTxNode->LocalWCB->PktPtr = sizeof(WCB);#endif // #ifdef INTERFACE20    */#ifdef WMM    if ( Adapter->WmmDesc.enabled )    {    #ifdef WMM_USE_NDIS_EXT        pDnldPacket->Buf.TxDataBuf.Wcb.Priority = wmm_get_pkt_priority( Packet );    #else        pDnldPacket->Buf.TxDataBuf.Wcb.Priority = wmm_get_tos( Packet );    #endif // WMM_USE_NDIS_EXT    pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt = 0;        #ifdef WMM_UAPSD        if( Adapter->WmmDesc.WmmUapsdEnabled && CheckLastPacketIndication(Adapter) )        {            pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET;        }    #endif // WMM_UAPSD    }#endif // WMM#ifdef PROPRIETARY_PERIODIC_PS      //dralee_20060327    //set last packet indication when PPS is enabled and system in PS mode.    if(Adapter->psState != PS_STATE_FULL_POWER)    {                                                                           if( CheckLastPacketIndication(Adapter) )       {           pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET;           Adapter->TxLock = 1;       }        else              pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt &= ~MRVDRV_WCB_POWER_MGMT_LAST_PACKET;                }#endif /*    //      First buffer contains the MAC header    //      Call NdisMoveMemory() to copy DEST MAC adress to WCB    //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisMoveMemory")));    NdisMoveMemory(      (PVOID)pTxNode->LocalWCB->DestMACAdrHi,      pVirtualAddr,       MRVDRV_ETH_ADDR_LEN);   //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisMoveMemory")));  // Start the packet.    TotalBufferLength = TotalPacketLength;    TotalBufferLength += sizeof(WCB);*//* dralee_20060403  // check for 802.3 vs. ethernet encapsulation  if( pHeader[12] > 0x05 )  {     bIsEtherPacket = TRUE;  }  else  {    bIsEtherPacket = FALSE;     } */ /* #ifdef UNDER_CE  useBuffer = TRUE;#endif*/       /* dralee_20060403    if ( bIsEtherPacket == FALSE )    {      // if 802.3 packet, then omit the length field      TotalBufferLength -= 2;    }*/ /*       // TotalBufferLength contains the size of the packet    //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: before ADD_SDIO_PKT_HDR_LENGTH")));    downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(TotalBufferLength);     // RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: after ADD_SDIO_PKT_HDR_LENGTH")));        DBGPRINT(DBG_TXDATA,("TX %d bytes: packet size %d\n",(ULONG)TotalBufferLength, (ULONG)TotalPacketLength));          if ( bIsEtherPacket == FALSE )    {      // in the case of 802.3 packet, the length field omitted when sent      // to FW      pTxNode->LocalWCB->PktLen = (USHORT)TotalPacketLength - 2;    }      // Transmit the MAC header to the device.        // NOTE:  WCB has to be EVEN in size!!!       // RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **1NdisMoveMemory")));     NdisMoveMemory(pCurPtr, (PUCHAR)pTxNode->LocalWCB, sizeof(WCB));     pCurPtr += sizeof(WCB);     //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **2NdisMoveMemory")));          //HexDump(DBG_TXDATADUMP,"TX Buffer:", (PUCHAR )pTxNode->LocalWCB, sizeof(WCB));       DBGPRINT(DBG_T3  | DBG_CRLF ,("TX PACKET:\n"));  //      Query each buffer for the packet and move data to SQ  AccumLength = sizeof(WCB);  for(i=0; i<BufferCount; i++)  {     NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length);    AccumLength += Length;    if( AccumLength > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE )        // PJG: accum length already counts the header... need to compare to entire buffer size      break;               // ***** Fix for odd sized buffer *****        // Because the CF controller needs 16 bit write, it will not handle        // odd sized buffers        if( pVirtualAddr )    {            if ((bIsEtherPacket == FALSE) || (useBuffer) || ( (Length % 2) != 0 ) )            {                // one of the previous buffer is odd, use coalescing buffer                          NdisMoveMemory((PVOID)pDest, pVirtualAddr, Length);            pDest = (PUCHAR)((ULONG)pDest + Length);                coBufferLength += Length;                useBuffer = TRUE;                //DBGPRINT(DBG_TXDATA,("buffer packet"));                            }            else            {                DBGPRINT(DBG_TXDATA,("not buffer packet"));          //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **not buffer packet")));                NdisMoveMemory(pCurPtr, (PUCHAR)pVirtualAddr, (USHORT)Length);        pCurPtr += Length;            }      }//if( pVirtualAddr )                  NdisGetNextBuffer(pBuffer, &pNextBuffer);    if( !pNextBuffer )      break;    pBuffer = pNextBuffer;  }//for(i=0; i<BufferCount; i++)    //DBGPRINT(DBG_TXDATADUMP | DBG_RAW,("\n"));  //102605    DBGPRINT(DBG_TXDATADUMP,("\n"));   HexDump(DBG_TXDATADUMP,"[Marvell]TX Buffer:", Buffer, 64);   DBGPRINT(DBG_TXDATADUMP,("\n"));          //RETAILMSG(1,(TEXT("[Marvell]++SendSinglePacket:  ")));      // Check with Sean why he is doing this. And take appropriate action. For now send the complete     // data as is.        if ( bIsEtherPacket == FALSE )    {     // 802.3 packet, already contains LLC    // send DA MAC, SA MAC to FW      NdisMoveMemory(pCurPtr, (PUCHAR)Buffer, (USHORT)MRVDRV_ETH_ADDR_LEN * 2);      pCurPtr += (USHORT)(MRVDRV_ETH_ADDR_LEN * 2);      NdisMoveMemory(pCurPtr, (PUCHAR)(Buffer+MRVDRV_ETH_HEADER_SIZE), (USHORT)TotalPacketLength - MRVDRV_ETH_HEADER_SIZE);      pCurPtr += (USHORT)(TotalPacketLength - MRVDRV_ETH_HEADER_SIZE);  }  else  {        if ( useBuffer )         {            NdisMoveMemory(pCurPtr, (PUCHAR)Buffer, (USHORT)coBufferLength);            pCurPtr +=(USHORT)coBufferLength;        }  }    DBGPRINT(DBG_ALLEN,("[Marvell]TX SendSinglePacket!\n"));  */    //remember the current packet being sent    Adapter->SentPacket = Packet;     Adapter->TxPktTimerIsSet=TRUE;    NdisMSetTimer(&Adapter->MrvDrvTxPktTimer,                    MRVDRV_DEFAULT_TX_PKT_TIME_OUT);    //RETAILMSG(1,(L"SendSinglePacket: SentPacket %x \n", (ULONG)Packet)); //  downloadPkt.Type = IF_DATA_PKT;           sdstatus = If_DownloadPkt(Adapter, pDnldPacket);     //lykao, 052605   //Adapter->ulTxByteInLastPeriod += downloadPkt.Len;   Adapter->ulTxByteInLastPeriod += pDnldPacket->Len;   if (!SD_API_SUCCESS(sdstatus))   {                        BOOLEAN  timerStatus;         DBGPRINT(DBG_ALLEN,("[Marvell]TX download failed!\n"));        RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! ")));          //dralee 09202005        Adapter->SentPacket = NULL;            Adapter->TxPktTimerIsSet=FALSE;        NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);                    return NDIS_STATUS_FAILURE;    }   else   {        DBGPRINT(DBG_LOAD,("TX download success!\n"));        DBGPRINT(DBG_ALLEN,("[Marvell]TX download success!\n"));        //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download success!")));     }    DBGSTROBE_LINE_ON(DBLINE2);    // remember the current packet being sent    //Adapter->TxRetryCount = 0;   //dralee 09172005, unused flag    // Start Tx timer    //NdisMSetTimer(&Adapter->MrvDrvTxPktTimer,     //               MRVDRV_DEFAULT_TX_PKT_TIME_OUT);    //Adapter->TxPktTimerIsSet=TRUE;    // Update sequence number    Adapter->SeqNum++;      //DBGPRINT(DBG_T3,("DONE TX PACKET:\n"));    //DBGPRINT(DBG_TXDATA,("-SendSinglePacket()\n"));    //end:   //RETAILMSG(1,(TEXT("[Marvell]-SendSinglePacket()")));  //BugFix, dralee mask off  //  sd_ReleaseSDDownloadPath(Adapter);  return Status;} #elseNDIS_STATUSSendSinglePacket(  IN PMRVDRV_ADAPTER Adapter,  IN PNDIS_PACKET Packet){    //int ii;    ULONG bigTimeout = 250000;      // about 500ms drop dead timeout timing on BUS IO.  NDIS_STATUS  Status = NDIS_STATUS_SUCCESS;  UINT BufferCount;  UINT TotalPacketLength=0;  UINT TotalBufferLength=0;  UINT BytesCopied=0;  UINT Length, AccumLength;  PNDIS_BUFFER pBuffer, pNextBuffer;  ULONG i;   PVOID pVirtualAddr;  PTxCtrlNode pTxNode;      // due to fix for odd sized buffers, WepBuffer is used in both    // WEP and no-WEP scenarios  //UCHAR WepBuffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE];  //BOOLEAN doWep = FALSE;   //BOOLEAN NotEncryption4EAPOL = FALSE;  UCHAR  Buffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE];  BOOLEAN bIsEtherPacket = TRUE;  PUCHAR pDest = Buffer;  PUCHAR pHeader = NULL;    BOOLEAN      useBuffer = FALSE;    ULONG        coBufferLength = 0;    //#ifdef IF_SDIO  SD_API_STATUS           sdstatus;          // intermediate status    SDIO_TX_PKT             downloadPkt;    UCHAR                   *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf;//#endif // IF_SDIO#ifdef WMM_UAPSD    if ( Adapter->bNullFrameSent )    {        return NDIS_STATUS_RESOURCES;    }#else  //++dralee_20060327    #ifdef PROPRIETARY_PERIODIC_PS    if(Adapter->TxLock == 1)  {       //RETAILMSG(1,(L"TxLock: reject sent\n\r"));       return NDIS_STATUS_RESOURCES;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -