aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rt2860/rt_linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rt2860/rt_linux.c')
-rw-r--r--drivers/staging/rt2860/rt_linux.c1371
1 files changed, 869 insertions, 502 deletions
diff --git a/drivers/staging/rt2860/rt_linux.c b/drivers/staging/rt2860/rt_linux.c
index ed27b8545a1b..9357fb26cc2a 100644
--- a/drivers/staging/rt2860/rt_linux.c
+++ b/drivers/staging/rt2860/rt_linux.c
@@ -28,149 +28,114 @@
#include <linux/sched.h>
#include "rt_config.h"
-ULONG RTDebugLevel = RT_DEBUG_ERROR;
-
-BUILD_TIMER_FUNCTION(MlmePeriodicExec);
-BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);
-BUILD_TIMER_FUNCTION(APSDPeriodicExec);
-BUILD_TIMER_FUNCTION(AsicRfTuningExec);
-#ifdef RT2870
-BUILD_TIMER_FUNCTION(BeaconUpdateExec);
-#endif // RT2870 //
-
-BUILD_TIMER_FUNCTION(BeaconTimeout);
-BUILD_TIMER_FUNCTION(ScanTimeout);
-BUILD_TIMER_FUNCTION(AuthTimeout);
-BUILD_TIMER_FUNCTION(AssocTimeout);
-BUILD_TIMER_FUNCTION(ReassocTimeout);
-BUILD_TIMER_FUNCTION(DisassocTimeout);
-BUILD_TIMER_FUNCTION(LinkDownExec);
-BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
-BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
-#ifdef RT2860
-BUILD_TIMER_FUNCTION(PsPollWakeExec);
-BUILD_TIMER_FUNCTION(RadioOnExec);
-#endif
+unsigned long RTDebugLevel = RT_DEBUG_ERROR;
-// for wireless system event message
+/* for wireless system event message */
char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
- // system status event
- "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
- "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
- "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
- "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
- "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
- "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
- "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
- "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
- "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
- "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
- "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
- "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
- "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
- "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
- "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
- "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
- "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
- "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
- "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
- };
-
-// for wireless IDS_spoof_attack event message
+ /* system status event */
+ "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
+ "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
+ "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
+ "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
+ "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
+ "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
+ "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
+ "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
+ "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
+ "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
+ "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
+ "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
+ "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
+ "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
+ "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
+ "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
+ "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
+ "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
+ "scan terminate! Busy! Enqueue fail!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
+};
+
+/* for wireless IDS_spoof_attack event message */
char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
- "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
- "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
- "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
- "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
- "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
- "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
- "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
- "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
- "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
- "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
- };
-
-// for wireless IDS_flooding_attack event message
+ "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
+ "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
+ "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
+ "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
+ "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
+ "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
+ "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
+ "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
+ "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
+ "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
+};
+
+/* for wireless IDS_flooding_attack event message */
char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
- "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
- "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
- "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
- "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
- "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
- "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
- "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
- };
+ "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
+ "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
+ "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
+ "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
+ "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
+ "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
+ "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
+};
/* timeout -- ms */
-VOID RTMP_SetPeriodicTimer(
- IN NDIS_MINIPORT_TIMER *pTimer,
- IN unsigned long timeout)
+void RTMP_SetPeriodicTimer(struct timer_list * pTimer,
+ IN unsigned long timeout)
{
- timeout = ((timeout*HZ) / 1000);
+ timeout = ((timeout * OS_HZ) / 1000);
pTimer->expires = jiffies + timeout;
add_timer(pTimer);
}
/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
-VOID RTMP_OS_Init_Timer(
- IN PRTMP_ADAPTER pAd,
- IN NDIS_MINIPORT_TIMER *pTimer,
- IN TIMER_FUNCTION function,
- IN PVOID data)
+void RTMP_OS_Init_Timer(struct rt_rtmp_adapter *pAd,
+ struct timer_list * pTimer,
+ IN TIMER_FUNCTION function, void *data)
{
init_timer(pTimer);
- pTimer->data = (unsigned long)data;
- pTimer->function = function;
+ pTimer->data = (unsigned long)data;
+ pTimer->function = function;
}
-
-VOID RTMP_OS_Add_Timer(
- IN NDIS_MINIPORT_TIMER *pTimer,
- IN unsigned long timeout)
+void RTMP_OS_Add_Timer(struct timer_list * pTimer,
+ IN unsigned long timeout)
{
if (timer_pending(pTimer))
return;
- timeout = ((timeout*HZ) / 1000);
+ timeout = ((timeout * OS_HZ) / 1000);
pTimer->expires = jiffies + timeout;
add_timer(pTimer);
}
-VOID RTMP_OS_Mod_Timer(
- IN NDIS_MINIPORT_TIMER *pTimer,
- IN unsigned long timeout)
+void RTMP_OS_Mod_Timer(struct timer_list * pTimer,
+ IN unsigned long timeout)
{
- timeout = ((timeout*HZ) / 1000);
+ timeout = ((timeout * OS_HZ) / 1000);
mod_timer(pTimer, jiffies + timeout);
}
-VOID RTMP_OS_Del_Timer(
- IN NDIS_MINIPORT_TIMER *pTimer,
- OUT BOOLEAN *pCancelled)
+void RTMP_OS_Del_Timer(struct timer_list * pTimer,
+ OUT BOOLEAN * pCancelled)
{
- if (timer_pending(pTimer))
- {
+ if (timer_pending(pTimer)) {
*pCancelled = del_timer_sync(pTimer);
- }
- else
- {
+ } else {
*pCancelled = TRUE;
}
}
-VOID RTMP_OS_Release_Packet(
- IN PRTMP_ADAPTER pAd,
- IN PQUEUE_ENTRY pEntry)
+void RTMP_OS_Release_Packet(struct rt_rtmp_adapter *pAd, struct rt_queue_entry *pEntry)
{
- //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
+ /*RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry); */
}
-// Unify all delay routine by using udelay
-VOID RTMPusecDelay(
- IN ULONG usec)
+/* Unify all delay routine by using udelay */
+void RTMPusecDelay(unsigned long usec)
{
- ULONG i;
+ unsigned long i;
for (i = 0; i < (usec / 50); i++)
udelay(50);
@@ -179,28 +144,23 @@ VOID RTMPusecDelay(
udelay(usec % 50);
}
-void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
+void RTMP_GetCurrentSystemTime(LARGE_INTEGER * time)
{
time->u.LowPart = jiffies;
}
-// pAd MUST allow to be NULL
-NDIS_STATUS os_alloc_mem(
- IN PRTMP_ADAPTER pAd,
- OUT PUCHAR *mem,
- IN ULONG size)
+/* pAd MUST allow to be NULL */
+int os_alloc_mem(struct rt_rtmp_adapter *pAd, u8 ** mem, unsigned long size)
{
- *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
+ *mem = (u8 *)kmalloc(size, GFP_ATOMIC);
if (*mem)
return (NDIS_STATUS_SUCCESS);
else
return (NDIS_STATUS_FAILURE);
}
-// pAd MUST allow to be NULL
-NDIS_STATUS os_free_mem(
- IN PRTMP_ADAPTER pAd,
- IN PUCHAR mem)
+/* pAd MUST allow to be NULL */
+int os_free_mem(struct rt_rtmp_adapter *pAd, void *mem)
{
ASSERT(mem);
@@ -208,66 +168,64 @@ NDIS_STATUS os_free_mem(
return (NDIS_STATUS_SUCCESS);
}
+void *RtmpOSNetPktAlloc(struct rt_rtmp_adapter *pAd, IN int size)
+{
+ struct sk_buff *skb;
+ /* Add 2 more bytes for ip header alignment */
+ skb = dev_alloc_skb(size + 2);
+
+ return ((void *)skb);
+}
-PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
- IN PRTMP_ADAPTER pAd,
- IN ULONG Length)
+void *RTMP_AllocateFragPacketBuffer(struct rt_rtmp_adapter *pAd,
+ unsigned long 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 == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("can't allocate frag rx %ld size packet\n", Length));
}
- if (pkt)
- {
+ if (pkt) {
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
}
- return (PNDIS_PACKET) pkt;
+ return (void *)pkt;
}
-
-PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
- IN PRTMP_ADAPTER pAd,
- IN ULONG Length,
- IN BOOLEAN Cached,
- OUT PVOID *VirtualAddress)
+void *RTMP_AllocateTxPacketBuffer(struct rt_rtmp_adapter *pAd,
+ unsigned long Length,
+ IN BOOLEAN Cached,
+ void ** 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 == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("can't allocate tx %ld size packet\n", Length));
}
- if (pkt)
- {
+ if (pkt) {
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
- *VirtualAddress = (PVOID) pkt->data;
- }
- else
- {
- *VirtualAddress = (PVOID) NULL;
+ *VirtualAddress = (void *)pkt->data;
+ } else {
+ *VirtualAddress = (void *)NULL;
}
- return (PNDIS_PACKET) pkt;
+ return (void *)pkt;
}
-
-VOID build_tx_packet(
- IN PRTMP_ADAPTER pAd,
- IN PNDIS_PACKET pPacket,
- IN PUCHAR pFrame,
- IN ULONG FrameLen)
+void build_tx_packet(struct rt_rtmp_adapter *pAd,
+ void *pPacket,
+ u8 *pFrame, unsigned long FrameLen)
{
- struct sk_buff *pTxPkt;
+ struct sk_buff *pTxPkt;
ASSERT(pPacket);
pTxPkt = RTPKT_TO_OSPKT(pPacket);
@@ -275,32 +233,36 @@ VOID build_tx_packet(
NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
}
-VOID RTMPFreeAdapter(
- IN PRTMP_ADAPTER pAd)
+void RTMPFreeAdapter(struct rt_rtmp_adapter *pAd)
{
- POS_COOKIE os_cookie;
+ struct os_cookie *os_cookie;
int index;
- os_cookie=(POS_COOKIE)pAd->OS_Cookie;
-
- kfree(pAd->BeaconBuf);
+ os_cookie = (struct os_cookie *)pAd->OS_Cookie;
+ if (pAd->BeaconBuf)
+ kfree(pAd->BeaconBuf);
NdisFreeSpinLock(&pAd->MgmtRingLock);
-#ifdef RT2860
+
+#ifdef RTMP_MAC_PCI
NdisFreeSpinLock(&pAd->RxRingLock);
-#endif
- for (index =0 ; index < NUM_OF_TX_RING; index++)
- {
- NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
+#ifdef RT3090
+ NdisFreeSpinLock(&pAd->McuCmdLock);
+#endif /* RT3090 // */
+#endif /* RTMP_MAC_PCI // */
+
+ for (index = 0; index < NUM_OF_TX_RING; index++) {
+ NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
NdisFreeSpinLock(&pAd->DeQueueLock[index]);
pAd->DeQueueRunning[index] = FALSE;
}
NdisFreeSpinLock(&pAd->irq_lock);
- vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
- kfree(os_cookie);
+ vfree(pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(struct rt_rtmp_adapter),pAd,os_cookie->pAd_pa); */
+ if (os_cookie)
+ kfree(os_cookie);
}
BOOLEAN OS_Need_Clone_Packet(void)
@@ -308,8 +270,6 @@ BOOLEAN OS_Need_Clone_Packet(void)
return (FALSE);
}
-
-
/*
========================================================================
@@ -317,7 +277,7 @@ BOOLEAN OS_Need_Clone_Packet(void)
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
+ NOTE: internally created char should be destroyed by RTMPFreeNdisPacket
Arguments:
pAd Pointer to our adapter
@@ -332,11 +292,10 @@ BOOLEAN OS_Need_Clone_Packet(void)
========================================================================
*/
-NDIS_STATUS RTMPCloneNdisPacket(
- IN PRTMP_ADAPTER pAd,
- IN BOOLEAN pInsAMSDUHdr,
- IN PNDIS_PACKET pInPacket,
- OUT PNDIS_PACKET *ppOutPacket)
+int RTMPCloneNdisPacket(struct rt_rtmp_adapter *pAd,
+ IN BOOLEAN pInsAMSDUHdr,
+ void *pInPacket,
+ void ** ppOutPacket)
{
struct sk_buff *pkt;
@@ -344,19 +303,18 @@ NDIS_STATUS RTMPCloneNdisPacket(
ASSERT(pInPacket);
ASSERT(ppOutPacket);
- // 1. Allocate a packet
+ /* 1. Allocate a packet */
pkt = dev_alloc_skb(2048);
- if (pkt == NULL)
- {
+ 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));
+ 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");
@@ -364,42 +322,40 @@ NDIS_STATUS RTMPCloneNdisPacket(
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)
+/* the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket() */
+int RTMPAllocateNdisPacket(struct rt_rtmp_adapter *pAd,
+ void ** ppPacket,
+ u8 *pHeader,
+ u32 HeaderLen,
+ u8 *pData, u32 DataLen)
{
- PNDIS_PACKET pPacket;
+ void *pPacket;
ASSERT(pData);
ASSERT(DataLen);
- // 1. Allocate a packet
- pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
- if (pPacket == NULL)
- {
+ /* 1. Allocate a packet */
+ pPacket =
+ (void **) dev_alloc_skb(HeaderLen + DataLen +
+ RTMP_PKT_TAIL_PADDING);
+ if (pPacket == NULL) {
*ppPacket = NULL;
#ifdef DEBUG
- printk("RTMPAllocateNdisPacket Fail\n\n");
+ printk("RTMPAllocateNdisPacket Fail\n");
#endif
return NDIS_STATUS_FAILURE;
}
-
- // 2. clone the frame content
+ /* 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);
+ NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData,
+ DataLen);
- // 3. update length of packet
- skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+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", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
+/* printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket)); */
*ppPacket = pPacket;
return NDIS_STATUS_SUCCESS;
}
@@ -407,42 +363,34 @@ NDIS_STATUS RTMPAllocateNdisPacket(
/*
========================================================================
Description:
- This routine frees a miniport internally allocated NDIS_PACKET and its
+ This routine frees a miniport internally allocated char and its
corresponding NDIS_BUFFER and allocated memory.
========================================================================
*/
-VOID RTMPFreeNdisPacket(
- IN PRTMP_ADAPTER pAd,
- IN PNDIS_PACKET pPacket)
+void RTMPFreeNdisPacket(struct rt_rtmp_adapter *pAd, void *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 buffer
-NDIS_STATUS Sniff2BytesFromNdisBuffer(
- IN PNDIS_BUFFER pFirstBuffer,
- IN UCHAR DesiredOffset,
- OUT PUCHAR pByte0,
- OUT PUCHAR pByte1)
+/* IRQL = DISPATCH_LEVEL */
+/* NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same */
+/* scatter gather buffer */
+int Sniff2BytesFromNdisBuffer(char *pFirstBuffer,
+ u8 DesiredOffset,
+ u8 *pByte0, u8 *pByte1)
{
- *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);
- *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);
+ *pByte0 = *(u8 *)(pFirstBuffer + DesiredOffset);
+ *pByte1 = *(u8 *)(pFirstBuffer + DesiredOffset + 1);
return NDIS_STATUS_SUCCESS;
}
-
-void RTMP_QueryPacketInfo(
- IN PNDIS_PACKET pPacket,
- OUT PACKET_INFO *pPacketInfo,
- OUT PUCHAR *pSrcBufVA,
- OUT UINT *pSrcBufLen)
+void RTMP_QueryPacketInfo(void *pPacket,
+ struct rt_packet_info *pPacketInfo,
+ u8 ** pSrcBufVA, u32 * pSrcBufLen)
{
pPacketInfo->BufferCount = 1;
- pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
+ pPacketInfo->pFirstBuffer = (char *)GET_OS_PKT_DATAPTR(pPacket);
pPacketInfo->PhysicalBufferCount = 1;
pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
@@ -450,30 +398,26 @@ void RTMP_QueryPacketInfo(
*pSrcBufLen = GET_OS_PKT_LEN(pPacket);
}
-void RTMP_QueryNextPacketInfo(
- IN PNDIS_PACKET *ppPacket,
- OUT PACKET_INFO *pPacketInfo,
- OUT PUCHAR *pSrcBufVA,
- OUT UINT *pSrcBufLen)
+void RTMP_QueryNextPacketInfo(void ** ppPacket,
+ struct rt_packet_info *pPacketInfo,
+ u8 ** pSrcBufVA, u32 * pSrcBufLen)
{
- PNDIS_PACKET pPacket = NULL;
+ void *pPacket = NULL;
if (*ppPacket)
pPacket = GET_OS_PKT_NEXT(*ppPacket);
- if (pPacket)
- {
+ if (pPacket) {
pPacketInfo->BufferCount = 1;
- pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
+ pPacketInfo->pFirstBuffer =
+ (char *)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
- {
+ } else {
pPacketInfo->BufferCount = 0;
pPacketInfo->pFirstBuffer = NULL;
pPacketInfo->PhysicalBufferCount = 0;
@@ -485,36 +429,19 @@ void RTMP_QueryNextPacketInfo(
}
}
-// not yet support MBSS
-PNET_DEV get_netdev_from_bssid(
- IN PRTMP_ADAPTER pAd,
- IN UCHAR FromWhichBSSID)
-{
- PNET_DEV dev_p = NULL;
-
- dev_p = pAd->net_dev;
-
- ASSERT(dev_p);
- return dev_p; /* return one of MBSS */
-}
-
-PNDIS_PACKET DuplicatePacket(
- IN PRTMP_ADAPTER pAd,
- IN PNDIS_PACKET pPacket,
- IN UCHAR FromWhichBSSID)
+void *DuplicatePacket(struct rt_rtmp_adapter *pAd,
+ void *pPacket, u8 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);
+ struct sk_buff *skb;
+ void *pRetPacket = NULL;
+ u16 DataSize;
+ u8 *pData;
+ DataSize = (u16)GET_OS_PKT_LEN(pPacket);
+ pData = (u8 *)GET_OS_PKT_DATAPTR(pPacket);
skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
- if (skb)
- {
+ if (skb) {
skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
pRetPacket = OSPKT_TO_RTPKT(skb);
}
@@ -523,24 +450,21 @@ PNDIS_PACKET DuplicatePacket(
}
-PNDIS_PACKET duplicate_pkt(
- IN PRTMP_ADAPTER pAd,
- IN PUCHAR pHeader802_3,
- IN UINT HdrLen,
- IN PUCHAR pData,
- IN ULONG DataSize,
- IN UCHAR FromWhichBSSID)
+void *duplicate_pkt(struct rt_rtmp_adapter *pAd,
+ u8 *pHeader802_3,
+ u32 HdrLen,
+ u8 *pData,
+ unsigned long DataSize, u8 FromWhichBSSID)
{
- struct sk_buff *skb;
- PNDIS_PACKET pPacket = NULL;
-
+ struct sk_buff *skb;
+ void *pPacket = NULL;
- if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
- {
+ if ((skb =
+ __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) {
skb_reserve(skb, 2);
- NdisMoveMemory(skb_tail_pointer(skb), pHeader802_3, HdrLen);
+ NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
skb_put(skb, HdrLen);
- NdisMoveMemory(skb_tail_pointer(skb), pData, DataSize);
+ NdisMoveMemory(skb->tail, pData, DataSize);
skb_put(skb, DataSize);
skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
pPacket = OSPKT_TO_RTPKT(skb);
@@ -549,24 +473,22 @@ PNDIS_PACKET duplicate_pkt(
return pPacket;
}
-
#define TKIP_TX_MIC_SIZE 8
-PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
- IN PRTMP_ADAPTER pAd,
- IN PNDIS_PACKET pPacket)
+void *duplicate_pkt_with_TKIP_MIC(struct rt_rtmp_adapter *pAd,
+ void *pPacket)
{
- struct sk_buff *skb, *newskb;
-
+ struct sk_buff *skb, *newskb;
skb = RTPKT_TO_OSPKT(pPacket);
- if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)
- {
- // alloc a new skb and copy the packet
- newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
+ if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) {
+ /* alloc a new skb and copy the packet */
+ newskb =
+ skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE,
+ GFP_ATOMIC);
dev_kfree_skb_any(skb);
- if (newskb == NULL)
- {
- DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
+ if (newskb == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
return NULL;
}
skb = newskb;
@@ -575,45 +497,37 @@ PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
return OSPKT_TO_RTPKT(skb);
}
-
-
-
-PNDIS_PACKET ClonePacket(
- IN PRTMP_ADAPTER pAd,
- IN PNDIS_PACKET pPacket,
- IN PUCHAR pData,
- IN ULONG DataSize)
+void *ClonePacket(struct rt_rtmp_adapter *pAd,
+ void *pPacket,
+ u8 *pData, unsigned long DataSize)
{
- struct sk_buff *pRxPkt;
- struct sk_buff *pClonedPkt;
+ struct sk_buff *pRxPkt;
+ struct sk_buff *pClonedPkt;
ASSERT(pPacket);
pRxPkt = RTPKT_TO_OSPKT(pPacket);
- // clone the packet
+ /* clone the packet */
pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
- if (pClonedPkt)
- {
- // set the correct dataptr and data len
- pClonedPkt->dev = pRxPkt->dev;
- pClonedPkt->data = pData;
- pClonedPkt->len = DataSize;
- pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
+ if (pClonedPkt) {
+ /* set the correct dataptr and data len */
+ pClonedPkt->dev = pRxPkt->dev;
+ pClonedPkt->data = pData;
+ pClonedPkt->len = DataSize;
+ pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
ASSERT(DataSize < 1530);
}
return pClonedPkt;
}
-//
-// change OS packet DataPtr and DataLen
-//
-void update_os_packet_info(
- IN PRTMP_ADAPTER pAd,
- IN RX_BLK *pRxBlk,
- IN UCHAR FromWhichBSSID)
+/* */
+/* change OS packet DataPtr and DataLen */
+/* */
+void update_os_packet_info(struct rt_rtmp_adapter *pAd,
+ struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
{
- struct sk_buff *pOSPkt;
+ struct sk_buff *pOSPkt;
ASSERT(pRxBlk->pRxPacket);
pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
@@ -624,14 +538,12 @@ void update_os_packet_info(
pOSPkt->tail = pOSPkt->data + pOSPkt->len;
}
-
-void wlan_802_11_to_802_3_packet(
- IN PRTMP_ADAPTER pAd,
- IN RX_BLK *pRxBlk,
- IN PUCHAR pHeader802_3,
- IN UCHAR FromWhichBSSID)
+void wlan_802_11_to_802_3_packet(struct rt_rtmp_adapter *pAd,
+ struct rt_rx_blk *pRxBlk,
+ u8 *pHeader802_3,
+ u8 FromWhichBSSID)
{
- struct sk_buff *pOSPkt;
+ struct sk_buff *pOSPkt;
ASSERT(pRxBlk->pRxPacket);
ASSERT(pHeader802_3);
@@ -643,37 +555,35 @@ void wlan_802_11_to_802_3_packet(
pOSPkt->len = pRxBlk->DataSize;
pOSPkt->tail = pOSPkt->data + pOSPkt->len;
- //
- // copy 802.3 header
- //
- //
+ /* */
+ /* copy 802.3 header */
+ /* */
+ /* */
- NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
+ NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3,
+ LENGTH_802_3);
}
-void announce_802_3_packet(
- IN PRTMP_ADAPTER pAd,
- IN PNDIS_PACKET pPacket)
+void announce_802_3_packet(struct rt_rtmp_adapter *pAd, void *pPacket)
{
- struct sk_buff *pRxPkt;
+ struct sk_buff *pRxPkt;
ASSERT(pPacket);
pRxPkt = RTPKT_TO_OSPKT(pPacket);
- /* Push up the protocol stack */
+ /* Push up the protocol stack */
pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
netif_rx(pRxPkt);
}
-
-PRTMP_SCATTER_GATHER_LIST
-rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg)
+struct rt_rtmp_sg_list *
+rt_get_sg_list_from_packet(void *pPacket, struct rt_rtmp_sg_list *sg)
{
sg->NumberOfElements = 1;
- sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
+ sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
return (sg);
}
@@ -687,13 +597,13 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
return;
pt = pSrcBufVA;
- printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen);
- for (x=0; x<SrcBufLen; x++)
- {
+ printk("%s: %p, len = %d\n", str, pSrcBufVA, SrcBufLen);
+ for (x = 0; x < SrcBufLen; x++) {
if (x % 16 == 0)
printk("0x%04x : ", x);
printk("%02x ", ((unsigned char)pt[x]));
- if (x%16 == 15) printk("\n");
+ if (x % 16 == 15)
+ printk("\n");
}
printk("\n");
}
@@ -718,187 +628,197 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
========================================================================
*/
-VOID RTMPSendWirelessEvent(
- IN PRTMP_ADAPTER pAd,
- IN USHORT Event_flag,
- IN PUCHAR pAddr,
- IN UCHAR BssIdx,
- IN CHAR Rssi)
+void RTMPSendWirelessEvent(struct rt_rtmp_adapter *pAd,
+ u16 Event_flag,
+ u8 *pAddr, u8 BssIdx, char Rssi)
{
- union iwreq_data wrqu;
- PUCHAR pBuf = NULL, pBufPtr = NULL;
- USHORT event, type, BufLen;
- UCHAR event_table_len = 0;
+ /*union iwreq_data wrqu; */
+ char *pBuf = NULL, *pBufPtr = NULL;
+ u16 event, type, BufLen;
+ u8 event_table_len = 0;
type = Event_flag & 0xFF00;
event = Event_flag & 0x00FF;
- switch (type)
- {
- case IW_SYS_EVENT_FLAG_START:
- event_table_len = IW_SYS_EVENT_TYPE_NUM;
- break;
+ switch (type) {
+ case IW_SYS_EVENT_FLAG_START:
+ event_table_len = IW_SYS_EVENT_TYPE_NUM;
+ break;
- case IW_SPOOF_EVENT_FLAG_START:
- event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
- break;
+ case IW_SPOOF_EVENT_FLAG_START:
+ event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
+ break;
- case IW_FLOOD_EVENT_FLAG_START:
- event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
- break;
+ case IW_FLOOD_EVENT_FLAG_START:
+ event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
+ break;
}
- if (event_table_len == 0)
- {
- DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type));
+ if (event_table_len == 0) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : The type(%0x02x) is not valid.\n", __func__,
+ type));
return;
}
- if (event >= event_table_len)
- {
- DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event));
+ if (event >= event_table_len) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : The event(%0x02x) is not valid.\n", __func__,
+ event));
return;
}
-
- //Allocate memory and copy the msg.
- if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)
- {
- //Prepare the payload
+ /*Allocate memory and copy the msg. */
+ if ((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) {
+ /*Prepare the payload */
memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
pBufPtr = pBuf;
if (pAddr)
- pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
+ pBufPtr +=
+ sprintf(pBufPtr,
+ "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ",
+ PRINT_MAC(pAddr));
else if (BssIdx < MAX_MBSSID_NUM)
- pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx);
+ pBufPtr +=
+ sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx);
else
pBufPtr += sprintf(pBufPtr, "(RT2860) ");
if (type == IW_SYS_EVENT_FLAG_START)
- pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
+ pBufPtr +=
+ sprintf(pBufPtr, "%s",
+ pWirelessSysEventText[event]);
else if (type == IW_SPOOF_EVENT_FLAG_START)
- pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
+ pBufPtr +=
+ sprintf(pBufPtr, "%s (RSSI=%d)",
+ pWirelessSpoofEventText[event], Rssi);
else if (type == IW_FLOOD_EVENT_FLAG_START)
- pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
+ pBufPtr +=
+ sprintf(pBufPtr, "%s",
+ pWirelessFloodEventText[event]);
else
pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
pBufPtr[pBufPtr - pBuf] = '\0';
BufLen = pBufPtr - pBuf;
- memset(&wrqu, 0, sizeof(wrqu));
- wrqu.data.flags = Event_flag;
- wrqu.data.length = BufLen;
-
- //send wireless event
- wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
-
- //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
+ RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL,
+ (u8 *)pBuf, BufLen);
+ /*DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf)); */
kfree(pBuf);
- }
- else
- DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
+ } else
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : Can't allocate memory for wireless event.\n",
+ __func__));
}
-void send_monitor_packets(
- IN PRTMP_ADAPTER pAd,
- IN RX_BLK *pRxBlk)
+void send_monitor_packets(struct rt_rtmp_adapter *pAd, struct rt_rx_blk *pRxBlk)
{
- struct sk_buff *pOSPkt;
- wlan_ng_prism2_header *ph;
- int rate_index = 0;
- USHORT header_len = 0;
- UCHAR temp_header[40] = {0};
-
- u_int32_t ralinkrate[256] = {2,4,11,22, 12,18,24,36,48,72,96, 108, 109, 110, 111, 112, 13, 26, 39, 52,78,104, 117, 130, 26, 52, 78,104, 156, 208, 234, 260, 27, 54,81,108,162, 216, 243, 270, // Last 38
- 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115, 130, 144, 29, 59,87,115, 173, 230,260, 288, 30, 60,90,120,180,240,270,300,60,120,180,240,360,480,540,600, 0,1,2,3,4,5,6,7,8,9,10,
- 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80};
-
+ struct sk_buff *pOSPkt;
+ struct rt_wlan_ng_prism2_header *ph;
+ int rate_index = 0;
+ u16 header_len = 0;
+ u8 temp_header[40] = { 0 };
+
+ u_int32_t ralinkrate[256] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 109, 110, 111, 112, 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, 27, 54, 81, 108, 162, 216, 243, 270, /* Last 38 */
+ 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115,
+ 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, 30, 60, 90,
+ 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540,
+ 600, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80
+ };
- ASSERT(pRxBlk->pRxPacket);
- if (pRxBlk->DataSize < 10)
- {
- DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize));
+ ASSERT(pRxBlk->pRxPacket);
+ if (pRxBlk->DataSize < 10) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : Size is too small! (%d)\n", __func__,
+ pRxBlk->DataSize));
goto err_free_sk_buff;
- }
+ }
- if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
- {
- DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
+ if (pRxBlk->DataSize + sizeof(struct rt_wlan_ng_prism2_header) >
+ RX_BUFFER_AGGRESIZE) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : Size is too large! (%zu)\n", __func__,
+ pRxBlk->DataSize + sizeof(struct rt_wlan_ng_prism2_header)));
goto err_free_sk_buff;
- }
+ }
- pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
+ pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
- if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
- {
- pRxBlk->DataSize -= LENGTH_802_11;
- if ((pRxBlk->pHeader->FC.ToDs == 1) &&
- (pRxBlk->pHeader->FC.FrDs == 1))
- header_len = LENGTH_802_11_WITH_ADDR4;
- else
- header_len = LENGTH_802_11;
-
- // QOS
- if (pRxBlk->pHeader->FC.SubType & 0x08)
- {
- header_len += 2;
- // Data skip QOS contorl field
- pRxBlk->DataSize -=2;
- }
-
- // Order bit: A-Ralink or HTC+
- if (pRxBlk->pHeader->FC.Order)
- {
- header_len += 4;
- // Data skip HTC contorl field
- pRxBlk->DataSize -= 4;
- }
-
- // Copy Header
- if (header_len <= 40)
- NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
+ if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) {
+ pRxBlk->DataSize -= LENGTH_802_11;
+ if ((pRxBlk->pHeader->FC.ToDs == 1) &&
+ (pRxBlk->pHeader->FC.FrDs == 1))
+ header_len = LENGTH_802_11_WITH_ADDR4;
+ else
+ header_len = LENGTH_802_11;
- // skip HW padding
- if (pRxBlk->RxD.L2PAD)
- pRxBlk->pData += (header_len + 2);
- else
- pRxBlk->pData += header_len;
- } //end if
+ /* QOS */
+ if (pRxBlk->pHeader->FC.SubType & 0x08) {
+ header_len += 2;
+ /* Data skip QOS contorl field */
+ pRxBlk->DataSize -= 2;
+ }
+ /* Order bit: A-Ralink or HTC+ */
+ if (pRxBlk->pHeader->FC.Order) {
+ header_len += 4;
+ /* Data skip HTC contorl field */
+ pRxBlk->DataSize -= 4;
+ }
+ /* Copy Header */
+ if (header_len <= 40)
+ NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
+ /* skip HW padding */
+ if (pRxBlk->RxD.L2PAD)
+ pRxBlk->pData += (header_len + 2);
+ else
+ pRxBlk->pData += header_len;
+ } /*end if */
if (pRxBlk->DataSize < pOSPkt->len) {
- skb_trim(pOSPkt,pRxBlk->DataSize);
- } else {
- skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));
- } //end if
-
- if ((pRxBlk->pData - pOSPkt->data) > 0) {
- skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));
- skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));
- } //end if
-
- if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {
- if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {
- DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__));
+ skb_trim(pOSPkt, pRxBlk->DataSize);
+ } else {
+ skb_put(pOSPkt, (pRxBlk->DataSize - pOSPkt->len));
+ } /*end if */
+
+ if ((pRxBlk->pData - pOSPkt->data) > 0) {
+ skb_put(pOSPkt, (pRxBlk->pData - pOSPkt->data));
+ skb_pull(pOSPkt, (pRxBlk->pData - pOSPkt->data));
+ } /*end if */
+
+ if (skb_headroom(pOSPkt) < (sizeof(struct rt_wlan_ng_prism2_header) + header_len)) {
+ if (pskb_expand_head
+ (pOSPkt, (sizeof(struct rt_wlan_ng_prism2_header) + header_len), 0,
+ GFP_ATOMIC)) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : Reallocate header size of sk_buff fail!\n",
+ __func__));
goto err_free_sk_buff;
- } //end if
- } //end if
+ } /*end if */
+ } /*end if */
- if (header_len > 0)
- NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);
+ if (header_len > 0)
+ NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header,
+ header_len);
- ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));
- NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
+ ph = (struct rt_wlan_ng_prism2_header *)skb_push(pOSPkt,
+ sizeof(struct rt_wlan_ng_prism2_header));
+ NdisZeroMemory(ph, sizeof(struct rt_wlan_ng_prism2_header));
- ph->msgcode = DIDmsg_lnxind_wlansniffrm;
- ph->msglen = sizeof(wlan_ng_prism2_header);
- strcpy(ph->devname, pAd->net_dev->name);
+ ph->msgcode = DIDmsg_lnxind_wlansniffrm;
+ ph->msglen = sizeof(struct rt_wlan_ng_prism2_header);
+ strcpy((char *)ph->devname, (char *)pAd->net_dev->name);
- ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
+ ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
ph->hosttime.status = 0;
ph->hosttime.len = 4;
ph->hosttime.data = jiffies;
@@ -908,63 +828,71 @@ void send_monitor_packets(
ph->mactime.len = 0;
ph->mactime.data = 0;
- ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
+ ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
ph->istx.status = 0;
ph->istx.len = 0;
ph->istx.data = 0;
- ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
+ ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
ph->channel.status = 0;
ph->channel.len = 4;
- ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;
+ ph->channel.data = (u_int32_t) pAd->CommonCfg.Channel;
- ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
+ ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
ph->rssi.status = 0;
ph->rssi.len = 4;
- ph->rssi.data = (u_int32_t)RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2));;
+ ph->rssi.data =
+ (u_int32_t) RTMPMaxRssi(pAd,
+ ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0,
+ RSSI_0), ConvertToRssi(pAd,
+ pRxBlk->
+ pRxWI->
+ RSSI1,
+ RSSI_1),
+ ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2,
+ RSSI_2));;
ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
ph->signal.status = 0;
ph->signal.len = 4;
- ph->signal.data = 0; //rssi + noise;
+ ph->signal.data = 0; /*rssi + noise; */
ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
ph->noise.status = 0;
ph->noise.len = 4;
ph->noise.data = 0;
- if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
- {
- rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
- }
- else
- if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
- rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
- else
- rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
- if (rate_index < 0)
- rate_index = 0;
- if (rate_index > 255)
- rate_index = 255;
+ if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) {
+ rate_index =
+ 16 + ((u8)pRxBlk->pRxWI->BW * 16) +
+ ((u8)pRxBlk->pRxWI->ShortGI * 32) +
+ ((u8)pRxBlk->pRxWI->MCS);
+ } else if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
+ rate_index = (u8)(pRxBlk->pRxWI->MCS) + 4;
+ else
+ rate_index = (u8)(pRxBlk->pRxWI->MCS);
+ if (rate_index < 0)
+ rate_index = 0;
+ if (rate_index > 255)
+ rate_index = 255;
ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
ph->rate.status = 0;
ph->rate.len = 4;
- ph->rate.data = ralinkrate[rate_index];
+ ph->rate.data = ralinkrate[rate_index];
ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
- ph->frmlen.status = 0;
+ ph->frmlen.status = 0;
ph->frmlen.len = 4;
- ph->frmlen.data = (u_int32_t)pRxBlk->DataSize;
-
+ ph->frmlen.data = (u_int32_t) pRxBlk->DataSize;
- pOSPkt->pkt_type = PACKET_OTHERHOST;
- pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
- pOSPkt->ip_summed = CHECKSUM_NONE;
- netif_rx(pOSPkt);
+ pOSPkt->pkt_type = PACKET_OTHERHOST;
+ pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
+ pOSPkt->ip_summed = CHECKSUM_NONE;
+ netif_rx(pOSPkt);
- return;
+ return;
err_free_sk_buff:
RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
@@ -972,31 +900,470 @@ err_free_sk_buff:
}
-void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
+/*******************************************************************************
+
+ Device IRQ related functions.
+
+ *******************************************************************************/
+int RtmpOSIRQRequest(struct net_device *pNetDev)
+{
+#ifdef RTMP_PCI_SUPPORT
+ struct net_device *net_dev = pNetDev;
+ struct rt_rtmp_adapter *pAd = NULL;
+ int retval = 0;
+
+ GET_PAD_FROM_NET_DEV(pAd, pNetDev);
+
+ ASSERT(pAd);
+
+ if (pAd->infType == RTMP_DEV_INF_PCI) {
+ struct os_cookie *_pObj = (struct os_cookie *)(pAd->OS_Cookie);
+ RTMP_MSI_ENABLE(pAd);
+ retval =
+ request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ,
+ (net_dev)->name, (net_dev));
+ if (retval != 0)
+ printk("RT2860: request_irq ERROR(%d)\n", retval);
+ }
+
+ return retval;
+#else
+ return 0;
+#endif
+}
+
+int RtmpOSIRQRelease(struct net_device *pNetDev)
+{
+ struct net_device *net_dev = pNetDev;
+ struct rt_rtmp_adapter *pAd = NULL;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ ASSERT(pAd);
+
+#ifdef RTMP_PCI_SUPPORT
+ if (pAd->infType == RTMP_DEV_INF_PCI) {
+ struct os_cookie *pObj = (struct os_cookie *)(pAd->OS_Cookie);
+ synchronize_irq(pObj->pci_dev->irq);
+ free_irq(pObj->pci_dev->irq, (net_dev));
+ RTMP_MSI_DISABLE(pAd);
+ }
+#endif /* RTMP_PCI_SUPPORT // */
+
+ return 0;
+}
+
+/*******************************************************************************
+
+ File open/close related functions.
+
+ *******************************************************************************/
+struct file *RtmpOSFileOpen(char *pPath, int flag, int mode)
{
- daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
+ struct file *filePtr;
+
+ filePtr = filp_open(pPath, flag, 0);
+ if (IS_ERR(filePtr)) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s(): Error %ld opening %s\n", __func__,
+ -PTR_ERR(filePtr), pPath));
+ }
+
+ return (struct file *)filePtr;
+}
+
+int RtmpOSFileClose(struct file *osfd)
+{
+ filp_close(osfd, NULL);
+ return 0;
+}
+
+void RtmpOSFileSeek(struct file *osfd, int offset)
+{
+ osfd->f_pos = offset;
+}
+
+int RtmpOSFileRead(struct file *osfd, char *pDataPtr, int readLen)
+{
+ /* The object must have a read method */
+ if (osfd->f_op && osfd->f_op->read) {
+ return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
+ } else {
+ DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n"));
+ return -1;
+ }
+}
+
+int RtmpOSFileWrite(struct file *osfd, char *pDataPtr, int writeLen)
+{
+ return osfd->f_op->write(osfd, pDataPtr, (size_t) writeLen,
+ &osfd->f_pos);
+}
+
+/*******************************************************************************
+
+ Task create/management/kill related functions.
+
+ *******************************************************************************/
+int RtmpOSTaskKill(struct rt_rtmp_os_task *pTask)
+{
+ struct rt_rtmp_adapter *pAd;
+ int ret = NDIS_STATUS_FAILURE;
+
+ pAd = (struct rt_rtmp_adapter *)pTask->priv;
+
+#ifdef KTHREAD_SUPPORT
+ if (pTask->kthread_task) {
+ kthread_stop(pTask->kthread_task);
+ ret = NDIS_STATUS_SUCCESS;
+ }
+#else
+ CHECK_PID_LEGALITY(pTask->taskPID) {
+ printk("Terminate the task(%s) with pid(%d)!\n",
+ pTask->taskName, GET_PID_NUMBER(pTask->taskPID));
+ mb();
+ pTask->task_killed = 1;
+ mb();
+ ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1);
+ if (ret) {
+ printk(KERN_WARNING
+ "kill task(%s) with pid(%d) failed(retVal=%d)!\n",
+ pTask->taskName, GET_PID_NUMBER(pTask->taskPID),
+ ret);
+ } else {
+ wait_for_completion(&pTask->taskComplete);
+ pTask->taskPID = THREAD_PID_INIT_VALUE;
+ pTask->task_killed = 0;
+ ret = NDIS_STATUS_SUCCESS;
+ }
+ }
+#endif
+
+ return ret;
+
+}
+
+int RtmpOSTaskNotifyToExit(struct rt_rtmp_os_task *pTask)
+{
+
+#ifndef KTHREAD_SUPPORT
+ complete_and_exit(&pTask->taskComplete, 0);
+#endif
+
+ return 0;
+}
+
+void RtmpOSTaskCustomize(struct rt_rtmp_os_task *pTask)
+{
+
+#ifndef KTHREAD_SUPPORT
+
+ daemonize((char *)& pTask->taskName[0] /*"%s",pAd->net_dev->name */ );
allow_signal(SIGTERM);
allow_signal(SIGKILL);
current->flags |= PF_NOFREEZE;
/* signal that we've started the thread */
- complete(pNotify);
+ complete(&pTask->taskComplete);
+
+#endif
}
-void RTMP_IndicateMediaState(
- IN PRTMP_ADAPTER pAd)
+int RtmpOSTaskAttach(struct rt_rtmp_os_task *pTask,
+ IN int (*fn) (void *), IN void *arg)
{
- if (pAd->CommonCfg.bWirelessEvent)
- {
- if (pAd->IndicateMediaState == NdisMediaStateConnected)
- {
- RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
+ int status = NDIS_STATUS_SUCCESS;
+
+#ifdef KTHREAD_SUPPORT
+ pTask->task_killed = 0;
+ pTask->kthread_task = NULL;
+ pTask->kthread_task = kthread_run(fn, arg, pTask->taskName);
+ if (IS_ERR(pTask->kthread_task))
+ status = NDIS_STATUS_FAILURE;
+#else
+ pid_number = kernel_thread(fn, arg, RTMP_OS_MGMT_TASK_FLAGS);
+ if (pid_number < 0) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Attach task(%s) failed!\n", pTask->taskName));
+ status = NDIS_STATUS_FAILURE;
+ } else {
+ pTask->taskPID = GET_PID(pid_number);
+
+ /* Wait for the thread to start */
+ wait_for_completion(&pTask->taskComplete);
+ status = NDIS_STATUS_SUCCESS;
+ }
+#endif
+ return status;
+}
+
+int RtmpOSTaskInit(struct rt_rtmp_os_task *pTask,
+ char *pTaskName, void * pPriv)
+{
+ int len;
+
+ ASSERT(pTask);
+
+#ifndef KTHREAD_SUPPORT
+ NdisZeroMemory((u8 *)(pTask), sizeof(struct rt_rtmp_os_task));
+#endif
+
+ len = strlen(pTaskName);
+ len =
+ len >
+ (RTMP_OS_TASK_NAME_LEN - 1) ? (RTMP_OS_TASK_NAME_LEN - 1) : len;
+ NdisMoveMemory(&pTask->taskName[0], pTaskName, len);
+ pTask->priv = pPriv;
+
+#ifndef KTHREAD_SUPPORT
+ RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema));
+ pTask->taskPID = THREAD_PID_INIT_VALUE;
+
+ init_completion(&pTask->taskComplete);
+#endif
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+void RTMP_IndicateMediaState(struct rt_rtmp_adapter *pAd)
+{
+ if (pAd->CommonCfg.bWirelessEvent) {
+ if (pAd->IndicateMediaState == NdisMediaStateConnected) {
+ RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG,
+ pAd->MacTab.Content[BSSID_WCID].
+ Addr, BSS0, 0);
+ } else {
+ RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG,
+ pAd->MacTab.Content[BSSID_WCID].
+ Addr, BSS0, 0);
}
+ }
+}
+
+int RtmpOSWrielessEventSend(struct rt_rtmp_adapter *pAd,
+ u32 eventType,
+ int flags,
+ u8 *pSrcMac,
+ u8 *pData, u32 dataLen)
+{
+ union iwreq_data wrqu;
+
+ memset(&wrqu, 0, sizeof(wrqu));
+
+ if (flags > -1)
+ wrqu.data.flags = flags;
+
+ if (pSrcMac)
+ memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);
+
+ if ((pData != NULL) && (dataLen > 0))
+ wrqu.data.length = dataLen;
+
+ wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData);
+ return 0;
+}
+
+int RtmpOSNetDevAddrSet(struct net_device *pNetDev, u8 *pMacAddr)
+{
+ struct net_device *net_dev;
+ struct rt_rtmp_adapter *pAd;
+
+ net_dev = pNetDev;
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ /* work-around for the SuSE due to it has it's own interface name management system. */
+ {
+ NdisZeroMemory(pAd->StaCfg.dev_name, 16);
+ NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name,
+ strlen(net_dev->name));
+ }
+
+ NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6);
+
+ return 0;
+}
+
+/*
+ * Assign the network dev name for created Ralink WiFi interface.
+ */
+static int RtmpOSNetDevRequestName(struct rt_rtmp_adapter *pAd,
+ struct net_device *dev,
+ char *pPrefixStr, int devIdx)
+{
+ struct net_device *existNetDev;
+ char suffixName[IFNAMSIZ];
+ char desiredName[IFNAMSIZ];
+ int ifNameIdx, prefixLen, slotNameLen;
+ int Status;
+
+ prefixLen = strlen(pPrefixStr);
+ ASSERT((prefixLen < IFNAMSIZ));
+
+ for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) {
+ memset(suffixName, 0, IFNAMSIZ);
+ memset(desiredName, 0, IFNAMSIZ);
+ strncpy(&desiredName[0], pPrefixStr, prefixLen);
+
+ sprintf(suffixName, "%d", ifNameIdx);
+
+ slotNameLen = strlen(suffixName);
+ ASSERT(((slotNameLen + prefixLen) < IFNAMSIZ));
+ strcat(desiredName, suffixName);
+
+ existNetDev = RtmpOSNetDevGetByName(dev, &desiredName[0]);
+ if (existNetDev == NULL)
+ break;
else
- {
- RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
+ RtmpOSNetDeviceRefPut(existNetDev);
+ }
+
+ if (ifNameIdx < 32) {
+ strcpy(&dev->name[0], &desiredName[0]);
+ Status = NDIS_STATUS_SUCCESS;
+ } else {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n",
+ pPrefixStr));
+ Status = NDIS_STATUS_FAILURE;
+ }
+
+ return Status;
+}
+
+void RtmpOSNetDevClose(struct net_device *pNetDev)
+{
+ dev_close(pNetDev);
+}
+
+void RtmpOSNetDevFree(struct net_device *pNetDev)
+{
+ ASSERT(pNetDev);
+
+ free_netdev(pNetDev);
+}
+
+int RtmpOSNetDevAlloc(struct net_device ** new_dev_p, u32 privDataSize)
+{
+ /* assign it as null first. */
+ *new_dev_p = NULL;
+
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("Allocate a net device with private data size=%d!\n",
+ privDataSize));
+ *new_dev_p = alloc_etherdev(privDataSize);
+ if (*new_dev_p)
+ return NDIS_STATUS_SUCCESS;
+ else
+ return NDIS_STATUS_FAILURE;
+}
+
+struct net_device *RtmpOSNetDevGetByName(struct net_device *pNetDev, char *pDevName)
+{
+ struct net_device *pTargetNetDev = NULL;
+
+ pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName);
+
+ return pTargetNetDev;
+}
+
+void RtmpOSNetDeviceRefPut(struct net_device *pNetDev)
+{
+ /*
+ every time dev_get_by_name is called, and it has returned a valid struct
+ net_device*, dev_put should be called afterwards, because otherwise the
+ machine hangs when the device is unregistered (since dev->refcnt > 1).
+ */
+ if (pNetDev)
+ dev_put(pNetDev);
+}
+
+int RtmpOSNetDevDestory(struct rt_rtmp_adapter *pAd, struct net_device *pNetDev)
+{
+
+ /* TODO: Need to fix this */
+ printk("WARNING: This function(%s) not implement yet!\n", __func__);
+ return 0;
+}
+
+void RtmpOSNetDevDetach(struct net_device *pNetDev)
+{
+ unregister_netdev(pNetDev);
+}
+
+int RtmpOSNetDevAttach(struct net_device *pNetDev,
+ struct rt_rtmp_os_netdev_op_hook *pDevOpHook)
+{
+ int ret, rtnl_locked = FALSE;
+
+ DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n"));
+ /* If we need hook some callback function to the net device structrue, now do it. */
+ if (pDevOpHook) {
+ struct rt_rtmp_adapter *pAd = NULL;
+
+ GET_PAD_FROM_NET_DEV(pAd, pNetDev);
+
+ pNetDev->netdev_ops = pDevOpHook->netdev_ops;
+
+ /* OS specific flags, here we used to indicate if we are virtual interface */
+ pNetDev->priv_flags = pDevOpHook->priv_flags;
+
+ if (pAd->OpMode == OPMODE_STA) {
+ pNetDev->wireless_handlers = &rt28xx_iw_handler_def;
}
+
+ /* copy the net device mac address to the net_device structure. */
+ NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0],
+ MAC_ADDR_LEN);
+
+ rtnl_locked = pDevOpHook->needProtcted;
}
+
+ if (rtnl_locked)
+ ret = register_netdevice(pNetDev);
+ else
+ ret = register_netdev(pNetDev);
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<---RtmpOSNetDevAttach(), ret=%d\n", ret));
+ if (ret == 0)
+ return NDIS_STATUS_SUCCESS;
+ else
+ return NDIS_STATUS_FAILURE;
}
+struct net_device *RtmpOSNetDevCreate(struct rt_rtmp_adapter *pAd,
+ int devType,
+ int devNum,
+ int privMemSize, char *pNamePrefix)
+{
+ struct net_device *pNetDev = NULL;
+ int status;
+
+ /* allocate a new network device */
+ status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize */ );
+ if (status != NDIS_STATUS_SUCCESS) {
+ /* allocation fail, exit */
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Allocate network device fail (%s)...\n",
+ pNamePrefix));
+ return NULL;
+ }
+
+ /* find a available interface name, max 32 interfaces */
+ status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum);
+ if (status != NDIS_STATUS_SUCCESS) {
+ /* error! no any available ra name can be used! */
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Assign interface name (%s with suffix 0~32) failed...\n",
+ pNamePrefix));
+ RtmpOSNetDevFree(pNetDev);
+
+ return NULL;
+ } else {
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("The name of the new %s interface is %s...\n",
+ pNamePrefix, pNetDev->name));
+ }
+
+ return pNetDev;
+}