mirror of https://github.com/ipxe/ipxe.git
196 lines
4.3 KiB
C
196 lines
4.3 KiB
C
#ifndef _NCM_H
|
|
#define _NCM_H
|
|
|
|
/** @file
|
|
*
|
|
* CDC-NCM USB Ethernet driver
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/usb.h>
|
|
#include <ipxe/cdc.h>
|
|
#include <byteswap.h>
|
|
#include "ecm.h"
|
|
|
|
/** CDC-NCM subclass */
|
|
#define USB_SUBCLASS_CDC_NCM 0x0d
|
|
|
|
/** CDC-NCM interfaces */
|
|
enum ncm_interfaces {
|
|
/** Communications interface */
|
|
NCM_INTERFACE_COMMS = 0,
|
|
/** Data interface */
|
|
NCM_INTERFACE_DATA,
|
|
NCM_INTERFACE_COUNT
|
|
};
|
|
|
|
/** Alternate setting for CDC-NCM data interface */
|
|
#define NCM_DATA_ALTERNATE 1
|
|
|
|
/** Get NTB parameters */
|
|
#define NCM_GET_NTB_PARAMETERS \
|
|
( USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \
|
|
USB_REQUEST_TYPE ( 0x80 ) )
|
|
|
|
/** NTB datagram parameters */
|
|
struct ncm_ntb_datagram_parameters {
|
|
/** Maximum size */
|
|
uint32_t mtu;
|
|
/** Alignment divisor */
|
|
uint16_t divisor;
|
|
/** Alignment remainder */
|
|
uint16_t remainder;
|
|
/** Alignment modulus */
|
|
uint16_t modulus;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** NTB parameters */
|
|
struct ncm_ntb_parameters {
|
|
/** Length */
|
|
uint16_t len;
|
|
/** Supported formats */
|
|
uint16_t formats;
|
|
/** IN datagram parameters */
|
|
struct ncm_ntb_datagram_parameters in;
|
|
/** Reserved */
|
|
uint16_t reserved;
|
|
/** OUT datagram parameters */
|
|
struct ncm_ntb_datagram_parameters out;
|
|
/** Maximum number of datagrams per OUT NTB */
|
|
uint16_t max;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Set NTB input size */
|
|
#define NCM_SET_NTB_INPUT_SIZE \
|
|
( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \
|
|
USB_REQUEST_TYPE ( 0x86 ) )
|
|
|
|
/** Set NTB input size */
|
|
struct ncm_set_ntb_input_size {
|
|
/** Maximum size */
|
|
uint32_t mtu;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Minimum allowed NTB input size */
|
|
#define NCM_MIN_NTB_INPUT_SIZE 2048
|
|
|
|
/** Maximum allowed NTB input size (16-bit) */
|
|
#define NCM_MAX_NTB_INPUT_SIZE 65536
|
|
|
|
/** CDC-NCM transfer header (16-bit) */
|
|
struct ncm_transfer_header {
|
|
/** Signature */
|
|
uint32_t magic;
|
|
/** Header length */
|
|
uint16_t header_len;
|
|
/** Sequence number */
|
|
uint16_t sequence;
|
|
/** Total length */
|
|
uint16_t len;
|
|
/** Offset of first datagram pointer */
|
|
uint16_t offset;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** CDC-NCM transfer header magic */
|
|
#define NCM_TRANSFER_HEADER_MAGIC 0x484d434eUL
|
|
|
|
/** CDC-NCM datagram descriptor (16-bit) */
|
|
struct ncm_datagram_descriptor {
|
|
/** Starting offset */
|
|
uint16_t offset;
|
|
/** Length */
|
|
uint16_t len;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** CDC-NCM datagram pointer (16-bit) */
|
|
struct ncm_datagram_pointer {
|
|
/** Signature */
|
|
uint32_t magic;
|
|
/** Header length */
|
|
uint16_t header_len;
|
|
/** Offset of next datagram pointer */
|
|
uint16_t offset;
|
|
/** Datagram descriptors
|
|
*
|
|
* Must be terminated by an empty descriptor.
|
|
*/
|
|
struct ncm_datagram_descriptor desc[0];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** CDC-NCM datagram pointer magic */
|
|
#define NCM_DATAGRAM_POINTER_MAGIC 0x304d434eUL
|
|
|
|
/** CDC-NCM datagram pointer CRC present flag */
|
|
#define NCM_DATAGRAM_POINTER_MAGIC_CRC 0x01000000UL
|
|
|
|
/** NTB constructed for transmitted packets (excluding padding)
|
|
*
|
|
* This is a policy decision.
|
|
*/
|
|
struct ncm_ntb_header {
|
|
/** Transfer header */
|
|
struct ncm_transfer_header nth;
|
|
/** Datagram pointer */
|
|
struct ncm_datagram_pointer ndp;
|
|
/** Datagram descriptors */
|
|
struct ncm_datagram_descriptor desc[2];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** A CDC-NCM network device */
|
|
struct ncm_device {
|
|
/** USB device */
|
|
struct usb_device *usb;
|
|
/** USB bus */
|
|
struct usb_bus *bus;
|
|
/** Network device */
|
|
struct net_device *netdev;
|
|
|
|
/** Communications interface */
|
|
unsigned int comms;
|
|
/** Data interface */
|
|
unsigned int data;
|
|
|
|
/** Maximum supported NTB input size */
|
|
size_t mtu;
|
|
/** Transmitted packet sequence number */
|
|
uint16_t sequence;
|
|
/** Alignment padding required on transmitted packets */
|
|
size_t padding;
|
|
|
|
/** Interrupt endpoint */
|
|
struct usb_endpoint intr;
|
|
/** Bulk IN endpoint */
|
|
struct usb_endpoint in;
|
|
/** Bulk OUT endpoint */
|
|
struct usb_endpoint out;
|
|
};
|
|
|
|
/** Bulk IN ring minimum buffer count
|
|
*
|
|
* This is a policy decision.
|
|
*/
|
|
#define NCM_IN_MIN_COUNT 3
|
|
|
|
/** Bulk IN ring minimum total buffer size
|
|
*
|
|
* This is a policy decision.
|
|
*/
|
|
#define NCM_IN_MIN_SIZE 16384
|
|
|
|
/** Bulk IN ring maximum total buffer size
|
|
*
|
|
* This is a policy decision.
|
|
*/
|
|
#define NCM_IN_MAX_SIZE 131072
|
|
|
|
/** Interrupt ring buffer count
|
|
*
|
|
* This is a policy decision.
|
|
*/
|
|
#define NCM_INTR_COUNT 2
|
|
|
|
#endif /* _NCM_H */
|