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__ */
							 |