Commit 9cb0aec9 authored by David S. Miller's avatar David S. Miller

Merge tag 'wireless-drivers-for-davem-2019-10-15' of...

Merge tag 'wireless-drivers-for-davem-2019-10-15' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers

Kalle Valo says:

====================
wireless-drivers fixes for 5.4

Second set of fixes for 5.4. ath10k regression and iwlwifi BAD_COMMAND
bug are the ones getting most reports at the moment.

ath10k

* fix throughput regression on QCA98XX

iwlwifi

* fix initialization of 3168 devices (the infamous BAD_COMMAND bug)

* other smaller fixes

rt2x00

* don't include input-polldev.h header

* fix hw reset to work during first 5 minutes of system run
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 8c16b55b d79749f7
...@@ -2118,13 +2118,16 @@ static int ath10k_init_uart(struct ath10k *ar) ...@@ -2118,13 +2118,16 @@ static int ath10k_init_uart(struct ath10k *ar)
return ret; return ret;
} }
if (!uart_print && ar->hw_params.uart_pin_workaround) { if (!uart_print) {
if (ar->hw_params.uart_pin_workaround) {
ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin, ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin,
ar->hw_params.uart_pin); ar->hw_params.uart_pin);
if (ret) { if (ret) {
ath10k_warn(ar, "failed to set UART TX pin: %d", ret); ath10k_warn(ar, "failed to set UART TX pin: %d",
ret);
return ret; return ret;
} }
}
return 0; return 0;
} }
......
...@@ -162,12 +162,13 @@ int iwl_acpi_get_mcc(struct device *dev, char *mcc) ...@@ -162,12 +162,13 @@ int iwl_acpi_get_mcc(struct device *dev, char *mcc)
wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE, wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE,
&tbl_rev); &tbl_rev);
if (IS_ERR(wifi_pkg) || tbl_rev != 0) { if (IS_ERR(wifi_pkg)) {
ret = PTR_ERR(wifi_pkg); ret = PTR_ERR(wifi_pkg);
goto out_free; goto out_free;
} }
if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
tbl_rev != 0) {
ret = -EINVAL; ret = -EINVAL;
goto out_free; goto out_free;
} }
...@@ -224,12 +225,13 @@ int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk) ...@@ -224,12 +225,13 @@ int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk)
wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE, wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE,
&tbl_rev); &tbl_rev);
if (IS_ERR(wifi_pkg) || tbl_rev != 0) { if (IS_ERR(wifi_pkg)) {
ret = PTR_ERR(wifi_pkg); ret = PTR_ERR(wifi_pkg);
goto out_free; goto out_free;
} }
if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
tbl_rev != 0) {
ret = -EINVAL; ret = -EINVAL;
goto out_free; goto out_free;
} }
......
...@@ -646,6 +646,7 @@ static struct scatterlist *alloc_sgtable(int size) ...@@ -646,6 +646,7 @@ static struct scatterlist *alloc_sgtable(int size)
if (new_page) if (new_page)
__free_page(new_page); __free_page(new_page);
} }
kfree(table);
return NULL; return NULL;
} }
alloc_size = min_t(int, size, PAGE_SIZE); alloc_size = min_t(int, size, PAGE_SIZE);
......
...@@ -112,38 +112,38 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf); ...@@ -112,38 +112,38 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf);
*/ */
static inline u32 iwl_umac_prph(struct iwl_trans *trans, u32 ofs) static inline u32 iwl_umac_prph(struct iwl_trans *trans, u32 ofs)
{ {
return ofs + trans->cfg->trans.umac_prph_offset; return ofs + trans->trans_cfg->umac_prph_offset;
} }
static inline u32 iwl_read_umac_prph_no_grab(struct iwl_trans *trans, u32 ofs) static inline u32 iwl_read_umac_prph_no_grab(struct iwl_trans *trans, u32 ofs)
{ {
return iwl_read_prph_no_grab(trans, ofs + return iwl_read_prph_no_grab(trans, ofs +
trans->cfg->trans.umac_prph_offset); trans->trans_cfg->umac_prph_offset);
} }
static inline u32 iwl_read_umac_prph(struct iwl_trans *trans, u32 ofs) static inline u32 iwl_read_umac_prph(struct iwl_trans *trans, u32 ofs)
{ {
return iwl_read_prph(trans, ofs + trans->cfg->trans.umac_prph_offset); return iwl_read_prph(trans, ofs + trans->trans_cfg->umac_prph_offset);
} }
static inline void iwl_write_umac_prph_no_grab(struct iwl_trans *trans, u32 ofs, static inline void iwl_write_umac_prph_no_grab(struct iwl_trans *trans, u32 ofs,
u32 val) u32 val)
{ {
iwl_write_prph_no_grab(trans, ofs + trans->cfg->trans.umac_prph_offset, iwl_write_prph_no_grab(trans, ofs + trans->trans_cfg->umac_prph_offset,
val); val);
} }
static inline void iwl_write_umac_prph(struct iwl_trans *trans, u32 ofs, static inline void iwl_write_umac_prph(struct iwl_trans *trans, u32 ofs,
u32 val) u32 val)
{ {
iwl_write_prph(trans, ofs + trans->cfg->trans.umac_prph_offset, val); iwl_write_prph(trans, ofs + trans->trans_cfg->umac_prph_offset, val);
} }
static inline int iwl_poll_umac_prph_bit(struct iwl_trans *trans, u32 addr, static inline int iwl_poll_umac_prph_bit(struct iwl_trans *trans, u32 addr,
u32 bits, u32 mask, int timeout) u32 bits, u32 mask, int timeout)
{ {
return iwl_poll_prph_bit(trans, addr + return iwl_poll_prph_bit(trans, addr +
trans->cfg->trans.umac_prph_offset, trans->trans_cfg->umac_prph_offset,
bits, mask, timeout); bits, mask, timeout);
} }
......
...@@ -420,6 +420,9 @@ static int iwl_run_unified_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) ...@@ -420,6 +420,9 @@ static int iwl_run_unified_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
}; };
int ret; int ret;
if (mvm->trans->cfg->tx_with_siso_diversity)
init_cfg.init_flags |= cpu_to_le32(BIT(IWL_INIT_PHY));
lockdep_assert_held(&mvm->mutex); lockdep_assert_held(&mvm->mutex);
mvm->rfkill_safe_init_done = false; mvm->rfkill_safe_init_done = false;
...@@ -694,12 +697,13 @@ static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm) ...@@ -694,12 +697,13 @@ static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm)
wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev); ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev);
if (IS_ERR(wifi_pkg) || tbl_rev != 0) { if (IS_ERR(wifi_pkg)) {
ret = PTR_ERR(wifi_pkg); ret = PTR_ERR(wifi_pkg);
goto out_free; goto out_free;
} }
if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
tbl_rev != 0) {
ret = -EINVAL; ret = -EINVAL;
goto out_free; goto out_free;
} }
...@@ -731,13 +735,14 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm) ...@@ -731,13 +735,14 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
ACPI_EWRD_WIFI_DATA_SIZE, &tbl_rev); ACPI_EWRD_WIFI_DATA_SIZE, &tbl_rev);
if (IS_ERR(wifi_pkg) || tbl_rev != 0) { if (IS_ERR(wifi_pkg)) {
ret = PTR_ERR(wifi_pkg); ret = PTR_ERR(wifi_pkg);
goto out_free; goto out_free;
} }
if ((wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) || if ((wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) ||
(wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER)) { (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) ||
tbl_rev != 0) {
ret = -EINVAL; ret = -EINVAL;
goto out_free; goto out_free;
} }
...@@ -791,11 +796,16 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm) ...@@ -791,11 +796,16 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
ACPI_WGDS_WIFI_DATA_SIZE, &tbl_rev); ACPI_WGDS_WIFI_DATA_SIZE, &tbl_rev);
if (IS_ERR(wifi_pkg) || tbl_rev > 1) { if (IS_ERR(wifi_pkg)) {
ret = PTR_ERR(wifi_pkg); ret = PTR_ERR(wifi_pkg);
goto out_free; goto out_free;
} }
if (tbl_rev != 0) {
ret = -EINVAL;
goto out_free;
}
mvm->geo_rev = tbl_rev; mvm->geo_rev = tbl_rev;
for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) { for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) { for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) {
...@@ -889,15 +899,17 @@ static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm) ...@@ -889,15 +899,17 @@ static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm)
* firmware versions. Unfortunately, we don't have a TLV API * firmware versions. Unfortunately, we don't have a TLV API
* flag to rely on, so rely on the major version which is in * flag to rely on, so rely on the major version which is in
* the first byte of ucode_ver. This was implemented * the first byte of ucode_ver. This was implemented
* initially on version 38 and then backported to29 and 17. * initially on version 38 and then backported to 17. It was
* The intention was to have it in 36 as well, but not all * also backported to 29, but only for 7265D devices. The
* 8000 family got this feature enabled. The 8000 family is * intention was to have it in 36 as well, but not all 8000
* the only one using version 36, so skip this version * family got this feature enabled. The 8000 family is the
* entirely. * only one using version 36, so skip this version entirely.
*/ */
return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 38 || return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 38 ||
IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 29 || IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 17 ||
IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 17; (IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 29 &&
((mvm->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==
CSR_HW_REV_TYPE_7265D));
} }
int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
...@@ -1020,11 +1032,16 @@ static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm) ...@@ -1020,11 +1032,16 @@ static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm)
wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
ACPI_PPAG_WIFI_DATA_SIZE, &tbl_rev); ACPI_PPAG_WIFI_DATA_SIZE, &tbl_rev);
if (IS_ERR(wifi_pkg) || tbl_rev != 0) { if (IS_ERR(wifi_pkg)) {
ret = PTR_ERR(wifi_pkg); ret = PTR_ERR(wifi_pkg);
goto out_free; goto out_free;
} }
if (tbl_rev != 0) {
ret = -EINVAL;
goto out_free;
}
enabled = &wifi_pkg->package.elements[1]; enabled = &wifi_pkg->package.elements[1];
if (enabled->type != ACPI_TYPE_INTEGER || if (enabled->type != ACPI_TYPE_INTEGER ||
(enabled->integer.value != 0 && enabled->integer.value != 1)) { (enabled->integer.value != 0 && enabled->integer.value != 1)) {
......
...@@ -4881,11 +4881,11 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm, ...@@ -4881,11 +4881,11 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
if (!iwl_mvm_has_new_rx_api(mvm)) if (!iwl_mvm_has_new_rx_api(mvm))
return; return;
if (notif->sync) {
notif->cookie = mvm->queue_sync_cookie; notif->cookie = mvm->queue_sync_cookie;
if (notif->sync)
atomic_set(&mvm->queue_sync_counter, atomic_set(&mvm->queue_sync_counter,
mvm->trans->num_rx_queues); mvm->trans->num_rx_queues);
}
ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif, ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif,
size, !notif->sync); size, !notif->sync);
...@@ -4905,6 +4905,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm, ...@@ -4905,6 +4905,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
out: out:
atomic_set(&mvm->queue_sync_counter, 0); atomic_set(&mvm->queue_sync_counter, 0);
if (notif->sync)
mvm->queue_sync_cookie++; mvm->queue_sync_cookie++;
} }
......
...@@ -107,13 +107,9 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, ...@@ -107,13 +107,9 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
/* allocate ucode sections in dram and set addresses */ /* allocate ucode sections in dram and set addresses */
ret = iwl_pcie_init_fw_sec(trans, fw, &prph_scratch->dram); ret = iwl_pcie_init_fw_sec(trans, fw, &prph_scratch->dram);
if (ret) { if (ret)
dma_free_coherent(trans->dev, goto err_free_prph_scratch;
sizeof(*prph_scratch),
prph_scratch,
trans_pcie->prph_scratch_dma_addr);
return ret;
}
/* Allocate prph information /* Allocate prph information
* currently we don't assign to the prph info anything, but it would get * currently we don't assign to the prph info anything, but it would get
...@@ -121,16 +117,20 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, ...@@ -121,16 +117,20 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
prph_info = dma_alloc_coherent(trans->dev, sizeof(*prph_info), prph_info = dma_alloc_coherent(trans->dev, sizeof(*prph_info),
&trans_pcie->prph_info_dma_addr, &trans_pcie->prph_info_dma_addr,
GFP_KERNEL); GFP_KERNEL);
if (!prph_info) if (!prph_info) {
return -ENOMEM; ret = -ENOMEM;
goto err_free_prph_scratch;
}
/* Allocate context info */ /* Allocate context info */
ctxt_info_gen3 = dma_alloc_coherent(trans->dev, ctxt_info_gen3 = dma_alloc_coherent(trans->dev,
sizeof(*ctxt_info_gen3), sizeof(*ctxt_info_gen3),
&trans_pcie->ctxt_info_dma_addr, &trans_pcie->ctxt_info_dma_addr,
GFP_KERNEL); GFP_KERNEL);
if (!ctxt_info_gen3) if (!ctxt_info_gen3) {
return -ENOMEM; ret = -ENOMEM;
goto err_free_prph_info;
}
ctxt_info_gen3->prph_info_base_addr = ctxt_info_gen3->prph_info_base_addr =
cpu_to_le64(trans_pcie->prph_info_dma_addr); cpu_to_le64(trans_pcie->prph_info_dma_addr);
...@@ -186,6 +186,20 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, ...@@ -186,6 +186,20 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
iwl_set_bit(trans, CSR_GP_CNTRL, CSR_AUTO_FUNC_INIT); iwl_set_bit(trans, CSR_GP_CNTRL, CSR_AUTO_FUNC_INIT);
return 0; return 0;
err_free_prph_info:
dma_free_coherent(trans->dev,
sizeof(*prph_info),
prph_info,
trans_pcie->prph_info_dma_addr);
err_free_prph_scratch:
dma_free_coherent(trans->dev,
sizeof(*prph_scratch),
prph_scratch,
trans_pcie->prph_scratch_dma_addr);
return ret;
} }
void iwl_pcie_ctxt_info_gen3_free(struct iwl_trans *trans) void iwl_pcie_ctxt_info_gen3_free(struct iwl_trans *trans)
......
...@@ -3272,11 +3272,17 @@ static struct iwl_trans_dump_data ...@@ -3272,11 +3272,17 @@ static struct iwl_trans_dump_data
ptr = cmdq->write_ptr; ptr = cmdq->write_ptr;
for (i = 0; i < cmdq->n_window; i++) { for (i = 0; i < cmdq->n_window; i++) {
u8 idx = iwl_pcie_get_cmd_index(cmdq, ptr); u8 idx = iwl_pcie_get_cmd_index(cmdq, ptr);
u8 tfdidx;
u32 caplen, cmdlen; u32 caplen, cmdlen;
if (trans->trans_cfg->use_tfh)
tfdidx = idx;
else
tfdidx = ptr;
cmdlen = iwl_trans_pcie_get_cmdlen(trans, cmdlen = iwl_trans_pcie_get_cmdlen(trans,
cmdq->tfds + (u8 *)cmdq->tfds +
tfd_size * ptr); tfd_size * tfdidx);
caplen = min_t(u32, TFD_MAX_PAYLOAD_SIZE, cmdlen); caplen = min_t(u32, TFD_MAX_PAYLOAD_SIZE, cmdlen);
if (cmdlen) { if (cmdlen) {
...@@ -3450,6 +3456,15 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, ...@@ -3450,6 +3456,15 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
spin_lock_init(&trans_pcie->reg_lock); spin_lock_init(&trans_pcie->reg_lock);
mutex_init(&trans_pcie->mutex); mutex_init(&trans_pcie->mutex);
init_waitqueue_head(&trans_pcie->ucode_write_waitq); init_waitqueue_head(&trans_pcie->ucode_write_waitq);
trans_pcie->rba.alloc_wq = alloc_workqueue("rb_allocator",
WQ_HIGHPRI | WQ_UNBOUND, 1);
if (!trans_pcie->rba.alloc_wq) {
ret = -ENOMEM;
goto out_free_trans;
}
INIT_WORK(&trans_pcie->rba.rx_alloc, iwl_pcie_rx_allocator_work);
trans_pcie->tso_hdr_page = alloc_percpu(struct iwl_tso_hdr_page); trans_pcie->tso_hdr_page = alloc_percpu(struct iwl_tso_hdr_page);
if (!trans_pcie->tso_hdr_page) { if (!trans_pcie->tso_hdr_page) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -3584,10 +3599,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, ...@@ -3584,10 +3599,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
trans_pcie->inta_mask = CSR_INI_SET_MASK; trans_pcie->inta_mask = CSR_INI_SET_MASK;
} }
trans_pcie->rba.alloc_wq = alloc_workqueue("rb_allocator",
WQ_HIGHPRI | WQ_UNBOUND, 1);
INIT_WORK(&trans_pcie->rba.rx_alloc, iwl_pcie_rx_allocator_work);
#ifdef CONFIG_IWLWIFI_DEBUGFS #ifdef CONFIG_IWLWIFI_DEBUGFS
trans_pcie->fw_mon_data.state = IWL_FW_MON_DBGFS_STATE_CLOSED; trans_pcie->fw_mon_data.state = IWL_FW_MON_DBGFS_STATE_CLOSED;
mutex_init(&trans_pcie->fw_mon_data.mutex); mutex_init(&trans_pcie->fw_mon_data.mutex);
...@@ -3599,6 +3610,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, ...@@ -3599,6 +3610,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
iwl_pcie_free_ict(trans); iwl_pcie_free_ict(trans);
out_no_pci: out_no_pci:
free_percpu(trans_pcie->tso_hdr_page); free_percpu(trans_pcie->tso_hdr_page);
destroy_workqueue(trans_pcie->rba.alloc_wq);
out_free_trans:
iwl_trans_free(trans); iwl_trans_free(trans);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/input-polldev.h>
#include <linux/kfifo.h> #include <linux/kfifo.h>
#include <linux/hrtimer.h> #include <linux/hrtimer.h>
#include <linux/average.h> #include <linux/average.h>
......
...@@ -555,7 +555,7 @@ static ssize_t rt2x00debug_write_restart_hw(struct file *file, ...@@ -555,7 +555,7 @@ static ssize_t rt2x00debug_write_restart_hw(struct file *file,
{ {
struct rt2x00debug_intf *intf = file->private_data; struct rt2x00debug_intf *intf = file->private_data;
struct rt2x00_dev *rt2x00dev = intf->rt2x00dev; struct rt2x00_dev *rt2x00dev = intf->rt2x00dev;
static unsigned long last_reset; static unsigned long last_reset = INITIAL_JIFFIES;
if (!rt2x00_has_cap_restart_hw(rt2x00dev)) if (!rt2x00_has_cap_restart_hw(rt2x00dev))
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment