diff options
27 files changed, 312 insertions, 282 deletions
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index 652367aa6546..058fbccf2f52 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig | |||
| @@ -195,5 +195,16 @@ config BT_MRVL_SDIO | |||
| 195 | Say Y here to compile support for Marvell BT-over-SDIO driver | 195 | Say Y here to compile support for Marvell BT-over-SDIO driver |
| 196 | into the kernel or say M to compile it as module. | 196 | into the kernel or say M to compile it as module. |
| 197 | 197 | ||
| 198 | endmenu | 198 | config BT_ATH3K |
| 199 | tristate "Atheros firmware download driver" | ||
| 200 | depends on BT_HCIBTUSB | ||
| 201 | select FW_LOADER | ||
| 202 | help | ||
| 203 | Bluetooth firmware download driver. | ||
| 204 | This driver loads the firmware into the Atheros Bluetooth | ||
| 205 | chipset. | ||
| 199 | 206 | ||
| 207 | Say Y here to compile support for "Atheros firmware download driver" | ||
| 208 | into the kernel or say M to compile it as module (ath3k). | ||
| 209 | |||
| 210 | endmenu | ||
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile index b3f57d2d4eb0..7e5aed598121 100644 --- a/drivers/bluetooth/Makefile +++ b/drivers/bluetooth/Makefile | |||
| @@ -15,6 +15,7 @@ obj-$(CONFIG_BT_HCIBTUART) += btuart_cs.o | |||
| 15 | obj-$(CONFIG_BT_HCIBTUSB) += btusb.o | 15 | obj-$(CONFIG_BT_HCIBTUSB) += btusb.o |
| 16 | obj-$(CONFIG_BT_HCIBTSDIO) += btsdio.o | 16 | obj-$(CONFIG_BT_HCIBTSDIO) += btsdio.o |
| 17 | 17 | ||
| 18 | obj-$(CONFIG_BT_ATH3K) += ath3k.o | ||
| 18 | obj-$(CONFIG_BT_MRVL) += btmrvl.o | 19 | obj-$(CONFIG_BT_MRVL) += btmrvl.o |
| 19 | obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o | 20 | obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o |
| 20 | 21 | ||
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c new file mode 100644 index 000000000000..add9485ca5b6 --- /dev/null +++ b/drivers/bluetooth/ath3k.c | |||
| @@ -0,0 +1,187 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 20 | |||
| 21 | #include <linux/module.h> | ||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <linux/init.h> | ||
| 24 | #include <linux/slab.h> | ||
| 25 | #include <linux/types.h> | ||
| 26 | #include <linux/errno.h> | ||
| 27 | #include <linux/device.h> | ||
| 28 | #include <linux/firmware.h> | ||
| 29 | #include <linux/usb.h> | ||
| 30 | #include <net/bluetooth/bluetooth.h> | ||
| 31 | |||
| 32 | #define VERSION "1.0" | ||
| 33 | |||
| 34 | |||
| 35 | static struct usb_device_id ath3k_table[] = { | ||
| 36 | /* Atheros AR3011 */ | ||
| 37 | { USB_DEVICE(0x0CF3, 0x3000) }, | ||
| 38 | { } /* Terminating entry */ | ||
| 39 | }; | ||
| 40 | |||
| 41 | MODULE_DEVICE_TABLE(usb, ath3k_table); | ||
| 42 | |||
| 43 | #define USB_REQ_DFU_DNLOAD 1 | ||
| 44 | #define BULK_SIZE 4096 | ||
| 45 | |||
| 46 | struct ath3k_data { | ||
| 47 | struct usb_device *udev; | ||
| 48 | u8 *fw_data; | ||
| 49 | u32 fw_size; | ||
| 50 | u32 fw_sent; | ||
| 51 | }; | ||
| 52 | |||
| 53 | static int ath3k_load_firmware(struct ath3k_data *data, | ||
| 54 | unsigned char *firmware, | ||
| 55 | int count) | ||
| 56 | { | ||
| 57 | u8 *send_buf; | ||
| 58 | int err, pipe, len, size, sent = 0; | ||
| 59 | |||
| 60 | BT_DBG("ath3k %p udev %p", data, data->udev); | ||
| 61 | |||
| 62 | pipe = usb_sndctrlpipe(data->udev, 0); | ||
| 63 | |||
| 64 | if ((usb_control_msg(data->udev, pipe, | ||
| 65 | USB_REQ_DFU_DNLOAD, | ||
| 66 | USB_TYPE_VENDOR, 0, 0, | ||
| 67 | firmware, 20, USB_CTRL_SET_TIMEOUT)) < 0) { | ||
| 68 | BT_ERR("Can't change to loading configuration err"); | ||
| 69 | return -EBUSY; | ||
| 70 | } | ||
| 71 | sent += 20; | ||
| 72 | count -= 20; | ||
| 73 | |||
| 74 | send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC); | ||
| 75 | if (!send_buf) { | ||
| 76 | BT_ERR("Can't allocate memory chunk for firmware"); | ||
| 77 | return -ENOMEM; | ||
| 78 | } | ||
| 79 | |||
| 80 | while (count) { | ||
| 81 | size = min_t(uint, count, BULK_SIZE); | ||
| 82 | pipe = usb_sndbulkpipe(data->udev, 0x02); | ||
| 83 | memcpy(send_buf, firmware + sent, size); | ||
| 84 | |||
| 85 | err = usb_bulk_msg(data->udev, pipe, send_buf, size, | ||
| 86 | &len, 3000); | ||
| 87 | |||
| 88 | if (err || (len != size)) { | ||
| 89 | BT_ERR("Error in firmware loading err = %d," | ||
| 90 | "len = %d, size = %d", err, len, size); | ||
| 91 | goto error; | ||
| 92 | } | ||
| 93 | |||
| 94 | sent += size; | ||
| 95 | count -= size; | ||
| 96 | } | ||
| 97 | |||
| 98 | kfree(send_buf); | ||
| 99 | return 0; | ||
| 100 | |||
| 101 | error: | ||
| 102 | kfree(send_buf); | ||
| 103 | return err; | ||
| 104 | } | ||
| 105 | |||
| 106 | static int ath3k_probe(struct usb_interface *intf, | ||
| 107 | const struct usb_device_id *id) | ||
| 108 | { | ||
| 109 | const struct firmware *firmware; | ||
| 110 | struct usb_device *udev = interface_to_usbdev(intf); | ||
| 111 | struct ath3k_data *data; | ||
| 112 | int size; | ||
| 113 | |||
| 114 | BT_DBG("intf %p id %p", intf, id); | ||
| 115 | |||
| 116 | if (intf->cur_altsetting->desc.bInterfaceNumber != 0) | ||
| 117 | return -ENODEV; | ||
| 118 | |||
| 119 | data = kzalloc(sizeof(*data), GFP_KERNEL); | ||
| 120 | if (!data) | ||
| 121 | return -ENOMEM; | ||
| 122 | |||
| 123 | data->udev = udev; | ||
| 124 | |||
| 125 | if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) { | ||
| 126 | kfree(data); | ||
| 127 | return -EIO; | ||
| 128 | } | ||
| 129 | |||
| 130 | size = max_t(uint, firmware->size, 4096); | ||
| 131 | data->fw_data = kmalloc(size, GFP_KERNEL); | ||
| 132 | if (!data->fw_data) { | ||
| 133 | release_firmware(firmware); | ||
| 134 | kfree(data); | ||
| 135 | return -ENOMEM; | ||
| 136 | } | ||
| 137 | |||
| 138 | memcpy(data->fw_data, firmware->data, firmware->size); | ||
| 139 | data->fw_size = firmware->size; | ||
| 140 | data->fw_sent = 0; | ||
| 141 | release_firmware(firmware); | ||
| 142 | |||
| 143 | usb_set_intfdata(intf, data); | ||
| 144 | if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) { | ||
| 145 | usb_set_intfdata(intf, NULL); | ||
| 146 | return -EIO; | ||
| 147 | } | ||
| 148 | |||
| 149 | return 0; | ||
| 150 | } | ||
| 151 | |||
| 152 | static void ath3k_disconnect(struct usb_interface *intf) | ||
| 153 | { | ||
| 154 | struct ath3k_data *data = usb_get_intfdata(intf); | ||
| 155 | |||
| 156 | BT_DBG("ath3k_disconnect intf %p", intf); | ||
| 157 | |||
| 158 | kfree(data->fw_data); | ||
| 159 | kfree(data); | ||
| 160 | } | ||
| 161 | |||
| 162 | static struct usb_driver ath3k_driver = { | ||
| 163 | .name = "ath3k", | ||
| 164 | .probe = ath3k_probe, | ||
| 165 | .disconnect = ath3k_disconnect, | ||
| 166 | .id_table = ath3k_table, | ||
| 167 | }; | ||
| 168 | |||
| 169 | static int __init ath3k_init(void) | ||
| 170 | { | ||
| 171 | BT_INFO("Atheros AR30xx firmware driver ver %s", VERSION); | ||
| 172 | return usb_register(&ath3k_driver); | ||
| 173 | } | ||
| 174 | |||
| 175 | static void __exit ath3k_exit(void) | ||
| 176 | { | ||
| 177 | usb_deregister(&ath3k_driver); | ||
| 178 | } | ||
| 179 | |||
| 180 | module_init(ath3k_init); | ||
| 181 | module_exit(ath3k_exit); | ||
| 182 | |||
| 183 | MODULE_AUTHOR("Atheros Communications"); | ||
| 184 | MODULE_DESCRIPTION("Atheros AR30xx firmware driver"); | ||
| 185 | MODULE_VERSION(VERSION); | ||
| 186 | MODULE_LICENSE("GPL"); | ||
| 187 | MODULE_FIRMWARE("ath3k-1.fw"); | ||
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 2acdc605cb4b..c2cf81144715 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
| @@ -503,7 +503,9 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst) | |||
| 503 | unsigned int iobase; | 503 | unsigned int iobase; |
| 504 | unsigned char reg; | 504 | unsigned char reg; |
| 505 | 505 | ||
| 506 | BUG_ON(!info->hdev); | 506 | if (!info || !info->hdev) |
| 507 | /* our irq handler is shared */ | ||
| 508 | return IRQ_NONE; | ||
| 507 | 509 | ||
| 508 | if (!test_bit(CARD_READY, &(info->hw_state))) | 510 | if (!test_bit(CARD_READY, &(info->hw_state))) |
| 509 | return IRQ_HANDLED; | 511 | return IRQ_HANDLED; |
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index d814a2755ccb..9f5926aaf57f 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
| @@ -345,7 +345,9 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) | |||
| 345 | int iir; | 345 | int iir; |
| 346 | irqreturn_t r = IRQ_NONE; | 346 | irqreturn_t r = IRQ_NONE; |
| 347 | 347 | ||
| 348 | BUG_ON(!info->hdev); | 348 | if (!info || !info->hdev) |
| 349 | /* our irq handler is shared */ | ||
| 350 | return IRQ_NONE; | ||
| 349 | 351 | ||
| 350 | iobase = info->p_dev->io.BasePort1; | 352 | iobase = info->p_dev->io.BasePort1; |
| 351 | 353 | ||
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index d339464dc15e..91c523099804 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c | |||
| @@ -295,7 +295,9 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst) | |||
| 295 | int iir, lsr; | 295 | int iir, lsr; |
| 296 | irqreturn_t r = IRQ_NONE; | 296 | irqreturn_t r = IRQ_NONE; |
| 297 | 297 | ||
| 298 | BUG_ON(!info->hdev); | 298 | if (!info || !info->hdev) |
| 299 | /* our irq handler is shared */ | ||
| 300 | return IRQ_NONE; | ||
| 299 | 301 | ||
| 300 | iobase = info->p_dev->io.BasePort1; | 302 | iobase = info->p_dev->io.BasePort1; |
| 301 | 303 | ||
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index 4f02a6f3c980..697591941e17 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c | |||
| @@ -299,7 +299,9 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst) | |||
| 299 | int iir, lsr; | 299 | int iir, lsr; |
| 300 | irqreturn_t r = IRQ_NONE; | 300 | irqreturn_t r = IRQ_NONE; |
| 301 | 301 | ||
| 302 | BUG_ON(!info->hdev); | 302 | if (!info || !info->hdev) |
| 303 | /* our irq handler is shared */ | ||
| 304 | return IRQ_NONE; | ||
| 303 | 305 | ||
| 304 | iobase = info->p_dev->io.BasePort1; | 306 | iobase = info->p_dev->io.BasePort1; |
| 305 | 307 | ||
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index f06024668f99..537c29ac4487 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
| @@ -36,17 +36,6 @@ MODULE_LICENSE("GPL"); | |||
| 36 | MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); | 36 | MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); |
| 37 | MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector."); | 37 | MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector."); |
| 38 | 38 | ||
| 39 | static u32 cn_idx = CN_IDX_CONNECTOR; | ||
| 40 | static u32 cn_val = CN_VAL_CONNECTOR; | ||
| 41 | |||
| 42 | module_param(cn_idx, uint, 0); | ||
| 43 | module_param(cn_val, uint, 0); | ||
| 44 | MODULE_PARM_DESC(cn_idx, "Connector's main device idx."); | ||
| 45 | MODULE_PARM_DESC(cn_val, "Connector's main device val."); | ||
| 46 | |||
| 47 | static DEFINE_MUTEX(notify_lock); | ||
| 48 | static LIST_HEAD(notify_list); | ||
| 49 | |||
| 50 | static struct cn_dev cdev; | 39 | static struct cn_dev cdev; |
| 51 | 40 | ||
| 52 | static int cn_already_initialized; | 41 | static int cn_already_initialized; |
| @@ -210,54 +199,6 @@ static void cn_rx_skb(struct sk_buff *__skb) | |||
| 210 | } | 199 | } |
| 211 | 200 | ||
| 212 | /* | 201 | /* |
| 213 | * Notification routing. | ||
| 214 | * | ||
| 215 | * Gets id and checks if there are notification request for it's idx | ||
| 216 | * and val. If there are such requests notify the listeners with the | ||
| 217 | * given notify event. | ||
| 218 | * | ||
| 219 | */ | ||
| 220 | static void cn_notify(struct cb_id *id, u32 notify_event) | ||
| 221 | { | ||
| 222 | struct cn_ctl_entry *ent; | ||
| 223 | |||
| 224 | mutex_lock(¬ify_lock); | ||
| 225 | list_for_each_entry(ent, ¬ify_list, notify_entry) { | ||
| 226 | int i; | ||
| 227 | struct cn_notify_req *req; | ||
| 228 | struct cn_ctl_msg *ctl = ent->msg; | ||
| 229 | int idx_found, val_found; | ||
| 230 | |||
| 231 | idx_found = val_found = 0; | ||
| 232 | |||
| 233 | req = (struct cn_notify_req *)ctl->data; | ||
| 234 | for (i = 0; i < ctl->idx_notify_num; ++i, ++req) { | ||
| 235 | if (id->idx >= req->first && | ||
| 236 | id->idx < req->first + req->range) { | ||
| 237 | idx_found = 1; | ||
| 238 | break; | ||
| 239 | } | ||
| 240 | } | ||
| 241 | |||
| 242 | for (i = 0; i < ctl->val_notify_num; ++i, ++req) { | ||
| 243 | if (id->val >= req->first && | ||
| 244 | id->val < req->first + req->range) { | ||
| 245 | val_found = 1; | ||
| 246 | break; | ||
| 247 | } | ||
| 248 | } | ||
| 249 | |||
| 250 | if (idx_found && val_found) { | ||
| 251 | struct cn_msg m = { .ack = notify_event, }; | ||
| 252 | |||
| 253 | memcpy(&m.id, id, sizeof(m.id)); | ||
| 254 | cn_netlink_send(&m, ctl->group, GFP_KERNEL); | ||
| 255 | } | ||
| 256 | } | ||
| 257 | mutex_unlock(¬ify_lock); | ||
| 258 | } | ||
| 259 | |||
| 260 | /* | ||
| 261 | * Callback add routing - adds callback with given ID and name. | 202 | * Callback add routing - adds callback with given ID and name. |
| 262 | * If there is registered callback with the same ID it will not be added. | 203 | * If there is registered callback with the same ID it will not be added. |
| 263 | * | 204 | * |
| @@ -276,8 +217,6 @@ int cn_add_callback(struct cb_id *id, char *name, | |||
| 276 | if (err) | 217 | if (err) |
| 277 | return err; | 218 | return err; |
| 278 | 219 | ||
| 279 | cn_notify(id, 0); | ||
| 280 | |||
| 281 | return 0; | 220 | return 0; |
| 282 | } | 221 | } |
| 283 | EXPORT_SYMBOL_GPL(cn_add_callback); | 222 | EXPORT_SYMBOL_GPL(cn_add_callback); |
| @@ -295,111 +234,9 @@ void cn_del_callback(struct cb_id *id) | |||
| 295 | struct cn_dev *dev = &cdev; | 234 | struct cn_dev *dev = &cdev; |
| 296 | 235 | ||
| 297 | cn_queue_del_callback(dev->cbdev, id); | 236 | cn_queue_del_callback(dev->cbdev, id); |
| 298 | cn_notify(id, 1); | ||
| 299 | } | 237 | } |
| 300 | EXPORT_SYMBOL_GPL(cn_del_callback); | 238 | EXPORT_SYMBOL_GPL(cn_del_callback); |
| 301 | 239 | ||
| 302 | /* | ||
| 303 | * Checks two connector's control messages to be the same. | ||
| 304 | * Returns 1 if they are the same or if the first one is corrupted. | ||
| 305 | */ | ||
| 306 | static int cn_ctl_msg_equals(struct cn_ctl_msg *m1, struct cn_ctl_msg *m2) | ||
| 307 | { | ||
| 308 | int i; | ||
| 309 | struct cn_notify_req *req1, *req2; | ||
| 310 | |||
| 311 | if (m1->idx_notify_num != m2->idx_notify_num) | ||
| 312 | return 0; | ||
| 313 | |||
| 314 | if (m1->val_notify_num != m2->val_notify_num) | ||
| 315 | return 0; | ||
| 316 | |||
| 317 | if (m1->len != m2->len) | ||
| 318 | return 0; | ||
| 319 | |||
| 320 | if ((m1->idx_notify_num + m1->val_notify_num) * sizeof(*req1) != | ||
| 321 | m1->len) | ||
| 322 | return 1; | ||
| 323 | |||
| 324 | req1 = (struct cn_notify_req *)m1->data; | ||
| 325 | req2 = (struct cn_notify_req *)m2->data; | ||
| 326 | |||
| 327 | for (i = 0; i < m1->idx_notify_num; ++i) { | ||
| 328 | if (req1->first != req2->first || req1->range != req2->range) | ||
| 329 | return 0; | ||
| 330 | req1++; | ||
| 331 | req2++; | ||
| 332 | } | ||
| 333 | |||
| 334 | for (i = 0; i < m1->val_notify_num; ++i) { | ||
| 335 | if (req1->first != req2->first || req1->range != req2->range) | ||
| 336 | return 0; | ||
| 337 | req1++; | ||
| 338 | req2++; | ||
| 339 | } | ||
| 340 | |||
| 341 | return 1; | ||
| 342 | } | ||
| 343 | |||
| 344 | /* | ||
| 345 | * Main connector device's callback. | ||
| 346 | * | ||
| 347 | * Used for notification of a request's processing. | ||
| 348 | */ | ||
| 349 | static void cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) | ||
| 350 | { | ||
| 351 | struct cn_ctl_msg *ctl; | ||
| 352 | struct cn_ctl_entry *ent; | ||
| 353 | u32 size; | ||
| 354 | |||
| 355 | if (msg->len < sizeof(*ctl)) | ||
| 356 | return; | ||
| 357 | |||
| 358 | ctl = (struct cn_ctl_msg *)msg->data; | ||
| 359 | |||
| 360 | size = (sizeof(*ctl) + ((ctl->idx_notify_num + | ||
| 361 | ctl->val_notify_num) * | ||
| 362 | sizeof(struct cn_notify_req))); | ||
| 363 | |||
| 364 | if (msg->len != size) | ||
| 365 | return; | ||
| 366 | |||
| 367 | if (ctl->len + sizeof(*ctl) != msg->len) | ||
| 368 | return; | ||
| 369 | |||
| 370 | /* | ||
| 371 | * Remove notification. | ||
| 372 | */ | ||
| 373 | if (ctl->group == 0) { | ||
| 374 | struct cn_ctl_entry *n; | ||
| 375 | |||
| 376 | mutex_lock(¬ify_lock); | ||
| 377 | list_for_each_entry_safe(ent, n, ¬ify_list, notify_entry) { | ||
| 378 | if (cn_ctl_msg_equals(ent->msg, ctl)) { | ||
| 379 | list_del(&ent->notify_entry); | ||
| 380 | kfree(ent); | ||
| 381 | } | ||
| 382 | } | ||
| 383 | mutex_unlock(¬ify_lock); | ||
| 384 | |||
| 385 | return; | ||
| 386 | } | ||
| 387 | |||
| 388 | size += sizeof(*ent); | ||
| 389 | |||
| 390 | ent = kzalloc(size, GFP_KERNEL); | ||
| 391 | if (!ent) | ||
| 392 | return; | ||
| 393 | |||
| 394 | ent->msg = (struct cn_ctl_msg *)(ent + 1); | ||
| 395 | |||
| 396 | memcpy(ent->msg, ctl, size - sizeof(*ent)); | ||
| 397 | |||
| 398 | mutex_lock(¬ify_lock); | ||
| 399 | list_add(&ent->notify_entry, ¬ify_list); | ||
| 400 | mutex_unlock(¬ify_lock); | ||
| 401 | } | ||
| 402 | |||
| 403 | static int cn_proc_show(struct seq_file *m, void *v) | 240 | static int cn_proc_show(struct seq_file *m, void *v) |
| 404 | { | 241 | { |
| 405 | struct cn_queue_dev *dev = cdev.cbdev; | 242 | struct cn_queue_dev *dev = cdev.cbdev; |
| @@ -437,11 +274,8 @@ static const struct file_operations cn_file_ops = { | |||
| 437 | static int __devinit cn_init(void) | 274 | static int __devinit cn_init(void) |
| 438 | { | 275 | { |
| 439 | struct cn_dev *dev = &cdev; | 276 | struct cn_dev *dev = &cdev; |
| 440 | int err; | ||
| 441 | 277 | ||
| 442 | dev->input = cn_rx_skb; | 278 | dev->input = cn_rx_skb; |
| 443 | dev->id.idx = cn_idx; | ||
| 444 | dev->id.val = cn_val; | ||
| 445 | 279 | ||
| 446 | dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, | 280 | dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, |
| 447 | CN_NETLINK_USERS + 0xf, | 281 | CN_NETLINK_USERS + 0xf, |
| @@ -457,14 +291,6 @@ static int __devinit cn_init(void) | |||
| 457 | 291 | ||
| 458 | cn_already_initialized = 1; | 292 | cn_already_initialized = 1; |
| 459 | 293 | ||
| 460 | err = cn_add_callback(&dev->id, "connector", &cn_callback); | ||
| 461 | if (err) { | ||
| 462 | cn_already_initialized = 0; | ||
| 463 | cn_queue_free_dev(dev->cbdev); | ||
| 464 | netlink_kernel_release(dev->nls); | ||
| 465 | return -EINVAL; | ||
| 466 | } | ||
| 467 | |||
| 468 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); | 294 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); |
| 469 | 295 | ||
| 470 | return 0; | 296 | return 0; |
| @@ -478,7 +304,6 @@ static void __devexit cn_fini(void) | |||
| 478 | 304 | ||
| 479 | proc_net_remove(&init_net, "connector"); | 305 | proc_net_remove(&init_net, "connector"); |
| 480 | 306 | ||
| 481 | cn_del_callback(&dev->id); | ||
| 482 | cn_queue_free_dev(dev->cbdev); | 307 | cn_queue_free_dev(dev->cbdev); |
| 483 | netlink_kernel_release(dev->nls); | 308 | netlink_kernel_release(dev->nls); |
| 484 | } | 309 | } |
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 9fd8e5ecd5d7..5bc74590c73e 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
| @@ -276,8 +276,13 @@ struct be_adapter { | |||
| 276 | int link_speed; | 276 | int link_speed; |
| 277 | u8 port_type; | 277 | u8 port_type; |
| 278 | u8 transceiver; | 278 | u8 transceiver; |
| 279 | u8 generation; /* BladeEngine ASIC generation */ | ||
| 279 | }; | 280 | }; |
| 280 | 281 | ||
| 282 | /* BladeEngine Generation numbers */ | ||
| 283 | #define BE_GEN2 2 | ||
| 284 | #define BE_GEN3 3 | ||
| 285 | |||
| 281 | extern const struct ethtool_ops be_ethtool_ops; | 286 | extern const struct ethtool_ops be_ethtool_ops; |
| 282 | 287 | ||
| 283 | #define drvr_stats(adapter) (&adapter->stats.drvr_stats) | 288 | #define drvr_stats(adapter) (&adapter->stats.drvr_stats) |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index c002b8391b4d..13b33c841083 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -164,7 +164,8 @@ struct be_cmd_req_hdr { | |||
| 164 | u8 domain; /* dword 0 */ | 164 | u8 domain; /* dword 0 */ |
| 165 | u32 timeout; /* dword 1 */ | 165 | u32 timeout; /* dword 1 */ |
| 166 | u32 request_length; /* dword 2 */ | 166 | u32 request_length; /* dword 2 */ |
| 167 | u32 rsvd; /* dword 3 */ | 167 | u8 version; /* dword 3 */ |
| 168 | u8 rsvd[3]; /* dword 3 */ | ||
| 168 | }; | 169 | }; |
| 169 | 170 | ||
| 170 | #define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */ | 171 | #define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */ |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 33ab8c7f14fe..626b76c0ebc7 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -1350,7 +1350,7 @@ static irqreturn_t be_intx(int irq, void *dev) | |||
| 1350 | int isr; | 1350 | int isr; |
| 1351 | 1351 | ||
| 1352 | isr = ioread32(adapter->csr + CEV_ISR0_OFFSET + | 1352 | isr = ioread32(adapter->csr + CEV_ISR0_OFFSET + |
| 1353 | be_pci_func(adapter) * CEV_ISR_SIZE); | 1353 | (adapter->tx_eq.q.id/ 8) * CEV_ISR_SIZE); |
| 1354 | if (!isr) | 1354 | if (!isr) |
| 1355 | return IRQ_NONE; | 1355 | return IRQ_NONE; |
| 1356 | 1356 | ||
| @@ -2051,6 +2051,7 @@ static void be_unmap_pci_bars(struct be_adapter *adapter) | |||
| 2051 | static int be_map_pci_bars(struct be_adapter *adapter) | 2051 | static int be_map_pci_bars(struct be_adapter *adapter) |
| 2052 | { | 2052 | { |
| 2053 | u8 __iomem *addr; | 2053 | u8 __iomem *addr; |
| 2054 | int pcicfg_reg; | ||
| 2054 | 2055 | ||
| 2055 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), | 2056 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), |
| 2056 | pci_resource_len(adapter->pdev, 2)); | 2057 | pci_resource_len(adapter->pdev, 2)); |
| @@ -2064,8 +2065,13 @@ static int be_map_pci_bars(struct be_adapter *adapter) | |||
| 2064 | goto pci_map_err; | 2065 | goto pci_map_err; |
| 2065 | adapter->db = addr; | 2066 | adapter->db = addr; |
| 2066 | 2067 | ||
| 2067 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1), | 2068 | if (adapter->generation == BE_GEN2) |
| 2068 | pci_resource_len(adapter->pdev, 1)); | 2069 | pcicfg_reg = 1; |
| 2070 | else | ||
| 2071 | pcicfg_reg = 0; | ||
| 2072 | |||
| 2073 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, pcicfg_reg), | ||
| 2074 | pci_resource_len(adapter->pdev, pcicfg_reg)); | ||
| 2069 | if (addr == NULL) | 2075 | if (addr == NULL) |
| 2070 | goto pci_map_err; | 2076 | goto pci_map_err; |
| 2071 | adapter->pcicfg = addr; | 2077 | adapter->pcicfg = addr; |
| @@ -2162,6 +2168,7 @@ static int be_stats_init(struct be_adapter *adapter) | |||
| 2162 | cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma); | 2168 | cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma); |
| 2163 | if (cmd->va == NULL) | 2169 | if (cmd->va == NULL) |
| 2164 | return -1; | 2170 | return -1; |
| 2171 | memset(cmd->va, 0, cmd->size); | ||
| 2165 | return 0; | 2172 | return 0; |
| 2166 | } | 2173 | } |
| 2167 | 2174 | ||
| @@ -2240,6 +2247,20 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
| 2240 | goto rel_reg; | 2247 | goto rel_reg; |
| 2241 | } | 2248 | } |
| 2242 | adapter = netdev_priv(netdev); | 2249 | adapter = netdev_priv(netdev); |
| 2250 | |||
| 2251 | switch (pdev->device) { | ||
| 2252 | case BE_DEVICE_ID1: | ||
| 2253 | case OC_DEVICE_ID1: | ||
| 2254 | adapter->generation = BE_GEN2; | ||
| 2255 | break; | ||
| 2256 | case BE_DEVICE_ID2: | ||
| 2257 | case OC_DEVICE_ID2: | ||
| 2258 | adapter->generation = BE_GEN3; | ||
| 2259 | break; | ||
| 2260 | default: | ||
| 2261 | adapter->generation = 0; | ||
| 2262 | } | ||
| 2263 | |||
| 2243 | adapter->pdev = pdev; | 2264 | adapter->pdev = pdev; |
| 2244 | pci_set_drvdata(pdev, adapter); | 2265 | pci_set_drvdata(pdev, adapter); |
| 2245 | adapter->netdev = netdev; | 2266 | adapter->netdev = netdev; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 3f0071cfe56b..efa0e41bf3ec 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -3639,7 +3639,7 @@ static int bond_open(struct net_device *bond_dev) | |||
| 3639 | */ | 3639 | */ |
| 3640 | if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) { | 3640 | if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) { |
| 3641 | /* something went wrong - fail the open operation */ | 3641 | /* something went wrong - fail the open operation */ |
| 3642 | return -1; | 3642 | return -ENOMEM; |
| 3643 | } | 3643 | } |
| 3644 | 3644 | ||
| 3645 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); | 3645 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); |
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c index 297a5ddd77f0..2aa71a766c35 100644 --- a/drivers/net/igbvf/netdev.c +++ b/drivers/net/igbvf/netdev.c | |||
| @@ -2117,6 +2117,7 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter, | |||
| 2117 | /* set time_stamp *before* dma to help avoid a possible race */ | 2117 | /* set time_stamp *before* dma to help avoid a possible race */ |
| 2118 | buffer_info->time_stamp = jiffies; | 2118 | buffer_info->time_stamp = jiffies; |
| 2119 | buffer_info->next_to_watch = i; | 2119 | buffer_info->next_to_watch = i; |
| 2120 | buffer_info->mapped_as_page = false; | ||
| 2120 | buffer_info->dma = pci_map_single(pdev, skb->data, len, | 2121 | buffer_info->dma = pci_map_single(pdev, skb->data, len, |
| 2121 | PCI_DMA_TODEVICE); | 2122 | PCI_DMA_TODEVICE); |
| 2122 | if (pci_dma_mapping_error(pdev, buffer_info->dma)) | 2123 | if (pci_dma_mapping_error(pdev, buffer_info->dma)) |
diff --git a/drivers/net/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ixgbe/ixgbe_dcb_nl.c index 56f37f66b696..dd4883f642be 100644 --- a/drivers/net/ixgbe/ixgbe_dcb_nl.c +++ b/drivers/net/ixgbe/ixgbe_dcb_nl.c | |||
| @@ -223,7 +223,7 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, | |||
| 223 | 223 | ||
| 224 | if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != | 224 | if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != |
| 225 | adapter->dcb_cfg.bw_percentage[0][bwg_id]) { | 225 | adapter->dcb_cfg.bw_percentage[0][bwg_id]) { |
| 226 | adapter->dcb_set_bitmap |= BIT_PG_RX; | 226 | adapter->dcb_set_bitmap |= BIT_PG_TX; |
| 227 | adapter->dcb_set_bitmap |= BIT_RESETLINK; | 227 | adapter->dcb_set_bitmap |= BIT_RESETLINK; |
| 228 | } | 228 | } |
| 229 | } | 229 | } |
| @@ -341,6 +341,12 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 341 | if (!adapter->dcb_set_bitmap) | 341 | if (!adapter->dcb_set_bitmap) |
| 342 | return DCB_NO_HW_CHG; | 342 | return DCB_NO_HW_CHG; |
| 343 | 343 | ||
| 344 | ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, | ||
| 345 | adapter->ring_feature[RING_F_DCB].indices); | ||
| 346 | |||
| 347 | if (ret) | ||
| 348 | return DCB_NO_HW_CHG; | ||
| 349 | |||
| 344 | /* | 350 | /* |
| 345 | * Only take down the adapter if the configuration change | 351 | * Only take down the adapter if the configuration change |
| 346 | * requires a reset. | 352 | * requires a reset. |
| @@ -359,14 +365,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 359 | } | 365 | } |
| 360 | } | 366 | } |
| 361 | 367 | ||
| 362 | ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, | ||
| 363 | adapter->ring_feature[RING_F_DCB].indices); | ||
| 364 | if (ret) { | ||
| 365 | if (adapter->dcb_set_bitmap & BIT_RESETLINK) | ||
| 366 | clear_bit(__IXGBE_RESETTING, &adapter->state); | ||
| 367 | return DCB_NO_HW_CHG; | ||
| 368 | } | ||
| 369 | |||
| 370 | if (adapter->dcb_cfg.pfc_mode_enable) { | 368 | if (adapter->dcb_cfg.pfc_mode_enable) { |
| 371 | if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && | 369 | if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && |
| 372 | (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) | 370 | (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) |
diff --git a/drivers/net/ks8851_mll.c b/drivers/net/ks8851_mll.c index c146304d8d6c..c0ceebccaa49 100644 --- a/drivers/net/ks8851_mll.c +++ b/drivers/net/ks8851_mll.c | |||
| @@ -854,8 +854,8 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks) | |||
| 854 | 854 | ||
| 855 | static irqreturn_t ks_irq(int irq, void *pw) | 855 | static irqreturn_t ks_irq(int irq, void *pw) |
| 856 | { | 856 | { |
| 857 | struct ks_net *ks = pw; | 857 | struct net_device *netdev = pw; |
| 858 | struct net_device *netdev = ks->netdev; | 858 | struct ks_net *ks = netdev_priv(netdev); |
| 859 | u16 status; | 859 | u16 status; |
| 860 | 860 | ||
| 861 | /*this should be the first in IRQ handler */ | 861 | /*this should be the first in IRQ handler */ |
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 95db60adde41..f9521136a869 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
| @@ -1063,7 +1063,7 @@ static int netdev_open(struct net_device *dev) | |||
| 1063 | if (retval) { | 1063 | if (retval) { |
| 1064 | printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n", | 1064 | printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n", |
| 1065 | FIRMWARE_RX); | 1065 | FIRMWARE_RX); |
| 1066 | return retval; | 1066 | goto out_init; |
| 1067 | } | 1067 | } |
| 1068 | if (fw_rx->size % 4) { | 1068 | if (fw_rx->size % 4) { |
| 1069 | printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n", | 1069 | printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n", |
| @@ -1108,6 +1108,9 @@ out_tx: | |||
| 1108 | release_firmware(fw_tx); | 1108 | release_firmware(fw_tx); |
| 1109 | out_rx: | 1109 | out_rx: |
| 1110 | release_firmware(fw_rx); | 1110 | release_firmware(fw_rx); |
| 1111 | out_init: | ||
| 1112 | if (retval) | ||
| 1113 | netdev_close(dev); | ||
| 1111 | return retval; | 1114 | return retval; |
| 1112 | } | 1115 | } |
| 1113 | 1116 | ||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 21e183a83b99..4f27f022fbf7 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -419,7 +419,7 @@ static int cdc_manage_power(struct usbnet *dev, int on) | |||
| 419 | 419 | ||
| 420 | static const struct driver_info cdc_info = { | 420 | static const struct driver_info cdc_info = { |
| 421 | .description = "CDC Ethernet Device", | 421 | .description = "CDC Ethernet Device", |
| 422 | .flags = FLAG_ETHER | FLAG_LINK_INTR, | 422 | .flags = FLAG_ETHER, |
| 423 | // .check_connect = cdc_check_connect, | 423 | // .check_connect = cdc_check_connect, |
| 424 | .bind = cdc_bind, | 424 | .bind = cdc_bind, |
| 425 | .unbind = usbnet_cdc_unbind, | 425 | .unbind = usbnet_cdc_unbind, |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 2ec61f08cfdb..ae371448b5a0 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -855,12 +855,11 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah) | |||
| 855 | } | 855 | } |
| 856 | } | 856 | } |
| 857 | 857 | ||
| 858 | static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah) | 858 | static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah) |
| 859 | { | 859 | { |
| 860 | u32 i, j; | 860 | u32 i, j; |
| 861 | 861 | ||
| 862 | if ((ah->hw_version.devid == AR9280_DEVID_PCI) && | 862 | if (ah->hw_version.devid == AR9280_DEVID_PCI) { |
| 863 | test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) { | ||
| 864 | 863 | ||
| 865 | /* EEPROM Fixup */ | 864 | /* EEPROM Fixup */ |
| 866 | for (i = 0; i < ah->iniModes.ia_rows; i++) { | 865 | for (i = 0; i < ah->iniModes.ia_rows; i++) { |
| @@ -980,7 +979,7 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
| 980 | if (r) | 979 | if (r) |
| 981 | return r; | 980 | return r; |
| 982 | 981 | ||
| 983 | ath9k_hw_init_11a_eeprom_fix(ah); | 982 | ath9k_hw_init_eeprom_fix(ah); |
| 984 | 983 | ||
| 985 | r = ath9k_hw_init_macaddr(ah); | 984 | r = ath9k_hw_init_macaddr(ah); |
| 986 | if (r) { | 985 | if (r) { |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 996eb90263cc..643bea35686f 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -2655,10 +2655,10 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, | |||
| 2655 | (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) { | 2655 | (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) { |
| 2656 | ath9k_ps_wakeup(sc); | 2656 | ath9k_ps_wakeup(sc); |
| 2657 | ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); | 2657 | ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); |
| 2658 | ath_beacon_return(sc, avp); | ||
| 2659 | ath9k_ps_restore(sc); | 2658 | ath9k_ps_restore(sc); |
| 2660 | } | 2659 | } |
| 2661 | 2660 | ||
| 2661 | ath_beacon_return(sc, avp); | ||
| 2662 | sc->sc_flags &= ~SC_OP_BEACONS; | 2662 | sc->sc_flags &= ~SC_OP_BEACONS; |
| 2663 | 2663 | ||
| 2664 | for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) { | 2664 | for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index cde09a890b73..90fbdb25399e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
| @@ -297,7 +297,7 @@ u8 iwl_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap, u8 flags, | |||
| 297 | } | 297 | } |
| 298 | EXPORT_SYMBOL(iwl_add_station); | 298 | EXPORT_SYMBOL(iwl_add_station); |
| 299 | 299 | ||
| 300 | static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const char *addr) | 300 | static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const u8 *addr) |
| 301 | { | 301 | { |
| 302 | unsigned long flags; | 302 | unsigned long flags; |
| 303 | u8 sta_id = iwl_find_station(priv, addr); | 303 | u8 sta_id = iwl_find_station(priv, addr); |
| @@ -324,7 +324,7 @@ static void iwl_remove_sta_callback(struct iwl_priv *priv, | |||
| 324 | { | 324 | { |
| 325 | struct iwl_rem_sta_cmd *rm_sta = | 325 | struct iwl_rem_sta_cmd *rm_sta = |
| 326 | (struct iwl_rem_sta_cmd *)cmd->cmd.payload; | 326 | (struct iwl_rem_sta_cmd *)cmd->cmd.payload; |
| 327 | const char *addr = rm_sta->addr; | 327 | const u8 *addr = rm_sta->addr; |
| 328 | 328 | ||
| 329 | if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) { | 329 | if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) { |
| 330 | IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n", | 330 | IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n", |
diff --git a/include/linux/connector.h b/include/linux/connector.h index 72ba63eb83c5..3a779ffba60b 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h | |||
| @@ -24,9 +24,6 @@ | |||
| 24 | 24 | ||
| 25 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 26 | 26 | ||
| 27 | #define CN_IDX_CONNECTOR 0xffffffff | ||
| 28 | #define CN_VAL_CONNECTOR 0xffffffff | ||
| 29 | |||
| 30 | /* | 27 | /* |
| 31 | * Process Events connector unique ids -- used for message routing | 28 | * Process Events connector unique ids -- used for message routing |
| 32 | */ | 29 | */ |
| @@ -75,30 +72,6 @@ struct cn_msg { | |||
| 75 | __u8 data[0]; | 72 | __u8 data[0]; |
| 76 | }; | 73 | }; |
| 77 | 74 | ||
| 78 | /* | ||
| 79 | * Notify structure - requests notification about | ||
| 80 | * registering/unregistering idx/val in range [first, first+range]. | ||
| 81 | */ | ||
| 82 | struct cn_notify_req { | ||
| 83 | __u32 first; | ||
| 84 | __u32 range; | ||
| 85 | }; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * Main notification control message | ||
| 89 | * *_notify_num - number of appropriate cn_notify_req structures after | ||
| 90 | * this struct. | ||
| 91 | * group - notification receiver's idx. | ||
| 92 | * len - total length of the attached data. | ||
| 93 | */ | ||
| 94 | struct cn_ctl_msg { | ||
| 95 | __u32 idx_notify_num; | ||
| 96 | __u32 val_notify_num; | ||
| 97 | __u32 group; | ||
| 98 | __u32 len; | ||
| 99 | __u8 data[0]; | ||
| 100 | }; | ||
| 101 | |||
| 102 | #ifdef __KERNEL__ | 75 | #ifdef __KERNEL__ |
| 103 | 76 | ||
| 104 | #include <asm/atomic.h> | 77 | #include <asm/atomic.h> |
| @@ -151,11 +124,6 @@ struct cn_callback_entry { | |||
| 151 | u32 seq, group; | 124 | u32 seq, group; |
| 152 | }; | 125 | }; |
| 153 | 126 | ||
| 154 | struct cn_ctl_entry { | ||
| 155 | struct list_head notify_entry; | ||
| 156 | struct cn_ctl_msg *msg; | ||
| 157 | }; | ||
| 158 | |||
| 159 | struct cn_dev { | 127 | struct cn_dev { |
| 160 | struct cb_id id; | 128 | struct cb_id id; |
| 161 | 129 | ||
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 18e7f5a43dc4..6cf526d06e21 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
| @@ -243,6 +243,39 @@ static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | |||
| 243 | input_sync(dev); | 243 | input_sync(dev); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static int __hidp_send_ctrl_message(struct hidp_session *session, | ||
| 247 | unsigned char hdr, unsigned char *data, int size) | ||
| 248 | { | ||
| 249 | struct sk_buff *skb; | ||
| 250 | |||
| 251 | BT_DBG("session %p data %p size %d", session, data, size); | ||
| 252 | |||
| 253 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | ||
| 254 | BT_ERR("Can't allocate memory for new frame"); | ||
| 255 | return -ENOMEM; | ||
| 256 | } | ||
| 257 | |||
| 258 | *skb_put(skb, 1) = hdr; | ||
| 259 | if (data && size > 0) | ||
| 260 | memcpy(skb_put(skb, size), data, size); | ||
| 261 | |||
| 262 | skb_queue_tail(&session->ctrl_transmit, skb); | ||
| 263 | |||
| 264 | return 0; | ||
| 265 | } | ||
| 266 | |||
| 267 | static inline int hidp_send_ctrl_message(struct hidp_session *session, | ||
| 268 | unsigned char hdr, unsigned char *data, int size) | ||
| 269 | { | ||
| 270 | int err; | ||
| 271 | |||
| 272 | err = __hidp_send_ctrl_message(session, hdr, data, size); | ||
| 273 | |||
| 274 | hidp_schedule(session); | ||
| 275 | |||
| 276 | return err; | ||
| 277 | } | ||
| 278 | |||
| 246 | static int hidp_queue_report(struct hidp_session *session, | 279 | static int hidp_queue_report(struct hidp_session *session, |
| 247 | unsigned char *data, int size) | 280 | unsigned char *data, int size) |
| 248 | { | 281 | { |
| @@ -282,7 +315,9 @@ static int hidp_send_report(struct hidp_session *session, struct hid_report *rep | |||
| 282 | 315 | ||
| 283 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) | 316 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) |
| 284 | { | 317 | { |
| 285 | if (hidp_queue_report(hid->driver_data, data, count)) | 318 | if (hidp_send_ctrl_message(hid->driver_data, |
| 319 | HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE, | ||
| 320 | data, count)) | ||
| 286 | return -ENOMEM; | 321 | return -ENOMEM; |
| 287 | return count; | 322 | return count; |
| 288 | } | 323 | } |
| @@ -307,39 +342,6 @@ static inline void hidp_del_timer(struct hidp_session *session) | |||
| 307 | del_timer(&session->timer); | 342 | del_timer(&session->timer); |
| 308 | } | 343 | } |
| 309 | 344 | ||
| 310 | static int __hidp_send_ctrl_message(struct hidp_session *session, | ||
| 311 | unsigned char hdr, unsigned char *data, int size) | ||
| 312 | { | ||
| 313 | struct sk_buff *skb; | ||
| 314 | |||
| 315 | BT_DBG("session %p data %p size %d", session, data, size); | ||
| 316 | |||
| 317 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | ||
| 318 | BT_ERR("Can't allocate memory for new frame"); | ||
| 319 | return -ENOMEM; | ||
| 320 | } | ||
| 321 | |||
| 322 | *skb_put(skb, 1) = hdr; | ||
| 323 | if (data && size > 0) | ||
| 324 | memcpy(skb_put(skb, size), data, size); | ||
| 325 | |||
| 326 | skb_queue_tail(&session->ctrl_transmit, skb); | ||
| 327 | |||
| 328 | return 0; | ||
| 329 | } | ||
| 330 | |||
| 331 | static inline int hidp_send_ctrl_message(struct hidp_session *session, | ||
| 332 | unsigned char hdr, unsigned char *data, int size) | ||
| 333 | { | ||
| 334 | int err; | ||
| 335 | |||
| 336 | err = __hidp_send_ctrl_message(session, hdr, data, size); | ||
| 337 | |||
| 338 | hidp_schedule(session); | ||
| 339 | |||
| 340 | return err; | ||
| 341 | } | ||
| 342 | |||
| 343 | static void hidp_process_handshake(struct hidp_session *session, | 345 | static void hidp_process_handshake(struct hidp_session *session, |
| 344 | unsigned char param) | 346 | unsigned char param) |
| 345 | { | 347 | { |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 1120cf14a548..400efa26ddba 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -1368,7 +1368,6 @@ static int l2cap_ertm_send(struct sock *sk) | |||
| 1368 | 1368 | ||
| 1369 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && | 1369 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && |
| 1370 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { | 1370 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { |
| 1371 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1372 | 1371 | ||
| 1373 | if (pi->remote_max_tx && | 1372 | if (pi->remote_max_tx && |
| 1374 | bt_cb(skb)->retries == pi->remote_max_tx) { | 1373 | bt_cb(skb)->retries == pi->remote_max_tx) { |
| @@ -1376,6 +1375,8 @@ static int l2cap_ertm_send(struct sock *sk) | |||
| 1376 | break; | 1375 | break; |
| 1377 | } | 1376 | } |
| 1378 | 1377 | ||
| 1378 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1379 | |||
| 1379 | bt_cb(skb)->retries++; | 1380 | bt_cb(skb)->retries++; |
| 1380 | 1381 | ||
| 1381 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1382 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
| @@ -3518,7 +3519,6 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3518 | struct l2cap_pinfo *pi; | 3519 | struct l2cap_pinfo *pi; |
| 3519 | u16 control, len; | 3520 | u16 control, len; |
| 3520 | u8 tx_seq; | 3521 | u8 tx_seq; |
| 3521 | int err; | ||
| 3522 | 3522 | ||
| 3523 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); | 3523 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); |
| 3524 | if (!sk) { | 3524 | if (!sk) { |
| @@ -3570,13 +3570,11 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3570 | goto drop; | 3570 | goto drop; |
| 3571 | 3571 | ||
| 3572 | if (__is_iframe(control)) | 3572 | if (__is_iframe(control)) |
| 3573 | err = l2cap_data_channel_iframe(sk, control, skb); | 3573 | l2cap_data_channel_iframe(sk, control, skb); |
| 3574 | else | 3574 | else |
| 3575 | err = l2cap_data_channel_sframe(sk, control, skb); | 3575 | l2cap_data_channel_sframe(sk, control, skb); |
| 3576 | 3576 | ||
| 3577 | if (!err) | 3577 | goto done; |
| 3578 | goto done; | ||
| 3579 | break; | ||
| 3580 | 3578 | ||
| 3581 | case L2CAP_MODE_STREAMING: | 3579 | case L2CAP_MODE_STREAMING: |
| 3582 | control = get_unaligned_le16(skb->data); | 3580 | control = get_unaligned_le16(skb->data); |
| @@ -3602,7 +3600,7 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3602 | else | 3600 | else |
| 3603 | pi->expected_tx_seq = tx_seq + 1; | 3601 | pi->expected_tx_seq = tx_seq + 1; |
| 3604 | 3602 | ||
| 3605 | err = l2cap_sar_reassembly_sdu(sk, skb, control); | 3603 | l2cap_sar_reassembly_sdu(sk, skb, control); |
| 3606 | 3604 | ||
| 3607 | goto done; | 3605 | goto done; |
| 3608 | 3606 | ||
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 312c20adc83f..624a54832a7c 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -63,6 +63,7 @@ struct nf_ct_frag6_queue | |||
| 63 | struct inet_frag_queue q; | 63 | struct inet_frag_queue q; |
| 64 | 64 | ||
| 65 | __be32 id; /* fragment id */ | 65 | __be32 id; /* fragment id */ |
| 66 | u32 user; | ||
| 66 | struct in6_addr saddr; | 67 | struct in6_addr saddr; |
| 67 | struct in6_addr daddr; | 68 | struct in6_addr daddr; |
| 68 | 69 | ||
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h index ee94ea0c67e9..da8497ef7063 100644 --- a/net/mac80211/driver-trace.h +++ b/net/mac80211/driver-trace.h | |||
| @@ -680,7 +680,7 @@ TRACE_EVENT(drv_ampdu_action, | |||
| 680 | __entry->ret = ret; | 680 | __entry->ret = ret; |
| 681 | __entry->action = action; | 681 | __entry->action = action; |
| 682 | __entry->tid = tid; | 682 | __entry->tid = tid; |
| 683 | __entry->ssn = *ssn; | 683 | __entry->ssn = ssn ? *ssn : 0; |
| 684 | ), | 684 | ), |
| 685 | 685 | ||
| 686 | TP_printk( | 686 | TP_printk( |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 59d8064eb522..42f21c01a93e 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -1437,8 +1437,9 @@ ctnetlink_exp_dump_mask(struct sk_buff *skb, | |||
| 1437 | struct nlattr *nest_parms; | 1437 | struct nlattr *nest_parms; |
| 1438 | 1438 | ||
| 1439 | memset(&m, 0xFF, sizeof(m)); | 1439 | memset(&m, 0xFF, sizeof(m)); |
| 1440 | m.src.u.all = mask->src.u.all; | ||
| 1441 | memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3)); | 1440 | memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3)); |
| 1441 | m.src.u.all = mask->src.u.all; | ||
| 1442 | m.dst.protonum = tuple->dst.protonum; | ||
| 1442 | 1443 | ||
| 1443 | nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED); | 1444 | nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED); |
| 1444 | if (!nest_parms) | 1445 | if (!nest_parms) |
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c index 4b572163784b..023966b569bf 100644 --- a/net/netfilter/nf_conntrack_sip.c +++ b/net/netfilter/nf_conntrack_sip.c | |||
| @@ -376,7 +376,7 @@ int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, | |||
| 376 | dptr += hdr->len; | 376 | dptr += hdr->len; |
| 377 | else if (hdr->cname && limit - dptr >= hdr->clen + 1 && | 377 | else if (hdr->cname && limit - dptr >= hdr->clen + 1 && |
| 378 | strnicmp(dptr, hdr->cname, hdr->clen) == 0 && | 378 | strnicmp(dptr, hdr->cname, hdr->clen) == 0 && |
| 379 | !isalpha(*(dptr + hdr->clen + 1))) | 379 | !isalpha(*(dptr + hdr->clen))) |
| 380 | dptr += hdr->clen; | 380 | dptr += hdr->clen; |
| 381 | else | 381 | else |
| 382 | continue; | 382 | continue; |
