1/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.hardware.wifi@1.0;
18
19import IWifiChipEventCallback;
20import IWifiIface;
21import IWifiApIface;
22import IWifiNanIface;
23import IWifiP2pIface;
24import IWifiStaIface;
25import IWifiRttController;
26
27/**
28 * Interface that represents a chip that must be configured as a single unit.
29 * The HAL/driver/firmware will be responsible for determining which phy is used
30 * to perform operations like NAN, RTT, etc.
31 */
32interface IWifiChip {
33  /**
34   * Set of interface types with the maximum number of interfaces that can have
35   * one of the specified type for a given ChipIfaceCombination. See
36   * ChipIfaceCombination for examples.
37   */
38  struct ChipIfaceCombinationLimit {
39    vec<IfaceType> types; // Each IfaceType must occur at most once.
40    uint32_t maxIfaces;
41  };
42
43  /**
44   * Set of interfaces that can operate concurrently when in a given mode. See
45   * ChipMode below.
46   *
47   * For example:
48   *   [{STA} <= 2]
49   *       At most two STA interfaces are supported
50   *       [], [STA], [STA+STA]
51   *
52   *   [{STA} <= 1, {NAN} <= 1, {AP} <= 1]
53   *       Any combination of STA, NAN, AP
54   *       [], [STA], [NAN], [AP], [STA+NAN], [STA+AP], [NAN+AP], [STA+NAN+AP]
55   *
56   *   [{STA} <= 1, {NAN,P2P} <= 1]
57   *       Optionally a STA and either NAN or P2P
58   *       [], [STA], [STA+NAN], [STA+P2P], [NAN], [P2P]
59   *       Not included [NAN+P2P], [STA+NAN+P2P]
60   *
61   *   [{STA} <= 1, {STA,NAN} <= 1]
62   *       Optionally a STA and either a second STA or a NAN
63   *       [], [STA], [STA+NAN], [STA+STA], [NAN]
64   *       Not included [STA+STA+NAN]
65   */
66  struct ChipIfaceCombination {
67    vec<ChipIfaceCombinationLimit> limits;
68  };
69
70  /**
71   * A mode that the chip can be put in. A mode defines a set of constraints on
72   * the interfaces that can exist while in that mode. Modes define a unit of
73   * configuration where all interfaces must be torn down to switch to a
74   * different mode. Some HALs may only have a single mode, but an example where
75   * multiple modes would be required is if a chip has different firmwares with
76   * different capabilities.
77   *
78   * When in a mode, it must be possible to perform any combination of creating
79   * and removing interfaces as long as at least one of the
80   * ChipIfaceCombinations is satisfied. This means that if a chip has two
81   * available combinations, [{STA} <= 1] and [{AP} <= 1] then it is expected
82   * that exactly one STA interface or one AP interface can be created, but it
83   * is not expected that both a STA and AP interface could be created. If it
84   * was then there would be a single available combination
85   * [{STA} <=1, {AP} <= 1].
86   *
87   * When switching between two available combinations it is expected that
88   * interfaces only supported by the initial combination must be removed until
89   * the target combination is also satisfied. At that point new interfaces
90   * satisfying only the target combination can be added (meaning the initial
91   * combination limits will no longer satisfied). The addition of these new
92   * interfaces must not impact the existence of interfaces that satisfy both
93   * combinations.
94   *
95   * For example, a chip with available combinations:
96   *     [{STA} <= 2, {NAN} <=1] and [{STA} <=1, {NAN} <= 1, {AP} <= 1}]
97   * If the chip currently has 3 interfaces STA, STA and NAN and wants to add an
98   * AP interface in place of one of the STAs then first one of the STA
99   * interfaces must be removed and then the AP interface can be created after
100   * the STA had been torn down. During this process the remaining STA and NAN
101   * interfaces must not be removed/recreated.
102   *
103   * If a chip does not support this kind of reconfiguration in this mode then
104   * the combinations must be separated into two separate modes. Before
105   * switching modes all interfaces must be torn down, the mode switch must be
106   * enacted and when it completes the new interfaces must be brought up.
107   */
108  struct ChipMode {
109    /**
110     * Id that can be used to put the chip in this mode.
111     */
112    ChipModeId id;
113
114    /**
115     * A list of the possible interface combinations that the chip can have
116     * while in this mode.
117     */
118    vec<ChipIfaceCombination> availableCombinations;
119  };
120
121  /**
122   * Information about the version of the driver and firmware running this chip.
123   *
124   * The information in these ASCII strings are vendor specific and does not
125   * need to follow any particular format. It may be dumped as part of the bug
126   * report.
127   */
128  struct ChipDebugInfo {
129    string driverDescription;
130    string firmwareDescription;
131  };
132
133  /**
134   * Capabilities exposed by this chip.
135   */
136  enum ChipCapabilityMask : uint32_t {
137    /**
138     * Memory dump of Firmware.
139     */
140    DEBUG_MEMORY_FIRMWARE_DUMP = 1 << 0,
141    /**
142     * Memory dump of Driver.
143     */
144    DEBUG_MEMORY_DRIVER_DUMP = 1 << 1,
145    /**
146     * Connectivity events reported via debug ring buffer.
147     */
148    DEBUG_RING_BUFFER_CONNECT_EVENT = 1 << 2,
149    /**
150     * Power events reported via debug ring buffer.
151     */
152    DEBUG_RING_BUFFER_POWER_EVENT = 1 << 3,
153    /**
154     * Wakelock events reported via debug ring buffer.
155     */
156    DEBUG_RING_BUFFER_WAKELOCK_EVENT = 1 << 4,
157    /**
158     * Vendor data reported via debug ring buffer.
159     * This mostly contains firmware event logs.
160     */
161    DEBUG_RING_BUFFER_VENDOR_DATA = 1 << 5,
162    /**
163     * Host wake reasons stats collection.
164     */
165    DEBUG_HOST_WAKE_REASON_STATS = 1 << 6,
166    /**
167     * Error alerts.
168     */
169    DEBUG_ERROR_ALERTS = 1 << 7
170  };
171
172  /**
173   * Get the id assigned to this chip.
174   *
175   * @return status WifiStatus of the operation.
176   *         Possible status codes:
177   *         |WifiStatusCode.SUCCESS|,
178   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
179   * @return id Assigned chip Id.
180   */
181  getId() generates (WifiStatus status, ChipId id);
182
183  /**
184   * Requests notifications of significant events on this chip. Multiple calls
185   * to this must register multiple callbacks each of which must receive all
186   * events.
187   *
188   * @param callback An instance of the |IWifiChipEventCallback| HIDL interface
189   *        object.
190   * @return status WifiStatus of the operation.
191   *         Possible status codes:
192   *         |WifiStatusCode.SUCCESS|,
193   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
194   */
195  registerEventCallback(IWifiChipEventCallback callback) generates (WifiStatus status);
196
197  /**
198   * Get the capabilities supported by this chip.
199   *
200   * @return status WifiStatus of the operation.
201   *         Possible status codes:
202   *         |WifiStatusCode.SUCCESS|,
203   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
204   *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
205   *         |WifiStatusCode.ERROR_UNKNOWN|
206   * @return capabilities Bitset of |ChipCapabilityMask| values.
207   */
208  getCapabilities()
209      generates (WifiStatus status, bitfield<ChipCapabilityMask> capabilities);
210
211  /**
212   * Get the set of operation modes that the chip supports.
213   *
214   * @return status WifiStatus of the operation.
215   *         Possible status codes:
216   *         |WifiStatusCode.SUCCESS|,
217   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
218   * @return modes List of modes supported by the device.
219   */
220  getAvailableModes() generates (WifiStatus status, vec<ChipMode> modes);
221
222  /**
223   * Configure the Chip.
224   * This may NOT be called to reconfigure a chip due to an internal
225   * limitation. Calling this when chip is already configured in a different
226   * mode must trigger an ERROR_NOT_SUPPORTED failure.
227   * If you want to do reconfiguration, please call IWifi.stop() and IWifi.start()
228   * to restart Wifi HAL before calling this.
229   * Any existing |IWifiIface| objects must be marked invalid after this call.
230   * If this fails then the chips is now in an undefined state and
231   * configureChip must be called again.
232   * Must trigger |IWifiChipEventCallback.onChipReconfigured| on success.
233   * Must trigger |IWifiEventCallback.onFailure| on failure.
234   *
235   * @param modeId The mode that the chip must switch to, corresponding to the
236   *        id property of the target ChipMode.
237   * @return status WifiStatus of the operation.
238   *         Possible status codes:
239   *         |WifiStatusCode.SUCCESS|,
240   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
241   *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
242   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
243   *         |WifiStatusCode.ERROR_UNKNOWN|
244   */
245  configureChip(ChipModeId modeId) generates (WifiStatus status);
246
247  /**
248   * Get the current mode that the chip is in.
249   *
250   * @return modeId The mode that the chip is currently configured to,
251   *         corresponding to the id property of the target ChipMode.
252   * @return status WifiStatus of the operation.
253   *         Possible status codes:
254   *         |WifiStatusCode.SUCCESS|,
255   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
256   */
257  getMode() generates (WifiStatus status, ChipModeId modeId);
258
259  /**
260   * Request information about the chip.
261   *
262   * @return status WifiStatus of the operation.
263   *         Possible status codes:
264   *         |WifiStatusCode.SUCCESS|,
265   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
266   *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
267   *         |WifiStatusCode.ERROR_UNKNOWN|
268   * @return chipDebugInfo Instance of |ChipDebugInfo|.
269   */
270  requestChipDebugInfo() generates (WifiStatus status, ChipDebugInfo chipDebugInfo);
271
272  /**
273   * Request vendor debug info from the driver.
274   *
275   * @return status WifiStatus of the operation.
276   *         Possible status codes:
277   *         |WifiStatusCode.SUCCESS|,
278   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
279   *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
280   *         |WifiStatusCode.ERROR_UNKNOWN|
281   * @param blob Vector of bytes retrieved from the driver.
282   */
283  requestDriverDebugDump() generates (WifiStatus status, vec<uint8_t> blob);
284
285  /**
286   * Request vendor debug info from the firmware.
287   *
288   * @return status WifiStatus of the operation.
289   *         Possible status codes:
290   *         |WifiStatusCode.SUCCESS|,
291   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
292   *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
293   *         |WifiStatusCode.ERROR_UNKNOWN|
294   * @param blob Vector of bytes retrieved from the driver.
295   */
296  requestFirmwareDebugDump() generates (WifiStatus status, vec<uint8_t> blob);
297
298  /**
299   * Create an AP iface on the chip.
300   *
301   * Depending on the mode the chip is configured in, the interface creation
302   * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum
303   * allowed (specified in |ChipIfaceCombination|) number of ifaces of the AP
304   * type.
305   *
306   * @return status WifiStatus of the operation.
307   *         Possible status codes:
308   *         |WifiStatusCode.SUCCESS|,
309   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
310   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|
311   * @return iface HIDL interface object representing the iface if
312   *         successful, null otherwise.
313   */
314  createApIface() generates (WifiStatus status, IWifiApIface iface);
315
316  /**
317   * List all the AP iface names configured on the chip.
318   * The corresponding |IWifiApIface| object for any iface are
319   * retrieved using |getApIface| method.
320   *
321   * @return status WifiStatus of the operation.
322   *         Possible status codes:
323   *         |WifiStatusCode.SUCCESS|,
324   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
325   * @return ifnames List of all AP iface names on the chip.
326   */
327  getApIfaceNames() generates (WifiStatus status, vec<string> ifnames);
328
329  /**
330   * Gets a HIDL interface object for the AP Iface corresponding
331   * to the provided ifname.
332   *
333   * @param ifname Name of the iface.
334   * @return status WifiStatus of the operation.
335   *         Possible status codes:
336   *         |WifiStatusCode.SUCCESS|,
337   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
338   *         |WifiStatusCode.ERROR_INVALID_ARGS|
339   * @return iface HIDL interface object representing the iface if
340   *         it exists, null otherwise.
341   */
342  getApIface(string ifname) generates (WifiStatus status, IWifiApIface iface);
343
344  /**
345   * Removes the AP Iface with the provided ifname.
346   * Any further calls on the corresponding |IWifiApIface| HIDL interface
347   * object must fail.
348   *
349   * @param ifname Name of the iface.
350   * @return status WifiStatus of the operation.
351   *         Possible status codes:
352   *         |WifiStatusCode.SUCCESS|,
353   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
354   *         |WifiStatusCode.ERROR_INVALID_ARGS|
355   */
356  removeApIface(string ifname) generates (WifiStatus status);
357
358  /**
359   * Create a NAN iface on the chip.
360   *
361   * Depending on the mode the chip is configured in, the interface creation
362   * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum
363   * allowed (specified in |ChipIfaceCombination|) number of ifaces of the NAN
364   * type.
365   *
366   * @return status WifiStatus of the operation.
367   *         Possible status codes:
368   *         |WifiStatusCode.SUCCESS|,
369   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
370   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|
371   * @return iface HIDL interface object representing the iface if
372   *         successful, null otherwise.
373   */
374  createNanIface() generates (WifiStatus status, IWifiNanIface iface);
375
376  /**
377   * List all the NAN iface names configured on the chip.
378   * The corresponding |IWifiNanIface| object for any iface are
379   * retrieved using |getNanIface| method.
380   *
381   * @return status WifiStatus of the operation.
382   *         Possible status codes:
383   *         |WifiStatusCode.SUCCESS|,
384   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
385   * @return ifnames List of all NAN iface names on the chip.
386   */
387  getNanIfaceNames() generates (WifiStatus status, vec<string> ifnames);
388
389  /**
390   * Gets a HIDL interface object for the NAN Iface corresponding
391   * to the provided ifname.
392   *
393   * @param ifname Name of the iface.
394   * @return status WifiStatus of the operation.
395   *         Possible status codes:
396   *         |WifiStatusCode.SUCCESS|,
397   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
398   *         |WifiStatusCode.ERROR_INVALID_ARGS|
399   * @return iface HIDL interface object representing the iface if
400   *         it exists, null otherwise.
401   */
402  getNanIface(string ifname) generates (WifiStatus status, IWifiNanIface iface);
403
404  /**
405   * Removes the NAN Iface with the provided ifname.
406   * Any further calls on the corresponding |IWifiNanIface| HIDL interface
407   * object must fail.
408   *
409   * @param ifname Name of the iface.
410   * @return status WifiStatus of the operation.
411   *         Possible status codes:
412   *         |WifiStatusCode.SUCCESS|,
413   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
414   *         |WifiStatusCode.ERROR_INVALID_ARGS|
415   */
416  removeNanIface(string ifname) generates (WifiStatus status);
417
418  /**
419   * Create a P2P iface on the chip.
420   *
421   * Depending on the mode the chip is configured in, the interface creation
422   * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum
423   * allowed (specified in |ChipIfaceCombination|) number of ifaces of the P2P
424   * type.
425   *
426   * @return status WifiStatus of the operation.
427   *         Possible status codes:
428   *         |WifiStatusCode.SUCCESS|,
429   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
430   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|
431   * @return iface HIDL interface object representing the iface if
432   *         successful, null otherwise.
433   */
434  createP2pIface() generates (WifiStatus status, IWifiP2pIface iface);
435
436  /**
437   * List all the P2P iface names configured on the chip.
438   * The corresponding |IWifiP2pIface| object for any iface are
439   * retrieved using |getP2pIface| method.
440   *
441   * @return status WifiStatus of the operation.
442   *         Possible status codes:
443   *         |WifiStatusCode.SUCCESS|,
444   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
445   * @return ifnames List of all P2P iface names on the chip.
446   */
447  getP2pIfaceNames() generates (WifiStatus status, vec<string> ifnames);
448
449  /**
450   * Gets a HIDL interface object for the P2P Iface corresponding
451   * to the provided ifname.
452   *
453   * @param ifname Name of the iface.
454   * @return status WifiStatus of the operation.
455   *         Possible status codes:
456   *         |WifiStatusCode.SUCCESS|,
457   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
458   *         |WifiStatusCode.ERROR_INVALID_ARGS|
459   * @return iface HIDL interface object representing the iface if
460   *         it exists, null otherwise.
461   */
462  getP2pIface(string ifname) generates (WifiStatus status, IWifiP2pIface iface);
463
464  /**
465   * Removes the P2P Iface with the provided ifname.
466   * Any further calls on the corresponding |IWifiP2pIface| HIDL interface
467   * object must fail.
468   *
469   * @param ifname Name of the iface.
470   * @return status WifiStatus of the operation.
471   *         Possible status codes:
472   *         |WifiStatusCode.SUCCESS|,
473   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
474   *         |WifiStatusCode.ERROR_INVALID_ARGS|
475   */
476  removeP2pIface(string ifname) generates (WifiStatus status);
477
478  /**
479   * Create an STA iface on the chip.
480   *
481   * Depending on the mode the chip is configured in, the interface creation
482   * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum
483   * allowed (specified in |ChipIfaceCombination|) number of ifaces of the STA
484   * type.
485   *
486   * @return status WifiStatus of the operation.
487   *         Possible status codes:
488   *         |WifiStatusCode.SUCCESS|,
489   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
490   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|
491   * @return iface HIDL interface object representing the iface if
492   *         successful, null otherwise.
493   */
494  createStaIface() generates (WifiStatus status, IWifiStaIface iface);
495
496  /**
497   * List all the STA iface names configured on the chip.
498   * The corresponding |IWifiStaIface| object for any iface are
499   * retrieved using |getStaIface| method.
500   *
501   * @return status WifiStatus of the operation.
502   *         Possible status codes:
503   *         |WifiStatusCode.SUCCESS|,
504   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
505   * @return ifnames List of all STA iface names on the chip.
506   */
507  getStaIfaceNames() generates (WifiStatus status, vec<string> ifnames);
508
509  /**
510   * Gets a HIDL interface object for the STA Iface corresponding
511   * to the provided ifname.
512   *
513   * @param ifname Name of the iface.
514   * @return status WifiStatus of the operation.
515   *         Possible status codes:
516   *         |WifiStatusCode.SUCCESS|,
517   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
518   *         |WifiStatusCode.ERROR_INVALID_ARGS|
519   * @return iface HIDL interface object representing the iface if
520   *         it exists, null otherwise.
521   */
522  getStaIface(string ifname) generates (WifiStatus status, IWifiStaIface iface);
523
524  /**
525   * Removes the STA Iface with the provided ifname.
526   * Any further calls on the corresponding |IWifiStaIface| HIDL interface
527   * object must fail.
528   *
529   * @param ifname Name of the iface.
530   * @return status WifiStatus of the operation.
531   *         Possible status codes:
532   *         |WifiStatusCode.SUCCESS|,
533   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
534   *         |WifiStatusCode.ERROR_INVALID_ARGS|
535   */
536  removeStaIface(string ifname) generates (WifiStatus status);
537
538  /**
539   * Create a RTTController instance.
540   *
541   * RTT controller can be either:
542   * a) Bound to a specific iface by passing in the corresponding |IWifiIface|
543   * object in |iface| param, OR
544   * b) Let the implementation decide the iface to use for RTT operations by
545   * passing null in |iface| param.
546   *
547   * @param boundIface HIDL interface object representing the iface if
548   *        the responder must be bound to a specific iface, null otherwise.
549   * @return status WifiStatus of the operation.
550   *         Possible status codes:
551   *         |WifiStatusCode.SUCCESS|,
552   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|
553   */
554  createRttController(IWifiIface boundIface)
555      generates (WifiStatus status, IWifiRttController rtt);
556
557  /**
558   * WiFi debug ring buffer life cycle is as follow:
559   * - At initialization time, framework must call |getDebugRingBuffersStatus|.
560   *   to obtain the names and list of supported ring buffers.
561   *   The driver may expose several different rings each holding a different
562   *   type of data (connection events, power events, etc).
563   * - When WiFi operations start framework must call
564   *   |startLoggingToDebugRingBuffer| to trigger log collection for a specific
565   *   ring. The vebose level for each ring buffer can be specified in this API.
566   * - During wifi operations, driver must periodically report per ring data to
567   *   framework by invoking the
568   *   |IWifiChipEventCallback.onDebugRingBufferDataAvailable| callback.
569   * - When capturing a bug report, framework must indicate to driver that all
570   *   the data has to be uploaded urgently by calling
571   *   |forceDumpToDebugRingBuffer|.
572   *
573   * The data uploaded by driver must be stored by framework in separate files,
574   * with one stream of file per ring. Framework must store the files in pcapng
575   * format, allowing for easy merging and parsing with network analyzer tools.
576   * TODO: Since we're not longer dumping out the raw data, storing in separate
577   * pcapng files for parsing later must not work anymore.
578   */
579  /**
580   * API to get the status of all ring buffers supported by driver.
581   *
582   * @return status WifiStatus of the operation.
583   *         Possible status codes:
584   *         |WifiStatusCode.SUCCESS|,
585   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
586   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
587   *         |WifiStatusCode.NOT_AVAILABLE|,
588   *         |WifiStatusCode.UNKNOWN|
589   * @return ringBuffers Vector of |WifiDebugRingBufferStatus| corresponding to the
590   *         status of each ring bufffer on the device.
591   */
592  getDebugRingBuffersStatus() generates (WifiStatus status,
593                                         vec<WifiDebugRingBufferStatus> ringBuffers);
594
595  /**
596   * API to trigger the debug data collection.
597   *
598   * @param ringName represent the name of the ring for which data collection
599   *        shall start. This can be retrieved via the corresponding
600   *        |WifiDebugRingBufferStatus|.
601   * @parm maxIntervalInSec Maximum interval in seconds for driver to invoke
602   *       |onDebugRingBufferData|, ignore if zero.
603   * @parm minDataSizeInBytes: Minimum data size in buffer for driver to invoke
604   *       |onDebugRingBufferData|, ignore if zero.
605   * @return status WifiStatus of the operation.
606   *         Possible status codes:
607   *         |WifiStatusCode.SUCCESS|,
608   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
609   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
610   *         |WifiStatusCode.NOT_AVAILABLE|,
611   *         |WifiStatusCode.UNKNOWN|
612   */
613  startLoggingToDebugRingBuffer(string ringName,
614                                WifiDebugRingBufferVerboseLevel verboseLevel,
615                                uint32_t maxIntervalInSec,
616                                uint32_t minDataSizeInBytes)
617      generates (WifiStatus status);
618
619  /**
620   * API to force dump data into the corresponding ring buffer.
621   * This is to be invoked during bugreport collection.
622   *
623   * @param ringName represent the name of the ring for which data collection
624   *        shall be forced. This can be retrieved via the corresponding
625   *        |WifiDebugRingBufferStatus|.
626   * @return status WifiStatus of the operation.
627   *         Possible status codes:
628   *         |WifiStatusCode.SUCCESS|,
629   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
630   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
631   *         |WifiStatusCode.ERROR_NOT_STARTED|,
632   *         |WifiStatusCode.NOT_AVAILABLE|,
633   *         |WifiStatusCode.UNKNOWN|
634   */
635  forceDumpToDebugRingBuffer(string ringName) generates (WifiStatus status);
636
637  /**
638   * API to stop the debug data collection for all ring buffers.
639   *
640   * @return status WifiStatus of the operation.
641   *         Possible status codes:
642   *         |WifiStatusCode.SUCCESS|,
643   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
644   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
645   *         |WifiStatusCode.NOT_AVAILABLE|,
646   *         |WifiStatusCode.UNKNOWN|
647   */
648  stopLoggingToDebugRingBuffer() generates (WifiStatus status);
649
650  /**
651   * API to retrieve the wifi wake up reason stats for debugging.
652   * The driver is expected to start maintaining these stats once the chip
653   * is configured using |configureChip|. These stats must be reset whenever
654   * the chip is reconfigured or the HAL is stopped.
655   *
656   * @return status WifiStatus of the operation.
657   *         Possible status codes:
658   *         |WifiStatusCode.SUCCESS|,
659   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
660   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
661   *         |WifiStatusCode.NOT_AVAILABLE|,
662   *         |WifiStatusCode.UNKNOWN|
663   * @return stats Instance of |WifiDebugHostWakeReasonStats|.
664   */
665  getDebugHostWakeReasonStats()
666      generates (WifiStatus status, WifiDebugHostWakeReasonStats stats);
667
668  /**
669   * API to enable/disable alert notifications from the chip.
670   * These alerts must be used to notify framework of any fatal error events
671   * that the chip encounters via |IWifiChipEventCallback.onDebugErrorAlert| method.
672   * Must fail if |ChipCapabilityMask.DEBUG_ERROR_ALERTS| is not set.
673   *
674   * @param enable true to enable, false to disable.
675   * @return status WifiStatus of the operation.
676   *         Possible status codes:
677   *         |WifiStatusCode.SUCCESS|,
678   *         |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
679   *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
680   *         |WifiStatusCode.NOT_AVAILABLE|,
681   *         |WifiStatusCode.UNKNOWN|
682   */
683  enableDebugErrorAlerts(bool enable) generates (WifiStatus status);
684};
685