1183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/*
2183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Ultra Wide Band
3183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * UWB internal API
4183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
5183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Copyright (C) 2005-2006 Intel Corporation
6183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
7183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
8183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * This program is free software; you can redistribute it and/or
9183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * modify it under the terms of the GNU General Public License version
10183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * 2 as published by the Free Software Foundation.
11183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
12183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * This program is distributed in the hope that it will be useful,
13183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * but WITHOUT ANY WARRANTY; without even the implied warranty of
14183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * GNU General Public License for more details.
16183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
17183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * You should have received a copy of the GNU General Public License
18183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * along with this program; if not, write to the Free Software
19183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * 02110-1301, USA.
21183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
22183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * This contains most of the internal API for UWB. This is stuff used
23183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * across the stack that of course, is of no interest to the rest.
24183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
25183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Some parts might end up going public (like uwb_rc_*())...
26183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
27183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
28183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#ifndef __UWB_INTERNAL_H__
29183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#define __UWB_INTERNAL_H__
30183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
31183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#include <linux/kernel.h>
32183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#include <linux/device.h>
33183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#include <linux/uwb.h>
34183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#include <linux/mutex.h>
35183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
36183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_beca_e;
37183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
38183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* General device API */
39183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwb_dev_init(struct uwb_dev *uwb_dev);
40183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int __uwb_dev_offair(struct uwb_dev *, struct uwb_rc *);
41183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwb_dev_add(struct uwb_dev *uwb_dev, struct device *parent_dev,
42183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez		       struct uwb_rc *parent_rc);
43183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwb_dev_rm(struct uwb_dev *uwb_dev);
44183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwbd_dev_onair(struct uwb_rc *, struct uwb_beca_e *);
45183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwbd_dev_offair(struct uwb_beca_e *);
46183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_notify(struct uwb_rc *rc, struct uwb_dev *uwb_dev, enum uwb_notifs event);
47183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
48183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* General UWB Radio Controller Internal API */
49183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern struct uwb_rc *__uwb_rc_try_get(struct uwb_rc *);
50183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstatic inline struct uwb_rc *__uwb_rc_get(struct uwb_rc *rc)
51183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez{
52183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	uwb_dev_get(&rc->uwb_dev);
53183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	return rc;
54183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez}
55183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
56183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstatic inline void __uwb_rc_put(struct uwb_rc *rc)
57183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez{
58183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	uwb_dev_put(&rc->uwb_dev);
59183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez}
60183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
61183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwb_rc_reset(struct uwb_rc *rc);
62183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwb_rc_beacon(struct uwb_rc *rc,
63183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez			 int channel, unsigned bpst_offset);
64183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwb_rc_scan(struct uwb_rc *rc,
65183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez		       unsigned channel, enum uwb_scan_type type,
66183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez		       unsigned bpst_offset);
67183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwb_rc_send_all_drp_ie(struct uwb_rc *rc);
681cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabel
691cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabelvoid uwb_rc_ie_init(struct uwb_rc *);
701cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabelint uwb_rc_ie_setup(struct uwb_rc *);
711cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabelvoid uwb_rc_ie_release(struct uwb_rc *);
721cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabelint uwb_ie_dump_hex(const struct uwb_ie_hdr *ies, size_t len,
731cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabel		    char *buf, size_t size);
741cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabelint uwb_rc_set_ie(struct uwb_rc *, struct uwb_rc_cmd_set_ie *);
751cde7f68ced8d10a20dd2370e9d1d22ab3c1ea5cDavid Vrabel
76183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
77183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern const char *uwb_rc_strerror(unsigned code);
78183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
79183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/*
80183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Time to wait for a response to an RC command.
81183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
82183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Some commands can take a long time to response. e.g., START_BEACON
83183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * may scan for several superframes before joining an existing beacon
84183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * group and this can take around 600 ms.
85183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
86183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#define UWB_RC_CMD_TIMEOUT_MS 1000 /* ms */
87183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
88183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/*
89183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Notification/Event Handlers
90183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
91183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
92183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_rc_neh;
93183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
945b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaextern int uwb_rc_cmd_async(struct uwb_rc *rc, const char *cmd_name,
955b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella			    struct uwb_rccb *cmd, size_t cmd_size,
965b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella			    u8 expected_type, u16 expected_event,
975b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella			    uwb_rc_cmd_cb_f cb, void *arg);
985b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
995b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
100183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rc_neh_create(struct uwb_rc *rc);
101183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rc_neh_destroy(struct uwb_rc *rc);
102183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
103183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_rc_neh *uwb_rc_neh_add(struct uwb_rc *rc, struct uwb_rccb *cmd,
104183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez				  u8 expected_type, u16 expected_event,
105183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez				  uwb_rc_cmd_cb_f cb, void *arg);
106183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rc_neh_rm(struct uwb_rc *rc, struct uwb_rc_neh *neh);
107183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rc_neh_arm(struct uwb_rc *rc, struct uwb_rc_neh *neh);
108183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rc_neh_put(struct uwb_rc_neh *neh);
109183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
110183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* Event size tables */
111183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwb_est_create(void);
112183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwb_est_destroy(void);
113183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
1145b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella/*
1155b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella * UWB conflicting alien reservations
1165b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella */
1175b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellastruct uwb_cnflt_alien {
1185b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_rc *rc;
1195b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct list_head rc_node;
1205b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_mas_bm mas;
1215b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct timer_list timer;
1225b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct work_struct cnflt_update_work;
1235b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
1245b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
1255b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaenum uwb_uwb_rsv_alloc_result {
1265b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	UWB_RSV_ALLOC_FOUND = 0,
1275b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	UWB_RSV_ALLOC_NOT_FOUND,
1285b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
1295b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
1305b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaenum uwb_rsv_mas_status {
1315b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	UWB_RSV_MAS_NOT_AVAIL = 1,
1325b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	UWB_RSV_MAS_SAFE,
1335b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	UWB_RSV_MAS_UNSAFE,
1345b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
1355b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
1365b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellastruct uwb_rsv_col_set_info {
1375b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char start_col;
1385b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char interval;
1395b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char safe_mas_per_col;
1405b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char unsafe_mas_per_col;
1415b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
1425b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
1435b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellastruct uwb_rsv_col_info {
1445b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char max_avail_safe;
1455b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char max_avail_unsafe;
1465b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char highest_mas[UWB_MAS_PER_ZONE];
1475b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_rsv_col_set_info csi;
1485b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
1495b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
1505b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellastruct uwb_rsv_row_info {
1515b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char avail[UWB_MAS_PER_ZONE];
1525b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char free_rows;
1535b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char used_rows;
1545b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
1555b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella
1565b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella/*
1575b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella * UWB find allocation
1585b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella */
1595b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellastruct uwb_rsv_alloc_info {
1605b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	unsigned char bm[UWB_MAS_PER_ZONE * UWB_NUM_ZONES];
1615b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_rsv_col_info ci[UWB_NUM_ZONES];
1625b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_rsv_row_info ri;
1635b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_mas_bm *not_available;
1645b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	struct uwb_mas_bm *result;
1655b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int min_mas;
1665b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int max_mas;
1675b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int max_interval;
1685b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int total_allocated_mases;
1695b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int safe_allocated_mases;
1705b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int unsafe_allocated_mases;
1715b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella	int interval;
1725b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella};
173183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
1745b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaint uwb_rsv_find_best_allocation(struct uwb_rsv *rsv, struct uwb_mas_bm *available,
1755b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panella				 struct uwb_mas_bm *result);
1765b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_handle_drp_avail_change(struct uwb_rc *rc);
177183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/*
178183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * UWB Events & management daemon
179183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
180183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
181183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/**
182183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * enum uwb_event_type - types of UWB management daemon events
183183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
184183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * The UWB management daemon (uwbd) can receive two types of events:
185183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *   UWB_EVT_TYPE_NOTIF - notification from the radio controller.
186183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *   UWB_EVT_TYPE_MSG   - a simple message.
187183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
188183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezenum uwb_event_type {
189183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	UWB_EVT_TYPE_NOTIF,
190183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	UWB_EVT_TYPE_MSG,
191183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez};
192183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
193183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/**
194183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * struct uwb_event_notif - an event for a radio controller notification
195183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @size: Size of the buffer (ie: Guaranteed to contain at least
196183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *        a full 'struct uwb_rceb')
197183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @rceb: Pointer to a kmalloced() event payload
198183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
199183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_event_notif {
200183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	size_t size;
201183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct uwb_rceb *rceb;
202183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez};
203183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
204183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/**
205183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * enum uwb_event_message - an event for a message for asynchronous processing
206183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
207183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * UWB_EVT_MSG_RESET - reset the radio controller and all PAL hardware.
208183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
209183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezenum uwb_event_message {
210183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	UWB_EVT_MSG_RESET,
211183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez};
212183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
213183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/**
214183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * UWB Event
215183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @rc:         Radio controller that emitted the event (referenced)
216183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @ts_jiffies: Timestamp, when was it received
217183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @type:       This event's type.
218183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
219183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_event {
220183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct list_head list_node;
221183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct uwb_rc *rc;
222183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	unsigned long ts_jiffies;
223183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	enum uwb_event_type type;
224183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	union {
225183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez		struct uwb_event_notif notif;
226183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez		enum uwb_event_message message;
227183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	};
228183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez};
229183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
230fec1a5932f16c0eb1b3f5ca2e18d81d860924088Stefano Panellaextern void uwbd_start(struct uwb_rc *rc);
231fec1a5932f16c0eb1b3f5ca2e18d81d860924088Stefano Panellaextern void uwbd_stop(struct uwb_rc *rc);
232183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern struct uwb_event *uwb_event_alloc(size_t, gfp_t gfp_mask);
233183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwbd_event_queue(struct uwb_event *);
234183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwbd_flush(struct uwb_rc *rc);
235183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
236183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* UWB event handlers */
237c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panellaextern int uwbd_evt_handle_rc_ie_rcv(struct uwb_event *);
238183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwbd_evt_handle_rc_beacon(struct uwb_event *);
239183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwbd_evt_handle_rc_beacon_size(struct uwb_event *);
240183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwbd_evt_handle_rc_bpoie_change(struct uwb_event *);
241183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwbd_evt_handle_rc_bp_slot_change(struct uwb_event *);
242183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwbd_evt_handle_rc_drp(struct uwb_event *);
243183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern int uwbd_evt_handle_rc_drp_avail(struct uwb_event *);
244183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
245183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezint uwbd_msg_handle_reset(struct uwb_event *evt);
246183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
247183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
248183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/*
249183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Address management
250183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
251183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezint uwb_rc_dev_addr_assign(struct uwb_rc *rc);
252183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezint uwbd_evt_handle_rc_dev_addr_conflict(struct uwb_event *evt);
253183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
254183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/*
255183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * UWB Beacon Cache
256183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
257183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Each beacon we received is kept in a cache--when we receive that
258183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * beacon consistently, that means there is a new device that we have
259183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * to add to the system.
260183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
261183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
262183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern unsigned long beacon_timeout_ms;
263183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
264183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/**
265183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * Beacon cache entry
266183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
267183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @jiffies_refresh: last time a beacon was  received that refreshed
268183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *                   this cache entry.
269183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @uwb_dev: device connected to this beacon. This pointer is not
270183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *           safe, you need to get it with uwb_dev_try_get()
271183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *
272183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez * @hits: how many time we have seen this beacon since last time we
273183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez *        cleared it
274183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez */
275183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_beca_e {
276183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct mutex mutex;
277183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct kref refcnt;
278183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct list_head node;
279183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct uwb_mac_addr *mac_addr;
280183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct uwb_dev_addr dev_addr;
281183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	u8 hits;
282183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	unsigned long ts_jiffies;
283183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct uwb_dev *uwb_dev;
284183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct uwb_rc_evt_beacon *be;
285183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	struct stats lqe_stats, rssi_stats;	/* radio statistics */
286183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez};
287183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_beacon_frame;
288183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern ssize_t uwb_bce_print_IEs(struct uwb_dev *, struct uwb_beca_e *,
289183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez				 char *, size_t);
290183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
291183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern void uwb_bce_kfree(struct kref *_bce);
292183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstatic inline void uwb_bce_get(struct uwb_beca_e *bce)
293183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez{
294183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	kref_get(&bce->refcnt);
295183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez}
296183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstatic inline void uwb_bce_put(struct uwb_beca_e *bce)
297183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez{
298183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez	kref_put(&bce->refcnt, uwb_bce_kfree);
299183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez}
300fec1a5932f16c0eb1b3f5ca2e18d81d860924088Stefano Panellaextern void uwb_beca_purge(struct uwb_rc *rc);
301fec1a5932f16c0eb1b3f5ca2e18d81d860924088Stefano Panellaextern void uwb_beca_release(struct uwb_rc *rc);
302183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
303183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_dev *uwb_dev_get_by_devaddr(struct uwb_rc *rc,
304183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez				       const struct uwb_dev_addr *devaddr);
305183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_dev *uwb_dev_get_by_macaddr(struct uwb_rc *rc,
306183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez				       const struct uwb_mac_addr *macaddr);
307183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
3086fae35f9cea92793a98b2d9ab21235e5ae035581David Vrabelint uwb_radio_setup(struct uwb_rc *rc);
3096fae35f9cea92793a98b2d9ab21235e5ae035581David Vrabelvoid uwb_radio_reset_state(struct uwb_rc *rc);
3106fae35f9cea92793a98b2d9ab21235e5ae035581David Vrabelvoid uwb_radio_shutdown(struct uwb_rc *rc);
3116fae35f9cea92793a98b2d9ab21235e5ae035581David Vrabelint uwb_radio_force_channel(struct uwb_rc *rc, int channel);
3126fae35f9cea92793a98b2d9ab21235e5ae035581David Vrabel
313183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* -- UWB Sysfs representation */
314183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern struct class uwb_rc_class;
315183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern struct device_attribute dev_attr_mac_address;
316183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern struct device_attribute dev_attr_beacon;
317183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern struct device_attribute dev_attr_scan;
318183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
319183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* -- DRP Bandwidth allocator: bandwidth allocations, reservations, DRP */
320183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rsv_init(struct uwb_rc *rc);
321183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezint uwb_rsv_setup(struct uwb_rc *rc);
322183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rsv_cleanup(struct uwb_rc *rc);
323307ba6dd73254fe7d2ce27db64ffd90e1bb3c6c0David Vrabelvoid uwb_rsv_remove_all(struct uwb_rc *rc);
3245b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_get(struct uwb_rsv *rsv);
3255b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_put(struct uwb_rsv *rsv);
3265b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellabool uwb_rsv_has_two_drp_ies(struct uwb_rsv *rsv);
3275b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_dump(char *text, struct uwb_rsv *rsv);
3285b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaint uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available);
3295b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_backoff_win_timer(unsigned long arg);
3305b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_backoff_win_increment(struct uwb_rc *rc);
3315b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaint uwb_rsv_status(struct uwb_rsv *rsv);
3325b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellaint uwb_rsv_companion_status(struct uwb_rsv *rsv);
333183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
334183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rsv_set_state(struct uwb_rsv *rsv, enum uwb_rsv_state new_state);
335183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rsv_remove(struct uwb_rsv *rsv);
336183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstruct uwb_rsv *uwb_rsv_find(struct uwb_rc *rc, struct uwb_dev *src,
337183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez			     struct uwb_ie_drp *drp_ie);
338183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rsv_sched_update(struct uwb_rc *rc);
3395b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_rsv_queue_update(struct uwb_rc *rc);
340183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
341183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezint uwb_drp_ie_update(struct uwb_rsv *rsv);
342183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_drp_ie_to_bm(struct uwb_mas_bm *bm, const struct uwb_ie_drp *drp_ie);
343183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
344183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_drp_avail_init(struct uwb_rc *rc);
3455b37717a23b8e40f6cf7ad85a26ddcf41c171e2cStefano Panellavoid uwb_drp_available(struct uwb_rc *rc, struct uwb_mas_bm *avail);
346183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezint  uwb_drp_avail_reserve_pending(struct uwb_rc *rc, struct uwb_mas_bm *mas);
347183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_drp_avail_reserve(struct uwb_rc *rc, struct uwb_mas_bm *mas);
348183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_drp_avail_release(struct uwb_rc *rc, struct uwb_mas_bm *mas);
349183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_drp_avail_ie_update(struct uwb_rc *rc);
350183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
351183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* -- PAL support */
352183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_rc_pal_init(struct uwb_rc *rc);
353183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
354183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* -- Misc */
355183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
356183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezextern ssize_t uwb_mac_frame_hdr_print(char *, size_t,
357183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez				       const struct uwb_mac_frame_hdr *);
358183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
359183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez/* -- Debug interface */
360183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_dbg_init(void);
361183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_dbg_exit(void);
362183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_dbg_add_rc(struct uwb_rc *rc);
363183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezvoid uwb_dbg_del_rc(struct uwb_rc *rc);
364dcc7461eef7341e84e2f7274f904ce01a43b2506David Vrabelstruct dentry *uwb_dbg_create_pal_dir(struct uwb_pal *pal);
365183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
366183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstatic inline void uwb_dev_lock(struct uwb_dev *uwb_dev)
367183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez{
3688e9394ce2412254ec69fd2a4f3e44a66eade2297Greg Kroah-Hartman	device_lock(&uwb_dev->dev);
369183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez}
370183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
371183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalezstatic inline void uwb_dev_unlock(struct uwb_dev *uwb_dev)
372183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez{
3738e9394ce2412254ec69fd2a4f3e44a66eade2297Greg Kroah-Hartman	device_unlock(&uwb_dev->dev);
374183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez}
375183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez
376183b9b592a622a7719ee38e275fd7ff3aaf74d0dInaky Perez-Gonzalez#endif /* #ifndef __UWB_INTERNAL_H__ */
377