summaryrefslogtreecommitdiffstats
path: root/include/linux/usb/association.h
blob: d7f3cb9b9db5a8b888c0d028c7b90fe41e7f02ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// SPDX-License-Identifier: GPL-2.0
/*
 * Wireless USB - Cable Based Association
 *
 * Copyright (C) 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.
 *
 */
#ifndef __LINUX_USB_ASSOCIATION_H
#define __LINUX_USB_ASSOCIATION_H


/*
 * Association attributes
 *
 * Association Models Supplement to WUSB 1.0 T[3-1]
 *
 * Each field in the structures has it's ID, it's length and then the
 * value. This is the actual definition of the field's ID and its
 * length.
 */
struct wusb_am_attr {
	__u8 id;
	__u8 len;
};

/* Different fields defined by the spec */
#define WUSB_AR_AssociationTypeId	{ .id = cpu_to_le16(0x0000), .len = cpu_to_le16(2) }
#define WUSB_AR_AssociationSubTypeId	{ .id = cpu_to_le16(0x0001), .len = cpu_to_le16(2) }
#define WUSB_AR_Length			{ .id = cpu_to_le16(0x0002), .len = cpu_to_le16(4) }
#define WUSB_AR_AssociationStatus	{ .id = cpu_to_le16(0x0004), .len = cpu_to_le16(4) }
#define WUSB_AR_LangID			{ .id = cpu_to_le16(0x0008), .len = cpu_to_le16(2) }
#define WUSB_AR_DeviceFriendlyName	{ .id = cpu_to_le16(0x000b), .len = cpu_to_le16(64) } /* max */
#define WUSB_AR_HostFriendlyName	{ .id = cpu_to_le16(0x000c), .len = cpu_to_le16(64) } /* max */
#define WUSB_AR_CHID			{ .id = cpu_to_le16(0x1000), .len = cpu_to_le16(16) }
#define WUSB_AR_CDID			{ .id = cpu_to_le16(0x1001), .len = cpu_to_le16(16) }
#define WUSB_AR_ConnectionContext	{ .id = cpu_to_le16(0x1002), .len = cpu_to_le16(48) }
#define WUSB_AR_BandGroups		{ .id = cpu_to_le16(0x1004), .len = cpu_to_le16(2) }

/* CBAF Control Requests (AMS1.0[T4-1] */
enum {
	CBAF_REQ_GET_ASSOCIATION_INFORMATION = 0x01,
	CBAF_REQ_GET_ASSOCIATION_REQUEST,
	CBAF_REQ_SET_ASSOCIATION_RESPONSE
};

/*
 * CBAF USB-interface defitions
 *
 * No altsettings, one optional interrupt endpoint.
 */
enum {
	CBAF_IFACECLASS    = 0xef,
	CBAF_IFACESUBCLASS = 0x03,
	CBAF_IFACEPROTOCOL = 0x01,
};

/* Association Information (AMS1.0[T4-3]) */
struct wusb_cbaf_assoc_info {
	__le16 Length;
	__u8 NumAssociationRequests;
	__le16 Flags;
	__u8 AssociationRequestsArray[];
} __attribute__((packed));

/* Association Request (AMS1.0[T4-4]) */
struct wusb_cbaf_assoc_request {
	__u8 AssociationDataIndex;
	__u8 Reserved;
	__le16 AssociationTypeId;
	__le16 AssociationSubTypeId;
	__le32 AssociationTypeInfoSize;
} __attribute__((packed));

enum {
	AR_TYPE_WUSB                    = 0x0001,
	AR_TYPE_WUSB_RETRIEVE_HOST_INFO = 0x0000,
	AR_TYPE_WUSB_ASSOCIATE          = 0x0001,
};

/* Association Attribute header (AMS1.0[3.8]) */
struct wusb_cbaf_attr_hdr {
	__le16 id;
	__le16 len;
} __attribute__((packed));

/* Host Info (AMS1.0[T4-7]) (yeah, more headers and fields...) */
struct wusb_cbaf_host_info {
	struct wusb_cbaf_attr_hdr AssociationTypeId_hdr;
	__le16 AssociationTypeId;
	struct wusb_cbaf_attr_hdr AssociationSubTypeId_hdr;
	__le16 AssociationSubTypeId;
	struct wusb_cbaf_attr_hdr CHID_hdr;
	struct wusb_ckhdid CHID;
	struct wusb_cbaf_attr_hdr LangID_hdr;
	__le16 LangID;
	struct wusb_cbaf_attr_hdr HostFriendlyName_hdr;
	__u8 HostFriendlyName[];
} __attribute__((packed));

/* Device Info (AMS1.0[T4-8])
 *
 * I still don't get this tag'n'header stuff for each goddamn
 * field...
 */
struct wusb_cbaf_device_info {
	struct wusb_cbaf_attr_hdr Length_hdr;
	__le32 Length;
	struct wusb_cbaf_attr_hdr CDID_hdr;
	struct wusb_ckhdid CDID;
	struct wusb_cbaf_attr_hdr BandGroups_hdr;
	__le16 BandGroups;
	struct wusb_cbaf_attr_hdr LangID_hdr;
	__le16 LangID;
	struct wusb_cbaf_attr_hdr DeviceFriendlyName_hdr;
	__u8 DeviceFriendlyName[];
} __attribute__((packed));

/* Connection Context; CC_DATA - Success case (AMS1.0[T4-9]) */
struct wusb_cbaf_cc_data {
	struct wusb_cbaf_attr_hdr AssociationTypeId_hdr;
	__le16 AssociationTypeId;
	struct wusb_cbaf_attr_hdr AssociationSubTypeId_hdr;
	__le16 AssociationSubTypeId;
	struct wusb_cbaf_attr_hdr Length_hdr;
	__le32 Length;
	struct wusb_cbaf_attr_hdr ConnectionContext_hdr;
	struct wusb_ckhdid CHID;
	struct wusb_ckhdid CDID;
	struct wusb_ckhdid CK;
	struct wusb_cbaf_attr_hdr BandGroups_hdr;
	__le16 BandGroups;
} __attribute__((packed));

/* CC_DATA - Failure case (AMS1.0[T4-10]) */
struct wusb_cbaf_cc_data_fail {
	struct wusb_cbaf_attr_hdr AssociationTypeId_hdr;
	__le16 AssociationTypeId;
	struct wusb_cbaf_attr_hdr AssociationSubTypeId_hdr;
	__le16 AssociationSubTypeId;
	struct wusb_cbaf_attr_hdr Length_hdr;
	__le16 Length;
	struct wusb_cbaf_attr_hdr AssociationStatus_hdr;
	__u32 AssociationStatus;
} __attribute__((packed));

#endif	/* __LINUX_USB_ASSOCIATION_H */