Merge branch 'ht-delete-2.6.35' into release
[deliverable/linux.git] / drivers / uwb / i1480 / i1480-wlp.h
1 /*
2 * Intel 1480 Wireless UWB Link
3 * WLP specific definitions
4 *
5 *
6 * Copyright (C) 2005-2006 Intel Corporation
7 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License version
11 * 2 as published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * 02110-1301, USA.
22 *
23 *
24 * FIXME: docs
25 */
26
27 #ifndef __i1480_wlp_h__
28 #define __i1480_wlp_h__
29
30 #include <linux/spinlock.h>
31 #include <linux/list.h>
32 #include <linux/uwb.h>
33 #include <linux/if_ether.h>
34 #include <asm/byteorder.h>
35
36 /* New simplified header format? */
37 #undef WLP_HDR_FMT_2 /* FIXME: rename */
38
39 /**
40 * Values of the Delivery ID & Type field when PCA or DRP
41 *
42 * The Delivery ID & Type field in the WLP TX header indicates whether
43 * the frame is PCA or DRP. This is done based on the high level bit of
44 * this field.
45 * We use this constant to test if the traffic is PCA or DRP as follows:
46 * if (wlp_tx_hdr_delivery_id_type(wlp_tx_hdr) & WLP_DRP)
47 * this is DRP traffic
48 * else
49 * this is PCA traffic
50 */
51 enum deliver_id_type_bit {
52 WLP_DRP = 8,
53 };
54
55 /**
56 * WLP TX header
57 *
58 * Indicates UWB/WLP-specific transmission parameters for a network
59 * packet.
60 */
61 struct wlp_tx_hdr {
62 /* dword 0 */
63 struct uwb_dev_addr dstaddr;
64 u8 key_index;
65 u8 mac_params;
66 /* dword 1 */
67 u8 phy_params;
68 #ifndef WLP_HDR_FMT_2
69 u8 reserved;
70 __le16 oui01; /* FIXME: not so sure if __le16 or u8[2] */
71 /* dword 2 */
72 u8 oui2; /* if all LE, it could be merged */
73 __le16 prid;
74 #endif
75 } __attribute__((packed));
76
77 static inline int wlp_tx_hdr_delivery_id_type(const struct wlp_tx_hdr *hdr)
78 {
79 return hdr->mac_params & 0x0f;
80 }
81
82 static inline int wlp_tx_hdr_ack_policy(const struct wlp_tx_hdr *hdr)
83 {
84 return (hdr->mac_params >> 4) & 0x07;
85 }
86
87 static inline int wlp_tx_hdr_rts_cts(const struct wlp_tx_hdr *hdr)
88 {
89 return (hdr->mac_params >> 7) & 0x01;
90 }
91
92 static inline void wlp_tx_hdr_set_delivery_id_type(struct wlp_tx_hdr *hdr, int id)
93 {
94 hdr->mac_params = (hdr->mac_params & ~0x0f) | id;
95 }
96
97 static inline void wlp_tx_hdr_set_ack_policy(struct wlp_tx_hdr *hdr,
98 enum uwb_ack_pol policy)
99 {
100 hdr->mac_params = (hdr->mac_params & ~0x70) | (policy << 4);
101 }
102
103 static inline void wlp_tx_hdr_set_rts_cts(struct wlp_tx_hdr *hdr, int rts_cts)
104 {
105 hdr->mac_params = (hdr->mac_params & ~0x80) | (rts_cts << 7);
106 }
107
108 static inline enum uwb_phy_rate wlp_tx_hdr_phy_rate(const struct wlp_tx_hdr *hdr)
109 {
110 return hdr->phy_params & 0x0f;
111 }
112
113 static inline int wlp_tx_hdr_tx_power(const struct wlp_tx_hdr *hdr)
114 {
115 return (hdr->phy_params >> 4) & 0x0f;
116 }
117
118 static inline void wlp_tx_hdr_set_phy_rate(struct wlp_tx_hdr *hdr, enum uwb_phy_rate rate)
119 {
120 hdr->phy_params = (hdr->phy_params & ~0x0f) | rate;
121 }
122
123 static inline void wlp_tx_hdr_set_tx_power(struct wlp_tx_hdr *hdr, int pwr)
124 {
125 hdr->phy_params = (hdr->phy_params & ~0xf0) | (pwr << 4);
126 }
127
128
129 /**
130 * WLP RX header
131 *
132 * Provides UWB/WLP-specific transmission data for a received
133 * network packet.
134 */
135 struct wlp_rx_hdr {
136 /* dword 0 */
137 struct uwb_dev_addr dstaddr;
138 struct uwb_dev_addr srcaddr;
139 /* dword 1 */
140 u8 LQI;
141 s8 RSSI;
142 u8 reserved3;
143 #ifndef WLP_HDR_FMT_2
144 u8 oui0;
145 /* dword 2 */
146 __le16 oui12;
147 __le16 prid;
148 #endif
149 } __attribute__((packed));
150
151
152 /** User configurable options for WLP */
153 struct wlp_options {
154 struct mutex mutex; /* access to user configurable options*/
155 struct wlp_tx_hdr def_tx_hdr; /* default tx hdr */
156 u8 pca_base_priority;
157 u8 bw_alloc; /*index into bw_allocs[] for PCA/DRP reservations*/
158 };
159
160
161 static inline
162 void wlp_options_init(struct wlp_options *options)
163 {
164 mutex_init(&options->mutex);
165 wlp_tx_hdr_set_ack_policy(&options->def_tx_hdr, UWB_ACK_INM);
166 wlp_tx_hdr_set_rts_cts(&options->def_tx_hdr, 1);
167 /* FIXME: default to phy caps */
168 wlp_tx_hdr_set_phy_rate(&options->def_tx_hdr, UWB_PHY_RATE_480);
169 #ifndef WLP_HDR_FMT_2
170 options->def_tx_hdr.prid = cpu_to_le16(0x0000);
171 #endif
172 }
173
174
175 /* sysfs helpers */
176
177 extern ssize_t uwb_pca_base_priority_store(struct wlp_options *,
178 const char *, size_t);
179 extern ssize_t uwb_pca_base_priority_show(const struct wlp_options *, char *);
180 extern ssize_t uwb_bw_alloc_store(struct wlp_options *, const char *, size_t);
181 extern ssize_t uwb_bw_alloc_show(const struct wlp_options *, char *);
182 extern ssize_t uwb_ack_policy_store(struct wlp_options *,
183 const char *, size_t);
184 extern ssize_t uwb_ack_policy_show(const struct wlp_options *, char *);
185 extern ssize_t uwb_rts_cts_store(struct wlp_options *, const char *, size_t);
186 extern ssize_t uwb_rts_cts_show(const struct wlp_options *, char *);
187 extern ssize_t uwb_phy_rate_store(struct wlp_options *, const char *, size_t);
188 extern ssize_t uwb_phy_rate_show(const struct wlp_options *, char *);
189
190
191 /** Simple bandwidth allocation (temporary and too simple) */
192 struct wlp_bw_allocs {
193 const char *name;
194 struct {
195 u8 mask, stream;
196 } tx, rx;
197 };
198
199
200 #endif /* #ifndef __i1480_wlp_h__ */
This page took 0.046978 seconds and 5 git commands to generate.