Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7dcfdcd9 authored by Sujith's avatar Sujith Committed by John W. Linville
Browse files

ath9k: RX Filter cleanup

parent f45144ef
Loading
Loading
Loading
Loading
+0 −53
Original line number Diff line number Diff line
@@ -21,9 +21,6 @@

static int ath_outdoor;		/* enable outdoor use */

static const u8 ath_bcast_mac[ETH_ALEN] =
    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };

static u32 ath_chainmask_sel_up_rssi_thres =
	ATH_CHAINMASK_SEL_UP_RSSI_THRES;
static u32 ath_chainmask_sel_down_rssi_thres =
@@ -306,56 +303,6 @@ static int ath_stop(struct ath_softc *sc)
	return 0;
}

/*
 *  Start Scan
 *
 *  This function is called when starting a channel scan.  It will perform
 *  power save wakeup processing, set the filter for the scan, and get the
 *  chip ready to send broadcast packets out during the scan.
*/

void ath_scan_start(struct ath_softc *sc)
{
	struct ath_hal *ah = sc->sc_ah;
	u32 rfilt;
	u32 now = (u32) jiffies_to_msecs(get_timestamp());

	sc->sc_scanning = 1;
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(ah, rfilt);
	ath9k_hw_write_associd(ah, ath_bcast_mac, 0);

	/* Restore previous power management state. */

	DPRINTF(sc, ATH_DBG_CONFIG, "%d.%03d | %s: RX filter 0x%x aid 0\n",
		now / 1000, now % 1000, __func__, rfilt);
}

/*
 *  Scan End
 *
 *  This routine is called by the upper layer when the scan is completed.  This
 *  will set the filters back to normal operating mode, set the BSSID to the
 *  correct value, and restore the power save state.
*/

void ath_scan_end(struct ath_softc *sc)
{
	struct ath_hal *ah = sc->sc_ah;
	u32 rfilt;
	u32 now = (u32) jiffies_to_msecs(get_timestamp());

	sc->sc_scanning = 0;
	/* Request for a full reset due to rx packet filter changes */
	sc->sc_full_reset = 1;
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(ah, rfilt);
	ath9k_hw_write_associd(ah, sc->sc_curbssid, sc->sc_curaid);

	DPRINTF(sc, ATH_DBG_CONFIG, "%d.%03d | %s: RX filter 0x%x aid 0x%x\n",
		now / 1000, now % 1000, __func__, rfilt, sc->sc_curaid);
}

/*
 * Set the current channel
 *
+3 −2
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ static inline unsigned long get_timestamp(void)
	return ((jiffies / HZ) * 1000) + (jiffies % HZ) * (1000 / HZ);
}

static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};

/*************/
/* Debugging */
/*************/
@@ -919,10 +921,9 @@ struct ath_softc {
	struct ath_rate_softc *sc_rc;	/* tx rate control support */
	u32 sc_intrstatus;
	enum ath9k_opmode sc_opmode;	/* current operating mode */

	unsigned int rx_filter;
	u8 sc_invalid;			/* being detached */
	u8 sc_beacons;			/* beacons running */
	u8 sc_scanning;			/* scanning active */
	u8 sc_txaggr;			/* enable 11n tx aggregation */
	u8 sc_rxaggr;			/* enable 11n rx aggregation */
	u8 sc_update_chainmask;		/* change chain mask */
+10 −9
Original line number Diff line number Diff line
@@ -549,10 +549,6 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
			/* Update ratectrl about the new state */
			ath_rate_newstate(sc, avp);

			/* Set rx filter */
			rfilt = ath_calcrxfilter(sc);
			ath9k_hw_setrxfilter(sc->sc_ah, rfilt);

			/* Set BSSID */
			memcpy(sc->sc_curbssid, conf->bssid, ETH_ALEN);
			sc->sc_curaid = 0;
@@ -636,8 +632,7 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
	FIF_BCN_PRBRESP_PROMISC |		\
	FIF_FCSFAIL)

/* Accept unicast, bcast and mcast frames */

/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
@@ -645,16 +640,22 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   struct dev_mc_list *mclist)
{
	struct ath_softc *sc = hw->priv;
	u32 rfilt;

	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;

	sc->rx_filter = *total_flags;
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);

	if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
		if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
			ath_scan_start(sc);
		else
			ath_scan_end(sc);
			ath9k_hw_write_associd(sc->sc_ah, ath_bcast_mac, 0);
	}

	DPRINTF(sc, ATH_DBG_CONFIG, "%s: Set HW RX filter: 0x%x\n",
		__func__, sc->rx_filter);
}

static void ath9k_sta_notify(struct ieee80211_hw *hw,
+8 −3
Original line number Diff line number Diff line
@@ -597,6 +597,7 @@ void ath_rx_cleanup(struct ath_softc *sc)
u32 ath_calcrxfilter(struct ath_softc *sc)
{
#define	RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR)

	u32 rfilt;

	rfilt = (ath9k_hw_getrxfilter(sc->sc_ah) & RX_FILTER_PRESERVE)
@@ -608,14 +609,17 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
		rfilt |= ATH9K_RX_FILTER_PROBEREQ;

	/* Can't set HOSTAP into promiscous mode */
	if (sc->sc_opmode == ATH9K_M_MONITOR) {
	if (((sc->sc_opmode != ATH9K_M_HOSTAP) &&
	     (sc->rx_filter & FIF_PROMISC_IN_BSS)) ||
	    (sc->sc_opmode == ATH9K_M_MONITOR)) {
		rfilt |= ATH9K_RX_FILTER_PROM;
		/* ??? To prevent from sending ACK */
		rfilt &= ~ATH9K_RX_FILTER_UCAST;
	}

	if (sc->sc_opmode == ATH9K_M_STA || sc->sc_opmode == ATH9K_M_IBSS ||
	    sc->sc_scanning)
	if (((sc->sc_opmode == ATH9K_M_STA) &&
	     (sc->rx_filter & FIF_BCN_PRBRESP_PROMISC)) ||
	    (sc->sc_opmode == ATH9K_M_IBSS))
		rfilt |= ATH9K_RX_FILTER_BEACON;

	/* If in HOSTAP mode, want to enable reception of PSPOLL frames
@@ -623,6 +627,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
	if (sc->sc_opmode == ATH9K_M_HOSTAP)
		rfilt |= (ATH9K_RX_FILTER_BEACON | ATH9K_RX_FILTER_PSPOLL);
	return rfilt;

#undef RX_FILTER_PRESERVE
}