2 ** $Id: @(#) gl_p2p.c@@
6 \brief Main routines of Linux driver interface for Wi-Fi Direct
8 This file contains the main routines of Linux driver for MediaTek Inc. 802.11
17 ** 09 12 2012 wcpadmin
18 ** [ALPS00276400] Remove MTK copyright and legal header on GPL/LGPL related packages
21 ** 08 17 2012 yuche.tsai
23 ** Fix compile warning.
25 ** 08 16 2012 yuche.tsai
27 ** Fix compile warning.
29 ** 08 14 2012 yuche.tsai
31 ** FPB from ALPS.JB to phase 2 release.
33 ** 07 26 2012 yuche.tsai
34 ** [ALPS00324337] [ALPS.JB][Hot-Spot] Driver update for Hot-Spot
35 ** Update driver code of ALPS.JB for hot-spot.
37 ** 07 19 2012 yuche.tsai
39 ** Code update for JB.
41 * 07 17 2012 yuche.tsai
43 * Fix compile error for JB.
45 * 07 17 2012 yuche.tsai
47 * Let netdev bring up.
49 * 07 17 2012 yuche.tsai
51 * Compile no error before trial run.
54 * [WCXRP00001166] [Wi-Fi] [Driver] cfg80211 integration for p2p newtork
55 * cfg80211 integration for p2p network.
58 * [WCXRP00001142] [Wi-Fi] [P2P Driver] XOR local admin bit to generate p2p net device MAC
59 * XOR local administrated bit to generate net device MAC of p2p network.
61 * 12 02 2011 yuche.tsai
63 * Fix possible KE when unload p2p.
65 * 11 24 2011 yuche.tsai
67 * Fix P2P IOCTL of multicast address bug, add low power driver stop control.
69 * 11 22 2011 yuche.tsai
71 * Update RSSI link quality of P2P Network query method. (Bug fix)
73 * 11 19 2011 yuche.tsai
75 * Add RSSI support for P2P network.
77 * 11 16 2011 yuche.tsai
78 * [WCXRP00001107] [Volunteer Patch][Driver] Large Network Type index assert in FW issue.
79 * Avoid using work thread in set p2p multicast address callback.
81 * 11 11 2011 yuche.tsai
83 * Fix work thread cancel issue.
85 * 11 11 2011 yuche.tsai
87 * Fix default device name issue.
89 * 11 08 2011 yuche.tsai
90 * [WCXRP00001094] [Volunteer Patch][Driver] Driver version & supplicant version query & set support for service discovery version check.
91 * Add support for driver version query & p2p supplicant verseion set.
92 * For new service discovery mechanism sync.
94 * 11 07 2011 yuche.tsai
96 * [ALPS 00087243] KE in worker thread.
97 * The multicast address list is scheduled in worker thread.
98 * Before the worker thread is excuted, if P2P is unloaded, a KE may occur.
100 * 10 26 2011 terry.wu
101 * [WCXRP00001066] [MT6620 Wi-Fi] [P2P Driver] Fix P2P Oid Issue
102 * Fix some P2P OID functions didn't raise its flag "fgIsP2pOid" issue.
104 * 10 25 2011 cm.chang
105 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
108 * 10 18 2011 yuche.tsai
109 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
110 * Support Channle Query.
112 * 10 18 2011 yuche.tsai
113 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
117 * 08 26 2011 yuche.tsai
119 * Fix bug of parsing secondary device list type issue.
121 * 08 24 2011 yuche.tsai
122 * [WCXRP00000919] [Volunteer Patch][WiFi Direct][Driver] Invitation New Feature.
125 * 08 23 2011 yuche.tsai
127 * Fix multicast address list issue of P2P.
129 * 08 22 2011 chinglan.wang
131 * Fix invitation indication bug..
134 * [WCXRP00000934] [MT6620 Wi-Fi][Driver][P2P] Wi-Fi hot spot with auto sparse channel residence
135 * auto channel decision for 2.4GHz hot spot mode
137 * 08 16 2011 chinglan.wang
139 * Add the group id information in the invitation indication.
141 * 08 09 2011 yuche.tsai
142 * [WCXRP00000919] [Volunteer Patch][WiFi Direct][Driver] Invitation New Feature.
143 * Invitation Feature add on.
145 * 08 05 2011 yuche.tsai
146 * [WCXRP00000856] [Volunteer Patch][WiFi Direct][Driver] MT6620 WiFi Direct IOT Issue with BCM solution.
147 * Add Password ID check for quick connection.
148 * Also modify some connection policy.
150 * 07 18 2011 chinglan.wang
152 * Add IOC_P2P_GO_WSC_IE (p2p capability).
154 * 06 14 2011 yuche.tsai
156 * Add compile flag to disable persistent group support.
158 * 05 04 2011 chinglan.wang
159 * [WCXRP00000698] [MT6620 Wi-Fi][P2P][Driver] Add p2p invitation command for the p2p driver
162 * 05 02 2011 yuche.tsai
163 * [WCXRP00000693] [Volunteer Patch][MT6620][Driver] Clear Formation Flag after TX lifetime timeout.
164 * Clear formation flag after formation timeout.
166 * 04 22 2011 george.huang
167 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
170 * 04 21 2011 george.huang
171 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
172 * 1. Revise P2P power mode setting.
173 * 2. Revise fast-PS for concurrent
177 * Adding length check before doing WPA RSN IE parsing for scan results indicate.
179 * 04 14 2011 yuche.tsai
180 * [WCXRP00000646] [Volunteer Patch][MT6620][FW/Driver] Sigma Test Modification for some test case.
181 * Connection flow refine for Sigma test.
183 * 04 08 2011 yuche.tsai
184 * [WCXRP00000624] [Volunteer Patch][MT6620][Driver] Add device discoverability support for GO.
185 * Add device discoverability support.
187 * 04 08 2011 george.huang
188 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
189 * separate settings of P2P and AIS
191 * 04 07 2011 terry.wu
192 * [WCXRP00000619] [MT6620 Wi-Fi][Driver] fix kernel panic may occur when removing wlan
193 * Fix kernel panic may occur when removing wlan driver.
196 * [WCXRP00000614] [MT6620 Wi-Fi][Driver] P2P: Update beacon content while setting WSC IE
197 * Update the wsc ie to beacon content.
201 * add the sample code for set power mode and get power mode.
203 * 03 25 2011 yuche.tsai
205 * Improve some error handleing.
207 * 03 22 2011 george.huang
208 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
209 * link with supplicant commands
211 * 03 22 2011 yuche.tsai
212 * [WCXRP00000584] [Volunteer Patch][MT6620][Driver] Add beacon timeout support for WiFi Direct.
213 * Modify formation policy.
215 * 03 22 2011 yuche.tsai
217 * Modify formation policy setting.
219 * 03 18 2011 yuche.tsai
220 * [WCXRP00000574] [Volunteer Patch][MT6620][Driver] Modify P2P FSM Connection Flow
221 * Modify connection flow after Group Formation Complete, or device connect to a GO.
222 * Instead of request channel & connect directly, we use scan to allocate channel bandwidth & connect after RX BCN.
225 * [WCXRP00000563] [MT6620 Wi-Fi] [P2P] Set local config method while set password Id ready
226 * set lccal config method method while set password Id ready.
228 * 03 15 2011 yuche.tsai
229 * [WCXRP00000560] [Volunteer Patch][MT6620][Driver] P2P Connection from UI using KEY/DISPLAY issue
230 * Fix some configure method issue.
232 * 03 15 2011 jeffrey.chang
233 * [WCXRP00000558] [MT6620 Wi-Fi][MT6620 Wi-Fi][Driver] refine the queue selection algorithm for WMM
234 * refine queue_select function
237 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
238 * add code for avoid compiling warning.
240 * 03 10 2011 yuche.tsai
244 * 03 10 2011 terry.wu
245 * [WCXRP00000505] [MT6620 Wi-Fi][Driver/FW] WiFi Direct Integration
246 * Remove unnecessary assert and message.
249 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
250 * support the power save related p2p setting.
253 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
254 * rename the define to anti_pviracy.
257 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
258 * add the code to get the check rsponse and indicate to app.
260 * 03 03 2011 jeffrey.chang
261 * [WCXRP00000512] [MT6620 Wi-Fi][Driver] modify the net device relative functions to support the H/W multiple queue
262 * support concurrent network
264 * 03 03 2011 jeffrey.chang
265 * [WCXRP00000512] [MT6620 Wi-Fi][Driver] modify the net device relative functions to support the H/W multiple queue
266 * modify P2P's netdevice functions to support multiple H/W queues
269 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
270 * for get request, the buffer length to be copied is header + payload.
273 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
274 * add code to let the beacon and probe response for Auto GO WSC .
277 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
278 * add a missed break.
280 * 03 01 2011 yuche.tsai
281 * [WCXRP00000501] [Volunteer Patch][MT6620][Driver] No common channel issue when doing GO formation
282 * Update channel issue when doing GO formation..
285 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
286 * add the Operation channel setting.
289 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
290 * fixed the set int ioctl set index and value map to driver issue.
293 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
294 * adding the ioctl set int from supplicant, and can used to set the p2p paramters
296 * 02 21 2011 terry.wu
297 * [WCXRP00000476] [MT6620 Wi-Fi][Driver] Clean P2P scan list while removing P2P
298 * Clean P2P scan list while removing P2P.
301 * [WCXRP00000471] [MT6620 Wi-Fi][Driver] Add P2P Provison discovery append Config Method attribute at WSC IE
302 * fixed the ioctl setting that index not map to spec defined config method.
305 * [WCXRP00000471] [MT6620 Wi-Fi][Driver] Add P2P Provison discovery append Config Method attribute at WSC IE
306 * append the WSC IE config method attribute at provision discovery request.
309 * [WCXRP00000448] [MT6620 Wi-Fi][Driver] Fixed WSC IE not send out at probe request
310 * modify the structure pointer for set WSC IE.
313 * [WCXRP00000448] [MT6620 Wi-Fi][Driver] Fixed WSC IE not send out at probe request
314 * fixed the probe request send out without WSC IE issue (at P2P).
317 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
320 * 02 09 2011 yuche.tsai
321 * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
322 * Add Support for MLME deauthentication for Hot-Spot.
324 * 01 25 2011 terry.wu
325 * [WCXRP00000393] [MT6620 Wi-Fi][Driver] Add new module insert parameter
326 * Add a new module parameter to indicate current runnig mode, P2P or AP.
328 * 01 12 2011 yuche.tsai
329 * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
330 * 1. Modify Channel Acquire Time of AP mode from 5s to 1s.
331 * 2. Call cnmP2pIsPermit() before active P2P network.
332 * 3. Add channel selection support for AP mode.
335 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
336 * ioctl implementations for P2P Service Discovery
339 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
340 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
343 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
344 * 1. header file restructure for more clear module isolation
345 * 2. add function interface definition for implementing Service Discovery callbacks
349 * invoke nicEnableInterrupt() before leaving from wlanAdapterStart()
351 * 12 08 2010 yuche.tsai
352 * [WCXRP00000245] [MT6620][Driver] Invitation & Provision Discovery Feature Check-in
353 * [WCXRP000000245][MT6620][Driver] Invitation Request Feature Add
355 * 11 30 2010 yuche.tsai
357 * Invitation & Provision Discovery Indication.
360 * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID[WCXRP00000179] [MT6620 Wi-Fi][FW] Set the Tx lowest rate at wlan table for normal operation
361 * fixed some ASSERT check.
364 * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
365 * adding the p2p random ssid support.
368 * [WCXRP00000124] [MT6620 Wi-Fi] [Driver] Support the dissolve P2P Group
369 * Add the code to support disconnect p2p group
372 * [WCXRP00000081] [MT6620][Driver] Fix the compiling error at WinXP while enable P2P
373 * add a kal function for set cipher.
376 * [WCXRP00000081] [MT6620][Driver] Fix the compiling error at WinXP while enable P2P
377 * fixed compiling error while enable p2p.
381 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
383 * 09 21 2010 kevin.huang
384 * [WCXRP00000054] [MT6620 Wi-Fi][Driver] Restructure driver for second Interface
385 * Isolate P2P related function for Hardware Software Bundle
387 * 09 21 2010 kevin.huang
388 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
389 * Eliminate Linux Compile Warning
391 * 09 10 2010 george.huang
393 * update iwpriv LP related
397 * fixed the compiling error at win XP.
401 * add WPS/WPA/RSN IE for Wi-Fi Direct scanning result.
405 * adding the code for beacon/probe req/ probe rsp wsc ie at p2p.
409 * let the p2p can set the privacy bit at beacon and rsn ie at assoc req at key handshake state.
413 * add netdev_ops(NDO) for linux kernel 2.6.31 or greater
417 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
423 * 08 20 2010 yuche.tsai
425 * Invert Connection request provision status parameter.
429 * add set mac address interface for further possibilities of wpa_supplicant overriding interface address.
433 * modify pwp ioctls attribution by removing FIXED_SIZE.
435 * 08 18 2010 jeffrey.chang
437 * support multi-function sdio
441 * correct p2p net device registration with NULL pointer access issue.
445 * P2P packets are now marked when being queued into driver, and identified later without checking MAC address
449 * add subroutines for P2P to set multicast list.
451 * 08 16 2010 george.huang
453 * add wext handlers to link P2P set PS profile/ network address function (TBD)
457 * revised implementation of Wi-Fi Direct io controls.
461 * follow-up with ioctl interface update for Wi-Fi Direct application
465 * driver hook modifications corresponding to ioctl interface change.
469 * add basic support for ioctl of getting scan result. (only address and SSID are reporterd though)
473 * [Wi-Fi Direct Driver Hook] change event indication API to be consistent with supplicant
477 * surpress compilation warning.
481 * [Wi-Fi Direct] add framework for driver hooks
485 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
488 * [WPD00003833][MT6620 and MT5931] Driver migration
489 * p2p interface revised to be sync. with HAL
491 * 06 06 2010 kevin.huang
492 * [WPD00003832][MT6620 5931] Create driver base
493 * [MT6620 5931] Create driver base
496 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
497 * add ioctl to configure scan mode for p2p connection
500 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
501 * add cfg80211 interface, which is to replace WE, for further extension
504 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
505 * implement private io controls for Wi-Fi Direct
508 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
509 * implement get scan result.
512 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
513 * add basic handling framework for wireless extension ioctls.
516 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
517 * 1) add timeout handler mechanism for pending command packets
518 * 2) add p2p add/removal key
521 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
522 * implement wireless extension ioctls in iw_handler form.
525 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
526 * add ioctl framework for Wi-Fi Direct by reusing wireless extension ioctls as well
529 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
530 * p2p ioctls revised.
533 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
534 * add ioctl for controlling p2p scan phase parameters
537 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
538 * implement basic wi-fi direct framework
541 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
542 * add basic framework for implementating P2P driver hook.
547 /*******************************************************************************
548 * C O M P I L E R F L A G S
549 ********************************************************************************
552 /*******************************************************************************
553 * E X T E R N A L R E F E R E N C E S
554 ********************************************************************************
558 #include "wlan_lib.h"
560 #include <linux/poll.h>
562 #include <linux/kmod.h>
563 //#include <net/cfg80211.h>
564 #include "gl_p2p_ioctl.h"
568 /*******************************************************************************
570 ********************************************************************************
572 #define ARGV_MAX_NUM (4)
574 /*For CFG80211 - wiphy parameters*/
575 #define MAX_SCAN_LIST_NUM (1)
576 #define MAX_SCAN_IE_LEN (512)
577 #define LEGACY_IN_AP_MODE "legacy_wlan%d"
580 /*******************************************************************************
582 ********************************************************************************
585 /*******************************************************************************
586 * P U B L I C D A T A
587 ********************************************************************************
590 /*******************************************************************************
591 * P R I V A T E D A T A
592 ********************************************************************************
595 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
596 /* for cfg80211 - frequency table */
597 static struct ieee80211_channel mtk_2ghz_channels[] = {
614 static struct ieee80211_channel mtk_5ghz_a_channels[] = {
615 CHAN5G(34, 0), CHAN5G(36, 0),
616 CHAN5G(38, 0), CHAN5G(40, 0),
617 CHAN5G(42, 0), CHAN5G(44, 0),
618 CHAN5G(46, 0), CHAN5G(48, 0),
619 CHAN5G(52, 0), CHAN5G(56, 0),
620 CHAN5G(60, 0), CHAN5G(64, 0),
621 CHAN5G(100, 0), CHAN5G(104, 0),
622 CHAN5G(108, 0), CHAN5G(112, 0),
623 CHAN5G(116, 0), CHAN5G(120, 0),
624 CHAN5G(124, 0), CHAN5G(128, 0),
625 CHAN5G(132, 0), CHAN5G(136, 0),
626 CHAN5G(140, 0), CHAN5G(149, 0),
627 CHAN5G(153, 0), CHAN5G(157, 0),
628 CHAN5G(161, 0), CHAN5G(165, 0),
629 CHAN5G(169, 0), CHAN5G(173, 0),
630 CHAN5G(184, 0), CHAN5G(188, 0),
631 CHAN5G(192, 0), CHAN5G(196, 0),
632 CHAN5G(200, 0), CHAN5G(204, 0),
633 CHAN5G(208, 0), CHAN5G(212, 0),
637 /* for cfg80211 - rate table */
638 static struct ieee80211_rate mtk_rates[] = {
639 RATETAB_ENT(10, 0x1000, 0),
640 RATETAB_ENT(20, 0x1001, 0),
641 RATETAB_ENT(55, 0x1002, 0),
642 RATETAB_ENT(110, 0x1003, 0), /* 802.11b */
643 RATETAB_ENT(60, 0x2000, 0),
644 RATETAB_ENT(90, 0x2001, 0),
645 RATETAB_ENT(120, 0x2002, 0),
646 RATETAB_ENT(180, 0x2003, 0),
647 RATETAB_ENT(240, 0x2004, 0),
648 RATETAB_ENT(360, 0x2005, 0),
649 RATETAB_ENT(480, 0x2006, 0),
650 RATETAB_ENT(540, 0x2007, 0), /* 802.11a/g */
653 #define mtk_a_rates (mtk_rates + 4)
654 #define mtk_a_rates_size (sizeof(mtk_rates) / sizeof(mtk_rates[0]) - 4)
655 #define mtk_g_rates (mtk_rates + 0)
656 #define mtk_g_rates_size (sizeof(mtk_rates) / sizeof(mtk_rates[0]) - 0)
658 #define MT6620_MCS_INFO \
661 .rx_mask = {0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0},\
663 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
667 /*Bandwidth 20Mhz Only*/
668 #define MT6620_HT_CAP \
670 .ht_supported = true, \
671 .cap = IEEE80211_HT_CAP_SM_PS \
672 | IEEE80211_HT_CAP_GRN_FLD \
673 | IEEE80211_HT_CAP_SGI_20, \
674 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, \
675 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE, \
676 .mcs = MT6620_MCS_INFO, \
679 /*Bandwidth 20/40Mhz*/
680 #define MT6620_HT_CAP \
682 .ht_supported = true, \
683 .cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 \
684 | IEEE80211_HT_CAP_SM_PS \
685 | IEEE80211_HT_CAP_GRN_FLD \
686 | IEEE80211_HT_CAP_SGI_20 \
687 | IEEE80211_HT_CAP_SGI_40, \
688 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, \
689 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE, \
690 .mcs = MT6620_MCS_INFO, \
694 static struct ieee80211_supported_band mtk_band_2ghz = {
695 .band = IEEE80211_BAND_2GHZ,
696 .channels = mtk_2ghz_channels,
697 .n_channels = ARRAY_SIZE(mtk_2ghz_channels),
698 .bitrates = mtk_g_rates,
699 .n_bitrates = mtk_g_rates_size,
700 .ht_cap = MT6620_HT_CAP,
703 static struct ieee80211_supported_band mtk_band_5ghz = {
704 .band = IEEE80211_BAND_5GHZ,
705 .channels = mtk_5ghz_a_channels,
706 .n_channels = ARRAY_SIZE(mtk_5ghz_a_channels),
707 .bitrates = mtk_a_rates,
708 .n_bitrates = mtk_a_rates_size,
709 .ht_cap = MT6620_HT_CAP,
712 static const UINT_32 cipher_suites[] = {
713 /* keep WEP first, it may be removed below */
714 WLAN_CIPHER_SUITE_WEP40,
715 WLAN_CIPHER_SUITE_WEP104,
716 WLAN_CIPHER_SUITE_TKIP,
717 WLAN_CIPHER_SUITE_CCMP,
719 /* keep last -- depends on hw flags! */
720 WLAN_CIPHER_SUITE_AES_CMAC
723 static struct cfg80211_ops mtk_p2p_config_ops = {
724 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) && (CFG_ENABLE_WIFI_DIRECT_CFG_80211 != 0)
726 .change_virtual_intf = mtk_p2p_cfg80211_change_iface, // 1 st
727 .change_bss = mtk_p2p_cfg80211_change_bss,
728 .scan = mtk_p2p_cfg80211_scan,
729 .remain_on_channel = mtk_p2p_cfg80211_remain_on_channel,
730 .cancel_remain_on_channel = mtk_p2p_cfg80211_cancel_remain_on_channel,
731 .mgmt_tx = mtk_p2p_cfg80211_mgmt_tx,
733 .mgmt_tx_cancel_wait = mtk_p2p_cfg80211_mgmt_tx_cancel_wait,
734 .connect = mtk_p2p_cfg80211_connect,
735 .disconnect = mtk_p2p_cfg80211_disconnect,
736 .deauth = mtk_p2p_cfg80211_deauth,
737 .disassoc = mtk_p2p_cfg80211_disassoc,
738 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
739 .start_ap = mtk_p2p_cfg80211_start_ap,
740 .change_beacon = mtk_p2p_cfg80211_change_beacon,
741 .stop_ap = mtk_p2p_cfg80211_stop_ap,
743 .add_beacon = mtk_p2p_cfg80211_add_set_beacon,
744 .set_beacon = mtk_p2p_cfg80211_add_set_beacon,
745 .del_beacon = mtk_p2p_cfg80211_stop_ap,
747 .set_wiphy_params = mtk_p2p_cfg80211_set_wiphy_params,
748 .del_station = mtk_p2p_cfg80211_del_station,
749 .set_channel = mtk_p2p_cfg80211_set_channel,
750 .set_bitrate_mask = mtk_p2p_cfg80211_set_bitrate_mask,
751 .mgmt_frame_register = mtk_p2p_cfg80211_mgmt_frame_register,
752 .get_station = mtk_p2p_cfg80211_get_station,
754 .add_key = mtk_p2p_cfg80211_add_key,
755 .get_key = mtk_p2p_cfg80211_get_key,
756 .del_key = mtk_p2p_cfg80211_del_key,
757 .set_default_key = mtk_p2p_cfg80211_set_default_key,
758 .join_ibss = mtk_p2p_cfg80211_join_ibss,
759 .leave_ibss = mtk_p2p_cfg80211_leave_ibss,
760 .set_tx_power = mtk_p2p_cfg80211_set_txpower,
761 .get_tx_power = mtk_p2p_cfg80211_get_txpower,
762 .set_power_mgmt = mtk_p2p_cfg80211_set_power_mgmt,
763 #ifdef CONFIG_NL80211_TESTMODE
764 .testmode_cmd = mtk_p2p_cfg80211_testmode_cmd,
771 /* There isn't a lot of sense in it, but you can transmit anything you like */
772 static const struct ieee80211_txrx_stypes
773 mtk_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {
774 [NL80211_IFTYPE_ADHOC] = {
776 .rx = BIT(IEEE80211_STYPE_ACTION >> 4)
778 [NL80211_IFTYPE_STATION] = {
780 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
781 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
783 [NL80211_IFTYPE_AP] = {
785 .rx = BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
786 BIT(IEEE80211_STYPE_ACTION >> 4)
788 [NL80211_IFTYPE_AP_VLAN] = {
791 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
792 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
793 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
794 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
795 BIT(IEEE80211_STYPE_AUTH >> 4) |
796 BIT(IEEE80211_STYPE_DEAUTH >> 4) |
797 BIT(IEEE80211_STYPE_ACTION >> 4)
799 [NL80211_IFTYPE_P2P_CLIENT] = {
801 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
802 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
804 [NL80211_IFTYPE_P2P_GO] = {
806 .rx = BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
807 BIT(IEEE80211_STYPE_ACTION >> 4)
815 /* the legacy wireless extension stuff */
816 static const iw_handler rP2PIwStandardHandler[] = {
817 [SIOCGIWPRIV - SIOCIWFIRST] = mtk_p2p_wext_get_priv,
818 [SIOCGIWSCAN - SIOCIWFIRST] = mtk_p2p_wext_discovery_results,
819 [SIOCSIWESSID - SIOCIWFIRST] = mtk_p2p_wext_reconnect,
820 [SIOCSIWAUTH - SIOCIWFIRST] = mtk_p2p_wext_set_auth,
821 [SIOCSIWENCODEEXT - SIOCIWFIRST] = mtk_p2p_wext_set_key,
822 [SIOCSIWPOWER - SIOCIWFIRST] = mtk_p2p_wext_set_powermode,
823 [SIOCGIWPOWER - SIOCIWFIRST] = mtk_p2p_wext_get_powermode,
824 [SIOCSIWTXPOW - SIOCIWFIRST] = mtk_p2p_wext_set_txpow,
825 #if CFG_SUPPORT_P2P_RSSI_QUERY
826 [SIOCGIWSTATS - SIOCIWFIRST] = mtk_p2p_wext_get_rssi,
828 [SIOCSIWMLME - SIOCIWFIRST] = mtk_p2p_wext_mlme_handler,
831 static const iw_handler rP2PIwPrivHandler[] = {
832 [IOC_P2P_CFG_DEVICE - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_local_dev_info,
833 [IOC_P2P_PROVISION_COMPLETE - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_provision_complete,
834 [IOC_P2P_START_STOP_DISCOVERY - SIOCIWFIRSTPRIV] = mtk_p2p_wext_start_stop_discovery,
835 [IOC_P2P_DISCOVERY_RESULTS - SIOCIWFIRSTPRIV] = mtk_p2p_wext_discovery_results,
836 [IOC_P2P_WSC_BEACON_PROBE_RSP_IE - SIOCIWFIRSTPRIV] = mtk_p2p_wext_wsc_ie,
837 [IOC_P2P_CONNECT_DISCONNECT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_connect_disconnect,
838 [IOC_P2P_PASSWORD_READY - SIOCIWFIRSTPRIV] = mtk_p2p_wext_password_ready,
839 // [IOC_P2P_SET_PWR_MGMT_PARAM - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_pm_param,
840 [IOC_P2P_SET_INT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_int,
841 [IOC_P2P_GET_STRUCT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_get_struct,
842 [IOC_P2P_SET_STRUCT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_struct,
843 [IOC_P2P_GET_REQ_DEVICE_INFO - SIOCIWFIRSTPRIV] = mtk_p2p_wext_request_dev_info,
847 static const struct iw_priv_args rP2PIwPrivTable[] = {
849 .cmd = IOC_P2P_CFG_DEVICE,
850 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_CFG_DEVICE_TYPE),
851 .get_args = IW_PRIV_TYPE_NONE,
852 .name = "P2P_CFG_DEVICE"
855 .cmd = IOC_P2P_START_STOP_DISCOVERY,
856 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_REQ_DEVICE_TYPE),
857 .get_args = IW_PRIV_TYPE_NONE,
858 .name = "P2P_DISCOVERY"
861 .cmd = IOC_P2P_DISCOVERY_RESULTS,
862 .set_args = IW_PRIV_TYPE_NONE,
863 .get_args = IW_PRIV_TYPE_NONE,
867 .cmd = IOC_P2P_WSC_BEACON_PROBE_RSP_IE,
868 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_HOSTAPD_PARAM),
869 .get_args = IW_PRIV_TYPE_NONE,
873 .cmd = IOC_P2P_CONNECT_DISCONNECT,
874 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_CONNECT_DEVICE),
875 .get_args = IW_PRIV_TYPE_NONE,
876 .name = "P2P_CONNECT"
879 .cmd = IOC_P2P_PASSWORD_READY,
880 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_PASSWORD_READY),
881 .get_args = IW_PRIV_TYPE_NONE,
882 .name = "P2P_PASSWD_RDY"
885 .cmd = IOC_P2P_GET_STRUCT,
886 .set_args = IW_PRIV_TYPE_NONE,
888 .name = "P2P_GET_STRUCT"
891 .cmd = IOC_P2P_SET_STRUCT,
893 .get_args = IW_PRIV_TYPE_NONE,
894 .name = "P2P_SET_STRUCT"
897 .cmd = IOC_P2P_GET_REQ_DEVICE_INFO,
898 .set_args = IW_PRIV_TYPE_NONE,
899 .get_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_DEVICE_REQ),
900 .name = "P2P_GET_REQDEV"
903 /* SET STRUCT sub-ioctls commands */
906 .get_args = IW_PRIV_TYPE_NONE,
910 /* GET STRUCT sub-ioctls commands */
912 .set_args = IW_PRIV_TYPE_NONE,
918 const struct iw_handler_def mtk_p2p_wext_handler_def = {
919 .num_standard = (__u16)sizeof(rP2PIwStandardHandler)/sizeof(iw_handler),
920 .num_private = (__u16)sizeof(rP2PIwPrivHandler)/sizeof(iw_handler),
921 .num_private_args = (__u16)sizeof(rP2PIwPrivTable)/sizeof(struct iw_priv_args),
922 .standard = rP2PIwStandardHandler,
923 .private = rP2PIwPrivHandler,
924 .private_args = rP2PIwPrivTable,
925 #if CFG_SUPPORT_P2P_RSSI_QUERY
926 .get_wireless_stats = mtk_p2p_wext_get_wireless_stats,
928 .get_wireless_stats = NULL,
932 /*******************************************************************************
934 ********************************************************************************
937 /*******************************************************************************
938 * F U N C T I O N D E C L A R A T I O N S
939 ********************************************************************************
941 /* for IE Searching */
943 wextSrchDesiredWPAIE (
944 IN PUINT_8 pucIEStart,
945 IN INT_32 i4TotalIeLen,
946 IN UINT_8 ucDesiredElemId,
947 OUT PUINT_8 *ppucDesiredIE
952 wextSrchDesiredWPSIE (
953 IN PUINT_8 pucIEStart,
954 IN INT_32 i4TotalIeLen,
955 IN UINT_8 ucDesiredElemId,
956 OUT PUINT_8 *ppucDesiredIE
960 /* Net Device Hooks */
963 IN struct net_device *prDev
968 IN struct net_device *prDev
971 static struct net_device_stats *
973 IN struct net_device *prDev
978 IN struct net_device *prDev
983 IN struct sk_buff *prSkb,
984 IN struct net_device *prDev
989 struct net_device *prDev,
990 struct ifreq *prIFReq,
996 IN struct net_device *prDev,
1001 /*----------------------------------------------------------------------------*/
1003 * \brief Override the implementation of select queue
1005 * \param[in] dev Pointer to struct net_device
1006 * \param[in] skb Pointer to struct skb_buff
1010 /*----------------------------------------------------------------------------*/
1012 unsigned int _p2p_cfg80211_classify8021d(struct sk_buff *skb)
1014 unsigned int dscp = 0;
1016 /* skb->priority values from 256->263 are magic values
1017 * directly indicate a specific 802.1d priority. This is
1018 * to allow 802.1d priority to be passed directly in from
1022 if (skb->priority >= 256 && skb->priority <= 263) {
1023 return skb->priority - 256;
1025 switch (skb->protocol) {
1026 case htons(ETH_P_IP):
1027 dscp = ip_hdr(skb)->tos & 0xfc;
1034 static const UINT_16 au16Wlan1dToQueueIdx[8] = { 1, 0, 0, 1, 2, 2, 3, 3 };
1038 struct net_device *dev,
1039 struct sk_buff *skb)
1041 skb->priority = _p2p_cfg80211_classify8021d(skb);
1043 return au16Wlan1dToQueueIdx[skb->priority];
1046 static struct net_device *g_P2pPrDev;
1049 /*----------------------------------------------------------------------------*/
1051 * \brief A function for prDev->init
1053 * \param[in] prDev Pointer to struct net_device.
1055 * \retval 0 The execution of wlanInit succeeds.
1056 * \retval -ENXIO No such device.
1058 /*----------------------------------------------------------------------------*/
1061 struct net_device *prDev
1068 return 0; /* success */
1069 } /* end of p2pInit() */
1072 /*----------------------------------------------------------------------------*/
1074 * \brief A function for prDev->uninit
1076 * \param[in] prDev Pointer to struct net_device.
1080 /*----------------------------------------------------------------------------*/
1083 IN struct net_device *prDev
1089 } /* end of p2pUninit() */
1096 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
1097 static const struct net_device_ops p2p_netdev_ops = {
1098 .ndo_open = p2pOpen,
1099 .ndo_stop = p2pStop,
1100 .ndo_set_mac_address = p2pSetMACAddress,
1101 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
1102 .ndo_set_rx_mode = p2pSetMulticastList,
1104 .ndo_set_multicast_list = p2pSetMulticastList,
1106 .ndo_get_stats = p2pGetStats,
1107 .ndo_do_ioctl = p2pDoIOCTL,
1108 .ndo_start_xmit = p2pHardStartXmit,
1109 .ndo_select_queue = p2pSelectQueue,
1110 .ndo_init = p2pInit,
1111 .ndo_uninit = p2pUninit,
1118 /*******************************************************************************
1120 ********************************************************************************
1123 /*----------------------------------------------------------------------------*/
1125 * \brief Allocate memory for P2P_INFO, GL_P2P_INFO, P2P_CONNECTION_SETTINGS
1126 * P2P_SPECIFIC_BSS_INFO, P2P_FSM_INFO
1128 * \param[in] prGlueInfo Pointer to glue info
1133 /*----------------------------------------------------------------------------*/
1136 IN P_GLUE_INFO_T prGlueInfo
1139 P_ADAPTER_T prAdapter = NULL;
1140 P_WIFI_VAR_T prWifiVar = NULL;
1144 prAdapter = prGlueInfo->prAdapter;
1145 prWifiVar = &(prAdapter->rWifiVar);
1151 if (prGlueInfo == NULL) {
1155 if (prGlueInfo->prP2PInfo == NULL) {
1156 /*alloc memory for p2p info */
1157 prGlueInfo->prP2PInfo =
1158 kalMemAlloc(sizeof(GL_P2P_INFO_T), VIR_MEM_TYPE);
1159 prAdapter->prP2pInfo =
1160 kalMemAlloc(sizeof(P2P_INFO_T), VIR_MEM_TYPE);
1161 prWifiVar->prP2PConnSettings =
1162 kalMemAlloc(sizeof(P2P_CONNECTION_SETTINGS_T),VIR_MEM_TYPE);
1163 prWifiVar->prP2pFsmInfo =
1164 kalMemAlloc(sizeof(P2P_FSM_INFO_T),VIR_MEM_TYPE);
1165 prWifiVar->prP2pSpecificBssInfo =
1166 kalMemAlloc(sizeof(P2P_SPECIFIC_BSS_INFO_T),VIR_MEM_TYPE);
1169 ASSERT(prAdapter->prP2pInfo != NULL);
1170 ASSERT(prWifiVar->prP2PConnSettings != NULL);
1171 ASSERT(prWifiVar->prP2pFsmInfo != NULL);
1172 ASSERT(prWifiVar->prP2pSpecificBssInfo != NULL);
1174 /*MUST set memory to 0 */
1175 kalMemZero(prGlueInfo->prP2PInfo, sizeof(GL_P2P_INFO_T));
1176 kalMemZero(prAdapter->prP2pInfo, sizeof(P2P_INFO_T));
1177 kalMemZero(prWifiVar->prP2PConnSettings, sizeof(P2P_CONNECTION_SETTINGS_T));
1178 kalMemZero(prWifiVar->prP2pFsmInfo, sizeof(P2P_FSM_INFO_T));
1179 kalMemZero(prWifiVar->prP2pSpecificBssInfo, sizeof(P2P_SPECIFIC_BSS_INFO_T));
1184 /* chk if alloc successful or not*/
1185 if (prGlueInfo->prP2PInfo &&
1186 prAdapter->prP2pInfo &&
1187 prWifiVar->prP2PConnSettings &&
1188 prWifiVar->prP2pFsmInfo &&
1189 prWifiVar->prP2pSpecificBssInfo) {
1194 if (prWifiVar->prP2pSpecificBssInfo) {
1195 kalMemFree(prWifiVar->prP2pSpecificBssInfo, VIR_MEM_TYPE, sizeof(P2P_SPECIFIC_BSS_INFO_T));
1197 prWifiVar->prP2pSpecificBssInfo = NULL;
1199 if (prWifiVar->prP2pFsmInfo) {
1200 kalMemFree(prWifiVar->prP2pFsmInfo, VIR_MEM_TYPE, sizeof(P2P_FSM_INFO_T));
1202 prWifiVar->prP2pFsmInfo = NULL;
1204 if (prWifiVar->prP2PConnSettings) {
1205 kalMemFree(prWifiVar->prP2PConnSettings, VIR_MEM_TYPE, sizeof(P2P_CONNECTION_SETTINGS_T));
1207 prWifiVar->prP2PConnSettings = NULL;
1209 if (prGlueInfo->prP2PInfo) {
1210 kalMemFree(prGlueInfo->prP2PInfo, VIR_MEM_TYPE, sizeof(GL_P2P_INFO_T));
1212 prGlueInfo->prP2PInfo = NULL;
1214 if (prAdapter->prP2pInfo) {
1215 kalMemFree(prAdapter->prP2pInfo, VIR_MEM_TYPE, sizeof(P2P_INFO_T));
1217 prAdapter->prP2pInfo = NULL;
1225 /*----------------------------------------------------------------------------*/
1227 * \brief Free memory for P2P_INFO, GL_P2P_INFO, P2P_CONNECTION_SETTINGS
1228 * P2P_SPECIFIC_BSS_INFO, P2P_FSM_INFO
1230 * \param[in] prGlueInfo Pointer to glue info
1235 /*----------------------------------------------------------------------------*/
1238 P_GLUE_INFO_T prGlueInfo
1243 ASSERT(prGlueInfo->prAdapter);
1245 /* free memory after p2p module is ALREADY unregistered */
1246 if(prGlueInfo->prAdapter->fgIsP2PRegistered == FALSE) {
1248 kalMemFree(prGlueInfo->prAdapter->prP2pInfo, VIR_MEM_TYPE, sizeof(P2P_INFO_T));
1249 kalMemFree(prGlueInfo->prP2PInfo, VIR_MEM_TYPE, sizeof(GL_P2P_INFO_T));
1250 kalMemFree(prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings, VIR_MEM_TYPE, sizeof(P2P_CONNECTION_SETTINGS_T));
1251 kalMemFree(prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo, VIR_MEM_TYPE, sizeof(P2P_FSM_INFO_T));
1252 kalMemFree(prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo, VIR_MEM_TYPE, sizeof(P2P_SPECIFIC_BSS_INFO_T));
1254 /*Reomve p2p bss scan list*/
1255 scanRemoveAllP2pBssDesc(prGlueInfo->prAdapter);
1257 /*reset all pointer to NULL */
1258 prGlueInfo->prP2PInfo = NULL;
1259 prGlueInfo->prAdapter->prP2pInfo = NULL;
1260 prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings = NULL;
1261 prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo = NULL;
1262 prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo = NULL;
1272 /*----------------------------------------------------------------------------*/
1274 * \brief Enable Channel for cfg80211 for Wi-Fi Direct based on current country code
1276 * \param[in] prGlueInfo Pointer to glue info
1281 /*----------------------------------------------------------------------------*/
1285 UINT_8 ucChannelNum,
1286 struct ieee80211_channel *mtk_channels,
1287 UINT_8 mtk_channel_sz
1290 UINT_8 ucCurChIdx = *pucChIdx;
1294 (*pucChIdx) %= mtk_channel_sz;
1296 if(ucChannelNum == mtk_channels[*pucChIdx].hw_value) {
1297 mtk_channels[*pucChIdx].flags &= ~IEEE80211_CHAN_DISABLED;
1301 if(*pucChIdx == ucCurChIdx) {
1302 printk(KERN_ALERT DRV_NAME "Orphan channel [%d]\n", ucChannelNum);
1311 P_GLUE_INFO_T prGlueInfo,
1312 BOOLEAN fgIsRtnlLockAcquired
1315 BOOLEAN fgDoRegister = FALSE;
1316 BOOLEAN fgRollbackRtnlLock = FALSE;
1319 GLUE_SPIN_LOCK_DECLARATION();
1322 ASSERT(prGlueInfo->prAdapter);
1325 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1326 if(prGlueInfo->prAdapter->rP2PNetRegState == ENUM_NET_REG_STATE_UNREGISTERED) {
1327 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_REGISTERING;
1328 fgDoRegister = TRUE;
1330 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1336 if(fgIsRtnlLockAcquired && rtnl_is_locked()) {
1337 fgRollbackRtnlLock = TRUE;
1341 /* Here are functions which need rtnl_lock */
1342 wiphy_register(prGlueInfo->prP2PInfo->wdev.wiphy);
1344 /* net device initialize */
1345 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1346 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1348 /* register for net device */
1349 if (register_netdev(prGlueInfo->prP2PInfo->prDevHandler) < 0) {
1350 printk(KERN_ALERT DRV_NAME "unable to register netdevice for p2p\n");
1352 free_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1357 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_REGISTERED;
1361 if(fgRollbackRtnlLock) {
1370 P_GLUE_INFO_T prGlueInfo,
1371 BOOLEAN fgIsRtnlLockAcquired
1374 BOOLEAN fgDoUnregister = FALSE;
1375 BOOLEAN fgRollbackRtnlLock = FALSE;
1377 GLUE_SPIN_LOCK_DECLARATION();
1380 ASSERT(prGlueInfo->prAdapter);
1382 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1383 if(prGlueInfo->prAdapter->rP2PNetRegState == ENUM_NET_REG_STATE_REGISTERED) {
1384 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_UNREGISTERING;
1385 fgDoUnregister = TRUE;
1387 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1389 if(!fgDoUnregister) {
1393 /* prepare for removal */
1394 if(netif_carrier_ok(prGlueInfo->prP2PInfo->prDevHandler)) {
1395 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1398 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1400 if(fgIsRtnlLockAcquired && rtnl_is_locked()) {
1401 fgRollbackRtnlLock = TRUE;
1404 /* Here are functions which need rtnl_lock */
1406 unregister_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1408 wiphy_unregister(prGlueInfo->prP2PInfo->wdev.wiphy);
1410 if(fgRollbackRtnlLock) {
1414 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_UNREGISTERED;
1420 /*----------------------------------------------------------------------------*/
1422 * \brief Update Channel table for cfg80211 for Wi-Fi Direct based on current country code
1424 * \param[in] prGlueInfo Pointer to glue info
1429 /*----------------------------------------------------------------------------*/
1431 p2pUpdateChannelTableByDomain(
1432 P_GLUE_INFO_T prGlueInfo
1435 UINT_8 i, uc2gChIdx, uc5gChIdx;
1436 UINT_8 ucMaxChannelNum = ARRAY_SIZE(mtk_2ghz_channels) + ARRAY_SIZE(mtk_5ghz_a_channels);
1437 UINT_8 ucNumOfChannel = ucMaxChannelNum;
1438 RF_CHANNEL_INFO_T aucChannelList[ucMaxChannelNum];
1440 uc2gChIdx = uc5gChIdx = 0;
1442 // 1. Disable all channel
1443 for(i = 0; i < ARRAY_SIZE(mtk_2ghz_channels); i++) {
1444 mtk_2ghz_channels[i].flags |= IEEE80211_CHAN_DISABLED;
1446 for(i = 0; i < ARRAY_SIZE(mtk_5ghz_a_channels); i++) {
1447 mtk_5ghz_a_channels[i].flags |= IEEE80211_CHAN_DISABLED;
1450 // 2. Get current domain channel list
1451 rlmDomainGetChnlList(prGlueInfo->prAdapter, BAND_NULL, ucMaxChannelNum, &ucNumOfChannel, aucChannelList);
1453 // 3. Enable specific channel based on domain channel list
1454 for(i = 0; i < ucNumOfChannel; i++) {
1455 switch(aucChannelList[i].eBand) {
1457 p2pEnableChannel(&uc2gChIdx, aucChannelList[i].ucChannelNum, mtk_2ghz_channels, ARRAY_SIZE(mtk_2ghz_channels));
1461 p2pEnableChannel(&uc5gChIdx, aucChannelList[i].ucChannelNum, mtk_5ghz_a_channels, ARRAY_SIZE(mtk_5ghz_a_channels));
1465 printk(KERN_ALERT DRV_NAME "Unknow band.\n");
1473 /*----------------------------------------------------------------------------*/
1475 * \brief Register for cfg80211 for Wi-Fi Direct
1477 * \param[in] prGlueInfo Pointer to glue info
1482 /*----------------------------------------------------------------------------*/
1485 P_GLUE_INFO_T prGlueInfo,
1486 const char *prDevName,
1490 P_ADAPTER_T prAdapter = NULL;
1491 P_GL_HIF_INFO_T prHif = NULL;
1492 PARAM_MAC_ADDRESS rMacAddr;
1493 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1494 struct device *prDev;
1499 prAdapter = prGlueInfo->prAdapter;
1502 prHif = &prGlueInfo->rHifInfo;
1505 printk("glRegisterP2P\n");
1507 /*0. allocate p2pinfo */
1508 if(!p2PAllocInfo(prGlueInfo)) {
1509 printk(KERN_ALERT DRV_NAME "Allocate memory for p2p FAILED\n");
1513 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1514 /* 1. allocate WIPHY */
1515 prGlueInfo->prP2PInfo->wdev.wiphy = wiphy_new(&mtk_p2p_config_ops, sizeof(P_GLUE_INFO_T));
1516 if (!prGlueInfo->prP2PInfo->wdev.wiphy) {
1517 printk(KERN_ALERT DRV_NAME "unable to allocate wiphy for p2p\n");
1519 goto err_alloc_wiphy;
1522 /* 1.1 fill wiphy parameters */
1523 #if MTK_WCN_HIF_SDIO
1524 mtk_wcn_hif_sdio_get_dev(prHif->cltCtx, &prDev);
1526 printk(KERN_ALERT DRV_NAME "unable to get struct dev for p2p\n");
1529 prDev = &(prHif->func->dev);
1531 set_wiphy_dev(prGlueInfo->prP2PInfo->wdev.wiphy, prDev);
1533 prGlueInfo->prP2PInfo->wdev.wiphy->interface_modes = BIT(NL80211_IFTYPE_AP)
1534 | BIT(NL80211_IFTYPE_P2P_CLIENT)
1535 | BIT(NL80211_IFTYPE_P2P_GO)
1536 | BIT(NL80211_IFTYPE_STATION);
1538 p2pUpdateChannelTableByDomain(prGlueInfo);
1539 prGlueInfo->prP2PInfo->wdev.wiphy->bands[IEEE80211_BAND_2GHZ] = &mtk_band_2ghz;
1540 if(prAdapter->fgEnable5GBand) {
1541 prGlueInfo->prP2PInfo->wdev.wiphy->bands[IEEE80211_BAND_5GHZ] = &mtk_band_5ghz;
1544 prGlueInfo->prP2PInfo->wdev.wiphy->mgmt_stypes = mtk_cfg80211_default_mgmt_stypes;
1545 prGlueInfo->prP2PInfo->wdev.wiphy->max_remain_on_channel_duration = 5000;
1546 prGlueInfo->prP2PInfo->wdev.wiphy->n_cipher_suites = 5;
1547 prGlueInfo->prP2PInfo->wdev.wiphy->cipher_suites = (const u32*)cipher_suites;
1548 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)
1549 prGlueInfo->prP2PInfo->wdev.wiphy->flags = WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
1551 prGlueInfo->prP2PInfo->wdev.wiphy->flags = WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_HAVE_AP_SME;
1554 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)
1555 prGlueInfo->prP2PInfo->wdev.wiphy->max_scan_ssids = MAX_SCAN_LIST_NUM;
1556 prGlueInfo->prP2PInfo->wdev.wiphy->max_scan_ie_len = MAX_SCAN_IE_LEN;
1557 prGlueInfo->prP2PInfo->wdev.wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
1561 /* 2. Register WIPHY */
1562 if(wiphy_register(prGlueInfo->prP2PInfo->wdev.wiphy) < 0) {
1563 printk(KERN_ALERT DRV_NAME "Couldn't register wiphy device for p2p\n");
1569 /* 2.1 set priv as pointer to glue structure */
1570 *((P_GLUE_INFO_T *) wiphy_priv(prGlueInfo->prP2PInfo->wdev.wiphy)) = prGlueInfo;
1572 /* 2.2 wdev initialization */
1574 prGlueInfo->prP2PInfo->wdev.iftype = NL80211_IFTYPE_AP;
1576 prGlueInfo->prP2PInfo->wdev.iftype = NL80211_IFTYPE_P2P_CLIENT;
1579 #endif /* CFG_ENABLE_WIFI_DIRECT_CFG_80211 */
1581 /* 3. allocate netdev */
1582 prGlueInfo->prP2PInfo->prDevHandler = alloc_netdev_mq(sizeof(P_GLUE_INFO_T), prDevName, ether_setup, CFG_MAX_TXQ_NUM);
1583 if (!prGlueInfo->prP2PInfo->prDevHandler) {
1584 printk(KERN_ALERT DRV_NAME "unable to allocate netdevice for p2p\n");
1586 printk("unable to allocate netdevice for p2p\n");
1588 goto err_alloc_netdev;
1591 /* 4. setup netdev */
1592 /* 4.1 Point to shared glue structure */
1593 *((P_GLUE_INFO_T *) netdev_priv(prGlueInfo->prP2PInfo->prDevHandler)) = prGlueInfo;
1595 /* 4.2 fill hardware address */
1596 COPY_MAC_ADDR(rMacAddr, prAdapter->rMyMacAddr);
1597 rMacAddr[0] ^= 0x2; // change to local administrated address
1598 memcpy(prGlueInfo->prP2PInfo->prDevHandler->dev_addr, rMacAddr, ETH_ALEN);
1599 memcpy(prGlueInfo->prP2PInfo->prDevHandler->perm_addr, prGlueInfo->prP2PInfo->prDevHandler->dev_addr, ETH_ALEN);
1601 /* 4.3 register callback functions */
1602 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
1603 prGlueInfo->prP2PInfo->prDevHandler->netdev_ops = &p2p_netdev_ops;
1605 prGlueInfo->prP2PInfo->prDevHandler->open = p2pOpen;
1606 prGlueInfo->prP2PInfo->prDevHandler->stop = p2pStop;
1607 prGlueInfo->prP2PInfo->prDevHandler->get_stats = p2pGetStats;
1608 prGlueInfo->prP2PInfo->prDevHandler->set_multicast_list = p2pSetMulticastList;
1609 prGlueInfo->prP2PInfo->prDevHandler->hard_start_xmit = p2pHardStartXmit;
1610 prGlueInfo->prP2PInfo->prDevHandler->do_ioctl = p2pDoIOCTL;
1611 prGlueInfo->prP2PInfo->prDevHandler->set_mac_address = p2pSetMACAddress;
1613 // prGlueInfo->prP2PInfo->prDevHandler->wireless_handlers = &mtk_p2p_wext_handler_def;
1616 #if (MTK_WCN_HIF_SDIO == 0)
1617 SET_NETDEV_DEV(prGlueInfo->prP2PInfo->prDevHandler, &(prHif->func->dev));
1621 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1622 prGlueInfo->prP2PInfo->prDevHandler->ieee80211_ptr = &(prGlueInfo->prP2PInfo->wdev);
1623 prGlueInfo->prP2PInfo->wdev.netdev = prGlueInfo->prP2PInfo->prDevHandler;
1626 #if CFG_TCP_IP_CHKSUM_OFFLOAD
1627 prGlueInfo->prP2PInfo->prDevHandler->features = NETIF_F_IP_CSUM;
1628 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
1631 /* 7. net device initialize */
1632 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1633 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1635 /* 8. register for net device */
1636 if (register_netdev(prGlueInfo->prP2PInfo->prDevHandler) < 0) {
1637 printk(KERN_ALERT DRV_NAME "unable to register netdevice for p2p\n");
1639 goto err_reg_netdev;
1643 /* 8. set p2p net device register state */
1644 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_UNREGISTERED;
1646 /* 9. setup running mode*/
1647 prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo->fgIsApMode = fgIsApMode;
1650 p2pFsmInit(prAdapter);
1652 p2pFuncInitConnectionSettings(prAdapter, prAdapter->rWifiVar.prP2PConnSettings);
1654 /* Active network too early would cause HW not able to sleep.
1655 * Defer the network active time.
1657 // nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
1662 free_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1665 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1666 // wiphy_unregister(prGlueInfo->prP2PInfo->wdev.wiphy);
1669 wiphy_free(prGlueInfo->prP2PInfo->wdev.wiphy);
1670 prGlueInfo->prP2PInfo->wdev.wiphy = NULL;
1676 } /* end of glRegisterP2P() */
1679 /*----------------------------------------------------------------------------*/
1681 * \brief Unregister Net Device for Wi-Fi Direct
1683 * \param[in] prGlueInfo Pointer to glue info
1688 /*----------------------------------------------------------------------------*/
1691 P_GLUE_INFO_T prGlueInfo
1696 p2pFsmUninit(prGlueInfo->prAdapter);
1698 nicDeactivateNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1701 /* Release command, mgmt and security frame belong to P2P network in
1702 * prGlueInfo->prCmdQue
1703 * prAdapter->rPendingCmdQueue
1704 * prAdapter->rTxCtrl.rTxMgmtTxingQueue
1705 * To ensure there is no pending CmdDone/TxDone handler to be executed after p2p module is removed.
1709 kalClearMgmtFramesByNetType(prGlueInfo, NETWORK_TYPE_P2P_INDEX);
1710 kalClearSecurityFramesByNetType(prGlueInfo, NETWORK_TYPE_P2P_INDEX);
1711 /* Clear PendingCmdQue*/
1712 wlanReleasePendingCMDbyNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1713 /* Clear PendingTxMsdu */
1714 nicFreePendingTxMsduInfoByNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1718 /* prepare for removal */
1719 if(netif_carrier_ok(prGlueInfo->prP2PInfo->prDevHandler)) {
1720 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1723 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1725 /* netdevice unregistration & free */
1726 unregister_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1728 free_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1729 prGlueInfo->prP2PInfo->prDevHandler = NULL;
1731 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1733 wiphy_unregister(prGlueInfo->prP2PInfo->wdev.wiphy);
1735 wiphy_free(prGlueInfo->prP2PInfo->wdev.wiphy);
1736 prGlueInfo->prP2PInfo->wdev.wiphy = NULL;
1739 /* Free p2p memory */
1741 if(!p2PFreeInfo(prGlueInfo)) {
1742 printk(KERN_ALERT DRV_NAME "Free memory for p2p FAILED\n");
1749 } /* end of glUnregisterP2P() */
1752 /*----------------------------------------------------------------------------*/
1754 * \brief A function for stop p2p fsm immediate
1756 * \param[in] prGlueInfo Pointer to struct P_GLUE_INFO_T.
1758 * \retval TRUE The execution succeeds.
1759 * \retval FALSE The execution failed.
1761 /*----------------------------------------------------------------------------*/
1764 P_GLUE_INFO_T prGlueInfo
1767 // P_ADAPTER_T prAdapter = NULL;
1768 // P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch;
1772 // prAdapter = prGlueInfo->prAdapter;
1773 // ASSERT(prAdapter);
1775 /* 1. stop TX queue */
1776 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1780 /* 2. switch P2P-FSM off */
1781 /* 2.1 allocate for message */
1782 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(
1785 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
1787 if (!prFuncSwitch) {
1788 ASSERT(0); // Can't trigger P2P FSM
1789 printk(KERN_ALERT DRV_NAME "Allocate for p2p mesasage FAILED\n");
1793 /* 2.2 fill message */
1794 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
1795 prFuncSwitch->fgIsFuncOn = FALSE;
1797 /* 2.3 send message */
1798 mboxSendMsg(prAdapter,
1800 (P_MSG_HDR_T) prFuncSwitch,
1801 MSG_SEND_METHOD_UNBUF);
1805 /* 3. stop queue and turn off carrier */
1806 prGlueInfo->prP2PInfo->eState = PARAM_MEDIA_STATE_DISCONNECTED;
1809 } /* end of p2pStop() */
1812 /* Net Device Hooks */
1813 /*----------------------------------------------------------------------------*/
1815 * \brief A function for net_device open (ifup)
1817 * \param[in] prDev Pointer to struct net_device.
1819 * \retval 0 The execution succeeds.
1820 * \retval < 0 The execution failed.
1822 /*----------------------------------------------------------------------------*/
1825 IN struct net_device *prDev
1828 // P_GLUE_INFO_T prGlueInfo = NULL;
1829 // P_ADAPTER_T prAdapter = NULL;
1830 // P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch;
1834 #if 0 // Move after device name set. (mtk_p2p_set_local_dev_info)
1835 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
1838 prAdapter = prGlueInfo->prAdapter;
1841 /* 1. switch P2P-FSM on */
1842 /* 1.1 allocate for message */
1843 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(prAdapter,
1845 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
1847 if (!prFuncSwitch) {
1848 ASSERT(0); // Can't trigger P2P FSM
1852 /* 1.2 fill message */
1853 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
1854 prFuncSwitch->fgIsFuncOn = TRUE;
1856 /* 1.3 send message */
1857 mboxSendMsg(prAdapter,
1859 (P_MSG_HDR_T) prFuncSwitch,
1860 MSG_SEND_METHOD_BUF);
1863 /* 2. carrier on & start TX queue */
1864 netif_carrier_on(prDev);
1865 netif_tx_start_all_queues(prDev);
1867 return 0; /* success */
1868 } /* end of p2pOpen() */
1871 /*----------------------------------------------------------------------------*/
1873 * \brief A function for net_device stop (ifdown)
1875 * \param[in] prDev Pointer to struct net_device.
1877 * \retval 0 The execution succeeds.
1878 * \retval < 0 The execution failed.
1880 /*----------------------------------------------------------------------------*/
1883 IN struct net_device *prDev
1886 P_GLUE_INFO_T prGlueInfo = NULL;
1887 // P_ADAPTER_T prAdapter = NULL;
1888 // P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch;
1889 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1891 struct cfg80211_scan_request *prScanRequest = NULL;
1892 GLUE_SPIN_LOCK_DECLARATION();
1895 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
1898 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1899 ASSERT(prGlueP2pInfo);
1902 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1903 if(prGlueP2pInfo->prScanRequest != NULL) {
1904 prScanRequest = prGlueP2pInfo->prScanRequest;
1905 prGlueP2pInfo->prScanRequest = NULL;
1907 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1910 cfg80211_scan_done(prScanRequest, TRUE);
1915 /* 1. stop TX queue */
1916 netif_tx_stop_all_queues(prDev);
1918 /* 2. switch P2P-FSM off */
1919 /* 2.1 allocate for message */
1920 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(prAdapter,
1922 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
1924 if (!prFuncSwitch) {
1925 ASSERT(0); // Can't trigger P2P FSM
1929 /* 2.2 fill message */
1930 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
1931 prFuncSwitch->fgIsFuncOn = FALSE;
1933 /* 2.3 send message */
1934 mboxSendMsg(prAdapter,
1936 (P_MSG_HDR_T) prFuncSwitch,
1937 MSG_SEND_METHOD_BUF);
1939 /* 3. stop queue and turn off carrier */
1940 prGlueInfo->prP2PInfo->eState = PARAM_MEDIA_STATE_DISCONNECTED;
1942 netif_tx_stop_all_queues(prDev);
1943 if(netif_carrier_ok(prDev)) {
1944 netif_carrier_off(prDev);
1948 } /* end of p2pStop() */
1951 /*----------------------------------------------------------------------------*/
1953 * \brief A method of struct net_device, to get the network interface statistical
1956 * Whenever an application needs to get statistics for the interface, this method
1957 * is called. This happens, for example, when ifconfig or netstat -i is run.
1959 * \param[in] prDev Pointer to struct net_device.
1961 * \return net_device_stats buffer pointer.
1963 /*----------------------------------------------------------------------------*/
1964 struct net_device_stats *
1966 IN struct net_device *prDev
1969 P_GLUE_INFO_T prGlueInfo = NULL;
1972 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
1974 #if 0 // frog temp fix
1976 //prDev->stats.rx_packets = 0;
1977 //prDev->stats.tx_packets = 0;
1978 prDev->stats.tx_errors = 0;
1979 prDev->stats.rx_errors = 0;
1980 //prDev->stats.rx_bytes = 0;
1981 //prDev->stats.tx_bytes = 0;
1982 prDev->stats.multicast = 0;
1984 return &prDev->stats;
1987 //prGlueInfo->prP2PInfo->rNetDevStats.rx_packets = 0;
1988 //prGlueInfo->prP2PInfo->rNetDevStats.tx_packets = 0;
1989 prGlueInfo->prP2PInfo->rNetDevStats.tx_errors = 0;
1990 prGlueInfo->prP2PInfo->rNetDevStats.rx_errors = 0;
1991 //prGlueInfo->prP2PInfo->rNetDevStats.rx_bytes = 0;
1992 //prGlueInfo->prP2PInfo->rNetDevStats.tx_bytes = 0;
1993 //prGlueInfo->prP2PInfo->rNetDevStats.rx_errors = 0;
1994 prGlueInfo->prP2PInfo->rNetDevStats.multicast = 0;
1996 return &prGlueInfo->prP2PInfo->rNetDevStats;
1998 } /* end of p2pGetStats() */
2004 p2pSetMulticastList (
2005 IN struct net_device *prDev
2008 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
2010 prGlueInfo = (NULL != prDev) ? *((P_GLUE_INFO_T *) netdev_priv(prDev)) : NULL;
2014 if (!prDev || !prGlueInfo) {
2015 printk(KERN_WARNING DRV_NAME" abnormal dev or skb: prDev(0x%p), prGlueInfo(0x%p)\n", prDev, prGlueInfo);
2022 //4 Mark HALT, notify main thread to finish current job
2023 prGlueInfo->u4Flag |= GLUE_FLAG_SUB_MOD_MULTICAST;
2024 /* wake up main thread */
2025 wake_up_interruptible(&prGlueInfo->waitq);
2027 } /* p2pSetMulticastList */
2030 /*----------------------------------------------------------------------------*/
2032 * \brief This function is to set multicast list and set rx mode.
2034 * \param[in] prDev Pointer to struct net_device
2038 /*----------------------------------------------------------------------------*/
2040 mtk_p2p_wext_set_Multicastlist (
2041 P_GLUE_INFO_T prGlueInfo
2044 UINT_32 u4SetInfoLen = 0;
2045 struct net_device *prDev = g_P2pPrDev;
2047 prGlueInfo = (NULL != prDev) ? *((P_GLUE_INFO_T *) netdev_priv(prDev)) : NULL;
2051 if (!prDev || !prGlueInfo) {
2052 printk(KERN_WARNING DRV_NAME" abnormal dev or skb: prDev(0x%p), prGlueInfo(0x%p)\n", prDev, prGlueInfo);
2057 if (prDev->flags & IFF_PROMISC) {
2058 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_PROMISCUOUS;
2061 if (prDev->flags & IFF_BROADCAST) {
2062 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_BROADCAST;
2065 if (prDev->flags & IFF_MULTICAST) {
2066 if ((prDev->flags & IFF_ALLMULTI) ||
2067 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
2068 (netdev_mc_count(prDev) > MAX_NUM_GROUP_ADDR)) {
2070 (prDev->mc_count > MAX_NUM_GROUP_ADDR)) {
2072 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_ALL_MULTICAST;
2075 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_MULTICAST;
2079 if (prGlueInfo->prP2PInfo->u4PacketFilter & PARAM_PACKET_FILTER_MULTICAST) {
2080 /* Prepare multicast address list */
2081 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
2082 struct netdev_hw_addr *ha;
2084 struct dev_mc_list *prMcList;
2088 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
2089 netdev_for_each_mc_addr(ha, prDev) {
2090 if(i < MAX_NUM_GROUP_ADDR) {
2091 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucMCAddrList[i]), ha->addr);
2096 for (i = 0, prMcList = prDev->mc_list;
2097 (prMcList) && (i < prDev->mc_count) && (i < MAX_NUM_GROUP_ADDR);
2098 i++, prMcList = prMcList->next) {
2099 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucMCAddrList[i]), prMcList->dmi_addr);
2103 DBGLOG(P2P, TRACE, ("SEt Multicast Address List\n"));
2105 if (i >= MAX_NUM_GROUP_ADDR) {
2108 wlanoidSetP2PMulticastList(prGlueInfo->prAdapter,
2109 &(prGlueInfo->prP2PInfo->aucMCAddrList[0]),
2116 } /* end of p2pSetMulticastList() */
2119 /*----------------------------------------------------------------------------*/
2121 * * \brief This function is TX entry point of NET DEVICE.
2123 * * \param[in] prSkb Pointer of the sk_buff to be sent
2124 * * \param[in] prDev Pointer to struct net_device
2126 * * \retval NETDEV_TX_OK - on success.
2127 * * \retval NETDEV_TX_BUSY - on failure, packet will be discarded by upper layer.
2129 /*----------------------------------------------------------------------------*/
2132 IN struct sk_buff *prSkb,
2133 IN struct net_device *prDev
2136 P_QUE_ENTRY_T prQueueEntry = NULL;
2137 P_QUE_T prTxQueue = NULL;
2138 P_GLUE_INFO_T prGlueInfo = NULL;
2139 UINT_16 u2QueueIdx = 0;
2141 GLUE_SPIN_LOCK_DECLARATION();
2146 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2148 if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) {
2149 printk(KERN_INFO DRV_NAME"GLUE_FLAG_HALT skip tx\n");
2150 dev_kfree_skb(prSkb);
2151 return NETDEV_TX_OK;
2154 // mark as P2P packets
2155 GLUE_SET_PKT_FLAG_P2P(prSkb);
2157 prQueueEntry = (P_QUE_ENTRY_T) GLUE_GET_PKT_QUEUE_ENTRY(prSkb);
2158 prTxQueue = &prGlueInfo->rTxQueue;
2160 if (wlanProcessSecurityFrame(prGlueInfo->prAdapter, (P_NATIVE_PACKET) prSkb) == FALSE) {
2162 u2QueueIdx = skb_get_queue_mapping(prSkb);
2163 ASSERT(u2QueueIdx < CFG_MAX_TXQ_NUM);
2165 if (u2QueueIdx >= CFG_MAX_TXQ_NUM) {
2166 printk(KERN_INFO DRV_NAME"Incorrect queue index, skip this frame\n");
2167 dev_kfree_skb(prSkb);
2168 return NETDEV_TX_OK;
2170 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_TX_QUE);
2171 QUEUE_INSERT_TAIL(prTxQueue, prQueueEntry);
2172 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_TX_QUE);
2174 GLUE_INC_REF_CNT(prGlueInfo->i4TxPendingFrameNum);
2175 GLUE_INC_REF_CNT(prGlueInfo->ai4TxPendingFrameNumPerQueue[NETWORK_TYPE_P2P_INDEX][u2QueueIdx]);
2177 if (prGlueInfo->ai4TxPendingFrameNumPerQueue[NETWORK_TYPE_P2P_INDEX][u2QueueIdx] >= CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD) {
2178 netif_stop_subqueue(prDev, u2QueueIdx);
2182 GLUE_INC_REF_CNT(prGlueInfo->i4TxPendingSecurityFrameNum);
2185 kalSetEvent(prGlueInfo);
2187 /* Statistic usage. */
2188 prGlueInfo->prP2PInfo->rNetDevStats.tx_bytes += prSkb->len;
2189 prGlueInfo->prP2PInfo->rNetDevStats.tx_packets++;
2190 //prDev->stats.tx_packets++;
2192 return NETDEV_TX_OK;
2193 } /* end of p2pHardStartXmit() */
2196 /*----------------------------------------------------------------------------*/
2198 * \brief A method of struct net_device, a primary SOCKET interface to configure
2199 * the interface lively. Handle an ioctl call on one of our devices.
2200 * Everything Linux ioctl specific is done here. Then we pass the contents
2201 * of the ifr->data to the request message handler.
2203 * \param[in] prDev Linux kernel netdevice
2205 * \param[in] prIFReq Our private ioctl request structure, typed for the generic
2206 * struct ifreq so we can use ptr to function
2208 * \param[in] cmd Command ID
2210 * \retval WLAN_STATUS_SUCCESS The IOCTL command is executed successfully.
2211 * \retval OTHER The execution of IOCTL command is failed.
2213 /*----------------------------------------------------------------------------*/
2216 struct net_device *prDev,
2217 struct ifreq *prIFReq,
2221 P_GLUE_INFO_T prGlueInfo = NULL;
2223 char *prExtraBuf = NULL;
2224 UINT_32 u4ExtraSize = 0;
2225 struct iwreq *prIwReq = (struct iwreq *)prIFReq;
2226 struct iw_request_info rIwReqInfo;
2230 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2232 if (prGlueInfo->u4ReadyFlag == 0) {
2233 // adapter not ready yet
2238 rIwReqInfo.cmd = (__u16)i4Cmd;
2239 rIwReqInfo.flags = 0;
2242 case SIOCSIWENCODEEXT:
2243 /* Set Encryption Material after 4-way handshaking is done */
2244 if (prIwReq->u.encoding.pointer) {
2245 u4ExtraSize = prIwReq->u.encoding.length;
2246 prExtraBuf = kalMemAlloc(u4ExtraSize, VIR_MEM_TYPE);
2253 if (copy_from_user(prExtraBuf,
2254 prIwReq->u.encoding.pointer,
2255 prIwReq->u.encoding.length)) {
2259 else if (prIwReq->u.encoding.length != 0) {
2265 ret = mtk_p2p_wext_set_key(prDev, &rIwReqInfo, &(prIwReq->u), prExtraBuf);
2268 kalMemFree(prExtraBuf, VIR_MEM_TYPE, u4ExtraSize);
2273 /* IW_MLME_DISASSOC used for disconnection*/
2274 if (prIwReq->u.data.length != sizeof(struct iw_mlme)) {
2275 printk(KERN_INFO "MLME buffer strange:%d\n", prIwReq->u.data.length);
2280 if (!prIwReq->u.data.pointer) {
2285 prExtraBuf = kalMemAlloc(sizeof(struct iw_mlme), VIR_MEM_TYPE);
2291 if (copy_from_user(prExtraBuf, prIwReq->u.data.pointer, sizeof(struct iw_mlme))) {
2295 ret = mtk_p2p_wext_mlme_handler(prDev, &rIwReqInfo, &(prIwReq->u), prExtraBuf);
2298 kalMemFree(prExtraBuf, VIR_MEM_TYPE, sizeof(struct iw_mlme));
2303 /* This ioctl is used to list all IW privilege ioctls */
2304 ret = mtk_p2p_wext_get_priv(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2308 ret = mtk_p2p_wext_discovery_results(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2312 ret = mtk_p2p_wext_set_auth(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2315 case IOC_P2P_CFG_DEVICE:
2316 case IOC_P2P_PROVISION_COMPLETE:
2317 case IOC_P2P_START_STOP_DISCOVERY:
2318 case IOC_P2P_DISCOVERY_RESULTS:
2319 case IOC_P2P_WSC_BEACON_PROBE_RSP_IE:
2320 case IOC_P2P_CONNECT_DISCONNECT:
2321 case IOC_P2P_PASSWORD_READY:
2322 case IOC_P2P_GET_STRUCT:
2323 case IOC_P2P_SET_STRUCT:
2324 case IOC_P2P_GET_REQ_DEVICE_INFO:
2325 ret = rP2PIwPrivHandler[i4Cmd - SIOCIWFIRSTPRIV](prDev, &rIwReqInfo, &(prIwReq->u), (char *)&(prIwReq->u));
2327 #if CFG_SUPPORT_P2P_RSSI_QUERY
2329 ret = mtk_p2p_wext_get_rssi(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2337 } /* end of p2pDoIOCTL() */
2340 /*----------------------------------------------------------------------------*/
2342 * \brief To report the private supported IOCTLs table to user space.
2344 * \param[in] prDev Net device requested.
2345 * \param[out] prIfReq Pointer to ifreq structure, content is copied back to
2346 * user space buffer in gl_iwpriv_table.
2348 * \retval 0 For success.
2349 * \retval -E2BIG For user's buffer size is too small.
2350 * \retval -EFAULT For fail.
2353 /*----------------------------------------------------------------------------*/
2355 mtk_p2p_wext_get_priv (
2356 IN struct net_device *prDev,
2357 IN struct iw_request_info *info,
2358 IN OUT union iwreq_data *wrqu,
2362 struct iw_point *prData= (struct iw_point *)&wrqu->data;
2363 UINT_16 u2BufferSize = 0;
2367 u2BufferSize = prData->length;
2369 /* update our private table size */
2370 prData->length = (__u16)sizeof(rP2PIwPrivTable)/sizeof(struct iw_priv_args);
2372 if (u2BufferSize < prData->length) {
2376 if (prData->length) {
2377 if (copy_to_user(prData->pointer, rP2PIwPrivTable, sizeof(rP2PIwPrivTable))) {
2383 } /* end of mtk_p2p_wext_get_priv() */
2386 /*----------------------------------------------------------------------------*/
2388 * \brief To indicate P2P-FSM for re-associate to the connecting device
2390 * \param[in] prDev Net device requested.
2391 * \param[inout] wrqu Pointer to iwreq_data
2393 * \retval 0 For success.
2394 * \retval -EFAULT For fail.
2397 /*----------------------------------------------------------------------------*/
2399 mtk_p2p_wext_reconnect (
2400 IN struct net_device *prDev,
2401 IN struct iw_request_info *info,
2402 IN OUT union iwreq_data *wrqu,
2407 P_ADAPTER_T prAdapter = NULL;
2408 P_GLUE_INFO_T prGlueInfo = NULL;
2409 P_MSG_HDR_T prMsgHdr;
2413 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2416 prAdapter = prGlueInfo->prAdapter;
2419 prMsgHdr = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_HDR_T));
2421 ASSERT(0); // Can't trigger P2P FSM
2425 /* 1.2 fill message */
2427 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_reconnect: P2P Reconnect\n"));
2429 /* 1.3 send message */
2430 mboxSendMsg(prAdapter,
2432 (P_MSG_HDR_T) prMsgHdr,
2433 MSG_SEND_METHOD_BUF);
2436 } /* end of mtk_p2p_wext_reconnect() */
2441 /*----------------------------------------------------------------------------*/
2443 * \brief MLME command handler
2445 * \param[in] prDev Net device requested.
2446 * \param[inout] wrqu Pointer to iwreq_data
2448 * \retval 0 Success.
2449 * \retval -EFAULT Setting parameters to driver fail.
2450 * \retval -EOPNOTSUPP Key size not supported.
2454 /*----------------------------------------------------------------------------*/
2456 mtk_p2p_wext_mlme_handler(
2457 IN struct net_device *prDev,
2458 IN struct iw_request_info *info,
2459 IN OUT union iwreq_data *wrqu,
2464 P_ADAPTER_T prAdapter = NULL;
2465 P_GLUE_INFO_T prGlueInfo = NULL;
2466 struct iw_mlme *mlme = (struct iw_mlme *)extra;
2467 P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt = (P_MSG_P2P_CONNECTION_ABORT_T)NULL;
2468 P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T)NULL;
2472 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2475 prAdapter = prGlueInfo->prAdapter;
2478 prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
2480 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_mlme_handler:\n"));
2482 switch (mlme->cmd) {
2483 case IW_MLME_DISASSOC:
2484 prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_CONNECTION_ABORT_T));
2485 if (!prMsgP2PConnAbt) {
2486 ASSERT(0); // Can't trigger P2P FSM
2490 COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, mlme->addr.sa_data);
2492 prMsgP2PConnAbt->u2ReasonCode = mlme->reason_code;
2495 if (EQUAL_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prP2pBssInfo->aucOwnMacAddr)) {
2496 DBGLOG(P2P, TRACE, ("P2P Connection Abort:\n"));
2498 /* 1.2 fill message */
2499 prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT;
2502 DBGLOG(P2P, TRACE, ("P2P Connection Pause:\n"));
2504 /* 1.2 fill message */
2507 /* 1.3 send message */
2508 mboxSendMsg(prAdapter,
2510 (P_MSG_HDR_T) prMsgP2PConnAbt,
2511 MSG_SEND_METHOD_BUF);
2520 } /* end of mtk_p2p_wext_mlme_handler() */
2523 /*----------------------------------------------------------------------------*/
2525 * \brief P2P Private I/O Control handler (IOC_P2P_PROVISION_COMPLETE)
2527 * \param[in] prDev Net device requested.
2528 * \param[inout] wrqu Pointer to iwreq_data
2530 * \retval 0 Success.
2531 * \retval -EFAULT Setting parameters to driver fail.
2532 * \retval -EOPNOTSUPP Key size not supported.
2536 /*----------------------------------------------------------------------------*/
2538 mtk_p2p_wext_set_provision_complete(
2539 IN struct net_device *prDev,
2540 IN struct iw_request_info *info,
2541 IN OUT union iwreq_data *wrqu,
2546 P_ADAPTER_T prAdapter = NULL;
2547 P_GLUE_INFO_T prGlueInfo = NULL;
2548 struct iw_point *prData= (struct iw_point *)&wrqu->data;
2549 P_MSG_HDR_T prMsgHdr;
2553 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2556 prAdapter = prGlueInfo->prAdapter;
2559 switch(prData->flags) {
2560 case P2P_PROVISIONING_SUCCESS:
2561 prMsgHdr = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_HDR_T));
2563 ASSERT(0); // Can't trigger P2P FSM
2567 /* 1.2 fill message */
2569 prGlueInfo->prP2PInfo->u4CipherPairwise = IW_AUTH_CIPHER_CCMP;
2571 /* 1.3 send message */
2572 mboxSendMsg(prAdapter,
2574 (P_MSG_HDR_T) prMsgHdr,
2575 MSG_SEND_METHOD_BUF);
2579 case P2P_PROVISIONING_FAIL:
2589 } /* end of mtk_p2p_wext_set_provision_complete() */
2593 /*----------------------------------------------------------------------------*/
2595 * \brief P2P Private I/O Control handler (IOC_P2P_START_STOP_DISCOVERY)
2597 * \param[in] prDev Net device requested.
2598 * \param[inout] wrqu Pointer to iwreq_data
2600 * \retval 0 Success.
2601 * \retval -EFAULT Setting parameters to driver fail.
2602 * \retval -EOPNOTSUPP Key size not supported.
2606 /*----------------------------------------------------------------------------*/
2608 mtk_p2p_wext_start_stop_discovery(
2609 IN struct net_device *prDev,
2610 IN struct iw_request_info *info,
2611 IN OUT union iwreq_data *wrqu,
2616 P_ADAPTER_T prAdapter = NULL;
2617 P_GLUE_INFO_T prGlueInfo = NULL;
2618 struct iw_point *prData= (struct iw_point *)&wrqu->data;
2619 P_IW_P2P_REQ_DEVICE_TYPE prReqDeviceType = (P_IW_P2P_REQ_DEVICE_TYPE) extra;
2620 UINT_8 au4IeBuf[MAX_IE_LENGTH];
2621 P_MSG_HDR_T prMsgHdr;
2622 P_MSG_P2P_DEVICE_DISCOVER_T prDiscoverMsg;
2623 P_P2P_CONNECTION_SETTINGS_T prConnSettings;
2624 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
2628 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2631 prAdapter = prGlueInfo->prAdapter;
2634 prConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
2636 if(prData->flags == P2P_STOP_DISCOVERY) {
2637 prMsgHdr = (P_MSG_HDR_T) cnmMemAlloc(prAdapter,
2642 ASSERT(0); // Can't trigger P2P FSM
2647 mboxSendMsg(prAdapter,
2649 (P_MSG_HDR_T) prMsgHdr,
2650 MSG_SEND_METHOD_BUF);
2652 else if(prData->flags == P2P_START_DISCOVERY) {
2654 /* retrieve IE for Probe Response */
2655 if(prReqDeviceType->probe_rsp_len > 0) {
2656 if(prReqDeviceType->probe_rsp_len <= MAX_IE_LENGTH) {
2657 if(copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prReqDeviceType->probe_rsp_ie, prReqDeviceType->probe_rsp_len)) {
2660 prGlueInfo->prP2PInfo->u2WSCIELen[2] = prReqDeviceType->probe_rsp_len;
2667 /* retrieve IE for Probe Request */
2668 if(prReqDeviceType->probe_req_len > 0) {
2669 if(prReqDeviceType->probe_req_len <= MAX_IE_LENGTH) {
2670 if(copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[1], prReqDeviceType->probe_req_ie, prReqDeviceType->probe_req_len)) {
2673 prGlueInfo->prP2PInfo->u2WSCIELen[1] = prReqDeviceType->probe_req_len;
2679 /* update IE for Probe Request */
2681 if(prReqDeviceType->scan_type == P2P_LISTEN) {
2682 /* update listening parameter */
2684 /* @TODO: update prConnSettings for Probe Response IE */
2687 // indicate P2P-FSM with MID_MNY_P2P_DEVICE_DISCOVERY
2688 prDiscoverMsg = (P_MSG_P2P_DEVICE_DISCOVER_T) cnmMemAlloc(prAdapter,
2690 sizeof(MSG_P2P_DEVICE_DISCOVER_T));
2692 if (!prDiscoverMsg) {
2693 ASSERT(0); // Can't trigger P2P FSM
2697 prDiscoverMsg->rMsgHdr.eMsgId = MID_MNY_P2P_DEVICE_DISCOVERY;
2698 prDiscoverMsg->u4DevDiscoverTime = 0; // unlimited
2699 prDiscoverMsg->fgIsSpecificType = TRUE;
2700 prDiscoverMsg->rTargetDeviceType.u2CategoryID = *(PUINT_16)(&(prReqDeviceType->pri_device_type[0]));
2701 prDiscoverMsg->rTargetDeviceType.u2SubCategoryID = *(PUINT_16)(&(prReqDeviceType->pri_device_type[6]));;
2702 COPY_MAC_ADDR(prDiscoverMsg->aucTargetDeviceID, aucNullAddr);
2704 /* @FIXME: parameter to be refined, where to pass IE buffer ? */
2705 mboxSendMsg(prAdapter,
2707 (P_MSG_HDR_T) prDiscoverMsg,
2708 MSG_SEND_METHOD_BUF);
2717 } /* end of mtk_p2p_wext_start_stop_discovery() */
2721 /*----------------------------------------------------------------------------*/
2723 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
2725 * \param[in] prDev Net device requested.
2726 * \param[inout] wrqu Pointer to iwreq_data
2728 * \retval 0 Success.
2729 * \retval -EFAULT Setting parameters to driver fail.
2730 * \retval -EOPNOTSUPP Setting parameters not support.
2734 /*----------------------------------------------------------------------------*/
2736 mtk_p2p_wext_invitation_request (
2737 IN struct net_device *prDev,
2738 IN struct iw_request_info *info,
2739 IN OUT union iwreq_data *wrqu,
2745 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
2746 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
2747 struct iw_point *prData = (struct iw_point*)&wrqu->data;
2748 P_IW_P2P_IOCTL_INVITATION_STRUCT prIoctlInvitation = (P_IW_P2P_IOCTL_INVITATION_STRUCT)NULL;
2751 if ((prDev == NULL) || (extra == NULL)) {
2758 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
2759 prIoctlInvitation = (P_IW_P2P_IOCTL_INVITATION_STRUCT)extra;
2761 if (prGlueInfo == NULL) {
2767 prAdapter = prGlueInfo->prAdapter;
2769 if (prAdapter == NULL) {
2775 if (prIoctlInvitation->ucReinvoke == 1) {
2776 // TODO: Set Group ID
2777 p2pFuncSetGroupID(prAdapter, prIoctlInvitation->aucGroupID, prIoctlInvitation->aucSsid, prIoctlInvitation->u4SsidLen);
2781 P_MSG_P2P_INVITATION_REQUEST_T prMsgP2PInvitationReq = (P_MSG_P2P_INVITATION_REQUEST_T)NULL;
2783 // TODO: Do Invitation.
2784 prMsgP2PInvitationReq = (P_MSG_P2P_INVITATION_REQUEST_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_INVITATION_REQUEST_T));
2785 if (!prMsgP2PInvitationReq) {
2786 ASSERT(0); // Can't trigger P2P FSM
2791 /* 1.2 fill message */
2792 kalMemCopy(prMsgP2PInvitationReq->aucDeviceID, prIoctlInvitation->aucDeviceID, MAC_ADDR_LEN);
2794 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_invitation_request: P2P Invitation Req\n"));
2796 /* 1.3 send message */
2797 mboxSendMsg(prAdapter,
2799 (P_MSG_HDR_T)prMsgP2PInvitationReq,
2800 MSG_SEND_METHOD_BUF);
2812 /* mtk_p2p_wext_invitation_request */
2815 /*----------------------------------------------------------------------------*/
2817 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
2819 * \param[in] prDev Net device requested.
2820 * \param[inout] wrqu Pointer to iwreq_data
2822 * \retval 0 Success.
2823 * \retval -EFAULT Setting parameters to driver fail.
2824 * \retval -EOPNOTSUPP Setting parameters not support.
2828 /*----------------------------------------------------------------------------*/
2830 mtk_p2p_wext_invitation_abort (
2831 IN struct net_device *prDev,
2832 IN struct iw_request_info *info,
2833 IN OUT union iwreq_data *wrqu,
2839 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
2840 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
2841 struct iw_point *prData = (struct iw_point*)&wrqu->data;
2842 P_IW_P2P_IOCTL_ABORT_INVITATION prIoctlInvitationAbort = (P_IW_P2P_IOCTL_ABORT_INVITATION)NULL;
2844 UINT_8 bssid[MAC_ADDR_LEN];
2847 if ((prDev == NULL) || (extra == NULL)) {
2854 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
2855 prIoctlInvitationAbort = (P_IW_P2P_IOCTL_ABORT_INVITATION)extra;
2857 if (prGlueInfo == NULL) {
2863 prAdapter = prGlueInfo->prAdapter;
2865 if (prAdapter == NULL) {
2870 P_MSG_P2P_INVITATION_REQUEST_T prMsgP2PInvitationAbort = (P_MSG_P2P_INVITATION_REQUEST_T)NULL;
2872 prMsgP2PInvitationAbort = (P_MSG_P2P_INVITATION_REQUEST_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_INVITATION_REQUEST_T));
2874 if (!prMsgP2PInvitationAbort) {
2875 ASSERT(0); // Can't trigger P2P FSM
2881 /* 1.2 fill message */
2882 kalMemCopy(prMsgP2PInvitationAbort->aucDeviceID, prIoctlInvitationAbort->dev_addr, MAC_ADDR_LEN);
2884 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_invitation_request: P2P Invitation Req\n"));
2886 /* 1.3 send message */
2887 mboxSendMsg(prAdapter,
2889 (P_MSG_HDR_T)prMsgP2PInvitationAbort,
2890 MSG_SEND_METHOD_BUF);
2901 /* mtk_p2p_wext_invitation_abort */
2905 /*----------------------------------------------------------------------------*/
2907 * \brief To override p2p interface address
2909 * \param[in] prDev Net device requested.
2910 * \param[in] addr Pointer to address
2912 * \retval 0 For success.
2913 * \retval -E2BIG For user's buffer size is too small.
2914 * \retval -EFAULT For fail.
2917 /*----------------------------------------------------------------------------*/
2920 IN struct net_device *prDev,
2924 P_ADAPTER_T prAdapter = NULL;
2925 P_GLUE_INFO_T prGlueInfo = NULL;
2929 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2932 prAdapter = prGlueInfo->prAdapter;
2936 return eth_mac_addr(prDev, addr);
2945 /*----------------------------------------------------------------------------*/
2947 * \brief To set encryption cipher suite
2949 * \param[in] prDev Net device requested.
2952 * \retval 0 Success.
2953 * \retval -EINVAL Invalid parameter
2954 * \retval -EOPNOTSUPP Key size not supported.
2958 /*----------------------------------------------------------------------------*/
2960 mtk_p2p_wext_set_auth (
2961 IN struct net_device *prDev,
2962 IN struct iw_request_info *info,
2963 IN OUT union iwreq_data *wrqu,
2967 P_GLUE_INFO_T prGlueInfo = NULL;
2968 struct iw_param *prAuth = (struct iw_param *)wrqu;
2972 if (FALSE == GLUE_CHK_PR2(prDev, prAuth)) {
2976 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2978 /* Save information to glue info and process later when ssid is set. */
2979 switch(prAuth->flags & IW_AUTH_INDEX) {
2980 case IW_AUTH_WPA_VERSION:
2982 case IW_AUTH_CIPHER_PAIRWISE:
2983 prGlueInfo->prP2PInfo->u4CipherPairwise = prAuth->value;
2985 case IW_AUTH_CIPHER_GROUP:
2986 case IW_AUTH_KEY_MGMT:
2987 case IW_AUTH_TKIP_COUNTERMEASURES:
2988 case IW_AUTH_DROP_UNENCRYPTED:
2989 case IW_AUTH_80211_AUTH_ALG:
2990 case IW_AUTH_WPA_ENABLED:
2991 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
2992 case IW_AUTH_ROAMING_CONTROL:
2993 case IW_AUTH_PRIVACY_INVOKED:
3000 } /* end of mtk_p2p_wext_set_auth() */
3003 /*----------------------------------------------------------------------------*/
3005 * \brief To set encryption cipher and key.
3007 * \param[in] prDev Net device requested.
3008 * \param[out] prIfReq Pointer to ifreq structure, content is copied back to
3009 * user space buffer in gl_iwpriv_table.
3011 * \retval 0 Success.
3012 * \retval -EFAULT Setting parameters to driver fail.
3013 * \retval -EOPNOTSUPP Key size not supported.
3015 * \note Securiry information is stored in pEnc.
3017 /*----------------------------------------------------------------------------*/
3019 mtk_p2p_wext_set_key(
3020 IN struct net_device *prDev,
3021 IN struct iw_request_info *info,
3022 IN OUT union iwreq_data *wrqu,
3027 struct iw_encode_ext *prIWEncExt;
3028 struct iw_point *prEnc;
3029 char *prExtraBuf = NULL;
3030 UINT_32 u4ExtraSize = 0;
3031 UINT_8 keyStructBuf[100];
3032 P_PARAM_REMOVE_KEY_T prRemoveKey = (P_PARAM_REMOVE_KEY_T) keyStructBuf;
3033 P_PARAM_KEY_T prKey = (P_PARAM_KEY_T) keyStructBuf;
3034 P_GLUE_INFO_T prGlueInfo;
3035 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3036 UINT_32 u4BufLen = 0;
3038 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3041 if (wrqu->encoding.pointer) {
3042 u4ExtraSize = wrqu->encoding.length;
3043 prExtraBuf = kalMemAlloc(u4ExtraSize, VIR_MEM_TYPE);
3050 if (copy_from_user(prExtraBuf,
3051 wrqu->encoding.pointer,
3052 wrqu->encoding.length)) {
3057 else if (wrqu->encoding.length != 0) {
3062 prEnc = &wrqu->encoding;
3063 prIWEncExt = (struct iw_encode_ext *) prExtraBuf;
3065 if (GLUE_CHK_PR3(prDev, prEnc, prExtraBuf) == TRUE) {
3066 memset(keyStructBuf, 0, sizeof(keyStructBuf));
3068 if ((prEnc->flags & IW_ENCODE_MODE) == IW_ENCODE_DISABLED) { // Key Removal
3069 prRemoveKey->u4Length = sizeof(*prRemoveKey);
3070 memcpy(prRemoveKey->arBSSID, prIWEncExt->addr.sa_data, 6);
3072 rStatus = kalIoctl(prGlueInfo,
3073 wlanoidSetRemoveP2PKey,
3075 prRemoveKey->u4Length,
3082 if(rStatus != WLAN_STATUS_SUCCESS)
3086 if(prIWEncExt->alg == IW_ENCODE_ALG_CCMP) {
3088 prKey->u4KeyIndex = (prEnc->flags & IW_ENCODE_INDEX) ?
3089 ((prEnc->flags & IW_ENCODE_INDEX) - 1) : 0;
3090 if (prKey->u4KeyIndex <= 3) {
3091 /* bit(31) and bit(30) are shared by pKey and pRemoveKey */
3093 if (prIWEncExt->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
3094 prKey->u4KeyIndex |= 0x1UL << 31;
3097 /* Pairwise Key Bit(30) */
3098 if (prIWEncExt->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
3103 prKey->u4KeyIndex |= 0x1UL << 30;
3107 if (prIWEncExt->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
3108 prKey->u4KeyIndex |= 0x1UL << 29;
3109 memcpy(&prKey->rKeyRSC, prIWEncExt->rx_seq, IW_ENCODE_SEQ_MAX_SIZE);
3113 memcpy(prKey->arBSSID, prIWEncExt->addr.sa_data, 6);
3114 memcpy(prKey->aucKeyMaterial, prIWEncExt->key, prIWEncExt->key_len);
3116 prKey->u4KeyLength = prIWEncExt->key_len;
3117 prKey->u4Length = ((UINT_32)&(((P_PARAM_KEY_T)0)->aucKeyMaterial)) + prKey->u4KeyLength;
3119 rStatus = kalIoctl(prGlueInfo,
3120 wlanoidSetAddP2PKey,
3129 if (rStatus != WLAN_STATUS_SUCCESS) {
3148 kalMemFree(prExtraBuf, VIR_MEM_TYPE, u4ExtraSize);
3153 } /* end of mtk_p2p_wext_set_key() */
3158 /*----------------------------------------------------------------------------*/
3160 * \brief set the p2p gc power mode
3162 * \param[in] prDev Net device requested.
3163 * \param[inout] wrqu Pointer to iwreq_data
3165 * \retval 0 Success.
3166 * \retval -EFAULT Setting parameters to driver fail.
3167 * \retval -EOPNOTSUPP Key size not supported.
3171 /*----------------------------------------------------------------------------*/
3173 mtk_p2p_wext_set_powermode(
3174 IN struct net_device *prNetDev,
3175 IN struct iw_request_info *info,
3176 IN OUT union iwreq_data *wrqu,
3180 //printk("set_powermode = %d, value = %d\n", wrqu->power.disabled, wrqu->power.value);
3181 struct iw_param *prPower = (struct iw_param*)&wrqu->power;
3183 PARAM_POWER_MODE ePowerMode;
3184 INT_32 i4PowerValue;
3186 P_GLUE_INFO_T prGlueInfo = NULL;
3187 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3188 UINT_32 u4BufLen = 0;
3192 if (FALSE == GLUE_CHK_PR2(prNetDev, prPower)) {
3195 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
3197 //printk(KERN_INFO "wext_set_power value(%d) disabled(%d) flag(0x%x)\n",
3198 // prPower->value, prPower->disabled, prPower->flags);
3200 if(prPower->disabled){
3201 ePowerMode = Param_PowerModeCAM;
3204 i4PowerValue = prPower->value;
3205 #if WIRELESS_EXT < 21
3206 i4PowerValue /= 1000000;
3208 if (i4PowerValue == 0) {
3209 ePowerMode = Param_PowerModeCAM;
3210 } else if (i4PowerValue == 1) {
3211 ePowerMode = Param_PowerModeMAX_PSP;
3212 } else if (i4PowerValue == 2) {
3213 ePowerMode = Param_PowerModeFast_PSP;
3216 printk(KERN_DEBUG "%s(): unsupported power management mode value = %d.\n",
3225 rStatus = kalIoctl(prGlueInfo,
3226 wlanoidSetP2pPowerSaveProfile,
3235 if (rStatus != WLAN_STATUS_SUCCESS) {
3236 //printk(KERN_INFO DRV_NAME"wlanoidSet802dot11PowerSaveProfile fail 0x%lx\n", rStatus);
3246 /*----------------------------------------------------------------------------*/
3248 * \brief get the p2p gc power mode
3250 * \param[in] prDev Net device requested.
3251 * \param[inout] wrqu Pointer to iwreq_data
3253 * \retval 0 Success.
3254 * \retval -EFAULT Setting parameters to driver fail.
3255 * \retval -EOPNOTSUPP Key size not supported.
3259 /*----------------------------------------------------------------------------*/
3261 mtk_p2p_wext_get_powermode(
3262 IN struct net_device *prNetDev,
3263 IN struct iw_request_info *info,
3264 IN OUT union iwreq_data *wrqu,
3268 //printk("mtk_p2p_wext_get_powermode\n");
3269 //wrqu->power.disabled = 0;
3270 //wrqu->power.value = 1;
3272 struct iw_param *prPower = (struct iw_param*)&wrqu->power;
3273 PARAM_POWER_MODE ePowerMode;
3275 P_GLUE_INFO_T prGlueInfo = NULL;
3276 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3277 UINT_32 u4BufLen = 0;
3281 if (FALSE == GLUE_CHK_PR2(prNetDev, prPower)) {
3285 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
3290 rStatus = kalIoctl(prGlueInfo,
3291 wlanoidQueryP2pPowerSaveProfile,
3300 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
3301 wlanoidQueryP2pPowerSaveProfile,
3308 prPower->disabled = 1;
3310 if (Param_PowerModeCAM == ePowerMode) {
3312 prPower->disabled = 1;
3314 else if (Param_PowerModeMAX_PSP == ePowerMode ) {
3316 prPower->disabled = 0;
3318 else if (Param_PowerModeFast_PSP == ePowerMode ) {
3320 prPower->disabled = 0;
3323 prPower->flags = IW_POWER_PERIOD | IW_POWER_RELATIVE;
3324 #if WIRELESS_EXT < 21
3325 prPower->value *= 1000000;
3333 /*----------------------------------------------------------------------------*/
3335 * \brief P2P Private I/O Control handler (IOC_P2P_CFG_DEVICE)
3337 * \param[in] prDev Net device requested.
3338 * \param[inout] wrqu Pointer to iwreq_data
3340 * \retval 0 Success.
3341 * \retval -EFAULT Setting parameters to driver fail.
3342 * \retval -EOPNOTSUPP Key size not supported.
3346 /*----------------------------------------------------------------------------*/
3348 mtk_p2p_wext_set_local_dev_info(
3349 IN struct net_device *prDev,
3350 IN struct iw_request_info *info,
3351 IN OUT union iwreq_data *wrqu,
3355 P_ADAPTER_T prAdapter = NULL;
3356 P_GLUE_INFO_T prGlueInfo = NULL;
3357 P_IW_P2P_CFG_DEVICE_TYPE prDeviceCfg = (P_IW_P2P_CFG_DEVICE_TYPE) extra;
3358 P_P2P_CONNECTION_SETTINGS_T prConnSettings;
3359 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL;
3360 //P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)NULL;
3364 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3367 prAdapter = prGlueInfo->prAdapter;
3370 prConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
3371 prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
3373 // update connection settings for P2P-FSM
3375 if(prDeviceCfg->ssid_len > ELEM_MAX_LEN_SSID) {
3376 prConnSettings->ucSSIDLen = ELEM_MAX_LEN_SSID;
3379 prConnSettings->ucSSIDLen = prDeviceCfg->ssid_len;
3382 if(copy_from_user(prConnSettings->aucSSID, prDeviceCfg->ssid, prConnSettings->ucSSIDLen)) {
3386 // 2. update device type (WPS IE)
3387 kalMemCopy(&(prConnSettings->rPrimaryDevTypeBE), &(prDeviceCfg->pri_device_type), sizeof(DEVICE_TYPE_T));
3388 #if P2P_MAX_SUPPORTED_SEC_DEV_TYPE_COUNT
3389 kalMemCopy(&(prConnSettings->arSecondaryDevTypeBE[0]), &(prDeviceCfg->snd_device_type), sizeof(DEVICE_TYPE_T));
3392 // 3. update device name
3393 if(prDeviceCfg->device_name_len > WPS_ATTRI_MAX_LEN_DEVICE_NAME) {
3394 prConnSettings->ucDevNameLen = WPS_ATTRI_MAX_LEN_DEVICE_NAME;
3397 prConnSettings->ucDevNameLen = prDeviceCfg->device_name_len;
3399 if(copy_from_user(prConnSettings->aucDevName, prDeviceCfg->device_name, prConnSettings->ucDevNameLen)) {
3403 // 4. update GO intent
3404 prConnSettings->ucGoIntent = prDeviceCfg->intend;
3407 /* Preferred channel bandwidth */
3408 prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode =
3409 prDeviceCfg->ch_width ? CONFIG_BW_20_40M : CONFIG_BW_20M;
3410 prAdapter->rWifiVar.rConnSettings.uc5GBandwidthMode =
3411 prDeviceCfg->ch_width ? CONFIG_BW_20_40M : CONFIG_BW_20M;
3414 /* 1. switch P2P-FSM on */
3415 /* 1.1 allocate for message */
3416 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(prAdapter,
3418 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
3420 if (!prFuncSwitch) {
3421 ASSERT(0); // Can't trigger P2P FSM
3425 /* 1.2 fill message */
3426 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
3427 prFuncSwitch->fgIsFuncOn = TRUE;
3429 /* 1.3 send message */
3430 mboxSendMsg(prAdapter,
3432 (P_MSG_HDR_T) prFuncSwitch,
3433 MSG_SEND_METHOD_BUF);
3436 } /* end of mtk_p2p_wext_set_local_dev_info() */
3443 /*----------------------------------------------------------------------------*/
3445 * \brief I/O Control handler for both
3446 * IOC_P2P_START_STOP_DISCOVERY & SIOCGIWSCAN
3448 * \param[in] prDev Net device requested.
3449 * \param[inout] wrqu Pointer to iwreq_data
3451 * \retval 0 Success.
3452 * \retval -EFAULT Setting parameters to driver fail.
3453 * \retval -EOPNOTSUPP Key size not supported.
3457 /*----------------------------------------------------------------------------*/
3459 mtk_p2p_wext_discovery_results(
3460 IN struct net_device *prDev,
3461 IN struct iw_request_info *info,
3462 IN OUT union iwreq_data *wrqu,
3466 struct iw_event iwe;
3467 char *current_ev = extra;
3469 P_GLUE_INFO_T prGlueInfo = NULL;
3470 P_ADAPTER_T prAdapter = NULL;
3471 P_P2P_INFO_T prP2PInfo = (P_P2P_INFO_T)NULL;
3472 P_EVENT_P2P_DEV_DISCOVER_RESULT_T prTargetResult = (P_EVENT_P2P_DEV_DISCOVER_RESULT_T)NULL;
3473 P_PARAM_VARIABLE_IE_T prDesiredIE = NULL;
3477 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3480 prAdapter = prGlueInfo->prAdapter;
3483 prP2PInfo = prAdapter->prP2pInfo;
3485 for(i = 0 ; i < prP2PInfo->u4DeviceNum ; i++) {
3486 prTargetResult = &prP2PInfo->arP2pDiscoverResult[i];
3489 iwe.cmd = SIOCGIWAP;
3490 iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
3491 memcpy(iwe.u.ap_addr.sa_data,
3492 prTargetResult->aucInterfaceAddr,
3495 current_ev = iwe_stream_add_event(info, current_ev,
3496 extra + IW_SCAN_MAX_DATA,
3497 &iwe, IW_EV_ADDR_LEN);
3501 iwe.cmd = SIOCGIWESSID;
3502 iwe.u.data.flags = 1;
3503 iwe.u.data.length = prTargetResult->u2NameLength;
3505 current_ev = iwe_stream_add_point(info, current_ev,
3506 extra + IW_SCAN_MAX_DATA,
3507 &iwe, prTargetResult->aucName);
3509 /* IWEVGENIE for WPA IE */
3510 if(prTargetResult->u2IELength <= 600 && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf,
3511 prTargetResult->u2IELength,
3513 (PUINT_8 *)&prDesiredIE)) {
3515 iwe.cmd = IWEVGENIE;
3516 iwe.u.data.flags = 1;
3517 iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength;
3519 current_ev = iwe_stream_add_point(info, current_ev,
3520 extra + IW_SCAN_MAX_DATA,
3521 &iwe, (char *)prDesiredIE);
3526 /* IWEVGENIE for WPS IE */
3527 if((prTargetResult->u2IELength <= 600) && wextSrchDesiredWPSIE(prTargetResult->pucIeBuf,
3528 prTargetResult->u2IELength,
3530 (PUINT_8 *)&prDesiredIE)) {
3532 iwe.cmd = IWEVGENIE;
3533 iwe.u.data.flags = 1;
3534 iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength;
3536 current_ev = iwe_stream_add_point(info, current_ev,
3537 extra + IW_SCAN_MAX_DATA,
3538 &iwe, (char *)prDesiredIE);
3543 /* IWEVGENIE for RSN IE */
3544 if((prTargetResult->u2IELength <= 600) && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf,
3545 prTargetResult->u2IELength,
3547 (PUINT_8 *)&prDesiredIE)) {
3549 iwe.cmd = IWEVGENIE;
3550 iwe.u.data.flags = 1;
3551 iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength;
3553 current_ev = iwe_stream_add_point(info, current_ev,
3554 extra + IW_SCAN_MAX_DATA,
3555 &iwe, (char *)prDesiredIE);
3558 /* IOC_P2P_GO_WSC_IE */
3560 /* device capability */
3564 iwe.cmd = IWEVCUSTOM;
3565 iwe.u.data.flags = 0;
3566 iwe.u.data.length = 8 + sizeof("p2p_cap=");
3568 snprintf(data, iwe.u.data.length, "p2p_cap=%02x%02x%02x%02x%c",
3569 prTargetResult->ucDeviceCapabilityBitmap, prTargetResult->ucGroupCapabilityBitmap,
3570 (UINT_8)prTargetResult->u2ConfigMethod, (UINT_8)(prTargetResult->u2ConfigMethod >> 8), '\0' );
3571 current_ev = iwe_stream_add_point(info, current_ev,
3572 extra + IW_SCAN_MAX_DATA,
3573 &iwe, (char *)data);
3575 //printk("%s\n", data);
3576 kalMemZero(data, 40);
3578 iwe.cmd = IWEVCUSTOM;
3579 iwe.u.data.flags = 0;
3580 iwe.u.data.length = 12 + sizeof("p2p_dev_type=");
3582 snprintf(data, iwe.u.data.length, "p2p_dev_type=%02x%02x%02x%02x%02x%02x%c",
3583 (UINT_8)prTargetResult->rPriDevType.u2CategoryID,(UINT_8)prTargetResult->rPriDevType.u2SubCategoryID,
3584 (UINT_8)prTargetResult->arSecDevType[0].u2CategoryID,(UINT_8)prTargetResult->arSecDevType[0].u2SubCategoryID,
3585 (UINT_8)prTargetResult->arSecDevType[1].u2CategoryID,(UINT_8)prTargetResult->arSecDevType[1].u2SubCategoryID,
3587 current_ev = iwe_stream_add_point(info, current_ev,
3588 extra + IW_SCAN_MAX_DATA,
3589 &iwe, (char *)data);
3590 //printk("%s\n", data);
3592 kalMemZero(data, 40);
3594 iwe.cmd = IWEVCUSTOM;
3595 iwe.u.data.flags = 0;
3596 iwe.u.data.length = 17 + sizeof("p2p_grp_bssid=");
3598 snprintf(data, iwe.u.data.length, "p2p_grp_bssid="MACSTR"%c",
3599 MAC2STR(prTargetResult->aucBSSID), '\0');
3600 current_ev = iwe_stream_add_point(info, current_ev,
3601 extra + IW_SCAN_MAX_DATA,
3602 &iwe, (char *)data);
3603 //printk("%s\n", data);
3609 /* Length of data */
3610 wrqu->data.length = (current_ev - extra);
3611 wrqu->data.flags = 0;
3614 } /* end of mtk_p2p_wext_discovery_results() */
3617 /*----------------------------------------------------------------------------*/
3619 * \brief P2P Private I/O Control handler (IOC_P2P_WSC_BEACON_PROBE_RSP_IE)
3621 * \param[in] prDev Net device requested.
3622 * \param[inout] wrqu Pointer to iwreq_data
3624 * \retval 0 Success.
3625 * \retval -EFAULT Setting parameters to driver fail.
3626 * \retval -EOPNOTSUPP Key size not supported.
3630 /*----------------------------------------------------------------------------*/
3632 mtk_p2p_wext_wsc_ie(
3633 IN struct net_device *prDev,
3634 IN struct iw_request_info *info,
3635 IN OUT union iwreq_data *wrqu,
3639 P_ADAPTER_T prAdapter = NULL;
3640 P_GLUE_INFO_T prGlueInfo = NULL;
3641 P_IW_P2P_HOSTAPD_PARAM prHostapdParam = (P_IW_P2P_HOSTAPD_PARAM)extra;
3645 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
3648 if (prHostapdParam->len > 0) {
3649 if (prHostapdParam->len <= MAX_WSC_IE_LENGTH) {
3650 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[0], prHostapdParam->data, prHostapdParam->len)) {
3653 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prHostapdParam->data, prHostapdParam->len)) {
3662 prGlueInfo->prP2PInfo->u2WSCIELen[0] = prHostapdParam->len;
3663 prGlueInfo->prP2PInfo->u2WSCIELen[2] = prHostapdParam->len;
3665 prAdapter = prGlueInfo->prAdapter;
3668 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX);
3670 //@TODO: send message to P2P-FSM
3673 } /* end of mtk_p2p_wext_wsc_ie() */
3676 /*----------------------------------------------------------------------------*/
3678 * \brief P2P Private I/O Control handler (IOC_P2P_CONNECT_DISCONNECT)
3680 * \param[in] prDev Net device requested.
3681 * \param[inout] wrqu Pointer to iwreq_data
3683 * \retval 0 Success.
3684 * \retval -EFAULT Setting parameters to driver fail.
3685 * \retval -EOPNOTSUPP Key size not supported.
3689 /*----------------------------------------------------------------------------*/
3691 mtk_p2p_wext_connect_disconnect(
3692 IN struct net_device *prDev,
3693 IN struct iw_request_info *info,
3694 IN OUT union iwreq_data *wrqu,
3698 P_ADAPTER_T prAdapter = NULL;
3699 P_GLUE_INFO_T prGlueInfo = NULL;
3700 struct iw_point *prData= (struct iw_point *)&wrqu->data;
3701 // P_IW_P2P_CONNECT_DEVICE prConnectDevice = (P_IW_P2P_CONNECT_DEVICE)extra;
3702 // P_MSG_HDR_T prMsgHdr;
3703 // P_MSG_P2P_CONNECTION_REQUEST_T prMsgP2PConnReq;
3704 // P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt;
3705 // UINT_8 aucBCAddr[] = BC_MAC_ADDR;
3709 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3712 prAdapter = prGlueInfo->prAdapter;
3715 if (prData->flags == P2P_CONNECT) {
3717 // indicate P2P-FSM with MID_MNY_P2P_CONNECTION_REQ
3718 prMsgP2PConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T) cnmMemAlloc(prAdapter,
3720 sizeof(MSG_P2P_CONNECTION_REQUEST_T));
3722 if (!prMsgP2PConnReq) {
3723 ASSERT(0); // Can't trigger P2P FSM
3728 mboxSendMsg(prAdapter,
3730 (P_MSG_HDR_T) prMsgP2PConnReq,
3731 MSG_SEND_METHOD_BUF);
3734 else if(prData->flags == P2P_DISCONNECT) {
3736 // indicate P2P-FSM with MID_MNY_P2P_CONNECTION_ABORT
3737 prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter,
3739 sizeof(MSG_P2P_CONNECTION_ABORT_T));
3741 if (!prMsgP2PConnAbt) {
3742 ASSERT(0); // Can't trigger P2P FSM
3746 COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prConnectDevice->sta_addr);
3748 prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT;
3750 mboxSendMsg(prAdapter,
3752 (P_MSG_HDR_T) prMsgP2PConnAbt,
3753 MSG_SEND_METHOD_BUF);
3761 } /* end of mtk_p2p_wext_connect_disconnect() */
3764 /*----------------------------------------------------------------------------*/
3766 * \brief P2P Private I/O Control handler (IOC_P2P_PASSWORD_READY)
3768 * \param[in] prDev Net device requested.
3769 * \param[inout] wrqu Pointer to iwreq_data
3771 * \retval 0 Success.
3772 * \retval -EFAULT Setting parameters to driver fail.
3773 * \retval -EOPNOTSUPP Key size not supported.
3777 /*----------------------------------------------------------------------------*/
3779 mtk_p2p_wext_password_ready(
3780 IN struct net_device *prDev,
3781 IN struct iw_request_info *info,
3782 IN OUT union iwreq_data *wrqu,
3786 P_ADAPTER_T prAdapter = NULL;
3787 P_GLUE_INFO_T prGlueInfo = NULL;
3788 P_IW_P2P_PASSWORD_READY prPasswordReady = (P_IW_P2P_PASSWORD_READY)extra;
3789 P_P2P_CONNECTION_SETTINGS_T prConnSettings;
3793 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
3796 prAdapter = prGlueInfo->prAdapter;
3799 prConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
3801 /* retrieve IE for Probe Request */
3802 if (prPasswordReady->probe_req_len > 0) {
3803 if (prPasswordReady->probe_req_len <= MAX_WSC_IE_LENGTH) {
3804 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[1], prPasswordReady->probe_req_ie, prPasswordReady->probe_req_len)) {
3813 prGlueInfo->prP2PInfo->u2WSCIELen[1] = prPasswordReady->probe_req_len;
3815 /* retrieve IE for Probe Response */
3816 if (prPasswordReady->probe_rsp_len > 0) {
3817 if (prPasswordReady->probe_rsp_len <= MAX_WSC_IE_LENGTH) {
3818 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prPasswordReady->probe_rsp_ie, prPasswordReady->probe_rsp_len)) {
3827 prGlueInfo->prP2PInfo->u2WSCIELen[2] = prPasswordReady->probe_rsp_len;
3829 switch (prPasswordReady->active_config_method) {
3831 prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_PUSH_BUTTON;
3834 prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_KEYPAD;
3837 prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_DISPLAY;
3843 prConnSettings->fgIsPasswordIDRdy = TRUE;
3845 } /* end of mtk_p2p_wext_password_ready() */
3848 /*----------------------------------------------------------------------------*/
3850 * \brief P2P Private I/O Control handler (IOC_P2P_GET_REQ_DEVICE_INFO)
3852 * \param[in] prDev Net device requested.
3853 * \param[inout] wrqu Pointer to iwreq_data
3855 * \retval 0 Success.
3856 * \retval -EFAULT Setting parameters to driver fail.
3857 * \retval -EOPNOTSUPP Key size not supported.
3861 /*----------------------------------------------------------------------------*/
3863 mtk_p2p_wext_request_dev_info(
3864 IN struct net_device *prDev,
3865 IN struct iw_request_info *info,
3866 IN OUT union iwreq_data *wrqu,
3870 P_ADAPTER_T prAdapter = NULL;
3871 P_GLUE_INFO_T prGlueInfo = NULL;
3872 P_IW_P2P_DEVICE_REQ prDeviceReq = (P_IW_P2P_DEVICE_REQ)extra;
3876 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3879 prAdapter = prGlueInfo->prAdapter;
3882 // specify data length
3883 wrqu->data.length = sizeof(IW_P2P_DEVICE_REQ);
3885 // copy to upper-layer supplied buffer
3886 kalMemCopy(prDeviceReq->name, prGlueInfo->prP2PInfo->aucConnReqDevName, prGlueInfo->prP2PInfo->u4ConnReqNameLength);
3887 prDeviceReq->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength;
3888 prDeviceReq->name[prDeviceReq->name_len]='\0';
3889 COPY_MAC_ADDR(prDeviceReq->device_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr);
3890 prDeviceReq->device_type = prGlueInfo->prP2PInfo->ucConnReqDevType;
3891 prDeviceReq->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod;
3892 prDeviceReq->active_config_method = prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod;
3895 } /* end of mtk_p2p_wext_request_dev_info() */
3898 /*----------------------------------------------------------------------------*/
3900 * \brief P2P Private I/O Control handler (IOC_P2P_GET_STRUCT)
3902 * \param[in] prDev Net device requested.
3903 * \param[inout] wrqu Pointer to iwreq_data
3905 * \retval 0 Success.
3906 * \retval -EFAULT Setting parameters to driver fail.
3907 * \retval -EOPNOTSUPP Key size not supported.
3911 /*----------------------------------------------------------------------------*/
3913 mtk_p2p_wext_invitation_indicate(
3914 IN struct net_device *prDev,
3915 IN struct iw_request_info *info,
3916 IN OUT union iwreq_data *wrqu,
3920 P_ADAPTER_T prAdapter = NULL;
3921 P_GLUE_INFO_T prGlueInfo = NULL;
3922 P_IW_P2P_IOCTL_INVITATION_INDICATE prInvIndicate = (P_IW_P2P_IOCTL_INVITATION_INDICATE)extra;
3926 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3929 prAdapter = prGlueInfo->prAdapter;
3932 // specify data length
3933 wrqu->data.length = sizeof(IW_P2P_IOCTL_INVITATION_INDICATE);
3935 // copy to upper-layer supplied buffer
3936 kalMemCopy(prInvIndicate->dev_name, prGlueInfo->prP2PInfo->aucConnReqDevName, prGlueInfo->prP2PInfo->u4ConnReqNameLength);
3937 kalMemCopy(prInvIndicate->group_bssid, prGlueInfo->prP2PInfo->rConnReqGroupAddr, MAC_ADDR_LEN);
3938 prInvIndicate->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength;
3939 prInvIndicate->dev_name[prInvIndicate->name_len]='\0';
3940 COPY_MAC_ADDR(prInvIndicate->dev_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr);
3941 prInvIndicate->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod;
3942 prInvIndicate->operating_channel = prGlueInfo->prP2PInfo->ucOperatingChnl;
3943 prInvIndicate->invitation_type = prGlueInfo->prP2PInfo->ucInvitationType;
3946 } /* end of mtk_p2p_wext_invitation_indicate() */
3949 /*----------------------------------------------------------------------------*/
3951 * \brief P2P Private I/O Control handler (IOC_P2P_GET_STRUCT)
3953 * \param[in] prDev Net device requested.
3954 * \param[inout] wrqu Pointer to iwreq_data
3956 * \retval 0 Success.
3957 * \retval -EFAULT Setting parameters to driver fail.
3958 * \retval -EOPNOTSUPP Key size not supported.
3962 /*----------------------------------------------------------------------------*/
3964 mtk_p2p_wext_invitation_status(
3965 IN struct net_device *prDev,
3966 IN struct iw_request_info *info,
3967 IN OUT union iwreq_data *wrqu,
3971 P_ADAPTER_T prAdapter = NULL;
3972 P_GLUE_INFO_T prGlueInfo = NULL;
3973 P_IW_P2P_IOCTL_INVITATION_STATUS prInvStatus = (P_IW_P2P_IOCTL_INVITATION_STATUS)extra;
3977 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3980 prAdapter = prGlueInfo->prAdapter;
3983 // specify data length
3984 wrqu->data.length = sizeof(IW_P2P_IOCTL_INVITATION_STATUS);
3986 // copy to upper-layer supplied buffer
3987 prInvStatus->status_code = prGlueInfo->prP2PInfo->u4InvStatus;
3990 } /* end of mtk_p2p_wext_invitation_status() */
3993 /*----------------------------------------------------------------------------*/
3995 * \brief indicate an event to supplicant for device found
3997 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
3999 * \retval TRUE Success.
4000 * \retval FALSE Failure
4002 /*----------------------------------------------------------------------------*/
4004 kalP2PIndicateFound(
4005 IN P_GLUE_INFO_T prGlueInfo
4008 union iwreq_data evt;
4009 UINT_8 aucBuffer[IW_CUSTOM_MAX];
4013 memset(&evt, 0, sizeof(evt));
4015 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_DVC_FND");
4016 evt.data.length = strlen(aucBuffer);
4018 /* indicate IWEVP2PDVCFND event */
4019 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
4025 } /* end of kalP2PIndicateFound() */
4028 mtk_p2p_wext_set_network_address (
4029 IN struct net_device *prDev,
4030 IN struct iw_request_info *info,
4031 IN OUT union iwreq_data *wrqu,
4035 P_ADAPTER_T prAdapter = NULL;
4036 P_GLUE_INFO_T prGlueInfo = NULL;
4040 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4043 prAdapter = prGlueInfo->prAdapter;
4046 //@TODO: invoke wlan_p2p functions
4048 rStatus = kalIoctl(prGlueInfo,
4049 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetP2pNetworkAddress,
4063 mtk_p2p_wext_set_ps_profile (
4064 IN struct net_device *prDev,
4065 IN struct iw_request_info *info,
4066 IN OUT union iwreq_data *wrqu,
4070 P_ADAPTER_T prAdapter = NULL;
4071 P_GLUE_INFO_T prGlueInfo = NULL;
4075 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4078 prAdapter = prGlueInfo->prAdapter;
4081 //@TODO: invoke wlan_p2p functions
4083 rStatus = kalIoctl(prGlueInfo,
4084 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetP2pPowerSaveProfile,
4098 mtk_p2p_wext_set_pm_param (
4099 IN struct net_device *prDev,
4100 IN struct iw_request_info *info,
4101 IN OUT union iwreq_data *wrqu,
4105 P_ADAPTER_T prAdapter = NULL;
4106 P_GLUE_INFO_T prGlueInfo = NULL;
4110 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4113 prAdapter = prGlueInfo->prAdapter;
4116 //@TODO: invoke wlan_p2p functions
4118 rStatus = kalIoctl(prGlueInfo,
4119 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetP2pPowerSaveProfile,
4134 /*----------------------------------------------------------------------------*/
4136 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
4138 * \param[in] prDev Net device requested.
4139 * \param[inout] wrqu Pointer to iwreq_data
4141 * \retval 0 Success.
4142 * \retval -EFAULT Setting parameters to driver fail.
4143 * \retval -EOPNOTSUPP Setting parameters not support.
4147 /*----------------------------------------------------------------------------*/
4149 mtk_p2p_wext_start_formation (
4150 IN struct net_device *prDev,
4151 IN struct iw_request_info *info,
4152 IN OUT union iwreq_data *wrqu,
4157 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
4158 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
4159 // struct iw_point *prData = (struct iw_point*)&wrqu->data;
4160 P_IW_P2P_IOCTL_START_FORMATION prIoctlStartFormation = (P_IW_P2P_IOCTL_START_FORMATION)NULL;
4163 if ((prDev == NULL) || (extra == NULL)) {
4170 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
4171 prIoctlStartFormation = (P_IW_P2P_IOCTL_START_FORMATION)extra;
4173 if (prGlueInfo == NULL) {
4179 prAdapter = prGlueInfo->prAdapter;
4181 if (prAdapter == NULL) {
4192 /* mtk_p2p_wext_start_formation */
4195 /*----------------------------------------------------------------------------*/
4197 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
4199 * \param[in] prDev Net device requested.
4200 * \param[inout] wrqu Pointer to iwreq_data
4202 * \retval 0 Success.
4203 * \retval -EFAULT Setting parameters to driver fail.
4204 * \retval -EOPNOTSUPP Setting parameters not support.
4208 /*----------------------------------------------------------------------------*/
4210 mtk_p2p_wext_set_int (
4211 IN struct net_device *prDev,
4212 IN struct iw_request_info *info,
4213 IN OUT union iwreq_data *wrqu,
4218 UINT_32 u4SubCmd = 0;
4219 P_GLUE_INFO_T prGlueInfo = NULL;
4223 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL;
4224 P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T)NULL;
4225 P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T)NULL;
4231 //printk("mtk_p2p_wext_set_int\n");
4232 pu4IntBuf = (PUINT_32) extra;
4234 if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) {
4238 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4241 prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo;
4242 prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings;
4243 prP2pFsmInfo = prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo;
4245 u4SubCmd = (UINT_32) wrqu->mode;
4246 index = pu4IntBuf[1];
4247 value = pu4IntBuf[2];
4249 printk("set parameter, u4SubCmd=%d idx=%d value=%lu\n", (INT_16)u4SubCmd, (INT_16)index, value);
4252 case PRIV_CMD_INT_P2P_SET:
4254 case 0: /* Listen CH */
4256 UINT_8 ucSuggestChnl = 0;
4258 prP2pConnSettings->ucListenChnl = value;
4260 // 20110920 - frog: User configurations are placed in ConnSettings.
4261 if (rlmFuncFindAvailableChannel(prGlueInfo->prAdapter, value, &ucSuggestChnl, TRUE, TRUE)) {
4262 prP2pSpecificBssInfo->ucListenChannel = value;
4265 prP2pSpecificBssInfo->ucListenChannel = ucSuggestChnl;
4271 case 1: /* P2p mode */
4273 case 4: /* Noa duration */
4274 prP2pSpecificBssInfo->rNoaParam.u4NoaDurationMs = value;
4275 // only to apply setting when setting NOA count
4276 //status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam);
4278 case 5: /* Noa interval */
4279 prP2pSpecificBssInfo->rNoaParam.u4NoaIntervalMs = value;
4280 // only to apply setting when setting NOA count
4281 //status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam);
4283 case 6: /* Noa count */
4284 prP2pSpecificBssInfo->rNoaParam.u4NoaCount = value;
4285 status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam);
4287 case 100: /* Oper CH */
4288 // 20110920 - frog: User configurations are placed in ConnSettings.
4289 prP2pConnSettings->ucOperatingChnl = value;
4291 case 101: /* Local config Method, for P2P SDK */
4292 //prP2pConnSettings->u2LocalConfigMethod;
4294 case 102: /* Sigma P2p reset */
4295 kalMemZero(prP2pConnSettings->aucTargetDevAddr, MAC_ADDR_LEN);
4296 //prP2pConnSettings->eConnectionPolicy = ENUM_P2P_CONNECTION_POLICY_AUTO;
4298 case 103: /* WPS MODE */
4299 kalP2PSetWscMode(prGlueInfo, value);
4301 case 104: /* P2p send persence, duration */
4303 case 105: /* P2p send persence, interval */
4305 case 106: /* P2P set sleep */
4307 kalIoctl(prGlueInfo,
4308 wlanoidSetP2pPowerSaveProfile,
4317 case 107: /* P2P set opps, CTWindowl */
4318 prP2pSpecificBssInfo->rOppPsParam.u4CTwindowMs = value;
4319 status = mtk_p2p_wext_set_oppps_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rOppPsParam);
4321 case 108: /* p2p_set_power_save */
4322 kalIoctl(prGlueInfo,
4323 wlanoidSetP2pPowerSaveProfile,
4345 /*----------------------------------------------------------------------------*/
4347 * \brief P2P Private I/O Control handler (IOC_P2P_SET_STRUCT)
4349 * \param[in] prDev Net device requested.
4350 * \param[inout] wrqu Pointer to iwreq_data
4352 * \retval 0 Success.
4353 * \retval -EFAULT Setting parameters to driver fail.
4354 * \retval -EOPNOTSUPP Key size not supported.
4358 /*----------------------------------------------------------------------------*/
4360 mtk_p2p_wext_set_struct (
4361 IN struct net_device *prDev,
4362 IN struct iw_request_info *info,
4363 IN OUT union iwreq_data *wrqu,
4368 UINT_32 u4SubCmd = 0;
4369 P_GLUE_INFO_T prGlueInfo = NULL;
4370 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL;
4375 if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) {
4379 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4382 u4SubCmd = (UINT_32) wrqu->data.flags;
4384 kalMemZero(&prGlueInfo->prP2PInfo->aucOidBuf[0],
4385 sizeof(prGlueInfo->prP2PInfo->aucOidBuf));
4389 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4391 wrqu->data.length)) {
4396 if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) {
4397 printk(KERN_INFO DRV_NAME"extra buffer is valid\n");
4400 printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra);
4403 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4404 switch(prP2PReq->u4CmdId) {
4405 case P2P_CMD_ID_SEND_SD_RESPONSE:
4406 status = mtk_p2p_wext_send_service_discovery_response(prDev, info, wrqu, (char *)prP2PReq);
4409 case P2P_CMD_ID_SEND_SD_REQUEST:
4410 status = mtk_p2p_wext_send_service_discovery_request(prDev, info, wrqu, (char *)prP2PReq);
4413 case P2P_CMD_ID_TERMINATE_SD_PHASE:
4414 status = mtk_p2p_wext_terminate_service_discovery_phase(prDev, info, wrqu, (char *)prP2PReq);
4417 case P2P_CMD_ID_INVITATION:
4418 if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_INVITATION_STRUCT)) {
4419 // status = mtk_p2p_wext_invitation_request(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4423 case P2P_CMD_ID_INVITATION_ABORT:
4424 if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_ABORT_INVITATION)) {
4425 // status = mtk_p2p_wext_invitation_abort(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4429 case P2P_CMD_ID_START_FORMATION:
4430 if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_START_FORMATION)) {
4431 status = mtk_p2p_wext_start_formation(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4435 status = -EOPNOTSUPP;
4439 #if CFG_SUPPORT_ANTI_PIRACY
4440 case PRIV_SEC_CHECK_OID:
4441 if (wrqu->data.length > 256) {
4442 status = -EOPNOTSUPP;
4445 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]),
4447 wrqu->data.length)) {
4452 if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), extra, wrqu->data.length)) {
4453 printk(KERN_INFO DRV_NAME"extra buffer is valid\n");
4456 printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra);
4458 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0]));
4460 switch(prP2PReq->u4CmdId) {
4461 case P2P_CMD_ID_SEC_CHECK:
4462 status = mtk_p2p_wext_set_sec_check_request(prDev, info, wrqu, (char *)prP2PReq);
4465 status = -EOPNOTSUPP;
4469 case PRIV_CMD_P2P_VERSION:
4470 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4472 wrqu->data.length)) {
4477 if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) {
4478 printk(KERN_INFO DRV_NAME"extra buffer is valid\n");
4481 printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra);
4484 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4485 switch (prP2PReq->u4CmdId) {
4486 case P2P_CMD_ID_P2P_VERSION:
4487 status = mtk_p2p_wext_set_p2p_version(prDev, info, wrqu, (char *)prP2PReq);
4490 status = -EOPNOTSUPP;
4495 status = -EOPNOTSUPP;
4503 /*----------------------------------------------------------------------------*/
4505 * \brief P2P Private I/O Control handler (IOC_P2P_GET_STRUCT)
4507 * \param[in] prDev Net device requested.
4508 * \param[inout] wrqu Pointer to iwreq_data
4510 * \retval 0 Success.
4511 * \retval -EFAULT Setting parameters to driver fail.
4512 * \retval -EOPNOTSUPP Key size not supported.
4516 /*----------------------------------------------------------------------------*/
4518 mtk_p2p_wext_get_struct (
4519 IN struct net_device *prDev,
4520 IN struct iw_request_info *info,
4521 IN OUT union iwreq_data *wrqu,
4526 UINT_32 u4SubCmd = 0;
4527 P_GLUE_INFO_T prGlueInfo = NULL;
4528 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL;
4533 if (!prDev || !wrqu) {
4534 printk(KERN_INFO DRV_NAME "%s(): invalid param(0x%p, 0x%p)\n",
4541 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4544 u4SubCmd = (UINT_32) wrqu->data.flags;
4546 kalMemZero(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4547 sizeof(prGlueInfo->prP2PInfo->aucOidBuf));
4551 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4553 sizeof(IW_P2P_TRANSPORT_STRUCT))) {
4554 printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__);
4558 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4560 switch(prP2PReq->u4CmdId) {
4561 case P2P_CMD_ID_GET_SD_REQUEST:
4562 status = mtk_p2p_wext_get_service_discovery_request(prDev, info, wrqu, (char *)prP2PReq);
4565 case P2P_CMD_ID_GET_SD_RESPONSE:
4566 status = mtk_p2p_wext_get_service_discovery_response(prDev, info, wrqu, (char *)prP2PReq);
4569 case P2P_CMD_ID_INVITATION_INDICATE:
4571 status = mtk_p2p_wext_invitation_indicate(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4572 prP2PReq->outBufferLength = wrqu->data.length;
4573 if (copy_to_user(wrqu->data.pointer,
4574 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4575 wrqu->data.length + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4576 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4584 case P2P_CMD_ID_INVITATION_STATUS:
4586 status = mtk_p2p_wext_invitation_status(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4587 prP2PReq->outBufferLength = wrqu->data.length;
4588 if (copy_to_user(wrqu->data.pointer,
4589 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4590 wrqu->data.length + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4591 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4599 case P2P_CMD_ID_GET_CH_LIST:
4602 UINT_8 NumOfChannel = 50;
4603 RF_CHANNEL_INFO_T aucChannelList[50];
4604 UINT_8 ucMaxChannelNum = 50;
4605 PUINT_8 pucChnlList = (PUINT_8)prP2PReq->aucBuffer;
4607 kalGetChnlList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
4608 if (NumOfChannel > 50)
4610 prP2PReq->outBufferLength = NumOfChannel;
4612 for (i=0; i<NumOfChannel; i++) {
4614 // 20120208 frog: modify to avoid clockwork warning.
4615 prP2PReq->aucBuffer[i] = aucChannelList[i].ucChannelNum;
4617 *pucChnlList = aucChannelList[i].ucChannelNum;
4621 if(copy_to_user(wrqu->data.pointer,
4622 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4623 NumOfChannel + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4624 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4633 case P2P_CMD_ID_GET_OP_CH:
4635 prP2PReq->inBufferLength = 4;
4637 status = wlanoidQueryP2pOpChannel(prGlueInfo->prAdapter,
4638 prP2PReq->aucBuffer,
4639 prP2PReq->inBufferLength,
4640 &prP2PReq->outBufferLength);
4642 if (status == 0) { // WLAN_STATUS_SUCCESS
4643 if (copy_to_user(wrqu->data.pointer,
4644 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4645 prP2PReq->outBufferLength + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4646 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4651 if (copy_to_user(wrqu->data.pointer,
4652 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4653 OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4654 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4662 status = -EOPNOTSUPP;
4666 #if CFG_SUPPORT_ANTI_PIRACY
4667 case PRIV_SEC_CHECK_OID:
4668 if (wrqu->data.length > 256) {
4669 status = -EOPNOTSUPP;
4672 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]),
4674 sizeof(IW_P2P_TRANSPORT_STRUCT))) {
4675 printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__);
4679 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0]));
4681 switch(prP2PReq->u4CmdId) {
4682 case P2P_CMD_ID_SEC_CHECK:
4683 status = mtk_p2p_wext_get_sec_check_response(prDev, info, wrqu, (char *)prP2PReq);
4686 status = -EOPNOTSUPP;
4690 case PRIV_CMD_P2P_VERSION:
4691 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4693 sizeof(IW_P2P_TRANSPORT_STRUCT))) {
4694 printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__);
4698 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4700 switch (prP2PReq->u4CmdId) {
4701 case P2P_CMD_ID_P2P_VERSION:
4702 status = mtk_p2p_wext_get_p2p_version(prDev, info, wrqu, (char *)prP2PReq);
4705 status = -EOPNOTSUPP;
4710 /* Copy queried data to user. */
4711 if (status == 0) { // WLAN_STATUS_SUCCESS
4712 if(copy_to_user(wrqu->data.pointer,
4713 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4714 prP2PReq->outBufferLength + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4715 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4721 if(copy_to_user(wrqu->data.pointer,
4722 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4723 OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4724 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4738 /*----------------------------------------------------------------------------*/
4740 * \brief P2P Private I/O Control handler for
4741 * getting service discovery request frame from driver
4743 * \param[in] prDev Net device requested.
4744 * \param[inout] wrqu Pointer to iwreq_data
4746 * \retval 0 Success.
4747 * \retval -EFAULT Setting parameters to driver fail.
4748 * \retval -EOPNOTSUPP Key size not supported.
4752 /*----------------------------------------------------------------------------*/
4754 mtk_p2p_wext_get_service_discovery_request (
4755 IN struct net_device *prDev,
4756 IN struct iw_request_info *info,
4757 IN OUT union iwreq_data *wrqu,
4761 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4762 UINT_32 u4QueryInfoLen;
4763 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4764 P_GLUE_INFO_T prGlueInfo = NULL;
4768 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4771 rStatus = kalIoctl(prGlueInfo,
4772 wlanoidGetP2PSDRequest,
4773 prP2PReq->aucBuffer,
4774 prP2PReq->outBufferLength,
4781 if (rStatus != WLAN_STATUS_SUCCESS) {
4785 prP2PReq->outBufferLength = u4QueryInfoLen;
4787 if(copy_to_user(wrqu->data.pointer,
4788 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4789 u4QueryInfoLen + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4790 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4800 /*----------------------------------------------------------------------------*/
4802 * \brief P2P Private I/O Control handler for
4803 * getting service discovery response frame from driver
4805 * \param[in] prDev Net device requested.
4806 * \param[inout] wrqu Pointer to iwreq_data
4808 * \retval 0 Success.
4809 * \retval -EFAULT Setting parameters to driver fail.
4810 * \retval -EOPNOTSUPP Key size not supported.
4814 /*----------------------------------------------------------------------------*/
4816 mtk_p2p_wext_get_service_discovery_response (
4817 IN struct net_device *prDev,
4818 IN struct iw_request_info *info,
4819 IN OUT union iwreq_data *wrqu,
4823 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4824 UINT_32 u4QueryInfoLen;
4825 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4826 P_GLUE_INFO_T prGlueInfo = NULL;
4830 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4833 rStatus = kalIoctl(prGlueInfo,
4834 wlanoidGetP2PSDResponse,
4835 prP2PReq->aucBuffer,
4836 prP2PReq->outBufferLength,
4843 if (rStatus != WLAN_STATUS_SUCCESS) {
4847 prP2PReq->outBufferLength = u4QueryInfoLen;
4849 if(copy_to_user(wrqu->data.pointer,
4850 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4851 u4QueryInfoLen + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4852 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4862 /*----------------------------------------------------------------------------*/
4864 * \brief P2P Private I/O Control handler for
4865 * sending service discovery request frame
4867 * \param[in] prDev Net device requested.
4868 * \param[inout] wrqu Pointer to iwreq_data
4870 * \retval 0 Success.
4871 * \retval -EFAULT Setting parameters to driver fail.
4872 * \retval -EOPNOTSUPP Key size not supported.
4876 /*----------------------------------------------------------------------------*/
4878 mtk_p2p_wext_send_service_discovery_request (
4879 IN struct net_device *prDev,
4880 IN struct iw_request_info *info,
4881 IN OUT union iwreq_data *wrqu,
4885 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4886 UINT_32 u4SetInfoLen;
4887 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4888 P_GLUE_INFO_T prGlueInfo = NULL;
4892 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4895 rStatus = kalIoctl(prGlueInfo,
4896 wlanoidSendP2PSDRequest,
4897 prP2PReq->aucBuffer,
4898 prP2PReq->inBufferLength,
4905 if (rStatus != WLAN_STATUS_SUCCESS) {
4914 /*----------------------------------------------------------------------------*/
4916 * \brief P2P Private I/O Control handler for
4917 * sending service discovery response frame
4919 * \param[in] prDev Net device requested.
4920 * \param[inout] wrqu Pointer to iwreq_data
4922 * \retval 0 Success.
4923 * \retval -EFAULT Setting parameters to driver fail.
4924 * \retval -EOPNOTSUPP Key size not supported.
4928 /*----------------------------------------------------------------------------*/
4930 mtk_p2p_wext_send_service_discovery_response (
4931 IN struct net_device *prDev,
4932 IN struct iw_request_info *info,
4933 IN OUT union iwreq_data *wrqu,
4937 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4938 UINT_32 u4SetInfoLen;
4939 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4940 P_GLUE_INFO_T prGlueInfo = NULL;
4944 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4947 rStatus = kalIoctl(prGlueInfo,
4948 wlanoidSendP2PSDResponse,
4949 prP2PReq->aucBuffer,
4950 prP2PReq->inBufferLength,
4957 if (rStatus != WLAN_STATUS_SUCCESS) {
4965 #if CFG_SUPPORT_ANTI_PIRACY
4966 /*----------------------------------------------------------------------------*/
4968 * \brief P2P Private I/O Control handler for
4970 * \param[in] prDev Net device requested.
4971 * \param[inout] wrqu Pointer to iwreq_data
4973 * \retval 0 Success.
4974 * \retval -EFAULT Setting parameters to driver fail.
4975 * \retval -EOPNOTSUPP Key size not supported.
4979 /*----------------------------------------------------------------------------*/
4981 mtk_p2p_wext_set_sec_check_request (
4982 IN struct net_device *prDev,
4983 IN struct iw_request_info *info,
4984 IN OUT union iwreq_data *wrqu,
4988 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4989 UINT_32 u4SetInfoLen;
4990 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4991 P_GLUE_INFO_T prGlueInfo = NULL;
4995 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4998 rStatus = kalIoctl(prGlueInfo,
4999 wlanoidSetSecCheckRequest,
5000 prP2PReq->aucBuffer,
5001 prP2PReq->inBufferLength,
5008 if (rStatus != WLAN_STATUS_SUCCESS) {
5017 /*----------------------------------------------------------------------------*/
5019 * \brief P2P Private I/O Control handler for
5021 * \param[in] prDev Net device requested.
5022 * \param[inout] wrqu Pointer to iwreq_data
5024 * \retval 0 Success.
5025 * \retval -EFAULT Setting parameters to driver fail.
5026 * \retval -EOPNOTSUPP Key size not supported.
5030 /*----------------------------------------------------------------------------*/
5032 mtk_p2p_wext_get_sec_check_response (
5033 IN struct net_device *prDev,
5034 IN struct iw_request_info *info,
5035 IN OUT union iwreq_data *wrqu,
5039 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5040 UINT_32 u4QueryInfoLen;
5041 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5042 P_GLUE_INFO_T prGlueInfo = NULL;
5046 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5049 rStatus = kalIoctl(prGlueInfo,
5050 wlanoidGetSecCheckResponse,
5051 prP2PReq->aucBuffer,
5052 prP2PReq->outBufferLength,
5059 if (rStatus != WLAN_STATUS_SUCCESS) {
5063 prP2PReq->outBufferLength = u4QueryInfoLen;
5065 if(copy_to_user(wrqu->data.pointer,
5066 prP2PReq->aucBuffer,
5067 u4QueryInfoLen + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
5068 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
5078 /*----------------------------------------------------------------------------*/
5080 * \brief P2P Private I/O Control handler for
5081 * terminating service discovery phase
5083 * \param[in] prDev Net device requested.
5084 * \param[inout] wrqu Pointer to iwreq_data
5086 * \retval 0 Success.
5087 * \retval -EFAULT Setting parameters to driver fail.
5088 * \retval -EOPNOTSUPP Key size not supported.
5092 /*----------------------------------------------------------------------------*/
5094 mtk_p2p_wext_terminate_service_discovery_phase (
5095 IN struct net_device *prDev,
5096 IN struct iw_request_info *info,
5097 IN OUT union iwreq_data *wrqu,
5101 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5102 UINT_32 u4SetInfoLen;
5103 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5104 P_GLUE_INFO_T prGlueInfo = NULL;
5108 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5111 rStatus = kalIoctl(prGlueInfo,
5112 wlanoidSetP2PTerminateSDPhase,
5113 prP2PReq->aucBuffer,
5114 prP2PReq->inBufferLength,
5121 if (rStatus != WLAN_STATUS_SUCCESS) {
5129 /*----------------------------------------------------------------------------*/
5131 * \brief P2P Private I/O Control handler for
5133 * \param[in] prDev Net device requested.
5134 * \param[inout] wrqu Pointer to iwreq_data
5136 * \retval 0 Success.
5137 * \retval -EFAULT Setting parameters to driver fail.
5138 * \retval -EOPNOTSUPP Key size not supported.
5142 /*----------------------------------------------------------------------------*/
5144 mtk_p2p_wext_set_noa_param (
5145 IN struct net_device *prDev,
5146 IN struct iw_request_info *info,
5147 IN OUT union iwreq_data *wrqu,
5151 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5152 UINT_32 u4SetInfoLen;
5153 //P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5154 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T)extra;
5155 P_GLUE_INFO_T prGlueInfo = NULL;
5159 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5163 rStatus = kalIoctl(prGlueInfo,
5165 prNoaParam, //prP2PReq->aucBuffer,
5166 sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T),//prP2PReq->inBufferLength,
5173 if (rStatus != WLAN_STATUS_SUCCESS) {
5181 /*----------------------------------------------------------------------------*/
5183 * \brief P2P Private I/O Control handler for
5185 * \param[in] prDev Net device requested.
5186 * \param[inout] wrqu Pointer to iwreq_data
5188 * \retval 0 Success.
5189 * \retval -EFAULT Setting parameters to driver fail.
5190 * \retval -EOPNOTSUPP Key size not supported.
5194 /*----------------------------------------------------------------------------*/
5196 mtk_p2p_wext_set_oppps_param (
5197 IN struct net_device *prDev,
5198 IN struct iw_request_info *info,
5199 IN OUT union iwreq_data *wrqu,
5203 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5204 UINT_32 u4SetInfoLen;
5205 // P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5206 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)extra;
5207 P_GLUE_INFO_T prGlueInfo = NULL;
5211 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5215 rStatus = kalIoctl(prGlueInfo,
5216 wlanoidSetOppPsParam,
5217 prOppPsParam, //prP2PReq->aucBuffer,
5218 sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T), //prP2PReq->inBufferLength,
5225 if (rStatus != WLAN_STATUS_SUCCESS) {
5235 mtk_p2p_wext_set_p2p_version (
5236 IN struct net_device *prDev,
5237 IN struct iw_request_info *info,
5238 IN OUT union iwreq_data *wrqu,
5242 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5243 P_GLUE_INFO_T prGlueInfo = NULL;
5244 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5245 UINT_32 u4SetInfoLen;
5249 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5252 rStatus = kalIoctl(prGlueInfo,
5253 wlanoidSetP2pSupplicantVersion,
5254 prP2PReq->aucBuffer,
5255 prP2PReq->inBufferLength,
5262 if (rStatus != WLAN_STATUS_SUCCESS) {
5271 /* mtk_p2p_wext_set_p2p_version */
5274 mtk_p2p_wext_get_p2p_version (
5275 IN struct net_device *prDev,
5276 IN struct iw_request_info *info,
5277 IN OUT union iwreq_data *wrqu,
5281 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5282 UINT_32 u4QueryInfoLen;
5283 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5284 P_GLUE_INFO_T prGlueInfo = NULL;
5288 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5291 rStatus = kalIoctl(prGlueInfo,
5292 wlanoidQueryP2pVersion,
5293 prP2PReq->aucBuffer,
5294 prP2PReq->outBufferLength,
5301 if (rStatus != WLAN_STATUS_SUCCESS) {
5309 } /* mtk_p2p_wext_get_p2p_version */
5311 #if CFG_SUPPORT_P2P_RSSI_QUERY
5314 mtk_p2p_wext_get_rssi (
5315 IN struct net_device *prDev,
5316 IN struct iw_request_info *info,
5317 IN OUT union iwreq_data *wrqu,
5321 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5322 UINT_32 u4QueryInfoLen;
5323 struct iw_point *prData= (struct iw_point *)&wrqu->data;
5324 UINT_16 u2BufferSize = 0;
5325 P_GLUE_INFO_T prGlueInfo = NULL;
5327 struct iw_statistics *pStats = NULL;
5331 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5335 rStatus = WLAN_STATUS_FAILURE;
5339 pStats = (struct iw_statistics *) (&(prGlueInfo->rP2pIwStats));
5341 rStatus = kalIoctl(prGlueInfo,
5342 wlanoidQueryP2pRssi,
5351 u2BufferSize = prData->length;
5353 if (u2BufferSize < sizeof(struct iw_statistics)) {
5358 if (copy_to_user(prData->pointer, pStats, sizeof(struct iw_statistics))) {
5359 rStatus = WLAN_STATUS_FAILURE;
5365 if (rStatus != WLAN_STATUS_SUCCESS) {
5372 } /* mtk_p2p_wext_get_rssi */
5374 struct iw_statistics *
5375 mtk_p2p_wext_get_wireless_stats (
5376 struct net_device *prDev
5379 WLAN_STATUS rStatus = WLAN_STATUS_FAILURE;
5380 P_GLUE_INFO_T prGlueInfo = NULL;
5381 struct iw_statistics *pStats = NULL;
5385 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
5391 pStats = (struct iw_statistics *) (&(prGlueInfo->rP2pIwStats));
5393 if (!prDev || !netif_carrier_ok(prDev)) {
5394 /* network not connected */
5398 rStatus = kalIoctl(prGlueInfo,
5399 wlanoidQueryP2pRssi,
5410 } /* mtk_p2p_wext_get_wireless_stats */
5413 #endif /* CFG_SUPPORT_P2P_RSSI_QUERY */
5417 mtk_p2p_wext_set_txpow (
5418 IN struct net_device *prDev,
5419 IN struct iw_request_info *prIwrInfo,
5420 IN OUT union iwreq_data *prTxPow,
5424 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
5425 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
5427 P_MSG_P2P_FUNCTION_SWITCH_T prMsgFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)NULL;
5435 if ((!prDev) || (!prTxPow)) {
5441 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
5449 prAdapter = prGlueInfo->prAdapter;
5451 prMsgFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_FUNCTION_SWITCH_T));
5452 if (!prMsgFuncSwitch) {
5457 prMsgFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
5459 if (prTxPow->disabled) {
5461 prMsgFuncSwitch->fgIsFuncOn = FALSE;
5465 /* Re-enable function. */
5466 prMsgFuncSwitch->fgIsFuncOn = TRUE;
5469 /* 1.3 send message */
5470 mboxSendMsg(prAdapter,
5472 (P_MSG_HDR_T) prMsgFuncSwitch,
5473 MSG_SEND_METHOD_BUF);
5479 } /* mtk_p2p_wext_set_txpow */