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

#pragma once

// clang-format off

#include <zircon/compiler.h>

/* CDC Subclasses for the Communications Interface Class */
#define USB_CDC_SUBCLASS_DIRECT_LINE       0x01
#define USB_CDC_SUBCLASS_ABSTRACT          0x02
#define USB_CDC_SUBCLASS_TELEPHONE         0x03
#define USB_CDC_SUBCLASS_MULTI_CHANNEL     0x04
#define USB_CDC_SUBCLASS_CAPI              0x05
#define USB_CDC_SUBCLASS_ETHERNET          0x06
#define USB_CDC_SUBCLASS_ATM               0x07
#define USB_CDC_SUBCLASS_WIRELESS_HANDSET  0x08
#define USB_CDC_SUBCLASS_DEVICE_MGMT       0x09
#define USB_CDC_SUBCLASS_MOBILE_DIRECT     0x0A
#define USB_CDC_SUBCLASS_OBEX              0x0B
#define USB_CDC_SUBCLASS_ETHERNET_EMU      0x0C
#define USB_CDC_SUBCLASS_NETWORK_CTRL      0x0D

/* CDC Descriptor SubTypes */
#define USB_CDC_DST_HEADER                    0x00
#define USB_CDC_DST_CALL_MGMT                 0x01
#define USB_CDC_DST_ABSTRACT_CTRL_MGMT        0x02
#define USB_CDC_DST_DIRECT_LINE_MGMT          0x03
#define USB_CDC_DST_TELEPHONE_RINGER          0x04
#define USB_CDC_DST_TELEPHONE_CALL_REPORTING  0x05
#define USB_CDC_DST_UNION                     0x06
#define USB_CDC_DST_COUNTRY_SELECTION         0x07
#define USB_CDC_DST_TELEPHONE_OP_MODES        0x08
#define USB_CDC_DST_USB_TERMINAL              0x09
#define USB_CDC_DST_NETWORK_CHANNEL           0x0A
#define USB_CDC_DST_PROTOCOL_UNIT             0x0B
#define USB_CDC_DST_EXTENSION_UNIT            0x0C
#define USB_CDC_DST_MULTI_CHANNEL_MGMT        0x0D
#define USB_CDC_DST_CAPI_CTRL_MGMT            0x0E
#define USB_CDC_DST_ETHERNET                  0x0F
#define USB_CDC_DST_ATM_NETWORKING            0x10
#define USB_CDC_DST_WIRELESS_HANDSET_CTRL     0x11
#define USB_CDC_DST_MOBILE_DIRECT_LINE        0x12
#define USB_CDC_DST_MDLM_DETAIL               0x13
#define USB_CDC_DST_DEVICE_MGMT               0x14
#define USB_CDC_DST_OBEX                      0x15
#define USB_CDC_DST_COMMAND_SET               0x16
#define USB_CDC_DST_COMMAND_SET_DETAIL        0x17
#define USB_CDC_DST_TELEPHONE_CTRL            0x18
#define USB_CDC_DST_OBEX_SERVICE_ID           0x19
#define USB_CDC_DST_NCM                       0x1A

/* CDC Class-Specific Notification Codes */
#define USB_CDC_NC_NETWORK_CONNECTION       0x00
#define USB_CDC_NC_RESPONSE_AVAILABLE       0x01
#define USB_CDC_NC_SERIAL_STATE             0x20
#define USB_CDC_NC_CONNECTION_SPEED_CHANGE  0x2A

/* CDC Ethernet Class-Specific Request Codes */
#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
#define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
#define USB_CDC_GET_ETHERNET_STATISTIC          0x44

/* CDC Class-Specific Requests */
#define USB_CDC_SEND_ENCAPSULATED_COMMAND   0x00
#define USB_CDC_GET_ENCAPSULATED_RESPONSE   0x01

__BEGIN_CDECLS;

typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
    uint8_t bDescriptorSubType; // USB_CDC_DST_HEADER
    uint16_t bcdCDC;
} __attribute__ ((packed)) usb_cs_header_interface_descriptor_t;

typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
    uint8_t bDescriptorSubType; // USB_CDC_DST_CALL_MGMT
    uint8_t bmCapabilities;
    uint8_t bDataInterface;
} __attribute__ ((packed)) usb_cs_call_mgmt_interface_descriptor_t;

typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
    uint8_t bDescriptorSubType; // USB_CDC_DST_ABSTRACT_CTRL_MGMT
    uint8_t bmCapabilities;
} __attribute__ ((packed)) usb_cs_abstract_ctrl_mgmt_interface_descriptor_t;

typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
    uint8_t bControlInterface;
    uint8_t bSubordinateInterface[];
} __attribute__ ((packed)) usb_cs_union_interface_descriptor_t;

// fixed size version of usb_cs_union_interface_descriptor_t
typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
    uint8_t bControlInterface;
    uint8_t bSubordinateInterface;
} __attribute__ ((packed)) usb_cs_union_interface_descriptor_1_t;

typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
    uint8_t bDescriptorSubType; // USB_CDC_DST_ETHERNET
    uint8_t iMACAddress;
    uint32_t bmEthernetStatistics;
    uint16_t wMaxSegmentSize;
    uint16_t wNumberMCFilters;
    uint8_t bNumberPowerFilters;
} __attribute__ ((packed)) usb_cs_ethernet_interface_descriptor_t;

typedef struct {
    uint8_t bmRequestType;
    uint8_t bNotification;
    uint16_t wValue;
    uint16_t wIndex;
    uint16_t wLength;
} __attribute__ ((packed)) usb_cdc_notification_t;

typedef struct {
    usb_cdc_notification_t notification;
    uint32_t downlink_br;
    uint32_t uplink_br;
 } __attribute__ ((packed)) usb_cdc_speed_change_notification_t;

__END_CDECLS;