···11911191 */11921192 if (hw_tu >= sc->nexttbtt)11931193 ath5k_beacon_update_timers(sc, bc_tstamp);11941194+11951195+ /* Check if the beacon timers are still correct, because a TSF11961196+ * update might have created a window between them - for a11971197+ * longer description see the comment of this function: */11981198+ if (!ath5k_hw_check_beacon_timers(sc->ah, sc->bintval)) {11991199+ ath5k_beacon_update_timers(sc, bc_tstamp);12001200+ ATH5K_DBG_UNLIMIT(sc, ATH5K_DEBUG_BEACON,12011201+ "fixed beacon timers after beacon receive\n");12021202+ }11941203 }11951204}11961205···18861877 hw_tsf = ath5k_hw_get_tsf64(ah);18871878 hw_tu = TSF_TO_TU(hw_tsf);1888187918891889-#define FUDGE 318901890- /* we use FUDGE to make sure the next TBTT is ahead of the current TU */18801880+#define FUDGE AR5K_TUNE_SW_BEACON_RESP + 318811881+ /* We use FUDGE to make sure the next TBTT is ahead of the current TU.18821882+ * Since we later substract AR5K_TUNE_SW_BEACON_RESP (10) in the timer18831883+ * configuration we need to make sure it is bigger than that. */18841884+18911885 if (bc_tsf == -1) {18921886 /*18931887 * no beacons received, called internally.
+58
drivers/net/wireless/ath/ath5k/debug.c
···483483 .owner = THIS_MODULE,484484};485485486486+/* debugfs: misc */487487+488488+static ssize_t read_file_misc(struct file *file, char __user *user_buf,489489+ size_t count, loff_t *ppos)490490+{491491+ struct ath5k_softc *sc = file->private_data;492492+ char buf[700];493493+ unsigned int len = 0;494494+ u32 filt = ath5k_hw_get_rx_filter(sc->ah);495495+496496+ len += snprintf(buf+len, sizeof(buf)-len, "bssid-mask: %pM\n",497497+ sc->bssidmask);498498+ len += snprintf(buf+len, sizeof(buf)-len, "filter-flags: 0x%x ",499499+ filt);500500+ if (filt & AR5K_RX_FILTER_UCAST)501501+ len += snprintf(buf+len, sizeof(buf)-len, " UCAST");502502+ if (filt & AR5K_RX_FILTER_MCAST)503503+ len += snprintf(buf+len, sizeof(buf)-len, " MCAST");504504+ if (filt & AR5K_RX_FILTER_BCAST)505505+ len += snprintf(buf+len, sizeof(buf)-len, " BCAST");506506+ if (filt & AR5K_RX_FILTER_CONTROL)507507+ len += snprintf(buf+len, sizeof(buf)-len, " CONTROL");508508+ if (filt & AR5K_RX_FILTER_BEACON)509509+ len += snprintf(buf+len, sizeof(buf)-len, " BEACON");510510+ if (filt & AR5K_RX_FILTER_PROM)511511+ len += snprintf(buf+len, sizeof(buf)-len, " PROM");512512+ if (filt & AR5K_RX_FILTER_XRPOLL)513513+ len += snprintf(buf+len, sizeof(buf)-len, " XRPOLL");514514+ if (filt & AR5K_RX_FILTER_PROBEREQ)515515+ len += snprintf(buf+len, sizeof(buf)-len, " PROBEREQ");516516+ if (filt & AR5K_RX_FILTER_PHYERR_5212)517517+ len += snprintf(buf+len, sizeof(buf)-len, " PHYERR-5212");518518+ if (filt & AR5K_RX_FILTER_RADARERR_5212)519519+ len += snprintf(buf+len, sizeof(buf)-len, " RADARERR-5212");520520+ if (filt & AR5K_RX_FILTER_PHYERR_5211)521521+ snprintf(buf+len, sizeof(buf)-len, " PHYERR-5211");522522+ if (filt & AR5K_RX_FILTER_RADARERR_5211)523523+ len += snprintf(buf+len, sizeof(buf)-len, " RADARERR-5211\n");524524+ else525525+ len += snprintf(buf+len, sizeof(buf)-len, "\n");526526+527527+ if (len > sizeof(buf))528528+ len = sizeof(buf);529529+530530+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);531531+}532532+533533+static const struct file_operations fops_misc = {534534+ .read = read_file_misc,535535+ .open = ath5k_debugfs_open,536536+ .owner = THIS_MODULE,537537+};538538+486539487540/* debugfs: frameerrors */488541···909856 S_IWUSR | S_IRUSR,910857 sc->debug.debugfs_phydir, sc, &fops_antenna);911858859859+ sc->debug.debugfs_misc = debugfs_create_file("misc",860860+ S_IRUSR,861861+ sc->debug.debugfs_phydir, sc, &fops_misc);862862+912863 sc->debug.debugfs_frameerrors = debugfs_create_file("frameerrors",913864 S_IWUSR | S_IRUSR,914865 sc->debug.debugfs_phydir, sc,···943886 debugfs_remove(sc->debug.debugfs_beacon);944887 debugfs_remove(sc->debug.debugfs_reset);945888 debugfs_remove(sc->debug.debugfs_antenna);889889+ debugfs_remove(sc->debug.debugfs_misc);946890 debugfs_remove(sc->debug.debugfs_frameerrors);947891 debugfs_remove(sc->debug.debugfs_ani);948892 debugfs_remove(sc->debug.debugfs_queue);
···244244245245 /* Force channel idle high */246246 AR5K_REG_ENABLE_BITS(ah, AR5K_DIAG_SW_5211,247247- AR5K_DIAG_SW_CHANEL_IDLE_HIGH);247247+ AR5K_DIAG_SW_CHANNEL_IDLE_HIGH);248248249249 /* Wait a while and disable mechanism */250250 udelay(200);···261261 } while (--i && pending);262262263263 AR5K_REG_DISABLE_BITS(ah, AR5K_DIAG_SW_5211,264264- AR5K_DIAG_SW_CHANEL_IDLE_HIGH);264264+ AR5K_DIAG_SW_CHANNEL_IDLE_HIGH);265265 }266266267267 /* Clear register */
+98-1
drivers/net/wireless/ath/ath5k/pcu.c
···495495{496496 u32 tsf_lower, tsf_upper1, tsf_upper2;497497 int i;498498+ unsigned long flags;499499+500500+ /* This code is time critical - we don't want to be interrupted here */501501+ local_irq_save(flags);498502499503 /*500504 * While reading TSF upper and then lower part, the clock is still···520516 break;521517 tsf_upper1 = tsf_upper2;522518 }519519+520520+ local_irq_restore(flags);523521524522 WARN_ON( i == ATH5K_MAX_TSF_READ );525523···606600 /* Timer3 marks the end of our ATIM window607601 * a zero length window is not allowed because608602 * we 'll get no beacons */609609- timer3 = next_beacon + (ah->ah_atim_window ? ah->ah_atim_window : 1);603603+ timer3 = next_beacon + 1;610604611605 /*612606 * Set the beacon register and enable all timers.···644638 * disable power save reporting.*/645639 AR5K_REG_DISABLE_BITS(ah, AR5K_STA_ID1, AR5K_STA_ID1_PWR_SV);646640641641+}642642+643643+/**644644+ * ath5k_check_timer_win - Check if timer B is timer A + window645645+ *646646+ * @a: timer a (before b)647647+ * @b: timer b (after a)648648+ * @window: difference between a and b649649+ * @intval: timers are increased by this interval650650+ *651651+ * This helper function checks if timer B is timer A + window and covers652652+ * cases where timer A or B might have already been updated or wrapped653653+ * around (Timers are 16 bit).654654+ *655655+ * Returns true if O.K.656656+ */657657+static inline bool658658+ath5k_check_timer_win(int a, int b, int window, int intval)659659+{660660+ /*661661+ * 1.) usually B should be A + window662662+ * 2.) A already updated, B not updated yet663663+ * 3.) A already updated and has wrapped around664664+ * 4.) B has wrapped around665665+ */666666+ if ((b - a == window) || /* 1.) */667667+ (a - b == intval - window) || /* 2.) */668668+ ((a | 0x10000) - b == intval - window) || /* 3.) */669669+ ((b | 0x10000) - a == window)) /* 4.) */670670+ return true; /* O.K. */671671+ return false;672672+}673673+674674+/**675675+ * ath5k_hw_check_beacon_timers - Check if the beacon timers are correct676676+ *677677+ * @ah: The &struct ath5k_hw678678+ * @intval: beacon interval679679+ *680680+ * This is a workaround for IBSS mode:681681+ *682682+ * The need for this function arises from the fact that we have 4 separate683683+ * HW timer registers (TIMER0 - TIMER3), which are closely related to the684684+ * next beacon target time (NBTT), and that the HW updates these timers685685+ * seperately based on the current TSF value. The hardware increments each686686+ * timer by the beacon interval, when the local TSF coverted to TU is equal687687+ * to the value stored in the timer.688688+ *689689+ * The reception of a beacon with the same BSSID can update the local HW TSF690690+ * at any time - this is something we can't avoid. If the TSF jumps to a691691+ * time which is later than the time stored in a timer, this timer will not692692+ * be updated until the TSF in TU wraps around at 16 bit (the size of the693693+ * timers) and reaches the time which is stored in the timer.694694+ *695695+ * The problem is that these timers are closely related to TIMER0 (NBTT) and696696+ * that they define a time "window". When the TSF jumps between two timers697697+ * (e.g. ATIM and NBTT), the one in the past will be left behind (not698698+ * updated), while the one in the future will be updated every beacon699699+ * interval. This causes the window to get larger, until the TSF wraps700700+ * around as described above and the timer which was left behind gets701701+ * updated again. But - because the beacon interval is usually not an exact702702+ * divisor of the size of the timers (16 bit), an unwanted "window" between703703+ * these timers has developed!704704+ *705705+ * This is especially important with the ATIM window, because during706706+ * the ATIM window only ATIM frames and no data frames are allowed to be707707+ * sent, which creates transmission pauses after each beacon. This symptom708708+ * has been described as "ramping ping" because ping times increase linearly709709+ * for some time and then drop down again. A wrong window on the DMA beacon710710+ * timer has the same effect, so we check for these two conditions.711711+ *712712+ * Returns true if O.K.713713+ */714714+bool715715+ath5k_hw_check_beacon_timers(struct ath5k_hw *ah, int intval)716716+{717717+ unsigned int nbtt, atim, dma;718718+719719+ nbtt = ath5k_hw_reg_read(ah, AR5K_TIMER0);720720+ atim = ath5k_hw_reg_read(ah, AR5K_TIMER3);721721+ dma = ath5k_hw_reg_read(ah, AR5K_TIMER1) >> 3;722722+723723+ /* NOTE: SWBA is different. Having a wrong window there does not724724+ * stop us from sending data and this condition is catched thru725725+ * other means (SWBA interrupt) */726726+727727+ if (ath5k_check_timer_win(nbtt, atim, 1, intval) &&728728+ ath5k_check_timer_win(dma, nbtt, AR5K_TUNE_DMA_BEACON_RESP,729729+ intval))730730+ return true; /* O.K. */731731+ return false;647732}648733649734/**
···333333 }334334335335 if (i == 0) {336336- if (AR_SREV_9280_10_OR_LATER(ah))336336+ if (AR_SREV_9280_20_OR_LATER(ah))337337 ss = (int16_t)(0 - (minPwrT4[i] / 2));338338 else339339 ss = 0;···761761762762 regulatory->max_power_level = ratesArray[i];763763764764- if (AR_SREV_9280_10_OR_LATER(ah)) {764764+ if (AR_SREV_9280_20_OR_LATER(ah)) {765765 for (i = 0; i < Ar5416RateSize; i++)766766 ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2;767767 }···909909 AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal);910910 REG_RMW_FIELD(ah, AR_PHY_RXGAIN + 0x1000,911911 AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[0]);912912-913913- if (AR_SREV_9285_11(ah))914914- REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14));915912}916913917914/*···11051108 db2[4]);11061109 }1107111011081108-11091109- if (AR_SREV_9285_11(ah))11101110- REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT);1111111111121112 REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH,11131113 pModal->switchSettling);
+3-3
drivers/net/wireless/ath/ath9k/eeprom_9287.c
···324324 minDelta = 0;325325326326 if (i == 0) {327327- if (AR_SREV_9280_10_OR_LATER(ah))327327+ if (AR_SREV_9280_20_OR_LATER(ah))328328 ss = (int16_t)(0 - (minPwrT4[i] / 2));329329 else330330 ss = 0;···883883 ratesArray[i] = AR9287_MAX_RATE_POWER;884884 }885885886886- if (AR_SREV_9280_10_OR_LATER(ah)) {886886+ if (AR_SREV_9280_20_OR_LATER(ah)) {887887 for (i = 0; i < Ar5416RateSize; i++)888888 ratesArray[i] -= AR9287_PWR_TABLE_OFFSET_DB * 2;889889 }···977977 else978978 i = rate6mb;979979980980- if (AR_SREV_9280_10_OR_LATER(ah))980980+ if (AR_SREV_9280_20_OR_LATER(ah))981981 regulatory->max_power_level =982982 ratesArray[i] + AR9287_PWR_TABLE_OFFSET_DB * 2;983983 else
+9-9
drivers/net/wireless/ath/ath9k/eeprom_def.c
···223223 }224224225225 /* Enable fixup for AR_AN_TOP2 if necessary */226226- if (AR_SREV_9280_10_OR_LATER(ah) &&226226+ if (AR_SREV_9280_20_OR_LATER(ah) &&227227 (eep->baseEepHeader.version & 0xff) > 0x0a &&228228 eep->baseEepHeader.pwdclkind == 0)229229 ah->need_an_top2_fixup = 1;···317317 if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) {318318 txRxAttenLocal = pModal->txRxAttenCh[i];319319320320- if (AR_SREV_9280_10_OR_LATER(ah)) {320320+ if (AR_SREV_9280_20_OR_LATER(ah)) {321321 REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ + regChainOffset,322322 AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN,323323 pModal->bswMargin[i]);···344344 }345345 }346346347347- if (AR_SREV_9280_10_OR_LATER(ah)) {347347+ if (AR_SREV_9280_20_OR_LATER(ah)) {348348 REG_RMW_FIELD(ah,349349 AR_PHY_RXGAIN + regChainOffset,350350 AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal);···408408 regChainOffset, i);409409 }410410411411- if (AR_SREV_9280_10_OR_LATER(ah)) {411411+ if (AR_SREV_9280_20_OR_LATER(ah)) {412412 if (IS_CHAN_2GHZ(chan)) {413413 ath9k_hw_analog_shift_rmw(ah, AR_AN_RF2G1_CH0,414414 AR_AN_RF2G1_CH0_OB,···461461 REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_ADC,462462 pModal->adcDesiredSize);463463464464- if (!AR_SREV_9280_10_OR_LATER(ah))464464+ if (!AR_SREV_9280_20_OR_LATER(ah))465465 REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ,466466 AR_PHY_DESIRED_SZ_PGA,467467 pModal->pgaDesiredSize);···478478 REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_A2_RX_ON,479479 pModal->txEndToRxOn);480480481481- if (AR_SREV_9280_10_OR_LATER(ah)) {481481+ if (AR_SREV_9280_20_OR_LATER(ah)) {482482 REG_RMW_FIELD(ah, AR_PHY_CCA, AR9280_PHY_CCA_THRESH62,483483 pModal->thresh62);484484 REG_RMW_FIELD(ah, AR_PHY_EXT_CCA0,···696696 }697697698698 if (i == 0) {699699- if (AR_SREV_9280_10_OR_LATER(ah))699699+ if (AR_SREV_9280_20_OR_LATER(ah))700700 ss = (int16_t)(0 - (minPwrT4[i] / 2));701701 else702702 ss = 0;···12911291 ratesArray[i] = AR5416_MAX_RATE_POWER;12921292 }1293129312941294- if (AR_SREV_9280_10_OR_LATER(ah)) {12941294+ if (AR_SREV_9280_20_OR_LATER(ah)) {12951295 for (i = 0; i < Ar5416RateSize; i++) {12961296 int8_t pwr_table_offset;12971297···13951395 else if (IS_CHAN_HT20(chan))13961396 i = rateHt20_0;1397139713981398- if (AR_SREV_9280_10_OR_LATER(ah))13981398+ if (AR_SREV_9280_20_OR_LATER(ah))13991399 regulatory->max_power_level =14001400 ratesArray[i] + AR5416_PWR_TABLE_OFFSET_DB * 2;14011401 else
+8-1
drivers/net/wireless/ath/ath9k/htc_drv_beacon.c
···235235 ath9k_hw_get_txq_props(ah, qnum, &qi_be);236236237237 qi.tqi_aifs = qi_be.tqi_aifs;238238- qi.tqi_cwmin = 4*qi_be.tqi_cwmin;238238+ /* For WIFI Beacon Distribution239239+ * Long slot time : 2x cwmin240240+ * Short slot time : 4x cwmin241241+ */242242+ if (ah->slottime == ATH9K_SLOT_TIME_20)243243+ qi.tqi_cwmin = 2*qi_be.tqi_cwmin;244244+ else245245+ qi.tqi_cwmin = 4*qi_be.tqi_cwmin;239246 qi.tqi_cwmax = qi_be.tqi_cwmax;240247241248 if (!ath9k_hw_set_txq_props(ah, priv->beaconq, &qi)) {
+3
drivers/net/wireless/ath/ath9k/htc_drv_init.c
···561561 common->keymax = ATH_KEYMAX;562562 }563563564564+ if (priv->ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA)565565+ common->crypt_caps |= ATH_CRYPT_CAP_MIC_COMBINED;566566+564567 /*565568 * Reset the key cache since some parts do not566569 * reset the contents on initial power up.
+13-14
drivers/net/wireless/ath/ath9k/hw.c
···565565 ath9k_hw_init_cal_settings(ah);566566567567 ah->ani_function = ATH9K_ANI_ALL;568568- if (AR_SREV_9280_10_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah))568568+ if (AR_SREV_9280_20_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah))569569 ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL;570570 if (!AR_SREV_9300_20_OR_LATER(ah))571571 ah->ani_function &= ~ATH9K_ANI_MRC_CCK;···11901190 int count = 50;11911191 u32 reg;1192119211931193- if (AR_SREV_9285_10_OR_LATER(ah))11931193+ if (AR_SREV_9285_12_OR_LATER(ah))11941194 return true;1195119511961196 do {···13121312 if (tsf)13131313 ath9k_hw_settsf64(ah, tsf);1314131413151315- if (AR_SREV_9280_10_OR_LATER(ah))13151315+ if (AR_SREV_9280_20_OR_LATER(ah))13161316 REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);1317131713181318 if (!AR_SREV_9300_20_OR_LATER(ah))···17871787 regulatory->current_rd = eeval;1788178817891789 eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_1);17901790- if (AR_SREV_9285_10_OR_LATER(ah))17901790+ if (AR_SREV_9285_12_OR_LATER(ah))17911791 eeval |= AR9285_RDEXT_DEFAULT;17921792 regulatory->current_rd_ext = eeval;17931793···18571857 /* Use rx_chainmask from EEPROM. */18581858 pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);1859185918601860- if (!(AR_SREV_9280(ah) && (ah->hw_version.macRev == 0)))18611861- ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;18601860+ ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;1862186118631862 pCap->low_2ghz_chan = 2312;18641863 pCap->high_2ghz_chan = 2732;···18931894 pCap->num_gpio_pins = AR9271_NUM_GPIO;18941895 else if (AR_DEVID_7010(ah))18951896 pCap->num_gpio_pins = AR7010_NUM_GPIO;18961896- else if (AR_SREV_9285_10_OR_LATER(ah))18971897+ else if (AR_SREV_9285_12_OR_LATER(ah))18971898 pCap->num_gpio_pins = AR9285_NUM_GPIO;18981898- else if (AR_SREV_9280_10_OR_LATER(ah))18991899+ else if (AR_SREV_9280_20_OR_LATER(ah))18991900 pCap->num_gpio_pins = AR928X_NUM_GPIO;19001901 else19011902 pCap->num_gpio_pins = AR_NUM_GPIO;···19521953 pCap->num_antcfg_2ghz =19531954 ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ);1954195519551955- if (AR_SREV_9280_10_OR_LATER(ah) &&19561956+ if (AR_SREV_9280_20_OR_LATER(ah) &&19561957 ath9k_hw_btcoex_supported(ah)) {19571958 btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO;19581959 btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO;···19891990 if (AR_SREV_9300_20_OR_LATER(ah))19901991 pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;1991199219921992- if (AR_SREV_9287_10_OR_LATER(ah) || AR_SREV_9271(ah))19931993+ if (AR_SREV_9287_11_OR_LATER(ah) || AR_SREV_9271(ah))19931994 pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;1994199519951996 if (AR_SREV_9285(ah))···20732074 return MS_REG_READ(AR9300, gpio) != 0;20742075 else if (AR_SREV_9271(ah))20752076 return MS_REG_READ(AR9271, gpio) != 0;20762076- else if (AR_SREV_9287_10_OR_LATER(ah))20772077+ else if (AR_SREV_9287_11_OR_LATER(ah))20772078 return MS_REG_READ(AR9287, gpio) != 0;20782078- else if (AR_SREV_9285_10_OR_LATER(ah))20792079+ else if (AR_SREV_9285_12_OR_LATER(ah))20792080 return MS_REG_READ(AR9285, gpio) != 0;20802080- else if (AR_SREV_9280_10_OR_LATER(ah))20812081+ else if (AR_SREV_9280_20_OR_LATER(ah))20812082 return MS_REG_READ(AR928X, gpio) != 0;20822083 else20832084 return MS_REG_READ(AR, gpio) != 0;···25742575 int used;2575257625762577 /* chipsets >= AR9280 are single-chip */25772577- if (AR_SREV_9280_10_OR_LATER(ah)) {25782578+ if (AR_SREV_9280_20_OR_LATER(ah)) {25782579 used = snprintf(hw_name, len,25792580 "Atheros AR%s Rev:%x",25802581 ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
+1-1
drivers/net/wireless/ath/ath9k/init.c
···211211 else212212 max_streams = 2;213213214214- if (AR_SREV_9280_10_OR_LATER(ah)) {214214+ if (AR_SREV_9280_20_OR_LATER(ah)) {215215 if (max_streams >= 2)216216 ht_info->cap |= IEEE80211_HT_CAP_TX_STBC;217217 ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
+4-2
drivers/net/wireless/ath/ath9k/main.c
···270270{271271 struct ath_hw *ah = sc->sc_ah;272272 struct ath9k_hw_cal_data *caldata = ah->caldata;273273+ struct ath_common *common = ath9k_hw_common(ah);273274 int chain;274275275276 if (!caldata || !caldata->paprd_done)···279278 ath9k_ps_wakeup(sc);280279 ar9003_paprd_enable(ah, false);281280 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {282282- if (!(ah->caps.tx_chainmask & BIT(chain)))281281+ if (!(common->tx_chainmask & BIT(chain)))283282 continue;284283285284 ar9003_paprd_populate_single_table(ah, caldata, chain);···301300 struct ieee80211_supported_band *sband = &sc->sbands[band];302301 struct ath_tx_control txctl;303302 struct ath9k_hw_cal_data *caldata = ah->caldata;303303+ struct ath_common *common = ath9k_hw_common(ah);304304 int qnum, ftype;305305 int chain_ok = 0;306306 int chain;···335333 ath9k_ps_wakeup(sc);336334 ar9003_paprd_init_table(ah);337335 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {338338- if (!(ah->caps.tx_chainmask & BIT(chain)))336336+ if (!(common->tx_chainmask & BIT(chain)))339337 continue;340338341339 chain_ok = 0;
+7-3
drivers/net/wireless/ath/ath9k/recv.c
···454454 else455455 rfilt |= ATH9K_RX_FILTER_BEACON;456456457457- if ((AR_SREV_9280_10_OR_LATER(sc->sc_ah) ||458458- AR_SREV_9285_10_OR_LATER(sc->sc_ah)) &&457457+ if ((AR_SREV_9280_20_OR_LATER(sc->sc_ah) ||458458+ AR_SREV_9285_12_OR_LATER(sc->sc_ah)) &&459459 (sc->sc_ah->opmode == NL80211_IFTYPE_AP) &&460460 (sc->rx.rxfilter & FIF_PSPOLL))461461 rfilt |= ATH9K_RX_FILTER_PSPOLL;···977977 * at least one sdata of a wiphy on mac80211 but with ath9k virtual978978 * wiphy you'd have to iterate over every wiphy and each sdata.979979 */980980- sta = ieee80211_find_sta_by_hw(hw, hdr->addr2);980980+ if (is_multicast_ether_addr(hdr->addr1))981981+ sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, NULL);982982+ else983983+ sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, hdr->addr1);984984+981985 if (sta) {982986 an = (struct ath_node *) sta->drv_priv;983987 if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
···328328329329 rcu_read_lock();330330331331- /* XXX: use ieee80211_find_sta! */332332- sta = ieee80211_find_sta_by_hw(hw, hdr->addr1);331331+ sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2);333332 if (!sta) {334333 rcu_read_unlock();335334
+1-1
drivers/net/wireless/ath/carl9170/Kconfig
···1010 but it needs a special firmware (carl9170-1.fw) to do that.11111212 The firmware can be downloaded from our wiki here:1313- http://wireless.kernel.org/en/users/Drivers/carl91701313+ <http://wireless.kernel.org/en/users/Drivers/carl9170>14141515 If you choose to build a module, it'll be called carl9170.1616
-1
drivers/net/wireless/ath/carl9170/carl9170.h
···364364 unsigned int tx_dropped;365365 unsigned int tx_ack_failures;366366 unsigned int tx_fcs_errors;367367- unsigned int tx_ampdu_timeout;368367 unsigned int rx_dropped;369368370369 /* EEPROM */
···274274275275 /*276276 * We've reached the first zero length, the first NVS table277277- * is 7 bytes further.277277+ * is located at an aligned offset which is at least 7 bytes further.278278 */279279- nvs_ptr += 7;279279+ nvs_ptr = (u8 *)wl->nvs->nvs +280280+ ALIGN(nvs_ptr - (u8 *)wl->nvs->nvs + 7, 4);280281 nvs_len -= nvs_ptr - (u8 *)wl->nvs->nvs;281281- nvs_len = ALIGN(nvs_len, 4);282282283283 /* FIXME: The driver sets the partition here, but this is not needed,284284 since it sets to the same one as currently in use */···286286 wl1271_set_partition(wl, &part_table[PART_WORK]);287287288288 /* Copy the NVS tables to a new block to ensure alignment */289289- /* FIXME: We jump 3 more bytes before uploading the NVS. It seems290290- that our NVS files have three extra zeros here. I'm not sure whether291291- the problem is in our NVS generation or we should really jumpt these292292- 3 bytes here */293293- nvs_ptr += 3;294294-295295- nvs_aligned = kmemdup(nvs_ptr, nvs_len, GFP_KERNEL); if296296- (!nvs_aligned) return -ENOMEM;289289+ nvs_aligned = kmemdup(nvs_ptr, nvs_len, GFP_KERNEL);290290+ if (!nvs_aligned)291291+ return -ENOMEM;297292298293 /* And finally we upload the NVS tables */299294 /* FIXME: In wl1271, we upload everything at once.
+32-15
include/net/mac80211.h
···321321 * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame322322 * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this323323 * frame and selects the maximum number of streams that it can use.324324+ *325325+ * Note: If you have to add new flags to the enumeration, then don't326326+ * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.324327 */325328enum mac80211_tx_control_flags {326329 IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0),···352349};353350354351#define IEEE80211_TX_CTL_STBC_SHIFT 23352352+353353+/*354354+ * This definition is used as a mask to clear all temporary flags, which are355355+ * set by the tx handlers for each transmission attempt by the mac80211 stack.356356+ */357357+#define IEEE80211_TX_TEMPORARY_FLAGS (IEEE80211_TX_CTL_NO_ACK | \358358+ IEEE80211_TX_CTL_CLEAR_PS_FILT | IEEE80211_TX_CTL_FIRST_FRAGMENT | \359359+ IEEE80211_TX_CTL_SEND_AFTER_DTIM | IEEE80211_TX_CTL_AMPDU | \360360+ IEEE80211_TX_STAT_TX_FILTERED | IEEE80211_TX_STAT_ACK | \361361+ IEEE80211_TX_STAT_AMPDU | IEEE80211_TX_STAT_AMPDU_NO_BACK | \362362+ IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_PSPOLL_RESPONSE | \363363+ IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC | \364364+ IEEE80211_TX_CTL_STBC)355365356366/**357367 * enum mac80211_rate_control_flags - per-rate flags set by the···581565 * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index582566 * @RX_FLAG_40MHZ: HT40 (40 MHz) was used583567 * @RX_FLAG_SHORT_GI: Short guard interval was used584584- * @RX_FLAG_INTERNAL_CMTR: set internally after frame was reported585585- * on cooked monitor to avoid double-reporting it for multiple586586- * virtual interfaces587568 */588569enum mac80211_rx_flags {589570 RX_FLAG_MMIC_ERROR = 1<<0,···594581 RX_FLAG_HT = 1<<9,595582 RX_FLAG_40MHZ = 1<<10,596583 RX_FLAG_SHORT_GI = 1<<11,597597- RX_FLAG_INTERNAL_CMTR = 1<<12,598584};599585600586/**···614602 * @rate_idx: index of data rate into band's supported rates or MCS index if615603 * HT rates are use (RX_FLAG_HT)616604 * @flag: %RX_FLAG_*605605+ * @rx_flags: internal RX flags for mac80211617606 */618607struct ieee80211_rx_status {619608 u64 mactime;···624611 int antenna;625612 int rate_idx;626613 int flag;614614+ unsigned int rx_flags;627615};628616629617/**···24302416 const u8 *addr);2431241724322418/**24332433- * ieee80211_find_sta_by_hw - find a station on hardware24192419+ * ieee80211_find_sta_by_ifaddr - find a station on hardware24342420 *24352421 * @hw: pointer as obtained from ieee80211_alloc_hw()24362436- * @addr: station's address24222422+ * @addr: remote station's address24232423+ * @localaddr: local address (vif->sdata->vif.addr). Use NULL for 'any'.24372424 *24382425 * This function must be called under RCU lock and the24392426 * resulting pointer is only valid under RCU lock as well.24402427 *24412441- * NOTE: This function should not be used! When mac80211 is converted24422442- * internally to properly keep track of stations on multiple24432443- * virtual interfaces, it will not always know which station to24442444- * return here since a single address might be used by multiple24452445- * logical stations (e.g. consider a station connecting to another24462446- * BSSID on the same AP hardware without disconnecting first).24282428+ * NOTE: You may pass NULL for localaddr, but then you will just get24292429+ * the first STA that matches the remote address 'addr'.24302430+ * We can have multiple STA associated with multiple24312431+ * logical stations (e.g. consider a station connecting to another24322432+ * BSSID on the same AP hardware without disconnecting first).24332433+ * In this case, the result of this method with localaddr NULL24342434+ * is not reliable.24472435 *24482448- * DO NOT USE THIS FUNCTION.24362436+ * DO NOT USE THIS FUNCTION with localaddr NULL if at all possible.24492437 */24502450-struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw,24512451- const u8 *addr);24382438+struct ieee80211_sta *ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw,24392439+ const u8 *addr,24402440+ const u8 *localaddr);2452244124532442/**24542443 * ieee80211_sta_block_awake - block station from waking up
···880880 sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL |881881 IEEE80211_STA_BEACON_POLL);882882883883- /*884884- * Always handle WMM once after association regardless885885- * of the first value the AP uses. Setting -1 here has886886- * that effect because the AP values is an unsigned887887- * 4-bit value.888888- */889889- sdata->u.mgd.wmm_last_param_set = -1;890890-891883 ieee80211_led_assoc(local, 1);892884893885 if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD)···13581366 " the AP (error %d)\n", sdata->name, err);13591367 return false;13601368 }13691369+13701370+ /*13711371+ * Always handle WMM once after association regardless13721372+ * of the first value the AP uses. Setting -1 here has13731373+ * that effect because the AP values is an unsigned13741374+ * 4-bit value.13751375+ */13761376+ ifmgd->wmm_last_param_set = -1;1361137713621378 if (elems.wmm_param)13631379 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
+158-139
net/mac80211/rx.c
···315315static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)316316{317317 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;318318+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);318319 int tid;319320320321 /* does the frame have a qos control field? */···324323 /* frame has qos control */325324 tid = *qc & IEEE80211_QOS_CTL_TID_MASK;326325 if (*qc & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)327327- rx->flags |= IEEE80211_RX_AMSDU;328328- else329329- rx->flags &= ~IEEE80211_RX_AMSDU;326326+ status->rx_flags |= IEEE80211_RX_AMSDU;330327 } else {331328 /*332329 * IEEE 802.11-2007, 7.1.3.4.1 ("Sequence Number field"):···386387ieee80211_rx_h_passive_scan(struct ieee80211_rx_data *rx)387388{388389 struct ieee80211_local *local = rx->local;390390+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);389391 struct sk_buff *skb = rx->skb;390392391391- if (unlikely(test_bit(SCAN_HW_SCANNING, &local->scanning)))393393+ if (likely(!(status->rx_flags & IEEE80211_RX_IN_SCAN)))394394+ return RX_CONTINUE;395395+396396+ if (test_bit(SCAN_HW_SCANNING, &local->scanning))392397 return ieee80211_scan_rx(rx->sdata, skb);393398394394- if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning) &&395395- (rx->flags & IEEE80211_RX_IN_SCAN))) {399399+ if (test_bit(SCAN_SW_SCANNING, &local->scanning)) {396400 /* drop all the other packets during a software scan anyway */397401 if (ieee80211_scan_rx(rx->sdata, skb) != RX_QUEUED)398402 dev_kfree_skb(skb);399403 return RX_QUEUED;400404 }401405402402- if (unlikely(rx->flags & IEEE80211_RX_IN_SCAN)) {403403- /* scanning finished during invoking of handlers */404404- I802_DEBUG_INC(local->rx_handlers_drop_passive_scan);405405- return RX_DROP_UNUSABLE;406406- }407407-408408- return RX_CONTINUE;406406+ /* scanning finished during invoking of handlers */407407+ I802_DEBUG_INC(local->rx_handlers_drop_passive_scan);408408+ return RX_DROP_UNUSABLE;409409}410410411411···783785ieee80211_rx_h_check(struct ieee80211_rx_data *rx)784786{785787 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;788788+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);786789787790 /* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */788791 if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {789792 if (unlikely(ieee80211_has_retry(hdr->frame_control) &&790793 rx->sta->last_seq_ctrl[rx->queue] ==791794 hdr->seq_ctrl)) {792792- if (rx->flags & IEEE80211_RX_RA_MATCH) {795795+ if (status->rx_flags & IEEE80211_RX_RA_MATCH) {793796 rx->local->dot11FrameDuplicateCount++;794797 rx->sta->num_duplicates++;795798 }···823824 if ((!ieee80211_has_fromds(hdr->frame_control) &&824825 !ieee80211_has_tods(hdr->frame_control) &&825826 ieee80211_is_data(hdr->frame_control)) ||826826- !(rx->flags & IEEE80211_RX_RA_MATCH)) {827827+ !(status->rx_flags & IEEE80211_RX_RA_MATCH)) {827828 /* Drop IBSS frames and frames for other hosts828829 * silently. */829830 return RX_DROP_MONITOR;···880881 * No point in finding a key and decrypting if the frame is neither881882 * addressed to us nor a multicast frame.882883 */883883- if (!(rx->flags & IEEE80211_RX_RA_MATCH))884884+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))884885 return RX_CONTINUE;885886886887 /* start without a key */···11131114 sta->last_rx = jiffies;11141115 }1115111611161116- if (!(rx->flags & IEEE80211_RX_RA_MATCH))11171117+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))11171118 return RX_CONTINUE;1118111911191120 if (rx->sdata->vif.type == NL80211_IFTYPE_STATION)···12701271 unsigned int frag, seq;12711272 struct ieee80211_fragment_entry *entry;12721273 struct sk_buff *skb;12741274+ struct ieee80211_rx_status *status;1273127512741276 hdr = (struct ieee80211_hdr *)rx->skb->data;12751277 fc = hdr->frame_control;···13701370 }1371137113721372 /* Complete frame has been reassembled - process it now */13731373- rx->flags |= IEEE80211_RX_FRAGMENTED;13731373+ status = IEEE80211_SKB_RXCB(rx->skb);13741374+ status->rx_flags |= IEEE80211_RX_FRAGMENTED;1374137513751376 out:13761377 if (rx->sta)···13881387{13891388 struct ieee80211_sub_if_data *sdata = rx->sdata;13901389 __le16 fc = ((struct ieee80211_hdr *)rx->skb->data)->frame_control;13901390+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);1391139113921392 if (likely(!rx->sta || !ieee80211_is_pspoll(fc) ||13931393- !(rx->flags & IEEE80211_RX_RA_MATCH)))13931393+ !(status->rx_flags & IEEE80211_RX_RA_MATCH)))13941394 return RX_CONTINUE;1395139513961396 if ((sdata->vif.type != NL80211_IFTYPE_AP) &&···15521550 struct sk_buff *skb, *xmit_skb;15531551 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data;15541552 struct sta_info *dsta;15531553+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);1555155415561555 skb = rx->skb;15571556 xmit_skb = NULL;···15601557 if ((sdata->vif.type == NL80211_IFTYPE_AP ||15611558 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&15621559 !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) &&15631563- (rx->flags & IEEE80211_RX_RA_MATCH) &&15601560+ (status->rx_flags & IEEE80211_RX_RA_MATCH) &&15641561 (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) {15651562 if (is_multicast_ether_addr(ehdr->h_dest)) {15661563 /*···16371634 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;16381635 __le16 fc = hdr->frame_control;16391636 struct sk_buff_head frame_list;16371637+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);1640163816411639 if (unlikely(!ieee80211_is_data(fc)))16421640 return RX_CONTINUE;···16451641 if (unlikely(!ieee80211_is_data_present(fc)))16461642 return RX_DROP_MONITOR;1647164316481648- if (!(rx->flags & IEEE80211_RX_AMSDU))16441644+ if (!(status->rx_flags & IEEE80211_RX_AMSDU))16491645 return RX_CONTINUE;1650164616511647 if (ieee80211_has_a4(hdr->frame_control) &&···16961692 struct sk_buff *skb = rx->skb, *fwd_skb;16971693 struct ieee80211_local *local = rx->local;16981694 struct ieee80211_sub_if_data *sdata = rx->sdata;16951695+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);1699169617001697 hdr = (struct ieee80211_hdr *) skb->data;17011698 hdrlen = ieee80211_hdrlen(hdr->frame_control);···1742173717431738 mesh_hdr->ttl--;1744173917451745- if (rx->flags & IEEE80211_RX_RA_MATCH) {17401740+ if (status->rx_flags & IEEE80211_RX_RA_MATCH) {17461741 if (!mesh_hdr->ttl)17471742 IEEE80211_IFSTA_MESH_CTR_INC(&rx->sdata->u.mesh,17481743 dropped_frames_ttl);···19521947ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)19531948{19541949 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;19501950+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);1955195119561952 /*19571953 * From here on, look only at management frames.···19651959 if (!ieee80211_is_mgmt(mgmt->frame_control))19661960 return RX_DROP_MONITOR;1967196119681968- if (!(rx->flags & IEEE80211_RX_RA_MATCH))19621962+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))19691963 return RX_DROP_MONITOR;1970196419711965 if (ieee80211_drop_unencrypted_mgmt(rx))···19801974 struct ieee80211_local *local = rx->local;19811975 struct ieee80211_sub_if_data *sdata = rx->sdata;19821976 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;19771977+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);19831978 int len = rx->skb->len;1984197919851980 if (!ieee80211_is_action(mgmt->frame_control))···19931986 if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC)19941987 return RX_DROP_UNUSABLE;1995198819961996- if (!(rx->flags & IEEE80211_RX_RA_MATCH))19891989+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))19971990 return RX_DROP_UNUSABLE;1998199119991992 switch (mgmt->u.action.category) {···20892082 return RX_CONTINUE;2090208320912084 invalid:20922092- rx->flags |= IEEE80211_MALFORMED_ACTION_FRM;20852085+ status->rx_flags |= IEEE80211_RX_MALFORMED_ACTION_FRM;20932086 /* will return in the next handlers */20942087 return RX_CONTINUE;20952088···21112104static ieee80211_rx_result debug_noinline21122105ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)21132106{21142114- struct ieee80211_rx_status *status;21072107+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);2115210821162109 /* skip known-bad action frames and return them in the next handler */21172117- if (rx->flags & IEEE80211_MALFORMED_ACTION_FRM)21102110+ if (status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM)21182111 return RX_CONTINUE;2119211221202113 /*···21232116 * so userspace can register for those to know whether ones21242117 * it transmitted were processed or returned.21252118 */21262126- status = IEEE80211_SKB_RXCB(rx->skb);2127211921282120 if (cfg80211_rx_mgmt(rx->sdata->dev, status->freq,21292121 rx->skb->data, rx->skb->len,···21442138 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;21452139 struct sk_buff *nskb;21462140 struct ieee80211_sub_if_data *sdata = rx->sdata;21412141+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);2147214221482143 if (!ieee80211_is_action(mgmt->frame_control))21492144 return RX_CONTINUE;···21592152 * registration mechanisms, but older ones still use cooked21602153 * monitor interfaces so push all frames there.21612154 */21622162- if (!(rx->flags & IEEE80211_MALFORMED_ACTION_FRM) &&21552155+ if (!(status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) &&21632156 (sdata->vif.type == NL80211_IFTYPE_AP ||21642157 sdata->vif.type == NL80211_IFTYPE_AP_VLAN))21652158 return RX_DROP_MONITOR;···22932286 struct net_device *prev_dev = NULL;22942287 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);2295228822962296- if (status->flag & RX_FLAG_INTERNAL_CMTR)22892289+ /*22902290+ * If cooked monitor has been processed already, then22912291+ * don't do it again. If not, set the flag.22922292+ */22932293+ if (rx->flags & IEEE80211_RX_CMNTR)22972294 goto out_free_skb;22952295+ rx->flags |= IEEE80211_RX_CMNTR;2298229622992297 if (skb_headroom(skb) < sizeof(*rthdr) &&23002298 pskb_expand_head(skb, sizeof(*rthdr), 0, GFP_ATOMIC))···23552343 if (prev_dev) {23562344 skb->dev = prev_dev;23572345 netif_receive_skb(skb);23582358- skb = NULL;23592359- } else23602360- goto out_free_skb;23612361-23622362- status->flag |= RX_FLAG_INTERNAL_CMTR;23632363- return;23462346+ return;23472347+ }2364234823652349 out_free_skb:23662350 dev_kfree_skb(skb);···24172409 * same TID from the same station24182410 */24192411 rx->skb = skb;24122412+ rx->flags = 0;2420241324212414 CALL_RXH(ieee80211_rx_h_decrypt)24222415 CALL_RXH(ieee80211_rx_h_check_more_data)···24522443 }24532444}2454244524552455-static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,24562456- struct ieee80211_rx_data *rx,24572457- struct sk_buff *skb)24462446+static void ieee80211_invoke_rx_handlers(struct ieee80211_rx_data *rx)24582447{24592448 struct sk_buff_head reorder_release;24602449 ieee80211_rx_result res = RX_DROP_MONITOR;2461245024622451 __skb_queue_head_init(&reorder_release);24632463-24642464- rx->skb = skb;24652465- rx->sdata = sdata;2466245224672453#define CALL_RXH(rxh) \24682454 do { \···24882484void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)24892485{24902486 struct sk_buff_head frames;24912491- struct ieee80211_rx_data rx = { };24872487+ struct ieee80211_rx_data rx = {24882488+ .sta = sta,24892489+ .sdata = sta->sdata,24902490+ .local = sta->local,24912491+ .queue = tid,24922492+ };24922493 struct tid_ampdu_rx *tid_agg_rx;2493249424942495 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);···25012492 return;2502249325032494 __skb_queue_head_init(&frames);25042504-25052505- /* construct rx struct */25062506- rx.sta = sta;25072507- rx.sdata = sta->sdata;25082508- rx.local = sta->local;25092509- rx.queue = tid;25102510- rx.flags |= IEEE80211_RX_RA_MATCH;25112511-25122512- if (unlikely(test_bit(SCAN_HW_SCANNING, &sta->local->scanning) ||25132513- test_bit(SCAN_OFF_CHANNEL, &sta->local->scanning)))25142514- rx.flags |= IEEE80211_RX_IN_SCAN;2515249525162496 spin_lock(&tid_agg_rx->reorder_lock);25172497 ieee80211_sta_reorder_release(&sta->local->hw, tid_agg_rx, &frames);···2511251325122514/* main receive path */2513251525142514-static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,25152515- struct ieee80211_rx_data *rx,25162516+static int prepare_for_handlers(struct ieee80211_rx_data *rx,25162517 struct ieee80211_hdr *hdr)25172518{25192519+ struct ieee80211_sub_if_data *sdata = rx->sdata;25182520 struct sk_buff *skb = rx->skb;25192521 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);25202522 u8 *bssid = ieee80211_get_bssid(hdr, skb->len, sdata->vif.type);···25282530 compare_ether_addr(sdata->vif.addr, hdr->addr1) != 0) {25292531 if (!(sdata->dev->flags & IFF_PROMISC))25302532 return 0;25312531- rx->flags &= ~IEEE80211_RX_RA_MATCH;25332533+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;25322534 }25332535 break;25342536 case NL80211_IFTYPE_ADHOC:···25382540 return 1;25392541 }25402542 else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) {25412541- if (!(rx->flags & IEEE80211_RX_IN_SCAN))25432543+ if (!(status->rx_flags & IEEE80211_RX_IN_SCAN))25422544 return 0;25432543- rx->flags &= ~IEEE80211_RX_RA_MATCH;25452545+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;25442546 } else if (!multicast &&25452547 compare_ether_addr(sdata->vif.addr,25462548 hdr->addr1) != 0) {25472549 if (!(sdata->dev->flags & IFF_PROMISC))25482550 return 0;25492549- rx->flags &= ~IEEE80211_RX_RA_MATCH;25512551+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;25502552 } else if (!rx->sta) {25512553 int rate_idx;25522554 if (status->flag & RX_FLAG_HT)···25642566 if (!(sdata->dev->flags & IFF_PROMISC))25652567 return 0;2566256825672567- rx->flags &= ~IEEE80211_RX_RA_MATCH;25692569+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;25682570 }25692571 break;25702572 case NL80211_IFTYPE_AP_VLAN:···25752577 return 0;25762578 } else if (!ieee80211_bssid_match(bssid,25772579 sdata->vif.addr)) {25782578- if (!(rx->flags & IEEE80211_RX_IN_SCAN))25802580+ if (!(status->rx_flags & IEEE80211_RX_IN_SCAN))25792581 return 0;25802580- rx->flags &= ~IEEE80211_RX_RA_MATCH;25822582+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;25812583 }25822584 break;25832585 case NL80211_IFTYPE_WDS:···25962598}2597259925982600/*26012601+ * This function returns whether or not the SKB26022602+ * was destined for RX processing or not, which,26032603+ * if consume is true, is equivalent to whether26042604+ * or not the skb was consumed.26052605+ */26062606+static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,26072607+ struct sk_buff *skb, bool consume)26082608+{26092609+ struct ieee80211_local *local = rx->local;26102610+ struct ieee80211_sub_if_data *sdata = rx->sdata;26112611+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);26122612+ struct ieee80211_hdr *hdr = (void *)skb->data;26132613+ int prepares;26142614+26152615+ rx->skb = skb;26162616+ status->rx_flags |= IEEE80211_RX_RA_MATCH;26172617+ prepares = prepare_for_handlers(rx, hdr);26182618+26192619+ if (!prepares)26202620+ return false;26212621+26222622+ if (status->flag & RX_FLAG_MMIC_ERROR) {26232623+ if (status->rx_flags & IEEE80211_RX_RA_MATCH)26242624+ ieee80211_rx_michael_mic_report(hdr, rx);26252625+ return false;26262626+ }26272627+26282628+ if (!consume) {26292629+ skb = skb_copy(skb, GFP_ATOMIC);26302630+ if (!skb) {26312631+ if (net_ratelimit())26322632+ wiphy_debug(local->hw.wiphy,26332633+ "failed to copy multicast frame for %s\n",26342634+ sdata->name);26352635+ return true;26362636+ }26372637+26382638+ rx->skb = skb;26392639+ }26402640+26412641+ ieee80211_invoke_rx_handlers(rx);26422642+ return true;26432643+}26442644+26452645+/*25992646 * This is the actual Rx frames handler. as it blongs to Rx path it must26002647 * be called with rcu_read_lock protection.26012648 */···26532610 struct ieee80211_hdr *hdr;26542611 __le16 fc;26552612 struct ieee80211_rx_data rx;26562656- int prepares;26572657- struct ieee80211_sub_if_data *prev = NULL;26582658- struct sk_buff *skb_new;26592659- struct sta_info *sta, *tmp;26602660- bool found_sta = false;26132613+ struct ieee80211_sub_if_data *prev;26142614+ struct sta_info *sta, *tmp, *prev_sta;26612615 int err = 0;2662261626632617 fc = ((struct ieee80211_hdr *)skb->data)->frame_control;···2667262726682628 if (unlikely(test_bit(SCAN_HW_SCANNING, &local->scanning) ||26692629 test_bit(SCAN_OFF_CHANNEL, &local->scanning)))26702670- rx.flags |= IEEE80211_RX_IN_SCAN;26302630+ status->rx_flags |= IEEE80211_RX_IN_SCAN;2671263126722632 if (ieee80211_is_mgmt(fc))26732633 err = skb_linearize(skb);···26842644 ieee80211_verify_alignment(&rx);2685264526862646 if (ieee80211_is_data(fc)) {26472647+ prev_sta = NULL;26482648+26872649 for_each_sta_info(local, hdr->addr2, sta, tmp) {26882688- rx.sta = sta;26892689- found_sta = true;26902690- rx.sdata = sta->sdata;26912691-26922692- rx.flags |= IEEE80211_RX_RA_MATCH;26932693- prepares = prepare_for_handlers(rx.sdata, &rx, hdr);26942694- if (prepares) {26952695- if (status->flag & RX_FLAG_MMIC_ERROR) {26962696- if (rx.flags & IEEE80211_RX_RA_MATCH)26972697- ieee80211_rx_michael_mic_report(hdr, &rx);26982698- } else26992699- prev = rx.sdata;26502650+ if (!prev_sta) {26512651+ prev_sta = sta;26522652+ continue;27002653 }26542654+26552655+ rx.sta = prev_sta;26562656+ rx.sdata = prev_sta->sdata;26572657+ ieee80211_prepare_and_rx_handle(&rx, skb, false);26582658+26592659+ prev_sta = sta;26602660+ }26612661+26622662+ if (prev_sta) {26632663+ rx.sta = prev_sta;26642664+ rx.sdata = prev_sta->sdata;26652665+26662666+ if (ieee80211_prepare_and_rx_handle(&rx, skb, true))26672667+ return;27012668 }27022669 }27032703- if (!found_sta) {27042704- list_for_each_entry_rcu(sdata, &local->interfaces, list) {27052705- if (!ieee80211_sdata_running(sdata))27062706- continue;2707267027082708- if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||27092709- sdata->vif.type == NL80211_IFTYPE_AP_VLAN)27102710- continue;26712671+ prev = NULL;2711267227122712- /*27132713- * frame is destined for this interface, but if it's27142714- * not also for the previous one we handle that after27152715- * the loop to avoid copying the SKB once too much27162716- */26732673+ list_for_each_entry_rcu(sdata, &local->interfaces, list) {26742674+ if (!ieee80211_sdata_running(sdata))26752675+ continue;2717267627182718- if (!prev) {27192719- prev = sdata;27202720- continue;27212721- }26772677+ if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||26782678+ sdata->vif.type == NL80211_IFTYPE_AP_VLAN)26792679+ continue;2722268027232723- rx.sta = sta_info_get_bss(prev, hdr->addr2);26812681+ /*26822682+ * frame is destined for this interface, but if it's26832683+ * not also for the previous one we handle that after26842684+ * the loop to avoid copying the SKB once too much26852685+ */2724268627252725- rx.flags |= IEEE80211_RX_RA_MATCH;27262726- prepares = prepare_for_handlers(prev, &rx, hdr);27272727-27282728- if (!prepares)27292729- goto next;27302730-27312731- if (status->flag & RX_FLAG_MMIC_ERROR) {27322732- rx.sdata = prev;27332733- if (rx.flags & IEEE80211_RX_RA_MATCH)27342734- ieee80211_rx_michael_mic_report(hdr,27352735- &rx);27362736- goto next;27372737- }27382738-27392739- /*27402740- * frame was destined for the previous interface27412741- * so invoke RX handlers for it27422742- */27432743-27442744- skb_new = skb_copy(skb, GFP_ATOMIC);27452745- if (!skb_new) {27462746- if (net_ratelimit())27472747- wiphy_debug(local->hw.wiphy,27482748- "failed to copy multicast frame for %s\n",27492749- prev->name);27502750- goto next;27512751- }27522752- ieee80211_invoke_rx_handlers(prev, &rx, skb_new);27532753-next:26872687+ if (!prev) {27542688 prev = sdata;26892689+ continue;27552690 }2756269127572757- if (prev) {27582758- rx.sta = sta_info_get_bss(prev, hdr->addr2);26922692+ rx.sta = sta_info_get_bss(prev, hdr->addr2);26932693+ rx.sdata = prev;26942694+ ieee80211_prepare_and_rx_handle(&rx, skb, false);2759269527602760- rx.flags |= IEEE80211_RX_RA_MATCH;27612761- prepares = prepare_for_handlers(prev, &rx, hdr);27622762-27632763- if (!prepares)27642764- prev = NULL;27652765- }26962696+ prev = sdata;27662697 }27672767- if (prev)27682768- ieee80211_invoke_rx_handlers(prev, &rx, skb);27692769- else27702770- dev_kfree_skb(skb);26982698+26992699+ if (prev) {27002700+ rx.sta = sta_info_get_bss(prev, hdr->addr2);27012701+ rx.sdata = prev;27022702+27032703+ if (ieee80211_prepare_and_rx_handle(&rx, skb, true))27042704+ return;27052705+ }27062706+27072707+ dev_kfree_skb(skb);27712708}2772270927732710/*···28172800 rate = &sband->bitrates[status->rate_idx];28182801 }28192802 }28032803+28042804+ status->rx_flags = 0;2820280528212806 /*28222807 * key references and virtual interfaces are protected using RCU
···838838 mutex_unlock(&local->sta_mtx);839839}840840841841-struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw,842842- const u8 *addr)841841+struct ieee80211_sta *ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw,842842+ const u8 *addr,843843+ const u8 *localaddr)843844{844845 struct sta_info *sta, *nxt;845846846846- /* Just return a random station ... first in list ... */847847+ /*848848+ * Just return a random station if localaddr is NULL849849+ * ... first in list.850850+ */847851 for_each_sta_info(hw_to_local(hw), addr, sta, nxt) {852852+ if (localaddr &&853853+ compare_ether_addr(sta->sdata->vif.addr, localaddr) != 0)854854+ continue;848855 if (!sta->uploaded)849856 return NULL;850857 return &sta->sta;···859852860853 return NULL;861854}862862-EXPORT_SYMBOL_GPL(ieee80211_find_sta_by_hw);855855+EXPORT_SYMBOL_GPL(ieee80211_find_sta_by_ifaddr);863856864857struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif,865858 const u8 *addr)
···895895896896int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,897897 const u8 *ie, size_t ie_len,898898- enum ieee80211_band band)898898+ enum ieee80211_band band, u32 rate_mask,899899+ u8 channel)899900{900901 struct ieee80211_supported_band *sband;901902 u8 *pos;902903 size_t offset = 0, noffset;903904 int supp_rates_len, i;905905+ u8 rates[32];906906+ int num_rates;907907+ int ext_rates_len;904908905909 sband = local->hw.wiphy->bands[band];906910907911 pos = buffer;908912909909- supp_rates_len = min_t(int, sband->n_bitrates, 8);913913+ num_rates = 0;914914+ for (i = 0; i < sband->n_bitrates; i++) {915915+ if ((BIT(i) & rate_mask) == 0)916916+ continue; /* skip rate */917917+ rates[num_rates++] = (u8) (sband->bitrates[i].bitrate / 5);918918+ }919919+920920+ supp_rates_len = min_t(int, num_rates, 8);910921911922 *pos++ = WLAN_EID_SUPP_RATES;912923 *pos++ = supp_rates_len;913913-914914- for (i = 0; i < supp_rates_len; i++) {915915- int rate = sband->bitrates[i].bitrate;916916- *pos++ = (u8) (rate / 5);917917- }924924+ memcpy(pos, rates, supp_rates_len);925925+ pos += supp_rates_len;918926919927 /* insert "request information" if in custom IEs */920928 if (ie && ie_len) {···940932 offset = noffset;941933 }942934943943- if (sband->n_bitrates > i) {935935+ ext_rates_len = num_rates - supp_rates_len;936936+ if (ext_rates_len > 0) {944937 *pos++ = WLAN_EID_EXT_SUPP_RATES;945945- *pos++ = sband->n_bitrates - i;938938+ *pos++ = ext_rates_len;939939+ memcpy(pos, rates + supp_rates_len, ext_rates_len);940940+ pos += ext_rates_len;941941+ }946942947947- for (; i < sband->n_bitrates; i++) {948948- int rate = sband->bitrates[i].bitrate;949949- *pos++ = (u8) (rate / 5);950950- }943943+ if (channel && sband->band == IEEE80211_BAND_2GHZ) {944944+ *pos++ = WLAN_EID_DS_PARAMS;945945+ *pos++ = 1;946946+ *pos++ = channel;951947 }952948953949 /* insert custom IEs that go before HT */···10201008 struct ieee80211_mgmt *mgmt;10211009 size_t buf_len;10221010 u8 *buf;10111011+ u8 chan;1023101210241013 /* FIXME: come up with a proper value */10251014 buf = kmalloc(200 + ie_len, GFP_KERNEL);···10301017 return;10311018 }1032101910201020+ chan = ieee80211_frequency_to_channel(10211021+ local->hw.conf.channel->center_freq);10221022+10331023 buf_len = ieee80211_build_preq_ies(local, buf, ie, ie_len,10341034- local->hw.conf.channel->band);10241024+ local->hw.conf.channel->band,10251025+ sdata->rc_rateidx_mask10261026+ [local->hw.conf.channel->band],10271027+ chan);1035102810361029 skb = ieee80211_probereq_get(&local->hw, &sdata->vif,10371030 ssid, ssid_len,
+1-1
net/mac80211/wpa.c
···117117 key = &rx->key->conf.key[key_offset];118118 michael_mic(key, hdr, data, data_len, mic);119119 if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0 || wpa_test) {120120- if (!(rx->flags & IEEE80211_RX_RA_MATCH))120120+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))121121 return RX_DROP_UNUSABLE;122122123123 mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,
+19
net/wireless/ibss.c
···8888 if (wdev->ssid_len)8989 return -EALREADY;90909191+ if (!params->basic_rates) {9292+ /*9393+ * If no rates were explicitly configured,9494+ * use the mandatory rate set for 11b or9595+ * 11a for maximum compatibility.9696+ */9797+ struct ieee80211_supported_band *sband =9898+ rdev->wiphy.bands[params->channel->band];9999+ int j;100100+ u32 flag = params->channel->band == IEEE80211_BAND_5GHZ ?101101+ IEEE80211_RATE_MANDATORY_A :102102+ IEEE80211_RATE_MANDATORY_B;103103+104104+ for (j = 0; j < sband->n_bitrates; j++) {105105+ if (sband->bitrates[j].flags & flag)106106+ params->basic_rates |= BIT(j);107107+ }108108+ }109109+91110 if (WARN_ON(wdev->connect_keys))92111 kfree(wdev->connect_keys);93112 wdev->connect_keys = connkeys;
+2-18
net/wireless/nl80211.c
···41194119 goto out;41204120 }41214121 }41224122- } else {41234123- /*41244124- * If no rates were explicitly configured,41254125- * use the mandatory rate set for 11b or41264126- * 11a for maximum compatibility.41274127- */41284128- struct ieee80211_supported_band *sband =41294129- wiphy->bands[ibss.channel->band];41304130- int j;41314131- u32 flag = ibss.channel->band == IEEE80211_BAND_5GHZ ?41324132- IEEE80211_RATE_MANDATORY_A :41334133- IEEE80211_RATE_MANDATORY_B;41344134-41354135- for (j = 0; j < sband->n_bitrates; j++) {41364136- if (sband->bitrates[j].flags & flag)41374137- ibss.basic_rates |= BIT(j);41384138- }41394122 }4140412341414124 err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);···4973499049744991 err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);49754992 if (err)49764976- goto unlock_rdev;49934993+ goto unlock_rtnl;4977499449784995 wdev = dev->ieee80211_ptr;49794996···49975014unlock_rdev:49985015 cfg80211_unlock_rdev(rdev);49995016 dev_put(dev);50175017+unlock_rtnl:50005018 rtnl_unlock();5001501950025020out: