ath10k-firmware: remove dependency on kmod-ath10k so that it can be selected instead
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 372-0005-brcmfmac-Rework-p2p-attach-use-single-method-for-p2p.patch
1 From: Hante Meuleman <meuleman@broadcom.com>
2 Date: Thu, 8 Oct 2015 20:33:15 +0200
3 Subject: [PATCH] brcmfmac: Rework p2p attach, use single method for p2p dev
4  creation.
5
6 When module param p2pon is used a p2p device is created at init.
7 This patch reworks how this is done by using the same method as
8 for a dynamically (by user space) created p2p device.
9
10 Reviewed-by: Arend Van Spriel <arend@broadcom.com>
11 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
12 Reviewed-by: Franky (Zhenhui) Lin <frankyl@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/cfg80211.c
19 +++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
20 @@ -6237,6 +6237,17 @@ struct brcmf_cfg80211_info *brcmf_cfg802
21                 else
22                         *cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
23         }
24 +       /* p2p might require that "if-events" get processed by fweh. So
25 +        * activate the already registered event handlers now and activate
26 +        * the rest when initialization has completed. drvr->config needs to
27 +        * be assigned before activating events.
28 +        */
29 +       drvr->config = cfg;
30 +       err = brcmf_fweh_activate_events(ifp);
31 +       if (err) {
32 +               brcmf_err("FWEH activation failed (%d)\n", err);
33 +               goto wiphy_unreg_out;
34 +       }
35  
36         err = brcmf_p2p_attach(cfg, p2pdev_forced);
37         if (err) {
38 @@ -6259,6 +6270,13 @@ struct brcmf_cfg80211_info *brcmf_cfg802
39                                     brcmf_notify_tdls_peer_event);
40         }
41  
42 +       /* (re-) activate FWEH event handling */
43 +       err = brcmf_fweh_activate_events(ifp);
44 +       if (err) {
45 +               brcmf_err("FWEH activation failed (%d)\n", err);
46 +               goto wiphy_unreg_out;
47 +       }
48 +
49         return cfg;
50  
51  wiphy_unreg_out:
52 --- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
53 +++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
54 @@ -828,8 +828,8 @@ struct brcmf_if *brcmf_add_if(struct brc
55         } else {
56                 brcmf_dbg(INFO, "allocate netdev interface\n");
57                 /* Allocate netdev, including space for private structure */
58 -               ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN,
59 -                                   ether_setup);
60 +               ndev = alloc_netdev(sizeof(*ifp), is_p2pdev ? "p2p%d" : name,
61 +                                   NET_NAME_UNKNOWN, ether_setup);
62                 if (!ndev)
63                         return ERR_PTR(-ENOMEM);
64  
65 @@ -1021,12 +1021,7 @@ int brcmf_bus_start(struct device *dev)
66         if (IS_ERR(ifp))
67                 return PTR_ERR(ifp);
68  
69 -       if (brcmf_p2p_enable)
70 -               p2p_ifp = brcmf_add_if(drvr, 1, 0, false, "p2p%d", NULL);
71 -       else
72 -               p2p_ifp = NULL;
73 -       if (IS_ERR(p2p_ifp))
74 -               p2p_ifp = NULL;
75 +       p2p_ifp = NULL;
76  
77         /* signal bus ready */
78         brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
79 @@ -1060,11 +1055,13 @@ int brcmf_bus_start(struct device *dev)
80                 goto fail;
81         }
82  
83 -       ret = brcmf_fweh_activate_events(ifp);
84 -       if (ret < 0)
85 -               goto fail;
86 -
87         ret = brcmf_net_attach(ifp, false);
88 +
89 +       if ((!ret) && (brcmf_p2p_enable)) {
90 +               p2p_ifp = drvr->iflist[1];
91 +               if (p2p_ifp)
92 +                       ret = brcmf_net_p2p_attach(p2p_ifp);
93 +       }
94  fail:
95         if (ret < 0) {
96                 brcmf_err("failed: %d\n", ret);
97 @@ -1076,20 +1073,12 @@ fail:
98                         brcmf_fws_del_interface(ifp);
99                         brcmf_fws_deinit(drvr);
100                 }
101 -               if (drvr->iflist[0]) {
102 +               if (ifp)
103                         brcmf_net_detach(ifp->ndev);
104 -                       drvr->iflist[0] = NULL;
105 -               }
106 -               if (p2p_ifp) {
107 +               if (p2p_ifp)
108                         brcmf_net_detach(p2p_ifp->ndev);
109 -                       drvr->iflist[1] = NULL;
110 -               }
111                 return ret;
112         }
113 -       if ((brcmf_p2p_enable) && (p2p_ifp))
114 -               if (brcmf_net_p2p_attach(p2p_ifp) < 0)
115 -                       brcmf_p2p_enable = 0;
116 -
117         return 0;
118  }
119  
120 --- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
121 +++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
122 @@ -213,7 +213,8 @@ static void brcmf_fweh_handle_if_event(s
123                                    is_p2pdev, emsg->ifname, emsg->addr);
124                 if (IS_ERR(ifp))
125                         return;
126 -               brcmf_fws_add_interface(ifp);
127 +               if (!is_p2pdev)
128 +                       brcmf_fws_add_interface(ifp);
129                 if (!drvr->fweh.evt_handler[BRCMF_E_IF])
130                         if (brcmf_net_attach(ifp, false) < 0)
131                                 return;
132 --- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
133 +++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
134 @@ -2350,83 +2350,30 @@ void brcmf_p2p_stop_device(struct wiphy
135   * brcmf_p2p_attach() - attach for P2P.
136   *
137   * @cfg: driver private data for cfg80211 interface.
138 + * @p2pdev_forced: create p2p device interface at attach.
139   */
140  s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
141  {
142 -       struct brcmf_if *pri_ifp;
143 -       struct brcmf_if *p2p_ifp;
144 -       struct brcmf_cfg80211_vif *p2p_vif;
145         struct brcmf_p2p_info *p2p;
146 -       struct brcmf_pub *drvr;
147 -       s32 bssidx;
148 +       struct brcmf_if *pri_ifp;
149         s32 err = 0;
150 +       void *err_ptr;
151  
152         p2p = &cfg->p2p;
153         p2p->cfg = cfg;
154  
155 -       drvr = cfg->pub;
156 -
157 -       pri_ifp = brcmf_get_ifp(drvr, 0);
158 +       pri_ifp = brcmf_get_ifp(cfg->pub, 0);
159         p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
160  
161         if (p2pdev_forced) {
162 -               p2p_ifp = drvr->iflist[1];
163 +               err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
164 +               if (IS_ERR(err_ptr)) {
165 +                       brcmf_err("P2P device creation failed.\n");
166 +                       err = PTR_ERR(err_ptr);
167 +               }
168         } else {
169 -               p2p_ifp = NULL;
170                 p2p->p2pdev_dynamically = true;
171         }
172 -       if (p2p_ifp) {
173 -               p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
174 -                                         false);
175 -               if (IS_ERR(p2p_vif)) {
176 -                       brcmf_err("could not create discovery vif\n");
177 -                       err = -ENOMEM;
178 -                       goto exit;
179 -               }
180 -
181 -               p2p_vif->ifp = p2p_ifp;
182 -               p2p_ifp->vif = p2p_vif;
183 -               p2p_vif->wdev.netdev = p2p_ifp->ndev;
184 -               p2p_ifp->ndev->ieee80211_ptr = &p2p_vif->wdev;
185 -               SET_NETDEV_DEV(p2p_ifp->ndev, wiphy_dev(cfg->wiphy));
186 -
187 -               p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
188 -
189 -               brcmf_p2p_generate_bss_mac(p2p, NULL);
190 -               memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
191 -               brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
192 -
193 -               brcmf_fweh_p2pdev_setup(pri_ifp, true);
194 -
195 -               /* Initialize P2P Discovery in the firmware */
196 -               err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
197 -               if (err < 0) {
198 -                       brcmf_err("set p2p_disc error\n");
199 -                       brcmf_free_vif(p2p_vif);
200 -                       goto exit;
201 -               }
202 -               /* obtain bsscfg index for P2P discovery */
203 -               err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
204 -               if (err < 0) {
205 -                       brcmf_err("retrieving discover bsscfg index failed\n");
206 -                       brcmf_free_vif(p2p_vif);
207 -                       goto exit;
208 -               }
209 -               /* Verify that firmware uses same bssidx as driver !! */
210 -               if (p2p_ifp->bssidx != bssidx) {
211 -                       brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
212 -                                 bssidx, p2p_ifp->bssidx);
213 -                       brcmf_free_vif(p2p_vif);
214 -                       goto exit;
215 -               }
216 -
217 -               init_completion(&p2p->send_af_done);
218 -               INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
219 -               init_completion(&p2p->afx_hdl.act_frm_scan);
220 -               init_completion(&p2p->wait_next_af);
221 -exit:
222 -               brcmf_fweh_p2pdev_setup(pri_ifp, false);
223 -       }
224         return err;
225  }
226