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
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.
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>
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
22 *cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
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.
30 + err = brcmf_fweh_activate_events(ifp);
32 + brcmf_err("FWEH activation failed (%d)\n", err);
33 + goto wiphy_unreg_out;
36 err = brcmf_p2p_attach(cfg, p2pdev_forced);
38 @@ -6259,6 +6270,13 @@ struct brcmf_cfg80211_info *brcmf_cfg802
39 brcmf_notify_tdls_peer_event);
42 + /* (re-) activate FWEH event handling */
43 + err = brcmf_fweh_activate_events(ifp);
45 + brcmf_err("FWEH activation failed (%d)\n", err);
46 + goto 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
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,
60 + ndev = alloc_netdev(sizeof(*ifp), is_p2pdev ? "p2p%d" : name,
61 + NET_NAME_UNKNOWN, ether_setup);
63 return ERR_PTR(-ENOMEM);
65 @@ -1021,12 +1021,7 @@ int brcmf_bus_start(struct device *dev)
69 - if (brcmf_p2p_enable)
70 - p2p_ifp = brcmf_add_if(drvr, 1, 0, false, "p2p%d", NULL);
73 - if (IS_ERR(p2p_ifp))
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)
83 - ret = brcmf_fweh_activate_events(ifp);
87 ret = brcmf_net_attach(ifp, false);
89 + if ((!ret) && (brcmf_p2p_enable)) {
90 + p2p_ifp = drvr->iflist[1];
92 + ret = brcmf_net_p2p_attach(p2p_ifp);
96 brcmf_err("failed: %d\n", ret);
97 @@ -1076,20 +1073,12 @@ fail:
98 brcmf_fws_del_interface(ifp);
99 brcmf_fws_deinit(drvr);
101 - if (drvr->iflist[0]) {
103 brcmf_net_detach(ifp->ndev);
104 - drvr->iflist[0] = NULL;
108 brcmf_net_detach(p2p_ifp->ndev);
109 - drvr->iflist[1] = NULL;
113 - if ((brcmf_p2p_enable) && (p2p_ifp))
114 - if (brcmf_net_p2p_attach(p2p_ifp) < 0)
115 - brcmf_p2p_enable = 0;
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);
126 - brcmf_fws_add_interface(ifp);
128 + brcmf_fws_add_interface(ifp);
129 if (!drvr->fweh.evt_handler[BRCMF_E_IF])
130 if (brcmf_net_attach(ifp, false) < 0)
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.
137 * @cfg: driver private data for cfg80211 interface.
138 + * @p2pdev_forced: create p2p device interface at attach.
140 s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
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;
148 + struct brcmf_if *pri_ifp;
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;
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);
170 p2p->p2pdev_dynamically = true;
173 - p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
175 - if (IS_ERR(p2p_vif)) {
176 - brcmf_err("could not create discovery vif\n");
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));
187 - p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
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);
193 - brcmf_fweh_p2pdev_setup(pri_ifp, true);
195 - /* Initialize P2P Discovery in the firmware */
196 - err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
198 - brcmf_err("set p2p_disc error\n");
199 - brcmf_free_vif(p2p_vif);
202 - /* obtain bsscfg index for P2P discovery */
203 - err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
205 - brcmf_err("retrieving discover bsscfg index failed\n");
206 - brcmf_free_vif(p2p_vif);
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);
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);
222 - brcmf_fweh_p2pdev_setup(pri_ifp, false);