Files
Linux_Drivers/osdrv/extdrv/wireless/mediatek/mt7603/common/mesh_inf.c
forum_service 213c880673 add driver of tp、wiegand-gpio and wireless
Change-Id: Ie3c11d9d85cf1a05042f5690ac711856fe8b1ad7
2023-12-22 09:56:05 +08:00

321 lines
7.6 KiB
C

/*
***************************************************************************
* Ralink Tech Inc.
* 4F, No. 2 Technology 5th Rd.
* Science-based Industrial Park
* Hsin-chu, Taiwan, R.O.C.
*
* (c) Copyright 2002-2006, 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:
mesh.c
Abstract:
Revision History:
Who When What
-------- ---------- ----------------------------------------------
Fonchi 2007-06-25 For mesh (802.11s) support.
*/
#define RTMP_MODULE_OS
#ifdef MESH_SUPPORT
/*#include "rt_config.h" */
/*#include "mesh_sanity.h" */
#include "rtmp_comm.h"
#include "rt_os_util.h"
#include "rt_os_net.h"
/*static VOID MeshCfgInit(RTMP_ADAPTER *pAd, RTMP_STRING *pHostName); */
/*
========================================================================
Routine Description:
Init Mesh function.
Arguments:
ad_p points to our adapter
main_dev_p points to the main BSS network interface
Return Value:
None
Note:
1. Only create and initialize virtual network interfaces.
2. No main network interface here.
========================================================================
*/
VOID RTMP_Mesh_Init(
IN VOID *pAd,
IN PNET_DEV main_dev_p,
IN RTMP_STRING *pHostName)
{
RTMP_OS_NETDEV_OP_HOOK netDevOpHook;
ULONG OpMode;
/* init operation functions */
NdisZeroMemory((PUCHAR)&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));
netDevOpHook.open = Mesh_VirtualIF_Open;
netDevOpHook.stop = Mesh_VirtualIF_Close;
netDevOpHook.xmit = rt28xx_send_packets;
netDevOpHook.ioctl = rt28xx_ioctl;
/* init operation functions */
RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);
#ifdef CONFIG_STA_SUPPORT
#if WIRELESS_EXT >= 12
if (OpMode == OPMODE_STA)
{
netDevOpHook.iw_handler = (void *)&rt28xx_iw_handler_def;
}
#endif /*WIRELESS_EXT >= 12 */
#endif /* CONFIG_STA_SUPPORT */
#ifdef CONFIG_APSTA_MIXED_SUPPORT
#if WIRELESS_EXT >= 12
if (OpMode == OPMODE_AP)
{
netDevOpHook.iw_handler = &rt28xx_ap_iw_handler_def;
}
#endif /*WIRELESS_EXT >= 12 */
#endif /* CONFIG_APSTA_MIXED_SUPPORT */
RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MESH_INIT,
0, &netDevOpHook, 0);
#ifdef RELEASE_EXCLUDE
DBGPRINT(RT_DEBUG_INFO, ("%s <---\n", __FUNCTION__));
#endif /* RELEASE_EXCLUDE */
}
/*
========================================================================
Routine Description:
Open a virtual network interface.
Arguments:
pDev which WLAN network interface
Return Value:
0: open successfully
otherwise: open fail
Note:
========================================================================
*/
INT Mesh_VirtualIF_Open(
IN PNET_DEV pDev)
{
VOID *pAd;
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
ASSERT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MESH_OPEN_PRE, 0,
pDev, 0) != NDIS_STATUS_SUCCESS)
return -1;
if (VIRTUAL_IF_UP(pAd) != 0)
return -1;
/* increase MODULE use count */
RT_MOD_INC_USE_COUNT();
RTMP_OS_NETDEV_START_QUEUE(pDev);
if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MESH_OPEN_POST, 0,
pDev, 0) != NDIS_STATUS_SUCCESS)
return -1;
#if 0 /* os abl move */
if (ADHOC_ON(pAd))
return -1;
pAd->MeshTab.bcn_buf.bBcnSntReq = TRUE;
if (VIRTUAL_IF_UP(pAd) != 0)
return -1;
/* increase MODULE use count */
RT_MOD_INC_USE_COUNT();
RTMP_OS_NETDEV_START_QUEUE(dev_p);
/* Statup Mesh Protocol Stack. */
MeshUp(pAd);
#ifdef CONFIG_STA_SUPPORT
AsicSetPreTbtt(pAd, TRUE);
AsicEnableMESHSync(pAd);
#endif /* CONFIG_STA_SUPPORT */
#endif /* 0 */
DBGPRINT(RT_DEBUG_TRACE, ("%s: <=== %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
return 0;
}
/*
========================================================================
Routine Description:
Close a virtual network interface.
Arguments:
dev_p which WLAN network interface
Return Value:
0: close successfully
otherwise: close fail
Note:
========================================================================
*/
INT Mesh_VirtualIF_Close(
IN PNET_DEV pDev)
{
VOID *pAd;
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
ASSERT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
/* stop mesh. */
RTMP_OS_NETDEV_STOP_QUEUE(pDev);
RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MESH_CLOSE, 0, pDev, 0);
#if 0 /* os abl move */
MeshDown(pAd, TRUE);
pAd->MeshTab.bcn_buf.bBcnSntReq = FALSE;
#ifdef CONFIG_STA_SUPPORT
/* Disable pre-tbtt interrupt */
AsicSetPreTbtt(pAd, FALSE);
/*update beacon Sync */
/*if rausb0 is up => stop beacon */
/*if rausb0 is down => we will call AsicDisableSync() in usb_rtusb_close_device() */
if (INFRA_ON(pAd))
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
else if (ADHOC_ON(pAd))
AsicEnableIbssSync(pAd);
else
AsicDisableSync(pAd);
#endif /* CONFIG_STA_SUPPORT */
pAd->MeshTab.bcn_buf.bBcnSntReq = FALSE;
#ifdef CONFIG_AP_SUPPORT
APMakeAllBssBeacon(pAd);
APUpdateAllBeaconFrame(pAd);
#endif /* CONFIG_AP_SUPPORT */
#endif /* 0 */
VIRTUAL_IF_DOWN(pAd);
RT_MOD_DEC_USE_COUNT();
return 0;
}
#if 0 /* os abl move to common/mesh.c */
VOID MeshCfgInit(RTMP_ADAPTER *pAd, RTMP_STRING *pHostName)
{
INT i;
/* default configuration of Mesh. */
pAd->MeshTab.OpMode = MESH_MP;
#ifdef CONFIG_AP_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
pAd->MeshTab.OpMode |= MESH_AP;
#endif /* CONFIG_AP_SUPPORT */
pAd->MeshTab.PathProtocolId = MESH_HWMP;
pAd->MeshTab.PathMetricId = MESH_AIRTIME;
pAd->MeshTab.ContgesionCtrlId = NULL_PROTOCOL;
pAd->MeshTab.TTL = MESH_TTL;
pAd->MeshTab.MeshMaxTxRate = 0;
pAd->MeshTab.MeshMultiCastAgeOut = MULTIPATH_AGEOUT;
pAd->MeshTab.UCGEnable = FALSE;
pAd->MeshTab.MeshCapability.field.Forwarding = 1;
if (pAd->MeshTab.MeshIdLen == 0)
{
pAd->MeshTab.MeshIdLen = strlen(DEFAULT_MESH_ID);
NdisMoveMemory(pAd->MeshTab.MeshId, DEFAULT_MESH_ID, pAd->MeshTab.MeshIdLen);
}
/* initialize state */
pAd->MeshTab.EasyMeshSecurity = TRUE; /* Default is TRUE for CMPC */
pAd->MeshTab.bInitialMsaDone = FALSE;
pAd->MeshTab.bKeyholderDone = FALSE;
pAd->MeshTab.bConnectedToMKD = FALSE;
pAd->MeshTab.MeshOnly = FALSE;
pAd->MeshTab.bAutoTxRateSwitch = TRUE;
pAd->MeshTab.DesiredTransmitSetting.field.MCS = MCS_AUTO;
for (i = 0; i < MAX_MESH_LINKS; i++)
NdisZeroMemory(&pAd->MeshTab.MeshLink[i].Entry, sizeof(MESH_LINK_ENTRY));
if (strlen(pHostName) > 0)
{
if (strlen(pHostName) < MAX_HOST_NAME_LEN)
strcpy((RTMP_STRING *) pAd->MeshTab.HostName, pHostName);
else
strncpy((RTMP_STRING *) pAd->MeshTab.HostName, pHostName, MAX_HOST_NAME_LEN-1);
}
else
strcpy((RTMP_STRING *) pAd->MeshTab.HostName, DEFAULT_MESH_HOST_NAME);
}
#endif /* 0 */
#ifdef LINUX
#if (WIRELESS_EXT >= 12)
struct iw_statistics *Mesh_VirtualIF_get_wireless_stats(
IN struct net_device *net_dev);
#endif
#endif /* LINUX */
VOID RTMP_Mesh_Remove(
IN VOID *pAd)
{
#ifdef RELEASE_EXCLUDE
DBGPRINT(RT_DEBUG_INFO, ("%s --->\n", __FUNCTION__));
#endif /* RELEASE_EXCLUDE */
RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MESH_REMOVE, 0, NULL, 0);
#ifdef RELEASE_EXCLUDE
DBGPRINT(RT_DEBUG_INFO, ("%s <---\n", __FUNCTION__));
#endif /* RELEASE_EXCLUDE */
}
#endif /* MESH_SUPPORT */