static int fill_rx_stats(struct ieee80211_rx_stats *stats, const struct rx_status **pstatus, struct zd_mac *mac, const u8 *buffer, unsigned int length) { const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); if (status->frame_status & ZD_RX_ERROR) { /* FIXME: update? */ return -EINVAL; } memset(stats, 0, sizeof(struct ieee80211_rx_stats)); stats->len = length - (ZD_PLCP_HEADER_SIZE + IEEE80211_FCS_LEN + + sizeof(struct rx_status)); /* FIXME: 802.11a */ stats->freq = IEEE80211_24GHZ_BAND; stats->received_channel = _zd_chip_get_channel(&mac->chip); stats->rssi = zd_rx_strength_percent(status->signal_strength); stats->signal = zd_rx_qual_percent(buffer, length - sizeof(struct rx_status), status); stats->mask = IEEE80211_STATMASK_RSSI | IEEE80211_STATMASK_SIGNAL; stats->rate = zd_rx_rate(buffer, status); if (stats->rate) stats->mask |= IEEE80211_STATMASK_RATE; return 0; }
static int fill_rx_stats(struct ieee80211_rx_stats *stats, const struct rx_status **pstatus, struct zd_mac *mac, const u8 *buffer, unsigned int length) { const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); if (status->frame_status & ZD_RX_ERROR) { struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); ieee->stats.rx_errors++; if (status->frame_status & ZD_RX_TIMEOUT_ERROR) ieee->stats.rx_missed_errors++; else if (status->frame_status & ZD_RX_FIFO_OVERRUN_ERROR) ieee->stats.rx_fifo_errors++; else if (status->frame_status & ZD_RX_DECRYPTION_ERROR) ieee->ieee_stats.rx_discards_undecryptable++; else if (status->frame_status & ZD_RX_CRC32_ERROR) { ieee->stats.rx_crc_errors++; ieee->ieee_stats.rx_fcs_errors++; } else if (status->frame_status & ZD_RX_CRC16_ERROR) ieee->stats.rx_crc_errors++; return -EINVAL; } memset(stats, 0, sizeof(struct ieee80211_rx_stats)); stats->len = length - (ZD_PLCP_HEADER_SIZE + IEEE80211_FCS_LEN + + sizeof(struct rx_status)); /* FIXME: 802.11a */ stats->freq = IEEE80211_24GHZ_BAND; stats->received_channel = _zd_chip_get_channel(&mac->chip); stats->rssi = zd_rx_strength_percent(status->signal_strength); stats->signal = zd_rx_qual_percent(buffer, length - sizeof(struct rx_status), status); stats->mask = IEEE80211_STATMASK_RSSI | IEEE80211_STATMASK_SIGNAL; stats->rate = zd_rx_rate(buffer, status); if (stats->rate) stats->mask |= IEEE80211_STATMASK_RATE; return 0; }