Loading MAINTAINERS +1 −2 Original line number Diff line number Diff line Loading @@ -5059,9 +5059,8 @@ S: Maintained F: drivers/net/ethernet/marvell/sk* MARVELL LIBERTAS WIRELESS DRIVER M: Dan Williams <dcbw@redhat.com> L: libertas-dev@lists.infradead.org S: Maintained S: Orphan F: drivers/net/wireless/libertas/ MARVELL MV643XX ETHERNET DRIVER Loading drivers/net/wireless/ath/ath9k/link.c +2 −1 Original line number Diff line number Diff line Loading @@ -170,6 +170,7 @@ void ath_rx_poll(unsigned long data) { struct ath_softc *sc = (struct ath_softc *)data; if (!test_bit(SC_OP_INVALID, &sc->sc_flags)) ieee80211_queue_work(sc->hw, &sc->hw_check_work); } Loading drivers/net/wireless/b43/dma.c +53 −12 Original line number Diff line number Diff line Loading @@ -1487,8 +1487,12 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, const struct b43_dma_ops *ops; struct b43_dmaring *ring; struct b43_dmadesc_meta *meta; static const struct b43_txstatus fake; /* filled with 0 */ const struct b43_txstatus *txstat; int slot, firstused; bool frame_succeed; int skip; static u8 err_out1, err_out2; ring = parse_cookie(dev, status->cookie, &slot); if (unlikely(!ring)) Loading @@ -1501,14 +1505,37 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, firstused = ring->current_slot - ring->used_slots + 1; if (firstused < 0) firstused = ring->nr_slots + firstused; skip = 0; if (unlikely(slot != firstused)) { /* This possibly is a firmware bug and will result in * malfunction, memory leaks and/or stall of DMA functionality. */ b43dbg(dev->wl, "Out of order TX status report on DMA ring %d. " "Expected %d, but got %d\n", * malfunction, memory leaks and/or stall of DMA functionality. */ if (slot == next_slot(ring, next_slot(ring, firstused))) { /* If a single header/data pair was missed, skip over * the first two slots in an attempt to recover. */ slot = firstused; skip = 2; if (!err_out1) { /* Report the error once. */ b43dbg(dev->wl, "Skip on DMA ring %d slot %d.\n", ring->index, slot); err_out1 = 1; } } else { /* More than a single header/data pair were missed. * Report this error once. */ if (!err_out2) b43dbg(dev->wl, "Out of order TX status report on DMA ring %d. Expected %d, but got %d\n", ring->index, firstused, slot); err_out2 = 1; return; } } ops = ring->ops; while (1) { Loading @@ -1522,11 +1549,13 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, slot, firstused, ring->index); break; } if (meta->skb) { struct b43_private_tx_info *priv_info = b43_get_priv_tx_info(IEEE80211_SKB_CB(meta->skb)); unmap_descbuffer(ring, meta->dmaaddr, meta->skb->len, 1); unmap_descbuffer(ring, meta->dmaaddr, meta->skb->len, 1); kfree(priv_info->bouncebuffer); priv_info->bouncebuffer = NULL; } else { Loading @@ -1538,8 +1567,9 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, struct ieee80211_tx_info *info; if (unlikely(!meta->skb)) { /* This is a scatter-gather fragment of a frame, so * the skb pointer must not be NULL. */ /* This is a scatter-gather fragment of a frame, * so the skb pointer must not be NULL. */ b43dbg(dev->wl, "TX status unexpected NULL skb " "at slot %d (first=%d) on ring %d\n", slot, firstused, ring->index); Loading @@ -1550,9 +1580,18 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, /* * Call back to inform the ieee80211 subsystem about * the status of the transmission. * the status of the transmission. When skipping over * a missed TX status report, use a status structure * filled with zeros to indicate that the frame was not * sent (frame_count 0) and not acknowledged */ frame_succeed = b43_fill_txstatus_report(dev, info, status); if (unlikely(skip)) txstat = &fake; else txstat = status; frame_succeed = b43_fill_txstatus_report(dev, info, txstat); #ifdef CONFIG_B43_DEBUG if (frame_succeed) ring->nr_succeed_tx_packets++; Loading Loading @@ -1580,12 +1619,14 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, /* Everything unmapped and free'd. So it's not used anymore. */ ring->used_slots--; if (meta->is_last_fragment) { if (meta->is_last_fragment && !skip) { /* This is the last scatter-gather * fragment of the frame. We are done. */ break; } slot = next_slot(ring, slot); if (skip > 0) --skip; } if (ring->stopped) { B43_WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME); Loading drivers/net/wireless/b43/phy_n.c +4 −4 Original line number Diff line number Diff line Loading @@ -1564,7 +1564,7 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) u16 clip_off[2] = { 0xFFFF, 0xFFFF }; u8 vcm_final = 0; s8 offset[4]; s32 offset[4]; s32 results[8][4] = { }; s32 results_min[4] = { }; s32 poll_results[4] = { }; Loading Loading @@ -1615,7 +1615,7 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) } for (i = 0; i < 4; i += 2) { s32 curr; s32 mind = 40; s32 mind = 0x100000; s32 minpoll = 249; u8 minvcm = 0; if (2 * core != i) Loading Loading @@ -1732,7 +1732,7 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) u8 regs_save_radio[2]; u16 regs_save_phy[2]; s8 offset[4]; s32 offset[4]; u8 core; u8 rail; Loading Loading @@ -1799,7 +1799,7 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) } for (i = 0; i < 4; i++) { s32 mind = 40; s32 mind = 0x100000; u8 minvcm = 0; s32 minpoll = 249; s32 curr; Loading drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c +130 −239 Original line number Diff line number Diff line Loading @@ -1137,9 +1137,8 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi, gain0_15 = ((biq1 & 0xf) << 12) | ((tia & 0xf) << 8) | ((lna2 & 0x3) << 6) | ((lna2 & 0x3) << 4) | ((lna1 & 0x3) << 2) | ((lna1 & 0x3) << 0); ((lna2 & 0x3) << 4) | ((lna1 & 0x3) << 2) | ((lna1 & 0x3) << 0); mod_phy_reg(pi, 0x4b6, (0xffff << 0), gain0_15 << 0); mod_phy_reg(pi, 0x4b7, (0xf << 0), gain16_19 << 0); Loading @@ -1157,8 +1156,6 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi, } mod_phy_reg(pi, 0x44d, (0x1 << 0), (!trsw) << 0); mod_phy_reg(pi, 0x4b1, (0x3 << 11), lna1 << 11); mod_phy_reg(pi, 0x4e6, (0x3 << 3), lna1 << 3); } Loading Loading @@ -1331,43 +1328,6 @@ static u32 wlc_lcnphy_measure_digital_power(struct brcms_phy *pi, u16 nsamples) return (iq_est.i_pwr + iq_est.q_pwr) / nsamples; } static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain, u16 tia_gain, u16 lna2_gain) { u32 i_thresh_l, q_thresh_l; u32 i_thresh_h, q_thresh_h; struct lcnphy_iq_est iq_est_h, iq_est_l; wlc_lcnphy_set_rx_gain_by_distribution(pi, 0, 0, 0, biq1_gain, tia_gain, lna2_gain, 0); wlc_lcnphy_rx_gain_override_enable(pi, true); wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0); udelay(500); write_radio_reg(pi, RADIO_2064_REG112, 0); if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l)) return false; wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0); udelay(500); write_radio_reg(pi, RADIO_2064_REG112, 0); if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h)) return false; i_thresh_l = (iq_est_l.i_pwr << 1); i_thresh_h = (iq_est_l.i_pwr << 2) + iq_est_l.i_pwr; q_thresh_l = (iq_est_l.q_pwr << 1); q_thresh_h = (iq_est_l.q_pwr << 2) + iq_est_l.q_pwr; if ((iq_est_h.i_pwr > i_thresh_l) && (iq_est_h.i_pwr < i_thresh_h) && (iq_est_h.q_pwr > q_thresh_l) && (iq_est_h.q_pwr < q_thresh_h)) return true; return false; } static bool wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, const struct lcnphy_rx_iqcomp *iqcomp, Loading @@ -1382,8 +1342,8 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, RFOverrideVal0_old, rfoverride2_old, rfoverride2val_old, rfoverride3_old, rfoverride3val_old, rfoverride4_old, rfoverride4val_old, afectrlovr_old, afectrlovrval_old; int tia_gain, lna2_gain, biq1_gain; bool set_gain; int tia_gain; u32 received_power, rx_pwr_threshold; u16 old_sslpnCalibClkEnCtrl, old_sslpnRxFeClkEnCtrl; u16 values_to_save[11]; s16 *ptr; Loading @@ -1408,7 +1368,8 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, goto cal_done; } WARN_ON(module != 1); if (module == 1) { tx_pwr_ctrl = wlc_lcnphy_get_tx_pwr_ctrl(pi); wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF); Loading Loading @@ -1471,38 +1432,28 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, mod_phy_reg(pi, 0x43b, (0x1 << 0), 1 << 0); mod_phy_reg(pi, 0x43c, (0x1 << 0), 0 << 0); wlc_lcnphy_start_tx_tone(pi, 2000, 120, 0); write_phy_reg(pi, 0x6da, 0xffff); or_phy_reg(pi, 0x6db, 0x3); wlc_lcnphy_set_trsw_override(pi, tx_switch, rx_switch); set_gain = false; lna2_gain = 3; while ((lna2_gain >= 0) && !set_gain) { tia_gain = 4; while ((tia_gain >= 0) && !set_gain) { biq1_gain = 6; wlc_lcnphy_rx_gain_override_enable(pi, true); while ((biq1_gain >= 0) && !set_gain) { set_gain = wlc_lcnphy_rx_iq_cal_gain(pi, (u16) biq1_gain, (u16) tia_gain, (u16) lna2_gain); biq1_gain -= 1; } tia_gain = 8; rx_pwr_threshold = 950; while (tia_gain > 0) { tia_gain -= 1; } lna2_gain -= 1; } wlc_lcnphy_set_rx_gain_by_distribution(pi, 0, 0, 2, 2, (u16) tia_gain, 1, 0); udelay(500); if (set_gain) result = wlc_lcnphy_calc_rx_iq_comp(pi, 1024); else result = false; received_power = wlc_lcnphy_measure_digital_power(pi, 2000); if (received_power < rx_pwr_threshold) break; } result = wlc_lcnphy_calc_rx_iq_comp(pi, 0xffff); wlc_lcnphy_stop_tx_tone(pi); Loading Loading @@ -1536,6 +1487,7 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, wlc_lcnphy_set_tx_pwr_ctrl(pi, tx_pwr_ctrl); wlc_lcnphy_rx_gain_override_enable(pi, false); } cal_done: kfree(ptr); Loading Loading @@ -1829,17 +1781,6 @@ wlc_lcnphy_radio_2064_channel_tune_4313(struct brcms_phy *pi, u8 channel) write_radio_reg(pi, RADIO_2064_REG038, 3); write_radio_reg(pi, RADIO_2064_REG091, 7); } if (!(pi->sh->boardflags & BFL_FEM)) { u8 reg038[14] = {0xd, 0xe, 0xd, 0xd, 0xd, 0xc, 0xa, 0xb, 0xb, 0x3, 0x3, 0x2, 0x0, 0x0}; write_radio_reg(pi, RADIO_2064_REG02A, 0xf); write_radio_reg(pi, RADIO_2064_REG091, 0x3); write_radio_reg(pi, RADIO_2064_REG038, 0x3); write_radio_reg(pi, RADIO_2064_REG038, reg038[channel - 1]); } } static int Loading Loading @@ -2034,16 +1975,6 @@ wlc_lcnphy_set_tssi_mux(struct brcms_phy *pi, enum lcnphy_tssi_mode pos) } else { mod_radio_reg(pi, RADIO_2064_REG03A, 1, 0x1); mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8); mod_radio_reg(pi, RADIO_2064_REG028, 0x1, 0x0); mod_radio_reg(pi, RADIO_2064_REG11A, 0x4, 1<<2); mod_radio_reg(pi, RADIO_2064_REG036, 0x10, 0x0); mod_radio_reg(pi, RADIO_2064_REG11A, 0x10, 1<<4); mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0); mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x77); mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, 0xe<<1); mod_radio_reg(pi, RADIO_2064_REG112, 0x80, 1<<7); mod_radio_reg(pi, RADIO_2064_REG005, 0x7, 1<<1); mod_radio_reg(pi, RADIO_2064_REG029, 0xf0, 0<<4); } } else { mod_phy_reg(pi, 0x4d9, (0x1 << 2), (0x1) << 2); Loading Loading @@ -2130,14 +2061,12 @@ static void wlc_lcnphy_pwrctrl_rssiparams(struct brcms_phy *pi) (auxpga_vmid_temp << 0) | (auxpga_gain_temp << 12)); mod_radio_reg(pi, RADIO_2064_REG082, (1 << 5), (1 << 5)); mod_radio_reg(pi, RADIO_2064_REG07C, (1 << 0), (1 << 0)); } static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) { struct phytbl_info tab; u32 rfseq, ind; u8 tssi_sel; tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL; tab.tbl_width = 32; Loading @@ -2159,13 +2088,7 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) mod_phy_reg(pi, 0x503, (0x1 << 4), (1) << 4); if (pi->sh->boardflags & BFL_FEM) { tssi_sel = 0x1; wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_EXT); } else { tssi_sel = 0xe; wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_POST_PA); } mod_phy_reg(pi, 0x4a4, (0x1 << 14), (0) << 14); mod_phy_reg(pi, 0x4a4, (0x1 << 15), (1) << 15); Loading Loading @@ -2201,10 +2124,9 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) mod_phy_reg(pi, 0x49a, (0x1ff << 0), (0xff) << 0); if (LCNREV_IS(pi->pubpi.phy_rev, 2)) { mod_radio_reg(pi, RADIO_2064_REG028, 0xf, tssi_sel); mod_radio_reg(pi, RADIO_2064_REG028, 0xf, 0xe); mod_radio_reg(pi, RADIO_2064_REG086, 0x4, 0x4); } else { mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, tssi_sel << 1); mod_radio_reg(pi, RADIO_2064_REG03A, 0x1, 1); mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 1 << 3); } Loading Loading @@ -2251,10 +2173,6 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) mod_phy_reg(pi, 0x4d7, (0xf << 8), (0) << 8); mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x0); mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0); mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8); wlc_lcnphy_pwrctrl_rssiparams(pi); } Loading Loading @@ -2873,8 +2791,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) read_radio_reg(pi, RADIO_2064_REG007) & 1; u16 SAVE_jtag_auxpga = read_radio_reg(pi, RADIO_2064_REG0FF) & 0x10; u16 SAVE_iqadc_aux_en = read_radio_reg(pi, RADIO_2064_REG11F) & 4; u8 SAVE_bbmult = wlc_lcnphy_get_bbmult(pi); idleTssi = read_phy_reg(pi, 0x4ab); suspend = (0 == (bcma_read32(pi->d11core, D11REGOFFS(maccontrol)) & MCTL_EN_MAC)); Loading @@ -2892,12 +2808,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) mod_radio_reg(pi, RADIO_2064_REG0FF, 0x10, 1 << 4); mod_radio_reg(pi, RADIO_2064_REG11F, 0x4, 1 << 2); wlc_lcnphy_tssi_setup(pi); mod_phy_reg(pi, 0x4d7, (0x1 << 0), (1 << 0)); mod_phy_reg(pi, 0x4d7, (0x1 << 6), (1 << 6)); wlc_lcnphy_set_bbmult(pi, 0x0); wlc_phy_do_dummy_tx(pi, true, OFF); idleTssi = ((read_phy_reg(pi, 0x4ab) & (0x1ff << 0)) >> 0); Loading @@ -2919,7 +2829,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) mod_phy_reg(pi, 0x44c, (0x1 << 12), (0) << 12); wlc_lcnphy_set_bbmult(pi, SAVE_bbmult); wlc_lcnphy_set_tx_gain_override(pi, tx_gain_override_old); wlc_lcnphy_set_tx_gain(pi, &old_gains); wlc_lcnphy_set_tx_pwr_ctrl(pi, SAVE_txpwrctrl); Loading Loading @@ -3133,11 +3042,6 @@ static void wlc_lcnphy_tx_pwr_ctrl_init(struct brcms_phy_pub *ppi) wlc_lcnphy_write_table(pi, &tab); tab.tbl_offset++; } mod_phy_reg(pi, 0x4d0, (0x1 << 0), (0) << 0); mod_phy_reg(pi, 0x4d3, (0xff << 0), (0) << 0); mod_phy_reg(pi, 0x4d3, (0xff << 8), (0) << 8); mod_phy_reg(pi, 0x4d0, (0x1 << 4), (0) << 4); mod_phy_reg(pi, 0x4d0, (0x1 << 2), (0) << 2); mod_phy_reg(pi, 0x410, (0x1 << 7), (0) << 7); Loading Loading @@ -3939,6 +3843,7 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi) target_gains.pad_gain = 21; target_gains.dac_gain = 0; wlc_lcnphy_set_tx_gain(pi, &target_gains); wlc_lcnphy_set_tx_pwr_by_index(pi, 16); if (LCNREV_IS(pi->pubpi.phy_rev, 1) || pi_lcn->lcnphy_hw_iqcal_en) { Loading @@ -3949,7 +3854,6 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi) lcnphy_recal ? LCNPHY_CAL_RECAL : LCNPHY_CAL_FULL), false); } else { wlc_lcnphy_set_tx_pwr_by_index(pi, 16); wlc_lcnphy_tx_iqlo_soft_cal_full(pi); } Loading Loading @@ -4374,22 +4278,17 @@ wlc_lcnphy_load_tx_gain_table(struct brcms_phy *pi, if (CHSPEC_IS5G(pi->radio_chanspec)) pa_gain = 0x70; else pa_gain = 0x60; pa_gain = 0x70; if (pi->sh->boardflags & BFL_FEM) pa_gain = 0x10; tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL; tab.tbl_width = 32; tab.tbl_len = 1; tab.tbl_ptr = &val; for (j = 0; j < 128; j++) { if (pi->sh->boardflags & BFL_FEM) gm_gain = gain_table[j].gm; else gm_gain = 15; val = (((u32) pa_gain << 24) | (gain_table[j].pad << 16) | (gain_table[j].pga << 8) | gm_gain); Loading Loading @@ -4600,10 +4499,7 @@ static void wlc_radio_2064_init(struct brcms_phy *pi) write_phy_reg(pi, 0x4ea, 0x4688); if (pi->sh->boardflags & BFL_FEM) mod_phy_reg(pi, 0x4eb, (0x7 << 0), 2 << 0); else mod_phy_reg(pi, 0x4eb, (0x7 << 0), 3 << 0); mod_phy_reg(pi, 0x4eb, (0x7 << 6), 0 << 6); Loading @@ -4614,13 +4510,6 @@ static void wlc_radio_2064_init(struct brcms_phy *pi) wlc_lcnphy_rcal(pi); wlc_lcnphy_rc_cal(pi); if (!(pi->sh->boardflags & BFL_FEM)) { write_radio_reg(pi, RADIO_2064_REG032, 0x6f); write_radio_reg(pi, RADIO_2064_REG033, 0x19); write_radio_reg(pi, RADIO_2064_REG039, 0xe); } } static void wlc_lcnphy_radio_init(struct brcms_phy *pi) Loading Loading @@ -4650,20 +4539,22 @@ static void wlc_lcnphy_tbl_init(struct brcms_phy *pi) wlc_lcnphy_write_table(pi, &tab); } if (!(pi->sh->boardflags & BFL_FEM)) { tab.tbl_id = LCNPHY_TBL_ID_RFSEQ; tab.tbl_width = 16; tab.tbl_ptr = &val; tab.tbl_len = 1; val = 150; val = 114; tab.tbl_offset = 0; wlc_lcnphy_write_table(pi, &tab); val = 220; val = 130; tab.tbl_offset = 1; wlc_lcnphy_write_table(pi, &tab); } val = 6; tab.tbl_offset = 8; wlc_lcnphy_write_table(pi, &tab); if (CHSPEC_IS2G(pi->radio_chanspec)) { if (pi->sh->boardflags & BFL_FEM) Loading Loading @@ -5055,7 +4946,6 @@ void wlc_phy_chanspec_set_lcnphy(struct brcms_phy *pi, u16 chanspec) wlc_lcnphy_load_tx_iir_filter(pi, true, 3); mod_phy_reg(pi, 0x4eb, (0x7 << 3), (1) << 3); wlc_lcnphy_tssi_setup(pi); } void wlc_phy_detach_lcnphy(struct brcms_phy *pi) Loading Loading @@ -5094,7 +4984,8 @@ bool wlc_phy_attach_lcnphy(struct brcms_phy *pi) if (!wlc_phy_txpwr_srom_read_lcnphy(pi)) return false; if (LCNREV_IS(pi->pubpi.phy_rev, 1)) { if ((pi->sh->boardflags & BFL_FEM) && (LCNREV_IS(pi->pubpi.phy_rev, 1))) { if (pi_lcn->lcnphy_tempsense_option == 3) { pi->hwpwrctrl = true; pi->hwpwrctrl_capable = true; Loading Loading
MAINTAINERS +1 −2 Original line number Diff line number Diff line Loading @@ -5059,9 +5059,8 @@ S: Maintained F: drivers/net/ethernet/marvell/sk* MARVELL LIBERTAS WIRELESS DRIVER M: Dan Williams <dcbw@redhat.com> L: libertas-dev@lists.infradead.org S: Maintained S: Orphan F: drivers/net/wireless/libertas/ MARVELL MV643XX ETHERNET DRIVER Loading
drivers/net/wireless/ath/ath9k/link.c +2 −1 Original line number Diff line number Diff line Loading @@ -170,6 +170,7 @@ void ath_rx_poll(unsigned long data) { struct ath_softc *sc = (struct ath_softc *)data; if (!test_bit(SC_OP_INVALID, &sc->sc_flags)) ieee80211_queue_work(sc->hw, &sc->hw_check_work); } Loading
drivers/net/wireless/b43/dma.c +53 −12 Original line number Diff line number Diff line Loading @@ -1487,8 +1487,12 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, const struct b43_dma_ops *ops; struct b43_dmaring *ring; struct b43_dmadesc_meta *meta; static const struct b43_txstatus fake; /* filled with 0 */ const struct b43_txstatus *txstat; int slot, firstused; bool frame_succeed; int skip; static u8 err_out1, err_out2; ring = parse_cookie(dev, status->cookie, &slot); if (unlikely(!ring)) Loading @@ -1501,14 +1505,37 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, firstused = ring->current_slot - ring->used_slots + 1; if (firstused < 0) firstused = ring->nr_slots + firstused; skip = 0; if (unlikely(slot != firstused)) { /* This possibly is a firmware bug and will result in * malfunction, memory leaks and/or stall of DMA functionality. */ b43dbg(dev->wl, "Out of order TX status report on DMA ring %d. " "Expected %d, but got %d\n", * malfunction, memory leaks and/or stall of DMA functionality. */ if (slot == next_slot(ring, next_slot(ring, firstused))) { /* If a single header/data pair was missed, skip over * the first two slots in an attempt to recover. */ slot = firstused; skip = 2; if (!err_out1) { /* Report the error once. */ b43dbg(dev->wl, "Skip on DMA ring %d slot %d.\n", ring->index, slot); err_out1 = 1; } } else { /* More than a single header/data pair were missed. * Report this error once. */ if (!err_out2) b43dbg(dev->wl, "Out of order TX status report on DMA ring %d. Expected %d, but got %d\n", ring->index, firstused, slot); err_out2 = 1; return; } } ops = ring->ops; while (1) { Loading @@ -1522,11 +1549,13 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, slot, firstused, ring->index); break; } if (meta->skb) { struct b43_private_tx_info *priv_info = b43_get_priv_tx_info(IEEE80211_SKB_CB(meta->skb)); unmap_descbuffer(ring, meta->dmaaddr, meta->skb->len, 1); unmap_descbuffer(ring, meta->dmaaddr, meta->skb->len, 1); kfree(priv_info->bouncebuffer); priv_info->bouncebuffer = NULL; } else { Loading @@ -1538,8 +1567,9 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, struct ieee80211_tx_info *info; if (unlikely(!meta->skb)) { /* This is a scatter-gather fragment of a frame, so * the skb pointer must not be NULL. */ /* This is a scatter-gather fragment of a frame, * so the skb pointer must not be NULL. */ b43dbg(dev->wl, "TX status unexpected NULL skb " "at slot %d (first=%d) on ring %d\n", slot, firstused, ring->index); Loading @@ -1550,9 +1580,18 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, /* * Call back to inform the ieee80211 subsystem about * the status of the transmission. * the status of the transmission. When skipping over * a missed TX status report, use a status structure * filled with zeros to indicate that the frame was not * sent (frame_count 0) and not acknowledged */ frame_succeed = b43_fill_txstatus_report(dev, info, status); if (unlikely(skip)) txstat = &fake; else txstat = status; frame_succeed = b43_fill_txstatus_report(dev, info, txstat); #ifdef CONFIG_B43_DEBUG if (frame_succeed) ring->nr_succeed_tx_packets++; Loading Loading @@ -1580,12 +1619,14 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, /* Everything unmapped and free'd. So it's not used anymore. */ ring->used_slots--; if (meta->is_last_fragment) { if (meta->is_last_fragment && !skip) { /* This is the last scatter-gather * fragment of the frame. We are done. */ break; } slot = next_slot(ring, slot); if (skip > 0) --skip; } if (ring->stopped) { B43_WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME); Loading
drivers/net/wireless/b43/phy_n.c +4 −4 Original line number Diff line number Diff line Loading @@ -1564,7 +1564,7 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) u16 clip_off[2] = { 0xFFFF, 0xFFFF }; u8 vcm_final = 0; s8 offset[4]; s32 offset[4]; s32 results[8][4] = { }; s32 results_min[4] = { }; s32 poll_results[4] = { }; Loading Loading @@ -1615,7 +1615,7 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) } for (i = 0; i < 4; i += 2) { s32 curr; s32 mind = 40; s32 mind = 0x100000; s32 minpoll = 249; u8 minvcm = 0; if (2 * core != i) Loading Loading @@ -1732,7 +1732,7 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) u8 regs_save_radio[2]; u16 regs_save_phy[2]; s8 offset[4]; s32 offset[4]; u8 core; u8 rail; Loading Loading @@ -1799,7 +1799,7 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) } for (i = 0; i < 4; i++) { s32 mind = 40; s32 mind = 0x100000; u8 minvcm = 0; s32 minpoll = 249; s32 curr; Loading
drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c +130 −239 Original line number Diff line number Diff line Loading @@ -1137,9 +1137,8 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi, gain0_15 = ((biq1 & 0xf) << 12) | ((tia & 0xf) << 8) | ((lna2 & 0x3) << 6) | ((lna2 & 0x3) << 4) | ((lna1 & 0x3) << 2) | ((lna1 & 0x3) << 0); ((lna2 & 0x3) << 4) | ((lna1 & 0x3) << 2) | ((lna1 & 0x3) << 0); mod_phy_reg(pi, 0x4b6, (0xffff << 0), gain0_15 << 0); mod_phy_reg(pi, 0x4b7, (0xf << 0), gain16_19 << 0); Loading @@ -1157,8 +1156,6 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi, } mod_phy_reg(pi, 0x44d, (0x1 << 0), (!trsw) << 0); mod_phy_reg(pi, 0x4b1, (0x3 << 11), lna1 << 11); mod_phy_reg(pi, 0x4e6, (0x3 << 3), lna1 << 3); } Loading Loading @@ -1331,43 +1328,6 @@ static u32 wlc_lcnphy_measure_digital_power(struct brcms_phy *pi, u16 nsamples) return (iq_est.i_pwr + iq_est.q_pwr) / nsamples; } static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain, u16 tia_gain, u16 lna2_gain) { u32 i_thresh_l, q_thresh_l; u32 i_thresh_h, q_thresh_h; struct lcnphy_iq_est iq_est_h, iq_est_l; wlc_lcnphy_set_rx_gain_by_distribution(pi, 0, 0, 0, biq1_gain, tia_gain, lna2_gain, 0); wlc_lcnphy_rx_gain_override_enable(pi, true); wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0); udelay(500); write_radio_reg(pi, RADIO_2064_REG112, 0); if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l)) return false; wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0); udelay(500); write_radio_reg(pi, RADIO_2064_REG112, 0); if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h)) return false; i_thresh_l = (iq_est_l.i_pwr << 1); i_thresh_h = (iq_est_l.i_pwr << 2) + iq_est_l.i_pwr; q_thresh_l = (iq_est_l.q_pwr << 1); q_thresh_h = (iq_est_l.q_pwr << 2) + iq_est_l.q_pwr; if ((iq_est_h.i_pwr > i_thresh_l) && (iq_est_h.i_pwr < i_thresh_h) && (iq_est_h.q_pwr > q_thresh_l) && (iq_est_h.q_pwr < q_thresh_h)) return true; return false; } static bool wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, const struct lcnphy_rx_iqcomp *iqcomp, Loading @@ -1382,8 +1342,8 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, RFOverrideVal0_old, rfoverride2_old, rfoverride2val_old, rfoverride3_old, rfoverride3val_old, rfoverride4_old, rfoverride4val_old, afectrlovr_old, afectrlovrval_old; int tia_gain, lna2_gain, biq1_gain; bool set_gain; int tia_gain; u32 received_power, rx_pwr_threshold; u16 old_sslpnCalibClkEnCtrl, old_sslpnRxFeClkEnCtrl; u16 values_to_save[11]; s16 *ptr; Loading @@ -1408,7 +1368,8 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, goto cal_done; } WARN_ON(module != 1); if (module == 1) { tx_pwr_ctrl = wlc_lcnphy_get_tx_pwr_ctrl(pi); wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF); Loading Loading @@ -1471,38 +1432,28 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, mod_phy_reg(pi, 0x43b, (0x1 << 0), 1 << 0); mod_phy_reg(pi, 0x43c, (0x1 << 0), 0 << 0); wlc_lcnphy_start_tx_tone(pi, 2000, 120, 0); write_phy_reg(pi, 0x6da, 0xffff); or_phy_reg(pi, 0x6db, 0x3); wlc_lcnphy_set_trsw_override(pi, tx_switch, rx_switch); set_gain = false; lna2_gain = 3; while ((lna2_gain >= 0) && !set_gain) { tia_gain = 4; while ((tia_gain >= 0) && !set_gain) { biq1_gain = 6; wlc_lcnphy_rx_gain_override_enable(pi, true); while ((biq1_gain >= 0) && !set_gain) { set_gain = wlc_lcnphy_rx_iq_cal_gain(pi, (u16) biq1_gain, (u16) tia_gain, (u16) lna2_gain); biq1_gain -= 1; } tia_gain = 8; rx_pwr_threshold = 950; while (tia_gain > 0) { tia_gain -= 1; } lna2_gain -= 1; } wlc_lcnphy_set_rx_gain_by_distribution(pi, 0, 0, 2, 2, (u16) tia_gain, 1, 0); udelay(500); if (set_gain) result = wlc_lcnphy_calc_rx_iq_comp(pi, 1024); else result = false; received_power = wlc_lcnphy_measure_digital_power(pi, 2000); if (received_power < rx_pwr_threshold) break; } result = wlc_lcnphy_calc_rx_iq_comp(pi, 0xffff); wlc_lcnphy_stop_tx_tone(pi); Loading Loading @@ -1536,6 +1487,7 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, wlc_lcnphy_set_tx_pwr_ctrl(pi, tx_pwr_ctrl); wlc_lcnphy_rx_gain_override_enable(pi, false); } cal_done: kfree(ptr); Loading Loading @@ -1829,17 +1781,6 @@ wlc_lcnphy_radio_2064_channel_tune_4313(struct brcms_phy *pi, u8 channel) write_radio_reg(pi, RADIO_2064_REG038, 3); write_radio_reg(pi, RADIO_2064_REG091, 7); } if (!(pi->sh->boardflags & BFL_FEM)) { u8 reg038[14] = {0xd, 0xe, 0xd, 0xd, 0xd, 0xc, 0xa, 0xb, 0xb, 0x3, 0x3, 0x2, 0x0, 0x0}; write_radio_reg(pi, RADIO_2064_REG02A, 0xf); write_radio_reg(pi, RADIO_2064_REG091, 0x3); write_radio_reg(pi, RADIO_2064_REG038, 0x3); write_radio_reg(pi, RADIO_2064_REG038, reg038[channel - 1]); } } static int Loading Loading @@ -2034,16 +1975,6 @@ wlc_lcnphy_set_tssi_mux(struct brcms_phy *pi, enum lcnphy_tssi_mode pos) } else { mod_radio_reg(pi, RADIO_2064_REG03A, 1, 0x1); mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8); mod_radio_reg(pi, RADIO_2064_REG028, 0x1, 0x0); mod_radio_reg(pi, RADIO_2064_REG11A, 0x4, 1<<2); mod_radio_reg(pi, RADIO_2064_REG036, 0x10, 0x0); mod_radio_reg(pi, RADIO_2064_REG11A, 0x10, 1<<4); mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0); mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x77); mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, 0xe<<1); mod_radio_reg(pi, RADIO_2064_REG112, 0x80, 1<<7); mod_radio_reg(pi, RADIO_2064_REG005, 0x7, 1<<1); mod_radio_reg(pi, RADIO_2064_REG029, 0xf0, 0<<4); } } else { mod_phy_reg(pi, 0x4d9, (0x1 << 2), (0x1) << 2); Loading Loading @@ -2130,14 +2061,12 @@ static void wlc_lcnphy_pwrctrl_rssiparams(struct brcms_phy *pi) (auxpga_vmid_temp << 0) | (auxpga_gain_temp << 12)); mod_radio_reg(pi, RADIO_2064_REG082, (1 << 5), (1 << 5)); mod_radio_reg(pi, RADIO_2064_REG07C, (1 << 0), (1 << 0)); } static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) { struct phytbl_info tab; u32 rfseq, ind; u8 tssi_sel; tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL; tab.tbl_width = 32; Loading @@ -2159,13 +2088,7 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) mod_phy_reg(pi, 0x503, (0x1 << 4), (1) << 4); if (pi->sh->boardflags & BFL_FEM) { tssi_sel = 0x1; wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_EXT); } else { tssi_sel = 0xe; wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_POST_PA); } mod_phy_reg(pi, 0x4a4, (0x1 << 14), (0) << 14); mod_phy_reg(pi, 0x4a4, (0x1 << 15), (1) << 15); Loading Loading @@ -2201,10 +2124,9 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) mod_phy_reg(pi, 0x49a, (0x1ff << 0), (0xff) << 0); if (LCNREV_IS(pi->pubpi.phy_rev, 2)) { mod_radio_reg(pi, RADIO_2064_REG028, 0xf, tssi_sel); mod_radio_reg(pi, RADIO_2064_REG028, 0xf, 0xe); mod_radio_reg(pi, RADIO_2064_REG086, 0x4, 0x4); } else { mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, tssi_sel << 1); mod_radio_reg(pi, RADIO_2064_REG03A, 0x1, 1); mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 1 << 3); } Loading Loading @@ -2251,10 +2173,6 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) mod_phy_reg(pi, 0x4d7, (0xf << 8), (0) << 8); mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x0); mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0); mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8); wlc_lcnphy_pwrctrl_rssiparams(pi); } Loading Loading @@ -2873,8 +2791,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) read_radio_reg(pi, RADIO_2064_REG007) & 1; u16 SAVE_jtag_auxpga = read_radio_reg(pi, RADIO_2064_REG0FF) & 0x10; u16 SAVE_iqadc_aux_en = read_radio_reg(pi, RADIO_2064_REG11F) & 4; u8 SAVE_bbmult = wlc_lcnphy_get_bbmult(pi); idleTssi = read_phy_reg(pi, 0x4ab); suspend = (0 == (bcma_read32(pi->d11core, D11REGOFFS(maccontrol)) & MCTL_EN_MAC)); Loading @@ -2892,12 +2808,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) mod_radio_reg(pi, RADIO_2064_REG0FF, 0x10, 1 << 4); mod_radio_reg(pi, RADIO_2064_REG11F, 0x4, 1 << 2); wlc_lcnphy_tssi_setup(pi); mod_phy_reg(pi, 0x4d7, (0x1 << 0), (1 << 0)); mod_phy_reg(pi, 0x4d7, (0x1 << 6), (1 << 6)); wlc_lcnphy_set_bbmult(pi, 0x0); wlc_phy_do_dummy_tx(pi, true, OFF); idleTssi = ((read_phy_reg(pi, 0x4ab) & (0x1ff << 0)) >> 0); Loading @@ -2919,7 +2829,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) mod_phy_reg(pi, 0x44c, (0x1 << 12), (0) << 12); wlc_lcnphy_set_bbmult(pi, SAVE_bbmult); wlc_lcnphy_set_tx_gain_override(pi, tx_gain_override_old); wlc_lcnphy_set_tx_gain(pi, &old_gains); wlc_lcnphy_set_tx_pwr_ctrl(pi, SAVE_txpwrctrl); Loading Loading @@ -3133,11 +3042,6 @@ static void wlc_lcnphy_tx_pwr_ctrl_init(struct brcms_phy_pub *ppi) wlc_lcnphy_write_table(pi, &tab); tab.tbl_offset++; } mod_phy_reg(pi, 0x4d0, (0x1 << 0), (0) << 0); mod_phy_reg(pi, 0x4d3, (0xff << 0), (0) << 0); mod_phy_reg(pi, 0x4d3, (0xff << 8), (0) << 8); mod_phy_reg(pi, 0x4d0, (0x1 << 4), (0) << 4); mod_phy_reg(pi, 0x4d0, (0x1 << 2), (0) << 2); mod_phy_reg(pi, 0x410, (0x1 << 7), (0) << 7); Loading Loading @@ -3939,6 +3843,7 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi) target_gains.pad_gain = 21; target_gains.dac_gain = 0; wlc_lcnphy_set_tx_gain(pi, &target_gains); wlc_lcnphy_set_tx_pwr_by_index(pi, 16); if (LCNREV_IS(pi->pubpi.phy_rev, 1) || pi_lcn->lcnphy_hw_iqcal_en) { Loading @@ -3949,7 +3854,6 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi) lcnphy_recal ? LCNPHY_CAL_RECAL : LCNPHY_CAL_FULL), false); } else { wlc_lcnphy_set_tx_pwr_by_index(pi, 16); wlc_lcnphy_tx_iqlo_soft_cal_full(pi); } Loading Loading @@ -4374,22 +4278,17 @@ wlc_lcnphy_load_tx_gain_table(struct brcms_phy *pi, if (CHSPEC_IS5G(pi->radio_chanspec)) pa_gain = 0x70; else pa_gain = 0x60; pa_gain = 0x70; if (pi->sh->boardflags & BFL_FEM) pa_gain = 0x10; tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL; tab.tbl_width = 32; tab.tbl_len = 1; tab.tbl_ptr = &val; for (j = 0; j < 128; j++) { if (pi->sh->boardflags & BFL_FEM) gm_gain = gain_table[j].gm; else gm_gain = 15; val = (((u32) pa_gain << 24) | (gain_table[j].pad << 16) | (gain_table[j].pga << 8) | gm_gain); Loading Loading @@ -4600,10 +4499,7 @@ static void wlc_radio_2064_init(struct brcms_phy *pi) write_phy_reg(pi, 0x4ea, 0x4688); if (pi->sh->boardflags & BFL_FEM) mod_phy_reg(pi, 0x4eb, (0x7 << 0), 2 << 0); else mod_phy_reg(pi, 0x4eb, (0x7 << 0), 3 << 0); mod_phy_reg(pi, 0x4eb, (0x7 << 6), 0 << 6); Loading @@ -4614,13 +4510,6 @@ static void wlc_radio_2064_init(struct brcms_phy *pi) wlc_lcnphy_rcal(pi); wlc_lcnphy_rc_cal(pi); if (!(pi->sh->boardflags & BFL_FEM)) { write_radio_reg(pi, RADIO_2064_REG032, 0x6f); write_radio_reg(pi, RADIO_2064_REG033, 0x19); write_radio_reg(pi, RADIO_2064_REG039, 0xe); } } static void wlc_lcnphy_radio_init(struct brcms_phy *pi) Loading Loading @@ -4650,20 +4539,22 @@ static void wlc_lcnphy_tbl_init(struct brcms_phy *pi) wlc_lcnphy_write_table(pi, &tab); } if (!(pi->sh->boardflags & BFL_FEM)) { tab.tbl_id = LCNPHY_TBL_ID_RFSEQ; tab.tbl_width = 16; tab.tbl_ptr = &val; tab.tbl_len = 1; val = 150; val = 114; tab.tbl_offset = 0; wlc_lcnphy_write_table(pi, &tab); val = 220; val = 130; tab.tbl_offset = 1; wlc_lcnphy_write_table(pi, &tab); } val = 6; tab.tbl_offset = 8; wlc_lcnphy_write_table(pi, &tab); if (CHSPEC_IS2G(pi->radio_chanspec)) { if (pi->sh->boardflags & BFL_FEM) Loading Loading @@ -5055,7 +4946,6 @@ void wlc_phy_chanspec_set_lcnphy(struct brcms_phy *pi, u16 chanspec) wlc_lcnphy_load_tx_iir_filter(pi, true, 3); mod_phy_reg(pi, 0x4eb, (0x7 << 3), (1) << 3); wlc_lcnphy_tssi_setup(pi); } void wlc_phy_detach_lcnphy(struct brcms_phy *pi) Loading Loading @@ -5094,7 +4984,8 @@ bool wlc_phy_attach_lcnphy(struct brcms_phy *pi) if (!wlc_phy_txpwr_srom_read_lcnphy(pi)) return false; if (LCNREV_IS(pi->pubpi.phy_rev, 1)) { if ((pi->sh->boardflags & BFL_FEM) && (LCNREV_IS(pi->pubpi.phy_rev, 1))) { if (pi_lcn->lcnphy_tempsense_option == 3) { pi->hwpwrctrl = true; pi->hwpwrctrl_capable = true; Loading