Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
This commit is contained in:
@@ -134,6 +134,7 @@ struct bcma_host_ops {
|
||||
#define BCMA_CORE_I2S 0x834
|
||||
#define BCMA_CORE_SDR_DDR1_MEM_CTL 0x835 /* SDR/DDR1 memory controller core */
|
||||
#define BCMA_CORE_SHIM 0x837 /* SHIM component in ubus/6362 */
|
||||
#define BCMA_CORE_ARM_CR4 0x83e
|
||||
#define BCMA_CORE_DEFAULT 0xFFF
|
||||
|
||||
#define BCMA_MAX_NR_CORES 16
|
||||
|
||||
@@ -316,6 +316,9 @@
|
||||
#define BCMA_CC_PMU_CTL 0x0600 /* PMU control */
|
||||
#define BCMA_CC_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */
|
||||
#define BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16
|
||||
#define BCMA_CC_PMU_CTL_RES 0x00006000 /* reset control mask */
|
||||
#define BCMA_CC_PMU_CTL_RES_SHIFT 13
|
||||
#define BCMA_CC_PMU_CTL_RES_RELOAD 0x2 /* reload POR values */
|
||||
#define BCMA_CC_PMU_CTL_PLL_UPD 0x00000400
|
||||
#define BCMA_CC_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */
|
||||
#define BCMA_CC_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#define BCMA_IOST_BIST_DONE 0x8000
|
||||
#define BCMA_RESET_CTL 0x0800
|
||||
#define BCMA_RESET_CTL_RESET 0x0001
|
||||
#define BCMA_RESET_ST 0x0804
|
||||
|
||||
/* BCMA PCI config space registers. */
|
||||
#define BCMA_PCI_PMCSR 0x44
|
||||
|
||||
@@ -672,6 +672,36 @@ struct ieee80211_channel_sw_ie {
|
||||
u8 count;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_ext_chansw_ie
|
||||
*
|
||||
* This structure represents the "Extended Channel Switch Announcement element"
|
||||
*/
|
||||
struct ieee80211_ext_chansw_ie {
|
||||
u8 mode;
|
||||
u8 new_operating_class;
|
||||
u8 new_ch_num;
|
||||
u8 count;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_sec_chan_offs_ie - secondary channel offset IE
|
||||
* @sec_chan_offs: secondary channel offset, uses IEEE80211_HT_PARAM_CHA_SEC_*
|
||||
* values here
|
||||
* This structure represents the "Secondary Channel Offset element"
|
||||
*/
|
||||
struct ieee80211_sec_chan_offs_ie {
|
||||
u8 sec_chan_offs;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE
|
||||
*/
|
||||
struct ieee80211_wide_bw_chansw_ie {
|
||||
u8 new_channel_width;
|
||||
u8 new_center_freq_seg0, new_center_freq_seg1;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_tim
|
||||
*
|
||||
@@ -840,10 +870,13 @@ struct ieee80211_mgmt {
|
||||
} __packed wme_action;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 element_id;
|
||||
u8 length;
|
||||
struct ieee80211_channel_sw_ie sw_elem;
|
||||
u8 variable[0];
|
||||
} __packed chan_switch;
|
||||
struct{
|
||||
u8 action_code;
|
||||
struct ieee80211_ext_chansw_ie data;
|
||||
u8 variable[0];
|
||||
} __packed ext_chan_switch;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 dialog_token;
|
||||
@@ -1027,6 +1060,26 @@ enum ieee80211_p2p_attr_id {
|
||||
IEEE80211_P2P_ATTR_MAX
|
||||
};
|
||||
|
||||
/* Notice of Absence attribute - described in P2P spec 4.1.14 */
|
||||
/* Typical max value used here */
|
||||
#define IEEE80211_P2P_NOA_DESC_MAX 4
|
||||
|
||||
struct ieee80211_p2p_noa_desc {
|
||||
u8 count;
|
||||
__le32 duration;
|
||||
__le32 interval;
|
||||
__le32 start_time;
|
||||
} __packed;
|
||||
|
||||
struct ieee80211_p2p_noa_attr {
|
||||
u8 index;
|
||||
u8 oppps_ctwindow;
|
||||
struct ieee80211_p2p_noa_desc desc[IEEE80211_P2P_NOA_DESC_MAX];
|
||||
} __packed;
|
||||
|
||||
#define IEEE80211_P2P_OPPPS_ENABLE_BIT BIT(7)
|
||||
#define IEEE80211_P2P_OPPPS_CTWINDOW_MASK 0x7F
|
||||
|
||||
/**
|
||||
* struct ieee80211_bar - HT Block Ack Request
|
||||
*
|
||||
@@ -1618,6 +1671,7 @@ enum ieee80211_eid {
|
||||
|
||||
WLAN_EID_HT_CAPABILITY = 45,
|
||||
WLAN_EID_HT_OPERATION = 61,
|
||||
WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62,
|
||||
|
||||
WLAN_EID_RSN = 48,
|
||||
WLAN_EID_MMIE = 76,
|
||||
@@ -1652,6 +1706,8 @@ enum ieee80211_eid {
|
||||
WLAN_EID_VHT_CAPABILITY = 191,
|
||||
WLAN_EID_VHT_OPERATION = 192,
|
||||
WLAN_EID_OPMODE_NOTIF = 199,
|
||||
WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194,
|
||||
WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196,
|
||||
|
||||
/* 802.11ad */
|
||||
WLAN_EID_NON_TX_BSSID_CAP = 83,
|
||||
@@ -1775,6 +1831,7 @@ enum ieee80211_key_len {
|
||||
|
||||
/* Public action codes */
|
||||
enum ieee80211_pub_actioncode {
|
||||
WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,
|
||||
WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
|
||||
};
|
||||
|
||||
@@ -1935,6 +1992,16 @@ enum ieee80211_timeout_interval_type {
|
||||
WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_timeout_interval_ie - Timeout Interval element
|
||||
* @type: type, see &enum ieee80211_timeout_interval_type
|
||||
* @value: timeout interval value
|
||||
*/
|
||||
struct ieee80211_timeout_interval_ie {
|
||||
u8 type;
|
||||
__le32 value;
|
||||
} __packed;
|
||||
|
||||
/* BACK action code */
|
||||
enum ieee80211_back_actioncode {
|
||||
WLAN_ACTION_ADDBA_REQ = 0,
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (c) 2013 Broadcom Corporation
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_BRCMFMAC_PLATFORM_H
|
||||
#define _LINUX_BRCMFMAC_PLATFORM_H
|
||||
|
||||
/*
|
||||
* Platform specific driver functions and data. Through the platform specific
|
||||
* device data functions can be provided to help the brcmfmac driver to
|
||||
* operate with the device in combination with the used platform.
|
||||
*
|
||||
* Use the platform data in the following (similar) way:
|
||||
*
|
||||
*
|
||||
#include <brcmfmac_platform.h>
|
||||
|
||||
|
||||
static void brcmfmac_power_on(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void brcmfmac_power_off(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void brcmfmac_reset(void)
|
||||
{
|
||||
}
|
||||
|
||||
static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = {
|
||||
.power_on = brcmfmac_power_on,
|
||||
.power_off = brcmfmac_power_off,
|
||||
.reset = brcmfmac_reset
|
||||
};
|
||||
|
||||
static struct platform_device brcmfmac_device = {
|
||||
.name = BRCMFMAC_SDIO_PDATA_NAME,
|
||||
.id = PLATFORM_DEVID_NONE,
|
||||
.dev.platform_data = &brcmfmac_sdio_pdata
|
||||
};
|
||||
|
||||
void __init brcmfmac_init_pdata(void)
|
||||
{
|
||||
brcmfmac_sdio_pdata.oob_irq_supported = true;
|
||||
brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB);
|
||||
brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ |
|
||||
IORESOURCE_IRQ_HIGHLEVEL;
|
||||
platform_device_register(&brcmfmac_device);
|
||||
}
|
||||
*
|
||||
*
|
||||
* Note: the brcmfmac can be loaded as module or be statically built-in into
|
||||
* the kernel. If built-in then do note that it uses module_init (and
|
||||
* module_exit) routines which equal device_initcall. So if you intend to
|
||||
* create a module with the platform specific data for the brcmfmac and have
|
||||
* it built-in to the kernel then use a higher initcall then device_initcall
|
||||
* (see init.h). If this is not done then brcmfmac will load without problems
|
||||
* but will not pickup the platform data.
|
||||
*
|
||||
* When the driver does not "detect" platform driver data then it will continue
|
||||
* without reporting anything and just assume there is no data needed. Which is
|
||||
* probably true for most platforms.
|
||||
*
|
||||
* Explanation of the platform_data fields:
|
||||
*
|
||||
* drive_strength: is the preferred drive_strength to be used for the SDIO
|
||||
* pins. If 0 then a default value will be used. This is the target drive
|
||||
* strength, the exact drive strength which will be used depends on the
|
||||
* capabilities of the device.
|
||||
*
|
||||
* oob_irq_supported: does the board have support for OOB interrupts. SDIO
|
||||
* in-band interrupts are relatively slow and for having less overhead on
|
||||
* interrupt processing an out of band interrupt can be used. If the HW
|
||||
* supports this then enable this by setting this field to true and configure
|
||||
* the oob related fields.
|
||||
*
|
||||
* oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are
|
||||
* used for registering the irq using request_irq function.
|
||||
*
|
||||
* power_on: This function is called by the brcmfmac when the module gets
|
||||
* loaded. This can be particularly useful for low power devices. The platform
|
||||
* spcific routine may for example decide to power up the complete device.
|
||||
* If there is no use-case for this function then provide NULL.
|
||||
*
|
||||
* power_off: This function is called by the brcmfmac when the module gets
|
||||
* unloaded. At this point the device can be powered down or otherwise be reset.
|
||||
* So if an actual power_off is not supported but reset is then reset the device
|
||||
* when this function gets called. This can be particularly useful for low power
|
||||
* devices. If there is no use-case for this function (either power-down or
|
||||
* reset) then provide NULL.
|
||||
*
|
||||
* reset: This function can get called if the device communication broke down.
|
||||
* This functionality is particularly useful in case of SDIO type devices. It is
|
||||
* possible to reset a dongle via sdio data interface, but it requires that
|
||||
* this is fully functional. This function is chip/module specific and this
|
||||
* function should return only after the complete reset has completed.
|
||||
*/
|
||||
|
||||
#define BRCMFMAC_SDIO_PDATA_NAME "brcmfmac_sdio"
|
||||
|
||||
struct brcmfmac_sdio_platform_data {
|
||||
unsigned int drive_strength;
|
||||
bool oob_irq_supported;
|
||||
unsigned int oob_irq_nr;
|
||||
unsigned long oob_irq_flags;
|
||||
void (*power_on)(void);
|
||||
void (*power_off)(void);
|
||||
void (*reset)(void);
|
||||
};
|
||||
|
||||
#endif /* _LINUX_BRCMFMAC_PLATFORM_H */
|
||||
@@ -193,11 +193,11 @@ static inline bool bdaddr_type_is_le(__u8 type)
|
||||
#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff} })
|
||||
|
||||
/* Copy, swap, convert BD Address */
|
||||
static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
|
||||
static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
|
||||
{
|
||||
return memcmp(ba1, ba2, sizeof(bdaddr_t));
|
||||
}
|
||||
static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
|
||||
static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src)
|
||||
{
|
||||
memcpy(dst, src, sizeof(bdaddr_t));
|
||||
}
|
||||
@@ -266,6 +266,7 @@ typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status);
|
||||
|
||||
struct hci_req_ctrl {
|
||||
bool start;
|
||||
u8 event;
|
||||
hci_req_complete_t complete;
|
||||
};
|
||||
|
||||
|
||||
@@ -984,6 +984,9 @@ struct hci_cp_le_set_adv_data {
|
||||
|
||||
#define HCI_OP_LE_SET_ADV_ENABLE 0x200a
|
||||
|
||||
#define LE_SCAN_PASSIVE 0x00
|
||||
#define LE_SCAN_ACTIVE 0x01
|
||||
|
||||
#define HCI_OP_LE_SET_SCAN_PARAM 0x200b
|
||||
struct hci_cp_le_set_scan_param {
|
||||
__u8 type;
|
||||
@@ -993,8 +996,10 @@ struct hci_cp_le_set_scan_param {
|
||||
__u8 filter_policy;
|
||||
} __packed;
|
||||
|
||||
#define LE_SCANNING_DISABLED 0x00
|
||||
#define LE_SCANNING_ENABLED 0x01
|
||||
#define LE_SCAN_DISABLE 0x00
|
||||
#define LE_SCAN_ENABLE 0x01
|
||||
#define LE_SCAN_FILTER_DUP_DISABLE 0x00
|
||||
#define LE_SCAN_FILTER_DUP_ENABLE 0x01
|
||||
|
||||
#define HCI_OP_LE_SET_SCAN_ENABLE 0x200c
|
||||
struct hci_cp_le_set_scan_enable {
|
||||
|
||||
@@ -134,6 +134,8 @@ struct amp_assoc {
|
||||
__u8 data[HCI_MAX_AMP_ASSOC_SIZE];
|
||||
};
|
||||
|
||||
#define HCI_MAX_PAGES 3
|
||||
|
||||
#define NUM_REASSEMBLY 4
|
||||
struct hci_dev {
|
||||
struct list_head list;
|
||||
@@ -151,8 +153,8 @@ struct hci_dev {
|
||||
__u8 dev_class[3];
|
||||
__u8 major_class;
|
||||
__u8 minor_class;
|
||||
__u8 features[8];
|
||||
__u8 host_features[8];
|
||||
__u8 max_page;
|
||||
__u8 features[HCI_MAX_PAGES][8];
|
||||
__u8 le_features[8];
|
||||
__u8 le_white_list_size;
|
||||
__u8 le_states[8];
|
||||
@@ -244,6 +246,7 @@ struct hci_dev {
|
||||
struct sk_buff_head raw_q;
|
||||
struct sk_buff_head cmd_q;
|
||||
|
||||
struct sk_buff *recv_evt;
|
||||
struct sk_buff *sent_cmd;
|
||||
struct sk_buff *reassembly[NUM_REASSEMBLY];
|
||||
|
||||
@@ -268,8 +271,6 @@ struct hci_dev {
|
||||
|
||||
struct hci_dev_stats stat;
|
||||
|
||||
struct sk_buff_head driver_init;
|
||||
|
||||
atomic_t promisc;
|
||||
|
||||
struct dentry *debugfs;
|
||||
@@ -292,6 +293,7 @@ struct hci_dev {
|
||||
int (*open)(struct hci_dev *hdev);
|
||||
int (*close)(struct hci_dev *hdev);
|
||||
int (*flush)(struct hci_dev *hdev);
|
||||
int (*setup)(struct hci_dev *hdev);
|
||||
int (*send)(struct sk_buff *skb);
|
||||
void (*notify)(struct hci_dev *hdev, unsigned int evt);
|
||||
int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
|
||||
@@ -313,7 +315,7 @@ struct hci_conn {
|
||||
bool out;
|
||||
__u8 attempt;
|
||||
__u8 dev_class[3];
|
||||
__u8 features[8];
|
||||
__u8 features[HCI_MAX_PAGES][8];
|
||||
__u16 interval;
|
||||
__u16 pkt_type;
|
||||
__u16 link_policy;
|
||||
@@ -345,7 +347,6 @@ struct hci_conn {
|
||||
struct timer_list auto_accept_timer;
|
||||
|
||||
struct device dev;
|
||||
atomic_t devref;
|
||||
|
||||
struct hci_dev *hdev;
|
||||
void *l2cap_data;
|
||||
@@ -584,7 +585,6 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
|
||||
int hci_conn_del(struct hci_conn *conn);
|
||||
void hci_conn_hash_flush(struct hci_dev *hdev);
|
||||
void hci_conn_check_pending(struct hci_dev *hdev);
|
||||
void hci_conn_accept(struct hci_conn *conn, int mask);
|
||||
|
||||
struct hci_chan *hci_chan_create(struct hci_conn *conn);
|
||||
void hci_chan_del(struct hci_chan *chan);
|
||||
@@ -601,8 +601,36 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
|
||||
|
||||
void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
|
||||
|
||||
void hci_conn_hold_device(struct hci_conn *conn);
|
||||
void hci_conn_put_device(struct hci_conn *conn);
|
||||
/*
|
||||
* hci_conn_get() and hci_conn_put() are used to control the life-time of an
|
||||
* "hci_conn" object. They do not guarantee that the hci_conn object is running,
|
||||
* working or anything else. They just guarantee that the object is available
|
||||
* and can be dereferenced. So you can use its locks, local variables and any
|
||||
* other constant data.
|
||||
* Before accessing runtime data, you _must_ lock the object and then check that
|
||||
* it is still running. As soon as you release the locks, the connection might
|
||||
* get dropped, though.
|
||||
*
|
||||
* On the other hand, hci_conn_hold() and hci_conn_drop() are used to control
|
||||
* how long the underlying connection is held. So every channel that runs on the
|
||||
* hci_conn object calls this to prevent the connection from disappearing. As
|
||||
* long as you hold a device, you must also guarantee that you have a valid
|
||||
* reference to the device via hci_conn_get() (or the initial reference from
|
||||
* hci_conn_add()).
|
||||
* The hold()/drop() ref-count is known to drop below 0 sometimes, which doesn't
|
||||
* break because nobody cares for that. But this means, we cannot use
|
||||
* _get()/_drop() in it, but require the caller to have a valid ref (FIXME).
|
||||
*/
|
||||
|
||||
static inline void hci_conn_get(struct hci_conn *conn)
|
||||
{
|
||||
get_device(&conn->dev);
|
||||
}
|
||||
|
||||
static inline void hci_conn_put(struct hci_conn *conn)
|
||||
{
|
||||
put_device(&conn->dev);
|
||||
}
|
||||
|
||||
static inline void hci_conn_hold(struct hci_conn *conn)
|
||||
{
|
||||
@@ -612,7 +640,7 @@ static inline void hci_conn_hold(struct hci_conn *conn)
|
||||
cancel_delayed_work(&conn->disc_work);
|
||||
}
|
||||
|
||||
static inline void hci_conn_put(struct hci_conn *conn)
|
||||
static inline void hci_conn_drop(struct hci_conn *conn)
|
||||
{
|
||||
BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
|
||||
|
||||
@@ -760,29 +788,29 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
|
||||
#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->dev.parent = (pdev))
|
||||
|
||||
/* ----- LMP capabilities ----- */
|
||||
#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT)
|
||||
#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH)
|
||||
#define lmp_hold_capable(dev) ((dev)->features[0] & LMP_HOLD)
|
||||
#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF)
|
||||
#define lmp_park_capable(dev) ((dev)->features[1] & LMP_PARK)
|
||||
#define lmp_inq_rssi_capable(dev) ((dev)->features[3] & LMP_RSSI_INQ)
|
||||
#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
|
||||
#define lmp_bredr_capable(dev) (!((dev)->features[4] & LMP_NO_BREDR))
|
||||
#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
|
||||
#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
|
||||
#define lmp_pause_enc_capable(dev) ((dev)->features[5] & LMP_PAUSE_ENC)
|
||||
#define lmp_ext_inq_capable(dev) ((dev)->features[6] & LMP_EXT_INQ)
|
||||
#define lmp_le_br_capable(dev) !!((dev)->features[6] & LMP_SIMUL_LE_BR)
|
||||
#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
|
||||
#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
|
||||
#define lmp_lsto_capable(dev) ((dev)->features[7] & LMP_LSTO)
|
||||
#define lmp_inq_tx_pwr_capable(dev) ((dev)->features[7] & LMP_INQ_TX_PWR)
|
||||
#define lmp_ext_feat_capable(dev) ((dev)->features[7] & LMP_EXTFEATURES)
|
||||
#define lmp_encrypt_capable(dev) ((dev)->features[0][0] & LMP_ENCRYPT)
|
||||
#define lmp_rswitch_capable(dev) ((dev)->features[0][0] & LMP_RSWITCH)
|
||||
#define lmp_hold_capable(dev) ((dev)->features[0][0] & LMP_HOLD)
|
||||
#define lmp_sniff_capable(dev) ((dev)->features[0][0] & LMP_SNIFF)
|
||||
#define lmp_park_capable(dev) ((dev)->features[0][1] & LMP_PARK)
|
||||
#define lmp_inq_rssi_capable(dev) ((dev)->features[0][3] & LMP_RSSI_INQ)
|
||||
#define lmp_esco_capable(dev) ((dev)->features[0][3] & LMP_ESCO)
|
||||
#define lmp_bredr_capable(dev) (!((dev)->features[0][4] & LMP_NO_BREDR))
|
||||
#define lmp_le_capable(dev) ((dev)->features[0][4] & LMP_LE)
|
||||
#define lmp_sniffsubr_capable(dev) ((dev)->features[0][5] & LMP_SNIFF_SUBR)
|
||||
#define lmp_pause_enc_capable(dev) ((dev)->features[0][5] & LMP_PAUSE_ENC)
|
||||
#define lmp_ext_inq_capable(dev) ((dev)->features[0][6] & LMP_EXT_INQ)
|
||||
#define lmp_le_br_capable(dev) (!!((dev)->features[0][6] & LMP_SIMUL_LE_BR))
|
||||
#define lmp_ssp_capable(dev) ((dev)->features[0][6] & LMP_SIMPLE_PAIR)
|
||||
#define lmp_no_flush_capable(dev) ((dev)->features[0][6] & LMP_NO_FLUSH)
|
||||
#define lmp_lsto_capable(dev) ((dev)->features[0][7] & LMP_LSTO)
|
||||
#define lmp_inq_tx_pwr_capable(dev) ((dev)->features[0][7] & LMP_INQ_TX_PWR)
|
||||
#define lmp_ext_feat_capable(dev) ((dev)->features[0][7] & LMP_EXTFEATURES)
|
||||
|
||||
/* ----- Extended LMP capabilities ----- */
|
||||
#define lmp_host_ssp_capable(dev) ((dev)->host_features[0] & LMP_HOST_SSP)
|
||||
#define lmp_host_le_capable(dev) !!((dev)->host_features[0] & LMP_HOST_LE)
|
||||
#define lmp_host_le_br_capable(dev) !!((dev)->host_features[0] & LMP_HOST_LE_BREDR)
|
||||
#define lmp_host_ssp_capable(dev) ((dev)->features[1][0] & LMP_HOST_SSP)
|
||||
#define lmp_host_le_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE))
|
||||
#define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR))
|
||||
|
||||
/* returns true if at least one AMP active */
|
||||
static inline bool hci_amp_capable(void)
|
||||
@@ -1054,8 +1082,14 @@ struct hci_request {
|
||||
void hci_req_init(struct hci_request *req, struct hci_dev *hdev);
|
||||
int hci_req_run(struct hci_request *req, hci_req_complete_t complete);
|
||||
void hci_req_add(struct hci_request *req, u16 opcode, u32 plen, void *param);
|
||||
void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen, void *param,
|
||||
u8 event);
|
||||
void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status);
|
||||
void hci_req_cmd_status(struct hci_dev *hdev, u16 opcode, u8 status);
|
||||
|
||||
struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
void *param, u32 timeout);
|
||||
struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
void *param, u8 event, u32 timeout);
|
||||
|
||||
int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
|
||||
void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
|
||||
|
||||
@@ -583,6 +583,14 @@ struct l2cap_conn {
|
||||
|
||||
struct list_head chan_l;
|
||||
struct mutex chan_lock;
|
||||
struct kref ref;
|
||||
struct list_head users;
|
||||
};
|
||||
|
||||
struct l2cap_user {
|
||||
struct list_head list;
|
||||
int (*probe) (struct l2cap_conn *conn, struct l2cap_user *user);
|
||||
void (*remove) (struct l2cap_conn *conn, struct l2cap_user *user);
|
||||
};
|
||||
|
||||
#define L2CAP_INFO_CL_MTU_REQ_SENT 0x01
|
||||
@@ -786,6 +794,7 @@ extern bool disable_ertm;
|
||||
|
||||
int l2cap_init_sockets(void);
|
||||
void l2cap_cleanup_sockets(void);
|
||||
bool l2cap_is_socket(struct socket *sock);
|
||||
|
||||
void __l2cap_connect_rsp_defer(struct l2cap_chan *chan);
|
||||
int __l2cap_wait_ack(struct sock *sk);
|
||||
@@ -812,4 +821,10 @@ void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
|
||||
u8 status);
|
||||
void __l2cap_physical_cfm(struct l2cap_chan *chan, int result);
|
||||
|
||||
void l2cap_conn_get(struct l2cap_conn *conn);
|
||||
void l2cap_conn_put(struct l2cap_conn *conn);
|
||||
|
||||
int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user);
|
||||
void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user);
|
||||
|
||||
#endif /* __L2CAP_H */
|
||||
|
||||
@@ -1998,6 +1998,16 @@ struct cfg80211_update_ft_ies_params {
|
||||
* advertise the support for MAC based ACL have to implement this callback.
|
||||
*
|
||||
* @start_radar_detection: Start radar detection in the driver.
|
||||
*
|
||||
* @update_ft_ies: Provide updated Fast BSS Transition information to the
|
||||
* driver. If the SME is in the driver/firmware, this information can be
|
||||
* used in building Authentication and Reassociation Request frames.
|
||||
*
|
||||
* @crit_proto_start: Indicates a critical protocol needs more link reliability
|
||||
* for a given duration (milliseconds). The protocol is provided so the
|
||||
* driver can take the most appropriate actions.
|
||||
* @crit_proto_stop: Indicates critical protocol no longer needs increased link
|
||||
* reliability. This operation can not fail.
|
||||
*/
|
||||
struct cfg80211_ops {
|
||||
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
|
||||
@@ -2227,6 +2237,12 @@ struct cfg80211_ops {
|
||||
struct cfg80211_chan_def *chandef);
|
||||
int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct cfg80211_update_ft_ies_params *ftie);
|
||||
int (*crit_proto_start)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
enum nl80211_crit_proto_id protocol,
|
||||
u16 duration);
|
||||
void (*crit_proto_stop)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -4020,6 +4036,17 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
|
||||
/**
|
||||
* ieee80211_operating_class_to_band - convert operating class to band
|
||||
*
|
||||
* @operating_class: the operating class to convert
|
||||
* @band: band pointer to fill
|
||||
*
|
||||
* Returns %true if the conversion was successful, %false otherwise.
|
||||
*/
|
||||
bool ieee80211_operating_class_to_band(u8 operating_class,
|
||||
enum ieee80211_band *band);
|
||||
|
||||
/*
|
||||
* cfg80211_tdls_oper_request - request userspace to perform TDLS operation
|
||||
* @dev: the device on which the operation is requested
|
||||
@@ -4122,6 +4149,17 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
|
||||
struct cfg80211_wowlan_wakeup *wakeup,
|
||||
gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_crit_proto_stopped() - indicate critical protocol stopped by driver.
|
||||
*
|
||||
* @wdev: the wireless device for which critical protocol is stopped.
|
||||
*
|
||||
* This function can be called by the driver to indicate it has reverted
|
||||
* operation back to normal. One reason could be that the duration given
|
||||
* by .crit_proto_start() has expired.
|
||||
*/
|
||||
void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp);
|
||||
|
||||
/* Logging, debugging and troubleshooting/diagnostic helpers. */
|
||||
|
||||
/* wiphy_printk helpers, similar to dev_printk */
|
||||
|
||||
+104
-23
@@ -128,6 +128,7 @@ enum ieee80211_ac_numbers {
|
||||
* 2^n-1 in the range 1..32767]
|
||||
* @cw_max: maximum contention window [like @cw_min]
|
||||
* @txop: maximum burst time in units of 32 usecs, 0 meaning disabled
|
||||
* @acm: is mandatory admission control required for the access category
|
||||
* @uapsd: is U-APSD mode enabled for the queue
|
||||
*/
|
||||
struct ieee80211_tx_queue_params {
|
||||
@@ -135,6 +136,7 @@ struct ieee80211_tx_queue_params {
|
||||
u16 cw_min;
|
||||
u16 cw_max;
|
||||
u8 aifs;
|
||||
bool acm;
|
||||
bool uapsd;
|
||||
};
|
||||
|
||||
@@ -209,7 +211,7 @@ struct ieee80211_chanctx_conf {
|
||||
* @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note
|
||||
* that it is only ever disabled for station mode.
|
||||
* @BSS_CHANGED_IDLE: Idle changed for this BSS/interface.
|
||||
* @BSS_CHANGED_SSID: SSID changed for this BSS (AP mode)
|
||||
* @BSS_CHANGED_SSID: SSID changed for this BSS (AP and IBSS mode)
|
||||
* @BSS_CHANGED_AP_PROBE_RESP: Probe Response changed for this BSS (AP mode)
|
||||
* @BSS_CHANGED_PS: PS changed for this BSS (STA mode)
|
||||
* @BSS_CHANGED_TXPOWER: TX power setting changed for this interface
|
||||
@@ -326,12 +328,11 @@ enum ieee80211_rssi_event {
|
||||
* your driver/device needs to do.
|
||||
* @ps: power-save mode (STA only). This flag is NOT affected by
|
||||
* offchannel/dynamic_ps operations.
|
||||
* @ssid: The SSID of the current vif. Only valid in AP-mode.
|
||||
* @ssid: The SSID of the current vif. Valid in AP and IBSS mode.
|
||||
* @ssid_len: Length of SSID given in @ssid.
|
||||
* @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode.
|
||||
* @txpower: TX power in dBm
|
||||
* @p2p_ctwindow: P2P CTWindow, only for P2P client interfaces
|
||||
* @p2p_oppps: P2P opportunistic PS is enabled
|
||||
* @p2p_noa_attr: P2P NoA attribute for P2P powersave
|
||||
*/
|
||||
struct ieee80211_bss_conf {
|
||||
const u8 *bssid;
|
||||
@@ -365,8 +366,7 @@ struct ieee80211_bss_conf {
|
||||
size_t ssid_len;
|
||||
bool hidden_ssid;
|
||||
int txpower;
|
||||
u8 p2p_ctwindow;
|
||||
bool p2p_oppps;
|
||||
struct ieee80211_p2p_noa_attr p2p_noa_attr;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -563,6 +563,9 @@ enum mac80211_rate_control_flags {
|
||||
/* maximum number of rate stages */
|
||||
#define IEEE80211_TX_MAX_RATES 4
|
||||
|
||||
/* maximum number of rate table entries */
|
||||
#define IEEE80211_TX_RATE_TABLE_SIZE 4
|
||||
|
||||
/**
|
||||
* struct ieee80211_tx_rate - rate selection/status
|
||||
*
|
||||
@@ -603,8 +606,8 @@ static inline void ieee80211_rate_set_vht(struct ieee80211_tx_rate *rate,
|
||||
u8 mcs, u8 nss)
|
||||
{
|
||||
WARN_ON(mcs & ~0xF);
|
||||
WARN_ON(nss & ~0x7);
|
||||
rate->idx = (nss << 4) | mcs;
|
||||
WARN_ON((nss - 1) & ~0x7);
|
||||
rate->idx = ((nss - 1) << 4) | mcs;
|
||||
}
|
||||
|
||||
static inline u8
|
||||
@@ -616,7 +619,7 @@ ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate *rate)
|
||||
static inline u8
|
||||
ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate)
|
||||
{
|
||||
return rate->idx >> 4;
|
||||
return (rate->idx >> 4) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -657,7 +660,11 @@ struct ieee80211_tx_info {
|
||||
struct ieee80211_tx_rate rates[
|
||||
IEEE80211_TX_MAX_RATES];
|
||||
s8 rts_cts_rate_idx;
|
||||
/* 3 bytes free */
|
||||
u8 use_rts:1;
|
||||
u8 use_cts_prot:1;
|
||||
u8 short_preamble:1;
|
||||
u8 skip_table:1;
|
||||
/* 2 bytes free */
|
||||
};
|
||||
/* only needed before rate control */
|
||||
unsigned long jiffies;
|
||||
@@ -678,6 +685,8 @@ struct ieee80211_tx_info {
|
||||
struct {
|
||||
struct ieee80211_tx_rate driver_rates[
|
||||
IEEE80211_TX_MAX_RATES];
|
||||
u8 pad[4];
|
||||
|
||||
void *rate_driver_data[
|
||||
IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE / sizeof(void *)];
|
||||
};
|
||||
@@ -976,8 +985,7 @@ enum ieee80211_smps_mode {
|
||||
* @power_level: requested transmit power (in dBm), backward compatibility
|
||||
* value only that is set to the minimum of all interfaces
|
||||
*
|
||||
* @channel: the channel to tune to
|
||||
* @channel_type: the channel (HT) type
|
||||
* @chandef: the channel definition to tune to
|
||||
* @radar_enabled: whether radar detection is enabled
|
||||
*
|
||||
* @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame
|
||||
@@ -1003,8 +1011,7 @@ struct ieee80211_conf {
|
||||
|
||||
u8 long_frame_max_tx_count, short_frame_max_tx_count;
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
enum nl80211_channel_type channel_type;
|
||||
struct cfg80211_chan_def chandef;
|
||||
bool radar_enabled;
|
||||
enum ieee80211_smps_mode smps_mode;
|
||||
};
|
||||
@@ -1021,13 +1028,13 @@ struct ieee80211_conf {
|
||||
* the driver passed into mac80211.
|
||||
* @block_tx: Indicates whether transmission must be blocked before the
|
||||
* scheduled channel switch, as indicated by the AP.
|
||||
* @channel: the new channel to switch to
|
||||
* @chandef: the new channel to switch to
|
||||
* @count: the number of TBTT's until the channel switch event
|
||||
*/
|
||||
struct ieee80211_channel_switch {
|
||||
u64 timestamp;
|
||||
bool block_tx;
|
||||
struct ieee80211_channel *channel;
|
||||
struct cfg80211_chan_def chandef;
|
||||
u8 count;
|
||||
};
|
||||
|
||||
@@ -1224,6 +1231,24 @@ enum ieee80211_sta_rx_bandwidth {
|
||||
IEEE80211_STA_RX_BW_160,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta_rates - station rate selection table
|
||||
*
|
||||
* @rcu_head: RCU head used for freeing the table on update
|
||||
* @rates: transmit rates/flags to be used by default.
|
||||
* Overriding entries per-packet is possible by using cb tx control.
|
||||
*/
|
||||
struct ieee80211_sta_rates {
|
||||
struct rcu_head rcu_head;
|
||||
struct {
|
||||
s8 idx;
|
||||
u8 count;
|
||||
u8 count_cts;
|
||||
u8 count_rts;
|
||||
u16 flags;
|
||||
} rate[IEEE80211_TX_RATE_TABLE_SIZE];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta - station table entry
|
||||
*
|
||||
@@ -1251,6 +1276,7 @@ enum ieee80211_sta_rx_bandwidth {
|
||||
* notifications and capabilities. The value is only valid after
|
||||
* the station moves to associated state.
|
||||
* @smps_mode: current SMPS mode (off, static or dynamic)
|
||||
* @tx_rates: rate control selection table
|
||||
*/
|
||||
struct ieee80211_sta {
|
||||
u32 supp_rates[IEEE80211_NUM_BANDS];
|
||||
@@ -1264,6 +1290,7 @@ struct ieee80211_sta {
|
||||
u8 rx_nss;
|
||||
enum ieee80211_sta_rx_bandwidth bandwidth;
|
||||
enum ieee80211_smps_mode smps_mode;
|
||||
struct ieee80211_sta_rates __rcu *rates;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[0] __aligned(sizeof(void *));
|
||||
@@ -1419,6 +1446,9 @@ struct ieee80211_tx_control {
|
||||
* for different virtual interfaces. See the doc section on HW queue
|
||||
* control for more details.
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_RC_TABLE: The driver supports using a rate
|
||||
* selection table provided by the rate control algorithm.
|
||||
*
|
||||
* @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
|
||||
* P2P Interface. This will be honoured even if more than one interface
|
||||
* is supported.
|
||||
@@ -1451,6 +1481,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21,
|
||||
IEEE80211_HW_AP_LINK_PS = 1<<22,
|
||||
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23,
|
||||
IEEE80211_HW_SUPPORTS_RC_TABLE = 1<<24,
|
||||
IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25,
|
||||
IEEE80211_HW_TIMING_BEACON_ONLY = 1<<26,
|
||||
};
|
||||
@@ -1536,6 +1567,17 @@ enum ieee80211_hw_flags {
|
||||
* @netdev_features: netdev features to be set in each netdev created
|
||||
* from this HW. Note only HW checksum features are currently
|
||||
* compatible with mac80211. Other feature bits will be rejected.
|
||||
*
|
||||
* @uapsd_queues: This bitmap is included in (re)association frame to indicate
|
||||
* for each access category if it is uAPSD trigger-enabled and delivery-
|
||||
* enabled. Use IEEE80211_WMM_IE_STA_QOSINFO_AC_* to set this bitmap.
|
||||
* Each bit corresponds to different AC. Value '1' in specific bit means
|
||||
* that corresponding AC is both trigger- and delivery-enabled. '0' means
|
||||
* neither enabled.
|
||||
*
|
||||
* @uapsd_max_sp_len: maximum number of total buffered frames the WMM AP may
|
||||
* deliver to a WMM STA during any Service Period triggered by the WMM STA.
|
||||
* Use IEEE80211_WMM_IE_STA_QOSINFO_SP_* for correct values.
|
||||
*/
|
||||
struct ieee80211_hw {
|
||||
struct ieee80211_conf conf;
|
||||
@@ -1561,6 +1603,8 @@ struct ieee80211_hw {
|
||||
u8 radiotap_mcs_details;
|
||||
u16 radiotap_vht_details;
|
||||
netdev_features_t netdev_features;
|
||||
u8 uapsd_queues;
|
||||
u8 uapsd_max_sp_len;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -3123,6 +3167,25 @@ static inline int ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta,
|
||||
void ieee80211_sta_set_buffered(struct ieee80211_sta *sta,
|
||||
u8 tid, bool buffered);
|
||||
|
||||
/**
|
||||
* ieee80211_get_tx_rates - get the selected transmit rates for a packet
|
||||
*
|
||||
* Call this function in a driver with per-packet rate selection support
|
||||
* to combine the rate info in the packet tx info with the most recent
|
||||
* rate selection table for the station entry.
|
||||
*
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @sta: the receiver station to which this packet is sent.
|
||||
* @skb: the frame to be transmitted.
|
||||
* @dest: buffer for extracted rate/retry information
|
||||
* @max_rates: maximum number of rates to fetch
|
||||
*/
|
||||
void ieee80211_get_tx_rates(struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct sk_buff *skb,
|
||||
struct ieee80211_tx_rate *dest,
|
||||
int max_rates);
|
||||
|
||||
/**
|
||||
* ieee80211_tx_status - transmit status callback
|
||||
*
|
||||
@@ -4098,7 +4161,7 @@ void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn);
|
||||
* (deprecated; this will be removed once drivers get updated to use
|
||||
* rate_idx_mask)
|
||||
* @rate_idx_mask: user-requested (legacy) rate mask
|
||||
* @rate_idx_mcs_mask: user-requested MCS rate mask
|
||||
* @rate_idx_mcs_mask: user-requested MCS rate mask (NULL if not in use)
|
||||
* @bss: whether this frame is sent out in AP or IBSS mode
|
||||
*/
|
||||
struct ieee80211_tx_rate_control {
|
||||
@@ -4110,7 +4173,7 @@ struct ieee80211_tx_rate_control {
|
||||
bool rts, short_preamble;
|
||||
u8 max_rate_idx;
|
||||
u32 rate_idx_mask;
|
||||
u8 rate_idx_mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
|
||||
u8 *rate_idx_mcs_mask;
|
||||
bool bss;
|
||||
};
|
||||
|
||||
@@ -4199,37 +4262,55 @@ bool rate_usable_index_exists(struct ieee80211_supported_band *sband,
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* rate_control_set_rates - pass the sta rate selection to mac80211/driver
|
||||
*
|
||||
* When not doing a rate control probe to test rates, rate control should pass
|
||||
* its rate selection to mac80211. If the driver supports receiving a station
|
||||
* rate table, it will use it to ensure that frames are always sent based on
|
||||
* the most recent rate control module decision.
|
||||
*
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw()
|
||||
* @pubsta: &struct ieee80211_sta pointer to the target destination.
|
||||
* @rates: new tx rate set to be used for this station.
|
||||
*/
|
||||
int rate_control_set_rates(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sta *pubsta,
|
||||
struct ieee80211_sta_rates *rates);
|
||||
|
||||
int ieee80211_rate_control_register(struct rate_control_ops *ops);
|
||||
void ieee80211_rate_control_unregister(struct rate_control_ops *ops);
|
||||
|
||||
static inline bool
|
||||
conf_is_ht20(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type == NL80211_CHAN_HT20;
|
||||
return conf->chandef.width == NL80211_CHAN_WIDTH_20;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht40_minus(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type == NL80211_CHAN_HT40MINUS;
|
||||
return conf->chandef.width == NL80211_CHAN_WIDTH_40 &&
|
||||
conf->chandef.center_freq1 < conf->chandef.chan->center_freq;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht40_plus(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type == NL80211_CHAN_HT40PLUS;
|
||||
return conf->chandef.width == NL80211_CHAN_WIDTH_40 &&
|
||||
conf->chandef.center_freq1 > conf->chandef.chan->center_freq;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht40(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf);
|
||||
return conf->chandef.width == NL80211_CHAN_WIDTH_40;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type != NL80211_CHAN_NO_HT;
|
||||
return conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT;
|
||||
}
|
||||
|
||||
static inline enum nl80211_iftype
|
||||
|
||||
@@ -122,6 +122,8 @@ struct nfc_dev {
|
||||
|
||||
bool shutting_down;
|
||||
|
||||
struct rfkill *rfkill;
|
||||
|
||||
struct nfc_ops *ops;
|
||||
};
|
||||
#define to_nfc_dev(_dev) container_of(_dev, struct nfc_dev, dev)
|
||||
|
||||
@@ -233,7 +233,10 @@ struct sockaddr_nfc_llcp {
|
||||
#define NFC_LLCP_DIRECTION_TX 0x01
|
||||
|
||||
/* socket option names */
|
||||
#define NFC_LLCP_RW 0
|
||||
#define NFC_LLCP_MIUX 1
|
||||
#define NFC_LLCP_RW 0
|
||||
#define NFC_LLCP_MIUX 1
|
||||
#define NFC_LLCP_REMOTE_MIU 2
|
||||
#define NFC_LLCP_REMOTE_LTO 3
|
||||
#define NFC_LLCP_REMOTE_RW 4
|
||||
|
||||
#endif /*__LINUX_NFC_H */
|
||||
|
||||
@@ -639,6 +639,13 @@
|
||||
* with the relevant Information Elements. This event is used to report
|
||||
* received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE).
|
||||
*
|
||||
* @NL80211_CMD_CRIT_PROTOCOL_START: Indicates user-space will start running
|
||||
* a critical protocol that needs more reliability in the connection to
|
||||
* complete.
|
||||
*
|
||||
* @NL80211_CMD_CRIT_PROTOCOL_STOP: Indicates the connection reliability can
|
||||
* return back to normal.
|
||||
*
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -798,6 +805,9 @@ enum nl80211_commands {
|
||||
NL80211_CMD_UPDATE_FT_IES,
|
||||
NL80211_CMD_FT_EVENT,
|
||||
|
||||
NL80211_CMD_CRIT_PROTOCOL_START,
|
||||
NL80211_CMD_CRIT_PROTOCOL_STOP,
|
||||
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
@@ -1414,6 +1424,11 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_IE_RIC: Resource Information Container Information
|
||||
* Element
|
||||
*
|
||||
* @NL80211_ATTR_CRIT_PROT_ID: critical protocol identifier requiring increased
|
||||
* reliability, see &enum nl80211_crit_proto_id (u16).
|
||||
* @NL80211_ATTR_MAX_CRIT_PROT_DURATION: duration in milliseconds in which
|
||||
* the connection should have increased reliability (u16).
|
||||
*
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1709,6 +1724,9 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_MDID,
|
||||
NL80211_ATTR_IE_RIC,
|
||||
|
||||
NL80211_ATTR_CRIT_PROT_ID,
|
||||
NL80211_ATTR_MAX_CRIT_PROT_DURATION,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -3682,4 +3700,25 @@ enum nl80211_protocol_features {
|
||||
NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 1 << 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_crit_proto_id - nl80211 critical protocol identifiers
|
||||
*
|
||||
* @NL80211_CRIT_PROTO_UNSPEC: protocol unspecified.
|
||||
* @NL80211_CRIT_PROTO_DHCP: BOOTP or DHCPv6 protocol.
|
||||
* @NL80211_CRIT_PROTO_EAPOL: EAPOL protocol.
|
||||
* @NL80211_CRIT_PROTO_APIPA: APIPA protocol.
|
||||
* @NUM_NL80211_CRIT_PROTO: must be kept last.
|
||||
*/
|
||||
enum nl80211_crit_proto_id {
|
||||
NL80211_CRIT_PROTO_UNSPEC,
|
||||
NL80211_CRIT_PROTO_DHCP,
|
||||
NL80211_CRIT_PROTO_EAPOL,
|
||||
NL80211_CRIT_PROTO_APIPA,
|
||||
/* add other protocols before this one */
|
||||
NUM_NL80211_CRIT_PROTO
|
||||
};
|
||||
|
||||
/* maximum duration for critical protocol measures */
|
||||
#define NL80211_CRIT_PROTO_MAX_DURATION 5000 /* msec */
|
||||
|
||||
#endif /* __LINUX_NL80211_H */
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
* @RFKILL_TYPE_WWAN: switch is on a wireless WAN device.
|
||||
* @RFKILL_TYPE_GPS: switch is on a GPS device.
|
||||
* @RFKILL_TYPE_FM: switch is on a FM radio device.
|
||||
* @RFKILL_TYPE_NFC: switch is on an NFC device.
|
||||
* @NUM_RFKILL_TYPES: number of defined rfkill types
|
||||
*/
|
||||
enum rfkill_type {
|
||||
@@ -48,6 +49,7 @@ enum rfkill_type {
|
||||
RFKILL_TYPE_WWAN,
|
||||
RFKILL_TYPE_GPS,
|
||||
RFKILL_TYPE_FM,
|
||||
RFKILL_TYPE_NFC,
|
||||
NUM_RFKILL_TYPES,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user