Linux wireless drivers development
 help / color / mirror / Atom feed
* [PATCH] Atheros Kconfig needs to be dependent on WLAN_80211
From: Jay Sternberg @ 2009-07-07 18:18 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless

Atheros top level menu needs a "depends WLAN_80211" to properly indent
within menuconfig and xconfig interfaces.

This is purely a visual issue but it effects all subsequent drivers.  
The issue is the top level menu does not include a dependency on
WLAN_80211 so within the tree structure, Atheros is at the same level as
WLAN_80211 but when WLAN_80211 collapsed, the menu disappears along with
all subsequent drives, so it is really a subordinate.

Signed-off-by: Jay Sternberg <jay.e.sternberg@intel.com>
---
 drivers/net/wireless/ath/Kconfig |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/ath/Kconfig
b/drivers/net/wireless/ath/Kconfig
index d26e7b4..eb0337c 100644
--- a/drivers/net/wireless/ath/Kconfig
+++ b/drivers/net/wireless/ath/Kconfig
@@ -1,5 +1,6 @@
 config ATH_COMMON
 	tristate "Atheros Wireless Cards"
+	depends on WLAN_80211
 	depends on ATH5K || ATH9K || AR9170_USB
 
 source "drivers/net/wireless/ath/ath5k/Kconfig"
-- 
1.5.4.3


^ permalink raw reply related

* [PATCH v5] Fix regression in mesh forwarding path.
From: javier @ 2009-07-07 17:55 UTC (permalink / raw)
  To: linux-wireless; +Cc: devel, johannes, Javier Cardona, Andrey Yurovsky
In-Reply-To: <20090707170307.GC2768@tuxdriver.com>

From: Javier Cardona <javier@cozybit.com>

The removal of the master netdev broke the mesh forwarding path.  This patch
fixes it by using the new internal 'pending' queue.

As a result of this change, mesh forwarding no longer does the inefficient
802.11 -> 802.3 -> 802.11 conversion that was done before.

[Changes since v1]
Suggested by Johannes:
 - Select queue before adding to mpath queue
 - ieee80211_add_pending_skb -> ieee80211_add_pending_skbs
 - Remove unnecessary header wme.h

Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: Andrey Yurovsky <andrey@cozybit.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
---
 net/mac80211/mesh_hwmp.c    |    3 ++-
 net/mac80211/mesh_pathtbl.c |    8 +++-----
 net/mac80211/rx.c           |   17 +++++++++++++++--
 net/mac80211/tx.c           |    3 ---
 4 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
index f49ef28..c31fe79 100644
--- a/net/mac80211/mesh_hwmp.c
+++ b/net/mac80211/mesh_hwmp.c
@@ -784,7 +784,6 @@ int mesh_nexthop_lookup(struct sk_buff *skb,
 		mesh_path_add(dst_addr, sdata);
 		mpath = mesh_path_lookup(dst_addr, sdata);
 		if (!mpath) {
-			dev_kfree_skb(skb);
 			sdata->u.mesh.mshstats.dropped_frames_no_route++;
 			err = -ENOSPC;
 			goto endlookup;
@@ -804,6 +803,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb,
 		memcpy(hdr->addr1, mpath->next_hop->sta.addr,
 				ETH_ALEN);
 	} else {
+		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 		if (!(mpath->flags & MESH_PATH_RESOLVING)) {
 			/* Start discovery only if it is not running yet */
 			mesh_queue_preq(mpath, PREQ_Q_F_START);
@@ -815,6 +815,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb,
 			skb_unlink(skb_to_free, &mpath->frame_queue);
 		}
 
+		info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
 		skb_queue_tail(&mpath->frame_queue, skb);
 		if (skb_to_free)
 			mesh_path_discard_frame(skb_to_free, sdata);
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 3c72557..ae98766 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -478,11 +478,9 @@ enddel:
  */
 void mesh_path_tx_pending(struct mesh_path *mpath)
 {
-	struct sk_buff *skb;
-
-	while ((skb = skb_dequeue(&mpath->frame_queue)) &&
-			(mpath->flags & MESH_PATH_ACTIVE))
-		dev_queue_xmit(skb);
+	if (mpath->flags & MESH_PATH_ACTIVE)
+		ieee80211_add_pending_skbs(mpath->sdata->local,
+				&mpath->frame_queue);
 }
 
 /**
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 9601b22..9d1dcaf 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1485,10 +1485,12 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
 	unsigned int hdrlen;
 	struct sk_buff *skb = rx->skb, *fwd_skb;
 	struct ieee80211_local *local = rx->local;
+	struct ieee80211_sub_if_data *sdata;
 
 	hdr = (struct ieee80211_hdr *) skb->data;
 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
 	mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
+	sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
 
 	if (!ieee80211_is_data(hdr->frame_control))
 		return RX_CONTINUE;
@@ -1498,10 +1500,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
 		return RX_DROP_MONITOR;
 
 	if (mesh_hdr->flags & MESH_FLAGS_AE_A5_A6){
-		struct ieee80211_sub_if_data *sdata;
 		struct mesh_path *mppath;
 
-		sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
 		rcu_read_lock();
 		mppath = mpp_path_lookup(mesh_hdr->eaddr2, sdata);
 		if (!mppath) {
@@ -1547,6 +1547,19 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
 			info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
 			fwd_skb->iif = rx->dev->ifindex;
 			ieee80211_select_queue(local, fwd_skb);
+			if (is_multicast_ether_addr(fwd_hdr->addr3))
+				memcpy(fwd_hdr->addr1, fwd_hdr->addr3,
+						ETH_ALEN);
+			else {
+				int err = mesh_nexthop_lookup(fwd_skb, sdata);
+				/* Failed to immediately resolve next hop:
+				 * fwded frame was dropped or will be added
+				 * later to the pending skb queue.  */
+				if (err)
+					return RX_DROP_MONITOR;
+			}
+			IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
+						     fwded_frames);
 			ieee80211_add_pending_skb(local, fwd_skb);
 		}
 	}
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 66d9a42..969a4b2 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1399,9 +1399,6 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
 				dev_put(sdata->dev);
 				return;
 			}
-		if (memcmp(sdata->dev->dev_addr, hdr->addr4, ETH_ALEN) != 0)
-			IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
-						     fwded_frames);
 	} else if (unlikely(sdata->vif.type == NL80211_IFTYPE_MONITOR)) {
 		int hdrlen;
 		u16 len_rthdr;
-- 
1.5.4.3


^ permalink raw reply related

* Re: [PATCH v3] Fix regression in mesh forwarding path.
From: John W. Linville @ 2009-07-07 17:03 UTC (permalink / raw)
  To: javier; +Cc: linux-wireless, devel, johannes, Andrey Yurovsky
In-Reply-To: <1246935252-19823-1-git-send-email-javier@cozybit.com>

On Mon, Jul 06, 2009 at 07:54:12PM -0700, javier@cozybit.com wrote:
> From: Javier Cardona <javier@cozybit.com>
> 
> The removal of the master netdev broke the mesh forwarding path.  This patch
> fixes it by using the new internal 'pending' queue.
> 
> As a result of this change, mesh forwarding no longer does the inefficient
> 802.11 -> 802.3 -> 802.11 conversion that was done before.

I'm sorry, but this doesn't seem to apply on top of the current tree.
Would you mind taking a look and respinning?

Thanks!

John
-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.
			¡Viva Honduras Libre!

^ permalink raw reply

* Re: [PATCH] p54: fix beacon template dtim IE corruption
From: John W. Linville @ 2009-07-07 17:05 UTC (permalink / raw)
  To: Christian Lamparter; +Cc: linux-wireless
In-Reply-To: <200907072033.10183.chunkeey@web.de>

On Tue, Jul 07, 2009 at 08:33:10PM +0200, Christian Lamparter wrote:
> On Tuesday 07 July 2009 18:04:32 John W. Linville wrote:
> > On Sat, Jul 04, 2009 at 06:24:07PM +0200, Christian Lamparter wrote:
> > > This patch fixes a regression that sneaked in with 
> > > "[PATCH] p54: re-enable power save feature".
> > > When p54_beacon_format_ie_tim was divided up
> > > and rewritten to use skb_* macros.
> > 
> > I don't seem to have any record of that patch,
> hmm, it's right here...
> http://www.spinics.net/lists/linux-wireless/msg35201.html
> 
> maybe it was lost during the holiday, should I prepare a resend?

Probably...perhaps I deleted it after reading this?

	http://www.spinics.net/lists/linux-wireless/msg35222.html

:-)

John
-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.
			¡Viva Honduras Libre!

^ permalink raw reply

* Re: Possible memory leak in net/wireless/scan.c
From: Johannes Berg @ 2009-07-07 17:12 UTC (permalink / raw)
  To: Catalin Marinas; +Cc: linux-wireless, linux-kernel
In-Reply-To: <1246986269.9451.105.camel@pc1117.cambridge.arm.com>

[-- Attachment #1: Type: text/plain, Size: 826 bytes --]

On Tue, 2009-07-07 at 18:04 +0100, Catalin Marinas wrote:

> diff --git a/net/wireless/scan.c b/net/wireless/scan.c
> index e95b638..f8e71b3 100644
> --- a/net/wireless/scan.c
> +++ b/net/wireless/scan.c
> @@ -366,7 +366,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
>  	found = rb_find_bss(dev, res);
>  
>  	if (found) {
> -		kref_get(&found->ref);
>  		found->pub.beacon_interval = res->pub.beacon_interval;
>  		found->pub.tsf = res->pub.tsf;
>  		found->pub.signal = res->pub.signal;
> 
> I'll try this later today to see if it fixes the leak. If that's not
> correct, I'll post more information about the content of the reported
> object (in general, it shouldn't be on any valid list or rb tree since
> kmemleak can't find it).

I have already sent that exact patch.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply

* [RESEND][PATCH] p54: re-enable power save feature
From: Christian Lamparter @ 2009-07-07 17:08 UTC (permalink / raw)
  To: linux-wireless; +Cc: John W. Linville

This patch re-enables p54's power save features and adds a workaround
which temporarily alters the device's power state in order to allow
ps-polls to be sent and buffered data to be retrieved during psm.

Signed-off-by: Christian Lamparter <chunkeey@web.de>
---
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c
index 178efbc..9bff43d 100644
--- a/drivers/net/wireless/p54/fwio.c
+++ b/drivers/net/wireless/p54/fwio.c
@@ -584,7 +584,8 @@ int p54_set_ps(struct p54_common *priv)
 	unsigned int i;
 	u16 mode;
 
-	if (priv->hw->conf.flags & IEEE80211_CONF_PS)
+	if (priv->hw->conf.flags & IEEE80211_CONF_PS &&
+	    !priv->powersave_override)
 		mode = P54_PSM | P54_PSM_BEACON_TIMEOUT | P54_PSM_DTIM |
 		       P54_PSM_CHECKSUM | P54_PSM_MCBC;
 	else
@@ -606,8 +607,8 @@ int p54_set_ps(struct p54_common *priv)
 
 	psm->beacon_rssi_skip_max = 200;
 	psm->rssi_delta_threshold = 0;
-	psm->nr = 10;
-	psm->exclude[0] = 0;
+	psm->nr = 1;
+	psm->exclude[0] = WLAN_EID_TIM;
 
 	p54_tx(priv, skb);
 	return 0;
diff --git a/drivers/net/wireless/p54/lmac.h b/drivers/net/wireless/p54/lmac.h
index 0496cff..af35cfc 100644
--- a/drivers/net/wireless/p54/lmac.h
+++ b/drivers/net/wireless/p54/lmac.h
@@ -548,4 +548,7 @@ int p54_upload_key(struct p54_common *priv, u8 algo, int slot,
 int p54_download_eeprom(struct p54_common *priv, void *buf,
 			u16 offset, u16 len);
 
+/* utility */
+u8 *p54_find_ie(struct sk_buff *skb, u8 ie);
+
 #endif /* LMAC_H */
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c
index f9b4f6a..42abf34 100644
--- a/drivers/net/wireless/p54/main.c
+++ b/drivers/net/wireless/p54/main.c
@@ -65,51 +65,64 @@ static int p54_set_tim(struct ieee80211_hw *dev, struct ieee80211_sta *sta,
 	return p54_update_beacon_tim(priv, sta->aid, set);
 }
 
-static int p54_beacon_format_ie_tim(struct sk_buff *skb)
+u8 *p54_find_ie(struct sk_buff *skb, u8 ie)
 {
-	/*
-	 * the good excuse for this mess is ... the firmware.
-	 * The dummy TIM MUST be at the end of the beacon frame,
-	 * because it'll be overwritten!
-	 */
-
 	struct ieee80211_mgmt *mgmt = (void *)skb->data;
 	u8 *pos, *end;
 
 	if (skb->len <= sizeof(mgmt))
-		return -EINVAL;
+		return NULL;
 
 	pos = (u8 *)mgmt->u.beacon.variable;
 	end = skb->data + skb->len;
 	while (pos < end) {
 		if (pos + 2 + pos[1] > end)
-			return -EINVAL;
+			return NULL;
 
-		if (pos[0] == WLAN_EID_TIM) {
-			u8 dtim_len = pos[1];
-			u8 dtim_period = pos[3];
-			u8 *next = pos + 2 + dtim_len;
+		if (pos[0] == ie)
+			return pos;
 
-			if (dtim_len < 3)
-				return -EINVAL;
+		pos += 2 + pos[1];
+	}
+	return NULL;
+}
 
-			memmove(pos, next, end - next);
+static int p54_beacon_format_ie_tim(struct sk_buff *skb)
+{
+	/*
+	 * the good excuse for this mess is ... the firmware.
+	 * The dummy TIM MUST be at the end of the beacon frame,
+	 * because it'll be overwritten!
+	 */
+	u8 *tim;
+	u8 dtim_len;
+	u8 dtim_period;
+	u8 *next;
 
-			if (dtim_len > 3)
-				skb_trim(skb, skb->len - (dtim_len - 3));
+	tim = p54_find_ie(skb, WLAN_EID_TIM);
+	if (!tim)
+		return 0;
 
-			pos = end - (dtim_len + 2);
+	dtim_len = tim[1];
+	dtim_period = tim[3];
+	next = tim + 2 + dtim_len;
 
-			/* add the dummy at the end */
-			pos[0] = WLAN_EID_TIM;
-			pos[1] = 3;
-			pos[2] = 0;
-			pos[3] = dtim_period;
-			pos[4] = 0;
-			return 0;
-		}
-		pos += 2 + pos[1];
-	}
+	if (dtim_len < 3)
+		return -EINVAL;
+
+	memmove(tim, next, skb_tail_pointer(skb) - next);
+
+	if (dtim_len > 3)
+		skb_trim(skb, skb->len - (dtim_len - 3));
+
+	tim = skb_tail_pointer(skb) - (dtim_len + 2);
+
+	/* add the dummy at the end */
+	tim[0] = WLAN_EID_TIM;
+	tim[1] = 3;
+	tim[2] = 0;
+	tim[3] = dtim_period;
+	tim[4] = 0;
 	return 0;
 }
 
@@ -384,6 +397,9 @@ static void p54_bss_info_changed(struct ieee80211_hw *dev,
 			priv->wakeup_timer = info->beacon_int *
 					     info->dtim_period * 5;
 			p54_setup_mac(priv);
+		} else {
+			priv->wakeup_timer = 500;
+			priv->aid = 0;
 		}
 	}
 
@@ -517,6 +533,9 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
 	skb_queue_head_init(&priv->tx_pending);
 	dev->flags = IEEE80211_HW_RX_INCLUDES_FCS |
 		     IEEE80211_HW_SIGNAL_DBM |
+		     IEEE80211_HW_SUPPORTS_PS |
+		     IEEE80211_HW_PS_NULLFUNC_STACK |
+		     IEEE80211_HW_BEACON_FILTER |
 		     IEEE80211_HW_NOISE_DBM;
 
 	dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h
index 19d085c..6772ed5 100644
--- a/drivers/net/wireless/p54/p54.h
+++ b/drivers/net/wireless/p54/p54.h
@@ -208,6 +208,7 @@ struct p54_common {
 	u32 tsf_low32, tsf_high32;
 	u32 basic_rate_mask;
 	u16 aid;
+	bool powersave_override;
 	__le32 beacon_req_id;
 
 	/* cryptographic engine information */
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
index 31fda17..ea074a6 100644
--- a/drivers/net/wireless/p54/txrx.c
+++ b/drivers/net/wireless/p54/txrx.c
@@ -285,6 +285,45 @@ static int p54_rssi_to_dbm(struct p54_common *priv, int rssi)
 			 priv->rssical_db[band].add) / 4;
 }
 
+/*
+ * Even if the firmware is capable of dealing with incoming traffic,
+ * while dozing, we have to prepared in case mac80211 uses PS-POLL
+ * to retrieve outstanding frames from our AP.
+ * (see comment in net/mac80211/mlme.c @ line 1993)
+ */
+static void p54_pspoll_workaround(struct p54_common *priv, struct sk_buff *skb)
+{
+	struct ieee80211_hdr *hdr = (void *) skb->data;
+	struct ieee80211_tim_ie *tim_ie;
+	u8 *tim;
+	u8 tim_len;
+	bool new_psm;
+
+	/* only beacons have a TIM IE */
+	if (!ieee80211_is_beacon(hdr->frame_control))
+		return;
+
+	if (!priv->aid)
+		return;
+
+	/* only consider beacons from the associated BSSID */
+	if (compare_ether_addr(hdr->addr3, priv->bssid))
+		return;
+
+	tim = p54_find_ie(skb, WLAN_EID_TIM);
+	if (!tim)
+		return;
+
+	tim_len = tim[1];
+	tim_ie = (struct ieee80211_tim_ie *) &tim[2];
+
+	new_psm = ieee80211_check_tim(tim_ie, tim_len, priv->aid);
+	if (new_psm != priv->powersave_override) {
+		priv->powersave_override = new_psm;
+		p54_set_ps(priv);
+	}
+}
+
 static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb)
 {
 	struct p54_rx_data *hdr = (struct p54_rx_data *) skb->data;
@@ -337,6 +376,9 @@ static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb)
 
 	skb_pull(skb, header_len);
 	skb_trim(skb, le16_to_cpu(hdr->len));
+	if (unlikely(priv->hw->conf.flags & IEEE80211_CONF_PS))
+		p54_pspoll_workaround(priv, skb);
+
 	ieee80211_rx_irqsafe(priv->hw, skb);
 
 	queue_delayed_work(priv->hw->workqueue, &priv->work,

^ permalink raw reply related

* Possible memory leak in net/wireless/scan.c
From: Catalin Marinas @ 2009-07-07 17:04 UTC (permalink / raw)
  To: Johannes Berg, linux-wireless; +Cc: linux-kernel

Hi,

I'm investigating several kmemleak reports like the one below (it could
as well be a false positive but it needs more digging):

unreferenced object 0xc338af70 (size 256):
  comm "softirq", pid 0, jiffies 4294903018
  backtrace:
    [<c01e0c3a>] create_object+0xfa/0x250
    [<c01e1e7d>] kmemleak_alloc+0x5d/0x70
    [<c01db2d5>] __kmalloc+0x115/0x1f0
    [<f826395b>] cfg80211_inform_bss_frame+0x5b/0x170 [cfg80211]
    [<f8fa82de>] ieee80211_bss_info_update+0x3e/0x1b0 [mac80211]
    [<f8fa85c5>] ieee80211_scan_rx+0x165/0x1a0 [mac80211]
    [<f8fb58dc>] ieee80211_invoke_rx_handlers+0x1cc/0x21d0 [mac80211]
    [<f8fb50c2>] __ieee80211_rx_handle_packet+0x2d2/0x5f0 [mac80211]
    [<f8fb7c8b>] __ieee80211_rx+0x3ab/0x670 [mac80211]
    [<f8fa469e>] ieee80211_tasklet_handler+0xfe/0x120 [mac80211]
    [<c0143b13>] tasklet_action+0x63/0xe0
    [<c0144142>] __do_softirq+0xc2/0x1a0
    [<c0144285>] do_softirq+0x65/0x70
    [<c01443d5>] irq_exit+0x65/0x90
    [<c0104a6f>] do_IRQ+0x4f/0xc0
    [<c010376e>] common_interrupt+0x2e/0x40

The reported object seems to be the struct cfg80211_internal_bss *res
allocated in cfg80211_inform_bss_frame(). This object is passed to
cfg80211_bss_update(). What looks a bit suspicious to me is that if an
object is found in the rb tree, this function calls kref_get() on it in
the "if (found)" block and one more time before return. Should it only
call kref_get(&found->ref) once:

diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index e95b638..f8e71b3 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -366,7 +366,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
 	found = rb_find_bss(dev, res);
 
 	if (found) {
-		kref_get(&found->ref);
 		found->pub.beacon_interval = res->pub.beacon_interval;
 		found->pub.tsf = res->pub.tsf;
 		found->pub.signal = res->pub.signal;

I'll try this later today to see if it fixes the leak. If that's not
correct, I'll post more information about the content of the reported
object (in general, it shouldn't be on any valid list or rb tree since
kmemleak can't find it).

Thanks.

-- 
Catalin


^ permalink raw reply related

* Re: a question about marvell sd8686's wmm_config_change event
From: fengzeheng @ 2009-07-07 16:52 UTC (permalink / raw)
  To: Dan Williams; +Cc: linux-wireless
In-Reply-To: <1246984369.28570.42.camel@localhost.localdomain>

If this event happen, then packet lost appear. However , I just send
80kbps udp stream using Iperf....

will 80kbps cause firmware's wmm queue full or change wmm setting?

2009/7/8 Dan Williams <dcbw@redhat.com>:
> On Wed, 2009-07-08 at 00:28 +0800, fengzeheng wrote:
>> hi, dan and all
>>      My wireless card sd8686 reports that wmm_config_change about
>> every 2 seconds though wmm's setting in AP's beacons don't change.
>> seems that driver receive MACREG_INT_CODE_WMM_STATUS_CHANGE event from
>> firmware every 2 seconds. And according
>> to firmware spec v5.1  this event generated when firmware monitors a
>> change in wmm state. This is a result of an ap change in the wmm
>> parameter ie or a change in the operational state of one of the AC
>> queues. However ,  I can't find any change of AP's wme settings in
>> beacon from the sniffer packets. So why does firmware send this event?
>> thanks for your any comments.
>
> It's probably something in the internal firmware's WMM queues then, not
> something from the AP's IEs.  Is the event causing a problem?
>
> Dan
>
>
>



-- 
Best Regards
Fzh

^ permalink raw reply

* Re: [PATCH] p54: fix beacon template dtim IE corruption
From: Christian Lamparter @ 2009-07-07 18:33 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless
In-Reply-To: <20090707160431.GB2768@tuxdriver.com>

On Tuesday 07 July 2009 18:04:32 John W. Linville wrote:
> On Sat, Jul 04, 2009 at 06:24:07PM +0200, Christian Lamparter wrote:
> > This patch fixes a regression that sneaked in with 
> > "[PATCH] p54: re-enable power save feature".
> > When p54_beacon_format_ie_tim was divided up
> > and rewritten to use skb_* macros.
> 
> I don't seem to have any record of that patch,
hmm, it's right here...
http://www.spinics.net/lists/linux-wireless/msg35201.html

maybe it was lost during the holiday, should I prepare a resend?

Regards,
	Chr

^ permalink raw reply

* Re: a question about marvell sd8686's wmm_config_change event
From: Dan Williams @ 2009-07-07 16:32 UTC (permalink / raw)
  To: fengzeheng; +Cc: linux-wireless
In-Reply-To: <5135d20a0907070928o19322c3waf41a7b59d4b309e@mail.gmail.com>

On Wed, 2009-07-08 at 00:28 +0800, fengzeheng wrote:
> hi, dan and all
>      My wireless card sd8686 reports that wmm_config_change about
> every 2 seconds though wmm's setting in AP's beacons don't change.
> seems that driver receive MACREG_INT_CODE_WMM_STATUS_CHANGE event from
> firmware every 2 seconds. And according
> to firmware spec v5.1  this event generated when firmware monitors a
> change in wmm state. This is a result of an ap change in the wmm
> parameter ie or a change in the operational state of one of the AC
> queues. However ,  I can't find any change of AP's wme settings in
> beacon from the sniffer packets. So why does firmware send this event?
> thanks for your any comments.

It's probably something in the internal firmware's WMM queues then, not
something from the AP's IEs.  Is the event causing a problem?

Dan



^ permalink raw reply

* a question about marvell sd8686's wmm_config_change event
From: fengzeheng @ 2009-07-07 16:28 UTC (permalink / raw)
  To: dcbw; +Cc: linux-wireless

hi, dan and all
     My wireless card sd8686 reports that wmm_config_change about
every 2 seconds though wmm's setting in AP's beacons don't change.
seems that driver receive MACREG_INT_CODE_WMM_STATUS_CHANGE event from
firmware every 2 seconds. And according
to firmware spec v5.1  this event generated when firmware monitors a
change in wmm state. This is a result of an ap change in the wmm
parameter ie or a change in the operational state of one of the AC
queues. However ,  I can't find any change of AP's wme settings in
beacon from the sniffer packets. So why does firmware send this event?
thanks for your any comments.

-- 
Best Regards
Fzh

^ permalink raw reply

* Re: [PATCH] p54: fix beacon template dtim IE corruption
From: John W. Linville @ 2009-07-07 16:04 UTC (permalink / raw)
  To: Christian Lamparter; +Cc: linux-wireless
In-Reply-To: <200907041824.07655.chunkeey@web.de>

On Sat, Jul 04, 2009 at 06:24:07PM +0200, Christian Lamparter wrote:
> This patch fixes a regression that sneaked in with 
> "[PATCH] p54: re-enable power save feature".
> When p54_beacon_format_ie_tim was divided up
> and rewritten to use skb_* macros.

I don't seem to have any record of that patch, and this one doesn't
apply after the reorganization series from Larry (which is strange,
since this file didn't seem to exist before that series)...

John
-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.
			¡Viva Honduras Libre!

^ permalink raw reply

* Re: mac80211 and broadcast frames
From: Luis R. Rodriguez @ 2009-07-07 16:15 UTC (permalink / raw)
  To: John W. Linville; +Cc: David Ross, Valentin Manea, linux-wireless
In-Reply-To: <20090707144851.GA2768@tuxdriver.com>

On Tue, Jul 7, 2009 at 7:48 AM, John W. Linville<linville@tuxdriver.com> wrote:
> On Tue, Jul 07, 2009 at 09:10:52PM +1000, David Ross wrote:
>> Actually it is required to be a mutual BASIC rate (not extended rates) -
>> not necessarily the "lowest possible" - David.
>
> True, but FWIW I think all of our rate scaling algorithms choose the
> lowest rate.

And then iwlwifi and ath9k have their own rate control algo, and at
least ath9k uses the lowest valid rate IIRC.

  Luis

^ permalink raw reply

* Re: dead RT2501USB ?
From: Luis Correia @ 2009-07-07 16:07 UTC (permalink / raw)
  To: ptb; +Cc: linux-wireless, users
In-Reply-To: <200907071526.n67FQICE002753@barney.it.uc3m.es>

Hi Peter,


On Tue, Jul 7, 2009 at 16:26, Peter Breuer<ptb@inv.it.uc3m.es> wrote:
> Good day
>
> I'm trying to get a 2501 Ralink USB stick working. I've never had any
> success with it in any kernel I've tried.
>
> Right now I have the stick in my athlon 64 bit machine, Linux kernel:
>
>   2.6.30.1,
>
> and a fair bit of debugging compiled. I'd like to tap your
> help on getting it going, or deciding what the matter is.
>
> Firstly: lsusb output:
>
>  Bus 005 Device 002: ID 148f:2573 Ralink Technology, Corp. RT2501USB Wireless Adapter
>
> (I'll add the verbose output later, but I suspect you're more
> interested in what the driver has to say).
>
>
>
> Loaading the  rt73usb module produces this stack (after a fair old delay
> for the modprobe to come back)
>
> rt73usb                29288  0
> crc_itu_t               2144  1 rt73usb
> rt2x00usb              11360  1 rt73usb
> rt2x00lib              33760  2 rt73usb,rt2x00usb
> led_class               5112  1 rt2x00lib
> input_polldev           4552  1 rt2x00lib
> mac80211              195720  2 rt2x00usb,rt2x00lib
> cfg80211               71000  2 rt2x00lib,mac80211
>
> Dmesg says:
>
>  [ 2108.751153] phy0 -> rt2x00usb_vendor_request: Error - Vendor Request 0x09 failed for offset 0x0000 with error -110.
>  [ 2108.782851] phy0 -> rt73usb_validate_eeprom: EEPROM recovery - MAC: 26:e2:39:8d:0d:6d
>  [ 2111.283108] phy0 -> rt2x00usb_vendor_request: Error - Vendor Request 0x07 failed for offset 0x3000 with error -110.
>  [ 2111.315495] phy0 -> rt2x00_set_chip: Info - Chipset detected - rt: 1300, rf: 0000, rev: ffff8800.
>  [ 2111.344071] phy0 -> rt73usb_init_eeprom: Error - Invalid RT chipset detected.
>  [ 2111.365594] phy0 -> rt2x00lib_probe_dev: Error - Failed to allocate device.
>  [ 2111.394416] usbcore: registered new interface driver rt73usb
>
> So it thinks it's not the right chipset. Perhaps I should add an
> identification line somewhere in the code?
>
> Taking the stick out and reinserting it produces better output:
>
>  [ 3047.942955] usb 5-1: USB disconnect, address 2
>  [ 3057.399019] usb 5-1: new high speed USB device using ehci_hcd and address 4
>  [ 3057.691030] usb 5-1: configuration #1 chosen from 1 choice
>  [ 3057.982680] phy1 -> rt73usb_validate_eeprom: EEPROM recovery - NIC: 0xffef
>  [ 3057.982687] phy1 -> rt73usb_validate_eeprom: EEPROM recovery - Led: 0xe000
>  [ 3057.982691] phy1 -> rt73usb_validate_eeprom: EEPROM recovery - RSSI OFFSET A: 0x0000
>  [ 3057.982915] phy1 -> rt2x00_set_chip: Info - Chipset detected - rt: 1300, rf: 0002, rev: 0002573a.
>  [ 3058.026194] phy1: Selected rate control algorithm 'minstrel'
>  [ 3058.057978] Registered led device: rt73usb-phy1::radio
>  [ 3058.108090] Registered led device: rt73usb-phy1::assoc
>  [ 3058.153068] Registered led device: rt73usb-phy1::quality
>  [ 3058.317082] phy1 -> rt2x00lib_request_firmware: Info - Loading
>  firmware file 'rt73.bin'.
>  [ 3058.447020] rt73usb 5-1:1.0: firmware: requesting rt73.bin
>  [ 3058.614883] phy1 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.

You seem to be lacking the rt73.bin firmware file.
Distributions usually ship them or make them available in a package.

But the device may also be wrongly defined and...

>  [ 3059.709337] usbcore: registered new interface driver rt2500usb

could well be a rt2500usb.

Although from the lsusb output, this does really look like a rt73usb chipset:
Bus 005 Device 004: ID 148f:2573 Ralink Technology, Corp. RT2501USB

p.s. if your distro cannot or will not ship this firmware, you can get
the file from Ralink's website and place it where all the other
firmware files are located on your distro (for Fedora is
/lib/firmware):
http://www.ralinktech.com.tw/data/RT71W_Firmware_V1.8.zip


Luis Correia
rt2x00 project admin

^ permalink raw reply

* Re: dead RT2501USB ?
From: Pavel Roskin @ 2009-07-07 15:49 UTC (permalink / raw)
  To: ptb; +Cc: linux-wireless, users
In-Reply-To: <200907071526.n67FQICE002753@barney.it.uc3m.es>

On Tue, 2009-07-07 at 17:26 +0200, Peter Breuer wrote:
> Firstly: lsusb output:
> 
>   Bus 005 Device 002: ID 148f:2573 Ralink Technology, Corp. RT2501USB Wireless Adapter
...
> Loaading the  rt73usb module produces this stack (after a fair old delay
> for the modprobe to come back)
...
> So it thinks it's not the right chipset. Perhaps I should add an
> identification line somewhere in the code?

Try rt2500usb instead of rt73usb.  Both drivers support 148f:2573.  As
far as I know, it's impossible to find out which driver would work with
a particular device from USB ID alone.

-- 
Regards,
Pavel Roskin

^ permalink raw reply

* [PATCH v4] Fix regression in mesh forwarding path.
From: Javier Cardona @ 2009-07-07 15:30 UTC (permalink / raw)
  To: linux-wireless; +Cc: johannes, devel, Javier Cardona, Andrey Yurovsky
In-Reply-To: <1246935252-19823-1-git-send-email-javier@cozybit.com>

The removal of the master netdev broke the mesh forwarding path.  This patch
fixes it by using the new internal 'pending' queue.

As a result of this change, mesh forwarding no longer does the inefficient
802.11 -> 802.3 -> 802.11 conversion that was done before.

[Changes since v1]
Suggested by Johannes:
 - Select queue before adding to mpath queue
 - ieee80211_add_pending_skb -> ieee80211_add_pending_skbs
 - Remove unnecessary header wme.h

Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: Andrey Yurovsky <andrey@cozybit.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
---
 net/mac80211/mesh_hwmp.c    |    3 ++-
 net/mac80211/mesh_pathtbl.c |    8 +++-----
 net/mac80211/rx.c           |   17 +++++++++++++++--
 net/mac80211/tx.c           |    3 ---
 4 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
index f49ef28..c31fe79 100644
--- a/net/mac80211/mesh_hwmp.c
+++ b/net/mac80211/mesh_hwmp.c
@@ -784,7 +784,6 @@ int mesh_nexthop_lookup(struct sk_buff *skb,
 		mesh_path_add(dst_addr, sdata);
 		mpath = mesh_path_lookup(dst_addr, sdata);
 		if (!mpath) {
-			dev_kfree_skb(skb);
 			sdata->u.mesh.mshstats.dropped_frames_no_route++;
 			err = -ENOSPC;
 			goto endlookup;
@@ -804,6 +803,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb,
 		memcpy(hdr->addr1, mpath->next_hop->sta.addr,
 				ETH_ALEN);
 	} else {
+		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 		if (!(mpath->flags & MESH_PATH_RESOLVING)) {
 			/* Start discovery only if it is not running yet */
 			mesh_queue_preq(mpath, PREQ_Q_F_START);
@@ -815,6 +815,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb,
 			skb_unlink(skb_to_free, &mpath->frame_queue);
 		}
 
+		info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
 		skb_queue_tail(&mpath->frame_queue, skb);
 		if (skb_to_free)
 			mesh_path_discard_frame(skb_to_free, sdata);
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 3c72557..8445dda 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -478,11 +478,9 @@ enddel:
  */
 void mesh_path_tx_pending(struct mesh_path *mpath)
 {
-	struct sk_buff *skb;
-
-	while ((skb = skb_dequeue(&mpath->frame_queue)) &&
-			(mpath->flags & MESH_PATH_ACTIVE))
-		dev_queue_xmit(skb);
+	if (mpath->flags & MESH_PATH_ACTIVE)
+		ieee80211_add_pending_skbs(mpath->sdata->local,
+				&mpath->frame_queue); 
 }
 
 /**
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 91747be..1a22636 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1485,10 +1485,12 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
 	unsigned int hdrlen;
 	struct sk_buff *skb = rx->skb, *fwd_skb;
 	struct ieee80211_local *local = rx->local;
+	struct ieee80211_sub_if_data *sdata;
 
 	hdr = (struct ieee80211_hdr *) skb->data;
 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
 	mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
+	sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
 
 	if (!ieee80211_is_data(hdr->frame_control))
 		return RX_CONTINUE;
@@ -1498,10 +1500,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
 		return RX_DROP_MONITOR;
 
 	if (mesh_hdr->flags & MESH_FLAGS_AE_A5_A6){
-		struct ieee80211_sub_if_data *sdata;
 		struct mesh_path *mppath;
 
-		sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
 		rcu_read_lock();
 		mppath = mpp_path_lookup(mesh_hdr->eaddr2, sdata);
 		if (!mppath) {
@@ -1547,6 +1547,19 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
 			info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
 			fwd_skb->iif = rx->dev->ifindex;
 			ieee80211_select_queue(local, fwd_skb);
+			if (is_multicast_ether_addr(fwd_hdr->addr3))
+				memcpy(fwd_hdr->addr1, fwd_hdr->addr3,
+						ETH_ALEN);
+			else {
+				int err = mesh_nexthop_lookup(fwd_skb, sdata);
+				/* Failed to immediately resolve next hop:
+				 * fwded frame was dropped or will be added
+				 * later to the pending skb queue.  */
+				if (err)
+					return RX_DROP_MONITOR;
+			}
+			IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
+						     fwded_frames);
 			ieee80211_add_pending_skb(local, fwd_skb);
 		}
 	}
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 66d9a42..969a4b2 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1399,9 +1399,6 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
 				dev_put(sdata->dev);
 				return;
 			}
-		if (memcmp(sdata->dev->dev_addr, hdr->addr4, ETH_ALEN) != 0)
-			IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
-						     fwded_frames);
 	} else if (unlikely(sdata->vif.type == NL80211_IFTYPE_MONITOR)) {
 		int hdrlen;
 		u16 len_rthdr;
-- 
1.5.4.3


^ permalink raw reply related

* dead RT2501USB ?
From: Peter Breuer @ 2009-07-07 15:26 UTC (permalink / raw)
  To: linux-wireless, users

Good day

I'm trying to get a 2501 Ralink USB stick working. I've never had any
success with it in any kernel I've tried.

Right now I have the stick in my athlon 64 bit machine, Linux kernel:

   2.6.30.1,
   
and a fair bit of debugging compiled. I'd like to tap your
help on getting it going, or deciding what the matter is. 

Firstly: lsusb output:

  Bus 005 Device 002: ID 148f:2573 Ralink Technology, Corp. RT2501USB Wireless Adapter

(I'll add the verbose output later, but I suspect you're more
interested in what the driver has to say).



Loaading the  rt73usb module produces this stack (after a fair old delay
for the modprobe to come back)

rt73usb                29288  0 
crc_itu_t               2144  1 rt73usb
rt2x00usb              11360  1 rt73usb
rt2x00lib              33760  2 rt73usb,rt2x00usb
led_class               5112  1 rt2x00lib
input_polldev           4552  1 rt2x00lib
mac80211              195720  2 rt2x00usb,rt2x00lib
cfg80211               71000  2 rt2x00lib,mac80211

Dmesg says:

  [ 2108.751153] phy0 -> rt2x00usb_vendor_request: Error - Vendor Request 0x09 failed for offset 0x0000 with error -110.
  [ 2108.782851] phy0 -> rt73usb_validate_eeprom: EEPROM recovery - MAC: 26:e2:39:8d:0d:6d
  [ 2111.283108] phy0 -> rt2x00usb_vendor_request: Error - Vendor Request 0x07 failed for offset 0x3000 with error -110.
  [ 2111.315495] phy0 -> rt2x00_set_chip: Info - Chipset detected - rt: 1300, rf: 0000, rev: ffff8800.
  [ 2111.344071] phy0 -> rt73usb_init_eeprom: Error - Invalid RT chipset detected.
  [ 2111.365594] phy0 -> rt2x00lib_probe_dev: Error - Failed to allocate device.
  [ 2111.394416] usbcore: registered new interface driver rt73usb

So it thinks it's not the right chipset. Perhaps I should add an
identification line somewhere in the code?

Taking the stick out and reinserting it produces better output:

  [ 3047.942955] usb 5-1: USB disconnect, address 2
  [ 3057.399019] usb 5-1: new high speed USB device using ehci_hcd and address 4
  [ 3057.691030] usb 5-1: configuration #1 chosen from 1 choice
  [ 3057.982680] phy1 -> rt73usb_validate_eeprom: EEPROM recovery - NIC: 0xffef
  [ 3057.982687] phy1 -> rt73usb_validate_eeprom: EEPROM recovery - Led: 0xe000
  [ 3057.982691] phy1 -> rt73usb_validate_eeprom: EEPROM recovery - RSSI OFFSET A: 0x0000
  [ 3057.982915] phy1 -> rt2x00_set_chip: Info - Chipset detected - rt: 1300, rf: 0002, rev: 0002573a.
  [ 3058.026194] phy1: Selected rate control algorithm 'minstrel'
  [ 3058.057978] Registered led device: rt73usb-phy1::radio
  [ 3058.108090] Registered led device: rt73usb-phy1::assoc
  [ 3058.153068] Registered led device: rt73usb-phy1::quality
  [ 3058.317082] phy1 -> rt2x00lib_request_firmware: Info - Loading
  firmware file 'rt73.bin'.
  [ 3058.447020] rt73usb 5-1:1.0: firmware: requesting rt73.bin
  [ 3058.614883] phy1 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
  [ 3059.709337] usbcore: registered new interface driver rt2500usb

and this time interface wlan0 comes up:

wlan0     IEEE 802.11bg  ESSID:""  
          Mode:Managed  Frequency:2.412 GHz  Access Point: Not-Associated   
          Tx-Power=0 dBm   
          Retry min limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

I can set the key and mode and then essid with iwconfig, with no error,
but the device does not associate. It looks like some registers are set
but nothing physically happens:

wlan0     IEEE 802.11bg  ESSID:"Livebox-C338"  
          Mode:Managed  Frequency:2.412 GHz  Access Point: Not-Associated   
          Tx-Power=0 dBm   
          Retry min limit:7   RTS thr:off   Fragment thr:off
          Encryption key:B0F7-22C1-FD33-4554-B083-B7C7-5C   Security mode:open
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

If I try and set the access point with iwconfig, there's again no
complaint but no change in the association status. A "commit" with
iwconfig raises a snot supported error:

% sudo iwconfig wlan0 commit
Error for wireless request "Commit changes" (8B00) :
    SET failed on device wlan0 ; Operation not supported.

Kismet also fails on a ioctl and won't talk.

 Source 0 (rt2500): Enabling monitor mode for rt2500 source interface
 wlan0 channel 6...
 Waiting for server to start before starting UI...
 FATAL: SetIFFlags: Unknown interface wlan0: No such file or directory

 [pid 28715] ioctl(3, SIOCGIFFLAGS, 0x7fffc65100b0) = 0
 [pid 28715] ioctl(3, SIOCSIFFLAGS...
 [pid 28715] <... ioctl resumed> , 0x7fffc65100b0) = -1 ENOENT (No such file or directory)


The full lsusb output is


Bus 005 Device 004: ID 148f:2573 Ralink Technology, Corp. RT2501USB
Wireless Adapter
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x148f Ralink Technology, Corp.
  idProduct          0x2573 RT2501USB Wireless Adapter
  bcdDevice            0.01
  iManufacturer           1 Ralink
  iProduct                2 802.11 bg WLAN
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              300mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)



Yes, the access point is working. I'm connected to it from an atheros
card build into my TP now.

Regards, and here's hoping somebody can offer some advice.

Peter

^ permalink raw reply

* Re: 4965AGN loses connection on Custom wireless event
From: Dan Williams @ 2009-07-07 15:21 UTC (permalink / raw)
  To: Jan Willies; +Cc: linux-wireless
In-Reply-To: <4A535168.4050800@willies.info>

On Tue, 2009-07-07 at 15:45 +0200, Jan Willies wrote:
> Hi,
> 
> On 01.07.2009 16:29, Dan Williams wrote:
> > Jouni, how should the supplicant handle a WEXT assoc event for the AP
> > that's already associated with?  That seems to be what's going on here;
> > the card is coming back from a scan and emitting an assoc event (not
> > sure why) and that's making the supplicant (wrongly IMHO) try to reauth
> > at the EAP level for some reason.
> 
> Did I miss the answer here? Is there any more information I can provide?

Nope, not yet.  Jouni's traveling at the moment though so he might reply
when he gets back.

Dan



^ permalink raw reply

* Re: mac80211 and broadcast frames
From: John W. Linville @ 2009-07-07 14:48 UTC (permalink / raw)
  To: David Ross; +Cc: Valentin Manea, linux-wireless
In-Reply-To: <4A532D3C.5060601@antacs.com>

On Tue, Jul 07, 2009 at 09:10:52PM +1000, David Ross wrote:
> Actually it is required to be a mutual BASIC rate (not extended rates) -  
> not necessarily the "lowest possible" - David.

True, but FWIW I think all of our rate scaling algorithms choose the
lowest rate.

John
-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.
			¡Viva Honduras Libre!

^ permalink raw reply

* Re: ath5k and ap mode
From: Bob Copeland @ 2009-07-07 14:19 UTC (permalink / raw)
  To: tomek; +Cc: linux-wireless
In-Reply-To: <1246959589.4686.1.camel@debian-tomek>

On Tue, Jul 7, 2009 at 5:39 AM, tomek<paladyn11@gmail.com> wrote:
> Hi.
>
> When ap-mode will working in driver ath5k?

It will be enabled in 2.6.31... whether it works then or not is
anyone's guess :)

(fyi, I'm currently waiting on some hw to arrive to do thorough
testing of ath5k AP mode; some people say it works for them, but I'm
still seeing some bugs here.)

-- 
Bob Copeland %% www.bobcopeland.com

^ permalink raw reply

* Re: 4965AGN loses connection on Custom wireless event
From: Jan Willies @ 2009-07-07 13:45 UTC (permalink / raw)
  To: Dan Williams; +Cc: linux-wireless
In-Reply-To: <1246458585.12198.114.camel@localhost.localdomain>

Hi,

On 01.07.2009 16:29, Dan Williams wrote:
> Jouni, how should the supplicant handle a WEXT assoc event for the AP
> that's already associated with?  That seems to be what's going on here;
> the card is coming back from a scan and emitting an assoc event (not
> sure why) and that's making the supplicant (wrongly IMHO) try to reauth
> at the EAP level for some reason.

Did I miss the answer here? Is there any more information I can provide?


  - jan

^ permalink raw reply

* [PATCH -1/3] cfg80211: let SME control reassociation vs. association
From: Johannes Berg @ 2009-07-07 12:37 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless
In-Reply-To: <20090707014515.024822579@sipsolutions.net>

Since we don't really know that well in the kernel,
let's let the SME control whether it wants to use
reassociation or not, by allowing it to give the
previous BSSID in the associate() parameters.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
Oops, forgot to send this one out, it needs to be in front of this
series (and this series needs to be in front of the cfg80211 series) for
it all to apply properly.

 include/linux/nl80211.h |    5 +++++
 include/net/cfg80211.h  |    3 ++-
 net/mac80211/cfg.c      |    6 ++++++
 net/mac80211/mlme.c     |    7 -------
 net/wireless/core.h     |    3 ++-
 net/wireless/mlme.c     |    4 +++-
 net/wireless/nl80211.c  |   10 +++++++---
 net/wireless/sme.c      |    8 +++++++-
 8 files changed, 32 insertions(+), 14 deletions(-)

--- wireless-testing.orig/include/linux/nl80211.h	2009-07-07 03:29:38.000000000 +0200
+++ wireless-testing/include/linux/nl80211.h	2009-07-07 03:36:58.000000000 +0200
@@ -564,6 +564,9 @@ enum nl80211_commands {
  * @NL80211_ATTR_RESP_IE: (Re)association response information elements as
  *	sent by peer, for ROAM and successful CONNECT events.
  *
+ * @NL80211_ATTR_PREV_BSSID: previous BSSID, to be used by in ASSOCIATE
+ *	commands to specify using a reassociate frame
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
@@ -687,6 +690,8 @@ enum nl80211_attrs {
 	NL80211_ATTR_REQ_IE,
 	NL80211_ATTR_RESP_IE,
 
+	NL80211_ATTR_PREV_BSSID,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
--- wireless-testing.orig/net/wireless/nl80211.c	2009-07-07 03:29:39.000000000 +0200
+++ wireless-testing/net/wireless/nl80211.c	2009-07-07 03:36:58.000000000 +0200
@@ -71,6 +71,7 @@ static struct nla_policy nl80211_policy[
 	[NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
 
 	[NL80211_ATTR_MAC] = { .type = NLA_BINARY, .len = ETH_ALEN },
+	[NL80211_ATTR_PREV_BSSID] = { .type = NLA_BINARY, .len = ETH_ALEN },
 
 	[NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
 				    .len = WLAN_MAX_KEY_LEN },
@@ -3187,7 +3188,7 @@ static int nl80211_associate(struct sk_b
 	struct net_device *dev;
 	struct cfg80211_crypto_settings crypto;
 	struct ieee80211_channel *chan;
-	const u8 *bssid, *ssid, *ie = NULL;
+	const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL;
 	int err, ssid_len, ie_len = 0;
 	bool use_mfp = false;
 
@@ -3248,10 +3249,13 @@ static int nl80211_associate(struct sk_b
 		}
 	}
 
+	if (info->attrs[NL80211_ATTR_PREV_BSSID])
+		prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
+
 	err = nl80211_crypto_settings(info, &crypto, 1);
 	if (!err)
-		err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, ssid,
-					  ssid_len, ie, ie_len, use_mfp,
+		err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, prev_bssid,
+					  ssid, ssid_len, ie, ie_len, use_mfp,
 					  &crypto);
 
 out:
--- wireless-testing.orig/include/net/cfg80211.h	2009-07-07 03:29:38.000000000 +0200
+++ wireless-testing/include/net/cfg80211.h	2009-07-07 03:36:58.000000000 +0200
@@ -664,10 +664,11 @@ struct cfg80211_auth_request {
  * @ie_len: Length of ie buffer in octets
  * @use_mfp: Use management frame protection (IEEE 802.11w) in this association
  * @crypto: crypto settings
+ * @prev_bssid: previous BSSID, if not %NULL use reassociate frame
  */
 struct cfg80211_assoc_request {
 	struct cfg80211_bss *bss;
-	const u8 *ie;
+	const u8 *ie, *prev_bssid;
 	size_t ie_len;
 	struct cfg80211_crypto_settings crypto;
 	bool use_mfp;
--- wireless-testing.orig/net/wireless/core.h	2009-07-07 03:29:39.000000000 +0200
+++ wireless-testing/net/wireless/core.h	2009-07-07 03:36:58.000000000 +0200
@@ -202,7 +202,8 @@ int cfg80211_mlme_auth(struct cfg80211_r
 		       const u8 *ie, int ie_len);
 int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
 			struct net_device *dev, struct ieee80211_channel *chan,
-			const u8 *bssid, const u8 *ssid, int ssid_len,
+			const u8 *bssid, const u8 *prev_bssid,
+			const u8 *ssid, int ssid_len,
 			const u8 *ie, int ie_len, bool use_mfp,
 			struct cfg80211_crypto_settings *crypt);
 int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
--- wireless-testing.orig/net/wireless/mlme.c	2009-07-07 03:29:39.000000000 +0200
+++ wireless-testing/net/wireless/mlme.c	2009-07-07 03:36:58.000000000 +0200
@@ -335,7 +335,8 @@ int cfg80211_mlme_auth(struct cfg80211_r
 
 int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
 			struct net_device *dev, struct ieee80211_channel *chan,
-			const u8 *bssid, const u8 *ssid, int ssid_len,
+			const u8 *bssid, const u8 *prev_bssid,
+			const u8 *ssid, int ssid_len,
 			const u8 *ie, int ie_len, bool use_mfp,
 			struct cfg80211_crypto_settings *crypt)
 {
@@ -353,6 +354,7 @@ int cfg80211_mlme_assoc(struct cfg80211_
 	req.ie_len = ie_len;
 	memcpy(&req.crypto, crypt, sizeof(req.crypto));
 	req.use_mfp = use_mfp;
+	req.prev_bssid = prev_bssid;
 	req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
 				   WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
 	if (!req.bss)
--- wireless-testing.orig/net/wireless/sme.c	2009-07-07 03:29:39.000000000 +0200
+++ wireless-testing/net/wireless/sme.c	2009-07-07 03:36:58.000000000 +0200
@@ -125,8 +125,14 @@ static int cfg80211_conn_do_work(struct 
 	case CFG80211_CONN_ASSOCIATE_NEXT:
 		BUG_ON(!drv->ops->assoc);
 		wdev->conn->state = CFG80211_CONN_ASSOCIATING;
+		/*
+		 * We could, later, implement roaming here and then actually
+		 * set prev_bssid to non-NULL. But then we need to be aware
+		 * that some APs don't like that -- so we'd need to retry
+		 * the association.
+		 */
 		err = cfg80211_mlme_assoc(drv, wdev->netdev,
-					  params->channel, params->bssid,
+					  params->channel, params->bssid, NULL,
 					  params->ssid, params->ssid_len,
 					  params->ie, params->ie_len,
 					  false, &params->crypto);
--- wireless-testing.orig/net/mac80211/cfg.c	2009-07-07 03:29:38.000000000 +0200
+++ wireless-testing/net/mac80211/cfg.c	2009-07-07 03:36:58.000000000 +0200
@@ -1256,6 +1256,12 @@ static int ieee80211_assoc(struct wiphy 
 		sdata->u.mgd.flags &= ~IEEE80211_STA_MFP_ENABLED;
 	}
 
+	if (req->prev_bssid) {
+		sdata->u.mgd.flags |= IEEE80211_STA_PREV_BSSID_SET;
+		memcpy(sdata->u.mgd.prev_bssid, req->prev_bssid, ETH_ALEN);
+	} else
+		sdata->u.mgd.flags &= ~IEEE80211_STA_PREV_BSSID_SET;
+
 	if (req->crypto.control_port)
 		sdata->u.mgd.flags |= IEEE80211_STA_CONTROL_PORT;
 	else
--- wireless-testing.orig/net/mac80211/mlme.c	2009-07-07 03:29:38.000000000 +0200
+++ wireless-testing/net/mac80211/mlme.c	2009-07-07 03:36:58.000000000 +0200
@@ -879,9 +879,6 @@ static void ieee80211_set_associated(str
 		ieee80211_rx_bss_put(local, bss);
 	}
 
-	ifmgd->flags |= IEEE80211_STA_PREV_BSSID_SET;
-	memcpy(ifmgd->prev_bssid, sdata->u.mgd.bssid, ETH_ALEN);
-
 	ifmgd->last_probe = jiffies;
 	ieee80211_led_assoc(local, 1);
 
@@ -1470,10 +1467,6 @@ static void ieee80211_rx_mgmt_assoc_resp
 	if (status_code != WLAN_STATUS_SUCCESS) {
 		printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
 		       sdata->dev->name, status_code);
-		/* if this was a reassociation, ensure we try a "full"
-		 * association next time. This works around some broken APs
-		 * which do not correctly reject reassociation requests. */
-		ifmgd->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
 		cfg80211_send_rx_assoc(sdata->dev, (u8 *) mgmt, len,
 				       GFP_KERNEL);
 		/* Wait for SME to decide what to do next */



^ permalink raw reply

* [PATCH v2] mac80211: driver operation debugging
From: Johannes Berg @ 2009-07-07 11:46 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, Steven Rostedt
In-Reply-To: <1246966954.4755.7.camel@johannes.local>

This makes mac80211 use the event tracing framework
to log all operations as given to the driver. This
will need to be extended with more information, but
as a start it should be good.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
v2: fix kconfig

Here's an example:

# echo 1 > /debug/tracing/events/mac80211/enable
# hostapd ...&
# wpa_supplicant ...
<wait a bit>
# ^C
# fg
# ^C
# cat /debug/tracing/trace

# tracer: nop
#
#           TASK-PID    CPU#    TIMESTAMP  FUNCTION
#              | |       |          |         |
         hostapd-1717  [004] 10038.012037: drv_start: phy0
         hostapd-1717  [004] 10038.012047: drv_add_interface: phy0 vif:ffff88001ed31088(3) addr:02:00:00:00:00:00 ret:0
         hostapd-1717  [004] 10038.012056: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0xe
         hostapd-1717  [004] 10038.041698: drv_config: phy0 ch:0xffffffff ret:0
         hostapd-1717  [004] 10038.041703: drv_conf_tx: phy0 queue:0 ret:0
         hostapd-1717  [004] 10038.041707: drv_conf_tx: phy0 queue:1 ret:0
         hostapd-1717  [004] 10038.041711: drv_conf_tx: phy0 queue:2 ret:0
         hostapd-1717  [004] 10038.041714: drv_conf_tx: phy0 queue:3 ret:0
         hostapd-1717  [004] 10038.041720: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:0
         hostapd-1717  [004] 10038.041764: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.041811: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.083795: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.083860: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.151893: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x20
         hostapd-1717  [004] 10038.151968: drv_config: phy0 ch:0x40 ret:0
         hostapd-1717  [004] 10038.152054: drv_set_rts_threshold: phy0 value:-1 ret:0
         hostapd-1717  [004] 10038.251801: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x300
         hostapd-1717  [004] 10038.251899: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x2
         hostapd-1717  [004] 10038.251977: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x8
         hostapd-1717  [004] 10038.252053: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x4
  wpa_supplicant-1719  [000] 10049.104183: drv_start: phy1
  wpa_supplicant-1719  [000] 10049.104192: drv_add_interface: phy1 vif:ffff88001ed330e8(2) addr:02:00:00:00:01:00 ret:0
  wpa_supplicant-1719  [000] 10049.104202: drv_bss_info_changed: phy1 vif:ffff88001ed330e8(2) changed:0xe
  wpa_supplicant-1719  [000] 10049.139213: drv_config: phy1 ch:0xffffffff ret:0
  wpa_supplicant-1719  [000] 10049.139218: drv_conf_tx: phy1 queue:0 ret:0
  wpa_supplicant-1719  [000] 10049.139222: drv_conf_tx: phy1 queue:1 ret:0
  wpa_supplicant-1719  [000] 10049.139226: drv_conf_tx: phy1 queue:2 ret:0
  wpa_supplicant-1719  [000] 10049.139229: drv_conf_tx: phy1 queue:3 ret:0
  wpa_supplicant-1719  [000] 10049.139276: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:0
  wpa_supplicant-1719  [000] 10049.139313: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:1
  wpa_supplicant-1719  [000] 10049.139362: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:1
  wpa_supplicant-1719  [006] 10049.304605: drv_config: phy1 ch:0x100 ret:0
  wpa_supplicant-1719  [006] 10049.304610: drv_sw_scan_start: phy1
  wpa_supplicant-1719  [006] 10049.304640: drv_configure_filter: phy1 changed:0x10 total:0x0 mc:1
            phy1-613   [006] 10049.333098: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.389179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.449175: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.509223: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.569178: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.629194: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.689348: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.749182: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.809179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.869177: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.929175: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.989257: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.049179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.109179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.169184: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.229181: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.289190: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.349249: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.409255: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.469240: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.529166: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.589185: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.649176: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.709178: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.769337: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.769353: drv_configure_filter: phy1 changed:0x10 total:0x0 mc:1
            phy1-613   [006] 10050.769355: drv_sw_scan_complete: phy1
            phy1-613   [006] 10050.769376: drv_config: phy1 ch:0x100 ret:0
  wpa_supplicant-1719  [006] 10050.773854: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.774022: drv_config: phy1 ch:0x100 ret:0
         hostapd-1717  [004] 10050.970744: drv_sta_notify: phy0 vif:ffff88001ed31088(3) sta:02:00:00:00:01:00 cmd:0
            phy1-613   [006] 10050.972031: drv_sta_notify: phy1 vif:ffff88001ed330e8(2) sta:02:00:00:00:00:00 cmd:0
            phy1-613   [006] 10050.972155: drv_bss_info_changed: phy1 vif:ffff88001ed330e8(2) changed:0xed
  wpa_supplicant-1719  [006] 10061.292954: drv_conf_tx: phy1 queue:0 ret:0
  wpa_supplicant-1719  [006] 10061.292960: drv_conf_tx: phy1 queue:1 ret:0
  wpa_supplicant-1719  [006] 10061.292964: drv_conf_tx: phy1 queue:2 ret:0
  wpa_supplicant-1719  [006] 10061.292968: drv_conf_tx: phy1 queue:3 ret:0
  wpa_supplicant-1719  [006] 10061.292995: drv_config: phy1 ch:0x100 ret:0
  wpa_supplicant-1719  [006] 10061.293044: drv_bss_info_changed: phy1 vif:ffff88001ed330e8(2) changed:0x8f
  wpa_supplicant-1719  [006] 10061.293166: drv_sta_notify: phy1 vif:ffff88001ed330e8(2) sta:02:00:00:00:00:00 cmd:1
         hostapd-1717  [004] 10061.354522: drv_sta_notify: phy0 vif:ffff88001ed31088(3) sta:02:00:00:00:01:00 cmd:1
  wpa_supplicant-1719  [006] 10061.412163: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:1
  wpa_supplicant-1719  [006] 10061.432941: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:0
  wpa_supplicant-1719  [006] 10061.492912: drv_remove_interface: phy1 vif:ffff88001ed330e8(2) addr:02:00:00:00:01:00
  wpa_supplicant-1719  [006] 10061.492920: drv_stop: phy1
         hostapd-1717  [004] 10063.651665: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10063.781670: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x200
         hostapd-1717  [004] 10063.811756: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10063.841668: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:0
         hostapd-1717  [004] 10063.931656: drv_remove_interface: phy0 vif:ffff88001ed31088(3) addr:02:00:00:00:00:00
         hostapd-1717  [004] 10063.931666: drv_stop: phy0


 net/mac80211/Kconfig        |   12 
 net/mac80211/Makefile       |    3 
 net/mac80211/driver-ops.h   |   85 ++++-
 net/mac80211/driver-trace.c |    6 
 net/mac80211/driver-trace.h |  648 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 732 insertions(+), 22 deletions(-)

--- wireless-testing.orig/net/mac80211/driver-ops.h	2009-07-07 13:36:05.000000000 +0200
+++ wireless-testing/net/mac80211/driver-ops.h	2009-07-07 13:36:18.000000000 +0200
@@ -3,6 +3,7 @@
 
 #include <net/mac80211.h>
 #include "ieee80211_i.h"
+#include "driver-trace.h"
 
 static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb)
 {
@@ -11,29 +12,37 @@ static inline int drv_tx(struct ieee8021
 
 static inline int drv_start(struct ieee80211_local *local)
 {
-	return local->ops->start(&local->hw);
+	int ret = local->ops->start(&local->hw);
+	trace_drv_start(local, ret);
+	return ret;
 }
 
 static inline void drv_stop(struct ieee80211_local *local)
 {
 	local->ops->stop(&local->hw);
+	trace_drv_stop(local);
 }
 
 static inline int drv_add_interface(struct ieee80211_local *local,
 				    struct ieee80211_if_init_conf *conf)
 {
-	return local->ops->add_interface(&local->hw, conf);
+	int ret = local->ops->add_interface(&local->hw, conf);
+	trace_drv_add_interface(local, conf->mac_addr, conf->vif, ret);
+	return ret;
 }
 
 static inline void drv_remove_interface(struct ieee80211_local *local,
 					struct ieee80211_if_init_conf *conf)
 {
 	local->ops->remove_interface(&local->hw, conf);
+	trace_drv_remove_interface(local, conf->mac_addr, conf->vif);
 }
 
 static inline int drv_config(struct ieee80211_local *local, u32 changed)
 {
-	return local->ops->config(&local->hw, changed);
+	int ret = local->ops->config(&local->hw, changed);
+	trace_drv_config(local, changed, ret);
+	return ret;
 }
 
 static inline void drv_bss_info_changed(struct ieee80211_local *local,
@@ -43,6 +52,7 @@ static inline void drv_bss_info_changed(
 {
 	if (local->ops->bss_info_changed)
 		local->ops->bss_info_changed(&local->hw, vif, info, changed);
+	trace_drv_bss_info_changed(local, vif, info, changed);
 }
 
 static inline void drv_configure_filter(struct ieee80211_local *local,
@@ -53,14 +63,18 @@ static inline void drv_configure_filter(
 {
 	local->ops->configure_filter(&local->hw, changed_flags, total_flags,
 				     mc_count, mc_list);
+	trace_drv_configure_filter(local, changed_flags, total_flags,
+					    mc_count);
 }
 
 static inline int drv_set_tim(struct ieee80211_local *local,
 			      struct ieee80211_sta *sta, bool set)
 {
+	int ret = 0;
 	if (local->ops->set_tim)
-		return local->ops->set_tim(&local->hw, sta, set);
-	return 0;
+		ret = local->ops->set_tim(&local->hw, sta, set);
+	trace_drv_set_tim(local, sta, set, ret);
+	return ret;
 }
 
 static inline int drv_set_key(struct ieee80211_local *local,
@@ -68,7 +82,9 @@ static inline int drv_set_key(struct iee
 			      struct ieee80211_sta *sta,
 			      struct ieee80211_key_conf *key)
 {
-	return local->ops->set_key(&local->hw, cmd, vif, sta, key);
+	int ret = local->ops->set_key(&local->hw, cmd, vif, sta, key);
+	trace_drv_set_key(local, cmd, vif, sta, key, ret);
+	return ret;
 }
 
 static inline void drv_update_tkip_key(struct ieee80211_local *local,
@@ -79,32 +95,41 @@ static inline void drv_update_tkip_key(s
 	if (local->ops->update_tkip_key)
 		local->ops->update_tkip_key(&local->hw, conf, address,
 					    iv32, phase1key);
+	trace_drv_update_tkip_key(local, conf, address, iv32);
 }
 
 static inline int drv_hw_scan(struct ieee80211_local *local,
 			      struct cfg80211_scan_request *req)
 {
-	return local->ops->hw_scan(&local->hw, req);
+	int ret = local->ops->hw_scan(&local->hw, req);
+	trace_drv_hw_scan(local, req, ret);
+	return ret;
 }
 
 static inline void drv_sw_scan_start(struct ieee80211_local *local)
 {
 	if (local->ops->sw_scan_start)
 		local->ops->sw_scan_start(&local->hw);
+	trace_drv_sw_scan_start(local);
 }
 
 static inline void drv_sw_scan_complete(struct ieee80211_local *local)
 {
 	if (local->ops->sw_scan_complete)
 		local->ops->sw_scan_complete(&local->hw);
+	trace_drv_sw_scan_complete(local);
 }
 
 static inline int drv_get_stats(struct ieee80211_local *local,
 				struct ieee80211_low_level_stats *stats)
 {
-	if (!local->ops->get_stats)
-		return -EOPNOTSUPP;
-	return local->ops->get_stats(&local->hw, stats);
+	int ret = -EOPNOTSUPP;
+
+	if (local->ops->get_stats)
+		ret = local->ops->get_stats(&local->hw, stats);
+	trace_drv_get_stats(local, stats, ret);
+
+	return ret;
 }
 
 static inline void drv_get_tkip_seq(struct ieee80211_local *local,
@@ -112,14 +137,17 @@ static inline void drv_get_tkip_seq(stru
 {
 	if (local->ops->get_tkip_seq)
 		local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16);
+	trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16);
 }
 
 static inline int drv_set_rts_threshold(struct ieee80211_local *local,
 					u32 value)
 {
+	int ret = 0;
 	if (local->ops->set_rts_threshold)
-		return local->ops->set_rts_threshold(&local->hw, value);
-	return 0;
+		ret = local->ops->set_rts_threshold(&local->hw, value);
+	trace_drv_set_rts_threshold(local, value, ret);
+	return ret;
 }
 
 static inline void drv_sta_notify(struct ieee80211_local *local,
@@ -129,46 +157,57 @@ static inline void drv_sta_notify(struct
 {
 	if (local->ops->sta_notify)
 		local->ops->sta_notify(&local->hw, vif, cmd, sta);
+	trace_drv_sta_notify(local, vif, cmd, sta);
 }
 
 static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
 			      const struct ieee80211_tx_queue_params *params)
 {
+	int ret = -EOPNOTSUPP;
 	if (local->ops->conf_tx)
-		return local->ops->conf_tx(&local->hw, queue, params);
-	return -EOPNOTSUPP;
+		ret = local->ops->conf_tx(&local->hw, queue, params);
+	trace_drv_conf_tx(local, queue, params, ret);
+	return ret;
 }
 
 static inline int drv_get_tx_stats(struct ieee80211_local *local,
 				   struct ieee80211_tx_queue_stats *stats)
 {
-	return local->ops->get_tx_stats(&local->hw, stats);
+	int ret = local->ops->get_tx_stats(&local->hw, stats);
+	trace_drv_get_tx_stats(local, stats, ret);
+	return ret;
 }
 
 static inline u64 drv_get_tsf(struct ieee80211_local *local)
 {
+	u64 ret = -1ULL;
 	if (local->ops->get_tsf)
-		return local->ops->get_tsf(&local->hw);
-	return -1ULL;
+		ret = local->ops->get_tsf(&local->hw);
+	trace_drv_get_tsf(local, ret);
+	return ret;
 }
 
 static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf)
 {
 	if (local->ops->set_tsf)
 		local->ops->set_tsf(&local->hw, tsf);
+	trace_drv_set_tsf(local, tsf);
 }
 
 static inline void drv_reset_tsf(struct ieee80211_local *local)
 {
 	if (local->ops->reset_tsf)
 		local->ops->reset_tsf(&local->hw);
+	trace_drv_reset_tsf(local);
 }
 
 static inline int drv_tx_last_beacon(struct ieee80211_local *local)
 {
+	int ret = 1;
 	if (local->ops->tx_last_beacon)
-		return local->ops->tx_last_beacon(&local->hw);
-	return 1;
+		ret = local->ops->tx_last_beacon(&local->hw);
+	trace_drv_tx_last_beacon(local, ret);
+	return ret;
 }
 
 static inline int drv_ampdu_action(struct ieee80211_local *local,
@@ -176,10 +215,12 @@ static inline int drv_ampdu_action(struc
 				   struct ieee80211_sta *sta, u16 tid,
 				   u16 *ssn)
 {
+	int ret = -EOPNOTSUPP;
 	if (local->ops->ampdu_action)
-		return local->ops->ampdu_action(&local->hw, action,
-						sta, tid, ssn);
-	return -EOPNOTSUPP;
+		ret = local->ops->ampdu_action(&local->hw, action,
+					       sta, tid, ssn);
+	trace_drv_ampdu_action(local, action, sta, tid, ssn, ret);
+	return ret;
 }
 
 
--- wireless-testing.orig/net/mac80211/Kconfig	2009-07-07 13:36:10.000000000 +0200
+++ wireless-testing/net/mac80211/Kconfig	2009-07-07 13:45:16.000000000 +0200
@@ -205,3 +205,15 @@ config MAC80211_DEBUG_COUNTERS
 	  and show them in debugfs.
 
 	  If unsure, say N.
+
+config MAC80211_DRIVER_API_TRACER
+	bool "Driver API tracer"
+	depends on MAC80211_DEBUG_MENU
+	depends on EVENT_TRACING
+	help
+	  Say Y here to make mac80211 register with the ftrace
+	  framework for the driver API -- you can see which
+	  driver methods it is calling then by looking at the
+	  trace.
+
+	  If unsure, say N.
--- wireless-testing.orig/net/mac80211/Makefile	2009-07-07 13:36:10.000000000 +0200
+++ wireless-testing/net/mac80211/Makefile	2009-07-07 13:36:18.000000000 +0200
@@ -41,6 +41,9 @@ mac80211-$(CONFIG_MAC80211_MESH) += \
 
 mac80211-$(CONFIG_PM) += pm.o
 
+mac80211-$(CONFIG_MAC80211_DRIVER_API_TRACER) += driver-trace.o
+CFLAGS_driver-trace.o := -I$(src)
+
 # objects for PID algorithm
 rc80211_pid-y := rc80211_pid_algo.o
 rc80211_pid-$(CONFIG_MAC80211_DEBUGFS) += rc80211_pid_debugfs.o
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ wireless-testing/net/mac80211/driver-trace.h	2009-07-07 13:36:18.000000000 +0200
@@ -0,0 +1,648 @@
+#if !defined(__MAC80211_DRIVER_TRACE) || defined(TRACE_HEADER_MULTI_READ)
+#define __MAC80211_DRIVER_TRACE
+
+#include <linux/tracepoint.h>
+#include <net/mac80211.h>
+#include "ieee80211_i.h"
+
+#ifndef CONFIG_MAC80211_DRIVER_API_TRACER
+#undef TRACE_EVENT
+#define TRACE_EVENT(name, proto, ...) \
+static inline void trace_ ## name(proto) {}
+#endif
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM mac80211
+
+#define MAXNAME		32
+#define LOCAL_ENTRY	__array(char, wiphy_name, 32)
+#define LOCAL_ASSIGN	strlcpy(__entry->wiphy_name, wiphy_name(local->hw.wiphy), MAXNAME)
+#define LOCAL_PR_FMT	"%s"
+#define LOCAL_PR_ARG	__entry->wiphy_name
+
+#define STA_ENTRY	__array(char, sta_addr, ETH_ALEN)
+#define STA_ASSIGN	(sta ? memcpy(__entry->sta_addr, sta->addr, ETH_ALEN) : memset(__entry->sta_addr, 0, ETH_ALEN))
+#define STA_PR_FMT	" sta:%pM"
+#define STA_PR_ARG	__entry->sta_addr
+
+#define VIF_ENTRY	__field(enum nl80211_iftype, vif_type) __field(void *, vif)
+#define VIF_ASSIGN	__entry->vif_type = vif ? vif->type : 0; __entry->vif = vif
+#define VIF_PR_FMT	" vif:%p(%d)"
+#define VIF_PR_ARG	__entry->vif, __entry->vif_type
+
+TRACE_EVENT(drv_start,
+	TP_PROTO(struct ieee80211_local *local, int ret),
+
+	TP_ARGS(local, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_stop,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_add_interface,
+	TP_PROTO(struct ieee80211_local *local,
+		 const u8 *addr,
+		 struct ieee80211_vif *vif,
+		 int ret),
+
+	TP_ARGS(local, addr, vif, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		__array(char, addr, 6)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		memcpy(__entry->addr, addr, 6);
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT " addr:%pM ret:%d",
+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->addr, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_remove_interface,
+	TP_PROTO(struct ieee80211_local *local,
+		 const u8 *addr, struct ieee80211_vif *vif),
+
+	TP_ARGS(local, addr, vif),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		__array(char, addr, 6)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		memcpy(__entry->addr, addr, 6);
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT " addr:%pM",
+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->addr
+	)
+);
+
+TRACE_EVENT(drv_config,
+	TP_PROTO(struct ieee80211_local *local,
+		 u32 changed,
+		 int ret),
+
+	TP_ARGS(local, changed, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u32, changed)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->changed = changed;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ch:%#x ret:%d",
+		LOCAL_PR_ARG, __entry->changed, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_bss_info_changed,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_vif *vif,
+		 struct ieee80211_bss_conf *info,
+		 u32 changed),
+
+	TP_ARGS(local, vif, info, changed),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		__field(bool, assoc)
+		__field(u16, aid)
+		__field(bool, cts)
+		__field(bool, shortpre)
+		__field(bool, shortslot)
+		__field(u8, dtimper)
+		__field(u16, bcnint)
+		__field(u16, assoc_cap)
+		__field(u64, timestamp)
+		__field(u32, basic_rates)
+		__field(u32, changed)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		__entry->changed = changed;
+		__entry->aid = info->aid;
+		__entry->assoc = info->assoc;
+		__entry->shortpre = info->use_short_preamble;
+		__entry->cts = info->use_cts_prot;
+		__entry->shortslot = info->use_short_slot;
+		__entry->dtimper = info->dtim_period;
+		__entry->bcnint = info->beacon_int;
+		__entry->assoc_cap = info->assoc_capability;
+		__entry->timestamp = info->timestamp;
+		__entry->basic_rates = info->basic_rates;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT " changed:%#x",
+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->changed
+	)
+);
+
+TRACE_EVENT(drv_configure_filter,
+	TP_PROTO(struct ieee80211_local *local,
+		 unsigned int changed_flags,
+		 unsigned int *total_flags,
+		 int mc_count),
+
+	TP_ARGS(local, changed_flags, total_flags, mc_count),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(unsigned int, changed)
+		__field(unsigned int, total)
+		__field(int, mc)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->changed = changed_flags;
+		__entry->total = *total_flags;
+		__entry->mc = mc_count;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " changed:%#x total:%#x mc:%d",
+		LOCAL_PR_ARG, __entry->changed, __entry->total, __entry->mc
+	)
+);
+
+TRACE_EVENT(drv_set_tim,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_sta *sta, bool set, int ret),
+
+	TP_ARGS(local, sta, set, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		STA_ENTRY
+		__field(bool, set)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		STA_ASSIGN;
+		__entry->set = set;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT STA_PR_FMT " set:%d ret:%d",
+		LOCAL_PR_ARG, STA_PR_FMT, __entry->set, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_set_key,
+	TP_PROTO(struct ieee80211_local *local,
+		 enum set_key_cmd cmd, struct ieee80211_vif *vif,
+		 struct ieee80211_sta *sta,
+		 struct ieee80211_key_conf *key, int ret),
+
+	TP_ARGS(local, cmd, vif, sta, key, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		STA_ENTRY
+		__field(enum ieee80211_key_alg, alg)
+		__field(u8, hw_key_idx)
+		__field(u8, flags)
+		__field(s8, keyidx)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		STA_ASSIGN;
+		__entry->alg = key->alg;
+		__entry->flags = key->flags;
+		__entry->keyidx = key->keyidx;
+		__entry->hw_key_idx = key->hw_key_idx;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_update_tkip_key,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_key_conf *conf,
+		 const u8 *address, u32 iv32),
+
+	TP_ARGS(local, conf, address, iv32),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__array(u8, addr, 6)
+		__field(u32, iv32)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		memcpy(__entry->addr, address, 6);
+		__entry->iv32 = iv32;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " addr:%pM iv32:%#x",
+		LOCAL_PR_ARG, __entry->addr, __entry->iv32
+	)
+);
+
+TRACE_EVENT(drv_hw_scan,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct cfg80211_scan_request *req, int ret),
+
+	TP_ARGS(local, req, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_sw_scan_start,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_sw_scan_complete,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_get_stats,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_low_level_stats *stats,
+		 int ret),
+
+	TP_ARGS(local, stats, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+		__field(unsigned int, ackfail)
+		__field(unsigned int, rtsfail)
+		__field(unsigned int, fcserr)
+		__field(unsigned int, rtssucc)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+		__entry->ackfail = stats->dot11ACKFailureCount;
+		__entry->rtsfail = stats->dot11RTSFailureCount;
+		__entry->fcserr = stats->dot11FCSErrorCount;
+		__entry->rtssucc = stats->dot11RTSSuccessCount;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_get_tkip_seq,
+	TP_PROTO(struct ieee80211_local *local,
+		 u8 hw_key_idx, u32 *iv32, u16 *iv16),
+
+	TP_ARGS(local, hw_key_idx, iv32, iv16),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u8, hw_key_idx)
+		__field(u32, iv32)
+		__field(u16, iv16)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->hw_key_idx = hw_key_idx;
+		__entry->iv32 = *iv32;
+		__entry->iv16 = *iv16;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_set_rts_threshold,
+	TP_PROTO(struct ieee80211_local *local, u32 value, int ret),
+
+	TP_ARGS(local, value, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u32, value)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+		__entry->value = value;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " value:%d ret:%d",
+		LOCAL_PR_ARG, __entry->value, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_sta_notify,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_vif *vif,
+		 enum sta_notify_cmd cmd,
+		 struct ieee80211_sta *sta),
+
+	TP_ARGS(local, vif, cmd, sta),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		STA_ENTRY
+		__field(u32, cmd)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		STA_ASSIGN;
+		__entry->cmd = cmd;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " cmd:%d",
+		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->cmd
+	)
+);
+
+TRACE_EVENT(drv_conf_tx,
+	TP_PROTO(struct ieee80211_local *local, u16 queue,
+		 const struct ieee80211_tx_queue_params *params,
+		 int ret),
+
+	TP_ARGS(local, queue, params, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u16, queue)
+		__field(u16, txop)
+		__field(u16, cw_min)
+		__field(u16, cw_max)
+		__field(u8, aifs)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->queue = queue;
+		__entry->ret = ret;
+		__entry->txop = params->txop;
+		__entry->cw_max = params->cw_max;
+		__entry->cw_min = params->cw_min;
+		__entry->aifs = params->aifs;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " queue:%d ret:%d",
+		LOCAL_PR_ARG, __entry->queue, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_get_tx_stats,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_tx_queue_stats *stats,
+		 int ret),
+
+	TP_ARGS(local, stats, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_get_tsf,
+	TP_PROTO(struct ieee80211_local *local, u64 ret),
+
+	TP_ARGS(local, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u64, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%llu",
+		LOCAL_PR_ARG, (unsigned long long)__entry->ret
+	)
+);
+
+TRACE_EVENT(drv_set_tsf,
+	TP_PROTO(struct ieee80211_local *local, u64 tsf),
+
+	TP_ARGS(local, tsf),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u64, tsf)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->tsf = tsf;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " tsf:%llu",
+		LOCAL_PR_ARG, (unsigned long long)__entry->tsf
+	)
+);
+
+TRACE_EVENT(drv_reset_tsf,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_tx_last_beacon,
+	TP_PROTO(struct ieee80211_local *local, int ret),
+
+	TP_ARGS(local, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_ampdu_action,
+	TP_PROTO(struct ieee80211_local *local,
+		 enum ieee80211_ampdu_mlme_action action,
+		 struct ieee80211_sta *sta, u16 tid,
+		 u16 *ssn, int ret),
+
+	TP_ARGS(local, action, sta, tid, ssn, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+        	STA_ENTRY
+        	__field(u32, action)
+        	__field(u16, tid)
+        	__field(u16, ssn)
+        	__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		STA_ASSIGN;
+		__entry->ret = ret;
+		__entry->action = action;
+		__entry->tid = tid;
+		__entry->ssn = *ssn;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  STA_PR_FMT " action:%d tid:%d ret:%d",
+		LOCAL_PR_ARG, STA_PR_ARG, __entry->action, __entry->tid, __entry->ret
+	)
+);
+#endif /* __MAC80211_DRIVER_TRACE */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE driver-trace
+#include <trace/define_trace.h>
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ wireless-testing/net/mac80211/driver-trace.c	2009-07-07 13:36:18.000000000 +0200
@@ -0,0 +1,6 @@
+/* bug in tracepoint.h, it should include this */
+#include <linux/module.h>
+
+#include "driver-ops.h"
+#define CREATE_TRACE_POINTS
+#include "driver-trace.h"



^ permalink raw reply

* [PATCH] mac80211: driver operation debugging
From: Johannes Berg @ 2009-07-07 11:42 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, Steven Rostedt

This makes mac80211 use the event tracing framework
to log all operations as given to the driver. This
will need to be extended with more information, but
as a start it should be good.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
Here's an example:

# echo 1 > /debug/tracing/events/mac80211/enable
# hostapd ...&
# wpa_supplicant ...
<wait a bit>
# ^C
# fg
# ^C
# cat /debug/tracing/trace

# tracer: nop
#
#           TASK-PID    CPU#    TIMESTAMP  FUNCTION
#              | |       |          |         |
         hostapd-1717  [004] 10038.012037: drv_start: phy0
         hostapd-1717  [004] 10038.012047: drv_add_interface: phy0 vif:ffff88001ed31088(3) addr:02:00:00:00:00:00 ret:0
         hostapd-1717  [004] 10038.012056: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0xe
         hostapd-1717  [004] 10038.041698: drv_config: phy0 ch:0xffffffff ret:0
         hostapd-1717  [004] 10038.041703: drv_conf_tx: phy0 queue:0 ret:0
         hostapd-1717  [004] 10038.041707: drv_conf_tx: phy0 queue:1 ret:0
         hostapd-1717  [004] 10038.041711: drv_conf_tx: phy0 queue:2 ret:0
         hostapd-1717  [004] 10038.041714: drv_conf_tx: phy0 queue:3 ret:0
         hostapd-1717  [004] 10038.041720: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:0
         hostapd-1717  [004] 10038.041764: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.041811: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.083795: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.083860: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10038.151893: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x20
         hostapd-1717  [004] 10038.151968: drv_config: phy0 ch:0x40 ret:0
         hostapd-1717  [004] 10038.152054: drv_set_rts_threshold: phy0 value:-1 ret:0
         hostapd-1717  [004] 10038.251801: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x300
         hostapd-1717  [004] 10038.251899: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x2
         hostapd-1717  [004] 10038.251977: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x8
         hostapd-1717  [004] 10038.252053: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x4
  wpa_supplicant-1719  [000] 10049.104183: drv_start: phy1
  wpa_supplicant-1719  [000] 10049.104192: drv_add_interface: phy1 vif:ffff88001ed330e8(2) addr:02:00:00:00:01:00 ret:0
  wpa_supplicant-1719  [000] 10049.104202: drv_bss_info_changed: phy1 vif:ffff88001ed330e8(2) changed:0xe
  wpa_supplicant-1719  [000] 10049.139213: drv_config: phy1 ch:0xffffffff ret:0
  wpa_supplicant-1719  [000] 10049.139218: drv_conf_tx: phy1 queue:0 ret:0
  wpa_supplicant-1719  [000] 10049.139222: drv_conf_tx: phy1 queue:1 ret:0
  wpa_supplicant-1719  [000] 10049.139226: drv_conf_tx: phy1 queue:2 ret:0
  wpa_supplicant-1719  [000] 10049.139229: drv_conf_tx: phy1 queue:3 ret:0
  wpa_supplicant-1719  [000] 10049.139276: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:0
  wpa_supplicant-1719  [000] 10049.139313: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:1
  wpa_supplicant-1719  [000] 10049.139362: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:1
  wpa_supplicant-1719  [006] 10049.304605: drv_config: phy1 ch:0x100 ret:0
  wpa_supplicant-1719  [006] 10049.304610: drv_sw_scan_start: phy1
  wpa_supplicant-1719  [006] 10049.304640: drv_configure_filter: phy1 changed:0x10 total:0x0 mc:1
            phy1-613   [006] 10049.333098: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.389179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.449175: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.509223: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.569178: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.629194: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.689348: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.749182: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.809179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.869177: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.929175: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10049.989257: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.049179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.109179: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.169184: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.229181: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.289190: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.349249: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.409255: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.469240: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.529166: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.589185: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.649176: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.709178: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.769337: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.769353: drv_configure_filter: phy1 changed:0x10 total:0x0 mc:1
            phy1-613   [006] 10050.769355: drv_sw_scan_complete: phy1
            phy1-613   [006] 10050.769376: drv_config: phy1 ch:0x100 ret:0
  wpa_supplicant-1719  [006] 10050.773854: drv_config: phy1 ch:0x40 ret:0
            phy1-613   [006] 10050.774022: drv_config: phy1 ch:0x100 ret:0
         hostapd-1717  [004] 10050.970744: drv_sta_notify: phy0 vif:ffff88001ed31088(3) sta:02:00:00:00:01:00 cmd:0
            phy1-613   [006] 10050.972031: drv_sta_notify: phy1 vif:ffff88001ed330e8(2) sta:02:00:00:00:00:00 cmd:0
            phy1-613   [006] 10050.972155: drv_bss_info_changed: phy1 vif:ffff88001ed330e8(2) changed:0xed
  wpa_supplicant-1719  [006] 10061.292954: drv_conf_tx: phy1 queue:0 ret:0
  wpa_supplicant-1719  [006] 10061.292960: drv_conf_tx: phy1 queue:1 ret:0
  wpa_supplicant-1719  [006] 10061.292964: drv_conf_tx: phy1 queue:2 ret:0
  wpa_supplicant-1719  [006] 10061.292968: drv_conf_tx: phy1 queue:3 ret:0
  wpa_supplicant-1719  [006] 10061.292995: drv_config: phy1 ch:0x100 ret:0
  wpa_supplicant-1719  [006] 10061.293044: drv_bss_info_changed: phy1 vif:ffff88001ed330e8(2) changed:0x8f
  wpa_supplicant-1719  [006] 10061.293166: drv_sta_notify: phy1 vif:ffff88001ed330e8(2) sta:02:00:00:00:00:00 cmd:1
         hostapd-1717  [004] 10061.354522: drv_sta_notify: phy0 vif:ffff88001ed31088(3) sta:02:00:00:00:01:00 cmd:1
  wpa_supplicant-1719  [006] 10061.412163: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:1
  wpa_supplicant-1719  [006] 10061.432941: drv_configure_filter: phy1 changed:0x0 total:0x0 mc:0
  wpa_supplicant-1719  [006] 10061.492912: drv_remove_interface: phy1 vif:ffff88001ed330e8(2) addr:02:00:00:00:01:00
  wpa_supplicant-1719  [006] 10061.492920: drv_stop: phy1
         hostapd-1717  [004] 10063.651665: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10063.781670: drv_bss_info_changed: phy0 vif:ffff88001ed31088(3) changed:0x200
         hostapd-1717  [004] 10063.811756: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:1
         hostapd-1717  [004] 10063.841668: drv_configure_filter: phy0 changed:0x0 total:0x0 mc:0
         hostapd-1717  [004] 10063.931656: drv_remove_interface: phy0 vif:ffff88001ed31088(3) addr:02:00:00:00:00:00
         hostapd-1717  [004] 10063.931666: drv_stop: phy0


 net/mac80211/Kconfig        |   10 
 net/mac80211/Makefile       |    3 
 net/mac80211/driver-ops.h   |   85 ++++-
 net/mac80211/driver-trace.c |    6 
 net/mac80211/driver-trace.h |  648 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 730 insertions(+), 22 deletions(-)

--- wireless-testing.orig/net/mac80211/driver-ops.h	2009-07-07 13:36:05.000000000 +0200
+++ wireless-testing/net/mac80211/driver-ops.h	2009-07-07 13:36:18.000000000 +0200
@@ -3,6 +3,7 @@
 
 #include <net/mac80211.h>
 #include "ieee80211_i.h"
+#include "driver-trace.h"
 
 static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb)
 {
@@ -11,29 +12,37 @@ static inline int drv_tx(struct ieee8021
 
 static inline int drv_start(struct ieee80211_local *local)
 {
-	return local->ops->start(&local->hw);
+	int ret = local->ops->start(&local->hw);
+	trace_drv_start(local, ret);
+	return ret;
 }
 
 static inline void drv_stop(struct ieee80211_local *local)
 {
 	local->ops->stop(&local->hw);
+	trace_drv_stop(local);
 }
 
 static inline int drv_add_interface(struct ieee80211_local *local,
 				    struct ieee80211_if_init_conf *conf)
 {
-	return local->ops->add_interface(&local->hw, conf);
+	int ret = local->ops->add_interface(&local->hw, conf);
+	trace_drv_add_interface(local, conf->mac_addr, conf->vif, ret);
+	return ret;
 }
 
 static inline void drv_remove_interface(struct ieee80211_local *local,
 					struct ieee80211_if_init_conf *conf)
 {
 	local->ops->remove_interface(&local->hw, conf);
+	trace_drv_remove_interface(local, conf->mac_addr, conf->vif);
 }
 
 static inline int drv_config(struct ieee80211_local *local, u32 changed)
 {
-	return local->ops->config(&local->hw, changed);
+	int ret = local->ops->config(&local->hw, changed);
+	trace_drv_config(local, changed, ret);
+	return ret;
 }
 
 static inline void drv_bss_info_changed(struct ieee80211_local *local,
@@ -43,6 +52,7 @@ static inline void drv_bss_info_changed(
 {
 	if (local->ops->bss_info_changed)
 		local->ops->bss_info_changed(&local->hw, vif, info, changed);
+	trace_drv_bss_info_changed(local, vif, info, changed);
 }
 
 static inline void drv_configure_filter(struct ieee80211_local *local,
@@ -53,14 +63,18 @@ static inline void drv_configure_filter(
 {
 	local->ops->configure_filter(&local->hw, changed_flags, total_flags,
 				     mc_count, mc_list);
+	trace_drv_configure_filter(local, changed_flags, total_flags,
+					    mc_count);
 }
 
 static inline int drv_set_tim(struct ieee80211_local *local,
 			      struct ieee80211_sta *sta, bool set)
 {
+	int ret = 0;
 	if (local->ops->set_tim)
-		return local->ops->set_tim(&local->hw, sta, set);
-	return 0;
+		ret = local->ops->set_tim(&local->hw, sta, set);
+	trace_drv_set_tim(local, sta, set, ret);
+	return ret;
 }
 
 static inline int drv_set_key(struct ieee80211_local *local,
@@ -68,7 +82,9 @@ static inline int drv_set_key(struct iee
 			      struct ieee80211_sta *sta,
 			      struct ieee80211_key_conf *key)
 {
-	return local->ops->set_key(&local->hw, cmd, vif, sta, key);
+	int ret = local->ops->set_key(&local->hw, cmd, vif, sta, key);
+	trace_drv_set_key(local, cmd, vif, sta, key, ret);
+	return ret;
 }
 
 static inline void drv_update_tkip_key(struct ieee80211_local *local,
@@ -79,32 +95,41 @@ static inline void drv_update_tkip_key(s
 	if (local->ops->update_tkip_key)
 		local->ops->update_tkip_key(&local->hw, conf, address,
 					    iv32, phase1key);
+	trace_drv_update_tkip_key(local, conf, address, iv32);
 }
 
 static inline int drv_hw_scan(struct ieee80211_local *local,
 			      struct cfg80211_scan_request *req)
 {
-	return local->ops->hw_scan(&local->hw, req);
+	int ret = local->ops->hw_scan(&local->hw, req);
+	trace_drv_hw_scan(local, req, ret);
+	return ret;
 }
 
 static inline void drv_sw_scan_start(struct ieee80211_local *local)
 {
 	if (local->ops->sw_scan_start)
 		local->ops->sw_scan_start(&local->hw);
+	trace_drv_sw_scan_start(local);
 }
 
 static inline void drv_sw_scan_complete(struct ieee80211_local *local)
 {
 	if (local->ops->sw_scan_complete)
 		local->ops->sw_scan_complete(&local->hw);
+	trace_drv_sw_scan_complete(local);
 }
 
 static inline int drv_get_stats(struct ieee80211_local *local,
 				struct ieee80211_low_level_stats *stats)
 {
-	if (!local->ops->get_stats)
-		return -EOPNOTSUPP;
-	return local->ops->get_stats(&local->hw, stats);
+	int ret = -EOPNOTSUPP;
+
+	if (local->ops->get_stats)
+		ret = local->ops->get_stats(&local->hw, stats);
+	trace_drv_get_stats(local, stats, ret);
+
+	return ret;
 }
 
 static inline void drv_get_tkip_seq(struct ieee80211_local *local,
@@ -112,14 +137,17 @@ static inline void drv_get_tkip_seq(stru
 {
 	if (local->ops->get_tkip_seq)
 		local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16);
+	trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16);
 }
 
 static inline int drv_set_rts_threshold(struct ieee80211_local *local,
 					u32 value)
 {
+	int ret = 0;
 	if (local->ops->set_rts_threshold)
-		return local->ops->set_rts_threshold(&local->hw, value);
-	return 0;
+		ret = local->ops->set_rts_threshold(&local->hw, value);
+	trace_drv_set_rts_threshold(local, value, ret);
+	return ret;
 }
 
 static inline void drv_sta_notify(struct ieee80211_local *local,
@@ -129,46 +157,57 @@ static inline void drv_sta_notify(struct
 {
 	if (local->ops->sta_notify)
 		local->ops->sta_notify(&local->hw, vif, cmd, sta);
+	trace_drv_sta_notify(local, vif, cmd, sta);
 }
 
 static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
 			      const struct ieee80211_tx_queue_params *params)
 {
+	int ret = -EOPNOTSUPP;
 	if (local->ops->conf_tx)
-		return local->ops->conf_tx(&local->hw, queue, params);
-	return -EOPNOTSUPP;
+		ret = local->ops->conf_tx(&local->hw, queue, params);
+	trace_drv_conf_tx(local, queue, params, ret);
+	return ret;
 }
 
 static inline int drv_get_tx_stats(struct ieee80211_local *local,
 				   struct ieee80211_tx_queue_stats *stats)
 {
-	return local->ops->get_tx_stats(&local->hw, stats);
+	int ret = local->ops->get_tx_stats(&local->hw, stats);
+	trace_drv_get_tx_stats(local, stats, ret);
+	return ret;
 }
 
 static inline u64 drv_get_tsf(struct ieee80211_local *local)
 {
+	u64 ret = -1ULL;
 	if (local->ops->get_tsf)
-		return local->ops->get_tsf(&local->hw);
-	return -1ULL;
+		ret = local->ops->get_tsf(&local->hw);
+	trace_drv_get_tsf(local, ret);
+	return ret;
 }
 
 static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf)
 {
 	if (local->ops->set_tsf)
 		local->ops->set_tsf(&local->hw, tsf);
+	trace_drv_set_tsf(local, tsf);
 }
 
 static inline void drv_reset_tsf(struct ieee80211_local *local)
 {
 	if (local->ops->reset_tsf)
 		local->ops->reset_tsf(&local->hw);
+	trace_drv_reset_tsf(local);
 }
 
 static inline int drv_tx_last_beacon(struct ieee80211_local *local)
 {
+	int ret = 1;
 	if (local->ops->tx_last_beacon)
-		return local->ops->tx_last_beacon(&local->hw);
-	return 1;
+		ret = local->ops->tx_last_beacon(&local->hw);
+	trace_drv_tx_last_beacon(local, ret);
+	return ret;
 }
 
 static inline int drv_ampdu_action(struct ieee80211_local *local,
@@ -176,10 +215,12 @@ static inline int drv_ampdu_action(struc
 				   struct ieee80211_sta *sta, u16 tid,
 				   u16 *ssn)
 {
+	int ret = -EOPNOTSUPP;
 	if (local->ops->ampdu_action)
-		return local->ops->ampdu_action(&local->hw, action,
-						sta, tid, ssn);
-	return -EOPNOTSUPP;
+		ret = local->ops->ampdu_action(&local->hw, action,
+					       sta, tid, ssn);
+	trace_drv_ampdu_action(local, action, sta, tid, ssn, ret);
+	return ret;
 }
 
 
--- wireless-testing.orig/net/mac80211/Kconfig	2009-07-07 13:36:10.000000000 +0200
+++ wireless-testing/net/mac80211/Kconfig	2009-07-07 13:36:18.000000000 +0200
@@ -205,3 +205,13 @@ config MAC80211_DEBUG_COUNTERS
 	  and show them in debugfs.
 
 	  If unsure, say N.
+
+config MAC80211_DRIVER_API_TRACER
+	bool "Driver API tracer"
+	depends on MAC80211_DEBUG_MENU
+	depends on EVENT_TRACING
+	help
+	  Say Y here to print out verbose driver API messages, for all
+	  driver method calls. This generates a lot of output!
+
+	  If unsure, say N.
--- wireless-testing.orig/net/mac80211/Makefile	2009-07-07 13:36:10.000000000 +0200
+++ wireless-testing/net/mac80211/Makefile	2009-07-07 13:36:18.000000000 +0200
@@ -41,6 +41,9 @@ mac80211-$(CONFIG_MAC80211_MESH) += \
 
 mac80211-$(CONFIG_PM) += pm.o
 
+mac80211-$(CONFIG_MAC80211_DRIVER_API_TRACER) += driver-trace.o
+CFLAGS_driver-trace.o := -I$(src)
+
 # objects for PID algorithm
 rc80211_pid-y := rc80211_pid_algo.o
 rc80211_pid-$(CONFIG_MAC80211_DEBUGFS) += rc80211_pid_debugfs.o
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ wireless-testing/net/mac80211/driver-trace.h	2009-07-07 13:36:18.000000000 +0200
@@ -0,0 +1,648 @@
+#if !defined(__MAC80211_DRIVER_TRACE) || defined(TRACE_HEADER_MULTI_READ)
+#define __MAC80211_DRIVER_TRACE
+
+#include <linux/tracepoint.h>
+#include <net/mac80211.h>
+#include "ieee80211_i.h"
+
+#ifndef CONFIG_MAC80211_DRIVER_API_TRACER
+#undef TRACE_EVENT
+#define TRACE_EVENT(name, proto, ...) \
+static inline void trace_ ## name(proto) {}
+#endif
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM mac80211
+
+#define MAXNAME		32
+#define LOCAL_ENTRY	__array(char, wiphy_name, 32)
+#define LOCAL_ASSIGN	strlcpy(__entry->wiphy_name, wiphy_name(local->hw.wiphy), MAXNAME)
+#define LOCAL_PR_FMT	"%s"
+#define LOCAL_PR_ARG	__entry->wiphy_name
+
+#define STA_ENTRY	__array(char, sta_addr, ETH_ALEN)
+#define STA_ASSIGN	(sta ? memcpy(__entry->sta_addr, sta->addr, ETH_ALEN) : memset(__entry->sta_addr, 0, ETH_ALEN))
+#define STA_PR_FMT	" sta:%pM"
+#define STA_PR_ARG	__entry->sta_addr
+
+#define VIF_ENTRY	__field(enum nl80211_iftype, vif_type) __field(void *, vif)
+#define VIF_ASSIGN	__entry->vif_type = vif ? vif->type : 0; __entry->vif = vif
+#define VIF_PR_FMT	" vif:%p(%d)"
+#define VIF_PR_ARG	__entry->vif, __entry->vif_type
+
+TRACE_EVENT(drv_start,
+	TP_PROTO(struct ieee80211_local *local, int ret),
+
+	TP_ARGS(local, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_stop,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_add_interface,
+	TP_PROTO(struct ieee80211_local *local,
+		 const u8 *addr,
+		 struct ieee80211_vif *vif,
+		 int ret),
+
+	TP_ARGS(local, addr, vif, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		__array(char, addr, 6)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		memcpy(__entry->addr, addr, 6);
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT " addr:%pM ret:%d",
+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->addr, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_remove_interface,
+	TP_PROTO(struct ieee80211_local *local,
+		 const u8 *addr, struct ieee80211_vif *vif),
+
+	TP_ARGS(local, addr, vif),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		__array(char, addr, 6)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		memcpy(__entry->addr, addr, 6);
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT " addr:%pM",
+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->addr
+	)
+);
+
+TRACE_EVENT(drv_config,
+	TP_PROTO(struct ieee80211_local *local,
+		 u32 changed,
+		 int ret),
+
+	TP_ARGS(local, changed, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u32, changed)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->changed = changed;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ch:%#x ret:%d",
+		LOCAL_PR_ARG, __entry->changed, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_bss_info_changed,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_vif *vif,
+		 struct ieee80211_bss_conf *info,
+		 u32 changed),
+
+	TP_ARGS(local, vif, info, changed),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		__field(bool, assoc)
+		__field(u16, aid)
+		__field(bool, cts)
+		__field(bool, shortpre)
+		__field(bool, shortslot)
+		__field(u8, dtimper)
+		__field(u16, bcnint)
+		__field(u16, assoc_cap)
+		__field(u64, timestamp)
+		__field(u32, basic_rates)
+		__field(u32, changed)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		__entry->changed = changed;
+		__entry->aid = info->aid;
+		__entry->assoc = info->assoc;
+		__entry->shortpre = info->use_short_preamble;
+		__entry->cts = info->use_cts_prot;
+		__entry->shortslot = info->use_short_slot;
+		__entry->dtimper = info->dtim_period;
+		__entry->bcnint = info->beacon_int;
+		__entry->assoc_cap = info->assoc_capability;
+		__entry->timestamp = info->timestamp;
+		__entry->basic_rates = info->basic_rates;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT " changed:%#x",
+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->changed
+	)
+);
+
+TRACE_EVENT(drv_configure_filter,
+	TP_PROTO(struct ieee80211_local *local,
+		 unsigned int changed_flags,
+		 unsigned int *total_flags,
+		 int mc_count),
+
+	TP_ARGS(local, changed_flags, total_flags, mc_count),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(unsigned int, changed)
+		__field(unsigned int, total)
+		__field(int, mc)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->changed = changed_flags;
+		__entry->total = *total_flags;
+		__entry->mc = mc_count;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " changed:%#x total:%#x mc:%d",
+		LOCAL_PR_ARG, __entry->changed, __entry->total, __entry->mc
+	)
+);
+
+TRACE_EVENT(drv_set_tim,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_sta *sta, bool set, int ret),
+
+	TP_ARGS(local, sta, set, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		STA_ENTRY
+		__field(bool, set)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		STA_ASSIGN;
+		__entry->set = set;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT STA_PR_FMT " set:%d ret:%d",
+		LOCAL_PR_ARG, STA_PR_FMT, __entry->set, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_set_key,
+	TP_PROTO(struct ieee80211_local *local,
+		 enum set_key_cmd cmd, struct ieee80211_vif *vif,
+		 struct ieee80211_sta *sta,
+		 struct ieee80211_key_conf *key, int ret),
+
+	TP_ARGS(local, cmd, vif, sta, key, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		STA_ENTRY
+		__field(enum ieee80211_key_alg, alg)
+		__field(u8, hw_key_idx)
+		__field(u8, flags)
+		__field(s8, keyidx)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		STA_ASSIGN;
+		__entry->alg = key->alg;
+		__entry->flags = key->flags;
+		__entry->keyidx = key->keyidx;
+		__entry->hw_key_idx = key->hw_key_idx;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_update_tkip_key,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_key_conf *conf,
+		 const u8 *address, u32 iv32),
+
+	TP_ARGS(local, conf, address, iv32),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__array(u8, addr, 6)
+		__field(u32, iv32)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		memcpy(__entry->addr, address, 6);
+		__entry->iv32 = iv32;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " addr:%pM iv32:%#x",
+		LOCAL_PR_ARG, __entry->addr, __entry->iv32
+	)
+);
+
+TRACE_EVENT(drv_hw_scan,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct cfg80211_scan_request *req, int ret),
+
+	TP_ARGS(local, req, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_sw_scan_start,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_sw_scan_complete,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_get_stats,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_low_level_stats *stats,
+		 int ret),
+
+	TP_ARGS(local, stats, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+		__field(unsigned int, ackfail)
+		__field(unsigned int, rtsfail)
+		__field(unsigned int, fcserr)
+		__field(unsigned int, rtssucc)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+		__entry->ackfail = stats->dot11ACKFailureCount;
+		__entry->rtsfail = stats->dot11RTSFailureCount;
+		__entry->fcserr = stats->dot11FCSErrorCount;
+		__entry->rtssucc = stats->dot11RTSSuccessCount;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_get_tkip_seq,
+	TP_PROTO(struct ieee80211_local *local,
+		 u8 hw_key_idx, u32 *iv32, u16 *iv16),
+
+	TP_ARGS(local, hw_key_idx, iv32, iv16),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u8, hw_key_idx)
+		__field(u32, iv32)
+		__field(u16, iv16)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->hw_key_idx = hw_key_idx;
+		__entry->iv32 = *iv32;
+		__entry->iv16 = *iv16;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_set_rts_threshold,
+	TP_PROTO(struct ieee80211_local *local, u32 value, int ret),
+
+	TP_ARGS(local, value, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u32, value)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+		__entry->value = value;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " value:%d ret:%d",
+		LOCAL_PR_ARG, __entry->value, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_sta_notify,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_vif *vif,
+		 enum sta_notify_cmd cmd,
+		 struct ieee80211_sta *sta),
+
+	TP_ARGS(local, vif, cmd, sta),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		STA_ENTRY
+		__field(u32, cmd)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		STA_ASSIGN;
+		__entry->cmd = cmd;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " cmd:%d",
+		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->cmd
+	)
+);
+
+TRACE_EVENT(drv_conf_tx,
+	TP_PROTO(struct ieee80211_local *local, u16 queue,
+		 const struct ieee80211_tx_queue_params *params,
+		 int ret),
+
+	TP_ARGS(local, queue, params, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u16, queue)
+		__field(u16, txop)
+		__field(u16, cw_min)
+		__field(u16, cw_max)
+		__field(u8, aifs)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->queue = queue;
+		__entry->ret = ret;
+		__entry->txop = params->txop;
+		__entry->cw_max = params->cw_max;
+		__entry->cw_min = params->cw_min;
+		__entry->aifs = params->aifs;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " queue:%d ret:%d",
+		LOCAL_PR_ARG, __entry->queue, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_get_tx_stats,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_tx_queue_stats *stats,
+		 int ret),
+
+	TP_ARGS(local, stats, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_get_tsf,
+	TP_PROTO(struct ieee80211_local *local, u64 ret),
+
+	TP_ARGS(local, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u64, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%llu",
+		LOCAL_PR_ARG, (unsigned long long)__entry->ret
+	)
+);
+
+TRACE_EVENT(drv_set_tsf,
+	TP_PROTO(struct ieee80211_local *local, u64 tsf),
+
+	TP_ARGS(local, tsf),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(u64, tsf)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->tsf = tsf;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " tsf:%llu",
+		LOCAL_PR_ARG, (unsigned long long)__entry->tsf
+	)
+);
+
+TRACE_EVENT(drv_reset_tsf,
+	TP_PROTO(struct ieee80211_local *local),
+
+	TP_ARGS(local),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT, LOCAL_PR_ARG
+	)
+);
+
+TRACE_EVENT(drv_tx_last_beacon,
+	TP_PROTO(struct ieee80211_local *local, int ret),
+
+	TP_ARGS(local, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		__entry->ret = ret;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT " ret:%d",
+		LOCAL_PR_ARG, __entry->ret
+	)
+);
+
+TRACE_EVENT(drv_ampdu_action,
+	TP_PROTO(struct ieee80211_local *local,
+		 enum ieee80211_ampdu_mlme_action action,
+		 struct ieee80211_sta *sta, u16 tid,
+		 u16 *ssn, int ret),
+
+	TP_ARGS(local, action, sta, tid, ssn, ret),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+        	STA_ENTRY
+        	__field(u32, action)
+        	__field(u16, tid)
+        	__field(u16, ssn)
+        	__field(int, ret)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		STA_ASSIGN;
+		__entry->ret = ret;
+		__entry->action = action;
+		__entry->tid = tid;
+		__entry->ssn = *ssn;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  STA_PR_FMT " action:%d tid:%d ret:%d",
+		LOCAL_PR_ARG, STA_PR_ARG, __entry->action, __entry->tid, __entry->ret
+	)
+);
+#endif /* __MAC80211_DRIVER_TRACE */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE driver-trace
+#include <trace/define_trace.h>
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ wireless-testing/net/mac80211/driver-trace.c	2009-07-07 13:36:18.000000000 +0200
@@ -0,0 +1,6 @@
+/* bug in tracepoint.h, it should include this */
+#include <linux/module.h>
+
+#include "driver-ops.h"
+#define CREATE_TRACE_POINTS
+#include "driver-trace.h"



^ permalink raw reply

* Re: 2.6.31-rc2: Reported regressions from 2.6.30
From: Rafael J. Wysocki @ 2009-07-07 11:36 UTC (permalink / raw)
  To: Andres Freund
  Cc: Linux Kernel Mailing List, Adrian Bunk, Andrew Morton,
	Linus Torvalds, Natalie Protasevich, Kernel Testers List,
	Network Development, Linux ACPI, Linux PM List, Linux SCSI List,
	Linux Wireless List, DRI
In-Reply-To: <200907070325.51439.andres@anarazel.de>

On Tuesday 07 July 2009, Andres Freund wrote:
> Hi Rafael,
> 
> On Tuesday 07 July 2009 01:42:09 Rafael J. Wysocki wrote:
> > If you know of any other unresolved regressions from 2.6.30, please let me
> > know either and I'll add them to the list.  Also, please let me know if any
> > of the entries below are invalid.
> There is also http://lkml.org/lkml/2009/6/30/398 : Soft-Lockup/Race in 
> networking in 2.6.31-rc1+195 (possibly caused by netem)

Thanks, added to the list.

Best,
Rafael

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox