1c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella/* 2c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * Ultra Wide Band 3c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * IE Received notification handling. 4c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * 5c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * Copyright (C) 2008 Cambridge Silicon Radio Ltd. 6c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * 7c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * This program is free software; you can redistribute it and/or 8c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * modify it under the terms of the GNU General Public License version 9c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * 2 as published by the Free Software Foundation. 10c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * 11c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * This program is distributed in the hope that it will be useful, 12c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * but WITHOUT ANY WARRANTY; without even the implied warranty of 13c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * GNU General Public License for more details. 15c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * 16c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * You should have received a copy of the GNU General Public License 17c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * along with this program. If not, see <http://www.gnu.org/licenses/>. 18c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella */ 19c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella 20c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella#include <linux/errno.h> 21c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella#include <linux/module.h> 22c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella#include <linux/device.h> 23c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella#include <linux/bitmap.h> 24c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella#include "uwb-internal.h" 25c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella 26c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella/* 27c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella * Process an incoming IE Received notification. 28c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella */ 29c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panellaint uwbd_evt_handle_rc_ie_rcv(struct uwb_event *evt) 30c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella{ 31c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella int result = -EINVAL; 32c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella struct device *dev = &evt->rc->uwb_dev.dev; 33c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella struct uwb_rc_evt_ie_rcv *iercv; 34c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella 35c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella /* Is there enough data to decode it? */ 36c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella if (evt->notif.size < sizeof(*iercv)) { 37c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella dev_err(dev, "IE Received notification: Not enough data to " 38c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella "decode (%zu vs %zu bytes needed)\n", 39c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella evt->notif.size, sizeof(*iercv)); 40c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella goto error; 41c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella } 42c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella iercv = container_of(evt->notif.rceb, struct uwb_rc_evt_ie_rcv, rceb); 43c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella 44c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella dev_dbg(dev, "IE received, element ID=%d\n", iercv->IEData[0]); 45c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella 46c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella if (iercv->IEData[0] == UWB_RELINQUISH_REQUEST_IE) { 47c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella dev_warn(dev, "unhandled Relinquish Request IE\n"); 48c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella } 49c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella 50c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella return 0; 51c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panellaerror: 52c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella return result; 53c5995bd2819dc577d0b32b26be0836d16c977e24Stefano Panella} 54