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

📄 rt_linux.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 3 页
字号:
	    	pci_free_consistent(pObj->pci_dev, pAd->TxDescRing[num].AllocSize, pAd->TxDescRing[num].AllocVa, pAd->TxDescRing[num].AllocPa);	    }	    NdisZeroMemory(&pAd->TxDescRing[num], sizeof(RTMP_DMABUF));	}	RELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket, NDIS_STATUS_SUCCESS);    NdisFreeSpinLock(&pAd->TxSwQueueLock);	NdisFreeSpinLock(&pAd->RxRingLock);	NdisFreeSpinLock(&pAd->MgmtRingLock);	NdisFreeSpinLock(&pAd->TxRingLock);		NdisFreeSpinLock(&pAd->irq_lock);	DBGPRINT(RT_DEBUG_TRACE, ("<-- RTMPFreeDMAMemory\n"));}	/* * FUNCTION: Allocate a packet buffer for DMA * ARGUMENTS: *     AdapterHandle:  AdapterHandle *     Length:  Number of bytes to allocate *     Cached:  Whether or not the memory can be cached *     VirtualAddress:  Pointer to memory is returned here *     PhysicalAddress:  Physical address corresponding to virtual address * Notes: *     Cached is ignored: always cached memory */PNDIS_PACKET RTMP_AllocateRxPacketBuffer(	IN	PRTMP_ADAPTER pAd,	IN	ULONG	Length,	IN	BOOLEAN	Cached,	OUT	PVOID	*VirtualAddress,	OUT	PNDIS_PHYSICAL_ADDRESS PhysicalAddress){	struct sk_buff *pkt;	pkt = dev_alloc_skb(Length);	if (pkt == NULL) {		DBGPRINT(RT_DEBUG_ERROR, ("can't allocate rx %ld size packet\n",Length));	}	if (pkt) {		RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);		*VirtualAddress = (PVOID) pkt->data;	//#ifdef CONFIG_5VT_ENHANCE//		*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, 1600, PCI_DMA_FROMDEVICE);//#else		*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, PCI_DMA_FROMDEVICE);//#endif	} else {		*VirtualAddress = (PVOID) NULL;		*PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL;	}		return (PNDIS_PACKET) pkt;}VOID Invalid_Remaining_Packet(	IN	PRTMP_ADAPTER pAd,	IN	 ULONG VirtualAddress){	NDIS_PHYSICAL_ADDRESS PhysicalAddress;	PhysicalAddress = PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress+1600), RX_BUFFER_NORMSIZE-1600, PCI_DMA_FROMDEVICE);}PNDIS_PACKET RTMP_AllocateFragPacketBuffer(	IN	PRTMP_ADAPTER pAd,	IN	ULONG	Length){	struct sk_buff *pkt;	pkt = dev_alloc_skb(Length);	if (pkt == NULL) {		DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));	}	if (pkt) {		RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);	}		return (PNDIS_PACKET) pkt;	}PNDIS_PACKET RTMP_AllocateTxPacketBuffer(	IN	PRTMP_ADAPTER pAd,	IN	ULONG	Length,	IN	BOOLEAN	Cached,	OUT	PVOID	*VirtualAddress){	struct sk_buff *pkt;	pkt = dev_alloc_skb(Length);	if (pkt == NULL) {		DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));	}	if (pkt) {		RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);		*VirtualAddress = (PVOID) pkt->data;		} else {		*VirtualAddress = (PVOID) NULL;	}		return (PNDIS_PACKET) pkt;	}VOID build_tx_packet(	IN	PRTMP_ADAPTER	pAd,	IN	PNDIS_PACKET	pPacket,	IN	PUCHAR	pFrame,	IN	ULONG	FrameLen){	struct sk_buff	*pTxPkt;	ASSERT(pPacket);	pTxPkt = RTPKT_TO_OSPKT(pPacket);	NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);	}VOID	RTMPFreeAdapter(	IN	PRTMP_ADAPTER	pAd){    POS_COOKIE os_cookie;		os_cookie=(POS_COOKIE)pAd->OS_Cookie;	vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);	kfree(os_cookie);}BOOLEAN OS_Need_Clone_Packet(void){	return (FALSE);	}/*	========================================================================	Routine Description:		clone an input NDIS PACKET to another one. The new internally created NDIS PACKET		must have only one NDIS BUFFER		return - byte copied. 0 means can't create NDIS PACKET		NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket			Arguments:		pAd 	Pointer to our adapter		pInsAMSDUHdr	EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.		*pSrcTotalLen			return total packet length. This lenght is calculated with 802.3 format packet.			Return Value:		NDIS_STATUS_SUCCESS 			NDIS_STATUS_FAILURE 				Note:		========================================================================*/NDIS_STATUS RTMPCloneNdisPacket(	IN	PRTMP_ADAPTER	pAd,	IN	BOOLEAN			pInsAMSDUHdr,	IN	PNDIS_PACKET	pInPacket,	OUT PNDIS_PACKET   *ppOutPacket){	struct sk_buff *pkt;	ASSERT(pInPacket);	ASSERT(ppOutPacket);	// 1. Allocate a packet 	pkt = dev_alloc_skb(2048);		if (pkt == NULL) {		return NDIS_STATUS_FAILURE;	} 	skb_put(pkt, GET_OS_PKT_LEN(pInPacket));	NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));  	*ppOutPacket = OSPKT_TO_RTPKT(pkt);	RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);	printk("###Clone###\n");	return NDIS_STATUS_SUCCESS;}// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()NDIS_STATUS RTMPAllocateNdisPacket(	IN	PRTMP_ADAPTER	pAd,	OUT PNDIS_PACKET   *ppPacket,	IN	PUCHAR			pHeader,	IN	UINT			HeaderLen,	IN	PUCHAR			pData,	IN	UINT			DataLen){	PNDIS_PACKET	pPacket;	ASSERT(pData);	ASSERT(DataLen);	// 1. Allocate a packet 	pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen);	if (pPacket == NULL) {		*ppPacket = NULL;#ifdef DEBUG		printk("RTMPAllocateNdisPacket Fail\n\n");#endif		return NDIS_STATUS_FAILURE;	}	// 2. clone the frame content	if (HeaderLen > 0)		NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);	if (DataLen > 0)		NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);	// 3. update length of packet 	skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);	RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);//	printk("%s : pPacket = %p, len = %d\n", __FUNCTION__, pPacket, GET_OS_PKT_LEN(pPacket));	*ppPacket = pPacket;	return NDIS_STATUS_SUCCESS;}/*  ========================================================================  Description:	This routine frees a miniport internally allocated NDIS_PACKET and its	corresponding NDIS_BUFFER and allocated memory.  ========================================================================*/VOID RTMPFreeNdisPacket(	IN PRTMP_ADAPTER pAd,	IN PNDIS_PACKET  pPacket){	dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));}// IRQL = DISPATCH_LEVEL// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same //			 scatter gather bufferNDIS_STATUS Sniff2BytesFromNdisBuffer(	IN	PNDIS_BUFFER	pFirstBuffer,	IN	UCHAR			DesiredOffset,	OUT PUCHAR			pByte0,	OUT PUCHAR			pByte1){    *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);    *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);	return NDIS_STATUS_SUCCESS;}void RTMP_QueryPacketInfo(	IN  PNDIS_PACKET pPacket,	OUT PACKET_INFO  *pPacketInfo,	OUT PUCHAR		 *pSrcBufVA,	OUT	UINT		 *pSrcBufLen){	pPacketInfo->BufferCount = 1;	pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);	pPacketInfo->PhysicalBufferCount = 1;	pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);	*pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);	*pSrcBufLen = GET_OS_PKT_LEN(pPacket); 	}void RTMP_QueryNextPacketInfo(	IN  PNDIS_PACKET *ppPacket,	OUT PACKET_INFO  *pPacketInfo,	OUT PUCHAR		 *pSrcBufVA,	OUT	UINT		 *pSrcBufLen){	PNDIS_PACKET pPacket = NULL;	if (*ppPacket)		pPacket = GET_OS_PKT_NEXT(*ppPacket);	if (pPacket) {		pPacketInfo->BufferCount = 1;		pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);		pPacketInfo->PhysicalBufferCount = 1;		pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);		*pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);		*pSrcBufLen = GET_OS_PKT_LEN(pPacket); 			*ppPacket = GET_OS_PKT_NEXT(pPacket);			} else {		pPacketInfo->BufferCount = 0;		pPacketInfo->pFirstBuffer = NULL;		pPacketInfo->PhysicalBufferCount = 0;		pPacketInfo->TotalPacketLength = 0;		*pSrcBufVA = NULL;		*pSrcBufLen = 0; 			*ppPacket = NULL;	}}VOID RTMP_SendComplete(    IN NDIS_HANDLE  MiniportAdapterHandle,    IN PNDIS_PACKET  Packet,    IN NDIS_STATUS  Status    ){		RTMPFreeNdisPacket((PRTMP_ADAPTER)MiniportAdapterHandle, Packet);}// not yet support MBSSPNET_DEV get_netdev_from_bssid(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			FromWhichBSSID){#ifdef CONFIG_STA_SUPPORT	return pAd->net_dev;#endif // CONFIG_STA_SUPPORT //}	PNDIS_PACKET DuplicatePacket(	IN	PRTMP_ADAPTER	pAd, 	IN	PNDIS_PACKET	pPacket,	IN	UCHAR			FromWhichBSSID){	struct sk_buff	*skb;	PNDIS_PACKET	pRetPacket = NULL;	USHORT			DataSize;	UCHAR			*pData;	DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);	pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);		skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);	if (skb)	{		skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);		pRetPacket = OSPKT_TO_RTPKT(skb);	}	return pRetPacket;}PNDIS_PACKET duplicate_pkt(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			pHeader802_3,    IN  UINT            HdrLen,	IN	PUCHAR			pData,	IN	ULONG			DataSize,	IN	UCHAR			FromWhichBSSID){	struct sk_buff	*skb;	PNDIS_PACKET	pPacket = NULL;	if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)	{		skb_reserve(skb, 2);						NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);		skb_put(skb, HdrLen);		NdisMoveMemory(skb->tail, pData, DataSize);		skb_put(skb, DataSize);

⌨️ 快捷键说明

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