Commit 5d949944 authored by John W. Linville's avatar John W. Linville

Merge branch 'master' of...

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
parents a21d4572 b4838d12
...@@ -1521,8 +1521,8 @@ M: Gustavo Padovan <gustavo@padovan.org> ...@@ -1521,8 +1521,8 @@ M: Gustavo Padovan <gustavo@padovan.org>
M: Johan Hedberg <johan.hedberg@gmail.com> M: Johan Hedberg <johan.hedberg@gmail.com>
L: linux-bluetooth@vger.kernel.org L: linux-bluetooth@vger.kernel.org
W: http://www.bluez.org/ W: http://www.bluez.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jh/bluetooth.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
S: Maintained S: Maintained
F: drivers/bluetooth/ F: drivers/bluetooth/
...@@ -1532,8 +1532,8 @@ M: Gustavo Padovan <gustavo@padovan.org> ...@@ -1532,8 +1532,8 @@ M: Gustavo Padovan <gustavo@padovan.org>
M: Johan Hedberg <johan.hedberg@gmail.com> M: Johan Hedberg <johan.hedberg@gmail.com>
L: linux-bluetooth@vger.kernel.org L: linux-bluetooth@vger.kernel.org
W: http://www.bluez.org/ W: http://www.bluez.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jh/bluetooth.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
S: Maintained S: Maintained
F: net/bluetooth/ F: net/bluetooth/
F: include/net/bluetooth/ F: include/net/bluetooth/
......
...@@ -29,7 +29,7 @@ config BCMA_HOST_PCI ...@@ -29,7 +29,7 @@ config BCMA_HOST_PCI
config BCMA_DRIVER_PCI_HOSTMODE config BCMA_DRIVER_PCI_HOSTMODE
bool "Driver for PCI core working in hostmode" bool "Driver for PCI core working in hostmode"
depends on BCMA && MIPS depends on BCMA && MIPS && BCMA_HOST_PCI
help help
PCI core hostmode operation (external PCI bus). PCI core hostmode operation (external PCI bus).
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
#include "bcma_private.h" #include "bcma_private.h"
#include <linux/pci.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/bcma/bcma.h> #include <linux/bcma/bcma.h>
#include <asm/paccess.h> #include <asm/paccess.h>
......
...@@ -72,7 +72,9 @@ static struct usb_device_id ath3k_table[] = { ...@@ -72,7 +72,9 @@ static struct usb_device_id ath3k_table[] = {
/* Atheros AR3012 with sflash firmware*/ /* Atheros AR3012 with sflash firmware*/
{ USB_DEVICE(0x0CF3, 0x3004) }, { USB_DEVICE(0x0CF3, 0x3004) },
{ USB_DEVICE(0x0CF3, 0x311D) },
{ USB_DEVICE(0x13d3, 0x3375) }, { USB_DEVICE(0x13d3, 0x3375) },
{ USB_DEVICE(0x04CA, 0x3005) },
/* Atheros AR5BBU12 with sflash firmware */ /* Atheros AR5BBU12 with sflash firmware */
{ USB_DEVICE(0x0489, 0xE02C) }, { USB_DEVICE(0x0489, 0xE02C) },
...@@ -89,7 +91,9 @@ static struct usb_device_id ath3k_blist_tbl[] = { ...@@ -89,7 +91,9 @@ static struct usb_device_id ath3k_blist_tbl[] = {
/* Atheros AR3012 with sflash firmware*/ /* Atheros AR3012 with sflash firmware*/
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
......
...@@ -61,7 +61,7 @@ static struct usb_device_id btusb_table[] = { ...@@ -61,7 +61,7 @@ static struct usb_device_id btusb_table[] = {
{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, { USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
/* Broadcom SoftSailing reporting vendor specific */ /* Broadcom SoftSailing reporting vendor specific */
{ USB_DEVICE(0x05ac, 0x21e1) }, { USB_DEVICE(0x0a5c, 0x21e1) },
/* Apple MacBookPro 7,1 */ /* Apple MacBookPro 7,1 */
{ USB_DEVICE(0x05ac, 0x8213) }, { USB_DEVICE(0x05ac, 0x8213) },
...@@ -103,6 +103,7 @@ static struct usb_device_id btusb_table[] = { ...@@ -103,6 +103,7 @@ static struct usb_device_id btusb_table[] = {
/* Broadcom BCM20702A0 */ /* Broadcom BCM20702A0 */
{ USB_DEVICE(0x0a5c, 0x21e3) }, { USB_DEVICE(0x0a5c, 0x21e3) },
{ USB_DEVICE(0x0a5c, 0x21e6) }, { USB_DEVICE(0x0a5c, 0x21e6) },
{ USB_DEVICE(0x0a5c, 0x21e8) },
{ USB_DEVICE(0x0a5c, 0x21f3) }, { USB_DEVICE(0x0a5c, 0x21f3) },
{ USB_DEVICE(0x413c, 0x8197) }, { USB_DEVICE(0x413c, 0x8197) },
...@@ -129,7 +130,9 @@ static struct usb_device_id blacklist_table[] = { ...@@ -129,7 +130,9 @@ static struct usb_device_id blacklist_table[] = {
/* Atheros 3012 with sflash firmware */ /* Atheros 3012 with sflash firmware */
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
/* Atheros AR5BBU12 with sflash firmware */ /* Atheros AR5BBU12 with sflash firmware */
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
......
...@@ -299,11 +299,11 @@ static void hci_uart_tty_close(struct tty_struct *tty) ...@@ -299,11 +299,11 @@ static void hci_uart_tty_close(struct tty_struct *tty)
hci_uart_close(hdev); hci_uart_close(hdev);
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
hu->proto->close(hu);
if (hdev) { if (hdev) {
hci_unregister_dev(hdev); hci_unregister_dev(hdev);
hci_free_dev(hdev); hci_free_dev(hdev);
} }
hu->proto->close(hu);
} }
kfree(hu); kfree(hu);
......
...@@ -118,15 +118,13 @@ void ath9k_ps_restore(struct ath_softc *sc) ...@@ -118,15 +118,13 @@ void ath9k_ps_restore(struct ath_softc *sc)
if (--sc->ps_usecount != 0) if (--sc->ps_usecount != 0)
goto unlock; goto unlock;
if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK))
goto unlock;
if (sc->ps_idle)
mode = ATH9K_PM_FULL_SLEEP; mode = ATH9K_PM_FULL_SLEEP;
else if (sc->ps_enabled && else if (sc->ps_enabled &&
!(sc->ps_flags & (PS_WAIT_FOR_BEACON | !(sc->ps_flags & (PS_WAIT_FOR_BEACON |
PS_WAIT_FOR_CAB | PS_WAIT_FOR_CAB |
PS_WAIT_FOR_PSPOLL_DATA))) PS_WAIT_FOR_PSPOLL_DATA |
PS_WAIT_FOR_TX_ACK)))
mode = ATH9K_PM_NETWORK_SLEEP; mode = ATH9K_PM_NETWORK_SLEEP;
else else
goto unlock; goto unlock;
......
...@@ -1062,11 +1062,6 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) ...@@ -1062,11 +1062,6 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev)
set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags); set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags);
/*
* Register the extra components.
*/
rt2x00rfkill_register(rt2x00dev);
return 0; return 0;
} }
...@@ -1210,6 +1205,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) ...@@ -1210,6 +1205,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
rt2x00link_register(rt2x00dev); rt2x00link_register(rt2x00dev);
rt2x00leds_register(rt2x00dev); rt2x00leds_register(rt2x00dev);
rt2x00debug_register(rt2x00dev); rt2x00debug_register(rt2x00dev);
rt2x00rfkill_register(rt2x00dev);
return 0; return 0;
......
...@@ -838,7 +838,10 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, ...@@ -838,7 +838,10 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
__le16 fc = hdr->frame_control; __le16 fc = hdr->frame_control;
txrate = ieee80211_get_tx_rate(hw, info); txrate = ieee80211_get_tx_rate(hw, info);
tcb_desc->hw_rate = txrate->hw_value; if (txrate)
tcb_desc->hw_rate = txrate->hw_value;
else
tcb_desc->hw_rate = 0;
if (ieee80211_is_data(fc)) { if (ieee80211_is_data(fc)) {
/* /*
......
...@@ -912,8 +912,13 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) ...@@ -912,8 +912,13 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
ring = &rtlpci->tx_ring[BEACON_QUEUE]; ring = &rtlpci->tx_ring[BEACON_QUEUE];
pskb = __skb_dequeue(&ring->queue); pskb = __skb_dequeue(&ring->queue);
if (pskb) if (pskb) {
struct rtl_tx_desc *entry = &ring->desc[ring->idx];
pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc(
(u8 *) entry, true, HW_DESC_TXBUFF_ADDR),
pskb->len, PCI_DMA_TODEVICE);
kfree_skb(pskb); kfree_skb(pskb);
}
/*NB: the beacon data buffer must be 32-bit aligned. */ /*NB: the beacon data buffer must be 32-bit aligned. */
pskb = ieee80211_beacon_get(hw, mac->vif); pskb = ieee80211_beacon_get(hw, mac->vif);
......
...@@ -91,7 +91,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw) ...@@ -91,7 +91,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
u8 tid; u8 tid;
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
static int header_print;
rtlpriv->dm.dm_initialgain_enable = true; rtlpriv->dm.dm_initialgain_enable = true;
rtlpriv->dm.dm_flag = 0; rtlpriv->dm.dm_flag = 0;
...@@ -171,10 +170,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw) ...@@ -171,10 +170,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
for (tid = 0; tid < 8; tid++) for (tid = 0; tid < 8; tid++)
skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]); skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]);
/* Only load firmware for first MAC */
if (header_print)
return 0;
/* for firmware buf */ /* for firmware buf */
rtlpriv->rtlhal.pfirmware = vzalloc(0x8000); rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
if (!rtlpriv->rtlhal.pfirmware) { if (!rtlpriv->rtlhal.pfirmware) {
...@@ -186,7 +181,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw) ...@@ -186,7 +181,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->max_fw_size = 0x8000; rtlpriv->max_fw_size = 0x8000;
pr_info("Driver for Realtek RTL8192DE WLAN interface\n"); pr_info("Driver for Realtek RTL8192DE WLAN interface\n");
pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name); pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
header_print++;
/* request fw */ /* request fw */
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name, err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
......
...@@ -124,46 +124,38 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request, ...@@ -124,46 +124,38 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,
return status; return status;
} }
static u32 _usb_read_sync(struct usb_device *udev, u32 addr, u16 len) static u32 _usb_read_sync(struct rtl_priv *rtlpriv, u32 addr, u16 len)
{ {
struct device *dev = rtlpriv->io.dev;
struct usb_device *udev = to_usb_device(dev);
u8 request; u8 request;
u16 wvalue; u16 wvalue;
u16 index; u16 index;
u32 *data; __le32 *data = &rtlpriv->usb_data[rtlpriv->usb_data_index];
u32 ret;
data = kmalloc(sizeof(u32), GFP_KERNEL);
if (!data)
return -ENOMEM;
request = REALTEK_USB_VENQT_CMD_REQ; request = REALTEK_USB_VENQT_CMD_REQ;
index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */ index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */
wvalue = (u16)addr; wvalue = (u16)addr;
_usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len); _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len);
ret = le32_to_cpu(*data); if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT)
kfree(data); rtlpriv->usb_data_index = 0;
return ret; return le32_to_cpu(*data);
} }
static u8 _usb_read8_sync(struct rtl_priv *rtlpriv, u32 addr) static u8 _usb_read8_sync(struct rtl_priv *rtlpriv, u32 addr)
{ {
struct device *dev = rtlpriv->io.dev; return (u8)_usb_read_sync(rtlpriv, addr, 1);
return (u8)_usb_read_sync(to_usb_device(dev), addr, 1);
} }
static u16 _usb_read16_sync(struct rtl_priv *rtlpriv, u32 addr) static u16 _usb_read16_sync(struct rtl_priv *rtlpriv, u32 addr)
{ {
struct device *dev = rtlpriv->io.dev; return (u16)_usb_read_sync(rtlpriv, addr, 2);
return (u16)_usb_read_sync(to_usb_device(dev), addr, 2);
} }
static u32 _usb_read32_sync(struct rtl_priv *rtlpriv, u32 addr) static u32 _usb_read32_sync(struct rtl_priv *rtlpriv, u32 addr)
{ {
struct device *dev = rtlpriv->io.dev; return _usb_read_sync(rtlpriv, addr, 4);
return _usb_read_sync(to_usb_device(dev), addr, 4);
} }
static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val, static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val,
...@@ -955,6 +947,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, ...@@ -955,6 +947,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
return -ENOMEM; return -ENOMEM;
} }
rtlpriv = hw->priv; rtlpriv = hw->priv;
rtlpriv->usb_data = kzalloc(RTL_USB_MAX_RX_COUNT * sizeof(u32),
GFP_KERNEL);
if (!rtlpriv->usb_data)
return -ENOMEM;
rtlpriv->usb_data_index = 0;
init_completion(&rtlpriv->firmware_loading_complete); init_completion(&rtlpriv->firmware_loading_complete);
SET_IEEE80211_DEV(hw, &intf->dev); SET_IEEE80211_DEV(hw, &intf->dev);
udev = interface_to_usbdev(intf); udev = interface_to_usbdev(intf);
...@@ -1025,6 +1022,7 @@ void rtl_usb_disconnect(struct usb_interface *intf) ...@@ -1025,6 +1022,7 @@ void rtl_usb_disconnect(struct usb_interface *intf)
/* rtl_deinit_rfkill(hw); */ /* rtl_deinit_rfkill(hw); */
rtl_usb_deinit(hw); rtl_usb_deinit(hw);
rtl_deinit_core(hw); rtl_deinit_core(hw);
kfree(rtlpriv->usb_data);
rtlpriv->cfg->ops->deinit_sw_leds(hw); rtlpriv->cfg->ops->deinit_sw_leds(hw);
rtlpriv->cfg->ops->deinit_sw_vars(hw); rtlpriv->cfg->ops->deinit_sw_vars(hw);
_rtl_usb_io_handler_release(hw); _rtl_usb_io_handler_release(hw);
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
#define QOS_QUEUE_NUM 4 #define QOS_QUEUE_NUM 4
#define RTL_MAC80211_NUM_QUEUE 5 #define RTL_MAC80211_NUM_QUEUE 5
#define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 #define REALTEK_USB_VENQT_MAX_BUF_SIZE 254
#define RTL_USB_MAX_RX_COUNT 100
#define QBSS_LOAD_SIZE 5 #define QBSS_LOAD_SIZE 5
#define MAX_WMMELE_LENGTH 64 #define MAX_WMMELE_LENGTH 64
...@@ -1629,6 +1629,10 @@ struct rtl_priv { ...@@ -1629,6 +1629,10 @@ struct rtl_priv {
interface or hardware */ interface or hardware */
unsigned long status; unsigned long status;
/* data buffer pointer for USB reads */
__le32 *usb_data;
int usb_data_index;
/*This must be the last item so /*This must be the last item so
that it points to the data allocated that it points to the data allocated
beyond this structure like: beyond this structure like:
......
...@@ -92,6 +92,7 @@ enum { ...@@ -92,6 +92,7 @@ enum {
HCI_SERVICE_CACHE, HCI_SERVICE_CACHE,
HCI_LINK_KEYS, HCI_LINK_KEYS,
HCI_DEBUG_KEYS, HCI_DEBUG_KEYS,
HCI_UNREGISTER,
HCI_LE_SCAN, HCI_LE_SCAN,
HCI_SSP_ENABLED, HCI_SSP_ENABLED,
...@@ -1327,8 +1328,8 @@ struct sockaddr_hci { ...@@ -1327,8 +1328,8 @@ struct sockaddr_hci {
#define HCI_DEV_NONE 0xffff #define HCI_DEV_NONE 0xffff
#define HCI_CHANNEL_RAW 0 #define HCI_CHANNEL_RAW 0
#define HCI_CHANNEL_CONTROL 1
#define HCI_CHANNEL_MONITOR 2 #define HCI_CHANNEL_MONITOR 2
#define HCI_CHANNEL_CONTROL 3
struct hci_filter { struct hci_filter {
unsigned long type_mask; unsigned long type_mask;
......
...@@ -427,7 +427,7 @@ enum { ...@@ -427,7 +427,7 @@ enum {
static inline bool hci_conn_ssp_enabled(struct hci_conn *conn) static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
{ {
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
return (test_bit(HCI_SSP_ENABLED, &hdev->flags) && return (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
test_bit(HCI_CONN_SSP_ENABLED, &conn->flags)); test_bit(HCI_CONN_SSP_ENABLED, &conn->flags));
} }
...@@ -907,11 +907,13 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status, ...@@ -907,11 +907,13 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type) static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
{ {
u8 field_len; size_t parsed = 0;
size_t parsed;
for (parsed = 0; parsed < data_len - 1; parsed += field_len) { if (data_len < 2)
field_len = data[0]; return false;
while (parsed < data_len - 1) {
u8 field_len = data[0];
if (field_len == 0) if (field_len == 0)
break; break;
......
...@@ -117,7 +117,7 @@ struct mgmt_mode { ...@@ -117,7 +117,7 @@ struct mgmt_mode {
#define MGMT_OP_SET_DISCOVERABLE 0x0006 #define MGMT_OP_SET_DISCOVERABLE 0x0006
struct mgmt_cp_set_discoverable { struct mgmt_cp_set_discoverable {
__u8 val; __u8 val;
__u16 timeout; __le16 timeout;
} __packed; } __packed;
#define MGMT_SET_DISCOVERABLE_SIZE 3 #define MGMT_SET_DISCOVERABLE_SIZE 3
......
...@@ -1327,7 +1327,7 @@ static inline struct ieee80211_rate * ...@@ -1327,7 +1327,7 @@ static inline struct ieee80211_rate *
ieee80211_get_tx_rate(const struct ieee80211_hw *hw, ieee80211_get_tx_rate(const struct ieee80211_hw *hw,
const struct ieee80211_tx_info *c) const struct ieee80211_tx_info *c)
{ {
if (WARN_ON(c->control.rates[0].idx < 0)) if (WARN_ON_ONCE(c->control.rates[0].idx < 0))
return NULL; return NULL;
return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[0].idx]; return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[0].idx];
} }
......
...@@ -665,6 +665,11 @@ int hci_dev_open(__u16 dev) ...@@ -665,6 +665,11 @@ int hci_dev_open(__u16 dev)
hci_req_lock(hdev); hci_req_lock(hdev);
if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
ret = -ENODEV;
goto done;
}
if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) { if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) {
ret = -ERFKILL; ret = -ERFKILL;
goto done; goto done;
...@@ -1849,6 +1854,8 @@ void hci_unregister_dev(struct hci_dev *hdev) ...@@ -1849,6 +1854,8 @@ void hci_unregister_dev(struct hci_dev *hdev)
BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
set_bit(HCI_UNREGISTER, &hdev->dev_flags);
write_lock(&hci_dev_list_lock); write_lock(&hci_dev_list_lock);
list_del(&hdev->list); list_del(&hdev->list);
write_unlock(&hci_dev_list_lock); write_unlock(&hci_dev_list_lock);
......
...@@ -1308,6 +1308,7 @@ static void l2cap_monitor_timeout(struct work_struct *work) ...@@ -1308,6 +1308,7 @@ static void l2cap_monitor_timeout(struct work_struct *work)
if (chan->retry_count >= chan->remote_max_tx) { if (chan->retry_count >= chan->remote_max_tx) {
l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);
l2cap_chan_unlock(chan); l2cap_chan_unlock(chan);
l2cap_chan_put(chan);
return; return;
} }
...@@ -1316,6 +1317,7 @@ static void l2cap_monitor_timeout(struct work_struct *work) ...@@ -1316,6 +1317,7 @@ static void l2cap_monitor_timeout(struct work_struct *work)
l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL);
l2cap_chan_unlock(chan); l2cap_chan_unlock(chan);
l2cap_chan_put(chan);
} }
static void l2cap_retrans_timeout(struct work_struct *work) static void l2cap_retrans_timeout(struct work_struct *work)
...@@ -1335,6 +1337,7 @@ static void l2cap_retrans_timeout(struct work_struct *work) ...@@ -1335,6 +1337,7 @@ static void l2cap_retrans_timeout(struct work_struct *work)
l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL);
l2cap_chan_unlock(chan); l2cap_chan_unlock(chan);
l2cap_chan_put(chan);
} }
static void l2cap_drop_acked_frames(struct l2cap_chan *chan) static void l2cap_drop_acked_frames(struct l2cap_chan *chan)
......
...@@ -82,7 +82,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) ...@@ -82,7 +82,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
} }
if (la.l2_cid) if (la.l2_cid)
err = l2cap_add_scid(chan, la.l2_cid); err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
else else
err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm); err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
...@@ -123,7 +123,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al ...@@ -123,7 +123,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al
if (la.l2_cid && la.l2_psm) if (la.l2_cid && la.l2_psm)
return -EINVAL; return -EINVAL;
err = l2cap_chan_connect(chan, la.l2_psm, la.l2_cid, &la.l2_bdaddr); err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
&la.l2_bdaddr);
if (err) if (err)
return err; return err;
......
...@@ -2523,13 +2523,18 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, ...@@ -2523,13 +2523,18 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
if (cp->val) { if (cp->val) {
type = PAGE_SCAN_TYPE_INTERLACED; type = PAGE_SCAN_TYPE_INTERLACED;
acp.interval = 0x0024; /* 22.5 msec page scan interval */
/* 22.5 msec page scan interval */
acp.interval = __constant_cpu_to_le16(0x0024);
} else { } else {
type = PAGE_SCAN_TYPE_STANDARD; /* default */ type = PAGE_SCAN_TYPE_STANDARD; /* default */
acp.interval = 0x0800; /* default 1.28 sec page scan */
/* default 1.28 sec page scan */
acp.interval = __constant_cpu_to_le16(0x0800);
} }
acp.window = 0x0012; /* default 11.25 msec page scan window */ /* default 11.25 msec page scan window */
acp.window = __constant_cpu_to_le16(0x0012);
err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp),
&acp); &acp);
...@@ -2936,7 +2941,7 @@ int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, ...@@ -2936,7 +2941,7 @@ int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
name, name_len); name, name_len);
if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0) if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
eir_len = eir_append_data(&ev->eir[eir_len], eir_len, eir_len = eir_append_data(ev->eir, eir_len,
EIR_CLASS_OF_DEV, dev_class, 3); EIR_CLASS_OF_DEV, dev_class, 3);
put_unaligned_le16(eir_len, &ev->eir_len); put_unaligned_le16(eir_len, &ev->eir_len);
......
...@@ -3387,8 +3387,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, ...@@ -3387,8 +3387,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
*/ */
printk(KERN_DEBUG "%s: waiting for beacon from %pM\n", printk(KERN_DEBUG "%s: waiting for beacon from %pM\n",
sdata->name, ifmgd->bssid); sdata->name, ifmgd->bssid);
assoc_data->timeout = jiffies + assoc_data->timeout = TU_TO_EXP_TIME(req->bss->beacon_interval);
TU_TO_EXP_TIME(req->bss->beacon_interval);
} else { } else {
assoc_data->have_beacon = true; assoc_data->have_beacon = true;
assoc_data->sent_assoc = false; assoc_data->sent_assoc = false;
......
...@@ -474,7 +474,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, ...@@ -474,7 +474,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
while (remaining_len > 0) { while (remaining_len > 0) {
frag_len = min_t(u16, local->remote_miu, remaining_len); frag_len = min_t(size_t, local->remote_miu, remaining_len);
pr_debug("Fragment %zd bytes remaining %zd", pr_debug("Fragment %zd bytes remaining %zd",
frag_len, remaining_len); frag_len, remaining_len);
...@@ -497,7 +497,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, ...@@ -497,7 +497,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
release_sock(sk); release_sock(sk);
remaining_len -= frag_len; remaining_len -= frag_len;
msg_ptr += len; msg_ptr += frag_len;
} }
kfree(msg_data); kfree(msg_data);
......
...@@ -1294,6 +1294,11 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) ...@@ -1294,6 +1294,11 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
goto bad_res; goto bad_res;
} }
if (!netif_running(netdev)) {
result = -ENETDOWN;
goto bad_res;
}
nla_for_each_nested(nl_txq_params, nla_for_each_nested(nl_txq_params,
info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
rem_txq_params) { rem_txq_params) {
...@@ -6384,7 +6389,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6384,7 +6389,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_get_key, .doit = nl80211_get_key,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6416,7 +6421,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6416,7 +6421,7 @@ static struct genl_ops nl80211_ops[] = {
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.doit = nl80211_set_beacon, .doit = nl80211_set_beacon,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6424,7 +6429,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6424,7 +6429,7 @@ static struct genl_ops nl80211_ops[] = {
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.doit = nl80211_start_ap, .doit = nl80211_start_ap,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6432,7 +6437,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6432,7 +6437,7 @@ static struct genl_ops nl80211_ops[] = {
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.doit = nl80211_stop_ap, .doit = nl80211_stop_ap,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6448,7 +6453,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6448,7 +6453,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_set_station, .doit = nl80211_set_station,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6464,7 +6469,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6464,7 +6469,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_del_station, .doit = nl80211_del_station,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6497,7 +6502,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6497,7 +6502,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_del_mpath, .doit = nl80211_del_mpath,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6505,7 +6510,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6505,7 +6510,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_set_bss, .doit = nl80211_set_bss,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6531,7 +6536,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6531,7 +6536,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_get_mesh_config, .doit = nl80211_get_mesh_config,
.policy = nl80211_policy, .policy = nl80211_policy,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6664,7 +6669,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6664,7 +6669,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_setdel_pmksa, .doit = nl80211_setdel_pmksa,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6672,7 +6677,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6672,7 +6677,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_setdel_pmksa, .doit = nl80211_setdel_pmksa,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6680,7 +6685,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6680,7 +6685,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_flush_pmksa, .doit = nl80211_flush_pmksa,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
...@@ -6840,7 +6845,7 @@ static struct genl_ops nl80211_ops[] = { ...@@ -6840,7 +6845,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_probe_client, .doit = nl80211_probe_client,
.policy = nl80211_policy, .policy = nl80211_policy,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{ {
......
...@@ -780,8 +780,10 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, ...@@ -780,8 +780,10 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd,
if (cmd == SIOCSIWENCODEEXT) { if (cmd == SIOCSIWENCODEEXT) {
struct iw_encode_ext *ee = (void *) extra; struct iw_encode_ext *ee = (void *) extra;
if (iwp->length < sizeof(*ee) + ee->key_len) if (iwp->length < sizeof(*ee) + ee->key_len) {
return -EFAULT; err = -EFAULT;
goto out;
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment