static A_BOOL rcIsValidPhyRate(A_UINT32 phy, A_UINT32 capflag, A_BOOL ignoreCW) { if (WLAN_RC_PHY_HT(phy) && !(capflag & WLAN_RC_HT_FLAG)) { return FALSE; } if (WLAN_RC_PHY_DS(phy) && !(capflag & WLAN_RC_DS_FLAG)) { return FALSE; } if (WLAN_RC_PHY_SGI(phy) && !(capflag & WLAN_RC_HT40_SGI_FLAG)) { return FALSE; } if (!ignoreCW && WLAN_RC_PHY_HT(phy)) { if (WLAN_RC_PHY_40(phy) && !(capflag & WLAN_RC_40_FLAG)) { return FALSE; } if (!WLAN_RC_PHY_40(phy) && (capflag & WLAN_RC_40_FLAG)) { return FALSE; } } return TRUE; }
static void rcRateSetseries(const RATE_TABLE_11N *pRateTable , struct ath_rc_series *series, A_UINT8 tries, A_UINT8 rix, A_BOOL rtsctsenable, A_UINT32 chainmask,int stbc) { series->tries = tries; series->flags = (rtsctsenable? ATH_RC_RTSCTS_FLAG : 0) | (WLAN_RC_PHY_DS(pRateTable->info[rix].phy) ? ATH_RC_DS_FLAG : 0) | (WLAN_RC_PHY_40(pRateTable->info[rix].phy) ? ATH_RC_CW40_FLAG : 0) | (WLAN_RC_PHY_SGI(pRateTable->info[rix].phy) ? ATH_RC_HT40_SGI_FLAG : 0); #ifdef MAGPIE_MERLIN if (stbc) { /* For now, only single stream STBC is supported */ if (pRateTable->info[rix].rateCode >= 0x80 && pRateTable->info[rix].rateCode <= 0x87) { series->flags |= ATH_RC_TX_STBC_FLAG; } } #endif series->rix = pRateTable->info[rix].baseIndex; series->max4msframelen = pRateTable->info[rix].max4msframelen; series->txrateKbps = pRateTable->info[rix].rateKbps; /* If the hardware is capable of multiple transmit chains (chainmask is 3, 5 or 7), * then choose the number of transmit chains dynamically based on entries in the rate table. */ #ifndef ATH_ENABLE_WLAN_FOR_K2 if(chainmask == 7) series->tx_chainmask = pRateTable->info[rix].txChainMask_3ch; else if(chainmask == 1) series->tx_chainmask = 1; else series->tx_chainmask = pRateTable->info[rix].txChainMask_2ch; /*Chainmask is 3 or 5*/ #else series->tx_chainmask = 1; #endif }
static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { struct ath_softc *sc = file->private_data; char *buf; unsigned int len = 0, max; int i = 0; ssize_t retval; if (sc->cur_rate_table == NULL) return 0; max = 80 + sc->cur_rate_table->rate_cnt * 1024; buf = kmalloc(max + 1, GFP_KERNEL); if (buf == NULL) return 0; buf[max] = 0; len += sprintf(buf, "%6s %6s %6s " "%10s %10s %10s %10s\n", "HT", "MCS", "Rate", "Success", "Retries", "XRetries", "PER"); for (i = 0; i < sc->cur_rate_table->rate_cnt; i++) { u32 ratekbps = sc->cur_rate_table->info[i].ratekbps; struct ath_rc_stats *stats = &sc->debug.stats.rcstats[i]; char mcs[5]; char htmode[5]; int used_mcs = 0, used_htmode = 0; if (WLAN_RC_PHY_HT(sc->cur_rate_table->info[i].phy)) { used_mcs = snprintf(mcs, 5, "%d", sc->cur_rate_table->info[i].ratecode); if (WLAN_RC_PHY_40(sc->cur_rate_table->info[i].phy)) used_htmode = snprintf(htmode, 5, "HT40"); else if (WLAN_RC_PHY_20(sc->cur_rate_table->info[i].phy)) used_htmode = snprintf(htmode, 5, "HT20"); else used_htmode = snprintf(htmode, 5, "????"); } mcs[used_mcs] = '\0'; htmode[used_htmode] = '\0'; len += snprintf(buf + len, max - len, "%6s %6s %3u.%d: " "%10u %10u %10u %10u\n", htmode, mcs, ratekbps / 1000, (ratekbps % 1000) / 100, stats->success, stats->retries, stats->xretries, stats->per); } retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); kfree(buf); return retval; }