/* * This function dumps the station information on a buffer. * * The following information are shown - * - Total bytes transmitted * - Total bytes received * - Total packets transmitted * - Total packets received * - Signal quality level * - Transmission rate */ static int mwifiex_dump_station_info(struct mwifiex_private *priv, struct station_info *sinfo) { struct mwifiex_ds_get_signal signal; struct mwifiex_rate_cfg rate; int ret = 0; sinfo->filled = STATION_INFO_RX_BYTES | STATION_INFO_TX_BYTES | STATION_INFO_RX_PACKETS | STATION_INFO_TX_PACKETS | STATION_INFO_SIGNAL | STATION_INFO_TX_BITRATE; /* Get signal information from the firmware */ memset(&signal, 0, sizeof(struct mwifiex_ds_get_signal)); if (mwifiex_get_signal_info(priv, &signal)) { dev_err(priv->adapter->dev, "getting signal information\n"); ret = -EFAULT; } if (mwifiex_drv_get_data_rate(priv, &rate)) { dev_err(priv->adapter->dev, "getting data rate\n"); ret = -EFAULT; } sinfo->rx_bytes = priv->stats.rx_bytes; sinfo->tx_bytes = priv->stats.tx_bytes; sinfo->rx_packets = priv->stats.rx_packets; sinfo->tx_packets = priv->stats.tx_packets; sinfo->signal = priv->w_stats.qual.level; sinfo->txrate.legacy = rate.rate; return ret; }
/* * This function dumps the station information on a buffer. * * The following information are shown - * - Total bytes transmitted * - Total bytes received * - Total packets transmitted * - Total packets received * - Signal quality level * - Transmission rate */ static int mwifiex_dump_station_info(struct mwifiex_private *priv, struct station_info *sinfo) { struct mwifiex_ds_get_signal signal; struct mwifiex_rate_cfg rate; int ret = 0; sinfo->filled = STATION_INFO_RX_BYTES | STATION_INFO_TX_BYTES | STATION_INFO_RX_PACKETS | STATION_INFO_TX_PACKETS | STATION_INFO_SIGNAL | STATION_INFO_TX_BITRATE; /* Get signal information from the firmware */ memset(&signal, 0, sizeof(struct mwifiex_ds_get_signal)); if (mwifiex_get_signal_info(priv, &signal)) { dev_err(priv->adapter->dev, "getting signal information\n"); ret = -EFAULT; } if (mwifiex_drv_get_data_rate(priv, &rate)) { dev_err(priv->adapter->dev, "getting data rate\n"); ret = -EFAULT; } /* * Bit 0 in tx_htinfo indicates that current Tx rate is 11n rate. Valid * MCS index values for us are 0 to 7. */ if ((priv->tx_htinfo & BIT(0)) && (priv->tx_rate < 8)) { sinfo->txrate.mcs = priv->tx_rate; sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; /* 40MHz rate */ if (priv->tx_htinfo & BIT(1)) sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; /* SGI enabled */ if (priv->tx_htinfo & BIT(2)) sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; } sinfo->rx_bytes = priv->stats.rx_bytes; sinfo->tx_bytes = priv->stats.tx_bytes; sinfo->rx_packets = priv->stats.rx_packets; sinfo->tx_packets = priv->stats.tx_packets; sinfo->signal = priv->qual_level; /* bit rate is in 500 kb/s units. Convert it to 100kb/s units */ sinfo->txrate.legacy = rate.rate * 5; return ret; }
/* * This function dumps the station information on a buffer. * * The following information are shown - * - Total bytes transmitted * - Total bytes received * - Total packets transmitted * - Total packets received * - Signal quality level * - Transmission rate */ static int mwifiex_dump_station_info(struct mwifiex_private *priv, struct station_info *sinfo) { struct mwifiex_rate_cfg rate; sinfo->filled = STATION_INFO_RX_BYTES | STATION_INFO_TX_BYTES | STATION_INFO_RX_PACKETS | STATION_INFO_TX_PACKETS | STATION_INFO_TX_BITRATE | STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG; /* Get signal information from the firmware */ if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_RSSI_INFO, HostCmd_ACT_GEN_GET, 0, NULL)) { dev_err(priv->adapter->dev, "failed to get signal information\n"); return -EFAULT; } if (mwifiex_drv_get_data_rate(priv, &rate)) { dev_err(priv->adapter->dev, "getting data rate\n"); return -EFAULT; } /* Get DTIM period information from firmware */ mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, HostCmd_ACT_GEN_GET, DTIM_PERIOD_I, &priv->dtim_period); /* * Bit 0 in tx_htinfo indicates that current Tx rate is 11n rate. Valid * MCS index values for us are 0 to 15. */ if ((priv->tx_htinfo & BIT(0)) && (priv->tx_rate < 16)) { sinfo->txrate.mcs = priv->tx_rate; sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; /* 40MHz rate */ if (priv->tx_htinfo & BIT(1)) sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; /* SGI enabled */ if (priv->tx_htinfo & BIT(2)) sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; } sinfo->signal_avg = priv->bcn_rssi_avg; sinfo->rx_bytes = priv->stats.rx_bytes; sinfo->tx_bytes = priv->stats.tx_bytes; sinfo->rx_packets = priv->stats.rx_packets; sinfo->tx_packets = priv->stats.tx_packets; sinfo->signal = priv->bcn_rssi_avg; /* bit rate is in 500 kb/s units. Convert it to 100kb/s units */ sinfo->txrate.legacy = rate.rate * 5; if (priv->bss_mode == NL80211_IFTYPE_STATION) { sinfo->filled |= STATION_INFO_BSS_PARAM; sinfo->bss_param.flags = 0; if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap & WLAN_CAPABILITY_SHORT_PREAMBLE) sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap & WLAN_CAPABILITY_SHORT_SLOT_TIME) sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; sinfo->bss_param.dtim_period = priv->dtim_period; sinfo->bss_param.beacon_interval = priv->curr_bss_params.bss_descriptor.beacon_period; } return 0; }