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

Commit ab1ebc95 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'for-davem' of...

parents 70d279a7 409ec36c
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -290,7 +290,7 @@ struct mib_mac_mgmt {
	u8 res;
	u8 res;
	u8 multi_domain_capability_implemented;
	u8 multi_domain_capability_implemented;
	u8 multi_domain_capability_enabled;
	u8 multi_domain_capability_enabled;
	u8 country_string[3];
	u8 country_string[IEEE80211_COUNTRY_STRING_LEN];
	u8 reserved[3];
	u8 reserved[3];
} __packed;
} __packed;


+1 −1
Original line number Original line Diff line number Diff line
@@ -93,7 +93,7 @@ static int ath_ahb_probe(struct platform_device *pdev)
		goto err_out;
		goto err_out;
	}
	}


	mem = ioremap_nocache(res->start, res->end - res->start + 1);
	mem = ioremap_nocache(res->start, resource_size(res));
	if (mem == NULL) {
	if (mem == NULL) {
		dev_err(&pdev->dev, "ioremap failed\n");
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		ret = -ENOMEM;
+1 −1
Original line number Original line Diff line number Diff line
@@ -513,7 +513,7 @@ enum ath5k_tx_queue_id {
	AR5K_TX_QUEUE_ID_NOQCU_DATA	= 0,
	AR5K_TX_QUEUE_ID_NOQCU_DATA	= 0,
	AR5K_TX_QUEUE_ID_NOQCU_BEACON	= 1,
	AR5K_TX_QUEUE_ID_NOQCU_BEACON	= 1,
	AR5K_TX_QUEUE_ID_DATA_MIN	= 0, /*IEEE80211_TX_QUEUE_DATA0*/
	AR5K_TX_QUEUE_ID_DATA_MIN	= 0, /*IEEE80211_TX_QUEUE_DATA0*/
	AR5K_TX_QUEUE_ID_DATA_MAX	= 4, /*IEEE80211_TX_QUEUE_DATA4*/
	AR5K_TX_QUEUE_ID_DATA_MAX	= 3, /*IEEE80211_TX_QUEUE_DATA3*/
	AR5K_TX_QUEUE_ID_DATA_SVP	= 5, /*IEEE80211_TX_QUEUE_SVP - Spectralink Voice Protocol*/
	AR5K_TX_QUEUE_ID_DATA_SVP	= 5, /*IEEE80211_TX_QUEUE_SVP - Spectralink Voice Protocol*/
	AR5K_TX_QUEUE_ID_CAB		= 6, /*IEEE80211_TX_QUEUE_AFTER_BEACON*/
	AR5K_TX_QUEUE_ID_CAB		= 6, /*IEEE80211_TX_QUEUE_AFTER_BEACON*/
	AR5K_TX_QUEUE_ID_BEACON		= 7, /*IEEE80211_TX_QUEUE_BEACON*/
	AR5K_TX_QUEUE_ID_BEACON		= 7, /*IEEE80211_TX_QUEUE_BEACON*/
+23 −29
Original line number Original line Diff line number Diff line
@@ -442,19 +442,9 @@ ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)
	return ath5k_reset(sc, chan, true);
	return ath5k_reset(sc, chan, true);
}
}


struct ath_vif_iter_data {
void ath5k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
	const u8	*hw_macaddr;
	u8		mask[ETH_ALEN];
	u8		active_mac[ETH_ALEN]; /* first active MAC */
	bool		need_set_hw_addr;
	bool		found_active;
	bool		any_assoc;
	enum nl80211_iftype opmode;
};

static void ath_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
{
{
	struct ath_vif_iter_data *iter_data = data;
	struct ath5k_vif_iter_data *iter_data = data;
	int i;
	int i;
	struct ath5k_vif *avf = (void *)vif->drv_priv;
	struct ath5k_vif *avf = (void *)vif->drv_priv;


@@ -484,17 +474,21 @@ static void ath_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
	 */
	 */
	if (avf->opmode == NL80211_IFTYPE_AP)
	if (avf->opmode == NL80211_IFTYPE_AP)
		iter_data->opmode = NL80211_IFTYPE_AP;
		iter_data->opmode = NL80211_IFTYPE_AP;
	else
	else {
		if (avf->opmode == NL80211_IFTYPE_STATION)
			iter_data->n_stas++;
		if (iter_data->opmode == NL80211_IFTYPE_UNSPECIFIED)
		if (iter_data->opmode == NL80211_IFTYPE_UNSPECIFIED)
			iter_data->opmode = avf->opmode;
			iter_data->opmode = avf->opmode;
	}
	}
}


void
void
ath5k_update_bssid_mask_and_opmode(struct ath5k_softc *sc,
ath5k_update_bssid_mask_and_opmode(struct ath5k_softc *sc,
				   struct ieee80211_vif *vif)
				   struct ieee80211_vif *vif)
{
{
	struct ath_common *common = ath5k_hw_common(sc->ah);
	struct ath_common *common = ath5k_hw_common(sc->ah);
	struct ath_vif_iter_data iter_data;
	struct ath5k_vif_iter_data iter_data;
	u32 rfilt;


	/*
	/*
	 * Use the hardware MAC address as reference, the hardware uses it
	 * Use the hardware MAC address as reference, the hardware uses it
@@ -505,12 +499,13 @@ ath5k_update_bssid_mask_and_opmode(struct ath5k_softc *sc,
	iter_data.found_active = false;
	iter_data.found_active = false;
	iter_data.need_set_hw_addr = true;
	iter_data.need_set_hw_addr = true;
	iter_data.opmode = NL80211_IFTYPE_UNSPECIFIED;
	iter_data.opmode = NL80211_IFTYPE_UNSPECIFIED;
	iter_data.n_stas = 0;


	if (vif)
	if (vif)
		ath_vif_iter(&iter_data, vif->addr, vif);
		ath5k_vif_iter(&iter_data, vif->addr, vif);


	/* Get list of all active MAC addresses */
	/* Get list of all active MAC addresses */
	ieee80211_iterate_active_interfaces_atomic(sc->hw, ath_vif_iter,
	ieee80211_iterate_active_interfaces_atomic(sc->hw, ath5k_vif_iter,
						   &iter_data);
						   &iter_data);
	memcpy(sc->bssidmask, iter_data.mask, ETH_ALEN);
	memcpy(sc->bssidmask, iter_data.mask, ETH_ALEN);


@@ -528,20 +523,19 @@ ath5k_update_bssid_mask_and_opmode(struct ath5k_softc *sc,


	if (ath5k_hw_hasbssidmask(sc->ah))
	if (ath5k_hw_hasbssidmask(sc->ah))
		ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
		ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
}


void
	/* Set up RX Filter */
ath5k_mode_setup(struct ath5k_softc *sc, struct ieee80211_vif *vif)
	if (iter_data.n_stas > 1) {
{
		/* If you have multiple STA interfaces connected to
	struct ath5k_hw *ah = sc->ah;
		 * different APs, ARPs are not received (most of the time?)
	u32 rfilt;
		 * Enabling PROMISC appears to fix that probem.
		 */
		sc->filter_flags |= AR5K_RX_FILTER_PROM;
	}


	/* configure rx filter */
	rfilt = sc->filter_flags;
	rfilt = sc->filter_flags;
	ath5k_hw_set_rx_filter(ah, rfilt);
	ath5k_hw_set_rx_filter(sc->ah, rfilt);
	ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt);
	ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt);

	ath5k_update_bssid_mask_and_opmode(sc, vif);
}
}


static inline int
static inline int
@@ -1117,7 +1111,7 @@ ath5k_rx_start(struct ath5k_softc *sc)
	spin_unlock_bh(&sc->rxbuflock);
	spin_unlock_bh(&sc->rxbuflock);


	ath5k_hw_start_rx_dma(ah);	/* enable recv descriptors */
	ath5k_hw_start_rx_dma(ah);	/* enable recv descriptors */
	ath5k_mode_setup(sc, NULL);		/* set filters, etc. */
	ath5k_update_bssid_mask_and_opmode(sc, NULL); /* set filters, etc. */
	ath5k_hw_start_rx_pcu(ah);	/* re-enable PCU/DMA engine */
	ath5k_hw_start_rx_pcu(ah);	/* re-enable PCU/DMA engine */


	return 0;
	return 0;
@@ -2923,13 +2917,13 @@ ath5k_deinit_softc(struct ath5k_softc *sc)
bool
bool
ath_any_vif_assoc(struct ath5k_softc *sc)
ath_any_vif_assoc(struct ath5k_softc *sc)
{
{
	struct ath_vif_iter_data iter_data;
	struct ath5k_vif_iter_data iter_data;
	iter_data.hw_macaddr = NULL;
	iter_data.hw_macaddr = NULL;
	iter_data.any_assoc = false;
	iter_data.any_assoc = false;
	iter_data.need_set_hw_addr = false;
	iter_data.need_set_hw_addr = false;
	iter_data.found_active = true;
	iter_data.found_active = true;


	ieee80211_iterate_active_interfaces_atomic(sc->hw, ath_vif_iter,
	ieee80211_iterate_active_interfaces_atomic(sc->hw, ath5k_vif_iter,
						   &iter_data);
						   &iter_data);
	return iter_data.any_assoc;
	return iter_data.any_assoc;
}
}
+13 −0
Original line number Original line Diff line number Diff line
@@ -259,6 +259,19 @@ struct ath5k_softc {
	struct survey_info	survey;		/* collected survey info */
	struct survey_info	survey;		/* collected survey info */
};
};


struct ath5k_vif_iter_data {
	const u8	*hw_macaddr;
	u8		mask[ETH_ALEN];
	u8		active_mac[ETH_ALEN]; /* first active MAC */
	bool		need_set_hw_addr;
	bool		found_active;
	bool		any_assoc;
	enum nl80211_iftype opmode;
	int n_stas;
};
void ath5k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif);


#define ath5k_hw_hasbssidmask(_ah) \
#define ath5k_hw_hasbssidmask(_ah) \
	(ath5k_hw_get_capability(_ah, AR5K_CAP_BSSIDMASK, 0, NULL) == 0)
	(ath5k_hw_get_capability(_ah, AR5K_CAP_BSSIDMASK, 0, NULL) == 0)
#define ath5k_hw_hasveol(_ah) \
#define ath5k_hw_hasveol(_ah) \
Loading