Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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__ */
201 
  This page was automatically generated by the LXR engine.