Lines Matching defs:p2p

18 #include "p2p.h"
22 /* parameters used for p2p escan */
213 * brcmf_p2p_is_pub_action() - true if p2p public type frame.
218 * Determine if action frame is p2p public action type
241 * brcmf_p2p_is_p2p_action() - true if p2p action type frame.
246 * Determine if action frame is p2p action type
268 * brcmf_p2p_is_gas_action() - true if p2p gas action type frame.
273 * Determine if action frame is p2p gas action type
305 * Print information about the p2p action frame
456 * @p2p: P2P specific data.
463 static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
465 struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
485 eth_random_addr(p2p->dev_addr);
487 memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
490 p2p->dev_addr[0] |= 0x02;
496 memcpy(p2p->conn_int_addr, p2p->dev_addr, ETH_ALEN);
497 p2p->conn_int_addr[0] |= 0x02;
498 p2p->conn_int_addr[4] ^= 0x80;
500 memcpy(p2p->conn2_int_addr, p2p->dev_addr, ETH_ALEN);
501 p2p->conn2_int_addr[0] |= 0x02;
502 p2p->conn2_int_addr[4] ^= 0x90;
556 * @p2p: P2P specific data.
560 static s32 brcmf_p2p_deinit_discovery(struct brcmf_p2p_info *p2p)
567 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
571 vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
580 * @p2p: P2P specific data.
584 static int brcmf_p2p_enable_discovery(struct brcmf_p2p_info *p2p)
586 struct brcmf_pub *drvr = p2p->cfg->pub;
591 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
598 if (test_bit(BRCMF_P2P_STATUS_ENABLED, &p2p->status)) {
604 vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
610 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
629 set_bit(BRCMF_P2P_STATUS_ENABLED, &p2p->status);
637 * @p2p: P2P specific data.
643 static s32 brcmf_p2p_escan(struct brcmf_p2p_info *p2p, u32 num_chans,
647 struct brcmf_pub *drvr = p2p->cfg->pub;
664 vif = p2p->bss_idx[bss_type].vif;
702 * set p2p scan parameters.
721 else if (brcmf_get_vif_state_any(p2p->cfg, BRCMF_VIF_STATUS_CONNECTED))
753 /* perform p2p scan on primary device */
756 set_bit(BRCMF_SCAN_STATUS_BUSY, &p2p->cfg->scan_status);
776 struct brcmf_p2p_info *p2p = &cfg->p2p;
799 vif = p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif;
828 chanspecs[i] = channel_to_chanspec(&p2p->cfg->d11inf,
834 err = brcmf_p2p_escan(p2p, num_nodfs, chanspecs, search_state,
851 * Scan ie for p2p ie and look for attribute 6 channel. If available determine
896 struct brcmf_p2p_info *p2p = &cfg->p2p;
906 p2p->afx_hdl.my_listen_chan = err;
908 clear_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
911 err = brcmf_p2p_enable_discovery(p2p);
925 * @p2p: p2p device.
931 brcmf_p2p_discover_listen(struct brcmf_p2p_info *p2p, u16 channel, u32 duration)
933 struct brcmf_pub *drvr = p2p->cfg->pub;
938 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
945 if (test_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN, &p2p->status)) {
953 p2p->cfg->d11inf.encchspec(&ch);
957 set_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN, &p2p->status);
958 p2p->remain_on_channel_cookie++;
979 struct brcmf_p2p_info *p2p = &cfg->p2p;
987 err = brcmf_p2p_enable_discovery(p2p);
990 err = brcmf_p2p_discover_listen(p2p, channel_nr, duration);
994 memcpy(&p2p->remain_on_channel, channel, sizeof(*channel));
995 *cookie = p2p->remain_on_channel_cookie;
1004 * brcmf_p2p_notify_listen_complete() - p2p listen has completed.
1016 struct brcmf_p2p_info *p2p = &cfg->p2p;
1020 &p2p->status)) {
1022 &p2p->status)) {
1024 &p2p->status);
1026 complete(&p2p->wait_next_af);
1030 p2p->remain_on_channel_cookie,
1031 &p2p->remain_on_channel,
1039 * brcmf_p2p_cancel_remain_on_channel() - cancel p2p listen state.
1056 * @p2p: p2p device.
1062 static s32 brcmf_p2p_act_frm_search(struct brcmf_p2p_info *p2p, u16 channel)
1064 struct brcmf_pub *drvr = p2p->cfg->pub;
1087 p2p->cfg->d11inf.encchspec(&ch);
1093 p2p->cfg->d11inf.encchspec(&ch);
1096 p2p->cfg->d11inf.encchspec(&ch);
1099 p2p->cfg->d11inf.encchspec(&ch);
1102 err = brcmf_p2p_escan(p2p, channel_cnt, default_chan_list,
1119 struct brcmf_p2p_info *p2p = container_of(afx_hdl,
1122 struct brcmf_pub *drvr = p2p->cfg->pub;
1130 err = brcmf_p2p_discover_listen(p2p, afx_hdl->my_listen_chan,
1133 err = brcmf_p2p_act_frm_search(p2p, afx_hdl->peer_listen_chan);
1138 &p2p->status))
1147 * @p2p: p2p device info struct.
1150 static s32 brcmf_p2p_af_searching_channel(struct brcmf_p2p_info *p2p)
1152 struct afx_hdl *afx_hdl = &p2p->afx_hdl;
1158 pri_vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
1161 set_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status);
1180 &p2p->status)))
1194 &p2p->status)))
1210 clear_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status);
1227 struct brcmf_p2p_info *p2p = &cfg->p2p;
1228 struct afx_hdl *afx_hdl = &p2p->afx_hdl;
1234 if (!test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status))
1276 struct brcmf_p2p_info *p2p = &cfg->p2p;
1283 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
1301 struct brcmf_p2p_info *p2p = &cfg->p2p;
1302 struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
1305 if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) &&
1306 (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) ||
1307 test_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status))) {
1312 if (p2p->af_sent_channel) {
1320 &p2p->status)) {
1331 * @p2p: p2p device info struct.
1337 brcmf_p2p_gon_req_collision(struct brcmf_p2p_info *p2p, u8 *mac)
1339 struct brcmf_cfg80211_info *cfg = p2p->cfg;
1344 if (!test_bit(BRCMF_P2P_STATUS_WAITING_NEXT_ACT_FRAME, &p2p->status) ||
1345 !p2p->gon_req_action)
1354 ifp = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif->ifp;
1357 p2p->block_gon_req_tx = true;
1362 &p2p->status))
1363 complete(&p2p->afx_hdl.act_frm_scan);
1365 &p2p->status))
1391 struct brcmf_p2p_info *p2p = &cfg->p2p;
1392 struct afx_hdl *afx_hdl = &p2p->afx_hdl;
1425 (brcmf_p2p_gon_req_collision(p2p, (u8 *)e->addr))) {
1427 &p2p->status) &&
1442 clear_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
1449 if (test_bit(BRCMF_P2P_STATUS_WAITING_NEXT_ACT_FRAME, &p2p->status) &&
1450 (p2p->next_af_subtype == action)) {
1453 &p2p->status);
1498 struct brcmf_p2p_info *p2p = &cfg->p2p;
1505 if (!test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status))
1511 &p2p->status);
1512 if (!p2p->wait_for_offchan_complete)
1513 complete(&p2p->send_af_done);
1515 set_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
1523 complete(&p2p->send_af_done);
1532 * @p2p: p2p info struct for vif.
1541 static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
1544 struct brcmf_pub *drvr = p2p->cfg->pub;
1551 reinit_completion(&p2p->send_af_done);
1552 clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
1553 clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
1558 vif = p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif;
1560 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
1569 p2p->af_sent_channel = le32_to_cpu(af_params->channel);
1570 p2p->af_tx_sent_jiffies = jiffies;
1572 if (test_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN, &p2p->status) &&
1573 p2p->af_sent_channel ==
1574 ieee80211_frequency_to_channel(p2p->remain_on_channel.center_freq))
1575 p2p->wait_for_offchan_complete = false;
1577 p2p->wait_for_offchan_complete = true;
1580 (p2p->wait_for_offchan_complete) ?
1583 wait_for_completion_timeout(&p2p->send_af_done, P2P_AF_MAX_WAIT_TIME);
1585 if (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status)) {
1592 clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
1593 clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
1613 struct brcmf_p2p_info *p2p = &cfg->p2p;
1628 set_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
1631 p2p->next_af_subtype = act_frm->subtype + 1;
1632 p2p->gon_req_action = true;
1637 p2p->next_af_subtype = act_frm->subtype + 1;
1644 clear_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
1653 p2p->next_af_subtype = act_frm->subtype + 1;
1664 p2p->next_af_subtype = act_frm->subtype + 1;
1681 p2p->next_af_subtype = act_frm->subtype + 1;
1687 p2p->next_af_subtype = P2P_PAF_GON_REQ;
1693 bphy_err(drvr, "Unknown p2p pub act frame subtype: %d\n",
1722 struct brcmf_p2p_info *p2p = &cfg->p2p;
1726 struct afx_hdl *afx_hdl = &p2p->afx_hdl;
1753 p2p->next_af_subtype = P2P_PAF_SUBTYPE_INVALID;
1754 p2p->gon_req_action = false;
1762 /* p2p public action frame process */
1778 p2p->next_af_subtype = action + 1;
1805 &p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->sme_state))
1819 if (p2p->next_af_subtype != P2P_PAF_SUBTYPE_INVALID) {
1821 set_bit(BRCMF_P2P_STATUS_WAITING_NEXT_ACT_FRAME, &p2p->status);
1824 p2p->af_sent_channel = 0;
1825 set_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status);
1826 /* validate channel and p2p ies */
1829 p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif->saved_ie.probe_req_ie_len) {
1830 afx_hdl = &p2p->afx_hdl;
1833 if (brcmf_p2p_af_searching_channel(p2p) ==
1854 while (!p2p->block_gon_req_tx &&
1860 ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
1868 clear_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
1872 clear_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status);
1879 if (ack && config_af_params.extra_listen && !p2p->block_gon_req_tx &&
1880 test_bit(BRCMF_P2P_STATUS_WAITING_NEXT_ACT_FRAME, &p2p->status) &&
1881 p2p->af_sent_channel == afx_hdl->my_listen_chan) {
1882 delta_ms = jiffies_to_msecs(jiffies - p2p->af_tx_sent_jiffies);
1890 &p2p->status);
1895 if (!brcmf_p2p_discover_listen(p2p,
1896 p2p->af_sent_channel,
1902 wait_for_completion_timeout(&p2p->wait_next_af,
1906 &p2p->status);
1910 if (p2p->block_gon_req_tx) {
1914 p2p->block_gon_req_tx = false;
1918 clear_bit(BRCMF_P2P_STATUS_WAITING_NEXT_ACT_FRAME, &p2p->status);
1927 * brcmf_p2p_notify_rx_mgmt_p2p_probereq() - Event handler for p2p probe req.
1938 struct brcmf_p2p_info *p2p = &cfg->p2p;
1939 struct afx_hdl *afx_hdl = &p2p->afx_hdl;
1959 if (test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status) &&
1973 if (test_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status)) {
2003 * @p2p: P2P specific data.
2006 static void brcmf_p2p_get_current_chanspec(struct brcmf_p2p_info *p2p,
2015 ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
2035 p2p->cfg->d11inf.encchspec(&ch);
2048 struct brcmf_p2p_info *p2p = &cfg->p2p;
2057 vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
2063 vif = p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif;
2073 brcmf_p2p_get_current_chanspec(p2p, &chanspec);
2077 memcpy(if_request.addr, p2p->conn_int_addr, sizeof(if_request.addr));
2101 static int brcmf_p2p_request_p2p_if(struct brcmf_p2p_info *p2p,
2110 brcmf_p2p_get_current_chanspec(p2p, &chanspec);
2146 * @p2p: P2P specific data.
2150 static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
2154 struct brcmf_pub *drvr = p2p->cfg->pub;
2161 if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
2164 p2p_vif = brcmf_alloc_vif(p2p->cfg, NL80211_IFTYPE_P2P_DEVICE);
2170 pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
2179 brcmf_p2p_generate_bss_mac(p2p, addr);
2180 brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
2182 brcmf_cfg80211_arm_vif_event(p2p->cfg, p2p_vif);
2190 brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL);
2195 err = brcmf_cfg80211_wait_vif_event(p2p->cfg, BRCMF_E_IF_ADD,
2197 brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL);
2207 p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
2208 memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
2209 memcpy(&p2p_vif->wdev.address, p2p->dev_addr, sizeof(p2p->dev_addr));
2220 init_completion(&p2p->send_af_done);
2221 INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
2222 init_completion(&p2p->afx_hdl.act_frm_scan);
2223 init_completion(&p2p->wait_next_af);
2241 if (!cfg->p2p.bss_idx[i].vif) {
2244 brcmf_err("Multi p2p not supported");
2289 return brcmf_p2p_create_p2pdev(&cfg->p2p, wiphy,
2303 p2p_intf_addr = cfg->p2p.conn_int_addr;
2305 p2p_intf_addr = cfg->p2p.conn2_int_addr;
2310 err = brcmf_p2p_request_p2p_if(&cfg->p2p, ifp,
2314 brcmf_err("request p2p interface failed\n");
2346 cfg->p2p.bss_idx[connidx].vif = vif;
2350 /* set station timeout for p2p */
2370 struct brcmf_p2p_info *p2p = &cfg->p2p;
2393 if (!p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
2396 brcmf_p2p_deinit_discovery(p2p);
2403 clear_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
2428 if (vif == p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif)
2429 p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
2430 if (vif == p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION2].vif)
2431 p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION2].vif = NULL;
2445 cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
2461 struct brcmf_p2p_info *p2p = &cfg->p2p;
2467 err = brcmf_p2p_enable_discovery(p2p);
2477 struct brcmf_p2p_info *p2p = &cfg->p2p;
2485 if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif == vif) {
2500 * @p2pdev_forced: create p2p device interface at attach.
2505 struct brcmf_p2p_info *p2p;
2510 p2p = &cfg->p2p;
2511 p2p->cfg = cfg;
2514 p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
2517 err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
2523 p2p->p2pdev_dynamically = true;
2531 * @p2p: P2P specific data.
2533 void brcmf_p2p_detach(struct brcmf_p2p_info *p2p)
2537 vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
2540 brcmf_p2p_deinit_discovery(p2p);
2544 memset(p2p, 0, sizeof(*p2p));