mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 05:34:13 +08:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
John W. Linville says: ==================== This is a batch of fixes intended for 3.7... Included are two pulls. Regarding the mac80211 tree, Johannes says: "Please pull my mac80211.git tree (see below) to get two more fixes for 3.7. Both fix regressions introduced *before* this cycle that weren't noticed until now, one for IBSS not cleaning up properly and the other to add back the "wireless" sysfs directory for Fedora's startup scripts." Regarding the iwlwifi tree, Johannes says: "Please also pull my iwlwifi.git tree, I have two fixes: one to remove a spurious warning that can actually trigger in legitimate situations, and the other to fix a regression from when monitor mode was changed to use the "sniffer" firmware mode." Also included is an nfc tree pull. Samuel says: "We mostly have pn533 fixes here, 2 memory leaks and an early unlocking fix. Moreover, we also have an LLCP adapter linked list insertion fix." On top of that, a few more bits... Albert Pool adds a USB ID to rtlwifi. Bing Zhao provides two mwifiex fixes -- one to fix a system hang during a command timeout, and the other to properly report a suspend error to the MMC core. Finally, Sujith Manoharan fixes a thinko that would trigger an ath9k hang during device reset. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f30a944392
@ -1456,7 +1456,7 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
|
||||
switch (type) {
|
||||
case ATH9K_RESET_POWER_ON:
|
||||
ret = ath9k_hw_set_reset_power_on(ah);
|
||||
if (!ret)
|
||||
if (ret)
|
||||
ah->reset_power_on = true;
|
||||
break;
|
||||
case ATH9K_RESET_WARM:
|
||||
|
@ -1354,6 +1354,20 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
|
||||
vif_priv->ctx = ctx;
|
||||
ctx->vif = vif;
|
||||
|
||||
/*
|
||||
* In SNIFFER device type, the firmware reports the FCS to
|
||||
* the host, rather than snipping it off. Unfortunately,
|
||||
* mac80211 doesn't (yet) provide a per-packet flag for
|
||||
* this, so that we have to set the hardware flag based
|
||||
* on the interfaces added. As the monitor interface can
|
||||
* only be present by itself, and will be removed before
|
||||
* other interfaces are added, this is safe.
|
||||
*/
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR)
|
||||
priv->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS;
|
||||
else
|
||||
priv->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS;
|
||||
|
||||
err = iwl_setup_interface(priv, ctx);
|
||||
if (!err || reset)
|
||||
goto out;
|
||||
|
@ -480,20 +480,12 @@ void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo,
|
||||
void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
u16 rd_ptr, wr_ptr;
|
||||
int n_bd = trans_pcie->txq[txq_id].q.n_bd;
|
||||
|
||||
if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) {
|
||||
WARN_ONCE(1, "queue %d not used", txq_id);
|
||||
return;
|
||||
}
|
||||
|
||||
rd_ptr = iwl_read_prph(trans, SCD_QUEUE_RDPTR(txq_id)) & (n_bd - 1);
|
||||
wr_ptr = iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq_id));
|
||||
|
||||
WARN_ONCE(rd_ptr != wr_ptr, "queue %d isn't empty: [%d,%d]",
|
||||
txq_id, rd_ptr, wr_ptr);
|
||||
|
||||
iwl_txq_set_inactive(trans, txq_id);
|
||||
IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id);
|
||||
}
|
||||
|
@ -890,9 +890,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
|
||||
return;
|
||||
}
|
||||
cmd_node = adapter->curr_cmd;
|
||||
if (cmd_node->wait_q_enabled)
|
||||
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
||||
|
||||
if (cmd_node) {
|
||||
adapter->dbg.timeout_cmd_id =
|
||||
adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index];
|
||||
@ -938,6 +935,14 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
|
||||
|
||||
dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n",
|
||||
adapter->ps_mode, adapter->ps_state);
|
||||
|
||||
if (cmd_node->wait_q_enabled) {
|
||||
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
||||
wake_up_interruptible(&adapter->cmd_wait_q.wait);
|
||||
mwifiex_cancel_pending_ioctl(adapter);
|
||||
/* reset cmd_sent flag to unblock new commands */
|
||||
adapter->cmd_sent = false;
|
||||
}
|
||||
}
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING)
|
||||
mwifiex_init_fw_complete(adapter);
|
||||
|
@ -161,7 +161,6 @@ static int mwifiex_sdio_suspend(struct device *dev)
|
||||
struct sdio_mmc_card *card;
|
||||
struct mwifiex_adapter *adapter;
|
||||
mmc_pm_flag_t pm_flag = 0;
|
||||
int hs_actived = 0;
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
@ -188,12 +187,14 @@ static int mwifiex_sdio_suspend(struct device *dev)
|
||||
adapter = card->adapter;
|
||||
|
||||
/* Enable the Host Sleep */
|
||||
hs_actived = mwifiex_enable_hs(adapter);
|
||||
if (hs_actived) {
|
||||
pr_debug("cmd: suspend with MMC_PM_KEEP_POWER\n");
|
||||
ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
|
||||
if (!mwifiex_enable_hs(adapter)) {
|
||||
dev_err(adapter->dev, "cmd: failed to suspend\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
dev_dbg(adapter->dev, "cmd: suspend with MMC_PM_KEEP_POWER\n");
|
||||
ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
|
||||
|
||||
/* Indicate device suspended */
|
||||
adapter->is_suspended = true;
|
||||
|
||||
|
@ -297,6 +297,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
|
||||
/*=== Customer ID ===*/
|
||||
/****** 8188CU ********/
|
||||
{RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/
|
||||
{RTL_USB_DEVICE(0x050d, 0x11f2, rtl92cu_hal_cfg)}, /*Belkin - ISY*/
|
||||
{RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/
|
||||
{RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/
|
||||
{RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/
|
||||
|
@ -698,13 +698,14 @@ static void pn533_wq_cmd(struct work_struct *work)
|
||||
|
||||
cmd = list_first_entry(&dev->cmd_queue, struct pn533_cmd, queue);
|
||||
|
||||
list_del(&cmd->queue);
|
||||
|
||||
mutex_unlock(&dev->cmd_lock);
|
||||
|
||||
__pn533_send_cmd_frame_async(dev, cmd->out_frame, cmd->in_frame,
|
||||
cmd->in_frame_len, cmd->cmd_complete,
|
||||
cmd->arg, cmd->flags);
|
||||
|
||||
list_del(&cmd->queue);
|
||||
kfree(cmd);
|
||||
}
|
||||
|
||||
@ -1678,11 +1679,14 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev,
|
||||
static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
|
||||
u8 *params, int params_len)
|
||||
{
|
||||
struct pn533_cmd_jump_dep *cmd;
|
||||
struct pn533_cmd_jump_dep_response *resp;
|
||||
struct nfc_target nfc_target;
|
||||
u8 target_gt_len;
|
||||
int rc;
|
||||
struct pn533_cmd_jump_dep *cmd = (struct pn533_cmd_jump_dep *)arg;
|
||||
u8 active = cmd->active;
|
||||
|
||||
kfree(arg);
|
||||
|
||||
if (params_len == -ENOENT) {
|
||||
nfc_dev_dbg(&dev->interface->dev, "");
|
||||
@ -1704,7 +1708,6 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
|
||||
}
|
||||
|
||||
resp = (struct pn533_cmd_jump_dep_response *) params;
|
||||
cmd = (struct pn533_cmd_jump_dep *) arg;
|
||||
rc = resp->status & PN533_CMD_RET_MASK;
|
||||
if (rc != PN533_CMD_RET_SUCCESS) {
|
||||
nfc_dev_err(&dev->interface->dev,
|
||||
@ -1734,7 +1737,7 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
|
||||
if (rc == 0)
|
||||
rc = nfc_dep_link_is_up(dev->nfc_dev,
|
||||
dev->nfc_dev->targets[0].idx,
|
||||
!cmd->active, NFC_RF_INITIATOR);
|
||||
!active, NFC_RF_INITIATOR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1819,12 +1822,8 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
|
||||
rc = pn533_send_cmd_frame_async(dev, dev->out_frame, dev->in_frame,
|
||||
dev->in_maxlen, pn533_in_dep_link_up_complete,
|
||||
cmd, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
|
||||
out:
|
||||
kfree(cmd);
|
||||
if (rc < 0)
|
||||
kfree(cmd);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -2078,8 +2077,12 @@ error:
|
||||
static int pn533_tm_send_complete(struct pn533 *dev, void *arg,
|
||||
u8 *params, int params_len)
|
||||
{
|
||||
struct sk_buff *skb_out = arg;
|
||||
|
||||
nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
|
||||
|
||||
dev_kfree_skb(skb_out);
|
||||
|
||||
if (params_len < 0) {
|
||||
nfc_dev_err(&dev->interface->dev,
|
||||
"Error %d when sending data",
|
||||
@ -2117,7 +2120,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
|
||||
|
||||
rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame,
|
||||
dev->in_maxlen, pn533_tm_send_complete,
|
||||
NULL, GFP_KERNEL);
|
||||
skb, GFP_KERNEL);
|
||||
if (rc) {
|
||||
nfc_dev_err(&dev->interface->dev,
|
||||
"Error %d when trying to send data", rc);
|
||||
|
@ -429,6 +429,17 @@ static struct attribute_group netstat_group = {
|
||||
.name = "statistics",
|
||||
.attrs = netstat_attrs,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
|
||||
static struct attribute *wireless_attrs[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group wireless_group = {
|
||||
.name = "wireless",
|
||||
.attrs = wireless_attrs,
|
||||
};
|
||||
#endif
|
||||
#endif /* CONFIG_SYSFS */
|
||||
|
||||
#ifdef CONFIG_RPS
|
||||
@ -1409,6 +1420,15 @@ int netdev_register_kobject(struct net_device *net)
|
||||
groups++;
|
||||
|
||||
*groups++ = &netstat_group;
|
||||
|
||||
#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
|
||||
if (net->ieee80211_ptr)
|
||||
*groups++ = &wireless_group;
|
||||
#if IS_ENABLED(CONFIG_WIRELESS_EXT)
|
||||
else if (net->wireless_handlers)
|
||||
*groups++ = &wireless_group;
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CONFIG_SYSFS */
|
||||
|
||||
error = device_add(dev);
|
||||
|
@ -1151,10 +1151,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
mutex_lock(&sdata->u.ibss.mtx);
|
||||
|
||||
sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
|
||||
memset(sdata->u.ibss.bssid, 0, ETH_ALEN);
|
||||
sdata->u.ibss.ssid_len = 0;
|
||||
|
||||
active_ibss = ieee80211_sta_active_ibss(sdata);
|
||||
|
||||
if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
|
||||
@ -1175,6 +1171,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
||||
}
|
||||
}
|
||||
|
||||
ifibss->state = IEEE80211_IBSS_MLME_SEARCH;
|
||||
memset(ifibss->bssid, 0, ETH_ALEN);
|
||||
ifibss->ssid_len = 0;
|
||||
|
||||
sta_info_flush(sdata->local, sdata);
|
||||
|
||||
spin_lock_bh(&ifibss->incomplete_lock);
|
||||
|
@ -1210,7 +1210,7 @@ int nfc_llcp_register_device(struct nfc_dev *ndev)
|
||||
local->remote_miu = LLCP_DEFAULT_MIU;
|
||||
local->remote_lto = LLCP_DEFAULT_LTO;
|
||||
|
||||
list_add(&llcp_devices, &local->list);
|
||||
list_add(&local->list, &llcp_devices);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user