diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-28 16:07:24 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-28 16:07:24 -0700 |
| commit | 37f501468f6d38e28f8707e344666f1476238b83 (patch) | |
| tree | be7a4bd494dbf1dfea692525c9ef591b5f791878 /usb | |
| parent | b42b48cf3939e0dd81ab8932b7e6359028eab329 (diff) | |
| download | patches-37f501468f6d38e28f8707e344666f1476238b83.tar.gz | |
bus id fun
Diffstat (limited to 'usb')
| -rw-r--r-- | usb/uwb-add-the-uwb-include-files.patch | 290 | ||||
| -rw-r--r-- | usb/uwb-add-umc-bus.patch | 9 | ||||
| -rw-r--r-- | usb/uwb-add-whci-enumerator.patch | 2 | ||||
| -rw-r--r-- | usb/uwb-stack-core.patch | 14 | ||||
| -rw-r--r-- | usb/uwb-stack-debug.patch | 2 | ||||
| -rw-r--r-- | usb/uwb-stack-reservation-manager.patch | 474 | ||||
| -rw-r--r-- | usb/wusb-whci-hcd-driver.patch | 2 |
7 files changed, 396 insertions, 397 deletions
diff --git a/usb/uwb-add-the-uwb-include-files.patch b/usb/uwb-add-the-uwb-include-files.patch index a79e7e4e13bd0a..9d0dc54f9da1fd 100644 --- a/usb/uwb-add-the-uwb-include-files.patch +++ b/usb/uwb-add-the-uwb-include-files.patch @@ -21,6 +21,151 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> 5 files changed, 2251 insertions(+) --- /dev/null ++++ b/include/linux/uwb/debug-cmd.h +@@ -0,0 +1,57 @@ ++/* ++ * Ultra Wide Band ++ * Debug interface commands ++ * ++ * Copyright (C) 2008 Cambridge Silicon Radio Ltd. ++ * ++ * 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, see <http://www.gnu.org/licenses/>. ++ */ ++#ifndef __LINUX__UWB__DEBUG_CMD_H__ ++#define __LINUX__UWB__DEBUG_CMD_H__ ++ ++#include <linux/types.h> ++ ++/* ++ * Debug interface commands ++ * ++ * UWB_DBG_CMD_RSV_ESTABLISH: Establish a new unicast reservation. ++ * ++ * UWB_DBG_CMD_RSV_TERMINATE: Terminate the Nth reservation. ++ */ ++ ++enum uwb_dbg_cmd_type { ++ UWB_DBG_CMD_RSV_ESTABLISH = 1, ++ UWB_DBG_CMD_RSV_TERMINATE = 2, ++}; ++ ++struct uwb_dbg_cmd_rsv_establish { ++ __u8 target[6]; ++ __u8 type; ++ __u16 max_mas; ++ __u16 min_mas; ++ __u8 sparsity; ++}; ++ ++struct uwb_dbg_cmd_rsv_terminate { ++ int index; ++}; ++ ++struct uwb_dbg_cmd { ++ __u32 type; ++ union { ++ struct uwb_dbg_cmd_rsv_establish rsv_establish; ++ struct uwb_dbg_cmd_rsv_terminate rsv_terminate; ++ }; ++}; ++ ++#endif /* #ifndef __LINUX__UWB__DEBUG_CMD_H__ */ +--- /dev/null ++++ b/include/linux/uwb/debug.h +@@ -0,0 +1,82 @@ ++/* ++ * 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_name(__dev)); \ ++ } \ ++ 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)) +--- /dev/null +++ b/include/linux/uwb.h @@ -0,0 +1,759 @@ +/* @@ -783,151 +928,6 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +#endif /* #ifndef __LINUX__UWB_H__ */ --- /dev/null -+++ b/include/linux/uwb/debug-cmd.h -@@ -0,0 +1,57 @@ -+/* -+ * Ultra Wide Band -+ * Debug interface commands -+ * -+ * Copyright (C) 2008 Cambridge Silicon Radio Ltd. -+ * -+ * 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, see <http://www.gnu.org/licenses/>. -+ */ -+#ifndef __LINUX__UWB__DEBUG_CMD_H__ -+#define __LINUX__UWB__DEBUG_CMD_H__ -+ -+#include <linux/types.h> -+ -+/* -+ * Debug interface commands -+ * -+ * UWB_DBG_CMD_RSV_ESTABLISH: Establish a new unicast reservation. -+ * -+ * UWB_DBG_CMD_RSV_TERMINATE: Terminate the Nth reservation. -+ */ -+ -+enum uwb_dbg_cmd_type { -+ UWB_DBG_CMD_RSV_ESTABLISH = 1, -+ UWB_DBG_CMD_RSV_TERMINATE = 2, -+}; -+ -+struct uwb_dbg_cmd_rsv_establish { -+ __u8 target[6]; -+ __u8 type; -+ __u16 max_mas; -+ __u16 min_mas; -+ __u8 sparsity; -+}; -+ -+struct uwb_dbg_cmd_rsv_terminate { -+ int index; -+}; -+ -+struct uwb_dbg_cmd { -+ __u32 type; -+ union { -+ struct uwb_dbg_cmd_rsv_establish rsv_establish; -+ struct uwb_dbg_cmd_rsv_terminate rsv_terminate; -+ }; -+}; -+ -+#endif /* #ifndef __LINUX__UWB__DEBUG_CMD_H__ */ ---- /dev/null -+++ b/include/linux/uwb/debug.h -@@ -0,0 +1,82 @@ -+/* -+ * 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)) ---- /dev/null +++ b/include/linux/uwb/spec.h @@ -0,0 +1,625 @@ +/* diff --git a/usb/uwb-add-umc-bus.patch b/usb/uwb-add-umc-bus.patch index b86155babd3a8f..1ab67a5c2b5f0b 100644 --- a/usb/uwb-add-umc-bus.patch +++ b/usb/uwb-add-umc-bus.patch @@ -18,10 +18,10 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- drivers/uwb/Makefile | 6 + drivers/uwb/umc-bus.c | 185 +++++++++++++++++++++++++++++++++++++++++++++ - drivers/uwb/umc-dev.c | 104 +++++++++++++++++++++++++ + drivers/uwb/umc-dev.c | 103 +++++++++++++++++++++++++ drivers/uwb/umc-drv.c | 31 +++++++ include/linux/uwb/umc.h | 194 ++++++++++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 520 insertions(+) + 5 files changed, 519 insertions(+) --- a/drivers/uwb/Makefile +++ b/drivers/uwb/Makefile @@ -230,7 +230,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +MODULE_LICENSE("GPL"); --- /dev/null +++ b/drivers/uwb/umc-dev.c -@@ -0,0 +1,104 @@ +@@ -0,0 +1,103 @@ +/* + * UWB Multi-interface Controller device management. + * @@ -264,8 +264,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + + umc = kzalloc(sizeof(struct umc_dev), GFP_KERNEL); + if (umc) { -+ snprintf(umc->dev.bus_id, sizeof(umc->dev.bus_id), "%s-%d", -+ parent->bus_id, n); ++ dev_set_name(&umc->dev, "%s-%d", dev_name(parent), n); + umc->dev.parent = parent; + umc->dev.bus = &umc_bus_type; + umc->dev.release = umc_device_release; diff --git a/usb/uwb-add-whci-enumerator.patch b/usb/uwb-add-whci-enumerator.patch index ae5da5d8b6d142..aa7e872310188b 100644 --- a/usb/uwb-add-whci-enumerator.patch +++ b/usb/uwb-add-whci-enumerator.patch @@ -148,7 +148,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + + UWBCAPDATA_TO_OFFSET(capdata); + umc->resource.end = umc->resource.start + + (n == 0? 0x20 : UWBCAPDATA_TO_SIZE(capdata)) - 1; -+ umc->resource.name = umc->dev.bus_id; ++ umc->resource.name = dev_name(&umc->dev); + umc->resource.flags = card->pci->resource[bar].flags; + umc->resource.parent = &card->pci->resource[bar]; + umc->irq = card->pci->irq; diff --git a/usb/uwb-stack-core.patch b/usb/uwb-stack-core.patch index 989d80f0a545ab..bb12fb9ac15945 100644 --- a/usb/uwb-stack-core.patch +++ b/usb/uwb-stack-core.patch @@ -525,13 +525,13 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + mutex_lock(&uwb_dev->mutex); + dev = &uwb_dev->dev; + uwb_dev->rc = parent_rc; -+ if (dev->bus_id[0] == 0) /* radios print their own! */ -+ uwb_mac_addr_print(dev->bus_id, sizeof(dev->bus_id), ++ if (strlen(dev_name(dev)) == 0) /* radios print their own! */ ++ uwb_mac_addr_print((char *)dev_name(dev), strlen(dev_name(dev)), + &uwb_dev->mac_addr); + result = __uwb_dev_sys_add(uwb_dev, parent_dev); + if (result < 0) + printk(KERN_ERR "UWB: unable to register dev %s with sysfs: %d\n", -+ dev->bus_id, result); ++ dev_name(dev), result); + mutex_unlock(&uwb_dev->mutex); + return result; +} @@ -588,7 +588,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + dev_info(dev, "uwb device (mac %s dev %s) disconnected from %s %s\n", + macbuf, devbuf, + rc? rc->uwb_dev.dev.parent->bus->name : "n/a", -+ rc? rc->uwb_dev.dev.parent->bus_id : ""); ++ rc? dev_name(rc->uwb_dev.dev.parent) : ""); + uwb_dev_rm(uwb_dev); + uwb_dev_put(uwb_dev); /* for the creation in _onair() */ + d_fnend(3, NULL, "(dev %p [uwb_dev %p], uwb_rc %p) = 0\n", dev, uwb_dev, rc); @@ -663,7 +663,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + uwb_bce_get(bce); /* released in uwb_dev_sys_release() */ + dev_info(dev, "uwb device (mac %s dev %s) connected to %s %s\n", + macbuf, devbuf, rc->uwb_dev.dev.parent->bus->name, -+ rc->uwb_dev.dev.parent->bus_id); ++ dev_name(rc->uwb_dev.dev.parent)); + uwb_notify(rc, uwb_dev, UWB_NOTIF_ONAIR); + return; + @@ -936,7 +936,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + mutex_unlock(&uwb_rcs.mutex); + + dev = &rc->uwb_dev.dev; -+ snprintf(dev->bus_id, sizeof(dev->bus_id), "uwb%d", (int)rc_count); ++ dev_set_name(dev, "uwb%d", (int)rc_count); + + rc->priv = priv; + rc->cmd = cmd; @@ -964,7 +964,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + uwb_dev_addr_print(devbuf, sizeof(devbuf), &rc->uwb_dev.dev_addr); + dev_info(dev, + "new uwb radio controller (mac %s dev %s) on %s %s\n", -+ macbuf, devbuf, parent_dev->bus->name, parent_dev->bus_id); ++ macbuf, devbuf, parent_dev->bus->name, dev_name(parent_dev)); + rc->ready = 1; + return 0; + diff --git a/usb/uwb-stack-debug.patch b/usb/uwb-stack-debug.patch index eb79efc446077c..7f0c7e17853740 100644 --- a/usb/uwb-stack-debug.patch +++ b/usb/uwb-stack-debug.patch @@ -330,7 +330,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + rc->dbg->pal.new_rsv = uwb_dbg_new_rsv; + uwb_pal_register(rc, &rc->dbg->pal); + if (root_dir) { -+ rc->dbg->root_d = debugfs_create_dir(rc->uwb_dev.dev.bus_id, ++ rc->dbg->root_d = debugfs_create_dir(dev_name(&rc->uwb_dev.dev), + root_dir); + rc->dbg->command_f = debugfs_create_file("command", 0200, + rc->dbg->root_d, rc, diff --git a/usb/uwb-stack-reservation-manager.patch b/usb/uwb-stack-reservation-manager.patch index 0768b1d66c160e..78b78ddfbd5258 100644 --- a/usb/uwb-stack-reservation-manager.patch +++ b/usb/uwb-stack-reservation-manager.patch @@ -313,242 +313,6 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + return 0; +} --- /dev/null -+++ b/drivers/uwb/drp-ie.c -@@ -0,0 +1,233 @@ -+/* -+ * UWB DRP IE management. -+ * -+ * Copyright (C) 2005-2006 Intel Corporation -+ * Copyright (C) 2008 Cambridge Silicon Radio Ltd. -+ * -+ * 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, see <http://www.gnu.org/licenses/>. -+ */ -+#include <linux/version.h> -+#include <linux/kernel.h> -+#include <linux/random.h> -+#include <linux/uwb.h> -+ -+#include "uwb-internal.h" -+ -+/* -+ * Allocate a DRP IE. -+ * -+ * To save having to free/allocate a DRP IE when its MAS changes, -+ * enough memory is allocated for the maxiumum number of DRP -+ * allocation fields. This gives an overhead per reservation of up to -+ * (UWB_NUM_ZONES - 1) * 4 = 60 octets. -+ */ -+static struct uwb_ie_drp *uwb_drp_ie_alloc(void) -+{ -+ struct uwb_ie_drp *drp_ie; -+ unsigned tiebreaker; -+ -+ drp_ie = kzalloc(sizeof(struct uwb_ie_drp) + -+ UWB_NUM_ZONES * sizeof(struct uwb_drp_alloc), -+ GFP_KERNEL); -+ if (drp_ie) { -+ drp_ie->hdr.element_id = UWB_IE_DRP; -+ -+ get_random_bytes(&tiebreaker, sizeof(unsigned)); -+ drp_ie->tiebreaker = tiebreaker & 1; -+ } -+ return drp_ie; -+} -+ -+ -+/* -+ * Fill a DRP IE's allocation fields from a MAS bitmap. -+ */ -+static void uwb_drp_ie_from_bm(struct uwb_ie_drp *drp_ie, -+ struct uwb_mas_bm *mas) -+{ -+ int z, i, num_fields = 0, next = 0; -+ struct uwb_drp_alloc *zones; -+ __le16 current_bmp; -+ DECLARE_BITMAP(tmp_bmp, UWB_NUM_MAS); -+ DECLARE_BITMAP(tmp_mas_bm, UWB_MAS_PER_ZONE); -+ -+ zones = drp_ie->allocs; -+ -+ bitmap_copy(tmp_bmp, mas->bm, UWB_NUM_MAS); -+ -+ /* Determine unique MAS bitmaps in zones from bitmap. */ -+ for (z = 0; z < UWB_NUM_ZONES; z++) { -+ bitmap_copy(tmp_mas_bm, tmp_bmp, UWB_MAS_PER_ZONE); -+ if (bitmap_weight(tmp_mas_bm, UWB_MAS_PER_ZONE) > 0) { -+ bool found = false; -+ current_bmp = (__le16) *tmp_mas_bm; -+ for (i = 0; i < next; i++) { -+ if (current_bmp == zones[i].mas_bm) { -+ zones[i].zone_bm |= 1 << z; -+ found = true; -+ break; -+ } -+ } -+ if (!found) { -+ num_fields++; -+ zones[next].zone_bm = 1 << z; -+ zones[next].mas_bm = current_bmp; -+ next++; -+ } -+ } -+ bitmap_shift_right(tmp_bmp, tmp_bmp, UWB_MAS_PER_ZONE, UWB_NUM_MAS); -+ } -+ -+ /* Store in format ready for transmission (le16). */ -+ for (i = 0; i < num_fields; i++) { -+ drp_ie->allocs[i].zone_bm = cpu_to_le16(zones[i].zone_bm); -+ drp_ie->allocs[i].mas_bm = cpu_to_le16(zones[i].mas_bm); -+ } -+ -+ drp_ie->hdr.length = sizeof(struct uwb_ie_drp) - sizeof(struct uwb_ie_hdr) -+ + num_fields * sizeof(struct uwb_drp_alloc); -+} -+ -+/** -+ * uwb_drp_ie_update - update a reservation's DRP IE -+ * @rsv: the reservation -+ */ -+int uwb_drp_ie_update(struct uwb_rsv *rsv) -+{ -+ struct device *dev = &rsv->rc->uwb_dev.dev; -+ struct uwb_ie_drp *drp_ie; -+ int reason_code, status; -+ -+ switch (rsv->state) { -+ case UWB_RSV_STATE_NONE: -+ kfree(rsv->drp_ie); -+ rsv->drp_ie = NULL; -+ return 0; -+ case UWB_RSV_STATE_O_INITIATED: -+ reason_code = UWB_DRP_REASON_ACCEPTED; -+ status = 0; -+ break; -+ case UWB_RSV_STATE_O_PENDING: -+ reason_code = UWB_DRP_REASON_ACCEPTED; -+ status = 0; -+ break; -+ case UWB_RSV_STATE_O_MODIFIED: -+ reason_code = UWB_DRP_REASON_MODIFIED; -+ status = 1; -+ break; -+ case UWB_RSV_STATE_O_ESTABLISHED: -+ reason_code = UWB_DRP_REASON_ACCEPTED; -+ status = 1; -+ break; -+ case UWB_RSV_STATE_T_ACCEPTED: -+ reason_code = UWB_DRP_REASON_ACCEPTED; -+ status = 1; -+ break; -+ case UWB_RSV_STATE_T_DENIED: -+ reason_code = UWB_DRP_REASON_DENIED; -+ status = 0; -+ break; -+ default: -+ dev_dbg(dev, "rsv with unhandled state (%d)\n", rsv->state); -+ return -EINVAL; -+ } -+ -+ if (rsv->drp_ie == NULL) { -+ rsv->drp_ie = uwb_drp_ie_alloc(); -+ if (rsv->drp_ie == NULL) -+ return -ENOMEM; -+ } -+ drp_ie = rsv->drp_ie; -+ -+ drp_ie->owner = uwb_rsv_is_owner(rsv); -+ drp_ie->status = status; -+ drp_ie->reason_code = reason_code; -+ drp_ie->stream_index = rsv->stream; -+ drp_ie->type = rsv->type; -+ drp_ie->DRP_Control = cpu_to_le16(drp_ie->DRP_Control); -+ -+ if (uwb_rsv_is_owner(rsv)) { -+ switch (rsv->target.type) { -+ case UWB_RSV_TARGET_DEV: -+ drp_ie->dev_addr = rsv->target.dev->dev_addr; -+ break; -+ case UWB_RSV_TARGET_DEVADDR: -+ drp_ie->dev_addr = rsv->target.devaddr; -+ break; -+ } -+ } else -+ drp_ie->dev_addr = rsv->owner->dev_addr; -+ -+ uwb_drp_ie_from_bm(drp_ie, &rsv->mas); -+ -+ rsv->ie_valid = true; -+ return 0; -+} -+ -+/* -+ * Set MAS bits from given MAS bitmap in a single zone of large bitmap. -+ * -+ * We are given a zone id and the MAS bitmap of bits that need to be set in -+ * this zone. Note that this zone may already have bits set and this only -+ * adds settings - we cannot simply assign the MAS bitmap contents to the -+ * zone contents. We iterate over the the bits (MAS) in the zone and set the -+ * bits that are set in the given MAS bitmap. -+ */ -+static -+void uwb_drp_ie_single_zone_to_bm(struct uwb_mas_bm *bm, u8 zone, u16 mas_bm) -+{ -+ int mas; -+ u16 mas_mask; -+ -+ for (mas = 0; mas < UWB_MAS_PER_ZONE; mas++) { -+ mas_mask = 1 << mas; -+ if (mas_bm & mas_mask) -+ set_bit(zone * UWB_NUM_ZONES + mas, bm->bm); -+ } -+} -+ -+/** -+ * uwb_drp_ie_zones_to_bm - convert DRP allocation fields to a bitmap -+ * @mas: MAS bitmap that will be populated to correspond to the -+ * allocation fields in the DRP IE -+ * @drp_ie: the DRP IE that contains the allocation fields. -+ * -+ * The input format is an array of MAS allocation fields (16 bit Zone -+ * bitmap, 16 bit MAS bitmap) as described in [ECMA-368] section -+ * 16.8.6. The output is a full 256 bit MAS bitmap. -+ * -+ * We go over all the allocation fields, for each allocation field we -+ * know which zones are impacted. We iterate over all the zones -+ * impacted and call a function that will set the correct MAS bits in -+ * each zone. -+ */ -+void uwb_drp_ie_to_bm(struct uwb_mas_bm *bm, const struct uwb_ie_drp *drp_ie) -+{ -+ int numallocs = (drp_ie->hdr.length - 4) / 4; -+ const struct uwb_drp_alloc *alloc; -+ int cnt; -+ u16 zone_bm, mas_bm; -+ u8 zone; -+ u16 zone_mask; -+ -+ for (cnt = 0; cnt < numallocs; cnt++) { -+ alloc = &drp_ie->allocs[cnt]; -+ zone_bm = le16_to_cpu(alloc->zone_bm); -+ mas_bm = le16_to_cpu(alloc->mas_bm); -+ for (zone = 0; zone < UWB_NUM_ZONES; zone++) { -+ zone_mask = 1 << zone; -+ if (zone_bm & zone_mask) -+ uwb_drp_ie_single_zone_to_bm(bm, zone, mas_bm); -+ } -+ } -+} ---- /dev/null +++ b/drivers/uwb/drp.c @@ -0,0 +1,451 @@ +/* @@ -1003,6 +767,242 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + return 0; +} --- /dev/null ++++ b/drivers/uwb/drp-ie.c +@@ -0,0 +1,233 @@ ++/* ++ * UWB DRP IE management. ++ * ++ * Copyright (C) 2005-2006 Intel Corporation ++ * Copyright (C) 2008 Cambridge Silicon Radio Ltd. ++ * ++ * 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, see <http://www.gnu.org/licenses/>. ++ */ ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/random.h> ++#include <linux/uwb.h> ++ ++#include "uwb-internal.h" ++ ++/* ++ * Allocate a DRP IE. ++ * ++ * To save having to free/allocate a DRP IE when its MAS changes, ++ * enough memory is allocated for the maxiumum number of DRP ++ * allocation fields. This gives an overhead per reservation of up to ++ * (UWB_NUM_ZONES - 1) * 4 = 60 octets. ++ */ ++static struct uwb_ie_drp *uwb_drp_ie_alloc(void) ++{ ++ struct uwb_ie_drp *drp_ie; ++ unsigned tiebreaker; ++ ++ drp_ie = kzalloc(sizeof(struct uwb_ie_drp) + ++ UWB_NUM_ZONES * sizeof(struct uwb_drp_alloc), ++ GFP_KERNEL); ++ if (drp_ie) { ++ drp_ie->hdr.element_id = UWB_IE_DRP; ++ ++ get_random_bytes(&tiebreaker, sizeof(unsigned)); ++ drp_ie->tiebreaker = tiebreaker & 1; ++ } ++ return drp_ie; ++} ++ ++ ++/* ++ * Fill a DRP IE's allocation fields from a MAS bitmap. ++ */ ++static void uwb_drp_ie_from_bm(struct uwb_ie_drp *drp_ie, ++ struct uwb_mas_bm *mas) ++{ ++ int z, i, num_fields = 0, next = 0; ++ struct uwb_drp_alloc *zones; ++ __le16 current_bmp; ++ DECLARE_BITMAP(tmp_bmp, UWB_NUM_MAS); ++ DECLARE_BITMAP(tmp_mas_bm, UWB_MAS_PER_ZONE); ++ ++ zones = drp_ie->allocs; ++ ++ bitmap_copy(tmp_bmp, mas->bm, UWB_NUM_MAS); ++ ++ /* Determine unique MAS bitmaps in zones from bitmap. */ ++ for (z = 0; z < UWB_NUM_ZONES; z++) { ++ bitmap_copy(tmp_mas_bm, tmp_bmp, UWB_MAS_PER_ZONE); ++ if (bitmap_weight(tmp_mas_bm, UWB_MAS_PER_ZONE) > 0) { ++ bool found = false; ++ current_bmp = (__le16) *tmp_mas_bm; ++ for (i = 0; i < next; i++) { ++ if (current_bmp == zones[i].mas_bm) { ++ zones[i].zone_bm |= 1 << z; ++ found = true; ++ break; ++ } ++ } ++ if (!found) { ++ num_fields++; ++ zones[next].zone_bm = 1 << z; ++ zones[next].mas_bm = current_bmp; ++ next++; ++ } ++ } ++ bitmap_shift_right(tmp_bmp, tmp_bmp, UWB_MAS_PER_ZONE, UWB_NUM_MAS); ++ } ++ ++ /* Store in format ready for transmission (le16). */ ++ for (i = 0; i < num_fields; i++) { ++ drp_ie->allocs[i].zone_bm = cpu_to_le16(zones[i].zone_bm); ++ drp_ie->allocs[i].mas_bm = cpu_to_le16(zones[i].mas_bm); ++ } ++ ++ drp_ie->hdr.length = sizeof(struct uwb_ie_drp) - sizeof(struct uwb_ie_hdr) ++ + num_fields * sizeof(struct uwb_drp_alloc); ++} ++ ++/** ++ * uwb_drp_ie_update - update a reservation's DRP IE ++ * @rsv: the reservation ++ */ ++int uwb_drp_ie_update(struct uwb_rsv *rsv) ++{ ++ struct device *dev = &rsv->rc->uwb_dev.dev; ++ struct uwb_ie_drp *drp_ie; ++ int reason_code, status; ++ ++ switch (rsv->state) { ++ case UWB_RSV_STATE_NONE: ++ kfree(rsv->drp_ie); ++ rsv->drp_ie = NULL; ++ return 0; ++ case UWB_RSV_STATE_O_INITIATED: ++ reason_code = UWB_DRP_REASON_ACCEPTED; ++ status = 0; ++ break; ++ case UWB_RSV_STATE_O_PENDING: ++ reason_code = UWB_DRP_REASON_ACCEPTED; ++ status = 0; ++ break; ++ case UWB_RSV_STATE_O_MODIFIED: ++ reason_code = UWB_DRP_REASON_MODIFIED; ++ status = 1; ++ break; ++ case UWB_RSV_STATE_O_ESTABLISHED: ++ reason_code = UWB_DRP_REASON_ACCEPTED; ++ status = 1; ++ break; ++ case UWB_RSV_STATE_T_ACCEPTED: ++ reason_code = UWB_DRP_REASON_ACCEPTED; ++ status = 1; ++ break; ++ case UWB_RSV_STATE_T_DENIED: ++ reason_code = UWB_DRP_REASON_DENIED; ++ status = 0; ++ break; ++ default: ++ dev_dbg(dev, "rsv with unhandled state (%d)\n", rsv->state); ++ return -EINVAL; ++ } ++ ++ if (rsv->drp_ie == NULL) { ++ rsv->drp_ie = uwb_drp_ie_alloc(); ++ if (rsv->drp_ie == NULL) ++ return -ENOMEM; ++ } ++ drp_ie = rsv->drp_ie; ++ ++ drp_ie->owner = uwb_rsv_is_owner(rsv); ++ drp_ie->status = status; ++ drp_ie->reason_code = reason_code; ++ drp_ie->stream_index = rsv->stream; ++ drp_ie->type = rsv->type; ++ drp_ie->DRP_Control = cpu_to_le16(drp_ie->DRP_Control); ++ ++ if (uwb_rsv_is_owner(rsv)) { ++ switch (rsv->target.type) { ++ case UWB_RSV_TARGET_DEV: ++ drp_ie->dev_addr = rsv->target.dev->dev_addr; ++ break; ++ case UWB_RSV_TARGET_DEVADDR: ++ drp_ie->dev_addr = rsv->target.devaddr; ++ break; ++ } ++ } else ++ drp_ie->dev_addr = rsv->owner->dev_addr; ++ ++ uwb_drp_ie_from_bm(drp_ie, &rsv->mas); ++ ++ rsv->ie_valid = true; ++ return 0; ++} ++ ++/* ++ * Set MAS bits from given MAS bitmap in a single zone of large bitmap. ++ * ++ * We are given a zone id and the MAS bitmap of bits that need to be set in ++ * this zone. Note that this zone may already have bits set and this only ++ * adds settings - we cannot simply assign the MAS bitmap contents to the ++ * zone contents. We iterate over the the bits (MAS) in the zone and set the ++ * bits that are set in the given MAS bitmap. ++ */ ++static ++void uwb_drp_ie_single_zone_to_bm(struct uwb_mas_bm *bm, u8 zone, u16 mas_bm) ++{ ++ int mas; ++ u16 mas_mask; ++ ++ for (mas = 0; mas < UWB_MAS_PER_ZONE; mas++) { ++ mas_mask = 1 << mas; ++ if (mas_bm & mas_mask) ++ set_bit(zone * UWB_NUM_ZONES + mas, bm->bm); ++ } ++} ++ ++/** ++ * uwb_drp_ie_zones_to_bm - convert DRP allocation fields to a bitmap ++ * @mas: MAS bitmap that will be populated to correspond to the ++ * allocation fields in the DRP IE ++ * @drp_ie: the DRP IE that contains the allocation fields. ++ * ++ * The input format is an array of MAS allocation fields (16 bit Zone ++ * bitmap, 16 bit MAS bitmap) as described in [ECMA-368] section ++ * 16.8.6. The output is a full 256 bit MAS bitmap. ++ * ++ * We go over all the allocation fields, for each allocation field we ++ * know which zones are impacted. We iterate over all the zones ++ * impacted and call a function that will set the correct MAS bits in ++ * each zone. ++ */ ++void uwb_drp_ie_to_bm(struct uwb_mas_bm *bm, const struct uwb_ie_drp *drp_ie) ++{ ++ int numallocs = (drp_ie->hdr.length - 4) / 4; ++ const struct uwb_drp_alloc *alloc; ++ int cnt; ++ u16 zone_bm, mas_bm; ++ u8 zone; ++ u16 zone_mask; ++ ++ for (cnt = 0; cnt < numallocs; cnt++) { ++ alloc = &drp_ie->allocs[cnt]; ++ zone_bm = le16_to_cpu(alloc->zone_bm); ++ mas_bm = le16_to_cpu(alloc->mas_bm); ++ for (zone = 0; zone < UWB_NUM_ZONES; zone++) { ++ zone_mask = 1 << zone; ++ if (zone_bm & zone_mask) ++ uwb_drp_ie_single_zone_to_bm(bm, zone, mas_bm); ++ } ++ } ++} +--- /dev/null +++ b/drivers/uwb/rsv.c @@ -0,0 +1,677 @@ +/* @@ -1661,7 +1661,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +{ + char name[16]; + -+ snprintf(name, sizeof(name), "%s_rsvd", rc->uwb_dev.dev.bus_id); ++ snprintf(name, sizeof(name), "%s_rsvd", dev_name(&rc->uwb_dev.dev)); + rc->rsv_workq = create_singlethread_workqueue(name); + if (rc->rsv_workq == NULL) + return -ENOMEM; diff --git a/usb/wusb-whci-hcd-driver.patch b/usb/wusb-whci-hcd-driver.patch index 8e5fcf589ed537..a2923bfc78e246 100644 --- a/usb/wusb-whci-hcd-driver.patch +++ b/usb/wusb-whci-hcd-driver.patch @@ -929,7 +929,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + init_waitqueue_head(&whc->cmd_wq); + init_waitqueue_head(&whc->async_list_wq); + init_waitqueue_head(&whc->periodic_list_wq); -+ whc->workqueue = create_singlethread_workqueue(whc->umc->dev.bus_id); ++ whc->workqueue = create_singlethread_workqueue(dev_name(&whc->umc->dev)); + if (whc->workqueue == NULL) { + ret = -ENOMEM; + goto error; |
