Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

uwb: infrastructure for handling Relinquish Request IEs

The structures and event handler needed to handle Relinish Request IEs
received from neighbors. Nothing is done with these IEs yet.

Signed-off-by: Stefano Panella <stefano.panella@csr.com>
Signed-off-by: David Vrabel <david.vrabel@csr.com>

authored by

Stefano Panella and committed by
David Vrabel
c5995bd2 f88518d1

+89
+1
drivers/uwb/Makefile
··· 13 13 drp-ie.o \ 14 14 est.o \ 15 15 ie.o \ 16 + ie-rcv.o \ 16 17 lc-dev.o \ 17 18 lc-rc.o \ 18 19 neh.o \
+55
drivers/uwb/ie-rcv.c
··· 1 + /* 2 + * Ultra Wide Band 3 + * IE Received notification handling. 4 + * 5 + * Copyright (C) 2008 Cambridge Silicon Radio Ltd. 6 + * 7 + * This program is free software; you can redistribute it and/or 8 + * modify it under the terms of the GNU General Public License version 9 + * 2 as published by the Free Software Foundation. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + 20 + #include <linux/errno.h> 21 + #include <linux/module.h> 22 + #include <linux/device.h> 23 + #include <linux/bitmap.h> 24 + #include "uwb-internal.h" 25 + 26 + /* 27 + * Process an incoming IE Received notification. 28 + */ 29 + int uwbd_evt_handle_rc_ie_rcv(struct uwb_event *evt) 30 + { 31 + int result = -EINVAL; 32 + struct device *dev = &evt->rc->uwb_dev.dev; 33 + struct uwb_rc_evt_ie_rcv *iercv; 34 + size_t iesize; 35 + 36 + /* Is there enough data to decode it? */ 37 + if (evt->notif.size < sizeof(*iercv)) { 38 + dev_err(dev, "IE Received notification: Not enough data to " 39 + "decode (%zu vs %zu bytes needed)\n", 40 + evt->notif.size, sizeof(*iercv)); 41 + goto error; 42 + } 43 + iercv = container_of(evt->notif.rceb, struct uwb_rc_evt_ie_rcv, rceb); 44 + iesize = le16_to_cpu(iercv->wIELength); 45 + 46 + dev_dbg(dev, "IE received, element ID=%d\n", iercv->IEData[0]); 47 + 48 + if (iercv->IEData[0] == UWB_RELINQUISH_REQUEST_IE) { 49 + dev_warn(dev, "unhandled Relinquish Request IE\n"); 50 + } 51 + 52 + return 0; 53 + error: 54 + return result; 55 + }
+1
drivers/uwb/uwb-internal.h
··· 167 167 void uwbd_flush(struct uwb_rc *rc); 168 168 169 169 /* UWB event handlers */ 170 + extern int uwbd_evt_handle_rc_ie_rcv(struct uwb_event *); 170 171 extern int uwbd_evt_handle_rc_beacon(struct uwb_event *); 171 172 extern int uwbd_evt_handle_rc_beacon_size(struct uwb_event *); 172 173 extern int uwbd_evt_handle_rc_bpoie_change(struct uwb_event *);
+4
drivers/uwb/uwbd.c
··· 104 104 /** Table of handlers for and properties of the UWBD Radio Control Events */ 105 105 static 106 106 struct uwbd_event uwbd_events[] = { 107 + [UWB_RC_EVT_IE_RCV] = { 108 + .handler = uwbd_evt_handle_rc_ie_rcv, 109 + .name = "IE_RECEIVED" 110 + }, 107 111 [UWB_RC_EVT_BEACON] = { 108 112 .handler = uwbd_evt_handle_rc_beacon, 109 113 .name = "BEACON_RECEIVED"
+28
include/linux/uwb/spec.h
··· 200 200 UWB_DRP_REASON_MODIFIED, 201 201 }; 202 202 203 + /** Relinquish Request Reason Codes ([ECMA-368] table 113) */ 204 + enum uwb_relinquish_req_reason { 205 + UWB_RELINQUISH_REQ_REASON_NON_SPECIFIC = 0, 206 + UWB_RELINQUISH_REQ_REASON_OVER_ALLOCATION, 207 + }; 208 + 203 209 /** 204 210 * DRP Notification Reason Codes (WHCI 0.95 [3.1.4.9]) 205 211 */ ··· 258 252 UWB_APP_SPEC_PROBE_IE = 15, 259 253 UWB_IDENTIFICATION_IE = 19, 260 254 UWB_MASTER_KEY_ID_IE = 20, 255 + UWB_RELINQUISH_REQUEST_IE = 21, 261 256 UWB_IE_WLP = 250, /* WiMedia Logical Link Control Protocol WLP 0.99 */ 262 257 UWB_APP_SPEC_IE = 255, 263 258 }; ··· 371 364 struct uwb_ie_hdr hdr; 372 365 DECLARE_BITMAP(bmp, UWB_NUM_MAS); 373 366 } __attribute__((packed)); 367 + 368 + /* Relinqish Request IE ([ECMA-368] section 16.8.19). */ 369 + struct uwb_relinquish_request_ie { 370 + struct uwb_ie_hdr hdr; 371 + __le16 relinquish_req_control; 372 + struct uwb_dev_addr dev_addr; 373 + struct uwb_drp_alloc allocs[]; 374 + } __attribute__((packed)); 375 + 376 + static inline int uwb_ie_relinquish_req_reason_code(struct uwb_relinquish_request_ie *ie) 377 + { 378 + return (le16_to_cpu(ie->relinquish_req_control) >> 0) & 0xf; 379 + } 380 + 381 + static inline void uwb_ie_relinquish_req_set_reason_code(struct uwb_relinquish_request_ie *ie, 382 + int reason_code) 383 + { 384 + u16 ctrl = le16_to_cpu(ie->relinquish_req_control); 385 + ctrl = (ctrl & ~(0xf << 0)) | (reason_code << 0); 386 + ie->relinquish_req_control = cpu_to_le16(ctrl); 387 + } 374 388 375 389 /** 376 390 * The Vendor ID is set to an OUI that indicates the vendor of the device.