2016-05-04 18:14:40

by Grumbach, Emmanuel

[permalink] [raw]
Subject: pull request: iwlwifi 2016-05-04

SGkgS2FsbGUsDQoNCkkga25vdyBpdCBpcyBleHRyZW1lbHkgbGF0ZSBpbiB0aGUgY3ljbGUsIGJ1
dCB0aGlzIHBhdGNoIGlzIGludGVuZGVkDQpmb3IgNC42Li4uIEl0IGZpeGVzIGEgcmVncmVzc2lv
biBJIGludHJvZHVjZWQ6IGEgUDJQIHNwZWNpZmljYXRpb24NCnZpb2xhdGlvbiBhcyBtZW50aW9u
ZWQgaW4gdGhlIGNvbW1pdCBtZXNzYWdlLg0KVGhlIHBhdGNoIGlzIHJhdGhlciBiaWcgaW4gdGVy
bXMgb2YgbnVtYmVyIG9mIGxpbmVzIGNoYW5nZWQsIGJ1dCB0aGUNCnNlbWFudGljcyBpcyB2ZXJ5
IHNpbXBsZS4gSSBoYXZlIHRvIGNvcHkgdGhlIGNvbnRyb2wgYmxvY2sgb2YgdGhlIHNrYg0KdG8g
dGhlIHN0YWNrIHdoZXJlYXMgd2UgYWNjZXNzZWQgd2UgdXNlZCB0byBhY2Nlc3MgaXQgZGlyZWN0
bHkgdGhyb3VnaA0KYSBwb2ludGVyLg0KVGhpcyBvYnZpb3VzbHkgaW50cm9kdWNlcyBhIGxvdCBv
ZiBsaW5lIGNoYW5nZXMsIGJ1dCBkb24ndCByZWFsbHkNCmNoYW5nZSB0aGUgYmVoYXZpb3Igb2Yg
dGhlIGNvZGUgKHNpbmNlIG1vc3Qgb2YgdGhlIGFjY2Vzc2VzIGFyZSByZWFkDQpvbmx5KS4NCg0K
TGV0IG1lIGtub3cgaG93IGl0IGdvZXMuDQoNCkkgdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGlu
Zm9ybSB5b3UgdGhhdCBJIHdpbGwgYmUgcmVwbGFjZWQgYnkgTHVjYQ0KZm9yIGEgZmV3IG1vbnRo
cyBhdCBsZWFzdC4gSSB3aWxsIGJlIHdvcmtpbmcgZnVsbCBzdGVhbSBvbiBhIHNpZGUNCnByb2pl
Y3QgdGhhdCB3aWxsIG5vdCBhbGxvdyBtZSB0byBkbyB0aGUgbWFpbnRhaW5lciBqb2IgaW4gcGFy
YWxsZWwuDQoNClRoYW5rIHlvdSENCg0KVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHNpbmNlIGNvbW1p
dCBmNzQyYWFmMzZlZGYwMzkwYzU0ZDA2MTRiYzRkMjBmZDRjZDM3NjJhOg0KDQogIGl3bHdpZmk6
IG12bTogZml4IGFjY2Vzc2luZyBOdWxsIHBvaW50ZXIgZHVyaW5nIGZ3IGR1bXAgY29sbGVjdGlv
biAoMjAxNi0wNC0xMiAxMTo1MjozOSArMDMwMCkNCg0KYXJlIGF2YWlsYWJsZSBpbiB0aGUgZ2l0
IHJlcG9zaXRvcnkgYXQ6DQoNCiAgaHR0cHM6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4
L2tlcm5lbC9naXQvaXdsd2lmaS9pd2x3aWZpLWZpeGVzLmdpdCB0YWdzL2l3bHdpZmktZm9yLWth
bGxlLTIwMTYtMDUtMDQNCg0KZm9yIHlvdSB0byBmZXRjaCBjaGFuZ2VzIHVwIHRvIDVjMDhiMGY1
MDI2ZmNjMTNlZmI5NDdjNGQxZjJjYTM1NTgxNDVmNjg6DQoNCiAgaXdsd2lmaTogbXZtOiBkb24n
dCBvdmVycmlkZSB0aGUgcmF0ZSB3aXRoIHRoZSBBTVNEVSBsZW4gKDIwMTYtMDUtMDQgMjA6NTk6
NTUgKzAzMDApDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0NCiogZml4IFAyUCByYXRlcyAoYW5kIHBvc3NpYmx5IG90aGVy
IGlzc3VlcykNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQ0KRW1tYW51ZWwgR3J1bWJhY2ggKDEpOg0KICAgICAgaXdsd2lm
aTogbXZtOiBkb24ndCBvdmVycmlkZSB0aGUgcmF0ZSB3aXRoIHRoZSBBTVNEVSBsZW4NCg0KIGRy
aXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R4LmMgfCA4MyArKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQ0KIDEgZmlsZSBjaGFuZ2VkLCA0OCBpbnNlcnRpb25zKCspLCAzNSBk
ZWxldGlvbnMoLSk=


2016-05-04 18:15:32

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH] iwlwifi: mvm: don't override the rate with the AMSDU len

The TSO code creates A-MSDUs from a single large send. Each
A-MSDU is an skb and skb->len doesn't include the number of
bytes which need to be added for the headers being added
(subframe header, TCP header, IP header, SNAP, padding).

To be able to set the right value in the Tx command, we
put the number of bytes added by those headers in
driver_data in iwl_mvm_tx_tso and use this value in
iwl_mvm_set_tx_cmd.

The problem by setting this value in driver_data is that
it overrides the ieee80211_tx_info. The bug manifested
itself when we send P2P related frames in CCK since the
rate in ieee80211_tx_info is zero-ed. This of course is
a violation of the P2P specification.

To fix this, copy the original ieee80211_tx_info to the
stack and pass it to the functions which need it.
Assign the number of bytes added by the headers to the
driver_data inside the skb itself.

Fixes: a6d5e32f247c ("iwlwifi: mvm: send large SKBs to the transport")
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 83 +++++++++++++++++------------
1 file changed, 48 insertions(+), 35 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index 75870e6..34731e2 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -105,6 +105,7 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
struct iwl_tx_cmd *tx_cmd,
struct ieee80211_tx_info *info, u8 sta_id)
{
+ struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (void *)skb->data;
__le16 fc = hdr->frame_control;
u32 tx_flags = le32_to_cpu(tx_cmd->tx_flags);
@@ -185,7 +186,7 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
tx_cmd->tx_flags = cpu_to_le32(tx_flags);
/* Total # bytes to be transmitted */
tx_cmd->len = cpu_to_le16((u16)skb->len +
- (uintptr_t)info->driver_data[0]);
+ (uintptr_t)skb_info->driver_data[0]);
tx_cmd->next_frame_len = 0;
tx_cmd->life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE);
tx_cmd->sta_id = sta_id;
@@ -327,10 +328,11 @@ static void iwl_mvm_set_tx_cmd_crypto(struct iwl_mvm *mvm,
*/
static struct iwl_device_cmd *
iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
- int hdrlen, struct ieee80211_sta *sta, u8 sta_id)
+ struct ieee80211_tx_info *info, int hdrlen,
+ struct ieee80211_sta *sta, u8 sta_id)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
struct iwl_device_cmd *dev_cmd;
struct iwl_tx_cmd *tx_cmd;

@@ -350,10 +352,10 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,

iwl_mvm_set_tx_cmd_rate(mvm, tx_cmd, info, sta, hdr->frame_control);

- memset(&info->status, 0, sizeof(info->status));
- memset(info->driver_data, 0, sizeof(info->driver_data));
+ memset(&skb_info->status, 0, sizeof(skb_info->status));
+ memset(skb_info->driver_data, 0, sizeof(skb_info->driver_data));

- info->driver_data[1] = dev_cmd;
+ skb_info->driver_data[1] = dev_cmd;

return dev_cmd;
}
@@ -361,22 +363,25 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
+ struct ieee80211_tx_info info;
struct iwl_device_cmd *dev_cmd;
struct iwl_tx_cmd *tx_cmd;
u8 sta_id;
int hdrlen = ieee80211_hdrlen(hdr->frame_control);

- if (WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_AMPDU))
+ memcpy(&info, skb->cb, sizeof(info));
+
+ if (WARN_ON_ONCE(info.flags & IEEE80211_TX_CTL_AMPDU))
return -1;

- if (WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM &&
- (!info->control.vif ||
- info->hw_queue != info->control.vif->cab_queue)))
+ if (WARN_ON_ONCE(info.flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM &&
+ (!info.control.vif ||
+ info.hw_queue != info.control.vif->cab_queue)))
return -1;

/* This holds the amsdu headers length */
- info->driver_data[0] = (void *)(uintptr_t)0;
+ skb_info->driver_data[0] = (void *)(uintptr_t)0;

/*
* IWL_MVM_OFFCHANNEL_QUEUE is used for ROC packets that can be used
@@ -385,7 +390,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
* and hence needs to be sent on the aux queue
*/
if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
- info->control.vif->type == NL80211_IFTYPE_STATION)
+ info.control.vif->type == NL80211_IFTYPE_STATION)
IEEE80211_SKB_CB(skb)->hw_queue = mvm->aux_queue;

/*
@@ -398,14 +403,14 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
* AUX station.
*/
sta_id = mvm->aux_sta.sta_id;
- if (info->control.vif) {
+ if (info.control.vif) {
struct iwl_mvm_vif *mvmvif =
- iwl_mvm_vif_from_mac80211(info->control.vif);
+ iwl_mvm_vif_from_mac80211(info.control.vif);

- if (info->control.vif->type == NL80211_IFTYPE_P2P_DEVICE ||
- info->control.vif->type == NL80211_IFTYPE_AP)
+ if (info.control.vif->type == NL80211_IFTYPE_P2P_DEVICE ||
+ info.control.vif->type == NL80211_IFTYPE_AP)
sta_id = mvmvif->bcast_sta.sta_id;
- else if (info->control.vif->type == NL80211_IFTYPE_STATION &&
+ else if (info.control.vif->type == NL80211_IFTYPE_STATION &&
is_multicast_ether_addr(hdr->addr1)) {
u8 ap_sta_id = ACCESS_ONCE(mvmvif->ap_sta_id);

@@ -414,19 +419,18 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
}
}

- IWL_DEBUG_TX(mvm, "station Id %d, queue=%d\n", sta_id, info->hw_queue);
+ IWL_DEBUG_TX(mvm, "station Id %d, queue=%d\n", sta_id, info.hw_queue);

- dev_cmd = iwl_mvm_set_tx_params(mvm, skb, hdrlen, NULL, sta_id);
+ dev_cmd = iwl_mvm_set_tx_params(mvm, skb, &info, hdrlen, NULL, sta_id);
if (!dev_cmd)
return -1;

- /* From now on, we cannot access info->control */
tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;

/* Copy MAC header from skb into command buffer */
memcpy(tx_cmd->hdr, hdr, hdrlen);

- if (iwl_trans_tx(mvm->trans, skb, dev_cmd, info->hw_queue)) {
+ if (iwl_trans_tx(mvm->trans, skb, dev_cmd, info.hw_queue)) {
iwl_trans_free_tx_cmd(mvm->trans, dev_cmd);
return -1;
}
@@ -445,11 +449,11 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)

#ifdef CONFIG_INET
static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
+ struct ieee80211_tx_info *info,
struct ieee80211_sta *sta,
struct sk_buff_head *mpdus_skb)
{
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (void *)skb->data;
unsigned int mss = skb_shinfo(skb)->gso_size;
struct sk_buff *tmp, *next;
@@ -544,6 +548,8 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,

/* This skb fits in one single A-MSDU */
if (num_subframes * mss >= tcp_payload_len) {
+ struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
+
/*
* Compute the length of all the data added for the A-MSDU.
* This will be used to compute the length to write in the TX
@@ -552,11 +558,10 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
* already had one set of SNAP / IP / TCP headers.
*/
num_subframes = DIV_ROUND_UP(tcp_payload_len, mss);
- info = IEEE80211_SKB_CB(skb);
amsdu_add = num_subframes * sizeof(struct ethhdr) +
(num_subframes - 1) * (snap_ip_tcp + pad);
/* This holds the amsdu headers length */
- info->driver_data[0] = (void *)(uintptr_t)amsdu_add;
+ skb_info->driver_data[0] = (void *)(uintptr_t)amsdu_add;

__skb_queue_tail(mpdus_skb, skb);
return 0;
@@ -596,11 +601,14 @@ segment:
ip_hdr(tmp)->id = htons(ip_base_id + i * num_subframes);

if (tcp_payload_len > mss) {
+ struct ieee80211_tx_info *skb_info =
+ IEEE80211_SKB_CB(tmp);
+
num_subframes = DIV_ROUND_UP(tcp_payload_len, mss);
- info = IEEE80211_SKB_CB(tmp);
amsdu_add = num_subframes * sizeof(struct ethhdr) +
(num_subframes - 1) * (snap_ip_tcp + pad);
- info->driver_data[0] = (void *)(uintptr_t)amsdu_add;
+ skb_info->driver_data[0] =
+ (void *)(uintptr_t)amsdu_add;
skb_shinfo(tmp)->gso_size = mss;
} else {
qc = ieee80211_get_qos_ctl((void *)tmp->data);
@@ -622,6 +630,7 @@ segment:
}
#else /* CONFIG_INET */
static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
+ struct ieee80211_tx_info *info,
struct ieee80211_sta *sta,
struct sk_buff_head *mpdus_skb)
{
@@ -636,10 +645,10 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
* Sets the fields in the Tx cmd that are crypto related
*/
static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
+ struct ieee80211_tx_info *info,
struct ieee80211_sta *sta)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct iwl_mvm_sta *mvmsta;
struct iwl_device_cmd *dev_cmd;
struct iwl_tx_cmd *tx_cmd;
@@ -660,7 +669,8 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
return -1;

- dev_cmd = iwl_mvm_set_tx_params(mvm, skb, hdrlen, sta, mvmsta->sta_id);
+ dev_cmd = iwl_mvm_set_tx_params(mvm, skb, info, hdrlen,
+ sta, mvmsta->sta_id);
if (!dev_cmd)
goto drop;

@@ -736,7 +746,8 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
struct ieee80211_sta *sta)
{
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
+ struct ieee80211_tx_info info;
struct sk_buff_head mpdus_skbs;
unsigned int payload_len;
int ret;
@@ -747,21 +758,23 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
return -1;

+ memcpy(&info, skb->cb, sizeof(info));
+
/* This holds the amsdu headers length */
- info->driver_data[0] = (void *)(uintptr_t)0;
+ skb_info->driver_data[0] = (void *)(uintptr_t)0;

if (!skb_is_gso(skb))
- return iwl_mvm_tx_mpdu(mvm, skb, sta);
+ return iwl_mvm_tx_mpdu(mvm, skb, &info, sta);

payload_len = skb_tail_pointer(skb) - skb_transport_header(skb) -
tcp_hdrlen(skb) + skb->data_len;

if (payload_len <= skb_shinfo(skb)->gso_size)
- return iwl_mvm_tx_mpdu(mvm, skb, sta);
+ return iwl_mvm_tx_mpdu(mvm, skb, &info, sta);

__skb_queue_head_init(&mpdus_skbs);

- ret = iwl_mvm_tx_tso(mvm, skb, sta, &mpdus_skbs);
+ ret = iwl_mvm_tx_tso(mvm, skb, &info, sta, &mpdus_skbs);
if (ret)
return ret;

@@ -771,7 +784,7 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
while (!skb_queue_empty(&mpdus_skbs)) {
skb = __skb_dequeue(&mpdus_skbs);

- ret = iwl_mvm_tx_mpdu(mvm, skb, sta);
+ ret = iwl_mvm_tx_mpdu(mvm, skb, &info, sta);
if (ret) {
__skb_queue_purge(&mpdus_skbs);
return ret;
--
2.5.0


2016-05-07 19:39:30

by Luciano Coelho

[permalink] [raw]
Subject: Re: pull request: iwlwifi 2016-05-04

T24gRnJpLCAyMDE2LTA1LTA2IGF0IDE0OjM0ICswMzAwLCBLYWxsZSBWYWxvIHdyb3RlOg0KPiAi
R3J1bWJhY2gsIEVtbWFudWVsIiA8ZW1tYW51ZWwuZ3J1bWJhY2hAaW50ZWwuY29tPiB3cml0ZXM6
DQo+IA0KPiA+IA0KPiA+IEkga25vdyBpdCBpcyBleHRyZW1lbHkgbGF0ZSBpbiB0aGUgY3ljbGUs
IGJ1dCB0aGlzIHBhdGNoIGlzDQo+ID4gaW50ZW5kZWQNCj4gPiBmb3IgNC42Li4uIEl0IGZpeGVz
IGEgcmVncmVzc2lvbiBJIGludHJvZHVjZWQ6IGEgUDJQIHNwZWNpZmljYXRpb24NCj4gPiB2aW9s
YXRpb24gYXMgbWVudGlvbmVkIGluIHRoZSBjb21taXQgbWVzc2FnZS4NCj4gPiBUaGUgcGF0Y2gg
aXMgcmF0aGVyIGJpZyBpbiB0ZXJtcyBvZiBudW1iZXIgb2YgbGluZXMgY2hhbmdlZCwgYnV0DQo+
ID4gdGhlDQo+ID4gc2VtYW50aWNzIGlzIHZlcnkgc2ltcGxlLiBJIGhhdmUgdG8gY29weSB0aGUg
Y29udHJvbCBibG9jayBvZiB0aGUNCj4gPiBza2INCj4gPiB0byB0aGUgc3RhY2sgd2hlcmVhcyB3
ZSBhY2Nlc3NlZCB3ZSB1c2VkIHRvIGFjY2VzcyBpdCBkaXJlY3RseQ0KPiA+IHRocm91Z2gNCj4g
PiBhIHBvaW50ZXIuDQo+ID4gVGhpcyBvYnZpb3VzbHkgaW50cm9kdWNlcyBhIGxvdCBvZiBsaW5l
IGNoYW5nZXMsIGJ1dCBkb24ndCByZWFsbHkNCj4gPiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRo
ZSBjb2RlIChzaW5jZSBtb3N0IG9mIHRoZSBhY2Nlc3NlcyBhcmUNCj4gPiByZWFkDQo+ID4gb25s
eSkuDQo+ID4gDQo+ID4gTGV0IG1lIGtub3cgaG93IGl0IGdvZXMuDQo+IFsuLi5dDQo+IA0KPiA+
IA0KPiA+IFRoZSBmb2xsb3dpbmcgY2hhbmdlcyBzaW5jZSBjb21taXQNCj4gPiBmNzQyYWFmMzZl
ZGYwMzkwYzU0ZDA2MTRiYzRkMjBmZDRjZDM3NjJhOg0KPiA+IA0KPiA+IMKgIGl3bHdpZmk6IG12
bTogZml4IGFjY2Vzc2luZyBOdWxsIHBvaW50ZXIgZHVyaW5nIGZ3IGR1bXANCj4gPiBjb2xsZWN0
aW9uICgyMDE2LTA0LTEyIDExOjUyOjM5ICswMzAwKQ0KPiA+IA0KPiA+IGFyZSBhdmFpbGFibGUg
aW4gdGhlIGdpdCByZXBvc2l0b3J5IGF0Og0KPiA+IA0KPiA+IMKgIGh0dHBzOi8vZ2l0Lmtlcm5l
bC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2l3bHdpZmkvaXdsd2lmaS1mDQo+ID4gaXhl
cy5naXQgdGFncy9pd2x3aWZpLWZvci1rYWxsZS0yMDE2LTA1LTA0DQo+IFB1bGxlZCwgdGhhbmtz
LiBMZXQncyBzZWUgaWYgdGhpcyBtYWtlcyBpdCB0byA0LjYuDQo+IA0KPiA+IA0KPiA+IEkgdGFr
ZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGluZm9ybSB5b3UgdGhhdCBJIHdpbGwgYmUgcmVwbGFjZWQg
YnkNCj4gPiBMdWNhDQo+ID4gZm9yIGEgZmV3IG1vbnRocyBhdCBsZWFzdC4gSSB3aWxsIGJlIHdv
cmtpbmcgZnVsbCBzdGVhbSBvbiBhIHNpZGUNCj4gPiBwcm9qZWN0IHRoYXQgd2lsbCBub3QgYWxs
b3cgbWUgdG8gZG8gdGhlIG1haW50YWluZXIgam9iIGluDQo+ID4gcGFyYWxsZWwuDQo+IE9rLCBo
YXZlIGZ1biBpbiB5b3VyIG5ldyBwcm9qZWN0Lg0KPiANCj4gTHVjYSwgYXMgd2UgX2ZpbmFsbHlf
IGdvdCBzdW4gaGVyZSBpbiBGaW5sYW5kIHdlIGhhdmUgdG8gaGF2ZSBhICJraWNrDQo+IG9mZiBt
ZWV0aW5nIGFib3V0IHRoZSBuZXcgb3JnYW5pc2F0aW9uIHN0cnVjdHVyZSIgYnkgeW91ciBncmls
bCA7KQ0KDQpTb3VuZHMgZ29vZCEgV2hlbiBhcmUgeW91IGdvaW5nIHRvIGJlIGNvbWluZyB0byAi
VGhlIFNvdXRoIj8gOikNCg0KLS0NCkx1Y2Eu

2016-05-06 11:34:52

by Kalle Valo

[permalink] [raw]
Subject: Re: pull request: iwlwifi 2016-05-04

"Grumbach, Emmanuel" <[email protected]> writes:

> I know it is extremely late in the cycle, but this patch is intended
> for 4.6... It fixes a regression I introduced: a P2P specification
> violation as mentioned in the commit message.
> The patch is rather big in terms of number of lines changed, but the
> semantics is very simple. I have to copy the control block of the skb
> to the stack whereas we accessed we used to access it directly through
> a pointer.
> This obviously introduces a lot of line changes, but don't really
> change the behavior of the code (since most of the accesses are read
> only).
>
> Let me know how it goes.

[...]

> The following changes since commit f742aaf36edf0390c54d0614bc4d20fd4cd3762a:
>
> iwlwifi: mvm: fix accessing Null pointer during fw dump collection (2016-04-12 11:52:39 +0300)
>
> are available in the git repository at:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git tags/iwlwifi-for-kalle-2016-05-04

Pulled, thanks. Let's see if this makes it to 4.6.

> I take this opportunity to inform you that I will be replaced by Luca
> for a few months at least. I will be working full steam on a side
> project that will not allow me to do the maintainer job in parallel.

Ok, have fun in your new project.

Luca, as we _finally_ got sun here in Finland we have to have a "kick
off meeting about the new organisation structure" by your grill ;)

--
Kalle Valo