summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/intel/iwlwifi/pcie
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/pcie')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/drv.c4
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/rx.c27
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/trans.c9
3 files changed, 39 insertions, 1 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 0ed7d68..feba7d7 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -73,9 +73,11 @@
#include <linux/pm_runtime.h>
#include <linux/pci.h>
#include <linux/pci-aspm.h>
-#include <linux/acpi.h>
+#ifdef CONFIG_ACPI
+#include <linux/acpi.h>
#include "fw/acpi.h"
+#endif
#include "iwl-trans.h"
#include "iwl-drv.h"
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
index d15f5ba..0f6a767 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
@@ -38,6 +38,33 @@
#include "internal.h"
#include "iwl-op-mode.h"
+#if LINUX_VERSION_IS_LESS(3,7,0)
+/*
+ * atomic_dec_if_positive - decrement by 1 if old value positive
+ * @v: pointer of type atomic_t
+ *
+ * The function returns the old value of *v minus 1, even if
+ * the atomic variable, v, was not decremented.
+ */
+#ifndef atomic_dec_if_positive
+static inline int atomic_dec_if_positive(atomic_t *v)
+{
+ int c, old, dec;
+ c = atomic_read(v);
+ for (;;) {
+ dec = c - 1;
+ if (unlikely(dec < 0))
+ break;
+ old = atomic_cmpxchg((v), c, dec);
+ if (likely(old == c))
+ break;
+ c = old;
+ }
+ return dec;
+}
+#endif
+#endif
+
/******************************************************************************
*
* RX path functions
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 5613339..016b505 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1950,10 +1950,19 @@ static void iwl_trans_pcie_removal_wk(struct work_struct *wk)
dev_err(&pdev->dev, "Device gone - attempting removal\n");
kobject_uevent_env(&pdev->dev.kobj, KOBJ_CHANGE, prop);
+#if LINUX_VERSION_IS_GEQ(3,14,0)
pci_lock_rescan_remove();
+#endif
pci_dev_put(pdev);
+#if LINUX_VERSION_IS_LESS(3,2,0)
+ pci_stop_bus_device(pdev);
+ pci_remove_bus_device(pdev);
+#else
pci_stop_and_remove_bus_device(pdev);
+#endif
+#if LINUX_VERSION_IS_GEQ(3,14,0)
pci_unlock_rescan_remove();
+#endif
kfree(removal);
module_put(THIS_MODULE);