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