Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb
* 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb: (31 commits) uwb: remove beacon cache entry after calling uwb_notify() uwb: remove unused include/linux/uwb/debug.h uwb: use print_hex_dump() uwb: use dev_dbg() for debug messages uwb: fix memory leak in uwb_rc_notif() wusb: fix oops when terminating a non-existant reservation uwb: fix oops when terminating an already terminated reservation uwb: improved MAS allocator and reservation conflict handling wusb: add debug files for ASL, PZL and DI to the whci-hcd driver uwb: fix oops in debug PAL's reservation callback uwb: clean up whci_wait_for() timeout error message wusb: whci-hcd shouldn't do ASL/PZL updates while channel is inactive uwb: remove unused beacon group join/leave events wlp: start/stop radio on network interface up/down uwb: add basic radio manager uwb: add pal parameter to new reservation callback uwb: fix races between events and neh timers uwb: don't unbind the radio controller driver when resetting uwb: per-radio controller event thread and beacon cache uwb: add commands to add/remove IEs to the debug interface ...
This commit is contained in:
@@ -51,6 +51,7 @@ enum {
|
||||
WUSB_REQ_GET_TIME = 25,
|
||||
WUSB_REQ_SET_STREAM_IDX = 26,
|
||||
WUSB_REQ_SET_WUSB_MAS = 27,
|
||||
WUSB_REQ_CHAN_STOP = 28,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/uwb/spec.h>
|
||||
|
||||
@@ -66,6 +67,7 @@ struct uwb_dev {
|
||||
struct uwb_dev_addr dev_addr;
|
||||
int beacon_slot;
|
||||
DECLARE_BITMAP(streams, UWB_NUM_STREAMS);
|
||||
DECLARE_BITMAP(last_availability_bm, UWB_NUM_MAS);
|
||||
};
|
||||
#define to_uwb_dev(d) container_of(d, struct uwb_dev, dev)
|
||||
|
||||
@@ -86,12 +88,31 @@ struct uwb_notifs_chain {
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
/* Beacon cache list */
|
||||
struct uwb_beca {
|
||||
struct list_head list;
|
||||
size_t entries;
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
/* Event handling thread. */
|
||||
struct uwbd {
|
||||
int pid;
|
||||
struct task_struct *task;
|
||||
wait_queue_head_t wq;
|
||||
struct list_head event_list;
|
||||
spinlock_t event_list_lock;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct uwb_mas_bm - a bitmap of all MAS in a superframe
|
||||
* @bm: a bitmap of length #UWB_NUM_MAS
|
||||
*/
|
||||
struct uwb_mas_bm {
|
||||
DECLARE_BITMAP(bm, UWB_NUM_MAS);
|
||||
DECLARE_BITMAP(unsafe_bm, UWB_NUM_MAS);
|
||||
int safe;
|
||||
int unsafe;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -117,14 +138,24 @@ struct uwb_mas_bm {
|
||||
* FIXME: further target states TBD.
|
||||
*/
|
||||
enum uwb_rsv_state {
|
||||
UWB_RSV_STATE_NONE,
|
||||
UWB_RSV_STATE_NONE = 0,
|
||||
UWB_RSV_STATE_O_INITIATED,
|
||||
UWB_RSV_STATE_O_PENDING,
|
||||
UWB_RSV_STATE_O_MODIFIED,
|
||||
UWB_RSV_STATE_O_ESTABLISHED,
|
||||
UWB_RSV_STATE_O_TO_BE_MOVED,
|
||||
UWB_RSV_STATE_O_MOVE_EXPANDING,
|
||||
UWB_RSV_STATE_O_MOVE_COMBINING,
|
||||
UWB_RSV_STATE_O_MOVE_REDUCING,
|
||||
UWB_RSV_STATE_T_ACCEPTED,
|
||||
UWB_RSV_STATE_T_DENIED,
|
||||
UWB_RSV_STATE_T_CONFLICT,
|
||||
UWB_RSV_STATE_T_PENDING,
|
||||
UWB_RSV_STATE_T_EXPANDING_ACCEPTED,
|
||||
UWB_RSV_STATE_T_EXPANDING_CONFLICT,
|
||||
UWB_RSV_STATE_T_EXPANDING_PENDING,
|
||||
UWB_RSV_STATE_T_EXPANDING_DENIED,
|
||||
UWB_RSV_STATE_T_RESIZED,
|
||||
|
||||
UWB_RSV_STATE_LAST,
|
||||
};
|
||||
@@ -149,6 +180,12 @@ struct uwb_rsv_target {
|
||||
};
|
||||
};
|
||||
|
||||
struct uwb_rsv_move {
|
||||
struct uwb_mas_bm final_mas;
|
||||
struct uwb_ie_drp *companion_drp_ie;
|
||||
struct uwb_mas_bm companion_mas;
|
||||
};
|
||||
|
||||
/*
|
||||
* Number of streams reserved for reservations targeted at DevAddrs.
|
||||
*/
|
||||
@@ -186,6 +223,7 @@ typedef void (*uwb_rsv_cb_f)(struct uwb_rsv *rsv);
|
||||
*
|
||||
* @status: negotiation status
|
||||
* @stream: stream index allocated for this reservation
|
||||
* @tiebreaker: conflict tiebreaker for this reservation
|
||||
* @mas: reserved MAS
|
||||
* @drp_ie: the DRP IE
|
||||
* @ie_valid: true iff the DRP IE matches the reservation parameters
|
||||
@@ -201,25 +239,29 @@ struct uwb_rsv {
|
||||
struct uwb_rc *rc;
|
||||
struct list_head rc_node;
|
||||
struct list_head pal_node;
|
||||
struct kref kref;
|
||||
|
||||
struct uwb_dev *owner;
|
||||
struct uwb_rsv_target target;
|
||||
enum uwb_drp_type type;
|
||||
int max_mas;
|
||||
int min_mas;
|
||||
int sparsity;
|
||||
int max_interval;
|
||||
bool is_multicast;
|
||||
|
||||
uwb_rsv_cb_f callback;
|
||||
void *pal_priv;
|
||||
|
||||
enum uwb_rsv_state state;
|
||||
bool needs_release_companion_mas;
|
||||
u8 stream;
|
||||
u8 tiebreaker;
|
||||
struct uwb_mas_bm mas;
|
||||
struct uwb_ie_drp *drp_ie;
|
||||
struct uwb_rsv_move mv;
|
||||
bool ie_valid;
|
||||
struct timer_list timer;
|
||||
bool expired;
|
||||
struct work_struct handle_timeout_work;
|
||||
};
|
||||
|
||||
static const
|
||||
@@ -261,6 +303,13 @@ struct uwb_drp_avail {
|
||||
bool ie_valid;
|
||||
};
|
||||
|
||||
struct uwb_drp_backoff_win {
|
||||
u8 window;
|
||||
u8 n;
|
||||
int total_expired;
|
||||
struct timer_list timer;
|
||||
bool can_reserve_extra_mases;
|
||||
};
|
||||
|
||||
const char *uwb_rsv_state_str(enum uwb_rsv_state state);
|
||||
const char *uwb_rsv_type_str(enum uwb_drp_type type);
|
||||
@@ -276,6 +325,8 @@ void uwb_rsv_terminate(struct uwb_rsv *rsv);
|
||||
|
||||
void uwb_rsv_accept(struct uwb_rsv *rsv, uwb_rsv_cb_f cb, void *pal_priv);
|
||||
|
||||
void uwb_rsv_get_usable_mas(struct uwb_rsv *orig_rsv, struct uwb_mas_bm *mas);
|
||||
|
||||
/**
|
||||
* Radio Control Interface instance
|
||||
*
|
||||
@@ -337,23 +388,33 @@ struct uwb_rc {
|
||||
u8 ctx_roll;
|
||||
|
||||
int beaconing; /* Beaconing state [channel number] */
|
||||
int beaconing_forced;
|
||||
int scanning;
|
||||
enum uwb_scan_type scan_type:3;
|
||||
unsigned ready:1;
|
||||
struct uwb_notifs_chain notifs_chain;
|
||||
struct uwb_beca uwb_beca;
|
||||
|
||||
struct uwbd uwbd;
|
||||
|
||||
struct uwb_drp_backoff_win bow;
|
||||
struct uwb_drp_avail drp_avail;
|
||||
struct list_head reservations;
|
||||
struct list_head cnflt_alien_list;
|
||||
struct uwb_mas_bm cnflt_alien_bitmap;
|
||||
struct mutex rsvs_mutex;
|
||||
spinlock_t rsvs_lock;
|
||||
struct workqueue_struct *rsv_workq;
|
||||
struct work_struct rsv_update_work;
|
||||
|
||||
struct delayed_work rsv_update_work;
|
||||
struct delayed_work rsv_alien_bp_work;
|
||||
int set_drp_ie_pending;
|
||||
struct mutex ies_mutex;
|
||||
struct uwb_rc_cmd_set_ie *ies;
|
||||
size_t ies_capacity;
|
||||
|
||||
spinlock_t pal_lock;
|
||||
struct list_head pals;
|
||||
int active_pals;
|
||||
|
||||
struct uwb_dbg *dbg;
|
||||
};
|
||||
@@ -361,11 +422,19 @@ struct uwb_rc {
|
||||
|
||||
/**
|
||||
* struct uwb_pal - a UWB PAL
|
||||
* @name: descriptive name for this PAL (wushc, wlp, etc.).
|
||||
* @name: descriptive name for this PAL (wusbhc, wlp, etc.).
|
||||
* @device: a device for the PAL. Used to link the PAL and the radio
|
||||
* controller in sysfs.
|
||||
* @rc: the radio controller the PAL uses.
|
||||
* @channel_changed: called when the channel used by the radio changes.
|
||||
* A channel of -1 means the channel has been stopped.
|
||||
* @new_rsv: called when a peer requests a reservation (may be NULL if
|
||||
* the PAL cannot accept reservation requests).
|
||||
* @channel: channel being used by the PAL; 0 if the PAL isn't using
|
||||
* the radio; -1 if the PAL wishes to use the radio but
|
||||
* cannot.
|
||||
* @debugfs_dir: a debugfs directory which the PAL can use for its own
|
||||
* debugfs files.
|
||||
*
|
||||
* A Protocol Adaptation Layer (PAL) is a user of the WiMedia UWB
|
||||
* radio platform (e.g., WUSB, WLP or Bluetooth UWB AMP).
|
||||
@@ -384,12 +453,21 @@ struct uwb_pal {
|
||||
struct list_head node;
|
||||
const char *name;
|
||||
struct device *device;
|
||||
void (*new_rsv)(struct uwb_rsv *rsv);
|
||||
struct uwb_rc *rc;
|
||||
|
||||
void (*channel_changed)(struct uwb_pal *pal, int channel);
|
||||
void (*new_rsv)(struct uwb_pal *pal, struct uwb_rsv *rsv);
|
||||
|
||||
int channel;
|
||||
struct dentry *debugfs_dir;
|
||||
};
|
||||
|
||||
void uwb_pal_init(struct uwb_pal *pal);
|
||||
int uwb_pal_register(struct uwb_rc *rc, struct uwb_pal *pal);
|
||||
void uwb_pal_unregister(struct uwb_rc *rc, struct uwb_pal *pal);
|
||||
int uwb_pal_register(struct uwb_pal *pal);
|
||||
void uwb_pal_unregister(struct uwb_pal *pal);
|
||||
|
||||
int uwb_radio_start(struct uwb_pal *pal);
|
||||
void uwb_radio_stop(struct uwb_pal *pal);
|
||||
|
||||
/*
|
||||
* General public API
|
||||
@@ -443,8 +521,6 @@ ssize_t uwb_rc_vcmd(struct uwb_rc *rc, const char *cmd_name,
|
||||
struct uwb_rccb *cmd, size_t cmd_size,
|
||||
u8 expected_type, u16 expected_event,
|
||||
struct uwb_rceb **preply);
|
||||
ssize_t uwb_rc_get_ie(struct uwb_rc *, struct uwb_rc_evt_get_ie **);
|
||||
int uwb_bg_joined(struct uwb_rc *rc);
|
||||
|
||||
size_t __uwb_addr_print(char *, size_t, const unsigned char *, int);
|
||||
|
||||
@@ -520,6 +596,8 @@ void uwb_rc_rm(struct uwb_rc *);
|
||||
void uwb_rc_neh_grok(struct uwb_rc *, void *, size_t);
|
||||
void uwb_rc_neh_error(struct uwb_rc *, int);
|
||||
void uwb_rc_reset_all(struct uwb_rc *rc);
|
||||
void uwb_rc_pre_reset(struct uwb_rc *rc);
|
||||
void uwb_rc_post_reset(struct uwb_rc *rc);
|
||||
|
||||
/**
|
||||
* uwb_rsv_is_owner - is the owner of this reservation the RC?
|
||||
@@ -531,7 +609,9 @@ static inline bool uwb_rsv_is_owner(struct uwb_rsv *rsv)
|
||||
}
|
||||
|
||||
/**
|
||||
* Events generated by UWB that can be passed to any listeners
|
||||
* enum uwb_notifs - UWB events that can be passed to any listeners
|
||||
* @UWB_NOTIF_ONAIR: a new neighbour has joined the beacon group.
|
||||
* @UWB_NOTIF_OFFAIR: a neighbour has left the beacon group.
|
||||
*
|
||||
* Higher layers can register callback functions with the radio
|
||||
* controller using uwb_notifs_register(). The radio controller
|
||||
@@ -539,8 +619,6 @@ static inline bool uwb_rsv_is_owner(struct uwb_rsv *rsv)
|
||||
* nodes when an event occurs.
|
||||
*/
|
||||
enum uwb_notifs {
|
||||
UWB_NOTIF_BG_JOIN = 0, /* radio controller joined a beacon group */
|
||||
UWB_NOTIF_BG_LEAVE = 1, /* radio controller left a beacon group */
|
||||
UWB_NOTIF_ONAIR,
|
||||
UWB_NOTIF_OFFAIR,
|
||||
};
|
||||
@@ -652,22 +730,9 @@ static inline int edc_inc(struct edc *err_hist, u16 max_err, u16 timeframe)
|
||||
|
||||
/* Information Element handling */
|
||||
|
||||
/* For representing the state of writing to a buffer when iterating */
|
||||
struct uwb_buf_ctx {
|
||||
char *buf;
|
||||
size_t bytes, size;
|
||||
};
|
||||
|
||||
typedef int (*uwb_ie_f)(struct uwb_dev *, const struct uwb_ie_hdr *,
|
||||
size_t, void *);
|
||||
struct uwb_ie_hdr *uwb_ie_next(void **ptr, size_t *len);
|
||||
ssize_t uwb_ie_for_each(struct uwb_dev *uwb_dev, uwb_ie_f fn, void *data,
|
||||
const void *buf, size_t size);
|
||||
int uwb_ie_dump_hex(struct uwb_dev *, const struct uwb_ie_hdr *,
|
||||
size_t, void *);
|
||||
int uwb_rc_set_ie(struct uwb_rc *, struct uwb_rc_cmd_set_ie *);
|
||||
struct uwb_ie_hdr *uwb_ie_next(void **ptr, size_t *len);
|
||||
|
||||
int uwb_rc_ie_add(struct uwb_rc *uwb_rc, const struct uwb_ie_hdr *ies, size_t size);
|
||||
int uwb_rc_ie_rm(struct uwb_rc *uwb_rc, enum uwb_ie element_id);
|
||||
|
||||
/*
|
||||
* Transmission statistics
|
||||
|
||||
@@ -32,6 +32,10 @@
|
||||
enum uwb_dbg_cmd_type {
|
||||
UWB_DBG_CMD_RSV_ESTABLISH = 1,
|
||||
UWB_DBG_CMD_RSV_TERMINATE = 2,
|
||||
UWB_DBG_CMD_IE_ADD = 3,
|
||||
UWB_DBG_CMD_IE_RM = 4,
|
||||
UWB_DBG_CMD_RADIO_START = 5,
|
||||
UWB_DBG_CMD_RADIO_STOP = 6,
|
||||
};
|
||||
|
||||
struct uwb_dbg_cmd_rsv_establish {
|
||||
@@ -39,18 +43,25 @@ struct uwb_dbg_cmd_rsv_establish {
|
||||
__u8 type;
|
||||
__u16 max_mas;
|
||||
__u16 min_mas;
|
||||
__u8 sparsity;
|
||||
__u8 max_interval;
|
||||
};
|
||||
|
||||
struct uwb_dbg_cmd_rsv_terminate {
|
||||
int index;
|
||||
};
|
||||
|
||||
struct uwb_dbg_cmd_ie {
|
||||
__u8 data[128];
|
||||
int len;
|
||||
};
|
||||
|
||||
struct uwb_dbg_cmd {
|
||||
__u32 type;
|
||||
union {
|
||||
struct uwb_dbg_cmd_rsv_establish rsv_establish;
|
||||
struct uwb_dbg_cmd_rsv_terminate rsv_terminate;
|
||||
struct uwb_dbg_cmd_ie ie_add;
|
||||
struct uwb_dbg_cmd_ie ie_rm;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
/*
|
||||
* Ultra Wide Band
|
||||
* Debug Support
|
||||
*
|
||||
* 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: doc
|
||||
* Invoke like:
|
||||
*
|
||||
* #define D_LOCAL 4
|
||||
* #include <linux/uwb/debug.h>
|
||||
*
|
||||
* At the end of your include files.
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
extern void dump_bytes(struct device *dev, const void *_buf, size_t rsize);
|
||||
|
||||
/* Master debug switch; !0 enables, 0 disables */
|
||||
#define D_MASTER (!0)
|
||||
|
||||
/* Local (per-file) debug switch; #define before #including */
|
||||
#ifndef D_LOCAL
|
||||
#define D_LOCAL 0
|
||||
#endif
|
||||
|
||||
#undef __d_printf
|
||||
#undef d_fnstart
|
||||
#undef d_fnend
|
||||
#undef d_printf
|
||||
#undef d_dump
|
||||
|
||||
#define __d_printf(l, _tag, _dev, f, a...) \
|
||||
do { \
|
||||
struct device *__dev = (_dev); \
|
||||
if (D_MASTER && D_LOCAL >= (l)) { \
|
||||
char __head[64] = ""; \
|
||||
if (_dev != NULL) { \
|
||||
if ((unsigned long)__dev < 4096) \
|
||||
printk(KERN_ERR "E: Corrupt dev %p\n", \
|
||||
__dev); \
|
||||
else \
|
||||
snprintf(__head, sizeof(__head), \
|
||||
"%s %s: ", \
|
||||
dev_driver_string(__dev), \
|
||||
__dev->bus_id); \
|
||||
} \
|
||||
printk(KERN_ERR "%s%s" _tag ": " f, __head, \
|
||||
__func__, ## a); \
|
||||
} \
|
||||
} while (0 && _dev)
|
||||
|
||||
#define d_fnstart(l, _dev, f, a...) \
|
||||
__d_printf(l, " FNSTART", _dev, f, ## a)
|
||||
#define d_fnend(l, _dev, f, a...) \
|
||||
__d_printf(l, " FNEND", _dev, f, ## a)
|
||||
#define d_printf(l, _dev, f, a...) \
|
||||
__d_printf(l, "", _dev, f, ## a)
|
||||
#define d_dump(l, _dev, ptr, size) \
|
||||
do { \
|
||||
struct device *__dev = _dev; \
|
||||
if (D_MASTER && D_LOCAL >= (l)) \
|
||||
dump_bytes(__dev, ptr, size); \
|
||||
} while (0 && _dev)
|
||||
#define d_test(l) (D_MASTER && D_LOCAL >= (l))
|
||||
@@ -58,6 +58,11 @@ enum { UWB_NUM_ZONES = 16 };
|
||||
*/
|
||||
#define UWB_MAS_PER_ZONE (UWB_NUM_MAS / UWB_NUM_ZONES)
|
||||
|
||||
/*
|
||||
* Number of MAS required before a row can be considered available.
|
||||
*/
|
||||
#define UWB_USABLE_MAS_PER_ROW (UWB_NUM_ZONES - 1)
|
||||
|
||||
/*
|
||||
* Number of streams per DRP reservation between a pair of devices.
|
||||
*
|
||||
@@ -93,6 +98,26 @@ enum { UWB_BEACON_SLOT_LENGTH_US = 85 };
|
||||
*/
|
||||
enum { UWB_MAX_LOST_BEACONS = 3 };
|
||||
|
||||
/*
|
||||
* mDRPBackOffWinMin
|
||||
*
|
||||
* The minimum number of superframes to wait before trying to reserve
|
||||
* extra MAS.
|
||||
*
|
||||
* [ECMA-368] section 17.16
|
||||
*/
|
||||
enum { UWB_DRP_BACKOFF_WIN_MIN = 2 };
|
||||
|
||||
/*
|
||||
* mDRPBackOffWinMax
|
||||
*
|
||||
* The maximum number of superframes to wait before trying to reserve
|
||||
* extra MAS.
|
||||
*
|
||||
* [ECMA-368] section 17.16
|
||||
*/
|
||||
enum { UWB_DRP_BACKOFF_WIN_MAX = 16 };
|
||||
|
||||
/*
|
||||
* Length of a superframe in microseconds.
|
||||
*/
|
||||
@@ -200,6 +225,12 @@ enum uwb_drp_reason {
|
||||
UWB_DRP_REASON_MODIFIED,
|
||||
};
|
||||
|
||||
/** Relinquish Request Reason Codes ([ECMA-368] table 113) */
|
||||
enum uwb_relinquish_req_reason {
|
||||
UWB_RELINQUISH_REQ_REASON_NON_SPECIFIC = 0,
|
||||
UWB_RELINQUISH_REQ_REASON_OVER_ALLOCATION,
|
||||
};
|
||||
|
||||
/**
|
||||
* DRP Notification Reason Codes (WHCI 0.95 [3.1.4.9])
|
||||
*/
|
||||
@@ -252,6 +283,7 @@ enum uwb_ie {
|
||||
UWB_APP_SPEC_PROBE_IE = 15,
|
||||
UWB_IDENTIFICATION_IE = 19,
|
||||
UWB_MASTER_KEY_ID_IE = 20,
|
||||
UWB_RELINQUISH_REQUEST_IE = 21,
|
||||
UWB_IE_WLP = 250, /* WiMedia Logical Link Control Protocol WLP 0.99 */
|
||||
UWB_APP_SPEC_IE = 255,
|
||||
};
|
||||
@@ -365,6 +397,27 @@ struct uwb_ie_drp_avail {
|
||||
DECLARE_BITMAP(bmp, UWB_NUM_MAS);
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Relinqish Request IE ([ECMA-368] section 16.8.19). */
|
||||
struct uwb_relinquish_request_ie {
|
||||
struct uwb_ie_hdr hdr;
|
||||
__le16 relinquish_req_control;
|
||||
struct uwb_dev_addr dev_addr;
|
||||
struct uwb_drp_alloc allocs[];
|
||||
} __attribute__((packed));
|
||||
|
||||
static inline int uwb_ie_relinquish_req_reason_code(struct uwb_relinquish_request_ie *ie)
|
||||
{
|
||||
return (le16_to_cpu(ie->relinquish_req_control) >> 0) & 0xf;
|
||||
}
|
||||
|
||||
static inline void uwb_ie_relinquish_req_set_reason_code(struct uwb_relinquish_request_ie *ie,
|
||||
int reason_code)
|
||||
{
|
||||
u16 ctrl = le16_to_cpu(ie->relinquish_req_control);
|
||||
ctrl = (ctrl & ~(0xf << 0)) | (reason_code << 0);
|
||||
ie->relinquish_req_control = cpu_to_le16(ctrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* The Vendor ID is set to an OUI that indicates the vendor of the device.
|
||||
* ECMA-368 [16.8.10]
|
||||
|
||||
@@ -89,6 +89,8 @@ struct umc_driver {
|
||||
void (*remove)(struct umc_dev *);
|
||||
int (*suspend)(struct umc_dev *, pm_message_t state);
|
||||
int (*resume)(struct umc_dev *);
|
||||
int (*pre_reset)(struct umc_dev *);
|
||||
int (*post_reset)(struct umc_dev *);
|
||||
|
||||
struct device_driver driver;
|
||||
};
|
||||
|
||||
@@ -646,6 +646,7 @@ struct wlp_wss {
|
||||
struct wlp {
|
||||
struct mutex mutex;
|
||||
struct uwb_rc *rc; /* UWB radio controller */
|
||||
struct net_device *ndev;
|
||||
struct uwb_pal pal;
|
||||
struct wlp_eda eda;
|
||||
struct wlp_uuid uuid;
|
||||
@@ -675,7 +676,7 @@ struct wlp_wss_attribute {
|
||||
static struct wlp_wss_attribute wss_attr_##_name = __ATTR(_name, _mode, \
|
||||
_show, _store)
|
||||
|
||||
extern int wlp_setup(struct wlp *, struct uwb_rc *);
|
||||
extern int wlp_setup(struct wlp *, struct uwb_rc *, struct net_device *ndev);
|
||||
extern void wlp_remove(struct wlp *);
|
||||
extern ssize_t wlp_neighborhood_show(struct wlp *, char *);
|
||||
extern int wlp_wss_setup(struct net_device *, struct wlp_wss *);
|
||||
|
||||
Reference in New Issue
Block a user