linux/drivers/uwb/i1480/i1480-wlp.h
<<
>>
Prefs
   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 */
  51enum 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 */
  61struct 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
  77static inline int wlp_tx_hdr_delivery_id_type(const struct wlp_tx_hdr *hdr)
  78{
  79        return hdr->mac_params & 0x0f;
  80}
  81
  82static inline int wlp_tx_hdr_ack_policy(const struct wlp_tx_hdr *hdr)
  83{
  84        return (hdr->mac_params >> 4) & 0x07;
  85}
  86
  87static inline int wlp_tx_hdr_rts_cts(const struct wlp_tx_hdr *hdr)
  88{
  89        return (hdr->mac_params >> 7) & 0x01;
  90}
  91
  92static 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
  97static 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
 103static 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
 108static 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
 113static inline int wlp_tx_hdr_tx_power(const struct wlp_tx_hdr *hdr)
 114{
 115        return (hdr->phy_params >> 4) & 0x0f;
 116}
 117
 118static 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
 123static 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 */
 135struct 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 */
 153struct 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
 161static inline
 162void 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
 177extern ssize_t uwb_pca_base_priority_store(struct wlp_options *,
 178                                           const char *, size_t);
 179extern ssize_t uwb_pca_base_priority_show(const struct wlp_options *, char *);
 180extern ssize_t uwb_bw_alloc_store(struct wlp_options *, const char *, size_t);
 181extern ssize_t uwb_bw_alloc_show(const struct wlp_options *, char *);
 182extern ssize_t uwb_ack_policy_store(struct wlp_options *,
 183                                    const char *, size_t);
 184extern ssize_t uwb_ack_policy_show(const struct wlp_options *, char *);
 185extern ssize_t uwb_rts_cts_store(struct wlp_options *, const char *, size_t);
 186extern ssize_t uwb_rts_cts_show(const struct wlp_options *, char *);
 187extern ssize_t uwb_phy_rate_store(struct wlp_options *, const char *, size_t);
 188extern ssize_t uwb_phy_rate_show(const struct wlp_options *, char *);
 189
 190
 191/** Simple bandwidth allocation (temporary and too simple) */
 192struct 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