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
12 /*******************************************************************************
13 * Copyright (c) 2007 MediaTek Inc.
15 * All rights reserved. Copying, compilation, modification, distribution
16 * or any other use whatsoever of this material is strictly prohibited
17 * except in accordance with a Software License Agreement with
19 ********************************************************************************
22 /*******************************************************************************
25 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
26 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
27 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
28 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
29 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
30 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
31 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
32 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
33 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
34 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
35 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
36 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
37 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
39 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
40 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
41 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
42 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
43 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
45 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
46 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
47 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
48 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
49 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
51 ********************************************************************************
57 ** 08 24 2012 yuche.tsai
59 ** Fix bug of invitation request.
61 ** 08 17 2012 yuche.tsai
63 ** Fix compile warning.
65 ** 08 16 2012 yuche.tsai
67 ** Fix compile warning.
69 ** 08 15 2012 yuche.tsai
71 ** Fix compile warning.
73 ** 07 31 2012 yuche.tsai
75 ** Update Active/Deactive network policy for P2P network.
76 ** Highly related to power saving.
78 ** 07 24 2012 yuche.tsai
82 ** 07 20 2012 yuche.tsai
83 ** [WCXRP00001119] [Volunteer Patch][WiFi Direct][Driver] Connection Policy Set for WFD SIGMA test
84 ** Support remain on channel.
86 ** 07 19 2012 yuche.tsai
88 ** Update code for net device register.
90 ** 07 19 2012 yuche.tsai
92 ** Code update for JB.
94 * 07 17 2012 yuche.tsai
96 * Fix compile error for JB.
98 * 07 17 2012 yuche.tsai
100 * Let netdev bring up.
102 * 07 17 2012 yuche.tsai
104 * Compile no error before trial run.
106 * 01 09 2012 terry.wu
107 * [WCXRP00001166] [Wi-Fi] [Driver] cfg80211 integration for p2p newtork
108 * cfg80211 integration for p2p network.
110 * 12 19 2011 terry.wu
111 * [WCXRP00001142] [Wi-Fi] [P2P Driver] XOR local admin bit to generate p2p net device MAC
112 * XOR local administrated bit to generate net device MAC of p2p network.
114 * 12 02 2011 yuche.tsai
116 * Fix possible KE when unload p2p.
118 * 11 24 2011 yuche.tsai
120 * Fix P2P IOCTL of multicast address bug, add low power driver stop control.
122 * 11 22 2011 yuche.tsai
124 * Update RSSI link quality of P2P Network query method. (Bug fix)
126 * 11 19 2011 yuche.tsai
128 * Add RSSI support for P2P network.
130 * 11 16 2011 yuche.tsai
131 * [WCXRP00001107] [Volunteer Patch][Driver] Large Network Type index assert in FW issue.
132 * Avoid using work thread in set p2p multicast address callback.
134 * 11 11 2011 yuche.tsai
136 * Fix work thread cancel issue.
138 * 11 11 2011 yuche.tsai
140 * Fix default device name issue.
142 * 11 08 2011 yuche.tsai
143 * [WCXRP00001094] [Volunteer Patch][Driver] Driver version & supplicant version query & set support for service discovery version check.
144 * Add support for driver version query & p2p supplicant verseion set.
145 * For new service discovery mechanism sync.
147 * 11 07 2011 yuche.tsai
149 * [ALPS 00087243] KE in worker thread.
150 * The multicast address list is scheduled in worker thread.
151 * Before the worker thread is excuted, if P2P is unloaded, a KE may occur.
153 * 10 26 2011 terry.wu
154 * [WCXRP00001066] [MT6620 Wi-Fi] [P2P Driver] Fix P2P Oid Issue
155 * Fix some P2P OID functions didn't raise its flag "fgIsP2pOid" issue.
157 * 10 25 2011 cm.chang
158 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
161 * 10 18 2011 yuche.tsai
162 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
163 * Support Channle Query.
165 * 10 18 2011 yuche.tsai
166 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
170 * 08 26 2011 yuche.tsai
172 * Fix bug of parsing secondary device list type issue.
174 * 08 24 2011 yuche.tsai
175 * [WCXRP00000919] [Volunteer Patch][WiFi Direct][Driver] Invitation New Feature.
178 * 08 23 2011 yuche.tsai
180 * Fix multicast address list issue of P2P.
182 * 08 22 2011 chinglan.wang
184 * Fix invitation indication bug..
187 * [WCXRP00000934] [MT6620 Wi-Fi][Driver][P2P] Wi-Fi hot spot with auto sparse channel residence
188 * auto channel decision for 2.4GHz hot spot mode
190 * 08 16 2011 chinglan.wang
192 * Add the group id information in the invitation indication.
194 * 08 09 2011 yuche.tsai
195 * [WCXRP00000919] [Volunteer Patch][WiFi Direct][Driver] Invitation New Feature.
196 * Invitation Feature add on.
198 * 08 05 2011 yuche.tsai
199 * [WCXRP00000856] [Volunteer Patch][WiFi Direct][Driver] MT6620 WiFi Direct IOT Issue with BCM solution.
200 * Add Password ID check for quick connection.
201 * Also modify some connection policy.
203 * 07 18 2011 chinglan.wang
205 * Add IOC_P2P_GO_WSC_IE (p2p capability).
207 * 06 14 2011 yuche.tsai
209 * Add compile flag to disable persistent group support.
211 * 05 04 2011 chinglan.wang
212 * [WCXRP00000698] [MT6620 Wi-Fi][P2P][Driver] Add p2p invitation command for the p2p driver
215 * 05 02 2011 yuche.tsai
216 * [WCXRP00000693] [Volunteer Patch][MT6620][Driver] Clear Formation Flag after TX lifetime timeout.
217 * Clear formation flag after formation timeout.
219 * 04 22 2011 george.huang
220 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
223 * 04 21 2011 george.huang
224 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
225 * 1. Revise P2P power mode setting.
226 * 2. Revise fast-PS for concurrent
230 * Adding length check before doing WPA RSN IE parsing for scan results indicate.
232 * 04 14 2011 yuche.tsai
233 * [WCXRP00000646] [Volunteer Patch][MT6620][FW/Driver] Sigma Test Modification for some test case.
234 * Connection flow refine for Sigma test.
236 * 04 08 2011 yuche.tsai
237 * [WCXRP00000624] [Volunteer Patch][MT6620][Driver] Add device discoverability support for GO.
238 * Add device discoverability support.
240 * 04 08 2011 george.huang
241 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
242 * separate settings of P2P and AIS
244 * 04 07 2011 terry.wu
245 * [WCXRP00000619] [MT6620 Wi-Fi][Driver] fix kernel panic may occur when removing wlan
246 * Fix kernel panic may occur when removing wlan driver.
249 * [WCXRP00000614] [MT6620 Wi-Fi][Driver] P2P: Update beacon content while setting WSC IE
250 * Update the wsc ie to beacon content.
254 * add the sample code for set power mode and get power mode.
256 * 03 25 2011 yuche.tsai
258 * Improve some error handleing.
260 * 03 22 2011 george.huang
261 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
262 * link with supplicant commands
264 * 03 22 2011 yuche.tsai
265 * [WCXRP00000584] [Volunteer Patch][MT6620][Driver] Add beacon timeout support for WiFi Direct.
266 * Modify formation policy.
268 * 03 22 2011 yuche.tsai
270 * Modify formation policy setting.
272 * 03 18 2011 yuche.tsai
273 * [WCXRP00000574] [Volunteer Patch][MT6620][Driver] Modify P2P FSM Connection Flow
274 * Modify connection flow after Group Formation Complete, or device connect to a GO.
275 * Instead of request channel & connect directly, we use scan to allocate channel bandwidth & connect after RX BCN.
278 * [WCXRP00000563] [MT6620 Wi-Fi] [P2P] Set local config method while set password Id ready
279 * set lccal config method method while set password Id ready.
281 * 03 15 2011 yuche.tsai
282 * [WCXRP00000560] [Volunteer Patch][MT6620][Driver] P2P Connection from UI using KEY/DISPLAY issue
283 * Fix some configure method issue.
285 * 03 15 2011 jeffrey.chang
286 * [WCXRP00000558] [MT6620 Wi-Fi][MT6620 Wi-Fi][Driver] refine the queue selection algorithm for WMM
287 * refine queue_select function
290 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
291 * add code for avoid compiling warning.
293 * 03 10 2011 yuche.tsai
297 * 03 10 2011 terry.wu
298 * [WCXRP00000505] [MT6620 Wi-Fi][Driver/FW] WiFi Direct Integration
299 * Remove unnecessary assert and message.
302 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
303 * support the power save related p2p setting.
306 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
307 * rename the define to anti_pviracy.
310 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
311 * add the code to get the check rsponse and indicate to app.
313 * 03 03 2011 jeffrey.chang
314 * [WCXRP00000512] [MT6620 Wi-Fi][Driver] modify the net device relative functions to support the H/W multiple queue
315 * support concurrent network
317 * 03 03 2011 jeffrey.chang
318 * [WCXRP00000512] [MT6620 Wi-Fi][Driver] modify the net device relative functions to support the H/W multiple queue
319 * modify P2P's netdevice functions to support multiple H/W queues
322 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
323 * for get request, the buffer length to be copied is header + payload.
326 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
327 * add code to let the beacon and probe response for Auto GO WSC .
330 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
331 * add a missed break.
333 * 03 01 2011 yuche.tsai
334 * [WCXRP00000501] [Volunteer Patch][MT6620][Driver] No common channel issue when doing GO formation
335 * Update channel issue when doing GO formation..
338 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
339 * add the Operation channel setting.
342 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
343 * fixed the set int ioctl set index and value map to driver issue.
346 * [WCXRP00000488] [MT6620 Wi-Fi][Driver] Support the SIGMA set p2p parameter to driver
347 * adding the ioctl set int from supplicant, and can used to set the p2p paramters
349 * 02 21 2011 terry.wu
350 * [WCXRP00000476] [MT6620 Wi-Fi][Driver] Clean P2P scan list while removing P2P
351 * Clean P2P scan list while removing P2P.
354 * [WCXRP00000471] [MT6620 Wi-Fi][Driver] Add P2P Provison discovery append Config Method attribute at WSC IE
355 * fixed the ioctl setting that index not map to spec defined config method.
358 * [WCXRP00000471] [MT6620 Wi-Fi][Driver] Add P2P Provison discovery append Config Method attribute at WSC IE
359 * append the WSC IE config method attribute at provision discovery request.
362 * [WCXRP00000448] [MT6620 Wi-Fi][Driver] Fixed WSC IE not send out at probe request
363 * modify the structure pointer for set WSC IE.
366 * [WCXRP00000448] [MT6620 Wi-Fi][Driver] Fixed WSC IE not send out at probe request
367 * fixed the probe request send out without WSC IE issue (at P2P).
370 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
373 * 02 09 2011 yuche.tsai
374 * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
375 * Add Support for MLME deauthentication for Hot-Spot.
377 * 01 25 2011 terry.wu
378 * [WCXRP00000393] [MT6620 Wi-Fi][Driver] Add new module insert parameter
379 * Add a new module parameter to indicate current runnig mode, P2P or AP.
381 * 01 12 2011 yuche.tsai
382 * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
383 * 1. Modify Channel Acquire Time of AP mode from 5s to 1s.
384 * 2. Call cnmP2pIsPermit() before active P2P network.
385 * 3. Add channel selection support for AP mode.
388 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
389 * ioctl implementations for P2P Service Discovery
392 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
393 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
396 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
397 * 1. header file restructure for more clear module isolation
398 * 2. add function interface definition for implementing Service Discovery callbacks
402 * invoke nicEnableInterrupt() before leaving from wlanAdapterStart()
404 * 12 08 2010 yuche.tsai
405 * [WCXRP00000245] [MT6620][Driver] Invitation & Provision Discovery Feature Check-in
406 * [WCXRP000000245][MT6620][Driver] Invitation Request Feature Add
408 * 11 30 2010 yuche.tsai
410 * Invitation & Provision Discovery Indication.
413 * [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
414 * fixed some ASSERT check.
417 * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
418 * adding the p2p random ssid support.
421 * [WCXRP00000124] [MT6620 Wi-Fi] [Driver] Support the dissolve P2P Group
422 * Add the code to support disconnect p2p group
425 * [WCXRP00000081] [MT6620][Driver] Fix the compiling error at WinXP while enable P2P
426 * add a kal function for set cipher.
429 * [WCXRP00000081] [MT6620][Driver] Fix the compiling error at WinXP while enable P2P
430 * fixed compiling error while enable p2p.
434 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
436 * 09 21 2010 kevin.huang
437 * [WCXRP00000054] [MT6620 Wi-Fi][Driver] Restructure driver for second Interface
438 * Isolate P2P related function for Hardware Software Bundle
440 * 09 21 2010 kevin.huang
441 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
442 * Eliminate Linux Compile Warning
444 * 09 10 2010 george.huang
446 * update iwpriv LP related
450 * fixed the compiling error at win XP.
454 * add WPS/WPA/RSN IE for Wi-Fi Direct scanning result.
458 * adding the code for beacon/probe req/ probe rsp wsc ie at p2p.
462 * let the p2p can set the privacy bit at beacon and rsn ie at assoc req at key handshake state.
466 * add netdev_ops(NDO) for linux kernel 2.6.31 or greater
470 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
476 * 08 20 2010 yuche.tsai
478 * Invert Connection request provision status parameter.
482 * add set mac address interface for further possibilities of wpa_supplicant overriding interface address.
486 * modify pwp ioctls attribution by removing FIXED_SIZE.
488 * 08 18 2010 jeffrey.chang
490 * support multi-function sdio
494 * correct p2p net device registration with NULL pointer access issue.
498 * P2P packets are now marked when being queued into driver, and identified later without checking MAC address
502 * add subroutines for P2P to set multicast list.
504 * 08 16 2010 george.huang
506 * add wext handlers to link P2P set PS profile/ network address function (TBD)
510 * revised implementation of Wi-Fi Direct io controls.
514 * follow-up with ioctl interface update for Wi-Fi Direct application
518 * driver hook modifications corresponding to ioctl interface change.
522 * add basic support for ioctl of getting scan result. (only address and SSID are reporterd though)
526 * [Wi-Fi Direct Driver Hook] change event indication API to be consistent with supplicant
530 * surpress compilation warning.
534 * [Wi-Fi Direct] add framework for driver hooks
538 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
541 * [WPD00003833][MT6620 and MT5931] Driver migration
542 * p2p interface revised to be sync. with HAL
544 * 06 06 2010 kevin.huang
545 * [WPD00003832][MT6620 5931] Create driver base
546 * [MT6620 5931] Create driver base
549 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
550 * add ioctl to configure scan mode for p2p connection
553 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
554 * add cfg80211 interface, which is to replace WE, for further extension
557 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
558 * implement private io controls for Wi-Fi Direct
561 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
562 * implement get scan result.
565 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
566 * add basic handling framework for wireless extension ioctls.
569 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
570 * 1) add timeout handler mechanism for pending command packets
571 * 2) add p2p add/removal key
574 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
575 * implement wireless extension ioctls in iw_handler form.
578 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
579 * add ioctl framework for Wi-Fi Direct by reusing wireless extension ioctls as well
582 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
583 * p2p ioctls revised.
586 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
587 * add ioctl for controlling p2p scan phase parameters
590 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
591 * implement basic wi-fi direct framework
594 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
595 * add basic framework for implementating P2P driver hook.
600 /*******************************************************************************
601 * C O M P I L E R F L A G S
602 ********************************************************************************
605 /*******************************************************************************
606 * E X T E R N A L R E F E R E N C E S
607 ********************************************************************************
611 #include "wlan_lib.h"
613 #include <linux/poll.h>
615 #include <linux/kmod.h>
616 //#include <net/cfg80211.h>
617 #include "gl_p2p_ioctl.h"
621 /*******************************************************************************
623 ********************************************************************************
625 #define ARGV_MAX_NUM (4)
627 /*For CFG80211 - wiphy parameters*/
628 #define MAX_SCAN_LIST_NUM (1)
629 #define MAX_SCAN_IE_LEN (512)
630 #define LEGACY_IN_AP_MODE "legacy_wlan%d"
633 /*******************************************************************************
635 ********************************************************************************
638 /*******************************************************************************
639 * P U B L I C D A T A
640 ********************************************************************************
643 /*******************************************************************************
644 * P R I V A T E D A T A
645 ********************************************************************************
648 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
649 /* for cfg80211 - frequency table */
650 static struct ieee80211_channel mtk_2ghz_channels[] = {
667 static struct ieee80211_channel mtk_5ghz_a_channels[] = {
668 CHAN5G(34, 0), CHAN5G(36, 0),
669 CHAN5G(38, 0), CHAN5G(40, 0),
670 CHAN5G(42, 0), CHAN5G(44, 0),
671 CHAN5G(46, 0), CHAN5G(48, 0),
672 CHAN5G(52, 0), CHAN5G(56, 0),
673 CHAN5G(60, 0), CHAN5G(64, 0),
674 CHAN5G(100, 0), CHAN5G(104, 0),
675 CHAN5G(108, 0), CHAN5G(112, 0),
676 CHAN5G(116, 0), CHAN5G(120, 0),
677 CHAN5G(124, 0), CHAN5G(128, 0),
678 CHAN5G(132, 0), CHAN5G(136, 0),
679 CHAN5G(140, 0), CHAN5G(149, 0),
680 CHAN5G(153, 0), CHAN5G(157, 0),
681 CHAN5G(161, 0), CHAN5G(165, 0),
682 CHAN5G(169, 0), CHAN5G(173, 0),
683 CHAN5G(184, 0), CHAN5G(188, 0),
684 CHAN5G(192, 0), CHAN5G(196, 0),
685 CHAN5G(200, 0), CHAN5G(204, 0),
686 CHAN5G(208, 0), CHAN5G(212, 0),
690 /* for cfg80211 - rate table */
691 static struct ieee80211_rate mtk_rates[] = {
692 RATETAB_ENT(10, 0x1000, 0),
693 RATETAB_ENT(20, 0x1001, 0),
694 RATETAB_ENT(55, 0x1002, 0),
695 RATETAB_ENT(110, 0x1003, 0), /* 802.11b */
696 RATETAB_ENT(60, 0x2000, 0),
697 RATETAB_ENT(90, 0x2001, 0),
698 RATETAB_ENT(120, 0x2002, 0),
699 RATETAB_ENT(180, 0x2003, 0),
700 RATETAB_ENT(240, 0x2004, 0),
701 RATETAB_ENT(360, 0x2005, 0),
702 RATETAB_ENT(480, 0x2006, 0),
703 RATETAB_ENT(540, 0x2007, 0), /* 802.11a/g */
706 #define mtk_a_rates (mtk_rates + 4)
707 #define mtk_a_rates_size (sizeof(mtk_rates) / sizeof(mtk_rates[0]) - 4)
708 #define mtk_g_rates (mtk_rates + 0)
709 #define mtk_g_rates_size (sizeof(mtk_rates) / sizeof(mtk_rates[0]) - 0)
711 #define MT6620_MCS_INFO \
714 .rx_mask = {0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0},\
716 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
720 /*Bandwidth 20Mhz Only*/
721 #define MT6620_HT_CAP \
723 .ht_supported = true, \
724 .cap = IEEE80211_HT_CAP_SM_PS \
725 | IEEE80211_HT_CAP_GRN_FLD \
726 | IEEE80211_HT_CAP_SGI_20, \
727 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, \
728 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE, \
729 .mcs = MT6620_MCS_INFO, \
732 /*Bandwidth 20/40Mhz*/
733 #define MT6620_HT_CAP \
735 .ht_supported = true, \
736 .cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 \
737 | IEEE80211_HT_CAP_SM_PS \
738 | IEEE80211_HT_CAP_GRN_FLD \
739 | IEEE80211_HT_CAP_SGI_20 \
740 | IEEE80211_HT_CAP_SGI_40, \
741 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, \
742 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE, \
743 .mcs = MT6620_MCS_INFO, \
747 static struct ieee80211_supported_band mtk_band_2ghz = {
748 .band = IEEE80211_BAND_2GHZ,
749 .channels = mtk_2ghz_channels,
750 .n_channels = ARRAY_SIZE(mtk_2ghz_channels),
751 .bitrates = mtk_g_rates,
752 .n_bitrates = mtk_g_rates_size,
753 .ht_cap = MT6620_HT_CAP,
756 static struct ieee80211_supported_band mtk_band_5ghz = {
757 .band = IEEE80211_BAND_5GHZ,
758 .channels = mtk_5ghz_a_channels,
759 .n_channels = ARRAY_SIZE(mtk_5ghz_a_channels),
760 .bitrates = mtk_a_rates,
761 .n_bitrates = mtk_a_rates_size,
762 .ht_cap = MT6620_HT_CAP,
765 static const UINT_32 cipher_suites[] = {
766 /* keep WEP first, it may be removed below */
767 WLAN_CIPHER_SUITE_WEP40,
768 WLAN_CIPHER_SUITE_WEP104,
769 WLAN_CIPHER_SUITE_TKIP,
770 WLAN_CIPHER_SUITE_CCMP,
772 /* keep last -- depends on hw flags! */
773 WLAN_CIPHER_SUITE_AES_CMAC
776 static struct cfg80211_ops mtk_p2p_config_ops = {
777 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) && (CFG_ENABLE_WIFI_DIRECT_CFG_80211 != 0)
779 .change_virtual_intf = mtk_p2p_cfg80211_change_iface, // 1 st
780 .change_bss = mtk_p2p_cfg80211_change_bss,
781 .scan = mtk_p2p_cfg80211_scan,
782 .remain_on_channel = mtk_p2p_cfg80211_remain_on_channel,
783 .cancel_remain_on_channel = mtk_p2p_cfg80211_cancel_remain_on_channel,
784 .mgmt_tx = mtk_p2p_cfg80211_mgmt_tx,
786 .mgmt_tx_cancel_wait = mtk_p2p_cfg80211_mgmt_tx_cancel_wait,
787 .connect = mtk_p2p_cfg80211_connect,
788 .disconnect = mtk_p2p_cfg80211_disconnect,
789 .deauth = mtk_p2p_cfg80211_deauth,
790 .disassoc = mtk_p2p_cfg80211_disassoc,
791 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
792 .start_ap = mtk_p2p_cfg80211_start_ap,
793 .change_beacon = mtk_p2p_cfg80211_change_beacon,
794 .stop_ap = mtk_p2p_cfg80211_stop_ap,
796 .add_beacon = mtk_p2p_cfg80211_add_set_beacon,
797 .set_beacon = mtk_p2p_cfg80211_add_set_beacon_1,
798 .del_beacon = mtk_p2p_cfg80211_stop_ap,
800 .set_wiphy_params = mtk_p2p_cfg80211_set_wiphy_params,
801 .del_station = mtk_p2p_cfg80211_del_station,
802 .set_channel = mtk_p2p_cfg80211_set_channel,
803 .set_bitrate_mask = mtk_p2p_cfg80211_set_bitrate_mask,
804 .mgmt_frame_register = mtk_p2p_cfg80211_mgmt_frame_register,
805 .get_station = mtk_p2p_cfg80211_get_station,
807 .add_key = mtk_p2p_cfg80211_add_key,
808 .get_key = mtk_p2p_cfg80211_get_key,
809 .del_key = mtk_p2p_cfg80211_del_key,
810 .set_default_key = mtk_p2p_cfg80211_set_default_key,
811 .join_ibss = mtk_p2p_cfg80211_join_ibss,
812 .leave_ibss = mtk_p2p_cfg80211_leave_ibss,
813 .set_tx_power = mtk_p2p_cfg80211_set_txpower,
814 .get_tx_power = mtk_p2p_cfg80211_get_txpower,
815 .set_power_mgmt = mtk_p2p_cfg80211_set_power_mgmt,
816 #ifdef CONFIG_NL80211_TESTMODE
817 .testmode_cmd = mtk_p2p_cfg80211_testmode_cmd,
824 /* There isn't a lot of sense in it, but you can transmit anything you like */
825 static const struct ieee80211_txrx_stypes
826 mtk_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {
827 [NL80211_IFTYPE_ADHOC] = {
829 .rx = BIT(IEEE80211_STYPE_ACTION >> 4)
831 [NL80211_IFTYPE_STATION] = {
833 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
834 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
836 [NL80211_IFTYPE_AP] = {
838 .rx = BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
839 BIT(IEEE80211_STYPE_ACTION >> 4)
841 [NL80211_IFTYPE_AP_VLAN] = {
844 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
845 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
846 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
847 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
848 BIT(IEEE80211_STYPE_AUTH >> 4) |
849 BIT(IEEE80211_STYPE_DEAUTH >> 4) |
850 BIT(IEEE80211_STYPE_ACTION >> 4)
852 [NL80211_IFTYPE_P2P_CLIENT] = {
854 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
855 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
857 [NL80211_IFTYPE_P2P_GO] = {
859 .rx = BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
860 BIT(IEEE80211_STYPE_ACTION >> 4)
868 /* the legacy wireless extension stuff */
869 static const iw_handler rP2PIwStandardHandler[] = {
870 [SIOCGIWPRIV - SIOCIWFIRST] = mtk_p2p_wext_get_priv,
871 [SIOCGIWSCAN - SIOCIWFIRST] = mtk_p2p_wext_discovery_results,
872 [SIOCSIWESSID - SIOCIWFIRST] = mtk_p2p_wext_reconnect,
873 [SIOCSIWAUTH - SIOCIWFIRST] = mtk_p2p_wext_set_auth,
874 [SIOCSIWENCODEEXT - SIOCIWFIRST] = mtk_p2p_wext_set_key,
875 [SIOCSIWPOWER - SIOCIWFIRST] = mtk_p2p_wext_set_powermode,
876 [SIOCGIWPOWER - SIOCIWFIRST] = mtk_p2p_wext_get_powermode,
877 [SIOCSIWTXPOW - SIOCIWFIRST] = mtk_p2p_wext_set_txpow,
878 #if CFG_SUPPORT_P2P_RSSI_QUERY
879 [SIOCGIWSTATS - SIOCIWFIRST] = mtk_p2p_wext_get_rssi,
881 [SIOCSIWMLME - SIOCIWFIRST] = mtk_p2p_wext_mlme_handler,
884 static const iw_handler rP2PIwPrivHandler[] = {
885 [IOC_P2P_CFG_DEVICE - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_local_dev_info,
886 [IOC_P2P_PROVISION_COMPLETE - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_provision_complete,
887 [IOC_P2P_START_STOP_DISCOVERY - SIOCIWFIRSTPRIV] = mtk_p2p_wext_start_stop_discovery,
888 [IOC_P2P_DISCOVERY_RESULTS - SIOCIWFIRSTPRIV] = mtk_p2p_wext_discovery_results,
889 [IOC_P2P_WSC_BEACON_PROBE_RSP_IE - SIOCIWFIRSTPRIV] = mtk_p2p_wext_wsc_ie,
890 [IOC_P2P_CONNECT_DISCONNECT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_connect_disconnect,
891 [IOC_P2P_PASSWORD_READY - SIOCIWFIRSTPRIV] = mtk_p2p_wext_password_ready,
892 // [IOC_P2P_SET_PWR_MGMT_PARAM - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_pm_param,
893 [IOC_P2P_SET_INT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_int,
894 [IOC_P2P_GET_STRUCT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_get_struct,
895 [IOC_P2P_SET_STRUCT - SIOCIWFIRSTPRIV] = mtk_p2p_wext_set_struct,
896 [IOC_P2P_GET_REQ_DEVICE_INFO - SIOCIWFIRSTPRIV] = mtk_p2p_wext_request_dev_info,
900 static const struct iw_priv_args rP2PIwPrivTable[] = {
902 .cmd = IOC_P2P_CFG_DEVICE,
903 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_CFG_DEVICE_TYPE),
904 .get_args = IW_PRIV_TYPE_NONE,
905 .name = "P2P_CFG_DEVICE"
908 .cmd = IOC_P2P_START_STOP_DISCOVERY,
909 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_REQ_DEVICE_TYPE),
910 .get_args = IW_PRIV_TYPE_NONE,
911 .name = "P2P_DISCOVERY"
914 .cmd = IOC_P2P_DISCOVERY_RESULTS,
915 .set_args = IW_PRIV_TYPE_NONE,
916 .get_args = IW_PRIV_TYPE_NONE,
920 .cmd = IOC_P2P_WSC_BEACON_PROBE_RSP_IE,
921 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_HOSTAPD_PARAM),
922 .get_args = IW_PRIV_TYPE_NONE,
926 .cmd = IOC_P2P_CONNECT_DISCONNECT,
927 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_CONNECT_DEVICE),
928 .get_args = IW_PRIV_TYPE_NONE,
929 .name = "P2P_CONNECT"
932 .cmd = IOC_P2P_PASSWORD_READY,
933 .set_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_PASSWORD_READY),
934 .get_args = IW_PRIV_TYPE_NONE,
935 .name = "P2P_PASSWD_RDY"
938 .cmd = IOC_P2P_GET_STRUCT,
939 .set_args = IW_PRIV_TYPE_NONE,
941 .name = "P2P_GET_STRUCT"
944 .cmd = IOC_P2P_SET_STRUCT,
946 .get_args = IW_PRIV_TYPE_NONE,
947 .name = "P2P_SET_STRUCT"
950 .cmd = IOC_P2P_GET_REQ_DEVICE_INFO,
951 .set_args = IW_PRIV_TYPE_NONE,
952 .get_args = IW_PRIV_TYPE_BYTE | (__u16)sizeof(IW_P2P_DEVICE_REQ),
953 .name = "P2P_GET_REQDEV"
956 /* SET STRUCT sub-ioctls commands */
959 .get_args = IW_PRIV_TYPE_NONE,
963 /* GET STRUCT sub-ioctls commands */
965 .set_args = IW_PRIV_TYPE_NONE,
971 const struct iw_handler_def mtk_p2p_wext_handler_def = {
972 .num_standard = (__u16)sizeof(rP2PIwStandardHandler)/sizeof(iw_handler),
973 .num_private = (__u16)sizeof(rP2PIwPrivHandler)/sizeof(iw_handler),
974 .num_private_args = (__u16)sizeof(rP2PIwPrivTable)/sizeof(struct iw_priv_args),
975 .standard = rP2PIwStandardHandler,
976 .private = rP2PIwPrivHandler,
977 .private_args = rP2PIwPrivTable,
978 #if CFG_SUPPORT_P2P_RSSI_QUERY
979 .get_wireless_stats = mtk_p2p_wext_get_wireless_stats,
981 .get_wireless_stats = NULL,
985 /*******************************************************************************
987 ********************************************************************************
990 /*******************************************************************************
991 * F U N C T I O N D E C L A R A T I O N S
992 ********************************************************************************
994 /* for IE Searching */
996 wextSrchDesiredWPAIE (
997 IN PUINT_8 pucIEStart,
998 IN INT_32 i4TotalIeLen,
999 IN UINT_8 ucDesiredElemId,
1000 OUT PUINT_8 *ppucDesiredIE
1005 wextSrchDesiredWPSIE (
1006 IN PUINT_8 pucIEStart,
1007 IN INT_32 i4TotalIeLen,
1008 IN UINT_8 ucDesiredElemId,
1009 OUT PUINT_8 *ppucDesiredIE
1013 /* Net Device Hooks */
1016 IN struct net_device *prDev
1021 IN struct net_device *prDev
1024 static struct net_device_stats *
1026 IN struct net_device *prDev
1030 p2pSetMulticastList(
1031 IN struct net_device *prDev
1036 IN struct sk_buff *prSkb,
1037 IN struct net_device *prDev
1042 struct net_device *prDev,
1043 struct ifreq *prIFReq,
1049 IN struct net_device *prDev,
1054 /*----------------------------------------------------------------------------*/
1056 * \brief Override the implementation of select queue
1058 * \param[in] dev Pointer to struct net_device
1059 * \param[in] skb Pointer to struct skb_buff
1063 /*----------------------------------------------------------------------------*/
1065 unsigned int _p2p_cfg80211_classify8021d(struct sk_buff *skb)
1067 unsigned int dscp = 0;
1069 /* skb->priority values from 256->263 are magic values
1070 * directly indicate a specific 802.1d priority. This is
1071 * to allow 802.1d priority to be passed directly in from
1075 if (skb->priority >= 256 && skb->priority <= 263) {
1076 return skb->priority - 256;
1078 switch (skb->protocol) {
1079 case htons(ETH_P_IP):
1080 dscp = ip_hdr(skb)->tos & 0xfc;
1087 static const UINT_16 au16Wlan1dToQueueIdx[8] = { 1, 0, 0, 1, 2, 2, 3, 3 };
1091 struct net_device *dev,
1092 struct sk_buff *skb)
1094 skb->priority = _p2p_cfg80211_classify8021d(skb);
1096 return au16Wlan1dToQueueIdx[skb->priority];
1099 static struct net_device *g_P2pPrDev;
1102 /*----------------------------------------------------------------------------*/
1104 * \brief A function for prDev->init
1106 * \param[in] prDev Pointer to struct net_device.
1108 * \retval 0 The execution of wlanInit succeeds.
1109 * \retval -ENXIO No such device.
1111 /*----------------------------------------------------------------------------*/
1114 struct net_device *prDev
1121 return 0; /* success */
1122 } /* end of p2pInit() */
1125 /*----------------------------------------------------------------------------*/
1127 * \brief A function for prDev->uninit
1129 * \param[in] prDev Pointer to struct net_device.
1133 /*----------------------------------------------------------------------------*/
1136 IN struct net_device *prDev
1142 } /* end of p2pUninit() */
1149 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
1150 static const struct net_device_ops p2p_netdev_ops = {
1151 .ndo_open = p2pOpen,
1152 .ndo_stop = p2pStop,
1153 .ndo_set_mac_address = p2pSetMACAddress,
1154 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
1155 .ndo_set_rx_mode = p2pSetMulticastList,
1157 .ndo_set_multicast_list = p2pSetMulticastList,
1159 .ndo_get_stats = p2pGetStats,
1160 .ndo_do_ioctl = p2pDoIOCTL,
1161 .ndo_start_xmit = p2pHardStartXmit,
1162 .ndo_select_queue = p2pSelectQueue,
1163 .ndo_init = p2pInit,
1164 .ndo_uninit = p2pUninit,
1171 /*******************************************************************************
1173 ********************************************************************************
1176 /*----------------------------------------------------------------------------*/
1178 * \brief Allocate memory for P2P_INFO, GL_P2P_INFO, P2P_CONNECTION_SETTINGS
1179 * P2P_SPECIFIC_BSS_INFO, P2P_FSM_INFO
1181 * \param[in] prGlueInfo Pointer to glue info
1186 /*----------------------------------------------------------------------------*/
1189 IN P_GLUE_INFO_T prGlueInfo
1192 P_ADAPTER_T prAdapter = NULL;
1193 P_WIFI_VAR_T prWifiVar = NULL;
1197 prAdapter = prGlueInfo->prAdapter;
1198 prWifiVar = &(prAdapter->rWifiVar);
1204 if (prGlueInfo == NULL) {
1208 if (prGlueInfo->prP2PInfo == NULL) {
1209 /*alloc memory for p2p info */
1210 prGlueInfo->prP2PInfo =
1211 kalMemAlloc(sizeof(GL_P2P_INFO_T), VIR_MEM_TYPE);
1212 prAdapter->prP2pInfo =
1213 kalMemAlloc(sizeof(P2P_INFO_T), VIR_MEM_TYPE);
1214 prWifiVar->prP2PConnSettings =
1215 kalMemAlloc(sizeof(P2P_CONNECTION_SETTINGS_T),VIR_MEM_TYPE);
1216 prWifiVar->prP2pFsmInfo =
1217 kalMemAlloc(sizeof(P2P_FSM_INFO_T),VIR_MEM_TYPE);
1218 prWifiVar->prP2pSpecificBssInfo =
1219 kalMemAlloc(sizeof(P2P_SPECIFIC_BSS_INFO_T),VIR_MEM_TYPE);
1222 ASSERT(prAdapter->prP2pInfo != NULL);
1223 ASSERT(prWifiVar->prP2PConnSettings != NULL);
1224 ASSERT(prWifiVar->prP2pFsmInfo != NULL);
1225 ASSERT(prWifiVar->prP2pSpecificBssInfo != NULL);
1227 /*MUST set memory to 0 */
1228 kalMemZero(prGlueInfo->prP2PInfo, sizeof(GL_P2P_INFO_T));
1229 kalMemZero(prAdapter->prP2pInfo, sizeof(P2P_INFO_T));
1230 kalMemZero(prWifiVar->prP2PConnSettings, sizeof(P2P_CONNECTION_SETTINGS_T));
1231 kalMemZero(prWifiVar->prP2pFsmInfo, sizeof(P2P_FSM_INFO_T));
1232 kalMemZero(prWifiVar->prP2pSpecificBssInfo, sizeof(P2P_SPECIFIC_BSS_INFO_T));
1237 /* chk if alloc successful or not*/
1238 if (prGlueInfo->prP2PInfo &&
1239 prAdapter->prP2pInfo &&
1240 prWifiVar->prP2PConnSettings &&
1241 prWifiVar->prP2pFsmInfo &&
1242 prWifiVar->prP2pSpecificBssInfo) {
1247 if (prWifiVar->prP2pSpecificBssInfo) {
1248 kalMemFree(prWifiVar->prP2pSpecificBssInfo, VIR_MEM_TYPE, sizeof(P2P_SPECIFIC_BSS_INFO_T));
1250 prWifiVar->prP2pSpecificBssInfo = NULL;
1252 if (prWifiVar->prP2pFsmInfo) {
1253 kalMemFree(prWifiVar->prP2pFsmInfo, VIR_MEM_TYPE, sizeof(P2P_FSM_INFO_T));
1255 prWifiVar->prP2pFsmInfo = NULL;
1257 if (prWifiVar->prP2PConnSettings) {
1258 kalMemFree(prWifiVar->prP2PConnSettings, VIR_MEM_TYPE, sizeof(P2P_CONNECTION_SETTINGS_T));
1260 prWifiVar->prP2PConnSettings = NULL;
1262 if (prGlueInfo->prP2PInfo) {
1263 kalMemFree(prGlueInfo->prP2PInfo, VIR_MEM_TYPE, sizeof(GL_P2P_INFO_T));
1265 prGlueInfo->prP2PInfo = NULL;
1267 if (prAdapter->prP2pInfo) {
1268 kalMemFree(prAdapter->prP2pInfo, VIR_MEM_TYPE, sizeof(P2P_INFO_T));
1270 prAdapter->prP2pInfo = NULL;
1278 /*----------------------------------------------------------------------------*/
1280 * \brief Free memory for P2P_INFO, GL_P2P_INFO, P2P_CONNECTION_SETTINGS
1281 * P2P_SPECIFIC_BSS_INFO, P2P_FSM_INFO
1283 * \param[in] prGlueInfo Pointer to glue info
1288 /*----------------------------------------------------------------------------*/
1291 P_GLUE_INFO_T prGlueInfo
1296 ASSERT(prGlueInfo->prAdapter);
1298 /* free memory after p2p module is ALREADY unregistered */
1299 if(prGlueInfo->prAdapter->fgIsP2PRegistered == FALSE) {
1301 kalMemFree(prGlueInfo->prAdapter->prP2pInfo, VIR_MEM_TYPE, sizeof(P2P_INFO_T));
1302 kalMemFree(prGlueInfo->prP2PInfo, VIR_MEM_TYPE, sizeof(GL_P2P_INFO_T));
1303 kalMemFree(prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings, VIR_MEM_TYPE, sizeof(P2P_CONNECTION_SETTINGS_T));
1304 kalMemFree(prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo, VIR_MEM_TYPE, sizeof(P2P_FSM_INFO_T));
1305 kalMemFree(prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo, VIR_MEM_TYPE, sizeof(P2P_SPECIFIC_BSS_INFO_T));
1307 /*Reomve p2p bss scan list*/
1308 scanRemoveAllP2pBssDesc(prGlueInfo->prAdapter);
1310 /*reset all pointer to NULL */
1311 prGlueInfo->prP2PInfo = NULL;
1312 prGlueInfo->prAdapter->prP2pInfo = NULL;
1313 prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings = NULL;
1314 prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo = NULL;
1315 prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo = NULL;
1325 /*----------------------------------------------------------------------------*/
1327 * \brief Enable Channel for cfg80211 for Wi-Fi Direct based on current country code
1329 * \param[in] prGlueInfo Pointer to glue info
1334 /*----------------------------------------------------------------------------*/
1338 UINT_8 ucChannelNum,
1339 struct ieee80211_channel *mtk_channels,
1340 UINT_8 mtk_channel_sz
1343 UINT_8 ucCurChIdx = *pucChIdx;
1347 (*pucChIdx) %= mtk_channel_sz;
1349 if(ucChannelNum == mtk_channels[*pucChIdx].hw_value) {
1350 mtk_channels[*pucChIdx].flags &= ~IEEE80211_CHAN_DISABLED;
1354 if(*pucChIdx == ucCurChIdx) {
1355 printk(KERN_ALERT DRV_NAME "Orphan channel [%d]\n", ucChannelNum);
1364 P_GLUE_INFO_T prGlueInfo,
1365 BOOLEAN fgIsRtnlLockAcquired
1368 BOOLEAN fgDoRegister = FALSE;
1369 BOOLEAN fgRollbackRtnlLock = FALSE;
1372 GLUE_SPIN_LOCK_DECLARATION();
1375 ASSERT(prGlueInfo->prAdapter);
1378 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1379 if(prGlueInfo->prAdapter->rP2PNetRegState == ENUM_NET_REG_STATE_UNREGISTERED) {
1380 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_REGISTERING;
1381 fgDoRegister = TRUE;
1383 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1389 if(fgIsRtnlLockAcquired && rtnl_is_locked()) {
1390 fgRollbackRtnlLock = TRUE;
1394 /* Here are functions which need rtnl_lock */
1395 wiphy_register(prGlueInfo->prP2PInfo->wdev.wiphy);
1397 /* net device initialize */
1398 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1399 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1401 /* register for net device */
1402 if (register_netdev(prGlueInfo->prP2PInfo->prDevHandler) < 0) {
1403 printk(KERN_ALERT DRV_NAME "unable to register netdevice for p2p\n");
1405 free_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1410 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_REGISTERED;
1414 if(fgRollbackRtnlLock) {
1423 P_GLUE_INFO_T prGlueInfo,
1424 BOOLEAN fgIsRtnlLockAcquired
1427 BOOLEAN fgDoUnregister = FALSE;
1428 BOOLEAN fgRollbackRtnlLock = FALSE;
1430 GLUE_SPIN_LOCK_DECLARATION();
1433 ASSERT(prGlueInfo->prAdapter);
1435 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1436 if(prGlueInfo->prAdapter->rP2PNetRegState == ENUM_NET_REG_STATE_REGISTERED) {
1437 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_UNREGISTERING;
1438 fgDoUnregister = TRUE;
1440 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1442 if(!fgDoUnregister) {
1446 /* prepare for removal */
1447 if(netif_carrier_ok(prGlueInfo->prP2PInfo->prDevHandler)) {
1448 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1451 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1453 if(fgIsRtnlLockAcquired && rtnl_is_locked()) {
1454 fgRollbackRtnlLock = TRUE;
1457 /* Here are functions which need rtnl_lock */
1459 unregister_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1461 wiphy_unregister(prGlueInfo->prP2PInfo->wdev.wiphy);
1463 if(fgRollbackRtnlLock) {
1467 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_UNREGISTERED;
1473 /*----------------------------------------------------------------------------*/
1475 * \brief Update Channel table for cfg80211 for Wi-Fi Direct based on current country code
1477 * \param[in] prGlueInfo Pointer to glue info
1482 /*----------------------------------------------------------------------------*/
1484 p2pUpdateChannelTableByDomain(
1485 P_GLUE_INFO_T prGlueInfo
1488 UINT_8 i, uc2gChIdx, uc5gChIdx;
1489 UINT_8 ucMaxChannelNum = ARRAY_SIZE(mtk_2ghz_channels) + ARRAY_SIZE(mtk_5ghz_a_channels);
1490 UINT_8 ucNumOfChannel = ucMaxChannelNum;
1491 RF_CHANNEL_INFO_T aucChannelList[ucMaxChannelNum];
1493 uc2gChIdx = uc5gChIdx = 0;
1495 // 1. Disable all channel
1496 for(i = 0; i < ARRAY_SIZE(mtk_2ghz_channels); i++) {
1497 mtk_2ghz_channels[i].flags |= IEEE80211_CHAN_DISABLED;
1499 for(i = 0; i < ARRAY_SIZE(mtk_5ghz_a_channels); i++) {
1500 mtk_5ghz_a_channels[i].flags |= IEEE80211_CHAN_DISABLED;
1503 // 2. Get current domain channel list
1504 rlmDomainGetChnlList(prGlueInfo->prAdapter, BAND_NULL, ucMaxChannelNum, &ucNumOfChannel, aucChannelList);
1506 // 3. Enable specific channel based on domain channel list
1507 for(i = 0; i < ucNumOfChannel; i++) {
1508 switch(aucChannelList[i].eBand) {
1510 p2pEnableChannel(&uc2gChIdx, aucChannelList[i].ucChannelNum, mtk_2ghz_channels, ARRAY_SIZE(mtk_2ghz_channels));
1514 p2pEnableChannel(&uc5gChIdx, aucChannelList[i].ucChannelNum, mtk_5ghz_a_channels, ARRAY_SIZE(mtk_5ghz_a_channels));
1518 printk(KERN_ALERT DRV_NAME "Unknow band.\n");
1528 /*----------------------------------------------------------------------------*/
1530 * \brief Register for cfg80211 for Wi-Fi Direct
1532 * \param[in] prGlueInfo Pointer to glue info
1537 /*----------------------------------------------------------------------------*/
1540 P_GLUE_INFO_T prGlueInfo,
1541 const char *prDevName,
1545 P_ADAPTER_T prAdapter = NULL;
1546 P_GL_HIF_INFO_T prHif = NULL;
1547 PARAM_MAC_ADDRESS rMacAddr;
1548 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1549 struct device *prDev;
1554 prAdapter = prGlueInfo->prAdapter;
1557 prHif = &prGlueInfo->rHifInfo;
1560 printk("glRegisterP2P\n");
1562 /*0. allocate p2pinfo */
1563 if(!p2PAllocInfo(prGlueInfo)) {
1564 printk(KERN_ALERT DRV_NAME "Allocate memory for p2p FAILED\n");
1568 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1569 /* 1. allocate WIPHY */
1570 prGlueInfo->prP2PInfo->wdev.wiphy = wiphy_new(&mtk_p2p_config_ops, sizeof(P_GLUE_INFO_T));
1571 if (!prGlueInfo->prP2PInfo->wdev.wiphy) {
1572 printk(KERN_ALERT DRV_NAME "unable to allocate wiphy for p2p\n");
1574 goto err_alloc_wiphy;
1577 /* 1.1 fill wiphy parameters */
1578 #if MTK_WCN_HIF_SDIO
1579 mtk_wcn_hif_sdio_get_dev(prHif->cltCtx, &prDev);
1581 printk(KERN_ALERT DRV_NAME "unable to get struct dev for p2p\n");
1584 prDev = &(prHif->func->dev);
1586 set_wiphy_dev(prGlueInfo->prP2PInfo->wdev.wiphy, prDev);
1588 prGlueInfo->prP2PInfo->wdev.wiphy->interface_modes = BIT(NL80211_IFTYPE_AP)
1589 | BIT(NL80211_IFTYPE_P2P_CLIENT)
1590 | BIT(NL80211_IFTYPE_P2P_GO)
1591 | BIT(NL80211_IFTYPE_STATION);
1593 p2pUpdateChannelTableByDomain(prGlueInfo);
1594 prGlueInfo->prP2PInfo->wdev.wiphy->bands[IEEE80211_BAND_2GHZ] = &mtk_band_2ghz;
1595 if(prAdapter->fgEnable5GBand) {
1596 prGlueInfo->prP2PInfo->wdev.wiphy->bands[IEEE80211_BAND_5GHZ] = &mtk_band_5ghz;
1599 prGlueInfo->prP2PInfo->wdev.wiphy->mgmt_stypes = mtk_cfg80211_default_mgmt_stypes;
1600 prGlueInfo->prP2PInfo->wdev.wiphy->max_remain_on_channel_duration = 5000;
1601 prGlueInfo->prP2PInfo->wdev.wiphy->n_cipher_suites = 5;
1602 prGlueInfo->prP2PInfo->wdev.wiphy->cipher_suites = (const u32*)cipher_suites;
1603 #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0)
1604 prGlueInfo->prP2PInfo->wdev.wiphy->flags = WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | WIPHY_FLAG_HAVE_AP_SME | WIPHY_FLAG_OFFCHAN_TX;
1606 prGlueInfo->prP2PInfo->wdev.wiphy->flags = WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_HAVE_AP_SME;
1607 // printk(KERN_ALERT DRV_NAME "Not support WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | WIPHY_FLAG_HAVE_AP_SME | WIPHY_FLAG_OFFCHAN_TX\n");
1610 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)
1611 prGlueInfo->prP2PInfo->wdev.wiphy->max_scan_ssids = MAX_SCAN_LIST_NUM;
1612 prGlueInfo->prP2PInfo->wdev.wiphy->max_scan_ie_len = MAX_SCAN_IE_LEN;
1613 prGlueInfo->prP2PInfo->wdev.wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
1617 /* 2. Register WIPHY */
1618 if(wiphy_register(prGlueInfo->prP2PInfo->wdev.wiphy) < 0) {
1619 printk(KERN_ALERT DRV_NAME "Couldn't register wiphy device for p2p\n");
1625 /* 2.1 set priv as pointer to glue structure */
1626 *((P_GLUE_INFO_T *) wiphy_priv(prGlueInfo->prP2PInfo->wdev.wiphy)) = prGlueInfo;
1628 /* 2.2 wdev initialization */
1630 prGlueInfo->prP2PInfo->wdev.iftype = NL80211_IFTYPE_AP;
1632 prGlueInfo->prP2PInfo->wdev.iftype = NL80211_IFTYPE_P2P_CLIENT;
1635 #endif /* CFG_ENABLE_WIFI_DIRECT_CFG_80211 */
1637 /* 3. allocate netdev */
1638 prGlueInfo->prP2PInfo->prDevHandler = alloc_netdev_mq(sizeof(P_GLUE_INFO_T), prDevName, ether_setup, CFG_MAX_TXQ_NUM);
1639 if (!prGlueInfo->prP2PInfo->prDevHandler) {
1640 printk(KERN_ALERT DRV_NAME "unable to allocate netdevice for p2p\n");
1642 printk("unable to allocate netdevice for p2p\n");
1644 goto err_alloc_netdev;
1647 /* 4. setup netdev */
1648 /* 4.1 Point to shared glue structure */
1649 *((P_GLUE_INFO_T *) netdev_priv(prGlueInfo->prP2PInfo->prDevHandler)) = prGlueInfo;
1651 /* 4.2 fill hardware address */
1652 COPY_MAC_ADDR(rMacAddr, prAdapter->rMyMacAddr);
1653 rMacAddr[0] ^= 0x2; // change to local administrated address
1654 memcpy(prGlueInfo->prP2PInfo->prDevHandler->dev_addr, rMacAddr, ETH_ALEN);
1655 memcpy(prGlueInfo->prP2PInfo->prDevHandler->perm_addr, prGlueInfo->prP2PInfo->prDevHandler->dev_addr, ETH_ALEN);
1657 /* 4.3 register callback functions */
1658 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
1659 prGlueInfo->prP2PInfo->prDevHandler->netdev_ops = &p2p_netdev_ops;
1661 prGlueInfo->prP2PInfo->prDevHandler->open = p2pOpen;
1662 prGlueInfo->prP2PInfo->prDevHandler->stop = p2pStop;
1663 prGlueInfo->prP2PInfo->prDevHandler->get_stats = p2pGetStats;
1664 prGlueInfo->prP2PInfo->prDevHandler->set_multicast_list = p2pSetMulticastList;
1665 prGlueInfo->prP2PInfo->prDevHandler->hard_start_xmit = p2pHardStartXmit;
1666 prGlueInfo->prP2PInfo->prDevHandler->do_ioctl = p2pDoIOCTL;
1667 prGlueInfo->prP2PInfo->prDevHandler->set_mac_address = p2pSetMACAddress;
1669 // prGlueInfo->prP2PInfo->prDevHandler->wireless_handlers = &mtk_p2p_wext_handler_def;
1672 #if (MTK_WCN_HIF_SDIO == 0)
1673 SET_NETDEV_DEV(prGlueInfo->prP2PInfo->prDevHandler, &(prHif->func->dev));
1677 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1678 prGlueInfo->prP2PInfo->prDevHandler->ieee80211_ptr = &(prGlueInfo->prP2PInfo->wdev);
1679 prGlueInfo->prP2PInfo->wdev.netdev = prGlueInfo->prP2PInfo->prDevHandler;
1682 #if CFG_TCP_IP_CHKSUM_OFFLOAD
1683 prGlueInfo->prP2PInfo->prDevHandler->features = NETIF_F_IP_CSUM;
1684 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
1687 /* 7. net device initialize */
1688 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1689 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1691 /* 8. register for net device */
1692 if (register_netdev(prGlueInfo->prP2PInfo->prDevHandler) < 0) {
1693 printk(KERN_ALERT DRV_NAME "unable to register netdevice for p2p\n");
1695 goto err_reg_netdev;
1699 /* 8. set p2p net device register state */
1700 prGlueInfo->prAdapter->rP2PNetRegState = ENUM_NET_REG_STATE_UNREGISTERED;
1702 /* 9. setup running mode*/
1703 prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo->fgIsApMode = fgIsApMode;
1706 p2pFsmInit(prAdapter);
1708 p2pFuncInitConnectionSettings(prAdapter, prAdapter->rWifiVar.prP2PConnSettings);
1710 /* Active network too early would cause HW not able to sleep.
1711 * Defer the network active time.
1713 // nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
1718 free_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1721 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1722 // wiphy_unregister(prGlueInfo->prP2PInfo->wdev.wiphy);
1725 wiphy_free(prGlueInfo->prP2PInfo->wdev.wiphy);
1726 prGlueInfo->prP2PInfo->wdev.wiphy = NULL;
1732 } /* end of glRegisterP2P() */
1735 /*----------------------------------------------------------------------------*/
1737 * \brief Unregister Net Device for Wi-Fi Direct
1739 * \param[in] prGlueInfo Pointer to glue info
1744 /*----------------------------------------------------------------------------*/
1747 P_GLUE_INFO_T prGlueInfo
1752 p2pFsmUninit(prGlueInfo->prAdapter);
1754 nicDeactivateNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1757 /* Release command, mgmt and security frame belong to P2P network in
1758 * prGlueInfo->prCmdQue
1759 * prAdapter->rPendingCmdQueue
1760 * prAdapter->rTxCtrl.rTxMgmtTxingQueue
1761 * To ensure there is no pending CmdDone/TxDone handler to be executed after p2p module is removed.
1765 kalClearMgmtFramesByNetType(prGlueInfo, NETWORK_TYPE_P2P_INDEX);
1766 kalClearSecurityFramesByNetType(prGlueInfo, NETWORK_TYPE_P2P_INDEX);
1767 /* Clear PendingCmdQue*/
1768 wlanReleasePendingCMDbyNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1769 /* Clear PendingTxMsdu */
1770 nicFreePendingTxMsduInfoByNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1774 /* prepare for removal */
1775 if(netif_carrier_ok(prGlueInfo->prP2PInfo->prDevHandler)) {
1776 netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
1779 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1781 /* netdevice unregistration & free */
1782 unregister_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1784 free_netdev(prGlueInfo->prP2PInfo->prDevHandler);
1785 prGlueInfo->prP2PInfo->prDevHandler = NULL;
1787 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211
1789 wiphy_unregister(prGlueInfo->prP2PInfo->wdev.wiphy);
1791 wiphy_free(prGlueInfo->prP2PInfo->wdev.wiphy);
1792 prGlueInfo->prP2PInfo->wdev.wiphy = NULL;
1795 /* Free p2p memory */
1797 if(!p2PFreeInfo(prGlueInfo)) {
1798 printk(KERN_ALERT DRV_NAME "Free memory for p2p FAILED\n");
1805 } /* end of glUnregisterP2P() */
1808 /*----------------------------------------------------------------------------*/
1810 * \brief A function for stop p2p fsm immediate
1812 * \param[in] prGlueInfo Pointer to struct P_GLUE_INFO_T.
1814 * \retval TRUE The execution succeeds.
1815 * \retval FALSE The execution failed.
1817 /*----------------------------------------------------------------------------*/
1820 P_GLUE_INFO_T prGlueInfo
1823 // P_ADAPTER_T prAdapter = NULL;
1824 // P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch;
1828 // prAdapter = prGlueInfo->prAdapter;
1829 // ASSERT(prAdapter);
1831 /* 1. stop TX queue */
1832 netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);
1836 /* 2. switch P2P-FSM off */
1837 /* 2.1 allocate for message */
1838 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(
1841 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
1843 if (!prFuncSwitch) {
1844 ASSERT(0); // Can't trigger P2P FSM
1845 printk(KERN_ALERT DRV_NAME "Allocate for p2p mesasage FAILED\n");
1849 /* 2.2 fill message */
1850 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
1851 prFuncSwitch->fgIsFuncOn = FALSE;
1853 /* 2.3 send message */
1854 mboxSendMsg(prAdapter,
1856 (P_MSG_HDR_T) prFuncSwitch,
1857 MSG_SEND_METHOD_UNBUF);
1861 /* 3. stop queue and turn off carrier */
1862 prGlueInfo->prP2PInfo->eState = PARAM_MEDIA_STATE_DISCONNECTED;
1865 } /* end of p2pStop() */
1868 /* Net Device Hooks */
1869 /*----------------------------------------------------------------------------*/
1871 * \brief A function for net_device open (ifup)
1873 * \param[in] prDev Pointer to struct net_device.
1875 * \retval 0 The execution succeeds.
1876 * \retval < 0 The execution failed.
1878 /*----------------------------------------------------------------------------*/
1881 IN struct net_device *prDev
1884 // P_GLUE_INFO_T prGlueInfo = NULL;
1885 // P_ADAPTER_T prAdapter = NULL;
1886 // P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch;
1890 #if 0 // Move after device name set. (mtk_p2p_set_local_dev_info)
1891 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
1894 prAdapter = prGlueInfo->prAdapter;
1897 /* 1. switch P2P-FSM on */
1898 /* 1.1 allocate for message */
1899 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(prAdapter,
1901 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
1903 if (!prFuncSwitch) {
1904 ASSERT(0); // Can't trigger P2P FSM
1908 /* 1.2 fill message */
1909 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
1910 prFuncSwitch->fgIsFuncOn = TRUE;
1912 /* 1.3 send message */
1913 mboxSendMsg(prAdapter,
1915 (P_MSG_HDR_T) prFuncSwitch,
1916 MSG_SEND_METHOD_BUF);
1919 /* 2. carrier on & start TX queue */
1920 netif_carrier_on(prDev);
1921 netif_tx_start_all_queues(prDev);
1923 return 0; /* success */
1924 } /* end of p2pOpen() */
1927 /*----------------------------------------------------------------------------*/
1929 * \brief A function for net_device stop (ifdown)
1931 * \param[in] prDev Pointer to struct net_device.
1933 * \retval 0 The execution succeeds.
1934 * \retval < 0 The execution failed.
1936 /*----------------------------------------------------------------------------*/
1939 IN struct net_device *prDev
1942 P_GLUE_INFO_T prGlueInfo = NULL;
1943 // P_ADAPTER_T prAdapter = NULL;
1944 // P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch;
1945 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1947 struct cfg80211_scan_request *prScanRequest = NULL;
1948 GLUE_SPIN_LOCK_DECLARATION();
1951 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
1954 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1955 ASSERT(prGlueP2pInfo);
1958 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1959 if(prGlueP2pInfo->prScanRequest != NULL) {
1960 prScanRequest = prGlueP2pInfo->prScanRequest;
1961 prGlueP2pInfo->prScanRequest = NULL;
1963 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
1966 cfg80211_scan_done(prScanRequest, TRUE);
1971 /* 1. stop TX queue */
1972 netif_tx_stop_all_queues(prDev);
1974 /* 2. switch P2P-FSM off */
1975 /* 2.1 allocate for message */
1976 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(prAdapter,
1978 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
1980 if (!prFuncSwitch) {
1981 ASSERT(0); // Can't trigger P2P FSM
1985 /* 2.2 fill message */
1986 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
1987 prFuncSwitch->fgIsFuncOn = FALSE;
1989 /* 2.3 send message */
1990 mboxSendMsg(prAdapter,
1992 (P_MSG_HDR_T) prFuncSwitch,
1993 MSG_SEND_METHOD_BUF);
1995 /* 3. stop queue and turn off carrier */
1996 prGlueInfo->prP2PInfo->eState = PARAM_MEDIA_STATE_DISCONNECTED;
1998 netif_tx_stop_all_queues(prDev);
1999 if(netif_carrier_ok(prDev)) {
2000 netif_carrier_off(prDev);
2004 } /* end of p2pStop() */
2007 /*----------------------------------------------------------------------------*/
2009 * \brief A method of struct net_device, to get the network interface statistical
2012 * Whenever an application needs to get statistics for the interface, this method
2013 * is called. This happens, for example, when ifconfig or netstat -i is run.
2015 * \param[in] prDev Pointer to struct net_device.
2017 * \return net_device_stats buffer pointer.
2019 /*----------------------------------------------------------------------------*/
2020 struct net_device_stats *
2022 IN struct net_device *prDev
2025 P_GLUE_INFO_T prGlueInfo = NULL;
2028 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2030 #if 1 // frog temp fix
2032 //prDev->stats.rx_packets = 0;
2033 //prDev->stats.tx_packets = 0;
2034 prDev->stats.tx_errors = 0;
2035 prDev->stats.rx_errors = 0;
2036 //prDev->stats.rx_bytes = 0;
2037 //prDev->stats.tx_bytes = 0;
2038 prDev->stats.multicast = 0;
2040 return &prDev->stats;
2043 prGlueInfo->prP2PInfo->rNetDevStats.rx_packets = 0;
2044 prGlueInfo->prP2PInfo->rNetDevStats.tx_packets = 0;
2045 prGlueInfo->prP2PInfo->rNetDevStats.tx_errors = 0;
2046 prGlueInfo->prP2PInfo->rNetDevStats.rx_errors = 0;
2047 prGlueInfo->prP2PInfo->rNetDevStats.rx_bytes = 0;
2048 prGlueInfo->prP2PInfo->rNetDevStats.tx_bytes = 0;
2049 prGlueInfo->prP2PInfo->rNetDevStats.rx_errors = 0;
2050 prGlueInfo->prP2PInfo->rNetDevStats.multicast = 0;
2052 return &prGlueInfo->prP2PInfo->rNetDevStats;
2054 } /* end of p2pGetStats() */
2060 p2pSetMulticastList (
2061 IN struct net_device *prDev
2064 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
2066 prGlueInfo = (NULL != prDev) ? *((P_GLUE_INFO_T *) netdev_priv(prDev)) : NULL;
2070 if (!prDev || !prGlueInfo) {
2071 printk(KERN_WARNING DRV_NAME" abnormal dev or skb: prDev(0x%p), prGlueInfo(0x%p)\n", prDev, prGlueInfo);
2078 //4 Mark HALT, notify main thread to finish current job
2079 prGlueInfo->u4Flag |= GLUE_FLAG_SUB_MOD_MULTICAST;
2080 /* wake up main thread */
2081 wake_up_interruptible(&prGlueInfo->waitq);
2083 } /* p2pSetMulticastList */
2086 /*----------------------------------------------------------------------------*/
2088 * \brief This function is to set multicast list and set rx mode.
2090 * \param[in] prDev Pointer to struct net_device
2094 /*----------------------------------------------------------------------------*/
2096 mtk_p2p_wext_set_Multicastlist (
2097 P_GLUE_INFO_T prGlueInfo
2100 UINT_32 u4SetInfoLen = 0;
2101 struct net_device *prDev = g_P2pPrDev;
2103 prGlueInfo = (NULL != prDev) ? *((P_GLUE_INFO_T *) netdev_priv(prDev)) : NULL;
2107 if (!prDev || !prGlueInfo) {
2108 printk(KERN_WARNING DRV_NAME" abnormal dev or skb: prDev(0x%p), prGlueInfo(0x%p)\n", prDev, prGlueInfo);
2113 if (prDev->flags & IFF_PROMISC) {
2114 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_PROMISCUOUS;
2117 if (prDev->flags & IFF_BROADCAST) {
2118 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_BROADCAST;
2121 if (prDev->flags & IFF_MULTICAST) {
2122 if ((prDev->flags & IFF_ALLMULTI) ||
2123 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
2124 (netdev_mc_count(prDev) > MAX_NUM_GROUP_ADDR)) {
2126 (prDev->mc_count > MAX_NUM_GROUP_ADDR)) {
2128 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_ALL_MULTICAST;
2131 prGlueInfo->prP2PInfo->u4PacketFilter |= PARAM_PACKET_FILTER_MULTICAST;
2135 if (prGlueInfo->prP2PInfo->u4PacketFilter & PARAM_PACKET_FILTER_MULTICAST) {
2136 /* Prepare multicast address list */
2137 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
2138 struct netdev_hw_addr *ha;
2140 struct dev_mc_list *prMcList;
2144 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
2145 netdev_for_each_mc_addr(ha, prDev) {
2146 if(i < MAX_NUM_GROUP_ADDR) {
2147 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucMCAddrList[i]), ha->addr);
2152 for (i = 0, prMcList = prDev->mc_list;
2153 (prMcList) && (i < prDev->mc_count) && (i < MAX_NUM_GROUP_ADDR);
2154 i++, prMcList = prMcList->next) {
2155 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucMCAddrList[i]), prMcList->dmi_addr);
2159 DBGLOG(P2P, TRACE, ("SEt Multicast Address List\n"));
2161 if (i >= MAX_NUM_GROUP_ADDR) {
2164 wlanoidSetP2PMulticastList(prGlueInfo->prAdapter,
2165 &(prGlueInfo->prP2PInfo->aucMCAddrList[0]),
2172 } /* end of p2pSetMulticastList() */
2175 /*----------------------------------------------------------------------------*/
2177 * * \brief This function is TX entry point of NET DEVICE.
2179 * * \param[in] prSkb Pointer of the sk_buff to be sent
2180 * * \param[in] prDev Pointer to struct net_device
2182 * * \retval NETDEV_TX_OK - on success.
2183 * * \retval NETDEV_TX_BUSY - on failure, packet will be discarded by upper layer.
2185 /*----------------------------------------------------------------------------*/
2188 IN struct sk_buff *prSkb,
2189 IN struct net_device *prDev
2192 P_QUE_ENTRY_T prQueueEntry = NULL;
2193 P_QUE_T prTxQueue = NULL;
2194 P_GLUE_INFO_T prGlueInfo = NULL;
2195 UINT_16 u2QueueIdx = 0;
2197 GLUE_SPIN_LOCK_DECLARATION();
2202 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2204 if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) {
2205 printk(KERN_INFO DRV_NAME"GLUE_FLAG_HALT skip tx\n");
2206 dev_kfree_skb(prSkb);
2207 return NETDEV_TX_OK;
2210 // mark as P2P packets
2211 GLUE_SET_PKT_FLAG_P2P(prSkb);
2212 #if CFG_ENABLE_PKT_LIFETIME_PROFILE
2213 GLUE_SET_PKT_ARRIVAL_TIME(prSkb, kalGetTimeTick());
2216 prQueueEntry = (P_QUE_ENTRY_T) GLUE_GET_PKT_QUEUE_ENTRY(prSkb);
2217 prTxQueue = &prGlueInfo->rTxQueue;
2219 if (wlanProcessSecurityFrame(prGlueInfo->prAdapter, (P_NATIVE_PACKET) prSkb) == FALSE) {
2221 u2QueueIdx = skb_get_queue_mapping(prSkb);
2222 ASSERT(u2QueueIdx < CFG_MAX_TXQ_NUM);
2224 if (u2QueueIdx >= CFG_MAX_TXQ_NUM) {
2225 printk(KERN_INFO DRV_NAME"Incorrect queue index, skip this frame\n");
2226 dev_kfree_skb(prSkb);
2227 return NETDEV_TX_OK;
2229 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_TX_QUE);
2230 QUEUE_INSERT_TAIL(prTxQueue, prQueueEntry);
2231 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_TX_QUE);
2233 GLUE_INC_REF_CNT(prGlueInfo->i4TxPendingFrameNum);
2234 GLUE_INC_REF_CNT(prGlueInfo->ai4TxPendingFrameNumPerQueue[NETWORK_TYPE_P2P_INDEX][u2QueueIdx]);
2236 if (prGlueInfo->ai4TxPendingFrameNumPerQueue[NETWORK_TYPE_P2P_INDEX][u2QueueIdx] >= CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD) {
2237 netif_stop_subqueue(prDev, u2QueueIdx);
2241 GLUE_INC_REF_CNT(prGlueInfo->i4TxPendingSecurityFrameNum);
2244 kalSetEvent(prGlueInfo);
2246 /* Statistic usage. */
2247 prDev->stats.tx_bytes += prSkb->len;
2248 prDev->stats.tx_packets++;
2250 return NETDEV_TX_OK;
2251 } /* end of p2pHardStartXmit() */
2254 /*----------------------------------------------------------------------------*/
2256 * \brief A method of struct net_device, a primary SOCKET interface to configure
2257 * the interface lively. Handle an ioctl call on one of our devices.
2258 * Everything Linux ioctl specific is done here. Then we pass the contents
2259 * of the ifr->data to the request message handler.
2261 * \param[in] prDev Linux kernel netdevice
2263 * \param[in] prIFReq Our private ioctl request structure, typed for the generic
2264 * struct ifreq so we can use ptr to function
2266 * \param[in] cmd Command ID
2268 * \retval WLAN_STATUS_SUCCESS The IOCTL command is executed successfully.
2269 * \retval OTHER The execution of IOCTL command is failed.
2271 /*----------------------------------------------------------------------------*/
2274 struct net_device *prDev,
2275 struct ifreq *prIFReq,
2279 P_GLUE_INFO_T prGlueInfo = NULL;
2281 char *prExtraBuf = NULL;
2282 UINT_32 u4ExtraSize = 0;
2283 struct iwreq *prIwReq = (struct iwreq *)prIFReq;
2284 struct iw_request_info rIwReqInfo;
2288 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2290 if (prGlueInfo->u4ReadyFlag == 0) {
2291 // adapter not ready yet
2296 rIwReqInfo.cmd = (__u16)i4Cmd;
2297 rIwReqInfo.flags = 0;
2300 case SIOCSIWENCODEEXT:
2301 /* Set Encryption Material after 4-way handshaking is done */
2302 if (prIwReq->u.encoding.pointer) {
2303 u4ExtraSize = prIwReq->u.encoding.length;
2304 prExtraBuf = kalMemAlloc(u4ExtraSize, VIR_MEM_TYPE);
2311 if (copy_from_user(prExtraBuf,
2312 prIwReq->u.encoding.pointer,
2313 prIwReq->u.encoding.length)) {
2317 else if (prIwReq->u.encoding.length != 0) {
2323 ret = mtk_p2p_wext_set_key(prDev, &rIwReqInfo, &(prIwReq->u), prExtraBuf);
2326 kalMemFree(prExtraBuf, VIR_MEM_TYPE, u4ExtraSize);
2331 /* IW_MLME_DISASSOC used for disconnection*/
2332 if (prIwReq->u.data.length != sizeof(struct iw_mlme)) {
2333 printk(KERN_INFO "MLME buffer strange:%d\n", prIwReq->u.data.length);
2338 if (!prIwReq->u.data.pointer) {
2343 prExtraBuf = kalMemAlloc(sizeof(struct iw_mlme), VIR_MEM_TYPE);
2349 if (copy_from_user(prExtraBuf, prIwReq->u.data.pointer, sizeof(struct iw_mlme))) {
2353 ret = mtk_p2p_wext_mlme_handler(prDev, &rIwReqInfo, &(prIwReq->u), prExtraBuf);
2356 kalMemFree(prExtraBuf, VIR_MEM_TYPE, sizeof(struct iw_mlme));
2361 /* This ioctl is used to list all IW privilege ioctls */
2362 ret = mtk_p2p_wext_get_priv(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2366 ret = mtk_p2p_wext_discovery_results(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2370 ret = mtk_p2p_wext_set_auth(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2373 case IOC_P2P_CFG_DEVICE:
2374 case IOC_P2P_PROVISION_COMPLETE:
2375 case IOC_P2P_START_STOP_DISCOVERY:
2376 case IOC_P2P_DISCOVERY_RESULTS:
2377 case IOC_P2P_WSC_BEACON_PROBE_RSP_IE:
2378 case IOC_P2P_CONNECT_DISCONNECT:
2379 case IOC_P2P_PASSWORD_READY:
2380 case IOC_P2P_GET_STRUCT:
2381 case IOC_P2P_SET_STRUCT:
2382 case IOC_P2P_GET_REQ_DEVICE_INFO:
2383 ret = rP2PIwPrivHandler[i4Cmd - SIOCIWFIRSTPRIV](prDev, &rIwReqInfo, &(prIwReq->u), (char *)&(prIwReq->u));
2385 #if CFG_SUPPORT_P2P_RSSI_QUERY
2387 ret = mtk_p2p_wext_get_rssi(prDev, &rIwReqInfo, &(prIwReq->u), NULL);
2395 } /* end of p2pDoIOCTL() */
2398 /*----------------------------------------------------------------------------*/
2400 * \brief To report the private supported IOCTLs table to user space.
2402 * \param[in] prDev Net device requested.
2403 * \param[out] prIfReq Pointer to ifreq structure, content is copied back to
2404 * user space buffer in gl_iwpriv_table.
2406 * \retval 0 For success.
2407 * \retval -E2BIG For user's buffer size is too small.
2408 * \retval -EFAULT For fail.
2411 /*----------------------------------------------------------------------------*/
2413 mtk_p2p_wext_get_priv (
2414 IN struct net_device *prDev,
2415 IN struct iw_request_info *info,
2416 IN OUT union iwreq_data *wrqu,
2420 struct iw_point *prData= (struct iw_point *)&wrqu->data;
2421 UINT_16 u2BufferSize = 0;
2425 u2BufferSize = prData->length;
2427 /* update our private table size */
2428 prData->length = (__u16)sizeof(rP2PIwPrivTable)/sizeof(struct iw_priv_args);
2430 if (u2BufferSize < prData->length) {
2434 if (prData->length) {
2435 if (copy_to_user(prData->pointer, rP2PIwPrivTable, sizeof(rP2PIwPrivTable))) {
2441 } /* end of mtk_p2p_wext_get_priv() */
2444 /*----------------------------------------------------------------------------*/
2446 * \brief To indicate P2P-FSM for re-associate to the connecting device
2448 * \param[in] prDev Net device requested.
2449 * \param[inout] wrqu Pointer to iwreq_data
2451 * \retval 0 For success.
2452 * \retval -EFAULT For fail.
2455 /*----------------------------------------------------------------------------*/
2457 mtk_p2p_wext_reconnect (
2458 IN struct net_device *prDev,
2459 IN struct iw_request_info *info,
2460 IN OUT union iwreq_data *wrqu,
2465 P_ADAPTER_T prAdapter = NULL;
2466 P_GLUE_INFO_T prGlueInfo = NULL;
2467 P_MSG_HDR_T prMsgHdr;
2471 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2474 prAdapter = prGlueInfo->prAdapter;
2477 prMsgHdr = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_HDR_T));
2479 ASSERT(0); // Can't trigger P2P FSM
2483 /* 1.2 fill message */
2485 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_reconnect: P2P Reconnect\n"));
2487 /* 1.3 send message */
2488 mboxSendMsg(prAdapter,
2490 (P_MSG_HDR_T) prMsgHdr,
2491 MSG_SEND_METHOD_BUF);
2494 } /* end of mtk_p2p_wext_reconnect() */
2499 /*----------------------------------------------------------------------------*/
2501 * \brief MLME command handler
2503 * \param[in] prDev Net device requested.
2504 * \param[inout] wrqu Pointer to iwreq_data
2506 * \retval 0 Success.
2507 * \retval -EFAULT Setting parameters to driver fail.
2508 * \retval -EOPNOTSUPP Key size not supported.
2512 /*----------------------------------------------------------------------------*/
2514 mtk_p2p_wext_mlme_handler(
2515 IN struct net_device *prDev,
2516 IN struct iw_request_info *info,
2517 IN OUT union iwreq_data *wrqu,
2522 P_ADAPTER_T prAdapter = NULL;
2523 P_GLUE_INFO_T prGlueInfo = NULL;
2524 struct iw_mlme *mlme = (struct iw_mlme *)extra;
2525 P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt = (P_MSG_P2P_CONNECTION_ABORT_T)NULL;
2526 P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T)NULL;
2530 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2533 prAdapter = prGlueInfo->prAdapter;
2536 prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
2538 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_mlme_handler:\n"));
2540 switch (mlme->cmd) {
2541 case IW_MLME_DISASSOC:
2542 prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_CONNECTION_ABORT_T));
2543 if (!prMsgP2PConnAbt) {
2544 ASSERT(0); // Can't trigger P2P FSM
2548 COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, mlme->addr.sa_data);
2550 prMsgP2PConnAbt->u2ReasonCode = mlme->reason_code;
2553 if (EQUAL_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prP2pBssInfo->aucOwnMacAddr)) {
2554 DBGLOG(P2P, TRACE, ("P2P Connection Abort:\n"));
2556 /* 1.2 fill message */
2557 prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT;
2560 DBGLOG(P2P, TRACE, ("P2P Connection Pause:\n"));
2562 /* 1.2 fill message */
2565 /* 1.3 send message */
2566 mboxSendMsg(prAdapter,
2568 (P_MSG_HDR_T) prMsgP2PConnAbt,
2569 MSG_SEND_METHOD_BUF);
2578 } /* end of mtk_p2p_wext_mlme_handler() */
2581 /*----------------------------------------------------------------------------*/
2583 * \brief P2P Private I/O Control handler (IOC_P2P_PROVISION_COMPLETE)
2585 * \param[in] prDev Net device requested.
2586 * \param[inout] wrqu Pointer to iwreq_data
2588 * \retval 0 Success.
2589 * \retval -EFAULT Setting parameters to driver fail.
2590 * \retval -EOPNOTSUPP Key size not supported.
2594 /*----------------------------------------------------------------------------*/
2596 mtk_p2p_wext_set_provision_complete(
2597 IN struct net_device *prDev,
2598 IN struct iw_request_info *info,
2599 IN OUT union iwreq_data *wrqu,
2604 P_ADAPTER_T prAdapter = NULL;
2605 P_GLUE_INFO_T prGlueInfo = NULL;
2606 struct iw_point *prData= (struct iw_point *)&wrqu->data;
2607 P_MSG_HDR_T prMsgHdr;
2611 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2614 prAdapter = prGlueInfo->prAdapter;
2617 switch(prData->flags) {
2618 case P2P_PROVISIONING_SUCCESS:
2619 prMsgHdr = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_HDR_T));
2621 ASSERT(0); // Can't trigger P2P FSM
2625 /* 1.2 fill message */
2627 prGlueInfo->prP2PInfo->u4CipherPairwise = IW_AUTH_CIPHER_CCMP;
2629 /* 1.3 send message */
2630 mboxSendMsg(prAdapter,
2632 (P_MSG_HDR_T) prMsgHdr,
2633 MSG_SEND_METHOD_BUF);
2637 case P2P_PROVISIONING_FAIL:
2647 } /* end of mtk_p2p_wext_set_provision_complete() */
2651 /*----------------------------------------------------------------------------*/
2653 * \brief P2P Private I/O Control handler (IOC_P2P_START_STOP_DISCOVERY)
2655 * \param[in] prDev Net device requested.
2656 * \param[inout] wrqu Pointer to iwreq_data
2658 * \retval 0 Success.
2659 * \retval -EFAULT Setting parameters to driver fail.
2660 * \retval -EOPNOTSUPP Key size not supported.
2664 /*----------------------------------------------------------------------------*/
2666 mtk_p2p_wext_start_stop_discovery(
2667 IN struct net_device *prDev,
2668 IN struct iw_request_info *info,
2669 IN OUT union iwreq_data *wrqu,
2674 P_ADAPTER_T prAdapter = NULL;
2675 P_GLUE_INFO_T prGlueInfo = NULL;
2676 struct iw_point *prData= (struct iw_point *)&wrqu->data;
2677 P_IW_P2P_REQ_DEVICE_TYPE prReqDeviceType = (P_IW_P2P_REQ_DEVICE_TYPE) extra;
2678 UINT_8 au4IeBuf[MAX_IE_LENGTH];
2679 P_MSG_HDR_T prMsgHdr;
2680 P_MSG_P2P_DEVICE_DISCOVER_T prDiscoverMsg;
2681 P_P2P_CONNECTION_SETTINGS_T prConnSettings;
2682 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
2686 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2689 prAdapter = prGlueInfo->prAdapter;
2692 prConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
2694 if(prData->flags == P2P_STOP_DISCOVERY) {
2695 prMsgHdr = (P_MSG_HDR_T) cnmMemAlloc(prAdapter,
2700 ASSERT(0); // Can't trigger P2P FSM
2705 mboxSendMsg(prAdapter,
2707 (P_MSG_HDR_T) prMsgHdr,
2708 MSG_SEND_METHOD_BUF);
2710 else if(prData->flags == P2P_START_DISCOVERY) {
2712 /* retrieve IE for Probe Response */
2713 if(prReqDeviceType->probe_rsp_len > 0) {
2714 if(prReqDeviceType->probe_rsp_len <= MAX_IE_LENGTH) {
2715 if(copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prReqDeviceType->probe_rsp_ie, prReqDeviceType->probe_rsp_len)) {
2718 prGlueInfo->prP2PInfo->u2WSCIELen[2] = prReqDeviceType->probe_rsp_len;
2725 /* retrieve IE for Probe Request */
2726 if(prReqDeviceType->probe_req_len > 0) {
2727 if(prReqDeviceType->probe_req_len <= MAX_IE_LENGTH) {
2728 if(copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[1], prReqDeviceType->probe_req_ie, prReqDeviceType->probe_req_len)) {
2731 prGlueInfo->prP2PInfo->u2WSCIELen[1] = prReqDeviceType->probe_req_len;
2737 /* update IE for Probe Request */
2739 if(prReqDeviceType->scan_type == P2P_LISTEN) {
2740 /* update listening parameter */
2742 /* @TODO: update prConnSettings for Probe Response IE */
2745 // indicate P2P-FSM with MID_MNY_P2P_DEVICE_DISCOVERY
2746 prDiscoverMsg = (P_MSG_P2P_DEVICE_DISCOVER_T) cnmMemAlloc(prAdapter,
2748 sizeof(MSG_P2P_DEVICE_DISCOVER_T));
2750 if (!prDiscoverMsg) {
2751 ASSERT(0); // Can't trigger P2P FSM
2755 prDiscoverMsg->rMsgHdr.eMsgId = MID_MNY_P2P_DEVICE_DISCOVERY;
2756 prDiscoverMsg->u4DevDiscoverTime = 0; // unlimited
2757 prDiscoverMsg->fgIsSpecificType = TRUE;
2758 prDiscoverMsg->rTargetDeviceType.u2CategoryID = *(PUINT_16)(&(prReqDeviceType->pri_device_type[0]));
2759 prDiscoverMsg->rTargetDeviceType.u2SubCategoryID = *(PUINT_16)(&(prReqDeviceType->pri_device_type[6]));;
2760 COPY_MAC_ADDR(prDiscoverMsg->aucTargetDeviceID, aucNullAddr);
2762 /* @FIXME: parameter to be refined, where to pass IE buffer ? */
2763 mboxSendMsg(prAdapter,
2765 (P_MSG_HDR_T) prDiscoverMsg,
2766 MSG_SEND_METHOD_BUF);
2775 } /* end of mtk_p2p_wext_start_stop_discovery() */
2779 /*----------------------------------------------------------------------------*/
2781 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
2783 * \param[in] prDev Net device requested.
2784 * \param[inout] wrqu Pointer to iwreq_data
2786 * \retval 0 Success.
2787 * \retval -EFAULT Setting parameters to driver fail.
2788 * \retval -EOPNOTSUPP Setting parameters not support.
2792 /*----------------------------------------------------------------------------*/
2794 mtk_p2p_wext_invitation_request (
2795 IN struct net_device *prDev,
2796 IN struct iw_request_info *info,
2797 IN OUT union iwreq_data *wrqu,
2803 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
2804 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
2805 struct iw_point *prData = (struct iw_point*)&wrqu->data;
2806 P_IW_P2P_IOCTL_INVITATION_STRUCT prIoctlInvitation = (P_IW_P2P_IOCTL_INVITATION_STRUCT)NULL;
2809 if ((prDev == NULL) || (extra == NULL)) {
2816 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
2817 prIoctlInvitation = (P_IW_P2P_IOCTL_INVITATION_STRUCT)extra;
2819 if (prGlueInfo == NULL) {
2825 prAdapter = prGlueInfo->prAdapter;
2827 if (prAdapter == NULL) {
2833 if (prIoctlInvitation->ucReinvoke == 1) {
2834 // TODO: Set Group ID
2835 p2pFuncSetGroupID(prAdapter, prIoctlInvitation->aucGroupID, prIoctlInvitation->aucSsid, prIoctlInvitation->u4SsidLen);
2839 P_MSG_P2P_INVITATION_REQUEST_T prMsgP2PInvitationReq = (P_MSG_P2P_INVITATION_REQUEST_T)NULL;
2841 // TODO: Do Invitation.
2842 prMsgP2PInvitationReq = (P_MSG_P2P_INVITATION_REQUEST_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_INVITATION_REQUEST_T));
2843 if (!prMsgP2PInvitationReq) {
2844 ASSERT(0); // Can't trigger P2P FSM
2849 /* 1.2 fill message */
2850 kalMemCopy(prMsgP2PInvitationReq->aucDeviceID, prIoctlInvitation->aucDeviceID, MAC_ADDR_LEN);
2852 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_invitation_request: P2P Invitation Req\n"));
2854 /* 1.3 send message */
2855 mboxSendMsg(prAdapter,
2857 (P_MSG_HDR_T)prMsgP2PInvitationReq,
2858 MSG_SEND_METHOD_BUF);
2870 /* mtk_p2p_wext_invitation_request */
2873 /*----------------------------------------------------------------------------*/
2875 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
2877 * \param[in] prDev Net device requested.
2878 * \param[inout] wrqu Pointer to iwreq_data
2880 * \retval 0 Success.
2881 * \retval -EFAULT Setting parameters to driver fail.
2882 * \retval -EOPNOTSUPP Setting parameters not support.
2886 /*----------------------------------------------------------------------------*/
2888 mtk_p2p_wext_invitation_abort (
2889 IN struct net_device *prDev,
2890 IN struct iw_request_info *info,
2891 IN OUT union iwreq_data *wrqu,
2897 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
2898 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
2899 struct iw_point *prData = (struct iw_point*)&wrqu->data;
2900 P_IW_P2P_IOCTL_ABORT_INVITATION prIoctlInvitationAbort = (P_IW_P2P_IOCTL_ABORT_INVITATION)NULL;
2902 UINT_8 bssid[MAC_ADDR_LEN];
2905 if ((prDev == NULL) || (extra == NULL)) {
2912 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
2913 prIoctlInvitationAbort = (P_IW_P2P_IOCTL_ABORT_INVITATION)extra;
2915 if (prGlueInfo == NULL) {
2921 prAdapter = prGlueInfo->prAdapter;
2923 if (prAdapter == NULL) {
2928 P_MSG_P2P_INVITATION_REQUEST_T prMsgP2PInvitationAbort = (P_MSG_P2P_INVITATION_REQUEST_T)NULL;
2930 prMsgP2PInvitationAbort = (P_MSG_P2P_INVITATION_REQUEST_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_INVITATION_REQUEST_T));
2932 if (!prMsgP2PInvitationAbort) {
2933 ASSERT(0); // Can't trigger P2P FSM
2939 /* 1.2 fill message */
2940 kalMemCopy(prMsgP2PInvitationAbort->aucDeviceID, prIoctlInvitationAbort->dev_addr, MAC_ADDR_LEN);
2942 DBGLOG(P2P, TRACE, ("mtk_p2p_wext_invitation_request: P2P Invitation Req\n"));
2944 /* 1.3 send message */
2945 mboxSendMsg(prAdapter,
2947 (P_MSG_HDR_T)prMsgP2PInvitationAbort,
2948 MSG_SEND_METHOD_BUF);
2959 /* mtk_p2p_wext_invitation_abort */
2963 /*----------------------------------------------------------------------------*/
2965 * \brief To override p2p interface address
2967 * \param[in] prDev Net device requested.
2968 * \param[in] addr Pointer to address
2970 * \retval 0 For success.
2971 * \retval -E2BIG For user's buffer size is too small.
2972 * \retval -EFAULT For fail.
2975 /*----------------------------------------------------------------------------*/
2978 IN struct net_device *prDev,
2982 P_ADAPTER_T prAdapter = NULL;
2983 P_GLUE_INFO_T prGlueInfo = NULL;
2987 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
2990 prAdapter = prGlueInfo->prAdapter;
2994 return eth_mac_addr(prDev, addr);
3003 /*----------------------------------------------------------------------------*/
3005 * \brief To set encryption cipher suite
3007 * \param[in] prDev Net device requested.
3010 * \retval 0 Success.
3011 * \retval -EINVAL Invalid parameter
3012 * \retval -EOPNOTSUPP Key size not supported.
3016 /*----------------------------------------------------------------------------*/
3018 mtk_p2p_wext_set_auth (
3019 IN struct net_device *prDev,
3020 IN struct iw_request_info *info,
3021 IN OUT union iwreq_data *wrqu,
3025 P_GLUE_INFO_T prGlueInfo = NULL;
3026 struct iw_param *prAuth = (struct iw_param *)wrqu;
3030 if (FALSE == GLUE_CHK_PR2(prDev, prAuth)) {
3034 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3036 /* Save information to glue info and process later when ssid is set. */
3037 switch(prAuth->flags & IW_AUTH_INDEX) {
3038 case IW_AUTH_WPA_VERSION:
3040 case IW_AUTH_CIPHER_PAIRWISE:
3041 prGlueInfo->prP2PInfo->u4CipherPairwise = prAuth->value;
3043 case IW_AUTH_CIPHER_GROUP:
3044 case IW_AUTH_KEY_MGMT:
3045 case IW_AUTH_TKIP_COUNTERMEASURES:
3046 case IW_AUTH_DROP_UNENCRYPTED:
3047 case IW_AUTH_80211_AUTH_ALG:
3048 case IW_AUTH_WPA_ENABLED:
3049 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
3050 case IW_AUTH_ROAMING_CONTROL:
3051 case IW_AUTH_PRIVACY_INVOKED:
3058 } /* end of mtk_p2p_wext_set_auth() */
3061 /*----------------------------------------------------------------------------*/
3063 * \brief To set encryption cipher and key.
3065 * \param[in] prDev Net device requested.
3066 * \param[out] prIfReq Pointer to ifreq structure, content is copied back to
3067 * user space buffer in gl_iwpriv_table.
3069 * \retval 0 Success.
3070 * \retval -EFAULT Setting parameters to driver fail.
3071 * \retval -EOPNOTSUPP Key size not supported.
3073 * \note Securiry information is stored in pEnc.
3075 /*----------------------------------------------------------------------------*/
3077 mtk_p2p_wext_set_key(
3078 IN struct net_device *prDev,
3079 IN struct iw_request_info *info,
3080 IN OUT union iwreq_data *wrqu,
3085 struct iw_encode_ext *prIWEncExt;
3086 struct iw_point *prEnc;
3087 char *prExtraBuf = NULL;
3088 UINT_32 u4ExtraSize = 0;
3089 UINT_8 keyStructBuf[100];
3090 P_PARAM_REMOVE_KEY_T prRemoveKey = (P_PARAM_REMOVE_KEY_T) keyStructBuf;
3091 P_PARAM_KEY_T prKey = (P_PARAM_KEY_T) keyStructBuf;
3092 P_GLUE_INFO_T prGlueInfo;
3093 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3094 UINT_32 u4BufLen = 0;
3096 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3099 if (wrqu->encoding.pointer) {
3100 u4ExtraSize = wrqu->encoding.length;
3101 prExtraBuf = kalMemAlloc(u4ExtraSize, VIR_MEM_TYPE);
3108 if (copy_from_user(prExtraBuf,
3109 wrqu->encoding.pointer,
3110 wrqu->encoding.length)) {
3115 else if (wrqu->encoding.length != 0) {
3120 prEnc = &wrqu->encoding;
3121 prIWEncExt = (struct iw_encode_ext *) prExtraBuf;
3123 if (GLUE_CHK_PR3(prDev, prEnc, prExtraBuf) == TRUE) {
3124 memset(keyStructBuf, 0, sizeof(keyStructBuf));
3126 if ((prEnc->flags & IW_ENCODE_MODE) == IW_ENCODE_DISABLED) { // Key Removal
3127 prRemoveKey->u4Length = sizeof(*prRemoveKey);
3128 memcpy(prRemoveKey->arBSSID, prIWEncExt->addr.sa_data, 6);
3130 rStatus = kalIoctl(prGlueInfo,
3131 wlanoidSetRemoveP2PKey,
3133 prRemoveKey->u4Length,
3140 if(rStatus != WLAN_STATUS_SUCCESS)
3144 if(prIWEncExt->alg == IW_ENCODE_ALG_CCMP) {
3146 prKey->u4KeyIndex = (prEnc->flags & IW_ENCODE_INDEX) ?
3147 ((prEnc->flags & IW_ENCODE_INDEX) - 1) : 0;
3148 if (prKey->u4KeyIndex <= 3) {
3149 /* bit(31) and bit(30) are shared by pKey and pRemoveKey */
3151 if (prIWEncExt->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
3152 prKey->u4KeyIndex |= 0x1UL << 31;
3155 /* Pairwise Key Bit(30) */
3156 if (prIWEncExt->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
3161 prKey->u4KeyIndex |= 0x1UL << 30;
3165 if (prIWEncExt->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
3166 prKey->u4KeyIndex |= 0x1UL << 29;
3167 memcpy(&prKey->rKeyRSC, prIWEncExt->rx_seq, IW_ENCODE_SEQ_MAX_SIZE);
3171 memcpy(prKey->arBSSID, prIWEncExt->addr.sa_data, 6);
3172 memcpy(prKey->aucKeyMaterial, prIWEncExt->key, prIWEncExt->key_len);
3174 prKey->u4KeyLength = prIWEncExt->key_len;
3175 prKey->u4Length = ((UINT_32)&(((P_PARAM_KEY_T)0)->aucKeyMaterial)) + prKey->u4KeyLength;
3177 rStatus = kalIoctl(prGlueInfo,
3178 wlanoidSetAddP2PKey,
3187 if (rStatus != WLAN_STATUS_SUCCESS) {
3206 kalMemFree(prExtraBuf, VIR_MEM_TYPE, u4ExtraSize);
3211 } /* end of mtk_p2p_wext_set_key() */
3216 /*----------------------------------------------------------------------------*/
3218 * \brief set the p2p gc power mode
3220 * \param[in] prDev Net device requested.
3221 * \param[inout] wrqu Pointer to iwreq_data
3223 * \retval 0 Success.
3224 * \retval -EFAULT Setting parameters to driver fail.
3225 * \retval -EOPNOTSUPP Key size not supported.
3229 /*----------------------------------------------------------------------------*/
3231 mtk_p2p_wext_set_powermode(
3232 IN struct net_device *prNetDev,
3233 IN struct iw_request_info *info,
3234 IN OUT union iwreq_data *wrqu,
3238 //printk("set_powermode = %d, value = %d\n", wrqu->power.disabled, wrqu->power.value);
3239 struct iw_param *prPower = (struct iw_param*)&wrqu->power;
3241 PARAM_POWER_MODE ePowerMode;
3242 INT_32 i4PowerValue;
3244 P_GLUE_INFO_T prGlueInfo = NULL;
3245 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3246 UINT_32 u4BufLen = 0;
3250 if (FALSE == GLUE_CHK_PR2(prNetDev, prPower)) {
3253 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
3255 //printk(KERN_INFO "wext_set_power value(%d) disabled(%d) flag(0x%x)\n",
3256 // prPower->value, prPower->disabled, prPower->flags);
3258 if(prPower->disabled){
3259 ePowerMode = Param_PowerModeCAM;
3262 i4PowerValue = prPower->value;
3263 #if WIRELESS_EXT < 21
3264 i4PowerValue /= 1000000;
3266 if (i4PowerValue == 0) {
3267 ePowerMode = Param_PowerModeCAM;
3268 } else if (i4PowerValue == 1) {
3269 ePowerMode = Param_PowerModeMAX_PSP;
3270 } else if (i4PowerValue == 2) {
3271 ePowerMode = Param_PowerModeFast_PSP;
3274 printk(KERN_DEBUG "%s(): unsupported power management mode value = %d.\n",
3283 rStatus = kalIoctl(prGlueInfo,
3284 wlanoidSetP2pPowerSaveProfile,
3293 if (rStatus != WLAN_STATUS_SUCCESS) {
3294 //printk(KERN_INFO DRV_NAME"wlanoidSet802dot11PowerSaveProfile fail 0x%lx\n", rStatus);
3304 /*----------------------------------------------------------------------------*/
3306 * \brief get the p2p gc power mode
3308 * \param[in] prDev Net device requested.
3309 * \param[inout] wrqu Pointer to iwreq_data
3311 * \retval 0 Success.
3312 * \retval -EFAULT Setting parameters to driver fail.
3313 * \retval -EOPNOTSUPP Key size not supported.
3317 /*----------------------------------------------------------------------------*/
3319 mtk_p2p_wext_get_powermode(
3320 IN struct net_device *prNetDev,
3321 IN struct iw_request_info *info,
3322 IN OUT union iwreq_data *wrqu,
3326 //printk("mtk_p2p_wext_get_powermode\n");
3327 //wrqu->power.disabled = 0;
3328 //wrqu->power.value = 1;
3330 struct iw_param *prPower = (struct iw_param*)&wrqu->power;
3331 PARAM_POWER_MODE ePowerMode;
3333 P_GLUE_INFO_T prGlueInfo = NULL;
3334 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3335 UINT_32 u4BufLen = 0;
3339 if (FALSE == GLUE_CHK_PR2(prNetDev, prPower)) {
3343 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
3348 rStatus = kalIoctl(prGlueInfo,
3349 wlanoidQueryP2pPowerSaveProfile,
3358 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
3359 wlanoidQueryP2pPowerSaveProfile,
3366 prPower->disabled = 1;
3368 if (Param_PowerModeCAM == ePowerMode) {
3370 prPower->disabled = 1;
3372 else if (Param_PowerModeMAX_PSP == ePowerMode ) {
3374 prPower->disabled = 0;
3376 else if (Param_PowerModeFast_PSP == ePowerMode ) {
3378 prPower->disabled = 0;
3381 prPower->flags = IW_POWER_PERIOD | IW_POWER_RELATIVE;
3382 #if WIRELESS_EXT < 21
3383 prPower->value *= 1000000;
3391 /*----------------------------------------------------------------------------*/
3393 * \brief P2P Private I/O Control handler (IOC_P2P_CFG_DEVICE)
3395 * \param[in] prDev Net device requested.
3396 * \param[inout] wrqu Pointer to iwreq_data
3398 * \retval 0 Success.
3399 * \retval -EFAULT Setting parameters to driver fail.
3400 * \retval -EOPNOTSUPP Key size not supported.
3404 /*----------------------------------------------------------------------------*/
3406 mtk_p2p_wext_set_local_dev_info(
3407 IN struct net_device *prDev,
3408 IN struct iw_request_info *info,
3409 IN OUT union iwreq_data *wrqu,
3413 P_ADAPTER_T prAdapter = NULL;
3414 P_GLUE_INFO_T prGlueInfo = NULL;
3415 P_IW_P2P_CFG_DEVICE_TYPE prDeviceCfg = (P_IW_P2P_CFG_DEVICE_TYPE) extra;
3416 P_P2P_CONNECTION_SETTINGS_T prConnSettings;
3417 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL;
3418 //P_MSG_P2P_FUNCTION_SWITCH_T prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)NULL;
3422 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3425 prAdapter = prGlueInfo->prAdapter;
3428 prConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
3429 prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
3431 // update connection settings for P2P-FSM
3433 if(prDeviceCfg->ssid_len > ELEM_MAX_LEN_SSID) {
3434 prConnSettings->ucSSIDLen = ELEM_MAX_LEN_SSID;
3437 prConnSettings->ucSSIDLen = prDeviceCfg->ssid_len;
3440 if(copy_from_user(prConnSettings->aucSSID, prDeviceCfg->ssid, prConnSettings->ucSSIDLen)) {
3444 // 2. update device type (WPS IE)
3445 kalMemCopy(&(prConnSettings->rPrimaryDevTypeBE), &(prDeviceCfg->pri_device_type), sizeof(DEVICE_TYPE_T));
3446 #if P2P_MAX_SUPPORTED_SEC_DEV_TYPE_COUNT
3447 kalMemCopy(&(prConnSettings->arSecondaryDevTypeBE[0]), &(prDeviceCfg->snd_device_type), sizeof(DEVICE_TYPE_T));
3450 // 3. update device name
3451 if(prDeviceCfg->device_name_len > WPS_ATTRI_MAX_LEN_DEVICE_NAME) {
3452 prConnSettings->ucDevNameLen = WPS_ATTRI_MAX_LEN_DEVICE_NAME;
3455 prConnSettings->ucDevNameLen = prDeviceCfg->device_name_len;
3457 if(copy_from_user(prConnSettings->aucDevName, prDeviceCfg->device_name, prConnSettings->ucDevNameLen)) {
3461 // 4. update GO intent
3462 prConnSettings->ucGoIntent = prDeviceCfg->intend;
3465 /* Preferred channel bandwidth */
3466 prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode =
3467 prDeviceCfg->ch_width ? CONFIG_BW_20_40M : CONFIG_BW_20M;
3468 prAdapter->rWifiVar.rConnSettings.uc5GBandwidthMode =
3469 prDeviceCfg->ch_width ? CONFIG_BW_20_40M : CONFIG_BW_20M;
3472 /* 1. switch P2P-FSM on */
3473 /* 1.1 allocate for message */
3474 prFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T) cnmMemAlloc(prAdapter,
3476 sizeof(MSG_P2P_FUNCTION_SWITCH_T));
3478 if (!prFuncSwitch) {
3479 ASSERT(0); // Can't trigger P2P FSM
3483 /* 1.2 fill message */
3484 prFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
3485 prFuncSwitch->fgIsFuncOn = TRUE;
3487 /* 1.3 send message */
3488 mboxSendMsg(prAdapter,
3490 (P_MSG_HDR_T) prFuncSwitch,
3491 MSG_SEND_METHOD_BUF);
3494 } /* end of mtk_p2p_wext_set_local_dev_info() */
3501 /*----------------------------------------------------------------------------*/
3503 * \brief I/O Control handler for both
3504 * IOC_P2P_START_STOP_DISCOVERY & SIOCGIWSCAN
3506 * \param[in] prDev Net device requested.
3507 * \param[inout] wrqu Pointer to iwreq_data
3509 * \retval 0 Success.
3510 * \retval -EFAULT Setting parameters to driver fail.
3511 * \retval -EOPNOTSUPP Key size not supported.
3515 /*----------------------------------------------------------------------------*/
3517 mtk_p2p_wext_discovery_results(
3518 IN struct net_device *prDev,
3519 IN struct iw_request_info *info,
3520 IN OUT union iwreq_data *wrqu,
3524 struct iw_event iwe;
3525 char *current_ev = extra;
3527 P_GLUE_INFO_T prGlueInfo = NULL;
3528 P_ADAPTER_T prAdapter = NULL;
3529 P_P2P_INFO_T prP2PInfo = (P_P2P_INFO_T)NULL;
3530 P_EVENT_P2P_DEV_DISCOVER_RESULT_T prTargetResult = (P_EVENT_P2P_DEV_DISCOVER_RESULT_T)NULL;
3531 P_PARAM_VARIABLE_IE_T prDesiredIE = NULL;
3535 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3538 prAdapter = prGlueInfo->prAdapter;
3541 prP2PInfo = prAdapter->prP2pInfo;
3543 for(i = 0 ; i < prP2PInfo->u4DeviceNum ; i++) {
3544 prTargetResult = &prP2PInfo->arP2pDiscoverResult[i];
3547 iwe.cmd = SIOCGIWAP;
3548 iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
3549 memcpy(iwe.u.ap_addr.sa_data,
3550 prTargetResult->aucInterfaceAddr,
3553 current_ev = iwe_stream_add_event(info, current_ev,
3554 extra + IW_SCAN_MAX_DATA,
3555 &iwe, IW_EV_ADDR_LEN);
3559 iwe.cmd = SIOCGIWESSID;
3560 iwe.u.data.flags = 1;
3561 iwe.u.data.length = prTargetResult->u2NameLength;
3563 current_ev = iwe_stream_add_point(info, current_ev,
3564 extra + IW_SCAN_MAX_DATA,
3565 &iwe, prTargetResult->aucName);
3567 /* IWEVGENIE for WPA IE */
3568 if(prTargetResult->u2IELength <= 600 && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf,
3569 prTargetResult->u2IELength,
3571 (PUINT_8 *)&prDesiredIE)) {
3573 iwe.cmd = IWEVGENIE;
3574 iwe.u.data.flags = 1;
3575 iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength;
3577 current_ev = iwe_stream_add_point(info, current_ev,
3578 extra + IW_SCAN_MAX_DATA,
3579 &iwe, (char *)prDesiredIE);
3584 /* IWEVGENIE for WPS IE */
3585 if((prTargetResult->u2IELength <= 600) && wextSrchDesiredWPSIE(prTargetResult->pucIeBuf,
3586 prTargetResult->u2IELength,
3588 (PUINT_8 *)&prDesiredIE)) {
3590 iwe.cmd = IWEVGENIE;
3591 iwe.u.data.flags = 1;
3592 iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength;
3594 current_ev = iwe_stream_add_point(info, current_ev,
3595 extra + IW_SCAN_MAX_DATA,
3596 &iwe, (char *)prDesiredIE);
3601 /* IWEVGENIE for RSN IE */
3602 if((prTargetResult->u2IELength <= 600) && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf,
3603 prTargetResult->u2IELength,
3605 (PUINT_8 *)&prDesiredIE)) {
3607 iwe.cmd = IWEVGENIE;
3608 iwe.u.data.flags = 1;
3609 iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength;
3611 current_ev = iwe_stream_add_point(info, current_ev,
3612 extra + IW_SCAN_MAX_DATA,
3613 &iwe, (char *)prDesiredIE);
3616 /* IOC_P2P_GO_WSC_IE */
3618 /* device capability */
3622 iwe.cmd = IWEVCUSTOM;
3623 iwe.u.data.flags = 0;
3624 iwe.u.data.length = 8 + sizeof("p2p_cap=");
3626 snprintf(data, iwe.u.data.length, "p2p_cap=%02x%02x%02x%02x%c",
3627 prTargetResult->ucDeviceCapabilityBitmap, prTargetResult->ucGroupCapabilityBitmap,
3628 (UINT_8)prTargetResult->u2ConfigMethod, (UINT_8)(prTargetResult->u2ConfigMethod >> 8), '\0' );
3629 current_ev = iwe_stream_add_point(info, current_ev,
3630 extra + IW_SCAN_MAX_DATA,
3631 &iwe, (char *)data);
3633 //printk("%s\n", data);
3634 kalMemZero(data, 40);
3636 iwe.cmd = IWEVCUSTOM;
3637 iwe.u.data.flags = 0;
3638 iwe.u.data.length = 12 + sizeof("p2p_dev_type=");
3640 snprintf(data, iwe.u.data.length, "p2p_dev_type=%02x%02x%02x%02x%02x%02x%c",
3641 (UINT_8)prTargetResult->rPriDevType.u2CategoryID,(UINT_8)prTargetResult->rPriDevType.u2SubCategoryID,
3642 (UINT_8)prTargetResult->arSecDevType[0].u2CategoryID,(UINT_8)prTargetResult->arSecDevType[0].u2SubCategoryID,
3643 (UINT_8)prTargetResult->arSecDevType[1].u2CategoryID,(UINT_8)prTargetResult->arSecDevType[1].u2SubCategoryID,
3645 current_ev = iwe_stream_add_point(info, current_ev,
3646 extra + IW_SCAN_MAX_DATA,
3647 &iwe, (char *)data);
3648 //printk("%s\n", data);
3650 kalMemZero(data, 40);
3652 iwe.cmd = IWEVCUSTOM;
3653 iwe.u.data.flags = 0;
3654 iwe.u.data.length = 17 + sizeof("p2p_grp_bssid=");
3656 snprintf(data, iwe.u.data.length, "p2p_grp_bssid="MACSTR"%c",
3657 MAC2STR(prTargetResult->aucBSSID), '\0');
3658 current_ev = iwe_stream_add_point(info, current_ev,
3659 extra + IW_SCAN_MAX_DATA,
3660 &iwe, (char *)data);
3661 //printk("%s\n", data);
3667 /* Length of data */
3668 wrqu->data.length = (current_ev - extra);
3669 wrqu->data.flags = 0;
3672 } /* end of mtk_p2p_wext_discovery_results() */
3675 /*----------------------------------------------------------------------------*/
3677 * \brief P2P Private I/O Control handler (IOC_P2P_WSC_BEACON_PROBE_RSP_IE)
3679 * \param[in] prDev Net device requested.
3680 * \param[inout] wrqu Pointer to iwreq_data
3682 * \retval 0 Success.
3683 * \retval -EFAULT Setting parameters to driver fail.
3684 * \retval -EOPNOTSUPP Key size not supported.
3688 /*----------------------------------------------------------------------------*/
3690 mtk_p2p_wext_wsc_ie(
3691 IN struct net_device *prDev,
3692 IN struct iw_request_info *info,
3693 IN OUT union iwreq_data *wrqu,
3697 P_ADAPTER_T prAdapter = NULL;
3698 P_GLUE_INFO_T prGlueInfo = NULL;
3699 P_IW_P2P_HOSTAPD_PARAM prHostapdParam = (P_IW_P2P_HOSTAPD_PARAM)extra;
3703 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
3706 if (prHostapdParam->len > 0) {
3707 if (prHostapdParam->len <= MAX_WSC_IE_LENGTH) {
3708 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[0], prHostapdParam->data, prHostapdParam->len)) {
3711 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prHostapdParam->data, prHostapdParam->len)) {
3720 prGlueInfo->prP2PInfo->u2WSCIELen[0] = prHostapdParam->len;
3721 prGlueInfo->prP2PInfo->u2WSCIELen[2] = prHostapdParam->len;
3723 prAdapter = prGlueInfo->prAdapter;
3726 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX);
3728 //@TODO: send message to P2P-FSM
3731 } /* end of mtk_p2p_wext_wsc_ie() */
3734 /*----------------------------------------------------------------------------*/
3736 * \brief P2P Private I/O Control handler (IOC_P2P_CONNECT_DISCONNECT)
3738 * \param[in] prDev Net device requested.
3739 * \param[inout] wrqu Pointer to iwreq_data
3741 * \retval 0 Success.
3742 * \retval -EFAULT Setting parameters to driver fail.
3743 * \retval -EOPNOTSUPP Key size not supported.
3747 /*----------------------------------------------------------------------------*/
3749 mtk_p2p_wext_connect_disconnect(
3750 IN struct net_device *prDev,
3751 IN struct iw_request_info *info,
3752 IN OUT union iwreq_data *wrqu,
3756 P_ADAPTER_T prAdapter = NULL;
3757 P_GLUE_INFO_T prGlueInfo = NULL;
3758 struct iw_point *prData= (struct iw_point *)&wrqu->data;
3759 // P_IW_P2P_CONNECT_DEVICE prConnectDevice = (P_IW_P2P_CONNECT_DEVICE)extra;
3760 // P_MSG_HDR_T prMsgHdr;
3761 // P_MSG_P2P_CONNECTION_REQUEST_T prMsgP2PConnReq;
3762 // P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt;
3763 // UINT_8 aucBCAddr[] = BC_MAC_ADDR;
3767 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3770 prAdapter = prGlueInfo->prAdapter;
3773 if (prData->flags == P2P_CONNECT) {
3775 // indicate P2P-FSM with MID_MNY_P2P_CONNECTION_REQ
3776 prMsgP2PConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T) cnmMemAlloc(prAdapter,
3778 sizeof(MSG_P2P_CONNECTION_REQUEST_T));
3780 if (!prMsgP2PConnReq) {
3781 ASSERT(0); // Can't trigger P2P FSM
3786 mboxSendMsg(prAdapter,
3788 (P_MSG_HDR_T) prMsgP2PConnReq,
3789 MSG_SEND_METHOD_BUF);
3792 else if(prData->flags == P2P_DISCONNECT) {
3794 // indicate P2P-FSM with MID_MNY_P2P_CONNECTION_ABORT
3795 prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter,
3797 sizeof(MSG_P2P_CONNECTION_ABORT_T));
3799 if (!prMsgP2PConnAbt) {
3800 ASSERT(0); // Can't trigger P2P FSM
3804 COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prConnectDevice->sta_addr);
3806 prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT;
3808 mboxSendMsg(prAdapter,
3810 (P_MSG_HDR_T) prMsgP2PConnAbt,
3811 MSG_SEND_METHOD_BUF);
3819 } /* end of mtk_p2p_wext_connect_disconnect() */
3822 /*----------------------------------------------------------------------------*/
3824 * \brief P2P Private I/O Control handler (IOC_P2P_PASSWORD_READY)
3826 * \param[in] prDev Net device requested.
3827 * \param[inout] wrqu Pointer to iwreq_data
3829 * \retval 0 Success.
3830 * \retval -EFAULT Setting parameters to driver fail.
3831 * \retval -EOPNOTSUPP Key size not supported.
3835 /*----------------------------------------------------------------------------*/
3837 mtk_p2p_wext_password_ready(
3838 IN struct net_device *prDev,
3839 IN struct iw_request_info *info,
3840 IN OUT union iwreq_data *wrqu,
3844 P_ADAPTER_T prAdapter = NULL;
3845 P_GLUE_INFO_T prGlueInfo = NULL;
3846 P_IW_P2P_PASSWORD_READY prPasswordReady = (P_IW_P2P_PASSWORD_READY)extra;
3847 P_P2P_CONNECTION_SETTINGS_T prConnSettings;
3851 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
3854 prAdapter = prGlueInfo->prAdapter;
3857 prConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
3859 /* retrieve IE for Probe Request */
3860 if (prPasswordReady->probe_req_len > 0) {
3861 if (prPasswordReady->probe_req_len <= MAX_WSC_IE_LENGTH) {
3862 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[1], prPasswordReady->probe_req_ie, prPasswordReady->probe_req_len)) {
3871 prGlueInfo->prP2PInfo->u2WSCIELen[1] = prPasswordReady->probe_req_len;
3873 /* retrieve IE for Probe Response */
3874 if (prPasswordReady->probe_rsp_len > 0) {
3875 if (prPasswordReady->probe_rsp_len <= MAX_WSC_IE_LENGTH) {
3876 if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prPasswordReady->probe_rsp_ie, prPasswordReady->probe_rsp_len)) {
3885 prGlueInfo->prP2PInfo->u2WSCIELen[2] = prPasswordReady->probe_rsp_len;
3887 switch (prPasswordReady->active_config_method) {
3889 prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_PUSH_BUTTON;
3892 prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_KEYPAD;
3895 prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_DISPLAY;
3901 prConnSettings->fgIsPasswordIDRdy = TRUE;
3903 } /* end of mtk_p2p_wext_password_ready() */
3906 /*----------------------------------------------------------------------------*/
3908 * \brief P2P Private I/O Control handler (IOC_P2P_GET_REQ_DEVICE_INFO)
3910 * \param[in] prDev Net device requested.
3911 * \param[inout] wrqu Pointer to iwreq_data
3913 * \retval 0 Success.
3914 * \retval -EFAULT Setting parameters to driver fail.
3915 * \retval -EOPNOTSUPP Key size not supported.
3919 /*----------------------------------------------------------------------------*/
3921 mtk_p2p_wext_request_dev_info(
3922 IN struct net_device *prDev,
3923 IN struct iw_request_info *info,
3924 IN OUT union iwreq_data *wrqu,
3928 P_ADAPTER_T prAdapter = NULL;
3929 P_GLUE_INFO_T prGlueInfo = NULL;
3930 P_IW_P2P_DEVICE_REQ prDeviceReq = (P_IW_P2P_DEVICE_REQ)extra;
3934 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3937 prAdapter = prGlueInfo->prAdapter;
3940 // specify data length
3941 wrqu->data.length = sizeof(IW_P2P_DEVICE_REQ);
3943 // copy to upper-layer supplied buffer
3944 kalMemCopy(prDeviceReq->name, prGlueInfo->prP2PInfo->aucConnReqDevName, prGlueInfo->prP2PInfo->u4ConnReqNameLength);
3945 prDeviceReq->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength;
3946 prDeviceReq->name[prDeviceReq->name_len]='\0';
3947 COPY_MAC_ADDR(prDeviceReq->device_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr);
3948 prDeviceReq->device_type = prGlueInfo->prP2PInfo->ucConnReqDevType;
3949 prDeviceReq->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod;
3950 prDeviceReq->active_config_method = prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod;
3953 } /* end of mtk_p2p_wext_request_dev_info() */
3956 /*----------------------------------------------------------------------------*/
3958 * \brief P2P Private I/O Control handler (IOC_P2P_GET_STRUCT)
3960 * \param[in] prDev Net device requested.
3961 * \param[inout] wrqu Pointer to iwreq_data
3963 * \retval 0 Success.
3964 * \retval -EFAULT Setting parameters to driver fail.
3965 * \retval -EOPNOTSUPP Key size not supported.
3969 /*----------------------------------------------------------------------------*/
3971 mtk_p2p_wext_invitation_indicate(
3972 IN struct net_device *prDev,
3973 IN struct iw_request_info *info,
3974 IN OUT union iwreq_data *wrqu,
3978 P_ADAPTER_T prAdapter = NULL;
3979 P_GLUE_INFO_T prGlueInfo = NULL;
3980 P_IW_P2P_IOCTL_INVITATION_INDICATE prInvIndicate = (P_IW_P2P_IOCTL_INVITATION_INDICATE)extra;
3984 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
3987 prAdapter = prGlueInfo->prAdapter;
3990 // specify data length
3991 wrqu->data.length = sizeof(IW_P2P_IOCTL_INVITATION_INDICATE);
3993 // copy to upper-layer supplied buffer
3994 kalMemCopy(prInvIndicate->dev_name, prGlueInfo->prP2PInfo->aucConnReqDevName, prGlueInfo->prP2PInfo->u4ConnReqNameLength);
3995 kalMemCopy(prInvIndicate->group_bssid, prGlueInfo->prP2PInfo->rConnReqGroupAddr, MAC_ADDR_LEN);
3996 prInvIndicate->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength;
3997 prInvIndicate->dev_name[prInvIndicate->name_len]='\0';
3998 COPY_MAC_ADDR(prInvIndicate->dev_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr);
3999 prInvIndicate->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod;
4000 prInvIndicate->operating_channel = prGlueInfo->prP2PInfo->ucOperatingChnl;
4001 prInvIndicate->invitation_type = prGlueInfo->prP2PInfo->ucInvitationType;
4004 } /* end of mtk_p2p_wext_invitation_indicate() */
4007 /*----------------------------------------------------------------------------*/
4009 * \brief P2P Private I/O Control handler (IOC_P2P_GET_STRUCT)
4011 * \param[in] prDev Net device requested.
4012 * \param[inout] wrqu Pointer to iwreq_data
4014 * \retval 0 Success.
4015 * \retval -EFAULT Setting parameters to driver fail.
4016 * \retval -EOPNOTSUPP Key size not supported.
4020 /*----------------------------------------------------------------------------*/
4022 mtk_p2p_wext_invitation_status(
4023 IN struct net_device *prDev,
4024 IN struct iw_request_info *info,
4025 IN OUT union iwreq_data *wrqu,
4029 P_ADAPTER_T prAdapter = NULL;
4030 P_GLUE_INFO_T prGlueInfo = NULL;
4031 P_IW_P2P_IOCTL_INVITATION_STATUS prInvStatus = (P_IW_P2P_IOCTL_INVITATION_STATUS)extra;
4035 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4038 prAdapter = prGlueInfo->prAdapter;
4041 // specify data length
4042 wrqu->data.length = sizeof(IW_P2P_IOCTL_INVITATION_STATUS);
4044 // copy to upper-layer supplied buffer
4045 prInvStatus->status_code = prGlueInfo->prP2PInfo->u4InvStatus;
4048 } /* end of mtk_p2p_wext_invitation_status() */
4051 /*----------------------------------------------------------------------------*/
4053 * \brief indicate an event to supplicant for device found
4055 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
4057 * \retval TRUE Success.
4058 * \retval FALSE Failure
4060 /*----------------------------------------------------------------------------*/
4062 kalP2PIndicateFound(
4063 IN P_GLUE_INFO_T prGlueInfo
4066 union iwreq_data evt;
4067 UINT_8 aucBuffer[IW_CUSTOM_MAX];
4071 memset(&evt, 0, sizeof(evt));
4073 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_DVC_FND");
4074 evt.data.length = strlen(aucBuffer);
4076 /* indicate IWEVP2PDVCFND event */
4077 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
4083 } /* end of kalP2PIndicateFound() */
4086 mtk_p2p_wext_set_network_address (
4087 IN struct net_device *prDev,
4088 IN struct iw_request_info *info,
4089 IN OUT union iwreq_data *wrqu,
4093 P_ADAPTER_T prAdapter = NULL;
4094 P_GLUE_INFO_T prGlueInfo = NULL;
4098 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4101 prAdapter = prGlueInfo->prAdapter;
4104 //@TODO: invoke wlan_p2p functions
4106 rStatus = kalIoctl(prGlueInfo,
4107 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetP2pNetworkAddress,
4121 mtk_p2p_wext_set_ps_profile (
4122 IN struct net_device *prDev,
4123 IN struct iw_request_info *info,
4124 IN OUT union iwreq_data *wrqu,
4128 P_ADAPTER_T prAdapter = NULL;
4129 P_GLUE_INFO_T prGlueInfo = NULL;
4133 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4136 prAdapter = prGlueInfo->prAdapter;
4139 //@TODO: invoke wlan_p2p functions
4141 rStatus = kalIoctl(prGlueInfo,
4142 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetP2pPowerSaveProfile,
4156 mtk_p2p_wext_set_pm_param (
4157 IN struct net_device *prDev,
4158 IN struct iw_request_info *info,
4159 IN OUT union iwreq_data *wrqu,
4163 P_ADAPTER_T prAdapter = NULL;
4164 P_GLUE_INFO_T prGlueInfo = NULL;
4168 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4171 prAdapter = prGlueInfo->prAdapter;
4174 //@TODO: invoke wlan_p2p functions
4176 rStatus = kalIoctl(prGlueInfo,
4177 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetP2pPowerSaveProfile,
4192 /*----------------------------------------------------------------------------*/
4194 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
4196 * \param[in] prDev Net device requested.
4197 * \param[inout] wrqu Pointer to iwreq_data
4199 * \retval 0 Success.
4200 * \retval -EFAULT Setting parameters to driver fail.
4201 * \retval -EOPNOTSUPP Setting parameters not support.
4205 /*----------------------------------------------------------------------------*/
4207 mtk_p2p_wext_start_formation (
4208 IN struct net_device *prDev,
4209 IN struct iw_request_info *info,
4210 IN OUT union iwreq_data *wrqu,
4215 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
4216 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
4217 // struct iw_point *prData = (struct iw_point*)&wrqu->data;
4218 P_IW_P2P_IOCTL_START_FORMATION prIoctlStartFormation = (P_IW_P2P_IOCTL_START_FORMATION)NULL;
4221 if ((prDev == NULL) || (extra == NULL)) {
4228 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
4229 prIoctlStartFormation = (P_IW_P2P_IOCTL_START_FORMATION)extra;
4231 if (prGlueInfo == NULL) {
4237 prAdapter = prGlueInfo->prAdapter;
4239 if (prAdapter == NULL) {
4250 /* mtk_p2p_wext_start_formation */
4253 /*----------------------------------------------------------------------------*/
4255 * \brief P2P Private I/O Control handler (IOC_P2P_SET_INT)
4257 * \param[in] prDev Net device requested.
4258 * \param[inout] wrqu Pointer to iwreq_data
4260 * \retval 0 Success.
4261 * \retval -EFAULT Setting parameters to driver fail.
4262 * \retval -EOPNOTSUPP Setting parameters not support.
4266 /*----------------------------------------------------------------------------*/
4268 mtk_p2p_wext_set_int (
4269 IN struct net_device *prDev,
4270 IN struct iw_request_info *info,
4271 IN OUT union iwreq_data *wrqu,
4276 UINT_32 u4SubCmd = 0;
4277 P_GLUE_INFO_T prGlueInfo = NULL;
4281 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL;
4282 P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T)NULL;
4283 P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T)NULL;
4289 //printk("mtk_p2p_wext_set_int\n");
4290 pu4IntBuf = (PUINT_32) extra;
4292 if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) {
4296 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4299 prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo;
4300 prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings;
4301 prP2pFsmInfo = prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo;
4303 u4SubCmd = (UINT_32) wrqu->mode;
4304 index = pu4IntBuf[1];
4305 value = pu4IntBuf[2];
4307 printk("set parameter, u4SubCmd=%d idx=%d value=%lu\n", (INT_16)u4SubCmd, (INT_16)index, value);
4310 case PRIV_CMD_INT_P2P_SET:
4312 case 0: /* Listen CH */
4314 UINT_8 ucSuggestChnl = 0;
4316 prP2pConnSettings->ucListenChnl = value;
4318 // 20110920 - frog: User configurations are placed in ConnSettings.
4319 if (rlmFuncFindAvailableChannel(prGlueInfo->prAdapter, value, &ucSuggestChnl, TRUE, TRUE)) {
4320 prP2pSpecificBssInfo->ucListenChannel = value;
4323 prP2pSpecificBssInfo->ucListenChannel = ucSuggestChnl;
4329 case 1: /* P2p mode */
4331 case 4: /* Noa duration */
4332 prP2pSpecificBssInfo->rNoaParam.u4NoaDurationMs = value;
4333 // only to apply setting when setting NOA count
4334 //status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam);
4336 case 5: /* Noa interval */
4337 prP2pSpecificBssInfo->rNoaParam.u4NoaIntervalMs = value;
4338 // only to apply setting when setting NOA count
4339 //status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam);
4341 case 6: /* Noa count */
4342 prP2pSpecificBssInfo->rNoaParam.u4NoaCount = value;
4343 status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam);
4345 case 100: /* Oper CH */
4346 // 20110920 - frog: User configurations are placed in ConnSettings.
4347 prP2pConnSettings->ucOperatingChnl = value;
4349 case 101: /* Local config Method, for P2P SDK */
4350 //prP2pConnSettings->u2LocalConfigMethod;
4352 case 102: /* Sigma P2p reset */
4353 kalMemZero(prP2pConnSettings->aucTargetDevAddr, MAC_ADDR_LEN);
4354 //prP2pConnSettings->eConnectionPolicy = ENUM_P2P_CONNECTION_POLICY_AUTO;
4356 case 103: /* WPS MODE */
4357 kalP2PSetWscMode(prGlueInfo, value);
4359 case 104: /* P2p send persence, duration */
4361 case 105: /* P2p send persence, interval */
4363 case 106: /* P2P set sleep */
4365 kalIoctl(prGlueInfo,
4366 wlanoidSetP2pPowerSaveProfile,
4375 case 107: /* P2P set opps, CTWindowl */
4376 prP2pSpecificBssInfo->rOppPsParam.u4CTwindowMs = value;
4377 status = mtk_p2p_wext_set_oppps_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rOppPsParam);
4379 case 108: /* p2p_set_power_save */
4380 kalIoctl(prGlueInfo,
4381 wlanoidSetP2pPowerSaveProfile,
4403 /*----------------------------------------------------------------------------*/
4405 * \brief P2P Private I/O Control handler (IOC_P2P_SET_STRUCT)
4407 * \param[in] prDev Net device requested.
4408 * \param[inout] wrqu Pointer to iwreq_data
4410 * \retval 0 Success.
4411 * \retval -EFAULT Setting parameters to driver fail.
4412 * \retval -EOPNOTSUPP Key size not supported.
4416 /*----------------------------------------------------------------------------*/
4418 mtk_p2p_wext_set_struct (
4419 IN struct net_device *prDev,
4420 IN struct iw_request_info *info,
4421 IN OUT union iwreq_data *wrqu,
4426 UINT_32 u4SubCmd = 0;
4427 P_GLUE_INFO_T prGlueInfo = NULL;
4428 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL;
4433 if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) {
4437 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4440 u4SubCmd = (UINT_32) wrqu->data.flags;
4442 kalMemZero(&prGlueInfo->prP2PInfo->aucOidBuf[0],
4443 sizeof(prGlueInfo->prP2PInfo->aucOidBuf));
4447 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4449 wrqu->data.length)) {
4454 if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) {
4455 printk(KERN_INFO DRV_NAME"extra buffer is valid\n");
4458 printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra);
4461 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4462 switch(prP2PReq->u4CmdId) {
4463 case P2P_CMD_ID_SEND_SD_RESPONSE:
4464 status = mtk_p2p_wext_send_service_discovery_response(prDev, info, wrqu, (char *)prP2PReq);
4467 case P2P_CMD_ID_SEND_SD_REQUEST:
4468 status = mtk_p2p_wext_send_service_discovery_request(prDev, info, wrqu, (char *)prP2PReq);
4471 case P2P_CMD_ID_TERMINATE_SD_PHASE:
4472 status = mtk_p2p_wext_terminate_service_discovery_phase(prDev, info, wrqu, (char *)prP2PReq);
4475 case P2P_CMD_ID_INVITATION:
4476 if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_INVITATION_STRUCT)) {
4477 // status = mtk_p2p_wext_invitation_request(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4481 case P2P_CMD_ID_INVITATION_ABORT:
4482 if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_ABORT_INVITATION)) {
4483 // status = mtk_p2p_wext_invitation_abort(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4487 case P2P_CMD_ID_START_FORMATION:
4488 if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_START_FORMATION)) {
4489 status = mtk_p2p_wext_start_formation(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4493 status = -EOPNOTSUPP;
4497 #if CFG_SUPPORT_ANTI_PIRACY
4498 case PRIV_SEC_CHECK_OID:
4499 if (wrqu->data.length > 256) {
4500 status = -EOPNOTSUPP;
4503 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]),
4505 wrqu->data.length)) {
4510 if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), extra, wrqu->data.length)) {
4511 printk(KERN_INFO DRV_NAME"extra buffer is valid\n");
4514 printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra);
4516 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0]));
4518 switch(prP2PReq->u4CmdId) {
4519 case P2P_CMD_ID_SEC_CHECK:
4520 status = mtk_p2p_wext_set_sec_check_request(prDev, info, wrqu, (char *)prP2PReq);
4523 status = -EOPNOTSUPP;
4527 case PRIV_CMD_P2P_VERSION:
4528 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4530 wrqu->data.length)) {
4535 if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) {
4536 printk(KERN_INFO DRV_NAME"extra buffer is valid\n");
4539 printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra);
4542 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4543 switch (prP2PReq->u4CmdId) {
4544 case P2P_CMD_ID_P2P_VERSION:
4545 status = mtk_p2p_wext_set_p2p_version(prDev, info, wrqu, (char *)prP2PReq);
4548 status = -EOPNOTSUPP;
4553 status = -EOPNOTSUPP;
4561 /*----------------------------------------------------------------------------*/
4563 * \brief P2P Private I/O Control handler (IOC_P2P_GET_STRUCT)
4565 * \param[in] prDev Net device requested.
4566 * \param[inout] wrqu Pointer to iwreq_data
4568 * \retval 0 Success.
4569 * \retval -EFAULT Setting parameters to driver fail.
4570 * \retval -EOPNOTSUPP Key size not supported.
4574 /*----------------------------------------------------------------------------*/
4576 mtk_p2p_wext_get_struct (
4577 IN struct net_device *prDev,
4578 IN struct iw_request_info *info,
4579 IN OUT union iwreq_data *wrqu,
4584 UINT_32 u4SubCmd = 0;
4585 P_GLUE_INFO_T prGlueInfo = NULL;
4586 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL;
4591 if (!prDev || !wrqu) {
4592 printk(KERN_INFO DRV_NAME "%s(): invalid param(0x%p, 0x%p)\n",
4599 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4602 u4SubCmd = (UINT_32) wrqu->data.flags;
4604 kalMemZero(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4605 sizeof(prGlueInfo->prP2PInfo->aucOidBuf));
4609 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4611 sizeof(IW_P2P_TRANSPORT_STRUCT))) {
4612 printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__);
4616 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4618 switch(prP2PReq->u4CmdId) {
4619 case P2P_CMD_ID_GET_SD_REQUEST:
4620 status = mtk_p2p_wext_get_service_discovery_request(prDev, info, wrqu, (char *)prP2PReq);
4623 case P2P_CMD_ID_GET_SD_RESPONSE:
4624 status = mtk_p2p_wext_get_service_discovery_response(prDev, info, wrqu, (char *)prP2PReq);
4627 case P2P_CMD_ID_INVITATION_INDICATE:
4629 status = mtk_p2p_wext_invitation_indicate(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4630 prP2PReq->outBufferLength = wrqu->data.length;
4631 if (copy_to_user(wrqu->data.pointer,
4632 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4633 wrqu->data.length + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4634 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4642 case P2P_CMD_ID_INVITATION_STATUS:
4644 status = mtk_p2p_wext_invitation_status(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer));
4645 prP2PReq->outBufferLength = wrqu->data.length;
4646 if (copy_to_user(wrqu->data.pointer,
4647 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4648 wrqu->data.length + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4649 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4657 case P2P_CMD_ID_GET_CH_LIST:
4660 UINT_8 NumOfChannel = 50;
4661 RF_CHANNEL_INFO_T aucChannelList[50];
4662 UINT_8 ucMaxChannelNum = 50;
4663 PUINT_8 pucChnlList = (PUINT_8)prP2PReq->aucBuffer;
4665 kalGetChnlList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
4666 if (NumOfChannel > 50)
4668 prP2PReq->outBufferLength = NumOfChannel;
4670 for (i=0; i<NumOfChannel; i++) {
4672 // 20120208 frog: modify to avoid clockwork warning.
4673 prP2PReq->aucBuffer[i] = aucChannelList[i].ucChannelNum;
4675 *pucChnlList = aucChannelList[i].ucChannelNum;
4679 if(copy_to_user(wrqu->data.pointer,
4680 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4681 NumOfChannel + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4682 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4691 case P2P_CMD_ID_GET_OP_CH:
4693 prP2PReq->inBufferLength = 4;
4695 status = wlanoidQueryP2pOpChannel(prGlueInfo->prAdapter,
4696 prP2PReq->aucBuffer,
4697 prP2PReq->inBufferLength,
4698 &prP2PReq->outBufferLength);
4700 if (status == 0) { // WLAN_STATUS_SUCCESS
4701 if (copy_to_user(wrqu->data.pointer,
4702 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4703 prP2PReq->outBufferLength + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4704 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4709 if (copy_to_user(wrqu->data.pointer,
4710 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4711 OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4712 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4720 status = -EOPNOTSUPP;
4724 #if CFG_SUPPORT_ANTI_PIRACY
4725 case PRIV_SEC_CHECK_OID:
4726 if (wrqu->data.length > 256) {
4727 status = -EOPNOTSUPP;
4730 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]),
4732 sizeof(IW_P2P_TRANSPORT_STRUCT))) {
4733 printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__);
4737 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0]));
4739 switch(prP2PReq->u4CmdId) {
4740 case P2P_CMD_ID_SEC_CHECK:
4741 status = mtk_p2p_wext_get_sec_check_response(prDev, info, wrqu, (char *)prP2PReq);
4744 status = -EOPNOTSUPP;
4748 case PRIV_CMD_P2P_VERSION:
4749 if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4751 sizeof(IW_P2P_TRANSPORT_STRUCT))) {
4752 printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__);
4756 prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0]));
4758 switch (prP2PReq->u4CmdId) {
4759 case P2P_CMD_ID_P2P_VERSION:
4760 status = mtk_p2p_wext_get_p2p_version(prDev, info, wrqu, (char *)prP2PReq);
4763 status = -EOPNOTSUPP;
4768 /* Copy queried data to user. */
4769 if (status == 0) { // WLAN_STATUS_SUCCESS
4770 if(copy_to_user(wrqu->data.pointer,
4771 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4772 prP2PReq->outBufferLength + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4773 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4779 if(copy_to_user(wrqu->data.pointer,
4780 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4781 OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4782 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4796 /*----------------------------------------------------------------------------*/
4798 * \brief P2P Private I/O Control handler for
4799 * getting service discovery request frame from driver
4801 * \param[in] prDev Net device requested.
4802 * \param[inout] wrqu Pointer to iwreq_data
4804 * \retval 0 Success.
4805 * \retval -EFAULT Setting parameters to driver fail.
4806 * \retval -EOPNOTSUPP Key size not supported.
4810 /*----------------------------------------------------------------------------*/
4812 mtk_p2p_wext_get_service_discovery_request (
4813 IN struct net_device *prDev,
4814 IN struct iw_request_info *info,
4815 IN OUT union iwreq_data *wrqu,
4819 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4820 UINT_32 u4QueryInfoLen;
4821 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4822 P_GLUE_INFO_T prGlueInfo = NULL;
4826 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4829 rStatus = kalIoctl(prGlueInfo,
4830 wlanoidGetP2PSDRequest,
4831 prP2PReq->aucBuffer,
4832 prP2PReq->outBufferLength,
4839 if (rStatus != WLAN_STATUS_SUCCESS) {
4843 prP2PReq->outBufferLength = u4QueryInfoLen;
4845 if(copy_to_user(wrqu->data.pointer,
4846 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4847 u4QueryInfoLen + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4848 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4858 /*----------------------------------------------------------------------------*/
4860 * \brief P2P Private I/O Control handler for
4861 * getting service discovery response frame from driver
4863 * \param[in] prDev Net device requested.
4864 * \param[inout] wrqu Pointer to iwreq_data
4866 * \retval 0 Success.
4867 * \retval -EFAULT Setting parameters to driver fail.
4868 * \retval -EOPNOTSUPP Key size not supported.
4872 /*----------------------------------------------------------------------------*/
4874 mtk_p2p_wext_get_service_discovery_response (
4875 IN struct net_device *prDev,
4876 IN struct iw_request_info *info,
4877 IN OUT union iwreq_data *wrqu,
4881 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4882 UINT_32 u4QueryInfoLen;
4883 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4884 P_GLUE_INFO_T prGlueInfo = NULL;
4888 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4891 rStatus = kalIoctl(prGlueInfo,
4892 wlanoidGetP2PSDResponse,
4893 prP2PReq->aucBuffer,
4894 prP2PReq->outBufferLength,
4901 if (rStatus != WLAN_STATUS_SUCCESS) {
4905 prP2PReq->outBufferLength = u4QueryInfoLen;
4907 if(copy_to_user(wrqu->data.pointer,
4908 &(prGlueInfo->prP2PInfo->aucOidBuf[0]),
4909 u4QueryInfoLen + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
4910 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
4920 /*----------------------------------------------------------------------------*/
4922 * \brief P2P Private I/O Control handler for
4923 * sending service discovery request frame
4925 * \param[in] prDev Net device requested.
4926 * \param[inout] wrqu Pointer to iwreq_data
4928 * \retval 0 Success.
4929 * \retval -EFAULT Setting parameters to driver fail.
4930 * \retval -EOPNOTSUPP Key size not supported.
4934 /*----------------------------------------------------------------------------*/
4936 mtk_p2p_wext_send_service_discovery_request (
4937 IN struct net_device *prDev,
4938 IN struct iw_request_info *info,
4939 IN OUT union iwreq_data *wrqu,
4943 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4944 UINT_32 u4SetInfoLen;
4945 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4946 P_GLUE_INFO_T prGlueInfo = NULL;
4950 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
4953 rStatus = kalIoctl(prGlueInfo,
4954 wlanoidSendP2PSDRequest,
4955 prP2PReq->aucBuffer,
4956 prP2PReq->inBufferLength,
4963 if (rStatus != WLAN_STATUS_SUCCESS) {
4972 /*----------------------------------------------------------------------------*/
4974 * \brief P2P Private I/O Control handler for
4975 * sending service discovery response frame
4977 * \param[in] prDev Net device requested.
4978 * \param[inout] wrqu Pointer to iwreq_data
4980 * \retval 0 Success.
4981 * \retval -EFAULT Setting parameters to driver fail.
4982 * \retval -EOPNOTSUPP Key size not supported.
4986 /*----------------------------------------------------------------------------*/
4988 mtk_p2p_wext_send_service_discovery_response (
4989 IN struct net_device *prDev,
4990 IN struct iw_request_info *info,
4991 IN OUT union iwreq_data *wrqu,
4995 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
4996 UINT_32 u4SetInfoLen;
4997 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
4998 P_GLUE_INFO_T prGlueInfo = NULL;
5002 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5005 rStatus = kalIoctl(prGlueInfo,
5006 wlanoidSendP2PSDResponse,
5007 prP2PReq->aucBuffer,
5008 prP2PReq->inBufferLength,
5015 if (rStatus != WLAN_STATUS_SUCCESS) {
5023 #if CFG_SUPPORT_ANTI_PIRACY
5024 /*----------------------------------------------------------------------------*/
5026 * \brief P2P Private I/O Control handler for
5028 * \param[in] prDev Net device requested.
5029 * \param[inout] wrqu Pointer to iwreq_data
5031 * \retval 0 Success.
5032 * \retval -EFAULT Setting parameters to driver fail.
5033 * \retval -EOPNOTSUPP Key size not supported.
5037 /*----------------------------------------------------------------------------*/
5039 mtk_p2p_wext_set_sec_check_request (
5040 IN struct net_device *prDev,
5041 IN struct iw_request_info *info,
5042 IN OUT union iwreq_data *wrqu,
5046 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5047 UINT_32 u4SetInfoLen;
5048 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5049 P_GLUE_INFO_T prGlueInfo = NULL;
5053 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5056 rStatus = kalIoctl(prGlueInfo,
5057 wlanoidSetSecCheckRequest,
5058 prP2PReq->aucBuffer,
5059 prP2PReq->inBufferLength,
5066 if (rStatus != WLAN_STATUS_SUCCESS) {
5075 /*----------------------------------------------------------------------------*/
5077 * \brief P2P Private I/O Control handler for
5079 * \param[in] prDev Net device requested.
5080 * \param[inout] wrqu Pointer to iwreq_data
5082 * \retval 0 Success.
5083 * \retval -EFAULT Setting parameters to driver fail.
5084 * \retval -EOPNOTSUPP Key size not supported.
5088 /*----------------------------------------------------------------------------*/
5090 mtk_p2p_wext_get_sec_check_response (
5091 IN struct net_device *prDev,
5092 IN struct iw_request_info *info,
5093 IN OUT union iwreq_data *wrqu,
5097 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5098 UINT_32 u4QueryInfoLen;
5099 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5100 P_GLUE_INFO_T prGlueInfo = NULL;
5104 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5107 printk("mtk_p2p_wext_get_sec_check_response\n");
5108 rStatus = kalIoctl(prGlueInfo,
5109 wlanoidGetSecCheckResponse,
5110 prP2PReq->aucBuffer,
5111 prP2PReq->outBufferLength,
5118 if (rStatus != WLAN_STATUS_SUCCESS) {
5122 prP2PReq->outBufferLength = u4QueryInfoLen;
5124 if(copy_to_user(wrqu->data.pointer,
5125 prP2PReq->aucBuffer,
5126 u4QueryInfoLen + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) {
5127 printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__);
5137 /*----------------------------------------------------------------------------*/
5139 * \brief P2P Private I/O Control handler for
5140 * terminating service discovery phase
5142 * \param[in] prDev Net device requested.
5143 * \param[inout] wrqu Pointer to iwreq_data
5145 * \retval 0 Success.
5146 * \retval -EFAULT Setting parameters to driver fail.
5147 * \retval -EOPNOTSUPP Key size not supported.
5151 /*----------------------------------------------------------------------------*/
5153 mtk_p2p_wext_terminate_service_discovery_phase (
5154 IN struct net_device *prDev,
5155 IN struct iw_request_info *info,
5156 IN OUT union iwreq_data *wrqu,
5160 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5161 UINT_32 u4SetInfoLen;
5162 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5163 P_GLUE_INFO_T prGlueInfo = NULL;
5167 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5170 rStatus = kalIoctl(prGlueInfo,
5171 wlanoidSetP2PTerminateSDPhase,
5172 prP2PReq->aucBuffer,
5173 prP2PReq->inBufferLength,
5180 if (rStatus != WLAN_STATUS_SUCCESS) {
5188 /*----------------------------------------------------------------------------*/
5190 * \brief P2P Private I/O Control handler for
5192 * \param[in] prDev Net device requested.
5193 * \param[inout] wrqu Pointer to iwreq_data
5195 * \retval 0 Success.
5196 * \retval -EFAULT Setting parameters to driver fail.
5197 * \retval -EOPNOTSUPP Key size not supported.
5201 /*----------------------------------------------------------------------------*/
5203 mtk_p2p_wext_set_noa_param (
5204 IN struct net_device *prDev,
5205 IN struct iw_request_info *info,
5206 IN OUT union iwreq_data *wrqu,
5210 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5211 UINT_32 u4SetInfoLen;
5212 //P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5213 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T)extra;
5214 P_GLUE_INFO_T prGlueInfo = NULL;
5218 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5221 printk("mtk_p2p_wext_set_noa_param\n");
5223 rStatus = kalIoctl(prGlueInfo,
5225 prNoaParam, //prP2PReq->aucBuffer,
5226 sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T),//prP2PReq->inBufferLength,
5233 if (rStatus != WLAN_STATUS_SUCCESS) {
5241 /*----------------------------------------------------------------------------*/
5243 * \brief P2P Private I/O Control handler for
5245 * \param[in] prDev Net device requested.
5246 * \param[inout] wrqu Pointer to iwreq_data
5248 * \retval 0 Success.
5249 * \retval -EFAULT Setting parameters to driver fail.
5250 * \retval -EOPNOTSUPP Key size not supported.
5254 /*----------------------------------------------------------------------------*/
5256 mtk_p2p_wext_set_oppps_param (
5257 IN struct net_device *prDev,
5258 IN struct iw_request_info *info,
5259 IN OUT union iwreq_data *wrqu,
5263 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5264 UINT_32 u4SetInfoLen;
5265 // P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5266 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)extra;
5267 P_GLUE_INFO_T prGlueInfo = NULL;
5271 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5274 printk("mtk_p2p_wext_set_oppps_param\n");
5276 rStatus = kalIoctl(prGlueInfo,
5277 wlanoidSetOppPsParam,
5278 prOppPsParam, //prP2PReq->aucBuffer,
5279 sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T), //prP2PReq->inBufferLength,
5286 if (rStatus != WLAN_STATUS_SUCCESS) {
5296 mtk_p2p_wext_set_p2p_version (
5297 IN struct net_device *prDev,
5298 IN struct iw_request_info *info,
5299 IN OUT union iwreq_data *wrqu,
5303 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5304 P_GLUE_INFO_T prGlueInfo = NULL;
5305 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5306 UINT_32 u4SetInfoLen;
5310 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5313 rStatus = kalIoctl(prGlueInfo,
5314 wlanoidSetP2pSupplicantVersion,
5315 prP2PReq->aucBuffer,
5316 prP2PReq->inBufferLength,
5323 if (rStatus != WLAN_STATUS_SUCCESS) {
5332 /* mtk_p2p_wext_set_p2p_version */
5335 mtk_p2p_wext_get_p2p_version (
5336 IN struct net_device *prDev,
5337 IN struct iw_request_info *info,
5338 IN OUT union iwreq_data *wrqu,
5342 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5343 UINT_32 u4QueryInfoLen;
5344 P_IW_P2P_TRANSPORT_STRUCT prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT)extra;
5345 P_GLUE_INFO_T prGlueInfo = NULL;
5349 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5352 rStatus = kalIoctl(prGlueInfo,
5353 wlanoidQueryP2pVersion,
5354 prP2PReq->aucBuffer,
5355 prP2PReq->outBufferLength,
5362 if (rStatus != WLAN_STATUS_SUCCESS) {
5370 } /* mtk_p2p_wext_get_p2p_version */
5372 #if CFG_SUPPORT_P2P_RSSI_QUERY
5375 mtk_p2p_wext_get_rssi (
5376 IN struct net_device *prDev,
5377 IN struct iw_request_info *info,
5378 IN OUT union iwreq_data *wrqu,
5382 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5383 UINT_32 u4QueryInfoLen;
5384 struct iw_point *prData= (struct iw_point *)&wrqu->data;
5385 UINT_16 u2BufferSize = 0;
5386 P_GLUE_INFO_T prGlueInfo = NULL;
5388 struct iw_statistics *pStats = NULL;
5392 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev));
5396 rStatus = WLAN_STATUS_FAILURE;
5400 pStats = (struct iw_statistics *) (&(prGlueInfo->rP2pIwStats));
5402 rStatus = kalIoctl(prGlueInfo,
5403 wlanoidQueryP2pRssi,
5412 u2BufferSize = prData->length;
5414 if (u2BufferSize < sizeof(struct iw_statistics)) {
5419 if (copy_to_user(prData->pointer, pStats, sizeof(struct iw_statistics))) {
5420 rStatus = WLAN_STATUS_FAILURE;
5426 if (rStatus != WLAN_STATUS_SUCCESS) {
5433 } /* mtk_p2p_wext_get_rssi */
5435 struct iw_statistics *
5436 mtk_p2p_wext_get_wireless_stats (
5437 struct net_device *prDev
5440 WLAN_STATUS rStatus = WLAN_STATUS_FAILURE;
5441 P_GLUE_INFO_T prGlueInfo = NULL;
5442 struct iw_statistics *pStats = NULL;
5446 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
5452 pStats = (struct iw_statistics *) (&(prGlueInfo->rP2pIwStats));
5454 if (!prDev || !netif_carrier_ok(prDev)) {
5455 /* network not connected */
5459 rStatus = kalIoctl(prGlueInfo,
5460 wlanoidQueryP2pRssi,
5471 } /* mtk_p2p_wext_get_wireless_stats */
5474 #endif /* CFG_SUPPORT_P2P_RSSI_QUERY */
5478 mtk_p2p_wext_set_txpow (
5479 IN struct net_device *prDev,
5480 IN struct iw_request_info *prIwrInfo,
5481 IN OUT union iwreq_data *prTxPow,
5485 P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T)NULL;
5486 P_ADAPTER_T prAdapter = (P_ADAPTER_T)NULL;
5488 P_MSG_P2P_FUNCTION_SWITCH_T prMsgFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)NULL;
5496 if ((!prDev) || (!prTxPow)) {
5502 prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev));
5510 prAdapter = prGlueInfo->prAdapter;
5512 prMsgFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_FUNCTION_SWITCH_T));
5513 if (!prMsgFuncSwitch) {
5518 prMsgFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
5520 if (prTxPow->disabled) {
5522 prMsgFuncSwitch->fgIsFuncOn = FALSE;
5526 /* Re-enable function. */
5527 prMsgFuncSwitch->fgIsFuncOn = TRUE;
5530 /* 1.3 send message */
5531 mboxSendMsg(prAdapter,
5533 (P_MSG_HDR_T) prMsgFuncSwitch,
5534 MSG_SEND_METHOD_BUF);
5540 } /* mtk_p2p_wext_set_txpow */