blob: 312746026db8f113ee047708c0d950e49086c514 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// Acronyms \
/// Iface: Interface \
/// Phy: Physical \
/// Mac: Medium Access Control \
/// Sta: Station \
/// Addr: Address
@available(added=15)
library fuchsia.wlan.phyimpl;
using fuchsia.wlan.common;
using fuchsia.wlan.ieee80211 as ieee80211;
using zx;
const WLANPHY_ALPHA2_LEN uint8 = 2;
type WlanPhyCountry = flexible union {
/// ISO Alpha-2 takes two octet alphabet characters.
/// This needs to be expanded if at least one WLAN device driver or firmware
/// requires more than two octets.
1: alpha2 array<uint8, WLANPHY_ALPHA2_LEN>;
};
@available(added=HEAD)
type BtCoexistenceMode = flexible enum {
MODE_AUTO = 1;
MODE_OFF = 2;
};
@available(added=HEAD)
type WlanPhyImplNotifyError = flexible enum {
/// An unspecified internal error occurred.
INTERNAL = 1;
/// Receiver does not have support for handling the event.
NOT_SUPPORTED = 2;
};
@available(added=HEAD)
type CriticalErrorReason = flexible enum : uint8 {
/// Notifies the receiver (wlanphy client) that the wlan firmware running on the wlan PHY
/// has crashed. Upon receiving this event, the client can decide to forward it to
/// higher layers of the wlan stack, handle it itself (for example by requesting a
/// reset of the PHY) or ignore it.
FW_CRASH = 0;
};
/// This protocol is specifically meant for passing events/notifications from the WlanPhyImpl server
/// to its client.
@available(added=HEAD)
@discoverable
open protocol WlanPhyImplNotify {
/// Indicate to the receiver (wlanphy client) that the wlan PHY has encountered a critical
/// error specifying a reason code. The client can decide to forward it to higher layers of
/// the wlan stack, handle it itself or ignore it. The sender can decide to handle the
/// error if the receiver responds with an error code.
/// Some possible error codes are:
/// NOT_SUPPORTED: receiver does not have support for handling the event.
/// INTERNAL: Error encountered during processing (including error returned by
/// a higher layer module if it was forwarded).
flexible OnCriticalError(table {
1: reason_code CriticalErrorReason;
}) -> () error WlanPhyImplNotifyError;
};
@discoverable
@transport("Driver")
open protocol WlanPhyImpl {
/// This method can be used by the WlanPhyImpl client to send the client end of the
/// WlanPhyImplNotify endpoint for the WlanPhyImpl server to use. If the WlanPhyImpl client
/// never invokes this method that is an indirect implication that the WlanPhyImplNotify is not
/// supported. Some possible error codes are:
/// ZX_ERR_NOT_SUPPORTED: The WlanPhyImpl server does not support the WlanPhyImplNotify protocol.
@available(added=HEAD)
flexible Init(resource table {
/// The WlanPhyImplNotify client end.
/// Required.
1: notify_client client_end:WlanPhyImplNotify;
}) -> () error zx.Status;
/// MAC roles supported for ifaces on the physical device.
flexible GetSupportedMacRoles() -> (table {
1: supported_mac_roles
vector<fuchsia.wlan.common.WlanMacRole>:fuchsia.wlan.common.MAX_SUPPORTED_MAC_ROLES;
}) error zx.Status;
/// Create a new interface with the specified role, returning the interface id. \
/// Some common error codes are: \
/// ZX_ERR_NO_RESOURCES: maximum number of interfaces have already been created. \
/// ZX_ERR_NOT_SUPPORTED: device does not support the specified role.
flexible CreateIface(resource table {
/// The station role for this interface. A device may support multiple roles,
/// but an interface is instantiated with a single role. This field is required.
1: role fuchsia.wlan.common.WlanMacRole;
/// A handle to the direct MLME channel, if supported by the driver. This
/// channel should be used by SME to communicate with MLME via the MLME
/// protocol. This field is required.
2: mlme_channel zx.Handle:CHANNEL;
/// The initial station address set from configuration layer. This field is optional.
3: init_sta_addr ieee80211.MacAddr;
}) -> (table {
/// This field is always present.
1: iface_id uint16;
}) error zx.Status;
/// Destroy the interface with the matching id. \
/// Some common error codes are: \
/// ZX_ERR_NOT_FOUND: Specified iface does not exist or has already been removed. \
/// ZX_ERR_SHOULD_WAIT: Device is busy and cannot be removed, try again later.
flexible DestroyIface(table {
/// This field is required.
1: iface_id uint16;
}) -> () error zx.Status;
/// Set country with a WlanPhyCountry. \
/// Some common error codes are: \
/// ZX_ERR_NOT_FOUND: Specified country code not supported. PHY state is left unchanged.
flexible SetCountry(WlanPhyCountry) -> () error zx.Status;
/// Set device to a world-safe country, i.e. a mode that conforms to all
/// regulatory constraints globally. \
/// Generally expected to succeed if the device is in a functional state.
flexible ClearCountry() -> () error zx.Status;
/// Read currently configured country. Implementations are advised to read the
/// country directly from the firmware, where possible. \
/// Generally expected to succeed if the device is in a functional state.
flexible GetCountry() -> (WlanPhyCountry) error zx.Status;
/// Set Power Save mode on device. In most implementations this
/// likely to be set in Firmware. \
/// Some common error codes are: \
/// ZX_ERR_NOT_SUPPORTED: Specified Power Save mode not supported.
flexible SetPowerSaveMode(table {
/// This field is required.
1: ps_mode fuchsia.wlan.common.PowerSaveType;
}) -> () error zx.Status;
/// Get current Power Save mode from device. In most implementation this
/// likely to be retrieved from Firmware.
flexible GetPowerSaveMode() -> (table {
/// This field is required.
1: ps_mode fuchsia.wlan.common.PowerSaveType;
}) error zx.Status;
/// Power up/down/reset the wlan chip.
/// If supported, PowerDown will power down the wlan chip if it is currently powered on.
/// Any existing interfaces should have already been deleted before making this call or else the
/// driver will fail the call with error code ZX_ERR_INTERNAL.
/// Other possible error codes are: \
/// ZX_ERR_NOT_SUPPORTED: the feature is not supported by the driver.
/// ZX_ERR_BAD_STATE: the wlan chip is already powered down.
@available(added=HEAD)
flexible PowerDown() -> () error zx.Status;
/// If supported, PowerUp will power up the wlan chip if it is currently powered down.
/// Possible error codes are: \
/// ZX_ERR_NOT_SUPPORTED: the feature is not supported by the driver.
/// ZX_ERR_BAD_STATE: the wlan chip is already powered up.
@available(added=HEAD)
flexible PowerUp() -> () error zx.Status;
/// If supported, Reset functionality implements PowerDown then PowerUp in an attempt to
/// recover from an error state. For example, if an interface gets into a bad state or if
/// firmware crashes, the firmware/chip may be unable to perform some actions and Reset
/// may be able to clear the bad state.
/// Possible error codes are: \
/// ZX_ERR_NOT_SUPPORTED: the feature is not supported by the driver.
@available(added=HEAD)
flexible Reset() -> () error zx.Status;
/// Returns the current power state of the wlan chip. After successful initialization
/// of the wlan driver, the state is set to true (power on) by default. power_on set to
/// true indicates that the wlan chip is powered on and false indicates the wlan chip
/// is powered off.
@available(added=HEAD)
flexible GetPowerState() -> (table {
1: power_on bool;
}) error zx.Status;
/// Set the Bluetooth coexistence mode.
/// Possible error codes are: \
/// ZX_ERR_NOT_SUPPORTED: device does not support the specified BT coexistence mode.
@available(added=HEAD)
flexible SetBtCoexistenceMode(table {
1: mode BtCoexistenceMode;
}) -> () error zx.Status;
};
service Service {
wlan_phy_impl client_end:WlanPhyImpl;
};