// Copyright 2018 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.

library fuchsia.hardware.ethernet;

using zx;

const uint32 ETH_MAC_SIZE = 6; // bytes
const uint32 ETH_MTU_SIZE = 1500; // bytes
const uint32 ETH_FRAME_MAX_HDR_SIZE = 18; // bytes. MAC Dest(6) + MAC Src(6) + 802.1Q tag(4) + Ethertype(2)
const uint32 ETH_FRAME_MAX_SIZE = 1518;

/// The ethernet interface supports both synchronous and asynchronous transmissions using the
/// proto->queue_tx() and ifc->complete_tx() methods.
///
/// Receive operations are supported with the ifc->recv() interface.
///
/// The FEATURE_WLAN flag indicates a device that supports wlan operations.
///
/// The FEATURE_SYNTH flag indicates a device that is not backed by hardware.
///
/// The FEATURE_DMA flag indicates that the device can copy the buffer data using DMA and will ensure
/// that physical addresses are provided in netbufs.
// TODO: implement netbuf-based receive operations by implementing proto->queue_rx() and
// ifc->complete_rx()
enum EthernetFeature : uint32 {
    WLAN = 0x1;
    SYNTH = 0x2;
    DMA = 0x4;
};

const uint32 ETHERNET_STATUS_ONLINE = 0x1;

struct EthernetInfo {
    uint32 features;
    uint32 mtu;
    array<uint8>:ETH_MAC_SIZE mac;
    array<uint8>:2 reserved0;
    uint64 netbuf_size;
    array<uint32>:2 reserved1;
};

/// Note that this struct may have a private section encoded after it. Allocator much call parent
/// device's |Query| to get the correct size.
struct EthernetNetbuf {
    /// Provided by the generic ethernet driver.
    [Buffer] vector<uint8> data;
    /// Only used if ETHERNET_FEATURE_DMA is available.
    zx.paddr phys;
    uint16 reserved;
    uint32 flags;
};

[Transport = "Banjo", BanjoLayout = "ddk-interface"]
protocol EthernetIfc {
    /// Value with bits set from the |ETHERNET_STATUS_*| flags
    Status(uint32 status) -> ();

    Recv([Buffer] vector<uint8> data, uint32 flags) -> ();

};

struct EthDevMetadata {
    uint32 vid;
    uint32 pid;
    uint32 did;
};

/// Indicates that additional data is available to be sent after this call finishes. Allows an ethernet
/// driver to batch tx to hardware if possible.
const uint32 ETHERNET_TX_OPT_MORE = 1;

/// SETPARAM_ values identify the parameter to set. Each call to set_param()
/// takes an int32_t |value| and uint8_t* |data| which have meaning specific to
/// the parameter being set.
///
/// |value| is bool. |data| is unused.
const uint32 ETHERNET_SETPARAM_PROMISC = 1;

/// |value| is bool. |data| is unused.
const uint32 ETHERNET_SETPARAM_MULTICAST_PROMISC = 2;

const int32 ETHERNET_MULTICAST_FILTER_OVERFLOW = -1;

/// |value| is number of addresses, or ETHERNET_MULTICAST_FILTER_OVERFLOW for "too many to count."
/// |data| is |value|*6 bytes of MAC addresses. Caller retains ownership.
/// If |value| is _OVERFLOW, |data| is ignored.
const uint32 ETHERNET_SETPARAM_MULTICAST_FILTER = 3;

const uint32 ETHERNET_SETPARAM_DUMP_REGS = 4;

/// The ethernet midlayer will never call ethermac_protocol
/// methods from multiple threads simultaneously, but it
/// can call send() methods at the same time as non-send
/// methods.
[Transport = "Banjo", BanjoLayout = "ddk-protocol"]
protocol EthernetImpl {
    /// Obtain information about the ethermac device and supported features
    /// Safe to call at any time.
    Query(uint32 options) -> (zx.status s, EthernetInfo info);

    /// Shut down a running ethermac
    /// Safe to call if the ethermac is already stopped.
    Stop() -> ();

    /// Start ethermac running with ifc_virt
    /// Callbacks on ifc may be invoked from now until stop() is called
    Start(EthernetIfc ifc) -> (zx.status s);

    /// Request transmission of the packet in netbuf. The driver takes ownership of the netbuf and
    /// must call the completion callback passed in to return it once the enqueue is complete.
    /// The callback may be used to return the packet before transmission itself completes, and may
    /// called from within the queue_tx() implementation itself.
    ///
    /// |QueueTx| may be called at any time after start() is called including from multiple threads
    /// simultaneously.
    ///
    /// Return status indicates queue state:
    ///   ZX_OK: Packet has been enqueued.
    ///   Other: Packet could not be enqueued.
    /// Upon a return of ZX_OK, the packet has been enqueued, but no information is returned as to
    /// the completion state of the transmission itself.
    [Async]
    QueueTx(uint32 options, [InOut] EthernetNetbuf netbuf) -> (zx.status status, [Mutable] EthernetNetbuf netbuf);

    /// Request a settings change for the driver. Return status indicates disposition:
    ///   ZX_OK: Request has been handled.
    ///   ZX_ERR_NOT_SUPPORTED: Driver does not support this setting.
    ///   Other: Error trying to support this request.
    ///
    /// |value| and |data| usage are defined for each |param|; see comments above.
    ///
    /// set_param() may be called at any time after start() is called including from multiple threads
    /// simultaneously.
    SetParam(uint32 param, int32 value, [Buffer] vector<uint8> data) -> (zx.status s);

    /// Get the BTI handle (needed to pin DMA memory) for this device.
    /// This method is only valid on devices that advertise ETHERNET_FEATURE_DMA
    /// The caller takes ownership of the BTI handle.
    GetBti() -> (zx.handle:BTI bti);
};
