/* ======================================================================== Routine Description: Close a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: close successfully otherwise: close fail Note: ======================================================================== */ INT MBSS_VirtualIF_Close( IN PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_close\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev))); pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; RTMP_OS_NETDEV_STOP_QUEUE(pDev); /* kick out all stas behind the Bss */ MbssKickOutStas(pAd, BssId, REASON_DISASSOC_INACTIVE); pAd->ApCfg.MBSSID[BssId].bBcnSntReq = FALSE; APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); VIRTUAL_IF_DOWN(pAd); RT_MOD_DEC_USE_COUNT(); return 0; } /* End of MBSS_VirtualIF_Close */
/* ======================================================================== Routine Description: Close a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: close successfully otherwise: close fail Note: ======================================================================== */ INT MBSS_Close(PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; RTMP_OS_NETDEV_STOP_QUEUE(pDev); /* kick out all stas behind the Bss */ MbssKickOutStas(pAd, BssId, REASON_DISASSOC_INACTIVE); pAd->ApCfg.MBSSID[BssId].bBcnSntReq = FALSE; APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); #ifdef MESH_SUPPORT MeshMakeBeacon(pAd, MESH_BEACON_IDX(pAd)); MeshUpdateBeaconFrame(pAd, MESH_BEACON_IDX(pAd)); #endif /* MESH_SUPPORT */ return 0; }
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT MBSS_VirtualIF_Open( IN PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev))); pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; pAd->ApCfg.MBSSID[BssId].bBcnSntReq = TRUE; if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_OS_NETDEV_START_QUEUE(pDev); return 0; } /* End of MBSS_VirtualIF_Open */
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT MBSS_Open(PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; pAd->ApCfg.MBSSID[BssId].bBcnSntReq = TRUE; return 0; }
INT mbss_cr_disable(PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; UINT32 Value; UCHAR loop = 0; BOOLEAN any_mbss_enable = FALSE; UINT32 bssid_reg_base = LPON_SBTOR1; pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; if (pAd->chipCap.hif_type != HIF_MT) return 0; for (loop = 1; loop < pAd->ApCfg.BssidNum; loop++) { if (loop == BssId) continue;//skip itself. if (pAd->ApCfg.MBSSID[loop].bcn_buf.bBcnSntReq == TRUE) any_mbss_enable = TRUE; } if (BssId >= 1) { RTMP_IO_READ32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), &Value); Value = 0; Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK; Value |= SUB_BSSID0_TIME_OFFSET_n(BssId * (20 + 4096)); Value &= ~TBTT0_n_INT_EN; Value &= ~PRE_TBTT0_n_INT_EN; if (any_mbss_enable == TRUE) Value |= SBSS_TBTT0_TSF0_EN; else Value &= ~SBSS_TBTT0_TSF0_EN; RTMP_IO_WRITE32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), Value); RTMP_IO_READ32(pAd, ARB_BCNQCR0, &Value); Value &= ~(0x1 << (BssId+15)); RTMP_IO_WRITE32(pAd, ARB_BCNQCR0, Value); } return 0; }
INT32 mbss_cr_enable(PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; UINT32 Value = 0; //register for sub Bssid start from 0x603000a0 UINT32 bssid_reg_base = LPON_SBTOR1; pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); printk("##### %s, BssId = %d\n", __func__, BssId); if (BssId < 0) return -1; if (pAd->chipCap.hif_type != HIF_MT) return 0; if (BssId >= 1) { //if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. RTMP_IO_READ32(pAd, bssid_reg_base, &Value); Value |= SBSS_TBTT0_TSF0_EN; RTMP_IO_WRITE32(pAd, bssid_reg_base, Value); RTMP_IO_READ32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), &Value); Value = 0; Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK; Value |= SUB_BSSID0_TIME_OFFSET_n(BssId * (20 + 4096)); /* SIFS time, 20us, and assume bcn len is 512 byte, tx by 1Mbps.*/ Value |= TBTT0_n_INT_EN; Value |= PRE_TBTT0_n_INT_EN; Value |= SBSS_TBTT0_TSF0_EN; RTMP_IO_WRITE32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), Value); /* Start Beacon Queue */ RTMP_IO_READ32(pAd, ARB_BCNQCR0, &Value); Value |= (0x1 << (BssId+15)); RTMP_IO_WRITE32(pAd, ARB_BCNQCR0, Value); } return 0; }
/* ======================================================================== Routine Description: Open a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT MBSS_Open(PNET_DEV pDev) { PRTMP_ADAPTER pAd; INT BssId; pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; #ifdef AIRPLAY_SUPPORT if (AIRPLAY_ON(pAd)) pAd->ApCfg.MBSSID[BssId].bBcnSntReq = TRUE; else pAd->ApCfg.MBSSID[BssId].bBcnSntReq = FALSE; #else pAd->ApCfg.MBSSID[BssId].bBcnSntReq = TRUE; #endif /* AIRPLAY_SUPPORT */ return 0; }
/* ======================================================================== Routine Description: Close a virtual network interface. Arguments: pDev which WLAN network interface Return Value: 0: close successfully otherwise: close fail Note: ======================================================================== */ int MBSS_Close( IN PNET_DEV pDev) { PRTMP_ADAPTER pAd; int BssId; pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); BssId = RT28xx_MBSS_IdxGet(pAd, pDev); if (BssId < 0) return -1; RTMP_OS_NETDEV_STOP_QUEUE(pDev); /* kick out all stas behind the Bss */ MbssKickOutStas(pAd, BssId, REASON_DISASSOC_INACTIVE); pAd->ApCfg.MBSSID[BssId].bBcnSntReq = FALSE; APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); return 0; }