Skip to contentSkip to conversation

ath9k: Fix up hardware mode and beacons with multiple vifs.

RFC Superseded greearb at candelatech.com 5 participants 13 messages Jan 14, 2011 – Jan 15, 2011 Qualcomm Atheros ATH9K wireless driver

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

From: Ben Greear <[email protected]>

When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.

In addtion, use the vif type instead of hardware opmode when dealing with beacons.

Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.

This needs review.

---
:100644 100644 3108699... a2da259... M drivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... M drivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... M drivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... M drivers/net/wireless/ath/ath9k/recv.c

 drivers/net/wireless/ath/ath9k/ath9k.h  |   10 +-
 drivers/net/wireless/ath/ath9k/beacon.c |   14 +-
 drivers/net/wireless/ath/ath9k/main.c   |  263 ++++++++++++++++++++++---------
 drivers/net/wireless/ath/ath9k/recv.c   |   17 ++-
 4 files changed, 214 insertions(+), 90 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +8 -2
index 3108699..a2da259 100644
@@ -607,10 +607,15 @@ struct ath_softc {
 	u32 sc_flags; /* SC_OP_* */
 	u16 ps_flags; /* PS_* */
 	u16 curtxpow;
-	u8 nbcnvifs;
-	u16 nvifs;
 	bool ps_enabled;
 	bool ps_idle;
+	short nbcnvifs;
+	short nvifs;
+	short naps; /* number of APs */
+	short nmeshes;
+	short nstations;
+	short nwds;
+	short nadhocs;
 	unsigned long ps_usecount;
 
 	struct ath_config config;
@@ -694,6 +699,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
 void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw);
 void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw);
 bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode);
+bool ath9k_uses_beacons(int type);
 
 #ifdef CONFIG_PCI
 int ath_pci_init(void);
drivers/net/wireless/ath/ath9k/beacon.c +6 -8
index 385ba03..8de591e 100644
@@ -244,9 +244,7 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
 						 struct ath_buf, list);
 		list_del(&avp->av_bcbuf->list);
 
-		if (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
-		    sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC ||
-		    sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) {
+		if (ath9k_uses_beacons(vif->type)) {
 			int slot;
 			/*
 			 * Assign the vif to a beacon xmit slot. As
@@ -282,7 +280,7 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
 	/* NB: the beacon data buffer must be 32-bit aligned. */
 	skb = ieee80211_beacon_get(sc->hw, vif);
 	if (skb == NULL) {
-		ath_dbg(common, ATH_DBG_BEACON, "cannot get skb\n");
+		ath_err(common, "ieee80211_beacon_get failed\n");
 		return -ENOMEM;
 	}
 
@@ -720,10 +718,10 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
 		iftype = sc->sc_ah->opmode;
 	}
 
-		cur_conf->listen_interval = 1;
-		cur_conf->dtim_count = 1;
-		cur_conf->bmiss_timeout =
-			ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval;
+	cur_conf->listen_interval = 1;
+	cur_conf->dtim_count = 1;
+	cur_conf->bmiss_timeout =
+		ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval;
 
 	/*
 	 * It looks like mac80211 may end up using beacon interval of zero in
drivers/net/wireless/ath/ath9k/main.c +185 -78

342 lines not on this page · raw message

drivers/net/wireless/ath/ath9k/recv.c +15 -2
index ea2f67c..9a2b4a8 100644
@@ -589,8 +589,14 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
 		return;
 
 	mgmt = (struct ieee80211_mgmt *)skb->data;
-	if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0)
+	if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0) {
+		/* TODO:  This doesn't work well if you have stations
+		 * associated to two different APs because curbssid
+		 * is just the last AP that any of the stations associated
+		 * with.
+		 */
 		return; /* not from our current AP */
+	}
 
 	sc->ps_flags &= ~PS_WAIT_FOR_BEACON;
 
@@ -980,13 +986,20 @@ static void ath9k_process_rssi(struct ath_common *common,
 	int last_rssi;
 	__le16 fc;
 
+	/* TODO:  Maybe need to accept this if we have STA vifs active?? */
 	if (ah->opmode != NL80211_IFTYPE_STATION)
 		return;
 
 	fc = hdr->frame_control;
 	if (!ieee80211_is_beacon(fc) ||
-	    compare_ether_addr(hdr->addr3, common->curbssid))
+	    compare_ether_addr(hdr->addr3, common->curbssid)) {
+		/* TODO:  This doesn't work well if you have stations
+		 * associated to two different APs because curbssid
+		 * is just the last AP that any of the stations associated
+		 * with.
+		 */
 		return;
+	}
 
 	if (rx_stats->rs_rssi != ATH9K_RSSI_BAD && !rx_stats->rs_moreaggr)
 		ATH_RSSI_LPF(aphy->last_rssi, rx_stats->rs_rssi);
Signature · 1 line
1.7.2.3
#1 lore raw

RFC 2/2 ath9k: Add 'misc' file to debugfs, fix queue indexes.

From: Ben Greear <[email protected]>

Add a misc file to show hardware op-mode, irq setup, number of various types of VIFs and more.

Also, previous patches were using the wrong xmit queue indexes. Change to use the internal ath9k indexes instead of the mac80211 queue indexes.

---
:100644 100644 b0cb792... 5005621... M drivers/net/wireless/ath/ath9k/debug.c

 drivers/net/wireless/ath/ath9k/debug.c |  128 +++++++++++++++++++++++++++++---
 1 files changed, 116 insertions(+), 12 deletions(-)
drivers/net/wireless/ath/ath9k/debug.c +116 -12
index b0cb792..5005621 100644
@@ -595,10 +595,10 @@ static const struct file_operations fops_wiphy = {
 do {									\
 	len += snprintf(buf + len, size - len,				\
 			"%s%13u%11u%10u%10u\n", str,			\
-			(unsigned int)(sc->tx.txq[WME_AC_BE].elem),	\
-			(unsigned int)(sc->tx.txq[WME_AC_BK].elem),	\
-			(unsigned int)(sc->tx.txq[WME_AC_VI].elem),	\
-			(unsigned int)(sc->tx.txq[WME_AC_VO].elem));	\
+			(unsigned int)(sc->tx.txq[ATH_TXQ_AC_BE].elem),	\
+			(unsigned int)(sc->tx.txq[ATH_TXQ_AC_BK].elem),	\
+			(unsigned int)(sc->tx.txq[ATH_TXQ_AC_VI].elem),	\
+			(unsigned int)(sc->tx.txq[ATH_TXQ_AC_VO].elem));	\
 	if (len >= size)						\
 		goto done;						\
 } while(0)
@@ -607,10 +607,10 @@ do {									\
 do {									\
 	len += snprintf(buf + len, size - len,				\
 			"%s%13i%11i%10i%10i\n", str,			\
-			list_empty(&sc->tx.txq[WME_AC_BE].elem),	\
-			list_empty(&sc->tx.txq[WME_AC_BK].elem),	\
-			list_empty(&sc->tx.txq[WME_AC_VI].elem),	\
-			list_empty(&sc->tx.txq[WME_AC_VO].elem));	\
+			list_empty(&sc->tx.txq[ATH_TXQ_AC_BE].elem),	\
+			list_empty(&sc->tx.txq[ATH_TXQ_AC_BK].elem),	\
+			list_empty(&sc->tx.txq[ATH_TXQ_AC_VI].elem),	\
+			list_empty(&sc->tx.txq[ATH_TXQ_AC_VO].elem));	\
 	if (len >= size)						\
 		goto done;						\
 } while (0)
@@ -657,10 +657,10 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf,
 	PR("hw-tx-proc-desc: ", txprocdesc);
 	len += snprintf(buf + len, size - len,
 			"%s%11p%11p%10p%10p\n", "txq-memory-address:",
-			&(sc->tx.txq[WME_AC_BE]),
-			&(sc->tx.txq[WME_AC_BK]),
-			&(sc->tx.txq[WME_AC_VI]),
-			&(sc->tx.txq[WME_AC_VO]));
+			&(sc->tx.txq[ATH_TXQ_AC_BE]),
+			&(sc->tx.txq[ATH_TXQ_AC_BK]),
+			&(sc->tx.txq[ATH_TXQ_AC_VI]),
+			&(sc->tx.txq[ATH_TXQ_AC_VO]));
 	if (len >= size)
 		goto done;
 
@@ -777,6 +777,99 @@ done:
 	return retval;
 }
 
+static ssize_t read_file_misc(struct file *file, char __user *user_buf,
+			      size_t count, loff_t *ppos)
+{
+	struct ath_softc *sc = file->private_data;
+	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+	struct ath_hw *ah = sc->sc_ah;
+	char *buf;
+	unsigned int len = 0, size = 8000;
+	ssize_t retval = 0;
+	const char *tmp;
+	unsigned int reg;
+
+	buf = kzalloc(size, GFP_KERNEL);
+	if (buf == NULL)
+		return -ENOMEM;
+
+	switch (sc->sc_ah->opmode) {
+	case  NL80211_IFTYPE_ADHOC:
+		tmp = "ADHOC";
+		break;
+	case  NL80211_IFTYPE_MESH_POINT:
+		tmp = "MESH";
+		break;
+	case  NL80211_IFTYPE_AP:
+		tmp = "AP";
+		break;
+	case  NL80211_IFTYPE_STATION:
+		tmp = "STATION";
+		break;
+	default:
+		tmp = "???";
+		break;
+	}
+
+	len += snprintf(buf + len, size - len,
+			"curbssid: %pM\n"
+			"OP-Mode: %s(%i)\n"
+			"Beacon-Timer-Register: 0x%x\n",
+			common->curbssid,
+			tmp, (int)(sc->sc_ah->opmode),
+			REG_READ(ah, AR_BEACON_PERIOD));
+
+	reg = REG_READ(ah, AR_TIMER_MODE);
+	len += snprintf(buf + len, size - len, "Timer-Mode-Register: 0x%x (",
+			reg);
+	if (reg & AR_TBTT_TIMER_EN)
+		len += snprintf(buf + len, size - len, "TBTT ");
+	if (reg & AR_DBA_TIMER_EN)
+		len += snprintf(buf + len, size - len, "DBA ");
+	if (reg & AR_SWBA_TIMER_EN)
+		len += snprintf(buf + len, size - len, "SWBA ");
+	if (reg & AR_HCF_TIMER_EN)
+		len += snprintf(buf + len, size - len, "HCF ");
+	if (reg & AR_TIM_TIMER_EN)
+		len += snprintf(buf + len, size - len, "TIM ");
+	if (reg & AR_DTIM_TIMER_EN)
+		len += snprintf(buf + len, size - len, "DTIM ");
+	len += snprintf(buf + len, size - len, ")\n");
+
+	reg = sc->sc_ah->imask;
+	len += snprintf(buf + len, size - len, "imask: 0x%x (", reg);
+	if (reg & ATH9K_INT_SWBA)
+		len += snprintf(buf + len, size - len, "SWBA ");
+	if (reg & ATH9K_INT_BMISS)
+		len += snprintf(buf + len, size - len, "BMISS ");
+	if (reg & ATH9K_INT_CST)
+		len += snprintf(buf + len, size - len, "CST ");
+	if (reg & ATH9K_INT_RX)
+		len += snprintf(buf + len, size - len, "RX ");
+	if (reg & ATH9K_INT_RXHP)
+		len += snprintf(buf + len, size - len, "RXHP ");
+	if (reg & ATH9K_INT_RXLP)
+		len += snprintf(buf + len, size - len, "RXLP ");
+	if (reg & ATH9K_INT_BB_WATCHDOG)
+		len += snprintf(buf + len, size - len, "BB_WATCHDOG ");
+	/* there are other IRQs if one wanted to add them. */
+	len += snprintf(buf + len, size - len, ")\n");
+
+	len += snprintf(buf + len, size - len,
+			"VIF Counts: AP: %hi STA: %hi MESH: %hi WDS: %hi"
+			" ADHOC: %hi nvifs: %hi beacon-vifs: %hi\n",
+			sc->naps, sc->nstations, sc->nmeshes, sc->nwds,
+			sc->nadhocs, sc->nvifs, sc->nbcnvifs);
+
+	if (len > size)
+		len = size;
+
+	retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+	kfree(buf);
+
+	return retval;
+}
+
 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
 		       struct ath_tx_status *ts)
 {
@@ -822,6 +915,13 @@ static const struct file_operations fops_stations = {
 	.llseek = default_llseek,
 };
 
+static const struct file_operations fops_misc = {
+	.read = read_file_misc,
+	.open = ath9k_debugfs_open,
+	.owner = THIS_MODULE,
+	.llseek = default_llseek,
+};
+
 static ssize_t read_file_recv(struct file *file, char __user *user_buf,
 			      size_t count, loff_t *ppos)
 {
@@ -1063,6 +1163,10 @@ int ath9k_init_debug(struct ath_hw *ah)
 			sc, &fops_stations))
 		goto err;
 
+	if (!debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy,
+			sc, &fops_misc))
+		goto err;
+
 	if (!debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy,
 			sc, &fops_recv))
 		goto err;
Signature · 1 line
1.7.2.3
#2 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

In reply to greearb at candelatech.com
Quoted 41 lines · greearb at candelatech.com

From: Ben Greear<[email protected]>

When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.

In addtion, use the vif type instead of hardware opmode when dealing with beacons.

Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.

This needs review.

---
:100644 100644 3108699... a2da259... M drivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... M drivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... M drivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... M drivers/net/wireless/ath/ath9k/recv.c

  drivers/net/wireless/ath/ath9k/ath9k.h  |   10 +-
  drivers/net/wireless/ath/ath9k/beacon.c |   14 +-
  drivers/net/wireless/ath/ath9k/main.c   |  263 ++++++++++++++++++++++---------
  drivers/net/wireless/ath/ath9k/recv.c   |   17 ++-
  4 files changed, 214 insertions(+), 90 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +0 -2
index 3108699..a2da259 100644
@@ -607,10 +607,15 @@ struct ath_softc {
  	u32 sc_flags; /* SC_OP_* */
  	u16 ps_flags; /* PS_* */
  	u16 curtxpow;
-	u8 nbcnvifs;
-	u16 nvifs;
  	bool ps_enabled;
  	bool ps_idle;

drivers/net/wireless/ath/ath9k/ath9k.h struct ath_softc { · line 621

Quoted 10 lines
drivers/net/wireless/ath/ath9k/ath9k.h +7 -0
+	short nbcnvifs;
+	short nvifs;
+	short naps; /* number of APs */
+	short nmeshes;
+	short nstations;
+	short nwds;
+	short nadhocs;
  	unsigned long ps_usecount;
 
  	struct ath_config config;

Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?

Quoted 32 lines
drivers/net/wireless/ath/ath9k/recv.c +9 -2
index ea2f67c..9a2b4a8 100644
@@ -589,8 +589,14 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
  		return;
 
  	mgmt = (struct ieee80211_mgmt *)skb->data;
-	if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0)
+	if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0) {
+		/* TODO:  This doesn't work well if you have stations
+		 * associated to two different APs because curbssid
+		 * is just the last AP that any of the stations associated
+		 * with.
+		 */
  		return; /* not from our current AP */
+	}
 
  	sc->ps_flags&= ~PS_WAIT_FOR_BEACON;
 
@@ -980,13 +986,20 @@ static void ath9k_process_rssi(struct ath_common *common,
  	int last_rssi;
  	__le16 fc;
 
+	/* TODO:  Maybe need to accept this if we have STA vifs active?? */
  	if (ah->opmode != NL80211_IFTYPE_STATION)
  		return;
 
  	fc = hdr->frame_control;
  	if (!ieee80211_is_beacon(fc) ||
-	    compare_ether_addr(hdr->addr3, common->curbssid))
+	    compare_ether_addr(hdr->addr3, common->curbssid)) {

drivers/net/wireless/ath/ath9k/recv.c static void ath9k_process_rssi(struct ath_common *common, · line 1005

Quoted 10 lines
drivers/net/wireless/ath/ath9k/recv.c +6 -0
+		/* TODO:  This doesn't work well if you have stations
+		 * associated to two different APs because curbssid
+		 * is just the last AP that any of the stations associated
+		 * with.
+		 */
  		return;
+	}
 
  	if (rx_stats->rs_rssi != ATH9K_RSSI_BAD&&  !rx_stats->rs_moreaggr)
  		ATH_RSSI_LPF(aphy->last_rssi, rx_stats->rs_rssi);

Checking for the STA opmode is correct, this code should not be used for STA+AP. For the multi-STA case, it may make sense to process the RSSI average per vif and using the minimum for ANI.

- Felix

author
#3 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

Quoted 24 lines · Felix Fietkau
Quoted 22 lines · greearb at candelatech.com
drivers/net/wireless/ath/ath9k/ath9k.h +0 -0
index 3108699..a2da259 100644
@@ -607,10 +607,15 @@ struct ath_softc {

u32 sc_flags; /* SC_OP_* */
u16 ps_flags; /* PS_* */
u16 curtxpow;
- u8 nbcnvifs;
- u16 nvifs;
bool ps_enabled;
bool ps_idle;
+ short nbcnvifs;
+ short nvifs;
+ short naps; /* number of APs */
+ short nmeshes;
+ short nstations;
+ short nwds;
+ short nadhocs;
unsigned long ps_usecount;

Quoted 3 lines
Quoted 1 line

struct ath_config config;

Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?

Well, I like the counters. If they ever do not match expected results, it will be a clue that we have bugs in our setup/teardown/change logic.

Seems we use counters like this for ath5k with good results, btw.

Quoted 11 lines
Quoted 11 lines

if (!ieee80211_is_beacon(fc) ||
- compare_ether_addr(hdr->addr3, common->curbssid))
+ compare_ether_addr(hdr->addr3, common->curbssid)) {
+ /* TODO: This doesn't work well if you have stations
+ * associated to two different APs because curbssid
+ * is just the last AP that any of the stations associated
+ * with.
+ */
return;
+ }

Quoted 5 lines
Quoted 2 lines

if (rx_stats->rs_rssi != ATH9K_RSSI_BAD&& !rx_stats->rs_moreaggr) ATH_RSSI_LPF(aphy->last_rssi, rx_stats->rs_rssi);

Checking for the STA opmode is correct, this code should not be used for STA+AP. For the multi-STA case, it may make sense to process the RSSI average per vif and using the minimum for ANI.

Ok. I'll leave that alone for now.

Thanks,
Ben

Signature · 2 lines
Ben Greear <[email protected]>
Candela Technologies Inc  http://www.candelatech.com
#4 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

In reply to Felix Fietkau
Quoted 2 lines · Felix Fietkau

Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?

I think iterating over active interfaces is better, especially if we set up more fine-graned ah-> variables that make sense in themselves for stuff like power save and tsf sync. But that's just my two cents.

As an example of something that may be more or less impossible to do without iteration consider multiple vifs with different beacon intervals. This could be handled by computing a greatest common devisor of all beacon intervals and using this for SWBA.

/Bj?rn

author
#5 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

Quoted 4 lines · Bj?rn Smedman
Quoted 2 lines · Felix Fietkau

Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?

Quoted 8 lines

I think iterating over active interfaces is better, especially if we set up more fine-graned ah-> variables that make sense in themselves for stuff like power save and tsf sync. But that's just my two cents.

As an example of something that may be more or less impossible to do without iteration consider multiple vifs with different beacon intervals. This could be handled by computing a greatest common devisor of all beacon intervals and using this for SWBA.

We already iterate when setting the bssid mask. I could have that method calculate the vif counts with little extra cost. I want to avoid any more linear iterations over the interface list if possible, so hopefully I can re-use that one iteration and not add more...

Thanks,
Ben

Signature · 2 lines
Ben Greear <[email protected]>
Candela Technologies Inc  http://www.candelatech.com
#6 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

In reply to greearb at candelatech.com
Quoted 23 lines · greearb at candelatech.com

From: Ben Greear <[email protected]>

When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.

In addtion, use the vif type instead of hardware opmode when dealing with beacons.

Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.

This needs review.

---
:100644 100644 3108699... a2da259... M drivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... M drivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... M drivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... M drivers/net/wireless/ath/ath9k/recv.c

Quoted 6 lines
 drivers/net/wireless/ath/ath9k/ath9k.h  |   10 +-
 drivers/net/wireless/ath/ath9k/beacon.c |   14 +-
 drivers/net/wireless/ath/ath9k/main.c   |  263 ++++++++++++++++++++++---------
 drivers/net/wireless/ath/ath9k/recv.c   |   17 ++-
 4 files changed, 214 insertions(+), 90 deletions(-)

It would be really useful to have both an AP and MESH vif. With the mesh and ap vif's bridged, a station connected to the ap could ping outside the mesh. Currently, if you add the mesh vif and then the ap vif, it sort of works. The other way around, the mesh interval value causes beacons to be sent only for the vif associated with slot 0.

Is it possible to consider this case as you overhaul ath9k beaconing?

Steve

author
#7 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

Quoted 31 lines · Steve Brown
Quoted 23 lines · greearb at candelatech.com

From: Ben Greear<[email protected]>

When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.

In addtion, use the vif type instead of hardware opmode when dealing with beacons.

Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.

This needs review.

---
:100644 100644 3108699... a2da259... M drivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... M drivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... M drivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... M drivers/net/wireless/ath/ath9k/recv.c

Quoted 6 lines
  drivers/net/wireless/ath/ath9k/ath9k.h  |   10 +-
  drivers/net/wireless/ath/ath9k/beacon.c |   14 +-
  drivers/net/wireless/ath/ath9k/main.c   |  263 ++++++++++++++++++++++---------
  drivers/net/wireless/ath/ath9k/recv.c   |   17 ++-
  4 files changed, 214 insertions(+), 90 deletions(-)
Quoted 7 lines

It would be really useful to have both an AP and MESH vif. With the mesh and ap vif's bridged, a station connected to the ap could ping outside the mesh. Currently, if you add the mesh vif and then the ap vif, it sort of works. The other way around, the mesh interval value causes beacons to be sent only for the vif associated with slot 0.

Is it possible to consider this case as you overhaul ath9k beaconing?

Perhaps someone else would be better. I have no way to test mesh right now, and still do not understand this code too well.

Hopefully the vif-counting work would help with dealing with your scenario, however...

Also, could you try with my patch(es)? Part of the problem with the old code is that if you added mesh second, you would not be in AP mode anymore. I think that part will be fixed now. There may be other issues remaining, however.

Thanks,
Ben

Signature · 2 lines
Ben Greear <[email protected]>
Candela Technologies Inc  http://www.candelatech.com
#8 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

In reply to greearb at candelatech.com
Quoted 7 lines · On Fri, Jan 14, 2011 at 6:27 PM, <[email protected]> wrote:

From: Ben Greear <[email protected]>

When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. ?Instead, we should keep track of the number of different types of vifs and set the mode accordingly.

Thank you for your efforts to get multi-vifs working better.

This is another comment that is a little out of place but when I see the identifier beacon_interval in this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?

It feels like we need a general multi-vif cleanup here but it's too big for me unfortunately.

/Bj?rn

author
#9 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

Quoted 20 lines · Bj?rn Smedman
Quoted 7 lines · On Fri, Jan 14, 2011 at 6:27 PM,<[email protected]> wrote:

From: Ben Greear<[email protected]>

When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.

Thank you for your efforts to get multi-vifs working better.

This is another comment that is a little out of place but when I see the identifier beacon_interval in this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?

Quoted 2 lines

It feels like we need a general multi-vif cleanup here but it's too big for me unfortunately.

I haven't looked at beacons in that detail yet.

If I can get agreement on the current patch (and the dozen or so preceding it), then I can take a closer look at beacon intervals. I don't think that needs to be done as part of this vif/opmode/beaconing cleanup though.

New patch is coming shortly, as soon as I get some testing completed.

Thanks,
Ben

Signature · 2 lines
Ben Greear <[email protected]>
Candela Technologies Inc  http://www.candelatech.com
#10 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

In reply to Björn Smedman
Quoted 11 lines · Bj?rn Smedman

Thank you for your efforts to get multi-vifs working better.

This is another comment that is a little out of place but when I see the identifier beacon_interval in this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?

Quoted 5 lines

It feels like we need a general multi-vif cleanup here but it's too big for me unfortunately.

/Bj?rn
_______________________________________________

For instance, an ap vif has a ~100ms interval and a mesh vif has a ~1000ms interval. I don't see how to avoid a per vif interval.

Steve

#11 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

2011/1/15 Steve Brown <[email protected]>:

Quoted 9 lines · Bj?rn Smedman
Quoted 8 lines

This is another comment that is a little out of place but when I see the identifier beacon_interval in this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?

[snip]

Quoted 2 lines

For instance, an ap vif has a ~100ms interval and a mesh vif has a ~1000ms interval. I don't see how to avoid a per vif interval.

I agree. We should fix ath9k so it works correctly even if beacon interval is different for different vifs (within some reasonable limits).

In the mean time, as a workaround, try to configure the same beacon interval for all vifs.

/Bj?rn

#12 lore raw

RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.

Quoted 7 lines · Bj?rn Smedman

2011/1/15 Steve Brown <[email protected]>:

Quoted 2 lines

For instance, an ap vif has a ~100ms interval and a mesh vif has a ~1000ms interval. I don't see how to avoid a per vif interval.

I agree. We should fix ath9k so it works correctly even if beacon interval is different for different vifs (within some reasonable limits).

Yes, up to a limit. Handling something like 100 TU on one vif and 1000 TU on another is fine, but something like 100 TU and 103 TU would need to be forced to use the same interval. I've been thinking of adding some kind of mechanism for the driver to override Beacon interval in such cases (which would need to go back all the way to user space to hostapd in case of AP mode).

Signature · 1 line
Jouni Malinen                                            PGP id EFC895FA