201 lines
5.4 KiB
C
201 lines
5.4 KiB
C
|
/*
|
||
|
* Intel 1480 Wireless UWB Link
|
||
|
* WLP specific definitions
|
||
|
*
|
||
|
*
|
||
|
* 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
|
||
|
*/
|
||
|
|
||
|
#ifndef __i1480_wlp_h__
|
||
|
#define __i1480_wlp_h__
|
||
|
|
||
|
#include <linux/spinlock.h>
|
||
|
#include <linux/list.h>
|
||
|
#include <linux/uwb.h>
|
||
|
#include <linux/if_ether.h>
|
||
|
#include <asm/byteorder.h>
|
||
|
|
||
|
/* New simplified header format? */
|
||
|
#undef WLP_HDR_FMT_2 /* FIXME: rename */
|
||
|
|
||
|
/**
|
||
|
* Values of the Delivery ID & Type field when PCA or DRP
|
||
|
*
|
||
|
* The Delivery ID & Type field in the WLP TX header indicates whether
|
||
|
* the frame is PCA or DRP. This is done based on the high level bit of
|
||
|
* this field.
|
||
|
* We use this constant to test if the traffic is PCA or DRP as follows:
|
||
|
* if (wlp_tx_hdr_delivery_id_type(wlp_tx_hdr) & WLP_DRP)
|
||
|
* this is DRP traffic
|
||
|
* else
|
||
|
* this is PCA traffic
|
||
|
*/
|
||
|
enum deliver_id_type_bit {
|
||
|
WLP_DRP = 8,
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* WLP TX header
|
||
|
*
|
||
|
* Indicates UWB/WLP-specific transmission parameters for a network
|
||
|
* packet.
|
||
|
*/
|
||
|
struct wlp_tx_hdr {
|
||
|
/* dword 0 */
|
||
|
struct uwb_dev_addr dstaddr;
|
||
|
u8 key_index;
|
||
|
u8 mac_params;
|
||
|
/* dword 1 */
|
||
|
u8 phy_params;
|
||
|
#ifndef WLP_HDR_FMT_2
|
||
|
u8 reserved;
|
||
|
__le16 oui01; /* FIXME: not so sure if __le16 or u8[2] */
|
||
|
/* dword 2 */
|
||
|
u8 oui2; /* if all LE, it could be merged */
|
||
|
__le16 prid;
|
||
|
#endif
|
||
|
} __attribute__((packed));
|
||
|
|
||
|
static inline int wlp_tx_hdr_delivery_id_type(const struct wlp_tx_hdr *hdr)
|
||
|
{
|
||
|
return hdr->mac_params & 0x0f;
|
||
|
}
|
||
|
|
||
|
static inline int wlp_tx_hdr_ack_policy(const struct wlp_tx_hdr *hdr)
|
||
|
{
|
||
|
return (hdr->mac_params >> 4) & 0x07;
|
||
|
}
|
||
|
|
||
|
static inline int wlp_tx_hdr_rts_cts(const struct wlp_tx_hdr *hdr)
|
||
|
{
|
||
|
return (hdr->mac_params >> 7) & 0x01;
|
||
|
}
|
||
|
|
||
|
static inline void wlp_tx_hdr_set_delivery_id_type(struct wlp_tx_hdr *hdr, int id)
|
||
|
{
|
||
|
hdr->mac_params = (hdr->mac_params & ~0x0f) | id;
|
||
|
}
|
||
|
|
||
|
static inline void wlp_tx_hdr_set_ack_policy(struct wlp_tx_hdr *hdr,
|
||
|
enum uwb_ack_pol policy)
|
||
|
{
|
||
|
hdr->mac_params = (hdr->mac_params & ~0x70) | (policy << 4);
|
||
|
}
|
||
|
|
||
|
static inline void wlp_tx_hdr_set_rts_cts(struct wlp_tx_hdr *hdr, int rts_cts)
|
||
|
{
|
||
|
hdr->mac_params = (hdr->mac_params & ~0x80) | (rts_cts << 7);
|
||
|
}
|
||
|
|
||
|
static inline enum uwb_phy_rate wlp_tx_hdr_phy_rate(const struct wlp_tx_hdr *hdr)
|
||
|
{
|
||
|
return hdr->phy_params & 0x0f;
|
||
|
}
|
||
|
|
||
|
static inline int wlp_tx_hdr_tx_power(const struct wlp_tx_hdr *hdr)
|
||
|
{
|
||
|
return (hdr->phy_params >> 4) & 0x0f;
|
||
|
}
|
||
|
|
||
|
static inline void wlp_tx_hdr_set_phy_rate(struct wlp_tx_hdr *hdr, enum uwb_phy_rate rate)
|
||
|
{
|
||
|
hdr->phy_params = (hdr->phy_params & ~0x0f) | rate;
|
||
|
}
|
||
|
|
||
|
static inline void wlp_tx_hdr_set_tx_power(struct wlp_tx_hdr *hdr, int pwr)
|
||
|
{
|
||
|
hdr->phy_params = (hdr->phy_params & ~0xf0) | (pwr << 4);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* WLP RX header
|
||
|
*
|
||
|
* Provides UWB/WLP-specific transmission data for a received
|
||
|
* network packet.
|
||
|
*/
|
||
|
struct wlp_rx_hdr {
|
||
|
/* dword 0 */
|
||
|
struct uwb_dev_addr dstaddr;
|
||
|
struct uwb_dev_addr srcaddr;
|
||
|
/* dword 1 */
|
||
|
u8 LQI;
|
||
|
s8 RSSI;
|
||
|
u8 reserved3;
|
||
|
#ifndef WLP_HDR_FMT_2
|
||
|
u8 oui0;
|
||
|
/* dword 2 */
|
||
|
__le16 oui12;
|
||
|
__le16 prid;
|
||
|
#endif
|
||
|
} __attribute__((packed));
|
||
|
|
||
|
|
||
|
/** User configurable options for WLP */
|
||
|
struct wlp_options {
|
||
|
struct mutex mutex; /* access to user configurable options*/
|
||
|
struct wlp_tx_hdr def_tx_hdr; /* default tx hdr */
|
||
|
u8 pca_base_priority;
|
||
|
u8 bw_alloc; /*index into bw_allocs[] for PCA/DRP reservations*/
|
||
|
};
|
||
|
|
||
|
|
||
|
static inline
|
||
|
void wlp_options_init(struct wlp_options *options)
|
||
|
{
|
||
|
mutex_init(&options->mutex);
|
||
|
wlp_tx_hdr_set_ack_policy(&options->def_tx_hdr, UWB_ACK_INM);
|
||
|
wlp_tx_hdr_set_rts_cts(&options->def_tx_hdr, 1);
|
||
|
/* FIXME: default to phy caps */
|
||
|
wlp_tx_hdr_set_phy_rate(&options->def_tx_hdr, UWB_PHY_RATE_480);
|
||
|
#ifndef WLP_HDR_FMT_2
|
||
|
options->def_tx_hdr.prid = cpu_to_le16(0x0000);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
/* sysfs helpers */
|
||
|
|
||
|
extern ssize_t uwb_pca_base_priority_store(struct wlp_options *,
|
||
|
const char *, size_t);
|
||
|
extern ssize_t uwb_pca_base_priority_show(const struct wlp_options *, char *);
|
||
|
extern ssize_t uwb_bw_alloc_store(struct wlp_options *, const char *, size_t);
|
||
|
extern ssize_t uwb_bw_alloc_show(const struct wlp_options *, char *);
|
||
|
extern ssize_t uwb_ack_policy_store(struct wlp_options *,
|
||
|
const char *, size_t);
|
||
|
extern ssize_t uwb_ack_policy_show(const struct wlp_options *, char *);
|
||
|
extern ssize_t uwb_rts_cts_store(struct wlp_options *, const char *, size_t);
|
||
|
extern ssize_t uwb_rts_cts_show(const struct wlp_options *, char *);
|
||
|
extern ssize_t uwb_phy_rate_store(struct wlp_options *, const char *, size_t);
|
||
|
extern ssize_t uwb_phy_rate_show(const struct wlp_options *, char *);
|
||
|
|
||
|
|
||
|
/** Simple bandwidth allocation (temporary and too simple) */
|
||
|
struct wlp_bw_allocs {
|
||
|
const char *name;
|
||
|
struct {
|
||
|
u8 mask, stream;
|
||
|
} tx, rx;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif /* #ifndef __i1480_wlp_h__ */
|