* Re: [PATCH V3.10] rtlwifi: rtl8192cu: Fix problem in connecting to WEP or WPA(1) networks
From: Greg KH @ 2013-05-30 22:13 UTC (permalink / raw)
To: Larry Finger; +Cc: linville, linux-wireless, netdev, Stable
In-Reply-To: <1369949040-9513-1-git-send-email-Larry.Finger@lwfinger.net>
On Thu, May 30, 2013 at 04:23:30PM -0500, Larry Finger wrote:
> Driver rtl8192cu can connect to WPA2 networks, but fails for any other
> encryption method. The cause is a failure to set the rate control data
> blocks. These changes fix https://bugzilla.redhat.com/show_bug.cgi?id=952793
> and https://bugzilla.redhat.com/show_bug.cgi?id=761525.
>
> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
> ---
>
> John,
>
> This patch is pretty large for this stage; however, it fixes a bad bug, and
> it will only affect rtl8192cu even though it touches rtlwifi.
>
> I held it for a while while Fedora and RHEL users tried it and responded.
> As you well know, that can take a while.
<formletter>
This is not the correct way to submit patches for inclusion in the
stable kernel tree. Please read Documentation/stable_kernel_rules.txt
for how to do this properly.
</formletter>
^ permalink raw reply
* pull request: bluetooth 2013-05-30
From: Gustavo Padovan @ 2013-05-30 22:52 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, linux-bluetooth, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1811 bytes --]
Hi John,
The following patches are important bug fixes for 3.10, plus the support for a
new device. We do have three fixes from Johan. The first one is a fix to avoid
LE-only devices to rely on the (inexistent) extended features data. The second
patch fixes length checks on incoming L2CAP signalling PDUs so we can discard
PDU whose size doesn't match the one reported in the header.
The last one fixes the handling of power on failures, we now report proper
errors to mgmt when hci_dev_open().
Please pull or let me know of any issues! Thanks.
Gustavo
---
The following changes since commit f942d116b80feb3ae618a0d8ce2df6e853526d3c:
brcmsmac: fix regression observed in 3.10-rc1 (2013-05-29 14:46:51 -0400)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth master
for you to fetch changes up to 0f9e216b0e12971af8a1d39c98c353c76533283b:
Bluetooth: Fix mgmt handling of power on failures (2013-05-30 18:36:08 -0300)
----------------------------------------------------------------
Bing Zhao (1):
Bluetooth: btmrvl: support Marvell Bluetooth device SD8897
Johan Hedberg (3):
Bluetooth: Fix checks for LE support on LE-only controllers
Bluetooth: Fix missing length checks for L2CAP signalling PDUs
Bluetooth: Fix mgmt handling of power on failures
drivers/bluetooth/Kconfig | 4 +--
drivers/bluetooth/btmrvl_sdio.c | 28 ++++++++++++++++++
include/net/bluetooth/hci_core.h | 1 +
include/net/bluetooth/mgmt.h | 1 +
net/bluetooth/hci_core.c | 6 +++-
net/bluetooth/l2cap_core.c | 70 ++++++++++++++++++++++++++++++++------------
net/bluetooth/mgmt.c | 23 ++++++++++++++-
net/bluetooth/smp.c | 4 +--
8 files changed, 113 insertions(+), 24 deletions(-)
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply
* [PATCH V3.10] rtlwifi: rtl8192cu: Fix problem in connecting to WEP or WPA(1) networks
From: Larry Finger @ 2013-05-30 21:23 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev, Stable
Driver rtl8192cu can connect to WPA2 networks, but fails for any other
encryption method. The cause is a failure to set the rate control data
blocks. These changes fix https://bugzilla.redhat.com/show_bug.cgi?id=952793
and https://bugzilla.redhat.com/show_bug.cgi?id=761525.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
John,
This patch is pretty large for this stage; however, it fixes a bad bug, and
it will only affect rtl8192cu even though it touches rtlwifi.
I held it for a while while Fedora and RHEL users tried it and responded.
As you well know, that can take a while.
Thanks,
Larry
---
drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 134 ++++++++++++++++++++-------
drivers/net/wireless/rtlwifi/rtl8192cu/hw.h | 4 -
drivers/net/wireless/rtlwifi/rtl8192cu/mac.c | 18 +++-
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 4 +-
drivers/net/wireless/rtlwifi/rtl8192cu/sw.h | 3 +
drivers/net/wireless/rtlwifi/usb.c | 13 +++
drivers/net/wireless/rtlwifi/wifi.h | 4 +
7 files changed, 139 insertions(+), 41 deletions(-)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
index 3d0498e..189ba12 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
@@ -1973,26 +1973,35 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
}
}
-void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
- struct ieee80211_sta *sta,
- u8 rssi_level)
+static void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
+ struct ieee80211_sta *sta)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_phy *rtlphy = &(rtlpriv->phy);
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
- u32 ratr_value = (u32) mac->basic_rates;
- u8 *mcsrate = mac->mcs;
+ struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+ u32 ratr_value;
u8 ratr_index = 0;
u8 nmode = mac->ht_enable;
- u8 mimo_ps = 1;
- u16 shortgi_rate = 0;
- u32 tmp_ratr_value = 0;
+ u8 mimo_ps = IEEE80211_SMPS_OFF;
+ u16 shortgi_rate;
+ u32 tmp_ratr_value;
u8 curtxbw_40mhz = mac->bw_40;
- u8 curshortgi_40mhz = mac->sgi_40;
- u8 curshortgi_20mhz = mac->sgi_20;
+ u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+ 1 : 0;
+ u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+ 1 : 0;
enum wireless_mode wirelessmode = mac->mode;
- ratr_value |= ((*(u16 *) (mcsrate))) << 12;
+ if (rtlhal->current_bandtype == BAND_ON_5G)
+ ratr_value = sta->supp_rates[1] << 4;
+ else
+ ratr_value = sta->supp_rates[0];
+ if (mac->opmode == NL80211_IFTYPE_ADHOC)
+ ratr_value = 0xfff;
+
+ ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
+ sta->ht_cap.mcs.rx_mask[0] << 12);
switch (wirelessmode) {
case WIRELESS_MODE_B:
if (ratr_value & 0x0000000c)
@@ -2006,7 +2015,7 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
case WIRELESS_MODE_N_24G:
case WIRELESS_MODE_N_5G:
nmode = 1;
- if (mimo_ps == 0) {
+ if (mimo_ps == IEEE80211_SMPS_STATIC) {
ratr_value &= 0x0007F005;
} else {
u32 ratr_mask;
@@ -2016,8 +2025,7 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
ratr_mask = 0x000ff005;
else
ratr_mask = 0x0f0ff005;
- if (curtxbw_40mhz)
- ratr_mask |= 0x00000010;
+
ratr_value &= ratr_mask;
}
break;
@@ -2026,41 +2034,74 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
ratr_value &= 0x000ff0ff;
else
ratr_value &= 0x0f0ff0ff;
+
break;
}
+
ratr_value &= 0x0FFFFFFF;
- if (nmode && ((curtxbw_40mhz && curshortgi_40mhz) ||
- (!curtxbw_40mhz && curshortgi_20mhz))) {
+
+ if (nmode && ((curtxbw_40mhz &&
+ curshortgi_40mhz) || (!curtxbw_40mhz &&
+ curshortgi_20mhz))) {
+
ratr_value |= 0x10000000;
tmp_ratr_value = (ratr_value >> 12);
+
for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
if ((1 << shortgi_rate) & tmp_ratr_value)
break;
}
+
shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
- (shortgi_rate << 4) | (shortgi_rate);
+ (shortgi_rate << 4) | (shortgi_rate);
}
+
rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
+
+ RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
+ rtl_read_dword(rtlpriv, REG_ARFR0));
}
-void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
+static void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw,
+ struct ieee80211_sta *sta,
+ u8 rssi_level)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_phy *rtlphy = &(rtlpriv->phy);
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
- u32 ratr_bitmap = (u32) mac->basic_rates;
- u8 *p_mcsrate = mac->mcs;
- u8 ratr_index = 0;
- u8 curtxbw_40mhz = mac->bw_40;
- u8 curshortgi_40mhz = mac->sgi_40;
- u8 curshortgi_20mhz = mac->sgi_20;
- enum wireless_mode wirelessmode = mac->mode;
+ struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+ struct rtl_sta_info *sta_entry = NULL;
+ u32 ratr_bitmap;
+ u8 ratr_index;
+ u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
+ u8 curshortgi_40mhz = curtxbw_40mhz &&
+ (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+ 1 : 0;
+ u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+ 1 : 0;
+ enum wireless_mode wirelessmode = 0;
bool shortgi = false;
u8 rate_mask[5];
u8 macid = 0;
- u8 mimops = 1;
-
- ratr_bitmap |= (p_mcsrate[1] << 20) | (p_mcsrate[0] << 12);
+ u8 mimo_ps = IEEE80211_SMPS_OFF;
+
+ sta_entry = (struct rtl_sta_info *) sta->drv_priv;
+ wirelessmode = sta_entry->wireless_mode;
+ if (mac->opmode == NL80211_IFTYPE_STATION ||
+ mac->opmode == NL80211_IFTYPE_MESH_POINT)
+ curtxbw_40mhz = mac->bw_40;
+ else if (mac->opmode == NL80211_IFTYPE_AP ||
+ mac->opmode == NL80211_IFTYPE_ADHOC)
+ macid = sta->aid + 1;
+
+ if (rtlhal->current_bandtype == BAND_ON_5G)
+ ratr_bitmap = sta->supp_rates[1] << 4;
+ else
+ ratr_bitmap = sta->supp_rates[0];
+ if (mac->opmode == NL80211_IFTYPE_ADHOC)
+ ratr_bitmap = 0xfff;
+ ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
+ sta->ht_cap.mcs.rx_mask[0] << 12);
switch (wirelessmode) {
case WIRELESS_MODE_B:
ratr_index = RATR_INX_WIRELESS_B;
@@ -2071,6 +2112,7 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
break;
case WIRELESS_MODE_G:
ratr_index = RATR_INX_WIRELESS_GB;
+
if (rssi_level == 1)
ratr_bitmap &= 0x00000f00;
else if (rssi_level == 2)
@@ -2085,7 +2127,8 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
case WIRELESS_MODE_N_24G:
case WIRELESS_MODE_N_5G:
ratr_index = RATR_INX_WIRELESS_NGB;
- if (mimops == 0) {
+
+ if (mimo_ps == IEEE80211_SMPS_STATIC) {
if (rssi_level == 1)
ratr_bitmap &= 0x00070000;
else if (rssi_level == 2)
@@ -2128,8 +2171,10 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
}
}
}
+
if ((curtxbw_40mhz && curshortgi_40mhz) ||
(!curtxbw_40mhz && curshortgi_20mhz)) {
+
if (macid == 0)
shortgi = true;
else if (macid == 1)
@@ -2138,21 +2183,42 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
break;
default:
ratr_index = RATR_INX_WIRELESS_NGB;
+
if (rtlphy->rf_type == RF_1T2R)
ratr_bitmap &= 0x000ff0ff;
else
ratr_bitmap &= 0x0f0ff0ff;
break;
}
- RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "ratr_bitmap :%x\n",
- ratr_bitmap);
- *(u32 *)&rate_mask = ((ratr_bitmap & 0x0fffffff) |
- ratr_index << 28);
+ sta_entry->ratr_index = ratr_index;
+
+ RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
+ "ratr_bitmap :%x\n", ratr_bitmap);
+ *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
+ (ratr_index << 28);
rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80;
RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
"Rate_index:%x, ratr_val:%x, %5phC\n",
ratr_index, ratr_bitmap, rate_mask);
- rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
+ memcpy(rtlpriv->rate_mask, rate_mask, 5);
+ /* rtl92c_fill_h2c_cmd() does USB I/O and will result in a
+ * "scheduled while atomic" if called directly */
+ schedule_work(&rtlpriv->works.fill_h2c_cmd);
+
+ if (macid != 0)
+ sta_entry->ratr_index = ratr_index;
+}
+
+void rtl92cu_update_hal_rate_tbl(struct ieee80211_hw *hw,
+ struct ieee80211_sta *sta,
+ u8 rssi_level)
+{
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
+
+ if (rtlpriv->dm.useramask)
+ rtl92cu_update_hal_rate_mask(hw, sta, rssi_level);
+ else
+ rtl92cu_update_hal_rate_table(hw, sta);
}
void rtl92cu_update_channel_access_setting(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
index f41a3aa..8e3ec1e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
@@ -98,10 +98,6 @@ void rtl92cu_update_interrupt_mask(struct ieee80211_hw *hw,
u32 add_msr, u32 rm_msr);
void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
-void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
- struct ieee80211_sta *sta,
- u8 rssi_level);
-void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level);
void rtl92cu_update_channel_access_setting(struct ieee80211_hw *hw);
bool rtl92cu_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
index 85b6bdb..da4f587 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
@@ -289,14 +289,30 @@ void rtl92c_set_key(struct ieee80211_hw *hw, u32 key_index,
macaddr = cam_const_broad;
entry_id = key_index;
} else {
+ if (mac->opmode == NL80211_IFTYPE_AP ||
+ mac->opmode == NL80211_IFTYPE_MESH_POINT) {
+ entry_id = rtl_cam_get_free_entry(hw,
+ p_macaddr);
+ if (entry_id >= TOTAL_CAM_ENTRY) {
+ RT_TRACE(rtlpriv, COMP_SEC,
+ DBG_EMERG,
+ "Can not find free hw security cam entry\n");
+ return;
+ }
+ } else {
+ entry_id = CAM_PAIRWISE_KEY_POSITION;
+ }
+
key_index = PAIRWISE_KEYIDX;
- entry_id = CAM_PAIRWISE_KEY_POSITION;
is_pairwise = true;
}
}
if (rtlpriv->sec.key_len[key_index] == 0) {
RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
"delete one entry\n");
+ if (mac->opmode == NL80211_IFTYPE_AP ||
+ mac->opmode == NL80211_IFTYPE_MESH_POINT)
+ rtl_cam_del_entry(hw, p_macaddr);
rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
} else {
RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index 23d640a..a00e7d7 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -106,8 +106,7 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = {
.update_interrupt_mask = rtl92cu_update_interrupt_mask,
.get_hw_reg = rtl92cu_get_hw_reg,
.set_hw_reg = rtl92cu_set_hw_reg,
- .update_rate_tbl = rtl92cu_update_hal_rate_table,
- .update_rate_mask = rtl92cu_update_hal_rate_mask,
+ .update_rate_tbl = rtl92cu_update_hal_rate_tbl,
.fill_tx_desc = rtl92cu_tx_fill_desc,
.fill_fake_txdesc = rtl92cu_fill_fake_txdesc,
.fill_tx_cmddesc = rtl92cu_tx_fill_cmddesc,
@@ -137,6 +136,7 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = {
.phy_lc_calibrate = _rtl92cu_phy_lc_calibrate,
.phy_set_bw_mode_callback = rtl92cu_phy_set_bw_mode_callback,
.dm_dynamic_txpower = rtl92cu_dm_dynamic_txpower,
+ .fill_h2c_cmd = rtl92c_fill_h2c_cmd,
};
static struct rtl_mod_params rtl92cu_mod_params = {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h
index a1310ab..262e1e4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h
@@ -49,5 +49,8 @@ bool rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw,
enum radio_path rfpath, u32 regaddr, u32 bitmask);
void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
+void rtl92cu_update_hal_rate_tbl(struct ieee80211_hw *hw,
+ struct ieee80211_sta *sta,
+ u8 rssi_level);
#endif
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index 76732b0..a3532e0 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -824,6 +824,7 @@ static void rtl_usb_stop(struct ieee80211_hw *hw)
/* should after adapter start and interrupt enable. */
set_hal_stop(rtlhal);
+ cancel_work_sync(&rtlpriv->works.fill_h2c_cmd);
/* Enable software */
SET_USB_STOP(rtlusb);
rtl_usb_deinit(hw);
@@ -1026,6 +1027,16 @@ static bool rtl_usb_tx_chk_waitq_insert(struct ieee80211_hw *hw,
return false;
}
+static void rtl_fill_h2c_cmd_work_callback(struct work_struct *work)
+{
+ struct rtl_works *rtlworks =
+ container_of(work, struct rtl_works, fill_h2c_cmd);
+ struct ieee80211_hw *hw = rtlworks->hw;
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
+
+ rtlpriv->cfg->ops->fill_h2c_cmd(hw, H2C_RA_MASK, 5, rtlpriv->rate_mask);
+}
+
static struct rtl_intf_ops rtl_usb_ops = {
.adapter_start = rtl_usb_start,
.adapter_stop = rtl_usb_stop,
@@ -1057,6 +1068,8 @@ int rtl_usb_probe(struct usb_interface *intf,
/* this spin lock must be initialized early */
spin_lock_init(&rtlpriv->locks.usb_lock);
+ INIT_WORK(&rtlpriv->works.fill_h2c_cmd,
+ rtl_fill_h2c_cmd_work_callback);
rtlpriv->usb_data_index = 0;
init_completion(&rtlpriv->firmware_loading_complete);
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 44328ba..cc03e7c 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -1736,6 +1736,8 @@ struct rtl_hal_ops {
void (*bt_wifi_media_status_notify) (struct ieee80211_hw *hw,
bool mstate);
void (*bt_coex_off_before_lps) (struct ieee80211_hw *hw);
+ void (*fill_h2c_cmd) (struct ieee80211_hw *hw, u8 element_id,
+ u32 cmd_len, u8 *p_cmdbuffer);
};
struct rtl_intf_ops {
@@ -1869,6 +1871,7 @@ struct rtl_works {
struct delayed_work fwevt_wq;
struct work_struct lps_change_work;
+ struct work_struct fill_h2c_cmd;
};
struct rtl_debug {
@@ -2048,6 +2051,7 @@ struct rtl_priv {
};
};
bool enter_ps; /* true when entering PS */
+ u8 rate_mask[5];
/*This must be the last item so
that it points to the data allocated
--
1.8.1.4
^ permalink raw reply related
* [PATCH] rtlwifi: Fix a false leak indication for PCI devices
From: Larry Finger @ 2013-05-30 21:21 UTC (permalink / raw)
To: John W Linville; +Cc: linux-wireless
This false leak indication is avoided with a no-leak annotation to kmemleak.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
John,
AFAIK, the false leak indication was not present before 3.10.
Please include it in the 3.10 stream.
Thanks,
Larry
---
Index: wireless-testing-save/drivers/net/wireless/rtlwifi/pci.c
===================================================================
--- wireless-testing-save.orig/drivers/net/wireless/rtlwifi/pci.c
+++ wireless-testing-save/drivers/net/wireless/rtlwifi/pci.c
@@ -764,6 +764,7 @@ static void _rtl_pci_rx_interrupt(struct
"can't alloc skb for rx\n");
goto done;
}
+ kmemleak_not_leak(new_skb);
pci_unmap_single(rtlpci->pdev,
*((dma_addr_t *) skb->cb),
^ permalink raw reply
* [PATCH] rtlwifi: Fix a false leak indication for PCI devices
From: Larry Finger @ 2013-05-30 21:09 UTC (permalink / raw)
To: John W Linville; +Cc: linux-wireless
This false leak indication is avoided with a no-leak annotation to kmemleak.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
John,
AFAIK, the false leak indication was not present before 3.10.
Please include it in the 3.10 stream.
Thanks,
Larry
---
Index: wireless-testing-save/drivers/net/wireless/rtlwifi/pci.c
===================================================================
--- wireless-testing-save.orig/drivers/net/wireless/rtlwifi/pci.c
+++ wireless-testing-save/drivers/net/wireless/rtlwifi/pci.c
@@ -764,6 +764,7 @@ static void _rtl_pci_rx_interrupt(struct
"can't alloc skb for rx\n");
goto done;
}
+ kmemleak_not_leak(new_skb);
pci_unmap_single(rtlpci->pdev,
*((dma_addr_t *) skb->cb),
^ permalink raw reply
* Re: Another try at getting pktgen to work with wifi.
From: Ben Greear @ 2013-05-30 20:45 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless@vger.kernel.org
In-Reply-To: <51A7B049.9090201@openwrt.org>
On 05/30/2013 01:02 PM, Felix Fietkau wrote:
> On 2013-05-30 8:45 PM, Ben Greear wrote:
>> I'm trying to come up with a more acceptable patch to the problem discussed a few years
>> ago:
>>
>> http://thread.gmane.org/gmane.linux.kernel.wireless.general/64582/focus=64626
>>
>> The patch below appears to work as expected. In pktgen, you just have to set
>> the QoS to whatever value matches the queue you need.
>>
>> This seem reasonable?
> Why do you adjust the queue mapping instead of the skb priority? In that
> other thread you mentioned that pktgen should be able to control the
> queue, yet here you're taking queue control away from it for tx on mac80211.
I was having trouble getting it to work, but I was trying it at
a different place in the code when I was hacking on it...
Do you think I'd just need to adjust skb->priority in the
same spot in the code, or is there more to it?
Thanks,
Ben
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply
* Re: Another try at getting pktgen to work with wifi.
From: Felix Fietkau @ 2013-05-30 20:02 UTC (permalink / raw)
To: Ben Greear; +Cc: linux-wireless@vger.kernel.org
In-Reply-To: <51A79E4A.7000609@candelatech.com>
On 2013-05-30 8:45 PM, Ben Greear wrote:
> I'm trying to come up with a more acceptable patch to the problem discussed a few years
> ago:
>
> http://thread.gmane.org/gmane.linux.kernel.wireless.general/64582/focus=64626
>
> The patch below appears to work as expected. In pktgen, you just have to set
> the QoS to whatever value matches the queue you need.
>
> This seem reasonable?
Why do you adjust the queue mapping instead of the skb priority? In that
other thread you mentioned that pktgen should be able to control the
queue, yet here you're taking queue control away from it for tx on mac80211.
- Felix
^ permalink raw reply
* Another try at getting pktgen to work with wifi.
From: Ben Greear @ 2013-05-30 18:45 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org
I'm trying to come up with a more acceptable patch to the problem discussed a few years
ago:
http://thread.gmane.org/gmane.linux.kernel.wireless.general/64582/focus=64626
The patch below appears to work as expected. In pktgen, you just have to set
the QoS to whatever value matches the queue you need.
This seem reasonable?
Thanks,
Ben
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index d445bb1..c770f19 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1544,6 +1544,18 @@ void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
}
}
+ /* This check needs to go in before the QoS header is set below. */
+ if (skb->priority > 7 ||
+ skb->queue_mapping != ieee802_1d_to_ac[skb->priority]) {
+ WARN_ONCE(1, "Invalid queue-mapping, priority: %i queue-mapping: %i. This is an expected warning
+ (int)(skb->priority), (int)(skb->queue_mapping));
+ /* Adjust queue-mapping to match what the wifi stack expects.
+ * pktgen will just have to set QoS bits accordingly instead
+ * of trying to set the queue_mapping directly.
+ */
+ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
+ }
+
ieee80211_set_qos_hdr(sdata, skb);
ieee80211_tx(sdata, skb, false, band);
}
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply related
* Re: [PATCH] iw: Allow basic rates to be configured when joining mesh
From: Ashok Nagarajan @ 2013-05-30 18:20 UTC (permalink / raw)
To: linux-wireless; +Cc: Javier Cardona, Johannes Berg, devel, Ashok Nagarajan
In-Reply-To: <1368233521-10642-1-git-send-email-ashok@cozybit.com>
Hi Johannes,
I am changing the API for mesh join here as per our recent discussion,
which is to accept basic-rates only when passed the 'freq' attribute.
I was wondering what would be an acceptable style in iw to convey this
to user.
1. mesh join <mesh ID> [freq in MHz [HT20|HT40+|HT40-|NOHT]
[basic-rates <rate in Mbps,rate2,...>]] or
2. mesh join <mesh ID> [freq in MHz] [HT20|HT40+|HT40-|NOHT]
[basic-rates <rate in Mbps,rate2,...>]
Note the nested brackets in style 1.
Please let me know what you think.
Thanks,
Ashok
On Fri, May 10, 2013 at 5:52 PM, Ashok Nagarajan <ashok@cozybit.com> wrote:
> This patch adds option to configure basic rates during mesh join
>
> Signed-off-by: Ashok Nagarajan <ashok@cozybit.com>
> ---
> mesh.c | 37 +++++++++++++++++++++++++++++++++++--
> 1 files changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/mesh.c b/mesh.c
> index 5a09b62..c6aa9ce 100644
> --- a/mesh.c
> +++ b/mesh.c
> @@ -431,8 +431,11 @@ static int join_mesh(struct nl80211_state *state, struct nl_cb *cb,
> {
> struct nlattr *container;
> float rate;
> + unsigned char rates[NL80211_MAX_SUPP_RATES];
> + int n_rates = 0;
> int bintval, dtim_period;
> char *end;
> + char *value = NULL, *sptr = NULL;
>
> if (argc < 1)
> return 1;
> @@ -441,6 +444,34 @@ static int join_mesh(struct nl80211_state *state, struct nl_cb *cb,
> argc--;
> argv++;
>
> + /* basic rates */
> + if (argc > 1 && strcmp(argv[0], "basic-rates") == 0) {
> + argv++;
> + argc--;
> +
> + value = strtok_r(argv[0], ",", &sptr);
> +
> + while (value && n_rates < NL80211_MAX_SUPP_RATES) {
> + rate = strtod(value, &end);
> + rates[n_rates] = rate * 2;
> +
> + /* filter out suspicious values */
> + if (*end != '\0' || !rates[n_rates] ||
> + rate*2 != rates[n_rates])
> + return 1;
> +
> + n_rates++;
> + value = strtok_r(NULL, ",", &sptr);
> + }
> +
> + NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, n_rates, rates);
> +
> + argv++;
> + argc--;
> + }
> +
> + /* multicast rate */
> +
> if (argc > 1 && strcmp(argv[0], "mcast-rate") == 0) {
> argv++;
> argc--;
> @@ -506,11 +537,13 @@ static int join_mesh(struct nl80211_state *state, struct nl_cb *cb,
> nla_put_failure:
> return -ENOBUFS;
> }
> -COMMAND(mesh, join, "<mesh ID> [mcast-rate <rate in Mbps>]"
> +COMMAND(mesh, join, "<mesh ID> [basic-rates <rate in Mbps,rate2,...>]"
> + "[mcast-rate <rate in Mbps>]"
> " [beacon-interval <time in TUs>] [dtim-period <value>]"
> " [vendor_sync on|off] [<param>=<value>]*",
> NL80211_CMD_JOIN_MESH, 0, CIB_NETDEV, join_mesh,
> - "Join a mesh with the given mesh ID with mcast-rate and mesh parameters.");
> + "Join a mesh with the given mesh ID with basic-rates, "
> + "mcast-rate and mesh parameters.");
>
> static int leave_mesh(struct nl80211_state *state, struct nl_cb *cb,
> struct nl_msg *msg, int argc, char **argv,
> --
> 1.7.5.4
>
--
Ashok Raj Nagarajan,
cozybit Inc.
http://www.cozybit.com
^ permalink raw reply
* Re: [PATCH 3/3] {nl,mac,cfg}80211: Allow user to configure basic rates for mesh
From: Ashok Nagarajan @ 2013-05-30 16:47 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, John Linville, devel
In-Reply-To: <1369470049.9074.2.camel@jlt4.sipsolutions.net>
On Sat, May 25, 2013 at 1:20 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
>
>> > I think you should consider allowing this attribute only if the channel
>> > is also specified (NL80211_ATTR_WIPHY_FREQ, parsed below), and not make
>> > it nested with rates for both bands but just the selected band.
>> >
>> Yes, I think by this approach, we eliminate the need for the user to
>> provide rates for both bands and also not require to have a per-band
>> for basic_rates.
>>
>> Said that, I am wondering why give mcast_rate for both bands, but
>> basic_rates only for one band?
>
> Heh, good question. I think it was probably copied from IBSS where you
> can pick another channel? Doesn't make all that much sense for mesh I
> guess, unless MBSS channel switch could cause us to use another channel?
> But then presumably you should follow the basic rates from the STA
> initiating the switch, or something, since mesh networks are only
> compatible with the same basic rates, right?
>
Yes, that is right. I will come up with a patch now for basic_rates
configuration as per your suggestion.
Thanks,
Ashok
> johannes
>
--
Ashok Raj Nagarajan,
cozybit Inc.
http://www.cozybit.com
^ permalink raw reply
* [PATCH -next] cw1200: remove unused including <linux/version.h>
From: Wei Yongjun @ 2013-05-30 11:43 UTC (permalink / raw)
To: pizza, linville; +Cc: yongjun_wei, linux-wireless
From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
Remove including <linux/version.h> that don't need it.
Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
---
drivers/net/wireless/cw1200/cw1200_spi.c | 1 -
drivers/net/wireless/cw1200/cw1200_sdio.c | 1 -
drivers/net/wireless/cw1200/cw1200.h | 1 -
3 files changed, 3 deletions(-)
diff --git a/drivers/net/wireless/cw1200/cw1200_spi.c b/drivers/net/wireless/cw1200/cw1200_spi.c
index 04af685..ab7a2d5 100644
--- a/drivers/net/wireless/cw1200/cw1200_spi.c
+++ b/drivers/net/wireless/cw1200/cw1200_spi.c
@@ -13,7 +13,6 @@
* published by the Free Software Foundation.
*/
-#include <linux/version.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/delay.h>
diff --git a/drivers/net/wireless/cw1200/cw1200_sdio.c b/drivers/net/wireless/cw1200/cw1200_sdio.c
index f6e2219..c658f1b 100644
--- a/drivers/net/wireless/cw1200/cw1200_sdio.c
+++ b/drivers/net/wireless/cw1200/cw1200_sdio.c
@@ -9,7 +9,6 @@
* published by the Free Software Foundation.
*/
-#include <linux/version.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/delay.h>
diff --git a/drivers/net/wireless/cw1200/cw1200.h b/drivers/net/wireless/cw1200/cw1200.h
index 2aa17ca..e9424e6 100644
--- a/drivers/net/wireless/cw1200/cw1200.h
+++ b/drivers/net/wireless/cw1200/cw1200.h
@@ -19,7 +19,6 @@
#define CW1200_H
#include <linux/wait.h>
-#include <linux/version.h>
#include <linux/mutex.h>
#include <linux/workqueue.h>
#include <net/mac80211.h>
^ permalink raw reply related
* [PATCH -next] cw1200: use module_spi_driver to simplify the code
From: Wei Yongjun @ 2013-05-30 11:42 UTC (permalink / raw)
To: pizza, linville; +Cc: yongjun_wei, linux-wireless
From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
module_spi_driver() makes the code simpler by eliminating
boilerplate code.
Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
---
drivers/net/wireless/cw1200/cw1200_spi.c | 15 +--------------
1 file changed, 1 insertion(+), 14 deletions(-)
diff --git a/drivers/net/wireless/cw1200/cw1200_spi.c b/drivers/net/wireless/cw1200/cw1200_spi.c
index 04af685..1e6c58d 100644
--- a/drivers/net/wireless/cw1200/cw1200_spi.c
+++ b/drivers/net/wireless/cw1200/cw1200_spi.c
@@ -464,17 +464,4 @@ static struct spi_driver spi_driver = {
},
};
-/* Init Module function -> Called by insmod */
-static int __init cw1200_spi_init(void)
-{
- return spi_register_driver(&spi_driver);
-}
-
-/* Called at Driver Unloading */
-static void __exit cw1200_spi_exit(void)
-{
- spi_unregister_driver(&spi_driver);
-}
-
-module_init(cw1200_spi_init);
-module_exit(cw1200_spi_exit);
+module_spi_driver(spi_driver);
^ permalink raw reply related
* [PATCH -next] cw1200: convert to use simple_open()
From: Wei Yongjun @ 2013-05-30 11:42 UTC (permalink / raw)
To: pizza, linville; +Cc: yongjun_wei, linux-wireless
From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
This removes an open coded simple_open() function and
replaces file operations references to the function
with simple_open() instead.
Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
---
drivers/net/wireless/cw1200/debug.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/drivers/net/wireless/cw1200/debug.c b/drivers/net/wireless/cw1200/debug.c
index b815181..eb40c9c 100644
--- a/drivers/net/wireless/cw1200/debug.c
+++ b/drivers/net/wireless/cw1200/debug.c
@@ -357,12 +357,6 @@ static const struct file_operations fops_counters = {
.owner = THIS_MODULE,
};
-static int cw1200_generic_open(struct inode *inode, struct file *file)
-{
- file->private_data = inode->i_private;
- return 0;
-}
-
#ifdef CONFIG_CW1200_ETF
static int cw1200_etf_out_show(struct seq_file *seq, void *v)
{
@@ -511,7 +505,7 @@ static ssize_t cw1200_wsm_dumps(struct file *file,
}
static const struct file_operations fops_wsm_dumps = {
- .open = cw1200_generic_open,
+ .open = simple_open,
.write = cw1200_wsm_dumps,
.llseek = default_llseek,
};
^ permalink raw reply related
* [PATCH -next] cw1200: remove duplicated include from wsm.c
From: Wei Yongjun @ 2013-05-30 11:41 UTC (permalink / raw)
To: pizza, linville; +Cc: yongjun_wei, linux-wireless
From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
Remove duplicated include.
Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
---
drivers/net/wireless/cw1200/wsm.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/net/wireless/cw1200/wsm.c b/drivers/net/wireless/cw1200/wsm.c
index 4db6cc1..f3fd9b2 100644
--- a/drivers/net/wireless/cw1200/wsm.c
+++ b/drivers/net/wireless/cw1200/wsm.c
@@ -12,7 +12,6 @@
#include <linux/skbuff.h>
#include <linux/wait.h>
-#include <linux/skbuff.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/random.h>
^ permalink raw reply related
* [PATCH 3/7] net, ipw2x00: remove redundant D0 power state set
From: Yijing Wang @ 2013-05-30 10:21 UTC (permalink / raw)
To: Stanislav Yakovlev, John W. Linville
Cc: linux-kernel, linux-wireless, netdev, Hanjun Guo, Jiang Liu,
Yijing Wang
Pci_enable_device() will set device power state to D0,
so it's no need to do it again in ipw2100_pci_init_one().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/net/wireless/ipw2x00/ipw2100.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c
index 15920aa..f8ab193 100644
--- a/drivers/net/wireless/ipw2x00/ipw2100.c
+++ b/drivers/net/wireless/ipw2x00/ipw2100.c
@@ -6242,8 +6242,6 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
if ((val & 0x0000ff00) != 0)
pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
- pci_set_power_state(pci_dev, PCI_D0);
-
if (!ipw2100_hw_is_adapter_in_system(dev)) {
printk(KERN_WARNING DRV_NAME
"Device not found via register read.\n");
--
1.7.1
^ permalink raw reply related
* Re: [PATCH 0/3] Work on STBC Rx monitoring
From: Oleksij Rempel @ 2013-05-30 8:57 UTC (permalink / raw)
To: Oleksij Rempel; +Cc: ath9k-devel, linux-wireless, Felix Fietkau
In-Reply-To: <1368949136-6079-1-git-send-email-linux@rempel-privat.de>
Any updates here? can some one please apply last two patches?
Felix?
Am 19.05.2013 09:38, schrieb Oleksij Rempel:
> This patch set will pass RxSTBC flags from ath9k to ieee80211
> and to radiotap.
> This field is now a part of radiotap specification:
> http://www.radiotap.org/defined-fields/MCS
>
> Oleksij Rempel (3):
> mac80211: add STBC flag for radiotap
> ath9k: remove useless flag conversation.
> ath9k: check for Rx-STBC flag and pass it to ieee80211
>
> drivers/net/wireless/ath/ath9k/ar9003_mac.c | 5 +++--
> drivers/net/wireless/ath/ath9k/mac.c | 16 ++++++++++++----
> drivers/net/wireless/ath/ath9k/mac.h | 4 +++-
> drivers/net/wireless/ath/ath9k/recv.c | 5 +----
> include/net/ieee80211_radiotap.h | 7 +++++++
> include/net/mac80211.h | 4 ++++
> net/mac80211/main.c | 3 ++-
> net/mac80211/rx.c | 4 ++++
> net/mac80211/status.c | 3 ++-
> 9 files changed, 38 insertions(+), 13 deletions(-)
>
--
Regards,
Oleksij
^ permalink raw reply
* Re: [RFC v1 ] hostapd: Beacon generation with Power Constraint IE - 11h TPC
From: Qabu Ndlovu @ 2013-05-30 7:59 UTC (permalink / raw)
To: linux-wireless
In-Reply-To: <510F950C.6000103@posedge.com>
Hie, I need help generating a beacon with CF parameter. I want to store an
alphanumeric value in the unused bits of the lenght field of that parameter
and then have clients only connecting to that AP if there are many other
broadcasts. Please help with ideas. Which files do i need to change, etc
Thanx
Que
^ permalink raw reply
* [patch] NFC: mei_phy: use kfree_skb() instead of kfree()
From: Dan Carpenter @ 2013-05-30 8:01 UTC (permalink / raw)
To: Lauro Ramos Venancio
Cc: Aloisio Almeida Jr, Samuel Ortiz, open list:NFC SUBSYSTEM,
moderated list:NFC SUBSYSTEM, kernel-janitors
This was allocated with alloc_skb() so it needs to be freed with
kfree_skb().
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
diff --git a/drivers/nfc/mei_phy.c b/drivers/nfc/mei_phy.c
index 1201bdbf..5fbaca4 100644
--- a/drivers/nfc/mei_phy.c
+++ b/drivers/nfc/mei_phy.c
@@ -127,7 +127,7 @@ void nfc_mei_event_cb(struct mei_cl_device *device, u32 events, void *context)
reply_size = mei_cl_recv(device, skb->data, MEI_NFC_MAX_READ);
if (reply_size < MEI_NFC_HEADER_SIZE) {
- kfree(skb);
+ kfree_skb(skb);
return;
}
^ permalink raw reply related
* [PATCH] wireless-next: cw1200: Fix compile with CONFIG_PM=n
From: Solomon Peachy @ 2013-05-30 2:22 UTC (permalink / raw)
To: linux-wireless; +Cc: Solomon Peachy
Intel's 0-day kernel build tester caught this build failure. This patch
properly wraps everything that depends on CONFIG_PM.
Signed-off-by: Solomon Peachy <pizza@shaftnet.org>
---
drivers/net/wireless/cw1200/Makefile | 2 +-
drivers/net/wireless/cw1200/cw1200_sdio.c | 4 ++++
drivers/net/wireless/cw1200/cw1200_spi.c | 4 ++++
drivers/net/wireless/cw1200/main.c | 10 ++++++++++
drivers/net/wireless/cw1200/pm.h | 11 ++++++++---
5 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/cw1200/Makefile b/drivers/net/wireless/cw1200/Makefile
index c197372..1aa3682 100644
--- a/drivers/net/wireless/cw1200/Makefile
+++ b/drivers/net/wireless/cw1200/Makefile
@@ -8,9 +8,9 @@ cw1200_core-y := \
wsm.o \
sta.o \
scan.o \
- pm.o \
debug.o
cw1200_core-$(CONFIG_CW1200_ITP) += itp.o
+cw1200_core-$(CONFIG_PM) += pm.o
# CFLAGS_sta.o += -DDEBUG
diff --git a/drivers/net/wireless/cw1200/cw1200_sdio.c b/drivers/net/wireless/cw1200/cw1200_sdio.c
index f6e2219..2059a31 100644
--- a/drivers/net/wireless/cw1200/cw1200_sdio.c
+++ b/drivers/net/wireless/cw1200/cw1200_sdio.c
@@ -334,6 +334,7 @@ static void cw1200_sdio_disconnect(struct sdio_func *func)
}
}
+#ifdef CONFIG_PM
static int cw1200_sdio_suspend(struct device *dev)
{
int ret;
@@ -360,15 +361,18 @@ static const struct dev_pm_ops cw1200_pm_ops = {
.suspend = cw1200_sdio_suspend,
.resume = cw1200_sdio_resume,
};
+#endif
static struct sdio_driver sdio_driver = {
.name = "cw1200_wlan_sdio",
.id_table = cw1200_sdio_ids,
.probe = cw1200_sdio_probe,
.remove = cw1200_sdio_disconnect,
+#ifdef CONFIG_PM
.drv = {
.pm = &cw1200_pm_ops,
}
+#endif
};
/* Init Module function -> Called by insmod */
diff --git a/drivers/net/wireless/cw1200/cw1200_spi.c b/drivers/net/wireless/cw1200/cw1200_spi.c
index 04af685..b957d4a 100644
--- a/drivers/net/wireless/cw1200/cw1200_spi.c
+++ b/drivers/net/wireless/cw1200/cw1200_spi.c
@@ -436,6 +436,7 @@ static int cw1200_spi_disconnect(struct spi_device *func)
return 0;
}
+#ifdef CONFIG_PM
static int cw1200_spi_suspend(struct device *dev, pm_message_t state)
{
struct sbus_priv *self = spi_get_drvdata(to_spi_device(dev));
@@ -451,6 +452,7 @@ static int cw1200_spi_resume(struct device *dev)
{
return 0;
}
+#endif
static struct spi_driver spi_driver = {
.probe = cw1200_spi_probe,
@@ -459,8 +461,10 @@ static struct spi_driver spi_driver = {
.name = "cw1200_wlan_spi",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
+#ifdef CONFIG_PM
.suspend = cw1200_spi_suspend,
.resume = cw1200_spi_resume,
+#endif
},
};
diff --git a/drivers/net/wireless/cw1200/main.c b/drivers/net/wireless/cw1200/main.c
index 8426d3d..ef4b0b9 100644
--- a/drivers/net/wireless/cw1200/main.c
+++ b/drivers/net/wireless/cw1200/main.c
@@ -234,8 +234,10 @@ static const struct ieee80211_ops cw1200_ops = {
.get_stats = cw1200_get_stats,
.ampdu_action = cw1200_ampdu_action,
.flush = cw1200_flush,
+#ifdef CONFIG_PM
.suspend = cw1200_wow_suspend,
.resume = cw1200_wow_resume,
+#endif
/* Intentionally not offloaded: */
/*.channel_switch = cw1200_channel_switch, */
/*.remain_on_channel = cw1200_remain_on_channel, */
@@ -292,10 +294,12 @@ static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,
BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_P2P_GO);
+#ifdef CONFIG_PM
/* Support only for limited wowlan functionalities */
hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY |
WIPHY_WOWLAN_DISCONNECT;
hw->wiphy->wowlan.n_patterns = 0;
+#endif
hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
@@ -419,18 +423,22 @@ static int cw1200_register_common(struct ieee80211_hw *dev)
goto done;
#endif
+#ifdef CONFIG_PM
err = cw1200_pm_init(&priv->pm_state, priv);
if (err) {
pr_err("Cannot init PM. (%d).\n",
err);
return err;
}
+#endif
err = ieee80211_register_hw(dev);
if (err) {
pr_err("Cannot register device (%d).\n",
err);
+#ifdef CONFIG_PM
cw1200_pm_deinit(&priv->pm_state);
+#endif
return err;
}
@@ -482,7 +490,9 @@ static void cw1200_unregister_common(struct ieee80211_hw *dev)
cw1200_queue_deinit(&priv->tx_queue[i]);
cw1200_queue_stats_deinit(&priv->tx_queue_stats);
+#ifdef CONFIG_PM
cw1200_pm_deinit(&priv->pm_state);
+#endif
}
/* Clock is in KHz */
diff --git a/drivers/net/wireless/cw1200/pm.h b/drivers/net/wireless/cw1200/pm.h
index 516d967..3ed90ff 100644
--- a/drivers/net/wireless/cw1200/pm.h
+++ b/drivers/net/wireless/cw1200/pm.h
@@ -25,14 +25,19 @@ struct cw1200_pm_state {
spinlock_t lock; /* Protect access */
};
+#ifdef CONFIG_PM
int cw1200_pm_init(struct cw1200_pm_state *pm,
struct cw1200_common *priv);
void cw1200_pm_deinit(struct cw1200_pm_state *pm);
-void cw1200_pm_stay_awake(struct cw1200_pm_state *pm,
- unsigned long tmo);
int cw1200_wow_suspend(struct ieee80211_hw *hw,
struct cfg80211_wowlan *wowlan);
int cw1200_wow_resume(struct ieee80211_hw *hw);
int cw1200_can_suspend(struct cw1200_common *priv);
-
+void cw1200_pm_stay_awake(struct cw1200_pm_state *pm,
+ unsigned long tmo);
+#else
+static inline void cw1200_pm_stay_awake(struct cw1200_pm_state *pm,
+ unsigned long tmo) {
+}
+#endif
#endif
--
1.8.1.4
^ permalink raw reply related
* [PATCH v2] mac80211: set mesh formation field properly
From: Jacob Minshall @ 2013-05-29 21:32 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, devel
Cap max peerings at 63 in accordance with IEEE-2012 8.4.2.100.7.
Triggers a beacon regeneration every time the number of peerings changes.
Previously this would only happen if the "accepting peerings" bit changed.
Signed-off-by: Jacob Minshall <jacob@cozybit.com>
---
using min_t instead of ternary (Johannes)
returning bitwise or value of mesh_accept..(...) and BSS_CHANGED_BEACON
when inc or dec estab plinks (Johannes)
include/linux/ieee80211.h | 1 +
net/mac80211/mesh.c | 3 +--
net/mac80211/mesh.h | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index d826e5a..b0dc87a 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -146,6 +146,7 @@ static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
#define IEEE80211_MAX_RTS_THRESHOLD 2353
#define IEEE80211_MAX_AID 2007
#define IEEE80211_MAX_TIM_LEN 251
+#define IEEE80211_MAX_MESH_PEERINGS 63
/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
6.2.1.1.2.
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index b3d1fdd..73a597b 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -274,8 +274,7 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
*pos++ = ifmsh->mesh_auth_id;
/* Mesh Formation Info - number of neighbors */
neighbors = atomic_read(&ifmsh->estab_plinks);
- /* Number of neighbor mesh STAs or 15 whichever is smaller */
- neighbors = (neighbors > 15) ? 15 : neighbors;
+ neighbors = min_t(int, neighbors, IEEE80211_MAX_MESH_PEERINGS);
*pos++ = neighbors << 1;
/* Mesh capability */
*pos = IEEE80211_MESHCONF_CAPAB_FORWARDING;
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h
index da15877..8b4d9a3 100644
--- a/net/mac80211/mesh.h
+++ b/net/mac80211/mesh.h
@@ -324,14 +324,14 @@ static inline
u32 mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata)
{
atomic_inc(&sdata->u.mesh.estab_plinks);
- return mesh_accept_plinks_update(sdata);
+ return mesh_accept_plinks_update(sdata) | BSS_CHANGED_BEACON;
}
static inline
u32 mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata)
{
atomic_dec(&sdata->u.mesh.estab_plinks);
- return mesh_accept_plinks_update(sdata);
+ return mesh_accept_plinks_update(sdata) | BSS_CHANGED_BEACON;
}
static inline int mesh_plink_free_count(struct ieee80211_sub_if_data *sdata)
--
1.7.9.5
^ permalink raw reply related
* RE: [PATCH] mwifiex: debugfs: Fix out of bounds array access
From: Bing Zhao @ 2013-05-29 21:18 UTC (permalink / raw)
To: Mark A. Greer, John W. Linville; +Cc: linux-wireless@vger.kernel.org
In-Reply-To: <1369855534-20897-1-git-send-email-mgreer@animalcreek.com>
Hi Mark,
Thanks for the patch.
> From: "Mark A. Greer" <mgreer@animalcreek.com>
>
> When reading the contents of '/sys/kernel/debug/mwifiex/p2p0/info',
> the following panic occurs:
>
> $ cat /sys/kernel/debug/mwifiex/p2p0/info
> Unable to handle kernel paging request at virtual address 74706164
> pgd = de530000
> [74706164] *pgd=00000000
> Internal error: Oops: 5 [#1] SMP ARM
> Modules linked in: phy_twl4030_usb omap2430 musb_hdrc mwifiex_sdio mwifiex
> CPU: 0 PID: 1635 Comm: cat Not tainted 3.10.0-rc1-00010-g1268390 #1
> task: de16b6c0 ti: de048000 task.ti: de048000
> PC is at strnlen+0xc/0x4c
> LR is at string+0x3c/0xf8
> pc : [<c02c123c>] lr : [<c02c2d1c>] psr: a0000013
> sp : de049e10 ip : c06efba0 fp : de6d2092
> r10: bf01a260 r9 : ffffffff r8 : 74706164
> r7 : 0000ffff r6 : ffffffff r5 : de6d209c r4 : 00000000
> r3 : ff0a0004 r2 : 74706164 r1 : ffffffff r0 : 74706164
> Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
> Control: 10c5387d Table: 9e530019 DAC: 00000015
> Process cat (pid: 1635, stack limit = 0xde048240)
> Stack: (0xde049e10 to 0xde04a000)
> 9e00: de6d2092 00000002 bf01a25e de6d209c
> 9e20: de049e80 c02c438c 0000000a ff0a0004 ffffffff 00000000 00000000 de049e48
> 9e40: 00000000 2192df6d ff0a0004 ffffffff 00000000 de6d2092 de049ef8 bef3cc00
> 9e60: de6b0000 dc358000 de6d2000 00000000 00000003 c02c45a4 bf01790c bf01a254
> 9e80: 74706164 bf018698 00000000 de59c3c0 de048000 de049f80 00001000 bef3cc00
> 9ea0: 00000008 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 9ec0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 9ee0: 00000000 00000000 00000000 00000001 00000000 00000000 6669776d 20786569
> 9f00: 20302e31 2e343128 392e3636 3231702e 00202933 00000000 00000003 c0294898
> 9f20: 00000000 00000000 00000000 00000000 de59c3c0 c0107c04 de554000 de59c3c0
> 9f40: 00001000 bef3cc00 de049f80 bef3cc00 de049f80 00000000 00000003 c0108a00
> 9f60: de048000 de59c3c0 00000000 00000000 de59c3c0 00001000 bef3cc00 c0108b60
> 9f80: 00000000 00000000 00001000 bef3cc00 00000003 00000003 c0014128 de048000
> 9fa0: 00000000 c0013f80 00001000 bef3cc00 00000003 bef3cc00 00001000 00000000
> 9fc0: 00001000 bef3cc00 00000003 00000003 00000001 00000001 00000001 00000003
> 9fe0: 00000000 bef3cbdc 00011984 b6f1127c 60000010 00000003 18dbdd2c 7f7bfffd
> [<c02c123c>] (strnlen+0xc/0x4c) from [<c02c2d1c>] (string+0x3c/0xf8)
> [<c02c2d1c>] (string+0x3c/0xf8) from [<c02c438c>] (vsnprintf+0x1e8/0x3e8)
> [<c02c438c>] (vsnprintf+0x1e8/0x3e8) from [<c02c45a4>] (sprintf+0x18/0x24)
> [<c02c45a4>] (sprintf+0x18/0x24) from [<bf01790c>] (mwifiex_info_read+0xfc/0x3e8 [mwifiex])
> [<bf01790c>] (mwifiex_info_read+0xfc/0x3e8 [mwifiex]) from [<c0108a00>] (vfs_read+0xb0/0x144)
> [<c0108a00>] (vfs_read+0xb0/0x144) from [<c0108b60>] (SyS_read+0x44/0x70)
> [<c0108b60>] (SyS_read+0x44/0x70) from [<c0013f80>] (ret_fast_syscall+0x0/0x30)
> Code: e12fff1e e3510000 e1a02000 0a00000d (e5d03000)
> ---[ end trace ca98273dc605a04f ]---
>
> The panic is caused by the mwifiex_info_read() routine assuming that
> there can only be four modes (0-3) which is an invalid assumption.
> For example, when testing P2P, the mode is '8' (P2P_CLIENT) so the
> code accesses data beyond the bounds of the bss_modes[] array which
> causes the panic. Fix this by updating bss_modes[] to support the
> current list of modes and adding a check to prevent the out-of-bounds
> access from occuring in the future when more modes are added.
>
> Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
Acked-by: Bing Zhao <bzhao@marvell.com>
Hi John,
This patch is for 3.10.
Thanks,
Bing
^ permalink raw reply
* Re: [PATCH] mac80211: mesh formation info properly set
From: Johannes Berg @ 2013-05-29 19:53 UTC (permalink / raw)
To: Jacob Minshall; +Cc: linux-wireless, devel
In-Reply-To: <1369857129.12820.5.camel@jlt4.sipsolutions.net>
On Wed, 2013-05-29 at 21:52 +0200, Johannes Berg wrote:
> > atomic_inc(&sdata->u.mesh.estab_plinks);
> > - return mesh_accept_plinks_update(sdata);
> > + mesh_accept_plinks_update(sdata);
> > + return BSS_CHANGED_BEACON;
>
> These changes seem odd to me, why doesn't mesh_accept_plinks_update()
> just return the change value then?
Oh wait, n/m, but shouldn't you have something like
return mesh_accept_...(...) | BSS_CHANGED_BEACON;
?
johannes
^ permalink raw reply
* Re: [PATCH] mac80211: mesh formation info properly set
From: Johannes Berg @ 2013-05-29 19:52 UTC (permalink / raw)
To: Jacob Minshall; +Cc: linux-wireless, devel
In-Reply-To: <1369855313-25871-1-git-send-email-jacob@cozybit.com>
On Wed, 2013-05-29 at 12:21 -0700, Jacob Minshall wrote:
> Max peerings capped at 63 in accordance with IEEE-2012 8.4.2.100.7,
> and trigger a beacon regeneration every time the number of peerings
> changes.
Can you write full sentences? Maybe also in the subject ("set mesh ...
properly"?) :-)
> - neighbors = (neighbors > 15) ? 15 : neighbors;
> + neighbors = (neighbors > IEEE80211_MAX_MESH_PEERINGS) ?
> + IEEE80211_MAX_MESH_PEERINGS : neighbors;
min() or min_t()?
> atomic_inc(&sdata->u.mesh.estab_plinks);
> - return mesh_accept_plinks_update(sdata);
> + mesh_accept_plinks_update(sdata);
> + return BSS_CHANGED_BEACON;
These changes seem odd to me, why doesn't mesh_accept_plinks_update()
just return the change value then?
johannes
^ permalink raw reply
* [PATCH] mwifiex: debugfs: Fix out of bounds array access
From: Mark A. Greer @ 2013-05-29 19:25 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, Bing Zhao, Mark A. Greer
From: "Mark A. Greer" <mgreer@animalcreek.com>
When reading the contents of '/sys/kernel/debug/mwifiex/p2p0/info',
the following panic occurs:
$ cat /sys/kernel/debug/mwifiex/p2p0/info
Unable to handle kernel paging request at virtual address 74706164
pgd = de530000
[74706164] *pgd=00000000
Internal error: Oops: 5 [#1] SMP ARM
Modules linked in: phy_twl4030_usb omap2430 musb_hdrc mwifiex_sdio mwifiex
CPU: 0 PID: 1635 Comm: cat Not tainted 3.10.0-rc1-00010-g1268390 #1
task: de16b6c0 ti: de048000 task.ti: de048000
PC is at strnlen+0xc/0x4c
LR is at string+0x3c/0xf8
pc : [<c02c123c>] lr : [<c02c2d1c>] psr: a0000013
sp : de049e10 ip : c06efba0 fp : de6d2092
r10: bf01a260 r9 : ffffffff r8 : 74706164
r7 : 0000ffff r6 : ffffffff r5 : de6d209c r4 : 00000000
r3 : ff0a0004 r2 : 74706164 r1 : ffffffff r0 : 74706164
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c5387d Table: 9e530019 DAC: 00000015
Process cat (pid: 1635, stack limit = 0xde048240)
Stack: (0xde049e10 to 0xde04a000)
9e00: de6d2092 00000002 bf01a25e de6d209c
9e20: de049e80 c02c438c 0000000a ff0a0004 ffffffff 00000000 00000000 de049e48
9e40: 00000000 2192df6d ff0a0004 ffffffff 00000000 de6d2092 de049ef8 bef3cc00
9e60: de6b0000 dc358000 de6d2000 00000000 00000003 c02c45a4 bf01790c bf01a254
9e80: 74706164 bf018698 00000000 de59c3c0 de048000 de049f80 00001000 bef3cc00
9ea0: 00000008 00000000 00000000 00000000 00000000 00000000 00000000 00000000
9ec0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
9ee0: 00000000 00000000 00000000 00000001 00000000 00000000 6669776d 20786569
9f00: 20302e31 2e343128 392e3636 3231702e 00202933 00000000 00000003 c0294898
9f20: 00000000 00000000 00000000 00000000 de59c3c0 c0107c04 de554000 de59c3c0
9f40: 00001000 bef3cc00 de049f80 bef3cc00 de049f80 00000000 00000003 c0108a00
9f60: de048000 de59c3c0 00000000 00000000 de59c3c0 00001000 bef3cc00 c0108b60
9f80: 00000000 00000000 00001000 bef3cc00 00000003 00000003 c0014128 de048000
9fa0: 00000000 c0013f80 00001000 bef3cc00 00000003 bef3cc00 00001000 00000000
9fc0: 00001000 bef3cc00 00000003 00000003 00000001 00000001 00000001 00000003
9fe0: 00000000 bef3cbdc 00011984 b6f1127c 60000010 00000003 18dbdd2c 7f7bfffd
[<c02c123c>] (strnlen+0xc/0x4c) from [<c02c2d1c>] (string+0x3c/0xf8)
[<c02c2d1c>] (string+0x3c/0xf8) from [<c02c438c>] (vsnprintf+0x1e8/0x3e8)
[<c02c438c>] (vsnprintf+0x1e8/0x3e8) from [<c02c45a4>] (sprintf+0x18/0x24)
[<c02c45a4>] (sprintf+0x18/0x24) from [<bf01790c>] (mwifiex_info_read+0xfc/0x3e8 [mwifiex])
[<bf01790c>] (mwifiex_info_read+0xfc/0x3e8 [mwifiex]) from [<c0108a00>] (vfs_read+0xb0/0x144)
[<c0108a00>] (vfs_read+0xb0/0x144) from [<c0108b60>] (SyS_read+0x44/0x70)
[<c0108b60>] (SyS_read+0x44/0x70) from [<c0013f80>] (ret_fast_syscall+0x0/0x30)
Code: e12fff1e e3510000 e1a02000 0a00000d (e5d03000)
---[ end trace ca98273dc605a04f ]---
The panic is caused by the mwifiex_info_read() routine assuming that
there can only be four modes (0-3) which is an invalid assumption.
For example, when testing P2P, the mode is '8' (P2P_CLIENT) so the
code accesses data beyond the bounds of the bss_modes[] array which
causes the panic. Fix this by updating bss_modes[] to support the
current list of modes and adding a check to prevent the out-of-bounds
access from occuring in the future when more modes are added.
Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
---
drivers/net/wireless/mwifiex/debugfs.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c
index 753b568..a5f9875 100644
--- a/drivers/net/wireless/mwifiex/debugfs.c
+++ b/drivers/net/wireless/mwifiex/debugfs.c
@@ -26,10 +26,17 @@
static struct dentry *mwifiex_dfs_dir;
static char *bss_modes[] = {
- "Unknown",
- "Ad-hoc",
- "Managed",
- "Auto"
+ "UNSPECIFIED",
+ "ADHOC",
+ "STATION",
+ "AP",
+ "AP_VLAN",
+ "WDS",
+ "MONITOR",
+ "MESH_POINT",
+ "P2P_CLIENT",
+ "P2P_GO",
+ "P2P_DEVICE",
};
/* size/addr for mwifiex_debug_info */
@@ -200,7 +207,12 @@ mwifiex_info_read(struct file *file, char __user *ubuf,
p += sprintf(p, "driver_version = %s", fmt);
p += sprintf(p, "\nverext = %s", priv->version_str);
p += sprintf(p, "\ninterface_name=\"%s\"\n", netdev->name);
- p += sprintf(p, "bss_mode=\"%s\"\n", bss_modes[info.bss_mode]);
+
+ if (info.bss_mode >= ARRAY_SIZE(bss_modes))
+ p += sprintf(p, "bss_mode=\"%d\"\n", info.bss_mode);
+ else
+ p += sprintf(p, "bss_mode=\"%s\"\n", bss_modes[info.bss_mode]);
+
p += sprintf(p, "media_state=\"%s\"\n",
(!priv->media_connected ? "Disconnected" : "Connected"));
p += sprintf(p, "mac_address=\"%pM\"\n", netdev->dev_addr);
--
1.7.12
^ permalink raw reply related
* Re: [PATCH for 3.10 00/16] brcmfmac: firmware-signalling fixes
From: Arend van Spriel @ 2013-05-29 19:23 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless
In-Reply-To: <20130529184426.GC8770@tuxdriver.com>
On 05/29/2013 08:44 PM, John W. Linville wrote:
> On Wed, May 29, 2013 at 06:38:50PM +0200, Arend van Spriel wrote:
>> This is a somewhat large series and reading the message of the announcement
>> of v3.10-rc3 I think it is good to give our story up front. Firmware-signalling
>> is a new feature merged in for 3.10, which was a major overhaul of the transmit
>> path in brcmfmac. During and after the merge window we still have some blanks
>> in our test coverage and further testing revealed issues with P2P, TDLS, and
>> power-saving clients in AP mode. These issues have been fixed in this series.
>>
>> As said this series is intended for 3.10 and applies to the master branch of
>> the wireless repository.
>>
>> Arend van Spriel (6):
>> brcmfmac: allow firmware-signal tlv to be longer than specified
>> brcmfmac: remove fifo bitfield from brcmf_skbuff_cb::if_flags
>> brcmfmac: rework credit pickup to assure consistent handling
>> brcmfmac: explicitly indicate sk_buff is sent upon request credit
>> brcmfmac: reducing debug logging in firmware-signalling code
>> brcmfmac: Sent TIM information in case of data available.
>>
>> Hante Meuleman (10):
>> brcmfmac: Take bus flowcontrol at credit mgmt into account.
>> brcmfmac: On bus flow control use fw signalling or netif.
>> brcmfmac: For FW signalling it is necessary to track gen bit.
>> brcmfmac: Correct creditmap when credit borrowing is active.
>> brcmfmac: Find correct MAC descriptor in case of TDLS.
>> brcmfmac: fix invalid ifp lookup in firmware-signalling
>> brcmfmac: Accept only first creditmap event.
>> brcmfmac: Signalling header push and pull on logic places.
>> brcmfmac: Fix endless loop when brcmf_fws_commit_skb fails.
>> brcmfmac: Simplify counting transit count.
>>
>> drivers/net/wireless/brcm80211/brcmfmac/dhd.h | 2 +
>> .../net/wireless/brcm80211/brcmfmac/dhd_linux.c | 21 +-
>> drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 2 +-
>> drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | 639 ++++++++++----------
>> drivers/net/wireless/brcm80211/brcmfmac/fwsignal.h | 1 +
>> drivers/net/wireless/brcm80211/brcmfmac/usb.c | 8 +
>> 6 files changed, 340 insertions(+), 333 deletions(-)
>
> Grr...I'll merge it, and pass your plea on to Dave. But, there can't
> be any more batches like this for 3.10...
Sorry to make you growl. If there are regressions being reported I
expect that this was it for 3.10 (from us).
Gr. AvS
(not Growling, but Greeting)
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox