summaryrefslogtreecommitdiff
path: root/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c')
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c935
1 files changed, 935 insertions, 0 deletions
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c
new file mode 100644
index 0000000000..fd1852b8ab
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c
@@ -0,0 +1,935 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ****************************************************************************
+
+ Module Name:
+ rt_profile.c
+
+ Abstract:
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+ */
+
+#include "rt_config.h"
+
+#if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE)
+#include "../../../../../../net/nat/hw_nat/ra_nat.h"
+#include "../../../../../../net/nat/hw_nat/frame_engine.h"
+#endif
+
+
+#ifdef SYSTEM_LOG_SUPPORT
+/* 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 */
+ "channel switch to ", /* IW_CHANNEL_CHANGE_EVENT_FLAG */
+ "wireless mode is not support", /* IW_STA_MODE_EVENT_FLAG */
+ "blacklisted in MAC filter list", /* IW_MAC_FILTER_LIST_EVENT_FLAG */
+ "Authentication rejected because of challenge failure", /* IW_AUTH_REJECT_CHALLENGE_FAILURE */
+ "Scanning", /* IW_SCANNING_EVENT_FLAG */
+ "Start a new IBSS", /* IW_START_IBSS_FLAG */
+ "Join the IBSS", /* IW_JOIN_IBSS_FLAG */
+ "Shared WEP fail", /* IW_SHARED_WEP_FAIL*/
+ };
+
+#ifdef IDS_SUPPORT
+/* 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 */
+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 */
+ };
+#endif /* IDS_SUPPORT */
+
+#ifdef WSC_INCLUDED
+/* for WSC wireless event message */
+char const *pWirelessWscEventText[IW_WSC_EVENT_TYPE_NUM] = {
+ "PBC Session Overlap", /* IW_WSC_PBC_SESSION_OVERLAP */
+ "This WPS Registrar supports PBC", /* IW_WSC_REGISTRAR_SUPPORT_PBC */
+ "This WPS Registrar supports PIN", /* IW_WSC_REGISTRAR_SUPPORT_PIN */
+ "WPS status success", /* IW_WSC_STATUS_SUCCESS */
+ "WPS status fail", /* IW_WSC_STATUS_FAIL */
+ "WPS 2 mins time out!", /* IW_WSC_2MINS_TIMEOUT */
+ "WPS Send EAPOL_Start!", /* IW_WSC_SEND_EAPOL_START */
+ "WPS Send WscStart!", /* IW_WSC_SEND_WSC_START */
+ "WPS Send M1!", /* IW_WSC_SEND_M1 */
+ "WPS Send M2!", /* IW_WSC_SEND_M2 */
+ "WPS Send M3!", /* IW_WSC_SEND_M3 */
+ "WPS Send M4!", /* IW_WSC_SEND_M4 */
+ "WPS Send M5!", /* IW_WSC_SEND_M5 */
+ "WPS Send M6!", /* IW_WSC_SEND_M6 */
+ "WPS Send M7!", /* IW_WSC_SEND_M7 */
+ "WPS Send M8!", /* IW_WSC_SEND_M8 */
+ "WPS Send WscDone!", /* IW_WSC_SEND_DONE */
+ "WPS Send WscAck!", /* IW_WSC_SEND_ACK */
+ "WPS Send WscNack!", /* IW_WSC_SEND_NACK */
+ "WPS Receive WscStart!", /* IW_WSC_RECEIVE_WSC_START */
+ "WPS Receive M1!", /* IW_WSC_RECEIVE_M1 */
+ "WPS Receive M2!", /* IW_WSC_RECEIVE_M2 */
+ "WPS Receive M3!", /* IW_WSC_RECEIVE_M3 */
+ "WPS Receive M4!", /* IW_WSC_RECEIVE_M4 */
+ "WPS Receive M5!", /* IW_WSC_RECEIVE_M5 */
+ "WPS Receive M6!", /* IW_WSC_RECEIVE_M6 */
+ "WPS Receive M7!", /* IW_WSC_RECEIVE_M7 */
+ "WPS Receive M8!", /* IW_WSC_RECEIVE_M8 */
+ "WPS Receive WscDone!", /* IW_WSC_RECEIVE_DONE */
+ "WPS Receive WscAck!", /* IW_WSC_RECEIVE_ACK */
+ "WPS Receive WscNack!", /* IW_WSC_RECEIVE_NACK */
+ "Not only one candidate found" /* IW_WSC_MANY_CANDIDATE */
+ };
+#endif /* WSC_INCLUDED */
+
+#endif /* SYSTEM_LOG_SUPPORT */
+
+
+NDIS_STATUS RTMPReadParametersHook(
+ IN PRTMP_ADAPTER pAd)
+{
+ PSTRING src = NULL;
+ RTMP_OS_FD srcf;
+ RTMP_OS_FS_INFO osFSInfo;
+ INT retval = NDIS_STATUS_FAILURE;
+ PSTRING buffer;
+
+#ifdef HOSTAPD_SUPPORT
+ int i;
+#endif /*HOSTAPD_SUPPORT */
+
+/* buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); */
+ os_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE);
+ if(buffer == NULL)
+ return NDIS_STATUS_FAILURE;
+ memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
+
+ {
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+ src = AP_PROFILE_PATH;
+ }
+#endif /* CONFIG_AP_SUPPORT */
+
+#ifdef MULTIPLE_CARD_SUPPORT
+ src = (PSTRING)pAd->MC_FileName;
+#endif /* MULTIPLE_CARD_SUPPORT */
+ }
+
+ if (src && *src)
+ {
+ RtmpOSFSInfoChange(&osFSInfo, TRUE);
+ srcf = RtmpOSFileOpen(src, O_RDONLY, 0);
+ if (IS_FILE_OPEN_ERR(srcf))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("Open file \"%s\" failed!\n", src));
+ }
+ else
+ {
+ retval =RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);
+ if (retval > 0)
+ {
+ RTMPSetProfileParameters(pAd, buffer);
+ retval = NDIS_STATUS_SUCCESS;
+ }
+ else
+ DBGPRINT(RT_DEBUG_ERROR, ("Read file \"%s\" failed(errCode=%d)!\n", src, retval));
+
+ retval = RtmpOSFileClose(srcf);
+ if ( retval != 0)
+ {
+ retval = NDIS_STATUS_FAILURE;
+ DBGPRINT(RT_DEBUG_ERROR, ("Close file \"%s\" failed(errCode=%d)!\n", src, retval));
+ }
+ }
+
+ RtmpOSFSInfoChange(&osFSInfo, FALSE);
+ }
+
+#ifdef HOSTAPD_SUPPORT
+ for (i = 0; i < pAd->ApCfg.BssidNum; i++)
+ {
+ pAd->ApCfg.MBSSID[i].Hostapd=FALSE;
+ DBGPRINT(RT_DEBUG_TRACE, ("Reset ra%d hostapd support=FLASE", i));
+
+ }
+#endif /*HOSTAPD_SUPPORT */
+
+/* kfree(buffer); */
+ os_free_mem(NULL, buffer);
+
+ return (retval);
+
+}
+
+
+#ifdef SYSTEM_LOG_SUPPORT
+/*
+ ========================================================================
+
+ Routine Description:
+ Send log message through wireless event
+
+ Support standard iw_event with IWEVCUSTOM. It is used below.
+
+ iwreq_data.data.flags is used to store event_flag that is defined by user.
+ iwreq_data.data.length is the length of the event log.
+
+ The format of the event log is composed of the entry's MAC address and
+ the desired log message (refer to pWirelessEventText).
+
+ ex: 11:22:33:44:55:66 has associated successfully
+
+ p.s. The requirement of Wireless Extension is v15 or newer.
+
+ ========================================================================
+*/
+VOID RtmpDrvSendWirelessEvent(
+ IN VOID *pAdSrc,
+ IN USHORT Event_flag,
+ IN PUCHAR pAddr,
+ IN UCHAR BssIdx,
+ IN CHAR Rssi)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+ PSTRING pBuf = NULL, pBufPtr = NULL;
+ USHORT event, type, BufLen;
+ UCHAR event_table_len = 0;
+
+ if (pAd->CommonCfg.bWirelessEvent == FALSE)
+ return;
+
+ 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;
+#ifdef IDS_SUPPORT
+ 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;
+#endif /* IDS_SUPPORT */
+#ifdef WSC_INCLUDED
+ case IW_WSC_EVENT_FLAG_START:
+ event_table_len = IW_WSC_EVENT_TYPE_NUM;
+ break;
+#endif /* WSC_INCLUDED */
+ }
+
+ if (event_table_len == 0)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __FUNCTION__, type));
+ return;
+ }
+
+ if (event >= event_table_len)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __FUNCTION__, event));
+ return;
+ }
+
+ /*Allocate memory and copy the msg. */
+/* if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) */
+ os_alloc_mem(NULL, (UCHAR **)&pBuf, IW_CUSTOM_MAX_LEN);
+ if(pBuf != 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));
+ else if (BssIdx < MAX_MBSSID_NUM(pAd))
+ pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
+ else
+ pBufPtr += sprintf(pBufPtr, "(RT2860) ");
+
+ if (type == IW_SYS_EVENT_FLAG_START)
+ {
+ pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
+
+ if (Event_flag == IW_CHANNEL_CHANGE_EVENT_FLAG)
+ {
+ pBufPtr += sprintf(pBufPtr, "%3d", Rssi);
+ }
+ }
+#ifdef IDS_SUPPORT
+ else if (type == IW_SPOOF_EVENT_FLAG_START)
+ pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
+ else if (type == IW_FLOOD_EVENT_FLAG_START)
+ pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
+#endif /* IDS_SUPPORT */
+#ifdef WSC_INCLUDED
+ else if (type == IW_WSC_EVENT_FLAG_START)
+ pBufPtr += sprintf(pBufPtr, "%s", pWirelessWscEventText[event]);
+#endif /* WSC_INCLUDED */
+ else
+ pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
+
+ pBufPtr[pBufPtr - pBuf] = '\0';
+ BufLen = pBufPtr - pBuf;
+
+ RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen);
+ /*DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf)); */
+
+/* kfree(pBuf); */
+ os_free_mem(NULL, pBuf);
+ }
+ else
+ DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__));
+}
+#endif /* SYSTEM_LOG_SUPPORT */
+
+
+void RTMP_IndicateMediaState(
+ IN PRTMP_ADAPTER pAd,
+ IN NDIS_MEDIA_STATE media_state)
+{
+ pAd->IndicateMediaState = media_state;
+
+#ifdef SYSTEM_LOG_SUPPORT
+ 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);
+ }
+#endif /* SYSTEM_LOG_SUPPORT */
+}
+
+
+#ifdef WORKQUEUE_BH
+void tbtt_workq(struct work_struct *work)
+#else
+void tbtt_tasklet(unsigned long data)
+#endif /* WORKQUEUE_BH */
+{
+/*#define MAX_TX_IN_TBTT (16) */
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef WORKQUEUE_BH
+ POS_COOKIE pObj = container_of(work, struct os_cookie, tbtt_work);
+ PRTMP_ADAPTER pAd = pObj->pAd_va;
+#else
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
+#endif /* WORKQUEUE_BH */
+
+
+ if (pAd->OpMode == OPMODE_AP)
+ {
+ /* */
+ /* step 7 - if DTIM, then move backlogged bcast/mcast frames from PSQ to TXQ whenever DtimCount==0 */
+#ifdef RTMP_MAC_USB
+ if ((pAd->ApCfg.DtimCount + 1) == pAd->ApCfg.DtimPeriod)
+#endif /* RTMP_MAC_USB */
+ {
+ PQUEUE_ENTRY pEntry;
+ BOOLEAN bPS = FALSE;
+ UINT count = 0;
+ unsigned long IrqFlags;
+
+/* NdisAcquireSpinLock(&pAd->MacTabLock); */
+/* NdisAcquireSpinLock(&pAd->TxSwQueueLock); */
+
+ RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
+ while (pAd->MacTab.McastPsQueue.Head)
+ {
+ bPS = TRUE;
+ if (pAd->TxSwQueue[QID_AC_BE].Number <= (pAd->TxSwQMaxLen + MAX_PACKETS_IN_MCAST_PS_QUEUE))
+ {
+ pEntry = RemoveHeadQueue(&pAd->MacTab.McastPsQueue);
+ /*if(pAd->MacTab.McastPsQueue.Number) */
+ if (count)
+ {
+ RTMP_SET_PACKET_MOREDATA(pEntry, TRUE);
+ }
+ InsertHeadQueue(&pAd->TxSwQueue[QID_AC_BE], pEntry);
+ count++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
+
+
+/* NdisReleaseSpinLock(&pAd->TxSwQueueLock); */
+/* NdisReleaseSpinLock(&pAd->MacTabLock); */
+ if (pAd->MacTab.McastPsQueue.Number == 0)
+ {
+ UINT bss_index;
+
+ /* clear MCAST/BCAST backlog bit for all BSS */
+ for(bss_index=BSS0; bss_index<pAd->ApCfg.BssidNum; bss_index++)
+ WLAN_MR_TIM_BCMC_CLEAR(bss_index);
+ /* End of for */
+ }
+ pAd->MacTab.PsQIdleCount = 0;
+
+ /* Dequeue outgoing framea from TxSwQueue0..3 queue and process it */
+ if (bPS == TRUE)
+ {
+ RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, /*MAX_TX_IN_TBTT*/MAX_PACKETS_IN_MCAST_PS_QUEUE);
+ }
+ }
+ }
+#endif /* CONFIG_AP_SUPPORT */
+}
+
+
+void announce_802_3_packet(
+ IN VOID *pAdSrc,
+ IN PNDIS_PACKET pPacket,
+ IN UCHAR OpMode)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+/* struct sk_buff *pRxPkt; */
+ PNDIS_PACKET pRxPkt;
+#ifdef INF_PPA_SUPPORT
+ int ret = 0;
+ unsigned int ppa_flags = 0; /* reserved for now */
+#endif /* INF_PPA_SUPPORT */
+
+ pAd = pAd; /* avoid compile warning */
+
+ MEM_DBG_PKT_FREE_INC(pPacket);
+
+
+ ASSERT(pPacket);
+
+/* pRxPkt = RTPKT_TO_OSPKT(pPacket); */
+ pRxPkt = pPacket;
+#ifdef CONFIG_AP_SUPPORT
+#ifdef APCLI_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+ if (RTMP_MATPktRxNeedConvert(pAd, RtmpOsPktNetDevGet(pRxPkt)))
+ {
+ RTMP_MATEngineRxHandle(pAd, pRxPkt, 0);
+ }
+ }
+#endif /* APCLI_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ /* Push up the protocol stack */
+#ifdef CONFIG_AP_SUPPORT
+#if defined(PLATFORM_BL2348) || defined(PLATFORM_BL23570)
+
+{
+ extern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb);
+/* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+ RtmpOsPktProtocolAssign(pRxPkt);
+ pToUpperLayerPktSent(pRxPkt);
+ return;
+}
+#endif /* PLATFORM_BL2348 */
+#endif /* CONFIG_AP_SUPPORT */
+
+#ifdef IKANOS_VX_1X0
+ IKANOS_DataFrameRx(pAd, pRxPkt);
+ return;
+#endif /* IKANOS_VX_1X0 */
+
+
+ /* mark for bridge fast path, 2009/06/22 */
+ /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+
+#ifdef INF_PPA_SUPPORT
+ if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE )
+ {
+ RtmpOsPktInfPpaSend(pRxPkt);
+
+ pRxPkt=NULL;
+ return;
+
+ }
+#endif /* INF_PPA_SUPPORT */
+
+ {
+#ifdef CONFIG_RT2880_BRIDGING_ONLY
+/* pRxPkt->cb[22]=0xa8; */
+ PACKET_CB_ASSIGN(pRxPkt, 22) = 0xa8;
+#endif
+
+#if defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE)
+ if(ra_classifier_hook_rx!= NULL)
+ {
+ unsigned int flags;
+
+ RTMP_IRQ_LOCK(&pAd->page_lock, flags);
+ ra_classifier_hook_rx(pRxPkt, classifier_cur_cycle);
+ RTMP_IRQ_UNLOCK(&pAd->page_lock, flags);
+ }
+#endif /* CONFIG_RA_CLASSIFIER */
+
+#if !defined(CONFIG_RA_NAT_NONE)
+#if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE)
+ RtmpOsPktNatMagicTag(pRxPkt);
+#endif
+
+ /* bruce+
+ * ra_sw_nat_hook_rx return 1 --> continue
+ * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx
+ */
+ if (ra_sw_nat_hook_rx!= NULL)
+ {
+ unsigned int flags;
+
+ /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+ RtmpOsPktProtocolAssign(pRxPkt);
+
+ RTMP_IRQ_LOCK(&pAd->page_lock, flags);
+ if(ra_sw_nat_hook_rx(pRxPkt))
+ {
+ RtmpOsPktRcvHandle(pRxPkt);
+ }
+ RTMP_IRQ_UNLOCK(&pAd->page_lock, flags);
+ }
+#else
+ {
+#if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE)
+ RtmpOsPktNatNone(pRxPkt);
+#endif /* CONFIG_RA_HW_NAT */
+ }
+#endif /* CONFIG_RA_NAT_NONE */
+ }
+
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef BG_FT_SUPPORT
+ if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0)
+ return;
+#endif /* BG_FT_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+/* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+ RtmpOsPktProtocolAssign(pRxPkt);
+ RtmpOsPktRcvHandle(pRxPkt);
+
+}
+
+
+
+
+extern NDIS_SPIN_LOCK TimerSemLock;
+
+VOID RTMPFreeAdapter(
+ IN VOID *pAdSrc)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+ POS_COOKIE os_cookie;
+ int index;
+
+ os_cookie=(POS_COOKIE)pAd->OS_Cookie;
+
+ if (pAd->BeaconBuf)
+ os_free_mem(NULL, pAd->BeaconBuf);
+
+
+ NdisFreeSpinLock(&pAd->MgmtRingLock);
+
+
+#ifdef RT3290
+ NdisFreeSpinLock(&pAd->WlanEnLock);
+#endif /* RT3290 */
+
+ 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);
+
+
+#ifdef SPECIFIC_BCN_BUF_SUPPORT
+ NdisFreeSpinLock(&pAd->ShrMemLock);
+#endif /* SPECIFIC_BCN_BUF_SUPPORT */
+
+#ifdef UAPSD_SUPPORT
+ NdisFreeSpinLock(&pAd->UAPSDEOSPLock); /* OS_ABL_SUPPORT */
+#endif /* UAPSD_SUPPORT */
+
+#ifdef DOT11_N_SUPPORT
+ NdisFreeSpinLock(&pAd->mpdu_blk_pool.lock);
+#endif /* DOT11_N_SUPPORT */
+
+ if (pAd->iw_stats)
+ {
+ os_free_mem(NULL, pAd->iw_stats);
+ pAd->iw_stats = NULL;
+ }
+ if (pAd->stats)
+ {
+ os_free_mem(NULL, pAd->stats);
+ pAd->stats = NULL;
+ }
+
+ NdisFreeSpinLock(&TimerSemLock);
+
+#ifdef RALINK_ATE
+#ifdef RTMP_MAC_USB
+ RTMP_OS_ATMOIC_DESTROY(&pAd->BulkOutRemained);
+ RTMP_OS_ATMOIC_DESTROY(&pAd->BulkInRemained);
+#endif /* RTMP_MAC_USB */
+#endif /* RALINK_ATE */
+
+ RTMP_OS_FREE_TIMER(pAd);
+ RTMP_OS_FREE_LOCK(pAd);
+ RTMP_OS_FREE_TASKLET(pAd);
+ RTMP_OS_FREE_TASK(pAd);
+ RTMP_OS_FREE_SEM(pAd);
+ RTMP_OS_FREE_ATOMIC(pAd);
+
+ RtmpOsVfree(pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); */
+ if (os_cookie)
+ os_free_mem(NULL, os_cookie);
+}
+
+
+int RTMPSendPackets(
+ IN NDIS_HANDLE MiniportAdapterContext,
+ IN PPNDIS_PACKET ppPacketArray,
+ IN UINT NumberOfPackets,
+ IN UINT32 PktTotalLen,
+ IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)MiniportAdapterContext;
+ PNDIS_PACKET pPacket = ppPacketArray[0];
+
+
+ INC_COUNTER64(pAd->WlanCounters.TransmitCountFrmOs);
+
+ if (pPacket == NULL)
+ goto done;
+
+ /* RT2870STA does this in RTMPSendPackets() */
+#ifdef RALINK_ATE
+ if (ATE_ON(pAd))
+ {
+ RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES);
+ return 0;
+ }
+#endif /* RALINK_ATE */
+
+
+ /* EapolStart size is 18 */
+ if (PktTotalLen < 14)
+ {
+ /*printk("bad packet size: %d\n", pkt->len); */
+ hex_dump("bad packet", GET_OS_PKT_DATAPTR(pPacket), PktTotalLen);
+ RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
+ return 0;
+ }
+
+
+
+ RTMP_SET_PACKET_5VT(pPacket, 0);
+/* MiniportMMRequest(pAd, pkt->data, pkt->len); */
+#ifdef CONFIG_5VT_ENHANCE
+ if (*(int*)(GET_OS_PKT_CB(pPacket)) == BRIDGE_TAG) {
+ RTMP_SET_PACKET_5VT(pPacket, 1);
+ }
+#endif
+
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ APSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);
+#endif /* CONFIG_AP_SUPPORT */
+
+
+done:
+ return 0;
+}
+
+
+PNET_DEV get_netdev_from_bssid(
+ IN PRTMP_ADAPTER pAd,
+ IN UCHAR FromWhichBSSID)
+{
+ PNET_DEV dev_p = NULL;
+#ifdef CONFIG_AP_SUPPORT
+ UCHAR infRealIdx;
+#endif /* CONFIG_AP_SUPPORT */
+
+ do
+ {
+#ifdef CONFIG_AP_SUPPORT
+ infRealIdx = FromWhichBSSID & (NET_DEVICE_REAL_IDX_MASK);
+#ifdef APCLI_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)
+ {
+ dev_p = (infRealIdx >= MAX_APCLI_NUM ? NULL : pAd->ApCfg.ApCliTab[infRealIdx].dev);
+ break;
+ }
+#endif /* APCLI_SUPPORT */
+#ifdef WDS_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS)
+ {
+ dev_p = ((infRealIdx >= MAX_WDS_ENTRY) ? NULL : pAd->WdsTab.WdsEntry[infRealIdx].dev);
+ break;
+ }
+#endif /* WDS_SUPPORT */
+
+ if ((FromWhichBSSID > 0) &&
+ (FromWhichBSSID < pAd->ApCfg.BssidNum) &&
+ (FromWhichBSSID < MAX_MBSSID_NUM(pAd)) &&
+ (FromWhichBSSID < HW_BEACON_MAX_NUM))
+ {
+ dev_p = pAd->ApCfg.MBSSID[FromWhichBSSID].MSSIDDev;
+ }
+ else
+#endif /* CONFIG_AP_SUPPORT */
+ {
+ dev_p = pAd->net_dev;
+ }
+
+ } while (FALSE);
+
+ ASSERT(dev_p);
+ return dev_p; /* return one of MBSS */
+}
+
+
+#ifdef CONFIG_AP_SUPPORT
+/*
+========================================================================
+Routine Description:
+ Driver pre-Ioctl for AP.
+
+Arguments:
+ pAdSrc - WLAN control block pointer
+ pCB - the IOCTL parameters
+
+Return Value:
+ NDIS_STATUS_SUCCESS - IOCTL OK
+ Otherwise - IOCTL fail
+
+Note:
+========================================================================
+*/
+INT RTMP_AP_IoctlPrepare(
+ IN RTMP_ADAPTER *pAd,
+ IN VOID *pCB)
+{
+ RT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pCB;
+ POS_COOKIE pObj;
+ USHORT index;
+ INT Status = NDIS_STATUS_SUCCESS;
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+ INT cmd = 0xff;
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+
+ pObj = (POS_COOKIE) pAd->OS_Cookie;
+
+ if((pConfig->priv_flags == INT_MAIN) && !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
+ {
+ if (pConfig->pCmdData == NULL)
+ return Status;
+
+ if (RtPrivIoctlSetVal() == pConfig->CmdId_RTPRIV_IOCTL_SET)
+ {
+ if (TRUE
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+ && (strstr(pConfig->pCmdData, "OpMode") == NULL)
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+#ifdef SINGLE_SKU
+ && (strstr(pConfig->pCmdData, "ModuleTxpower") == NULL)
+#endif /* SINGLE_SKU */
+ )
+
+ {
+ return -ENETDOWN;
+ }
+ }
+ else
+ return -ENETDOWN;
+ }
+
+ /* determine this ioctl command is comming from which interface. */
+ if (pConfig->priv_flags == INT_MAIN)
+ {
+ pObj->ioctl_if_type = INT_MAIN;
+ pObj->ioctl_if = MAIN_MBSSID;
+/* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", pObj->ioctl_if, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */
+ }
+ else if (pConfig->priv_flags == INT_MBSSID)
+ {
+ pObj->ioctl_if_type = INT_MBSSID;
+/* if (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3)) // for multi-physical card, no MBSSID */
+ if (strcmp(pConfig->name, RtmpOsGetNetDevName(pAd->net_dev)) != 0) /* sample */
+ {
+ for (index = 1; index < pAd->ApCfg.BssidNum; index++)
+ {
+ if (pAd->ApCfg.MBSSID[index].MSSIDDev == pConfig->net_dev)
+ {
+ pObj->ioctl_if = index;
+
+/* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", index, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */
+ break;
+ }
+ }
+ /* Interface not found! */
+ if(index == pAd->ApCfg.BssidNum)
+ {
+/* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F\n")); */
+ return -ENETDOWN;
+ }
+ }
+ else /* ioctl command from I/F(ra0) */
+ {
+/* GET_PAD_FROM_NET_DEV(pAd, net_dev); */
+ pObj->ioctl_if = MAIN_MBSSID;
+/* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F and use default: cmd = 0x%08x\n", cmd)); */
+ }
+ MBSS_MR_APIDX_SANITY_CHECK(pAd, pObj->ioctl_if);
+ }
+#ifdef WDS_SUPPORT
+ else if (pConfig->priv_flags == INT_WDS)
+ {
+ pObj->ioctl_if_type = INT_WDS;
+ for(index = 0; index < MAX_WDS_ENTRY; index++)
+ {
+ if (pAd->WdsTab.WdsEntry[index].dev == pConfig->net_dev)
+ {
+ pObj->ioctl_if = index;
+
+ break;
+ }
+
+ if(index == MAX_WDS_ENTRY)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find wds I/F\n"));
+ return -ENETDOWN;
+ }
+ }
+ }
+#endif /* WDS_SUPPORT */
+#ifdef APCLI_SUPPORT
+ else if (pConfig->priv_flags == INT_APCLI)
+ {
+ pObj->ioctl_if_type = INT_APCLI;
+ for (index = 0; index < MAX_APCLI_NUM; index++)
+ {
+ if (pAd->ApCfg.ApCliTab[index].dev == pConfig->net_dev)
+ {
+ pObj->ioctl_if = index;
+
+ break;
+ }
+
+ if(index == MAX_APCLI_NUM)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find Apcli I/F\n"));
+ return -ENETDOWN;
+ }
+ }
+ APCLI_MR_APIDX_SANITY_CHECK(pObj->ioctl_if);
+ }
+#endif /* APCLI_SUPPORT */
+ else
+ {
+/* DBGPRINT(RT_DEBUG_WARN, ("IOCTL is not supported in WDS interface\n")); */
+ return -EOPNOTSUPP;
+ }
+
+ pConfig->apidx = pObj->ioctl_if;
+ return Status;
+}
+
+
+VOID AP_E2PROM_IOCTL_PostCtrl(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq,
+ IN PSTRING msg)
+{
+ wrq->u.data.length = strlen(msg);
+ if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+}
+
+
+VOID IAPP_L2_UpdatePostCtrl(
+ IN PRTMP_ADAPTER pAd,
+ IN UINT8 *mac_p,
+ IN INT bssid)
+{
+}
+#endif /* CONFIG_AP_SUPPORT */
+
+
+#ifdef WDS_SUPPORT
+VOID AP_WDS_KeyNameMakeUp(
+ IN STRING *pKey,
+ IN UINT32 KeyMaxSize,
+ IN INT KeyId)
+{
+ snprintf(pKey, KeyMaxSize, "Wds%dKey", KeyId);
+}
+#endif /* WDS_SUPPORT */
+
+
+