|
@@ -36,8 +36,6 @@ static u8 user_rmmod;
|
|
|
static struct mwifiex_if_ops pcie_ops;
|
|
|
|
|
|
static struct semaphore add_remove_card_sem;
|
|
|
-static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter);
|
|
|
-static int mwifiex_pcie_resume(struct pci_dev *pdev);
|
|
|
|
|
|
static int
|
|
|
mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
|
|
@@ -78,6 +76,80 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Kernel needs to suspend all functions separately. Therefore all
|
|
|
+ * registered functions must have drivers with suspend and resume
|
|
|
+ * methods. Failing that the kernel simply removes the whole card.
|
|
|
+ *
|
|
|
+ * If already not suspended, this function allocates and sends a host
|
|
|
+ * sleep activate request to the firmware and turns off the traffic.
|
|
|
+ */
|
|
|
+static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
|
+{
|
|
|
+ struct mwifiex_adapter *adapter;
|
|
|
+ struct pcie_service_card *card;
|
|
|
+ int hs_actived;
|
|
|
+
|
|
|
+ if (pdev) {
|
|
|
+ card = (struct pcie_service_card *) pci_get_drvdata(pdev);
|
|
|
+ if (!card || !card->adapter) {
|
|
|
+ pr_err("Card or adapter structure is not valid\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ pr_err("PCIE device is not specified\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ adapter = card->adapter;
|
|
|
+
|
|
|
+ hs_actived = mwifiex_enable_hs(adapter);
|
|
|
+
|
|
|
+ /* Indicate device suspended */
|
|
|
+ adapter->is_suspended = true;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Kernel needs to suspend all functions separately. Therefore all
|
|
|
+ * registered functions must have drivers with suspend and resume
|
|
|
+ * methods. Failing that the kernel simply removes the whole card.
|
|
|
+ *
|
|
|
+ * If already not resumed, this function turns on the traffic and
|
|
|
+ * sends a host sleep cancel request to the firmware.
|
|
|
+ */
|
|
|
+static int mwifiex_pcie_resume(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ struct mwifiex_adapter *adapter;
|
|
|
+ struct pcie_service_card *card;
|
|
|
+
|
|
|
+ if (pdev) {
|
|
|
+ card = (struct pcie_service_card *) pci_get_drvdata(pdev);
|
|
|
+ if (!card || !card->adapter) {
|
|
|
+ pr_err("Card or adapter structure is not valid\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ pr_err("PCIE device is not specified\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ adapter = card->adapter;
|
|
|
+
|
|
|
+ if (!adapter->is_suspended) {
|
|
|
+ dev_warn(adapter->dev, "Device already resumed\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ adapter->is_suspended = false;
|
|
|
+
|
|
|
+ mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
|
|
|
+ MWIFIEX_ASYNC_CMD);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* This function probes an mwifiex device and registers it. It allocates
|
|
|
* the card structure, enables PCIE function number and initiates the
|
|
@@ -159,80 +231,6 @@ static void mwifiex_pcie_remove(struct pci_dev *pdev)
|
|
|
kfree(card);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Kernel needs to suspend all functions separately. Therefore all
|
|
|
- * registered functions must have drivers with suspend and resume
|
|
|
- * methods. Failing that the kernel simply removes the whole card.
|
|
|
- *
|
|
|
- * If already not suspended, this function allocates and sends a host
|
|
|
- * sleep activate request to the firmware and turns off the traffic.
|
|
|
- */
|
|
|
-static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
|
-{
|
|
|
- struct mwifiex_adapter *adapter;
|
|
|
- struct pcie_service_card *card;
|
|
|
- int hs_actived;
|
|
|
-
|
|
|
- if (pdev) {
|
|
|
- card = (struct pcie_service_card *) pci_get_drvdata(pdev);
|
|
|
- if (!card || !card->adapter) {
|
|
|
- pr_err("Card or adapter structure is not valid\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
- } else {
|
|
|
- pr_err("PCIE device is not specified\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- adapter = card->adapter;
|
|
|
-
|
|
|
- hs_actived = mwifiex_enable_hs(adapter);
|
|
|
-
|
|
|
- /* Indicate device suspended */
|
|
|
- adapter->is_suspended = true;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * Kernel needs to suspend all functions separately. Therefore all
|
|
|
- * registered functions must have drivers with suspend and resume
|
|
|
- * methods. Failing that the kernel simply removes the whole card.
|
|
|
- *
|
|
|
- * If already not resumed, this function turns on the traffic and
|
|
|
- * sends a host sleep cancel request to the firmware.
|
|
|
- */
|
|
|
-static int mwifiex_pcie_resume(struct pci_dev *pdev)
|
|
|
-{
|
|
|
- struct mwifiex_adapter *adapter;
|
|
|
- struct pcie_service_card *card;
|
|
|
-
|
|
|
- if (pdev) {
|
|
|
- card = (struct pcie_service_card *) pci_get_drvdata(pdev);
|
|
|
- if (!card || !card->adapter) {
|
|
|
- pr_err("Card or adapter structure is not valid\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
- } else {
|
|
|
- pr_err("PCIE device is not specified\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- adapter = card->adapter;
|
|
|
-
|
|
|
- if (!adapter->is_suspended) {
|
|
|
- dev_warn(adapter->dev, "Device already resumed\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- adapter->is_suspended = false;
|
|
|
-
|
|
|
- mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
|
|
|
- MWIFIEX_ASYNC_CMD);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
|
|
|
{
|
|
|
PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
|