X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=wifi%2F1.0%2FIWifiChip.hal;h=d7904043253de8f13231455b403904eb6a5eefa2;hb=11dc29810563cb2076ae9df72cc54742796a4b29;hp=f5fe7a9e82b8c54e8ba375fb9fe030b7ad787d89;hpb=5443a9fc9b7e7f334cd298aea19741290ad55555;p=android-x86%2Fhardware-interfaces.git diff --git a/wifi/1.0/IWifiChip.hal b/wifi/1.0/IWifiChip.hal index f5fe7a9e..d7904043 100644 --- a/wifi/1.0/IWifiChip.hal +++ b/wifi/1.0/IWifiChip.hal @@ -17,6 +17,12 @@ package android.hardware.wifi@1.0; import IWifiChipEventCallback; +import IWifiIface; +import IWifiApIface; +import IWifiNanIface; +import IWifiP2pIface; +import IWifiStaIface; +import IWifiRttController; /** * Interface that represents a chip that must be configured as a single unit. @@ -24,22 +30,13 @@ import IWifiChipEventCallback; * to perform operations like NAN, RTT, etc. */ interface IWifiChip { - enum InterfaceType : uint32_t { - STA, AP, P2P, - /** - * NAN control interface. Datapath support may be queried and created - * through this interface. - */ - NAN, - }; - /** * Set of interface types with the maximum number of interfaces that can have - * one of the specified type for a given ChipInterfaceCombination. See - * ChipInterfaceCombination for examples. + * one of the specified type for a given ChipIfaceCombination. See + * ChipIfaceCombination for examples. */ - struct ChipInterfaceCombinationLimit { - vec types; // Each InterfaceType may occur at most once + struct ChipIfaceCombinationLimit { + vec types; // Each IfaceType must occur at most once. uint32_t maxIfaces; }; @@ -66,8 +63,8 @@ interface IWifiChip { * [], [STA], [STA+NAN], [STA+STA], [NAN] * Not included [STA+STA+NAN] */ - struct ChipInterfaceCombination { - vec limits; + struct ChipIfaceCombination { + vec limits; }; /** @@ -80,7 +77,7 @@ interface IWifiChip { * * When in a mode, it must be possible to perform any combination of creating * and removing interfaces as long as at least one of the - * ChipInterfaceCombinations is satisfied. This means that if a chip has two + * ChipIfaceCombinations is satisfied. This means that if a chip has two * available combinations, [{STA} <= 1] and [{AP} <= 1] then it is expected * that exactly one STA interface or one AP interface can be created, but it * is not expected that both a STA and AP interface could be created. If it @@ -88,11 +85,11 @@ interface IWifiChip { * [{STA} <=1, {AP} <= 1]. * * When switching between two available combinations it is expected that - * interfaces only supported by the initial combination will be removed until + * interfaces only supported by the initial combination must be removed until * the target combination is also satisfied. At that point new interfaces * satisfying only the target combination can be added (meaning the initial * combination limits will no longer satisfied). The addition of these new - * interfaces should not impact the existence of interfaces that satisfy both + * interfaces must not impact the existence of interfaces that satisfy both * combinations. * * For example, a chip with available combinations: @@ -101,12 +98,12 @@ interface IWifiChip { * AP interface in place of one of the STAs then first one of the STA * interfaces must be removed and then the AP interface can be created after * the STA had been torn down. During this process the remaining STA and NAN - * interfaces should not be removed/recreated. + * interfaces must not be removed/recreated. * * If a chip does not support this kind of reconfiguration in this mode then - * the combinations should be separated into two separate modes. Before - * switching modes all interfaces will be torn down, the mode switch will be - * enacted and when it completes the new interfaces will be brought up. + * the combinations must be separated into two separate modes. Before + * switching modes all interfaces must be torn down, the mode switch must be + * enacted and when it completes the new interfaces must be brought up. */ struct ChipMode { /** @@ -118,48 +115,550 @@ interface IWifiChip { * A list of the possible interface combinations that the chip can have * while in this mode. */ - vec availableCombinations; + vec availableCombinations; + }; + + /** + * Information about the version of the driver and firmware running this chip. + * + * The information in these ASCII strings are vendor specific and does not + * need to follow any particular format. It may be dumped as part of the bug + * report. + */ + struct ChipDebugInfo { + string driverDescription; + string firmwareDescription; }; /** + * Capabilities exposed by this chip. + */ + enum ChipCapabilityMask : uint32_t { + /** + * Memory dump of Firmware. + */ + DEBUG_MEMORY_FIRMWARE_DUMP = 1 << 0, + /** + * Memory dump of Driver. + */ + DEBUG_MEMORY_DRIVER_DUMP = 1 << 1, + /** + * Connectivity events reported via debug ring buffer. + */ + DEBUG_RING_BUFFER_CONNECT_EVENT = 1 << 2, + /** + * Power events reported via debug ring buffer. + */ + DEBUG_RING_BUFFER_POWER_EVENT = 1 << 3, + /** + * Wakelock events reported via debug ring buffer. + */ + DEBUG_RING_BUFFER_WAKELOCK_EVENT = 1 << 4, + /** + * Vendor data reported via debug ring buffer. + * This mostly contains firmware event logs. + */ + DEBUG_RING_BUFFER_VENDOR_DATA = 1 << 5, + /** + * Host wake reasons stats collection. + */ + DEBUG_HOST_WAKE_REASON_STATS = 1 << 6, + /** + * Error alerts. + */ + DEBUG_ERROR_ALERTS = 1 << 7 + }; + + /** + * Get the id assigned to this chip. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + * @return id Assigned chip Id. + */ + getId() generates (WifiStatus status, ChipId id); + + /** * Requests notifications of significant events on this chip. Multiple calls - * to this will register multiple callbacks each of which will receive all + * to this must register multiple callbacks each of which must receive all * events. + * + * @param callback An instance of the |IWifiChipEventCallback| HIDL interface + * object. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + */ + registerEventCallback(IWifiChipEventCallback callback) generates (WifiStatus status); + + /** + * Get the capabilities supported by this chip. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_AVAILABLE|, + * |WifiStatusCode.ERROR_UNKNOWN| + * @return capabilities Bitset of |ChipCapabilityMask| values. */ - oneway registerEventCallback(IWifiChipEventCallback callback); + getCapabilities() generates (WifiStatus status, uint32_t capabilities); /** * Get the set of operation modes that the chip supports. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + * @return modes List of modes supported by the device. */ - getAvailableModes() generates (vec modes); + getAvailableModes() generates (WifiStatus status, vec modes); /** - * Reconfigure the Chip. Will trigger onChipReconfigured. + * Reconfigure the Chip. + * Any existing |IWifiIface| objects must be marked invalid after this call. + * If this fails then the chips is now in an undefined state and + * configureChip must be called again. + * Must trigger |IWifiChipEventCallback.onChipReconfigured| on success. + * Must trigger |IWifiEventCallback.onFailure| on failure. * - * @param modeId The mode that the chip should switch to, corresponding to the - * id property of the target ChipMode. + * @param modeId The mode that the chip must switch to, corresponding to the + * id property of the target ChipMode. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_AVAILABLE|, + * |WifiStatusCode.ERROR_UNKNOWN| */ - oneway configureChip(ChipModeId modeId); + configureChip(ChipModeId modeId) generates (WifiStatus status); /** * Get the current mode that the chip is in. + * + * @return modeId The mode that the chip is currently configured to, + * corresponding to the id property of the target ChipMode. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + */ + getMode() generates (WifiStatus status, ChipModeId modeId); + + /** + * Request information about the chip. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_AVAILABLE|, + * |WifiStatusCode.ERROR_UNKNOWN| + * @return chipDebugInfo Instance of |ChipDebugInfo|. */ - getMode() generates (ChipModeId modeId); + requestChipDebugInfo() generates (WifiStatus status, ChipDebugInfo chipDebugInfo); /** - * Request information about the chip. Will trigger onChipDebugInfoAvailable. + * Request vendor debug info from the driver. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_AVAILABLE|, + * |WifiStatusCode.ERROR_UNKNOWN| + * @param blob Vector of bytes retrieved from the driver. */ - oneway requestChipDebugInfo(); + requestDriverDebugDump() generates (WifiStatus status, vec blob); /** - * Request vendor debug info from the driver. Will trigger - * onDriverDebugDumpAvailable. + * Request vendor debug info from the firmware. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_AVAILABLE|, + * |WifiStatusCode.ERROR_UNKNOWN| + * @param blob Vector of bytes retrieved from the driver. */ - oneway requestDriverDebugDump(); + requestFirmwareDebugDump() generates (WifiStatus status, vec blob); /** - * Request vendor debug info from the firmware. Will trigger - * onFirmwareDebugDumpAvailable. + * Create an AP iface on the chip. + * + * Depending on the mode the chip is configured in, the interface creation + * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum + * allowed (specified in |ChipIfaceCombination|) number of ifaces of the AP + * type. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED| + * @return iface HIDL interface object representing the iface if + * successful, null otherwise. + */ + createApIface() generates (WifiStatus status, IWifiApIface iface); + + /** + * List all the AP iface names configured on the chip. + * The corresponding |IWifiApIface| object for any iface are + * retrieved using |getApIface| method. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + * @return ifnames List of all AP iface names on the chip. + */ + getApIfaceNames() generates (WifiStatus status, vec ifnames); + + /** + * Gets a HIDL interface object for the AP Iface corresponding + * to the provided ifname. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + * @return iface HIDL interface object representing the iface if + * it exists, null otherwise. + */ + getApIface(string ifname) generates (WifiStatus status, IWifiApIface iface); + + /** + * Removes the AP Iface with the provided ifname. + * Any further calls on the corresponding |IWifiApIface| HIDL interface + * object must fail. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + */ + removeApIface(string ifname) generates (WifiStatus status); + + /** + * Create a NAN iface on the chip. + * + * Depending on the mode the chip is configured in, the interface creation + * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum + * allowed (specified in |ChipIfaceCombination|) number of ifaces of the NAN + * type. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED| + * @return iface HIDL interface object representing the iface if + * successful, null otherwise. + */ + createNanIface() generates (WifiStatus status, IWifiNanIface iface); + + /** + * List all the NAN iface names configured on the chip. + * The corresponding |IWifiNanIface| object for any iface are + * retrieved using |getNanIface| method. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + * @return ifnames List of all NAN iface names on the chip. + */ + getNanIfaceNames() generates (WifiStatus status, vec ifnames); + + /** + * Gets a HIDL interface object for the NAN Iface corresponding + * to the provided ifname. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + * @return iface HIDL interface object representing the iface if + * it exists, null otherwise. + */ + getNanIface(string ifname) generates (WifiStatus status, IWifiNanIface iface); + + /** + * Removes the NAN Iface with the provided ifname. + * Any further calls on the corresponding |IWifiNanIface| HIDL interface + * object must fail. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + */ + removeNanIface(string ifname) generates (WifiStatus status); + + /** + * Create a P2P iface on the chip. + * + * Depending on the mode the chip is configured in, the interface creation + * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum + * allowed (specified in |ChipIfaceCombination|) number of ifaces of the P2P + * type. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED| + * @return iface HIDL interface object representing the iface if + * successful, null otherwise. + */ + createP2pIface() generates (WifiStatus status, IWifiP2pIface iface); + + /** + * List all the P2P iface names configured on the chip. + * The corresponding |IWifiP2pIface| object for any iface are + * retrieved using |getP2pIface| method. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + * @return ifnames List of all P2P iface names on the chip. + */ + getP2pIfaceNames() generates (WifiStatus status, vec ifnames); + + /** + * Gets a HIDL interface object for the P2P Iface corresponding + * to the provided ifname. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + * @return iface HIDL interface object representing the iface if + * it exists, null otherwise. + */ + getP2pIface(string ifname) generates (WifiStatus status, IWifiP2pIface iface); + + /** + * Removes the P2P Iface with the provided ifname. + * Any further calls on the corresponding |IWifiP2pIface| HIDL interface + * object must fail. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + */ + removeP2pIface(string ifname) generates (WifiStatus status); + + /** + * Create an STA iface on the chip. + * + * Depending on the mode the chip is configured in, the interface creation + * may fail (code: |ERROR_NOT_AVAILABLE|) if we've already reached the maximum + * allowed (specified in |ChipIfaceCombination|) number of ifaces of the STA + * type. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED| + * @return iface HIDL interface object representing the iface if + * successful, null otherwise. + */ + createStaIface() generates (WifiStatus status, IWifiStaIface iface); + + /** + * List all the STA iface names configured on the chip. + * The corresponding |IWifiStaIface| object for any iface are + * retrieved using |getStaIface| method. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + * @return ifnames List of all STA iface names on the chip. + */ + getStaIfaceNames() generates (WifiStatus status, vec ifnames); + + /** + * Gets a HIDL interface object for the STA Iface corresponding + * to the provided ifname. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + * @return iface HIDL interface object representing the iface if + * it exists, null otherwise. + */ + getStaIface(string ifname) generates (WifiStatus status, IWifiStaIface iface); + + /** + * Removes the STA Iface with the provided ifname. + * Any further calls on the corresponding |IWifiStaIface| HIDL interface + * object must fail. + * + * @param ifname Name of the iface. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_INVALID_ARGS| + */ + removeStaIface(string ifname) generates (WifiStatus status); + + /** + * Create a RTTController instance. + * + * RTT controller can be either: + * a) Bound to a specific iface by passing in the corresponding |IWifiIface| + * object in |iface| param, OR + * b) Let the implementation decide the iface to use for RTT operations by + * passing null in |iface| param. + * + * @param boundIface HIDL interface object representing the iface if + * the responder must be bound to a specific iface, null otherwise. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + */ + createRttController(IWifiIface boundIface) + generates (WifiStatus status, IWifiRttController rtt); + + /** + * WiFi debug ring buffer life cycle is as follow: + * - At initialization time, framework must call |getDebugRingBuffersStatus|. + * to obtain the names and list of supported ring buffers. + * The driver may expose several different rings each holding a different + * type of data (connection events, power events, etc). + * - When WiFi operations start framework must call + * |startLoggingToDebugRingBuffer| to trigger log collection for a specific + * ring. The vebose level for each ring buffer can be specified in this API. + * - During wifi operations, driver must periodically report per ring data to + * framework by invoking the + * |IWifiChipEventCallback.onDebugRingBufferDataAvailable| callback. + * - When capturing a bug report, framework must indicate to driver that all + * the data has to be uploaded urgently by calling + * |forceDumpToDebugRingBuffer|. + * + * The data uploaded by driver must be stored by framework in separate files, + * with one stream of file per ring. Framework must store the files in pcapng + * format, allowing for easy merging and parsing with network analyzer tools. + * TODO: Since we're not longer dumping out the raw data, storing in separate + * pcapng files for parsing later must not work anymore. + */ + /** + * API to get the status of all ring buffers supported by driver. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| + * @return ringBuffers Vector of |WifiDebugRingBufferStatus| corresponding to the + * status of each ring bufffer on the device. + */ + getDebugRingBuffersStatus() generates (WifiStatus status, + vec ringBuffers); + + /** + * API to trigger the debug data collection. + * + * @param ringName represent the name of the ring for which data collection + * shall start. This can be retrieved via the corresponding + * |WifiDebugRingBufferStatus|. + * @parm maxIntervalInSec Maximum interval in seconds for driver to invoke + * |onDebugRingBufferData|, ignore if zero. + * @parm minDataSizeInBytes: Minimum data size in buffer for driver to invoke + * |onDebugRingBufferData|, ignore if zero. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| + */ + startLoggingToDebugRingBuffer(string ringName, + WifiDebugRingBufferVerboseLevel verboseLevel, + uint32_t maxIntervalInSec, + uint32_t minDataSizeInBytes) + generates (WifiStatus status); + + /** + * API to force dump data into the corresponding ring buffer. + * This is to be invoked during bugreport collection. + * + * @param ringName represent the name of the ring for which data collection + * shall be forced. This can be retrieved via the corresponding + * |WifiDebugRingBufferStatus|. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.ERROR_NOT_STARTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| + */ + forceDumpToDebugRingBuffer(string ringName) generates (WifiStatus status); + + /** + * API to retrieve the wifi wake up reason stats for debugging. + * The driver is expected to start maintaining these stats once the chip + * is configured using |configureChip|. These stats must be reset whenever + * the chip is reconfigured or the HAL is stopped. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| + * @return stats Instance of |WifiDebugHostWakeReasonStats|. + */ + getDebugHostWakeReasonStats() + generates (WifiStatus status, WifiDebugHostWakeReasonStats stats); + + /** + * API to enable/disable alert notifications from the chip. + * These alerts must be used to notify framework of any fatal error events + * that the chip encounters via |IWifiChipEventCallback.onDebugErrorAlert| method. + * Must fail if |ChipCapabilityMask.DEBUG_ERROR_ALERTS| is not set. + * + * @param enable true to enable, false to disable. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| */ - oneway requestFirmwareDebugDump(); + enableDebugErrorAlerts(bool enable) generates (WifiStatus status); };