Beispiel #1
0
int
mtk_cfg80211_get_station (
    struct wiphy *wiphy,
    struct net_device *ndev,
    u8 *mac,
    struct station_info *sinfo
)
{
    P_GLUE_INFO_T prGlueInfo = NULL;
    WLAN_STATUS rStatus;
    PARAM_MAC_ADDRESS arBssid;
    UINT_32 u4BufLen, u4Rate;
    INT_32 i4Rssi;

    prGlueInfo = (P_GLUE_INFO_T) wiphy_priv(wiphy);
    ASSERT(prGlueInfo);

    kalMemZero(arBssid, MAC_ADDR_LEN);
    wlanQueryInformation(prGlueInfo->prAdapter,
                         wlanoidQueryBssid,
                         &arBssid[0],
                         sizeof(arBssid),
                         &u4BufLen);

    /* 1. check BSSID */
    if(UNEQUAL_MAC_ADDR(arBssid, mac)) {
        /* wrong MAC address */
        DBGLOG(REQ, WARN, ("incorrect BSSID: ["MACSTR"] currently connected BSSID["MACSTR"]\n",
                           MAC2STR(mac), MAC2STR(arBssid)));
        return -ENOENT;
    }

    /* 2. fill TX rate */
    rStatus = kalIoctl(prGlueInfo,
                       wlanoidQueryLinkSpeed,
                       &u4Rate,
                       sizeof(u4Rate),
                       TRUE,
                       FALSE,
                       FALSE,
                       FALSE,
                       &u4BufLen);

    if (rStatus != WLAN_STATUS_SUCCESS) {
        DBGLOG(REQ, WARN, ("unable to retrieve link speed\n"));
    }
    else {
        sinfo->filled |= STATION_INFO_TX_BITRATE;
        sinfo->txrate.legacy = u4Rate / 1000; /* convert from 100bps to 100kbps */
    }

    if(prGlueInfo->eParamMediaStateIndicated != PARAM_MEDIA_STATE_CONNECTED) {
        /* not connected */
        DBGLOG(REQ, WARN, ("not yet connected\n"));
    }
    else {
        /* 3. fill RSSI */
        rStatus = kalIoctl(prGlueInfo,
                           wlanoidQueryRssi,
                           &i4Rssi,
                           sizeof(i4Rssi),
                           TRUE,
                           FALSE,
                           FALSE,
                           FALSE,
                           &u4BufLen);

        if (rStatus != WLAN_STATUS_SUCCESS) {
            DBGLOG(REQ, WARN, ("unable to retrieve link speed\n"));
        }
        else {
            sinfo->filled |= STATION_INFO_SIGNAL;
            //in the cfg80211 layer, the signal is a signed char variable.
            if(i4Rssi < -128)
                sinfo->signal = -128;
            else
                sinfo->signal = i4Rssi; /* dBm */
        }
    }

    /* scott.chiang@20130405, refer to 6628's gl_cfg80211.c - made by Zhang.Luo */

    sinfo->rx_packets = prGlueInfo->rNetDevStats.rx_packets;
    sinfo->filled |= STATION_INFO_TX_PACKETS;
    sinfo->tx_packets = prGlueInfo->rNetDevStats.tx_packets;
    sinfo->filled |= STATION_INFO_TX_FAILED;

#if 1
    {
        WLAN_STATUS rStatus;
        UINT_32 u4XmitError = 0;
//           UINT_32 u4XmitOk = 0;
//          UINT_32 u4RecvError = 0;
//           UINT_32 u4RecvOk = 0;
//           UINT_32 u4BufLen;

        /* @FIX ME: need a more clear way to do this */


        rStatus = kalIoctl(prGlueInfo,
                           wlanoidQueryXmitError,
                           &u4XmitError,
                           sizeof(UINT_32),
                           TRUE,
                           TRUE,
                           TRUE,
                           FALSE,
                           &u4BufLen);

        prGlueInfo->rNetDevStats.tx_errors = u4XmitError;

    }
#else
    prGlueInfo->rNetDevStats.tx_errors = 0;
#endif

    sinfo->tx_failed = prGlueInfo->rNetDevStats.tx_errors;

    return 0;
}
int
mtk_cfg80211_get_station (
    struct wiphy *wiphy,
    struct net_device *ndev,
    u8 *mac,
    struct station_info *sinfo
    )
{
    P_GLUE_INFO_T prGlueInfo = NULL;
    WLAN_STATUS rStatus;
    PARAM_MAC_ADDRESS arBssid;
    UINT_32 u4BufLen, u4Rate;
    INT_32 i4Rssi;

    prGlueInfo = (P_GLUE_INFO_T) wiphy_priv(wiphy);
    ASSERT(prGlueInfo);

    kalMemZero(arBssid, MAC_ADDR_LEN);
    wlanQueryInformation(prGlueInfo->prAdapter,
            wlanoidQueryBssid,
            &arBssid[0],
            sizeof(arBssid),
            &u4BufLen);

    /* 1. check BSSID */
    if(UNEQUAL_MAC_ADDR(arBssid, mac)) {
        /* wrong MAC address */
        DBGLOG(REQ, WARN, ("incorrect BSSID: ["MACSTR"] currently connected BSSID["MACSTR"]\n", 
                    MAC2STR(mac), MAC2STR(arBssid)));
        return -ENOENT;
    }

    /* 2. fill TX rate */
    rStatus = kalIoctl(prGlueInfo,
        wlanoidQueryLinkSpeed,
        &u4Rate,
        sizeof(u4Rate),
        TRUE,
        FALSE,
        FALSE,
        FALSE,
        &u4BufLen);

    if (rStatus != WLAN_STATUS_SUCCESS) {
        DBGLOG(REQ, WARN, ("unable to retrieve link speed\n"));
    }
    else {
        sinfo->filled |= STATION_INFO_TX_BITRATE;
        sinfo->txrate.legacy = u4Rate / 1000; /* convert from 100bps to 100kbps */
    }

    if(prGlueInfo->eParamMediaStateIndicated != PARAM_MEDIA_STATE_CONNECTED) {
        /* not connected */
        DBGLOG(REQ, WARN, ("not yet connected\n"));
    }
    else {
        /* 3. fill RSSI */
        rStatus = kalIoctl(prGlueInfo,
                wlanoidQueryRssi,
                &i4Rssi,
                sizeof(i4Rssi),
                TRUE,
                FALSE,
                FALSE,
                FALSE,
                &u4BufLen);
        
        if (rStatus != WLAN_STATUS_SUCCESS) {
            DBGLOG(REQ, WARN, ("unable to retrieve link speed\n"));
        }
        else {
            sinfo->filled |= STATION_INFO_SIGNAL;
            sinfo->signal = i4Rssi; /* dBm */
        }
    }

    return 0;
}
Beispiel #3
0
/*----------------------------------------------------------------------------*/
static WLAN_STATUS
reqExtQueryConfiguration (
    IN  P_GLUE_INFO_T   prGlueInfo,
    OUT PVOID           pvQueryBuffer,
    IN UINT_32          u4QueryBufferLen,
    OUT PUINT_32        pu4QueryInfoLen
    )
{
    P_PARAM_802_11_CONFIG_T prQueryConfig = (P_PARAM_802_11_CONFIG_T)pvQueryBuffer;
    WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
    UINT_32 u4QueryInfoLen = 0;

    DEBUGFUNC("wlanoidQueryConfiguration");


    ASSERT(prGlueInfo);
    ASSERT(pu4QueryInfoLen);

    *pu4QueryInfoLen = sizeof(PARAM_802_11_CONFIG_T);
    if (u4QueryBufferLen < sizeof(PARAM_802_11_CONFIG_T)) {
        return WLAN_STATUS_INVALID_LENGTH;
    }

    ASSERT(pvQueryBuffer);

    kalMemZero(prQueryConfig, sizeof(PARAM_802_11_CONFIG_T));

    /* Update the current radio configuration. */
    prQueryConfig->u4Length = sizeof(PARAM_802_11_CONFIG_T);

#if defined(_HIF_SDIO)
    rStatus = sdio_io_ctrl(prGlueInfo,
                            wlanoidSetBeaconInterval,
                            &prQueryConfig->u4BeaconPeriod,
                            sizeof(UINT_32),
                            TRUE,
                            TRUE,
                            &u4QueryInfoLen);
#else
    rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                                   wlanoidQueryBeaconInterval,
                                   &prQueryConfig->u4BeaconPeriod,
                                   sizeof(UINT_32),
                                   &u4QueryInfoLen);
#endif
    if (rStatus != WLAN_STATUS_SUCCESS) {
        return rStatus;
    }

#if defined(_HIF_SDIO)
    rStatus = sdio_io_ctrl(prGlueInfo,
                            wlanoidQueryAtimWindow,
                            &prQueryConfig->u4ATIMWindow,
                            sizeof(UINT_32),
                            TRUE,
                            TRUE,
                            &u4QueryInfoLen);
#else
    rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                                   wlanoidQueryAtimWindow,
                                   &prQueryConfig->u4ATIMWindow,
                                   sizeof(UINT_32),
                                   &u4QueryInfoLen);
#endif
    if (rStatus != WLAN_STATUS_SUCCESS) {
        return rStatus;
    }

#if defined(_HIF_SDIO)
    rStatus = sdio_io_ctrl(prGlueInfo,
                            wlanoidQueryFrequency,
                            &prQueryConfig->u4DSConfig,
                            sizeof(UINT_32),
                            TRUE,
                            TRUE,
                            &u4QueryInfoLen);
#else
    rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                                   wlanoidQueryFrequency,
                                   &prQueryConfig->u4DSConfig,
                                   sizeof(UINT_32),
                                   &u4QueryInfoLen);
#endif
    if (rStatus != WLAN_STATUS_SUCCESS) {
        return rStatus;
    }

    prQueryConfig->rFHConfig.u4Length = sizeof(PARAM_802_11_CONFIG_FH_T);

    return rStatus;

} /* end of reqExtQueryConfiguration() */
Beispiel #4
0
/*----------------------------------------------------------------------------*/
int
priv_get_int (
    IN struct net_device *prNetDev,
    IN struct iw_request_info *prIwReqInfo,
    IN union iwreq_data *prIwReqData,
    IN OUT char *pcExtra
    )
{
    UINT_32 u4SubCmd = 0;
    PUINT_32 pu4IntBuf = NULL;

    P_GLUE_INFO_T prGlueInfo = NULL;
    WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
    UINT_32 u4BufLen = 0;

    ASSERT(prNetDev);
    //ASSERT(prIwReqInfo);
    ASSERT(prIwReqData);
    ASSERT(pcExtra);
    if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
        return -EINVAL;
    }
    prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);

    u4SubCmd = (UINT_32)prIwReqData->mode;
    pu4IntBuf = (PUINT_32)pcExtra;

    switch (u4SubCmd) {
    case PRIV_CMD_BEACON_PERIOD:
        rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                             wlanoidQueryBeaconInterval,
                             (PVOID)pu4IntBuf,
                             sizeof(UINT_32),
                             &u4BufLen);
        break;

    case PRIV_CMD_ROAMING:
        rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                             wlanoidQueryRoamingFunction,
                             (PVOID)pu4IntBuf,
                             sizeof(UINT_32),
                             &u4BufLen);
        break;

    case PRIV_CMD_VOIP_DELAY:
        rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                             wlanoidQueryVoipConnectionStatus,
                             (PVOID)pu4IntBuf,
                             sizeof(UINT_32),
                             &u4BufLen);
        break;

    case PRIV_CMD_POWER_MODE:
        rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                             wlanoidQuery802dot11PowerSaveProfile,
                             (PVOID)pu4IntBuf,
                             sizeof(UINT_32),
                             &u4BufLen);
        break;

    case PRIV_CMD_ADHOC_MODE:
        rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                             wlanoidQueryAdHocMode,
                             (PVOID)pu4IntBuf,
                             sizeof(UINT_32),
                             &u4BufLen);
        break;

    case PRIV_CUSTOM_SINGLE_ANTENNA:
        printk(KERN_NOTICE "single ant \n");
        rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
                             wlanoidQueryAdHocMode,
                             (PVOID)pu4IntBuf,
                             sizeof(UINT_32),
                             &u4BufLen);
        break;
    default:
        return -EOPNOTSUPP;
    }

    return 0;
} /* priv_get_int */
Beispiel #5
0
/*----------------------------------------------------------------------------*/
static int
priv_get_ndis (
    IN struct net_device *prNetDev,
    IN NDIS_TRANSPORT_STRUCT* prNdisReq,
    OUT PUINT_32 pu4OutputLen
    )
{
    P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
    UINT_32 u4BufLen = 0;
    WLAN_STATUS status = WLAN_STATUS_SUCCESS;
    P_GLUE_INFO_T prGlueInfo = NULL;

    ASSERT(prNetDev);
    ASSERT(prNdisReq);
    ASSERT(pu4OutputLen);

    if (!prNetDev || !prNdisReq || !pu4OutputLen) {
        printk(KERN_INFO DRV_NAME "priv_get_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
            prNetDev, prNdisReq, pu4OutputLen);
        return -EINVAL;
    }

    prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
    ASSERT(prGlueInfo);
    if (!prGlueInfo) {
        printk(KERN_INFO DRV_NAME "priv_get_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
            prNetDev, netdev_priv(prNetDev));
        return -EINVAL;
    }

#if 0
    printk(KERN_INFO DRV_NAME"priv_get_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
        prNdisReq->ndisOidCmd
        );
#endif

    if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
                                            &prWlanReqEntry)) {
        WARNLOG(("Query OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
        return -EOPNOTSUPP;
    }

    if (NULL == prWlanReqEntry->pfOidQueryHandler) {
        WARNLOG(("Query %s: Null query handler\n", prWlanReqEntry->pucOidName));
        return -EOPNOTSUPP;
    }

#if 0
    printk(KERN_INFO DRV_NAME"priv_get_ndis(): %s\n",
        prWlanReqEntry->pucOidName
        );
#endif

    if (prWlanReqEntry->fgQryBufLenChecking) {
        if (prNdisReq->inNdisOidlength < prWlanReqEntry->u4InfoBufLen) {
            /* Not enough room in InformationBuffer. Punt */
            WARNLOG(("Query %s: Buffer too short (current=%ld, needed=%ld)\n",
                prWlanReqEntry->pucOidName,
                prNdisReq->inNdisOidlength,
                prWlanReqEntry->u4InfoBufLen));

            *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;

            status = WLAN_STATUS_INVALID_LENGTH;
            return -EINVAL;
        }
    }

    if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
        /* GLUE sw info only */
        status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
                                                    prNdisReq->ndisOidContent,
                                                    prNdisReq->inNdisOidlength,
                                                    &u4BufLen);
    }
    else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
        /* multiple sw operations */
        status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
                                                    prNdisReq->ndisOidContent,
                                                    prNdisReq->inNdisOidlength,
                                                    &u4BufLen);
    }
    else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
        /* driver core*/
#if defined(_HIF_SDIO)
        status = sdio_io_ctrl(prGlueInfo,
            (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
            prNdisReq->ndisOidContent,
            prNdisReq->inNdisOidlength,
            TRUE,
            TRUE,
            &u4BufLen);
#else
        status = wlanQueryInformation(prGlueInfo->prAdapter,
            (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
            prNdisReq->ndisOidContent,
            prNdisReq->inNdisOidlength,
            &u4BufLen);
#endif
    }
    else {
        printk(KERN_INFO DRV_NAME
            "priv_set_ndis(): unsupported OID method:0x%x\n",
            prWlanReqEntry->eOidMethod);
        return -EOPNOTSUPP;
    }

    *pu4OutputLen = u4BufLen;

    switch (status) {
    case WLAN_STATUS_SUCCESS:
        break;

    case WLAN_STATUS_INVALID_LENGTH:
        WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
            prWlanReqEntry->pucOidName,
            prNdisReq->inNdisOidlength,
            u4BufLen));
        break;
    }

    if (WLAN_STATUS_SUCCESS != status) {
        return -EOPNOTSUPP;
    }

    return 0;
} /* priv_get_ndis */