ath10k-firmware: remove dependency on kmod-ath10k so that it can be selected instead
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 374-0008-brcmfmac-Use-new-methods-for-pcie-Power-Management.patch
1 From: Hante Meuleman <meuleman@broadcom.com>
2 Date: Thu, 29 Oct 2015 20:33:18 +0100
3 Subject: [PATCH] brcmfmac: Use new methods for pcie Power Management.
4
5 Currently the legacy methods suspend and resume are used for pcie
6 devices. This is not the preferable method and is also causing
7 issues with some setups when doing hibernate. Changing this to
8 use the new PM methods.
9
10 Reviewed-by: Arend Van Spriel <arend@broadcom.com>
11 Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
12 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
13 Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
14 Signed-off-by: Arend van Spriel <arend@broadcom.com>
15 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
16 ---
17
18 --- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
19 +++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
20 @@ -1388,10 +1388,6 @@ static void brcmf_pcie_wowl_config(struc
21  
22         brcmf_dbg(PCIE, "Configuring WOWL, enabled=%d\n", enabled);
23         devinfo->wowl_enabled = enabled;
24 -       if (enabled)
25 -               device_set_wakeup_enable(&devinfo->pdev->dev, true);
26 -       else
27 -               device_set_wakeup_enable(&devinfo->pdev->dev, false);
28  }
29  
30  
31 @@ -1961,15 +1957,14 @@ brcmf_pcie_remove(struct pci_dev *pdev)
32  #ifdef CONFIG_PM
33  
34  
35 -static int brcmf_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
36 +static int brcmf_pcie_pm_enter_D3(struct device *dev)
37  {
38         struct brcmf_pciedev_info *devinfo;
39         struct brcmf_bus *bus;
40 -       int err;
41  
42 -       brcmf_dbg(PCIE, "Enter, state=%d, pdev=%p\n", state.event, pdev);
43 +       brcmf_err("Enter\n");
44  
45 -       bus = dev_get_drvdata(&pdev->dev);
46 +       bus = dev_get_drvdata(dev);
47         devinfo = bus->bus_priv.pcie->devinfo;
48  
49         brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
50 @@ -1984,62 +1979,45 @@ static int brcmf_pcie_suspend(struct pci
51                 brcmf_err("Timeout on response for entering D3 substate\n");
52                 return -EIO;
53         }
54 -       brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM_IN_USE);
55  
56 -       err = pci_save_state(pdev);
57 -       if (err)
58 -               brcmf_err("pci_save_state failed, err=%d\n", err);
59 -       if ((err) || (!devinfo->wowl_enabled)) {
60 -               brcmf_chip_detach(devinfo->ci);
61 -               devinfo->ci = NULL;
62 -               brcmf_pcie_remove(pdev);
63 -               return 0;
64 -       }
65 +       devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
66  
67 -       return pci_prepare_to_sleep(pdev);
68 +       return 0;
69  }
70  
71 -static int brcmf_pcie_resume(struct pci_dev *pdev)
72 +
73 +static int brcmf_pcie_pm_leave_D3(struct device *dev)
74  {
75         struct brcmf_pciedev_info *devinfo;
76         struct brcmf_bus *bus;
77 +       struct pci_dev *pdev;
78         int err;
79  
80 -       bus = dev_get_drvdata(&pdev->dev);
81 -       brcmf_dbg(PCIE, "Enter, pdev=%p, bus=%p\n", pdev, bus);
82 +       brcmf_err("Enter\n");
83  
84 -       err = pci_set_power_state(pdev, PCI_D0);
85 -       if (err) {
86 -               brcmf_err("pci_set_power_state failed, err=%d\n", err);
87 -               goto cleanup;
88 -       }
89 -       pci_restore_state(pdev);
90 -       pci_enable_wake(pdev, PCI_D3hot, false);
91 -       pci_enable_wake(pdev, PCI_D3cold, false);
92 +       bus = dev_get_drvdata(dev);
93 +       devinfo = bus->bus_priv.pcie->devinfo;
94 +       brcmf_dbg(PCIE, "Enter, dev=%p, bus=%p\n", dev, bus);
95  
96         /* Check if device is still up and running, if so we are ready */
97 -       if (bus) {
98 -               devinfo = bus->bus_priv.pcie->devinfo;
99 -               if (brcmf_pcie_read_reg32(devinfo,
100 -                                         BRCMF_PCIE_PCIE2REG_INTMASK) != 0) {
101 -                       if (brcmf_pcie_send_mb_data(devinfo,
102 -                                                   BRCMF_H2D_HOST_D0_INFORM))
103 -                               goto cleanup;
104 -                       brcmf_dbg(PCIE, "Hot resume, continue....\n");
105 -                       brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
106 -                       brcmf_bus_change_state(bus, BRCMF_BUS_UP);
107 -                       brcmf_pcie_intr_enable(devinfo);
108 -                       return 0;
109 -               }
110 +       if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_INTMASK) != 0) {
111 +               brcmf_dbg(PCIE, "Try to wakeup device....\n");
112 +               if (brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM))
113 +                       goto cleanup;
114 +               brcmf_dbg(PCIE, "Hot resume, continue....\n");
115 +               devinfo->state = BRCMFMAC_PCIE_STATE_UP;
116 +               brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
117 +               brcmf_bus_change_state(bus, BRCMF_BUS_UP);
118 +               brcmf_pcie_intr_enable(devinfo);
119 +               return 0;
120         }
121  
122  cleanup:
123 -       if (bus) {
124 -               devinfo = bus->bus_priv.pcie->devinfo;
125 -               brcmf_chip_detach(devinfo->ci);
126 -               devinfo->ci = NULL;
127 -               brcmf_pcie_remove(pdev);
128 -       }
129 +       brcmf_chip_detach(devinfo->ci);
130 +       devinfo->ci = NULL;
131 +       pdev = devinfo->pdev;
132 +       brcmf_pcie_remove(pdev);
133 +
134         err = brcmf_pcie_probe(pdev, NULL);
135         if (err)
136                 brcmf_err("probe after resume failed, err=%d\n", err);
137 @@ -2048,6 +2026,14 @@ cleanup:
138  }
139  
140  
141 +static const struct dev_pm_ops brcmf_pciedrvr_pm = {
142 +       .suspend = brcmf_pcie_pm_enter_D3,
143 +       .resume = brcmf_pcie_pm_leave_D3,
144 +       .freeze = brcmf_pcie_pm_enter_D3,
145 +       .restore = brcmf_pcie_pm_leave_D3,
146 +};
147 +
148 +
149  #endif /* CONFIG_PM */
150  
151  
152 @@ -2086,9 +2072,8 @@ static struct pci_driver brcmf_pciedrvr
153         .probe = brcmf_pcie_probe,
154         .remove = brcmf_pcie_remove,
155  #ifdef CONFIG_PM
156 -       .suspend = brcmf_pcie_suspend,
157 -       .resume = brcmf_pcie_resume
158 -#endif /* CONFIG_PM */
159 +       .driver.pm = &brcmf_pciedrvr_pm,
160 +#endif
161  };
162  
163