/*
 * Wireless USB Wire Adapter constants and structures.
 *
 * Copyright (C) 2005-2006 Intel Corporation.
 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 *
 * FIXME: docs
 * FIXME: organize properly, group logically
 *
 * All the event structures are defined in uwb/spec.h, as they are
 * common to the WHCI and WUSB radio control interfaces.
 *
 * References:
 *   [WUSB] Wireless Universal Serial Bus Specification, revision 1.0, ch8
 */
#ifndef __LINUX_USB_WUSB_WA_H
#define __LINUX_USB_WUSB_WA_H

/**
 * Radio Command Request for the Radio Control Interface
 *
 * Radio Control Interface command and event codes are the same as
 * WHCI, and listed in include/linux/uwb.h:UWB_RC_{CMD,EVT}_*
 */
enum {
	WA_EXEC_RC_CMD = 40,	/* Radio Control command Request */
};

/* Wireless Adapter Requests ([WUSB] table 8-51) */
enum {
	WUSB_REQ_ADD_MMC_IE     = 20,
	WUSB_REQ_REMOVE_MMC_IE  = 21,
	WUSB_REQ_SET_NUM_DNTS   = 22,
	WUSB_REQ_SET_CLUSTER_ID = 23,
	WUSB_REQ_SET_DEV_INFO   = 24,
	WUSB_REQ_GET_TIME       = 25,
	WUSB_REQ_SET_STREAM_IDX = 26,
	WUSB_REQ_SET_WUSB_MAS   = 27,
	WUSB_REQ_CHAN_STOP      = 28,
};


/* Wireless Adapter WUSB Channel Time types ([WUSB] table 8-52) */
enum {
	WUSB_TIME_ADJ   = 0,
	WUSB_TIME_BPST  = 1,
	WUSB_TIME_WUSB  = 2,
};

enum {
	WA_ENABLE = 0x01,
	WA_RESET = 0x02,
	RPIPE_PAUSE = 0x1,
};

/* Responses from Get Status request ([WUSB] section 8.3.1.6) */
enum {
	WA_STATUS_ENABLED = 0x01,
	WA_STATUS_RESETTING = 0x02
};

enum rpipe_crs {
	RPIPE_CRS_CTL = 0x01,
	RPIPE_CRS_ISO = 0x02,
	RPIPE_CRS_BULK = 0x04,
	RPIPE_CRS_INTR = 0x08
};

/**
 * RPipe descriptor ([WUSB] section 8.5.2.11)
 *
 * FIXME: explain rpipes
 */
struct usb_rpipe_descriptor {
	u8	bLength;
	u8	bDescriptorType;
	__le16  wRPipeIndex;
	__le16	wRequests;
	__le16	wBlocks;		/* rw if 0 */
	__le16	wMaxPacketSize;		/* rw? */
	u8	bHSHubAddress;		/* reserved: 0 */
	u8	bHSHubPort;		/* ??? FIXME ??? */
	u8	bSpeed;			/* rw: xfer rate 'enum uwb_phy_rate' */
	u8	bDeviceAddress;		/* rw: Target device address */
	u8	bEndpointAddress;	/* rw: Target EP address */
	u8	bDataSequence;		/* ro: Current Data sequence */
	__le32	dwCurrentWindow;	/* ro */
	u8	bMaxDataSequence;	/* ro?: max supported seq */
	u8	bInterval;		/* rw:  */
	u8	bOverTheAirInterval;	/* rw:  */
	u8	bmAttribute;		/* ro?  */
	u8	bmCharacteristics;	/* ro? enum rpipe_attr, supported xsactions */
	u8	bmRetryOptions;		/* rw? */
	__le16	wNumTransactionErrors;	/* rw */
} __attribute__ ((packed));

/**
 * Wire Adapter Notification types ([WUSB] sections 8.4.5 & 8.5.4)
 *
 * These are the notifications coming on the notification endpoint of
 * an HWA and a DWA.
 */
enum wa_notif_type {
	DWA_NOTIF_RWAKE = 0x91,
	DWA_NOTIF_PORTSTATUS = 0x92,
	WA_NOTIF_TRANSFER = 0x93,
	HWA_NOTIF_BPST_ADJ = 0x94,
	HWA_NOTIF_DN = 0x95,
};

/**
 * Wire Adapter notification header
 *
 * Notifications coming from a wire adapter use a common header
 * defined in [WUSB] sections 8.4.5 & 8.5.4.
 */
struct wa_notif_hdr {
	u8 bLength;
	u8 bNotifyType;			/* enum wa_notif_type */
} __attribute__((packed));

/**
 * HWA DN Received notification [(WUSB] section 8.5.4.2)
 *
 * The DNData is specified in WUSB1.0[7.6]. For each device
 * notification we received, we just need to dispatch it.
 *
 * @dndata:  this is really an array of notifications, but all start
 *           with the same header.
 */
struct hwa_notif_dn {
	struct wa_notif_hdr hdr;
	u8 bSourceDeviceAddr;		/* from errata 2005/07 */
	u8 bmAttributes;
	struct wusb_dn_hdr dndata[];
} __attribute__((packed));

/* [WUSB] section 8.3.3 */
enum wa_xfer_type {
	WA_XFER_TYPE_CTL = 0x80,
	WA_XFER_TYPE_BI = 0x81,		/* bulk/interrupt */
	WA_XFER_TYPE_ISO = 0x82,
	WA_XFER_RESULT = 0x83,
	WA_XFER_ABORT = 0x84,
};

/* [WUSB] section 8.3.3 */
struct wa_xfer_hdr {
	u8 bLength;			/* 0x18 */
	u8 bRequestType;		/* 0x80 WA_REQUEST_TYPE_CTL */
	__le16 wRPipe;			/* RPipe index */
	__le32 dwTransferID;		/* Host-assigned ID */
	__le32 dwTransferLength;	/* Length of data to xfer */
	u8 bTransferSegment;
} __attribute__((packed));

struct wa_xfer_ctl {
	struct wa_xfer_hdr hdr;
	u8 bmAttribute;
	__le16 wReserved;
	struct usb_ctrlrequest baSetupData;
} __attribute__((packed));

struct wa_xfer_bi {
	struct wa_xfer_hdr hdr;
	u8 bReserved;
	__le16 wReserved;
} __attribute__((packed));

struct wa_xfer_hwaiso {
	struct wa_xfer_hdr hdr;
	u8 bReserved;
	__le16 wPresentationTime;
	__le32 dwNumOfPackets;
	/* FIXME: u8 pktdata[]? */
} __attribute__((packed));

/* [WUSB] section 8.3.3.5 */
struct wa_xfer_abort {
	u8 bLength;
	u8 bRequestType;
	__le16 wRPipe;			/* RPipe index */
	__le32 dwTransferID;		/* Host-assigned ID */
} __attribute__((packed));

/**
 * WA Transfer Complete notification ([WUSB] section 8.3.3.3)
 *
 */
struct wa_notif_xfer {
	struct wa_notif_hdr hdr;
	u8 bEndpoint;
	u8 Reserved;
} __attribute__((packed));

/** Transfer result basic codes [WUSB] table 8-15 */
enum {
	WA_XFER_STATUS_SUCCESS,
	WA_XFER_STATUS_HALTED,
	WA_XFER_STATUS_DATA_BUFFER_ERROR,
	WA_XFER_STATUS_BABBLE,
	WA_XFER_RESERVED,
	WA_XFER_STATUS_NOT_FOUND,
	WA_XFER_STATUS_INSUFFICIENT_RESOURCE,
	WA_XFER_STATUS_TRANSACTION_ERROR,
	WA_XFER_STATUS_ABORTED,
	WA_XFER_STATUS_RPIPE_NOT_READY,
	WA_XFER_INVALID_FORMAT,
	WA_XFER_UNEXPECTED_SEGMENT_NUMBER,
	WA_XFER_STATUS_RPIPE_TYPE_MISMATCH,
};

/** [WUSB] section 8.3.3.4 */
struct wa_xfer_result {
	struct wa_notif_hdr hdr;
	__le32 dwTransferID;
	__le32 dwTransferLength;
	u8     bTransferSegment;
	u8     bTransferStatus;
	__le32 dwNumOfPackets;
} __attribute__((packed));

/**
 * Wire Adapter Class Descriptor ([WUSB] section 8.5.2.7).
 *
 * NOTE: u16 fields are read Little Endian from the hardware.
 *
 * @bNumPorts is the original max number of devices that the host can
 *            connect; we might chop this so the stack can handle
 *            it. In case you need to access it, use wusbhc->ports_max
 *            if it is a Wireless USB WA.
 */
struct usb_wa_descriptor {
	u8	bLength;
	u8	bDescriptorType;
	u16	bcdWAVersion;
	u8	bNumPorts;		/* don't use!! */
	u8	bmAttributes;		/* Reserved == 0 */
	u16	wNumRPipes;
	u16	wRPipeMaxBlock;
	u8	bRPipeBlockSize;
	u8	bPwrOn2PwrGood;
	u8	bNumMMCIEs;
	u8	DeviceRemovable;	/* FIXME: in DWA this is up to 16 bytes */
} __attribute__((packed));

/**
 * HWA Device Information Buffer (WUSB1.0[T8.54])
 */
struct hwa_dev_info {
	u8	bmDeviceAvailability[32];       /* FIXME: ignored for now */
	u8	bDeviceAddress;
	__le16	wPHYRates;
	u8	bmDeviceAttribute;
} __attribute__((packed));

#endif /* #ifndef __LINUX_USB_WUSB_WA_H */
