You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says: ==================== Here is another batch of updates intended for 3.7... Highlights include an hci_connect re-write in Bluetooth, HCI/LLC layer separation in NFC, removal of the raw pn544 NFC driver, NFC LLCP raw sockets support, improved IBSS auth frame handling in mac80211, full-MAC AP mode notification support in mac80211, a lot of attention paid to brcmfmac, and the usual level of updates to iwlwifi, ath9k, mwifiex, and rt2x00, and various other updates. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -302,8 +302,11 @@ enum {
|
||||
|
||||
/* ---- HCI Error Codes ---- */
|
||||
#define HCI_ERROR_AUTH_FAILURE 0x05
|
||||
#define HCI_ERROR_CONNECTION_TIMEOUT 0x08
|
||||
#define HCI_ERROR_REJ_BAD_ADDR 0x0f
|
||||
#define HCI_ERROR_REMOTE_USER_TERM 0x13
|
||||
#define HCI_ERROR_REMOTE_LOW_RESOURCES 0x14
|
||||
#define HCI_ERROR_REMOTE_POWER_OFF 0x15
|
||||
#define HCI_ERROR_LOCAL_HOST_TERM 0x16
|
||||
#define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18
|
||||
|
||||
@@ -1246,6 +1249,24 @@ struct hci_ev_simple_pair_complete {
|
||||
bdaddr_t bdaddr;
|
||||
} __packed;
|
||||
|
||||
#define HCI_EV_USER_PASSKEY_NOTIFY 0x3b
|
||||
struct hci_ev_user_passkey_notify {
|
||||
bdaddr_t bdaddr;
|
||||
__le32 passkey;
|
||||
} __packed;
|
||||
|
||||
#define HCI_KEYPRESS_STARTED 0
|
||||
#define HCI_KEYPRESS_ENTERED 1
|
||||
#define HCI_KEYPRESS_ERASED 2
|
||||
#define HCI_KEYPRESS_CLEARED 3
|
||||
#define HCI_KEYPRESS_COMPLETED 4
|
||||
|
||||
#define HCI_EV_KEYPRESS_NOTIFY 0x3c
|
||||
struct hci_ev_keypress_notify {
|
||||
bdaddr_t bdaddr;
|
||||
__u8 type;
|
||||
} __packed;
|
||||
|
||||
#define HCI_EV_REMOTE_HOST_FEATURES 0x3d
|
||||
struct hci_ev_remote_host_features {
|
||||
bdaddr_t bdaddr;
|
||||
|
||||
@@ -303,6 +303,8 @@ struct hci_conn {
|
||||
__u8 pin_length;
|
||||
__u8 enc_key_size;
|
||||
__u8 io_capability;
|
||||
__u32 passkey_notify;
|
||||
__u8 passkey_entered;
|
||||
__u16 disc_timeout;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -428,15 +430,6 @@ static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
|
||||
test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
|
||||
}
|
||||
|
||||
static inline void hci_conn_hash_init(struct hci_dev *hdev)
|
||||
{
|
||||
struct hci_conn_hash *h = &hdev->conn_hash;
|
||||
INIT_LIST_HEAD(&h->list);
|
||||
h->acl_num = 0;
|
||||
h->sco_num = 0;
|
||||
h->le_num = 0;
|
||||
}
|
||||
|
||||
static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
|
||||
{
|
||||
struct hci_conn_hash *h = &hdev->conn_hash;
|
||||
@@ -551,9 +544,7 @@ static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void hci_acl_connect(struct hci_conn *conn);
|
||||
void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
|
||||
void hci_add_sco(struct hci_conn *conn, __u16 handle);
|
||||
void hci_setup_sync(struct hci_conn *conn, __u16 handle);
|
||||
void hci_sco_setup(struct hci_conn *conn, __u8 status);
|
||||
|
||||
@@ -563,7 +554,7 @@ void hci_conn_hash_flush(struct hci_dev *hdev);
|
||||
void hci_conn_check_pending(struct hci_dev *hdev);
|
||||
|
||||
struct hci_chan *hci_chan_create(struct hci_conn *conn);
|
||||
int hci_chan_del(struct hci_chan *chan);
|
||||
void hci_chan_del(struct hci_chan *chan);
|
||||
void hci_chan_list_flush(struct hci_conn *conn);
|
||||
|
||||
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
|
||||
@@ -614,11 +605,17 @@ static inline void hci_conn_put(struct hci_conn *conn)
|
||||
/* ----- HCI Devices ----- */
|
||||
static inline void hci_dev_put(struct hci_dev *d)
|
||||
{
|
||||
BT_DBG("%s orig refcnt %d", d->name,
|
||||
atomic_read(&d->dev.kobj.kref.refcount));
|
||||
|
||||
put_device(&d->dev);
|
||||
}
|
||||
|
||||
static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
|
||||
{
|
||||
BT_DBG("%s orig refcnt %d", d->name,
|
||||
atomic_read(&d->dev.kobj.kref.refcount));
|
||||
|
||||
get_device(&d->dev);
|
||||
return d;
|
||||
}
|
||||
@@ -1004,7 +1001,7 @@ int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, u32 flags, u8 *name, u8 name_len,
|
||||
u8 *dev_class);
|
||||
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type);
|
||||
u8 link_type, u8 addr_type, u8 reason);
|
||||
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u8 status);
|
||||
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
@@ -1027,6 +1024,9 @@ int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u8 status);
|
||||
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u8 status);
|
||||
int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u32 passkey,
|
||||
u8 entered);
|
||||
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, u8 status);
|
||||
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
|
||||
|
||||
@@ -433,11 +433,10 @@ struct l2cap_chan {
|
||||
struct sock *sk;
|
||||
|
||||
struct l2cap_conn *conn;
|
||||
struct kref kref;
|
||||
|
||||
__u8 state;
|
||||
|
||||
atomic_t refcnt;
|
||||
|
||||
__le16 psm;
|
||||
__u16 dcid;
|
||||
__u16 scid;
|
||||
|
||||
@@ -405,7 +405,16 @@ struct mgmt_ev_device_connected {
|
||||
__u8 eir[0];
|
||||
} __packed;
|
||||
|
||||
#define MGMT_DEV_DISCONN_UNKNOWN 0x00
|
||||
#define MGMT_DEV_DISCONN_TIMEOUT 0x01
|
||||
#define MGMT_DEV_DISCONN_LOCAL_HOST 0x02
|
||||
#define MGMT_DEV_DISCONN_REMOTE 0x03
|
||||
|
||||
#define MGMT_EV_DEVICE_DISCONNECTED 0x000C
|
||||
struct mgmt_ev_device_disconnected {
|
||||
struct mgmt_addr_info addr;
|
||||
__u8 reason;
|
||||
} __packed;
|
||||
|
||||
#define MGMT_EV_CONNECT_FAILED 0x000D
|
||||
struct mgmt_ev_connect_failed {
|
||||
@@ -469,3 +478,10 @@ struct mgmt_ev_device_unblocked {
|
||||
struct mgmt_ev_device_unpaired {
|
||||
struct mgmt_addr_info addr;
|
||||
} __packed;
|
||||
|
||||
#define MGMT_EV_PASSKEY_NOTIFY 0x0017
|
||||
struct mgmt_ev_passkey_notify {
|
||||
struct mgmt_addr_info addr;
|
||||
__le32 passkey;
|
||||
__u8 entered;
|
||||
} __packed;
|
||||
|
||||
+21
-4
@@ -1580,9 +1580,7 @@ struct cfg80211_gtk_rekey_data {
|
||||
* @set_cqm_txe_config: Configure connection quality monitor TX error
|
||||
* thresholds.
|
||||
* @sched_scan_start: Tell the driver to start a scheduled scan.
|
||||
* @sched_scan_stop: Tell the driver to stop an ongoing scheduled
|
||||
* scan. The driver_initiated flag specifies whether the driver
|
||||
* itself has informed that the scan has stopped.
|
||||
* @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan.
|
||||
*
|
||||
* @mgmt_frame_register: Notify driver that a management frame type was
|
||||
* registered. Note that this callback may not sleep, and cannot run
|
||||
@@ -1630,7 +1628,7 @@ struct cfg80211_ops {
|
||||
void (*set_wakeup)(struct wiphy *wiphy, bool enabled);
|
||||
|
||||
struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,
|
||||
char *name,
|
||||
const char *name,
|
||||
enum nl80211_iftype type,
|
||||
u32 *flags,
|
||||
struct vif_params *params);
|
||||
@@ -3362,6 +3360,25 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
|
||||
*/
|
||||
void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_conn_failed - connection request failed notification
|
||||
*
|
||||
* @dev: the netdev
|
||||
* @mac_addr: the station's address
|
||||
* @reason: the reason for connection failure
|
||||
* @gfp: allocation flags
|
||||
*
|
||||
* Whenever a station tries to connect to an AP and if the station
|
||||
* could not connect to the AP as the AP has rejected the connection
|
||||
* for some reasons, this function is called.
|
||||
*
|
||||
* The reason for connection failure can be any of the value from
|
||||
* nl80211_connect_failed_reason enum
|
||||
*/
|
||||
void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
||||
enum nl80211_connect_failed_reason reason,
|
||||
gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_rx_mgmt - notification of received, unprocessed management frame
|
||||
* @wdev: wireless device receiving the frame
|
||||
|
||||
+10
-2
@@ -973,21 +973,29 @@ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
|
||||
* generation in software.
|
||||
* @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates
|
||||
* that the key is pairwise rather then a shared key.
|
||||
* @IEEE80211_KEY_FLAG_SW_MGMT: This flag should be set by the driver for a
|
||||
* @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a
|
||||
* CCMP key if it requires CCMP encryption of management frames (MFP) to
|
||||
* be done in software.
|
||||
* @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver
|
||||
* if space should be prepared for the IV, but the IV
|
||||
* itself should not be generated. Do not set together with
|
||||
* @IEEE80211_KEY_FLAG_GENERATE_IV on the same key.
|
||||
* @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received
|
||||
* management frames. The flag can help drivers that have a hardware
|
||||
* crypto implementation that doesn't deal with management frames
|
||||
* properly by allowing them to not upload the keys to hardware and
|
||||
* fall back to software crypto. Note that this flag deals only with
|
||||
* RX, if your crypto engine can't deal with TX you can also set the
|
||||
* %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW.
|
||||
*/
|
||||
enum ieee80211_key_flags {
|
||||
IEEE80211_KEY_FLAG_WMM_STA = 1<<0,
|
||||
IEEE80211_KEY_FLAG_GENERATE_IV = 1<<1,
|
||||
IEEE80211_KEY_FLAG_GENERATE_MMIC= 1<<2,
|
||||
IEEE80211_KEY_FLAG_PAIRWISE = 1<<3,
|
||||
IEEE80211_KEY_FLAG_SW_MGMT = 1<<4,
|
||||
IEEE80211_KEY_FLAG_SW_MGMT_TX = 1<<4,
|
||||
IEEE80211_KEY_FLAG_PUT_IV_SPACE = 1<<5,
|
||||
IEEE80211_KEY_FLAG_RX_MGMT = 1<<6,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+17
-4
@@ -30,6 +30,11 @@ struct nfc_hci_ops {
|
||||
int (*open) (struct nfc_hci_dev *hdev);
|
||||
void (*close) (struct nfc_hci_dev *hdev);
|
||||
int (*hci_ready) (struct nfc_hci_dev *hdev);
|
||||
/*
|
||||
* xmit must always send the complete buffer before
|
||||
* returning. Returned result must be 0 for success
|
||||
* or negative for failure.
|
||||
*/
|
||||
int (*xmit) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
|
||||
int (*start_poll) (struct nfc_hci_dev *hdev,
|
||||
u32 im_protocols, u32 tm_protocols);
|
||||
@@ -38,8 +43,8 @@ struct nfc_hci_ops {
|
||||
int (*complete_target_discovered) (struct nfc_hci_dev *hdev, u8 gate,
|
||||
struct nfc_target *target);
|
||||
int (*data_exchange) (struct nfc_hci_dev *hdev,
|
||||
struct nfc_target *target,
|
||||
struct sk_buff *skb, struct sk_buff **res_skb);
|
||||
struct nfc_target *target, struct sk_buff *skb,
|
||||
data_exchange_cb_t cb, void *cb_context);
|
||||
int (*check_presence)(struct nfc_hci_dev *hdev,
|
||||
struct nfc_target *target);
|
||||
};
|
||||
@@ -74,7 +79,6 @@ struct nfc_hci_dev {
|
||||
|
||||
struct list_head msg_tx_queue;
|
||||
|
||||
struct workqueue_struct *msg_tx_wq;
|
||||
struct work_struct msg_tx_work;
|
||||
|
||||
struct timer_list cmd_timer;
|
||||
@@ -82,13 +86,14 @@ struct nfc_hci_dev {
|
||||
|
||||
struct sk_buff_head rx_hcp_frags;
|
||||
|
||||
struct workqueue_struct *msg_rx_wq;
|
||||
struct work_struct msg_rx_work;
|
||||
|
||||
struct sk_buff_head msg_rx_queue;
|
||||
|
||||
struct nfc_hci_ops *ops;
|
||||
|
||||
struct nfc_llc *llc;
|
||||
|
||||
struct nfc_hci_init_data init_data;
|
||||
|
||||
void *clientdata;
|
||||
@@ -105,12 +110,17 @@ struct nfc_hci_dev {
|
||||
u8 hw_mpw;
|
||||
u8 hw_software;
|
||||
u8 hw_bsid;
|
||||
|
||||
int async_cb_type;
|
||||
data_exchange_cb_t async_cb;
|
||||
void *async_cb_context;
|
||||
};
|
||||
|
||||
/* hci device allocation */
|
||||
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
|
||||
struct nfc_hci_init_data *init_data,
|
||||
u32 protocols,
|
||||
const char *llc_name,
|
||||
int tx_headroom,
|
||||
int tx_tailroom,
|
||||
int max_link_payload);
|
||||
@@ -202,6 +212,9 @@ int nfc_hci_set_param(struct nfc_hci_dev *hdev, u8 gate, u8 idx,
|
||||
const u8 *param, size_t param_len);
|
||||
int nfc_hci_send_cmd(struct nfc_hci_dev *hdev, u8 gate, u8 cmd,
|
||||
const u8 *param, size_t param_len, struct sk_buff **skb);
|
||||
int nfc_hci_send_cmd_async(struct nfc_hci_dev *hdev, u8 gate, u8 cmd,
|
||||
const u8 *param, size_t param_len,
|
||||
data_exchange_cb_t cb, void *cb_context);
|
||||
int nfc_hci_send_response(struct nfc_hci_dev *hdev, u8 gate, u8 response,
|
||||
const u8 *param, size_t param_len);
|
||||
int nfc_hci_send_event(struct nfc_hci_dev *hdev, u8 gate, u8 event,
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Link Layer Control manager public interface
|
||||
*
|
||||
* Copyright (C) 2012 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the
|
||||
* Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __NFC_LLC_H_
|
||||
#define __NFC_LLC_H_
|
||||
|
||||
#include <net/nfc/hci.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#define LLC_NOP_NAME "nop"
|
||||
#define LLC_SHDLC_NAME "shdlc"
|
||||
|
||||
typedef void (*rcv_to_hci_t) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
|
||||
typedef int (*xmit_to_drv_t) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
|
||||
typedef void (*llc_failure_t) (struct nfc_hci_dev *hdev, int err);
|
||||
|
||||
struct nfc_llc;
|
||||
|
||||
struct nfc_llc *nfc_llc_allocate(const char *name, struct nfc_hci_dev *hdev,
|
||||
xmit_to_drv_t xmit_to_drv,
|
||||
rcv_to_hci_t rcv_to_hci, int tx_headroom,
|
||||
int tx_tailroom, llc_failure_t llc_failure);
|
||||
void nfc_llc_free(struct nfc_llc *llc);
|
||||
|
||||
void nfc_llc_get_rx_head_tail_room(struct nfc_llc *llc, int *rx_headroom,
|
||||
int *rx_tailroom);
|
||||
|
||||
|
||||
int nfc_llc_start(struct nfc_llc *llc);
|
||||
int nfc_llc_stop(struct nfc_llc *llc);
|
||||
void nfc_llc_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb);
|
||||
int nfc_llc_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb);
|
||||
|
||||
int nfc_llc_init(void);
|
||||
void nfc_llc_exit(void);
|
||||
|
||||
#endif /* __NFC_LLC_H_ */
|
||||
@@ -32,6 +32,7 @@
|
||||
#define NCI_MAX_NUM_MAPPING_CONFIGS 10
|
||||
#define NCI_MAX_NUM_RF_CONFIGS 10
|
||||
#define NCI_MAX_NUM_CONN 10
|
||||
#define NCI_MAX_PARAM_LEN 251
|
||||
|
||||
/* NCI Status Codes */
|
||||
#define NCI_STATUS_OK 0x00
|
||||
@@ -102,6 +103,9 @@
|
||||
#define NCI_RF_INTERFACE_ISO_DEP 0x02
|
||||
#define NCI_RF_INTERFACE_NFC_DEP 0x03
|
||||
|
||||
/* NCI Configuration Parameter Tags */
|
||||
#define NCI_PN_ATR_REQ_GEN_BYTES 0x29
|
||||
|
||||
/* NCI Reset types */
|
||||
#define NCI_RESET_TYPE_KEEP_CONFIG 0x00
|
||||
#define NCI_RESET_TYPE_RESET_CONFIG 0x01
|
||||
@@ -188,6 +192,18 @@ struct nci_core_reset_cmd {
|
||||
|
||||
#define NCI_OP_CORE_INIT_CMD nci_opcode_pack(NCI_GID_CORE, 0x01)
|
||||
|
||||
#define NCI_OP_CORE_SET_CONFIG_CMD nci_opcode_pack(NCI_GID_CORE, 0x02)
|
||||
struct set_config_param {
|
||||
__u8 id;
|
||||
__u8 len;
|
||||
__u8 val[NCI_MAX_PARAM_LEN];
|
||||
} __packed;
|
||||
|
||||
struct nci_core_set_config_cmd {
|
||||
__u8 num_params;
|
||||
struct set_config_param param; /* support 1 param per cmd is enough */
|
||||
} __packed;
|
||||
|
||||
#define NCI_OP_RF_DISCOVER_MAP_CMD nci_opcode_pack(NCI_GID_RF_MGMT, 0x00)
|
||||
struct disc_map_config {
|
||||
__u8 rf_protocol;
|
||||
@@ -252,6 +268,13 @@ struct nci_core_init_rsp_2 {
|
||||
__le32 manufact_specific_info;
|
||||
} __packed;
|
||||
|
||||
#define NCI_OP_CORE_SET_CONFIG_RSP nci_opcode_pack(NCI_GID_CORE, 0x02)
|
||||
struct nci_core_set_config_rsp {
|
||||
__u8 status;
|
||||
__u8 num_params;
|
||||
__u8 params_id[0]; /* variable size array */
|
||||
} __packed;
|
||||
|
||||
#define NCI_OP_RF_DISCOVER_MAP_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x00)
|
||||
|
||||
#define NCI_OP_RF_DISCOVER_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
|
||||
@@ -328,6 +351,11 @@ struct activation_params_nfcb_poll_iso_dep {
|
||||
__u8 attrib_res[50];
|
||||
};
|
||||
|
||||
struct activation_params_poll_nfc_dep {
|
||||
__u8 atr_res_len;
|
||||
__u8 atr_res[63];
|
||||
};
|
||||
|
||||
struct nci_rf_intf_activated_ntf {
|
||||
__u8 rf_discovery_id;
|
||||
__u8 rf_interface;
|
||||
@@ -351,6 +379,7 @@ struct nci_rf_intf_activated_ntf {
|
||||
union {
|
||||
struct activation_params_nfca_poll_iso_dep nfca_poll_iso_dep;
|
||||
struct activation_params_nfcb_poll_iso_dep nfcb_poll_iso_dep;
|
||||
struct activation_params_poll_nfc_dep poll_nfc_dep;
|
||||
} activation_params;
|
||||
|
||||
} __packed;
|
||||
|
||||
@@ -54,6 +54,7 @@ enum nci_state {
|
||||
/* NCI timeouts */
|
||||
#define NCI_RESET_TIMEOUT 5000
|
||||
#define NCI_INIT_TIMEOUT 5000
|
||||
#define NCI_SET_CONFIG_TIMEOUT 5000
|
||||
#define NCI_RF_DISC_TIMEOUT 5000
|
||||
#define NCI_RF_DISC_SELECT_TIMEOUT 5000
|
||||
#define NCI_RF_DEACTIVATE_TIMEOUT 30000
|
||||
@@ -137,6 +138,10 @@ struct nci_dev {
|
||||
data_exchange_cb_t data_exchange_cb;
|
||||
void *data_exchange_cb_context;
|
||||
struct sk_buff *rx_data_reassembly;
|
||||
|
||||
/* stored during intf_activated_ntf */
|
||||
__u8 remote_gb[NFC_MAX_GT_LEN];
|
||||
__u8 remote_gb_len;
|
||||
};
|
||||
|
||||
/* ----- NCI Devices ----- */
|
||||
|
||||
@@ -72,6 +72,7 @@ struct nfc_ops {
|
||||
|
||||
#define NFC_TARGET_IDX_ANY -1
|
||||
#define NFC_MAX_GT_LEN 48
|
||||
#define NFC_ATR_RES_GT_OFFSET 15
|
||||
|
||||
struct nfc_target {
|
||||
u32 idx;
|
||||
@@ -112,7 +113,6 @@ struct nfc_dev {
|
||||
int tx_tailroom;
|
||||
|
||||
struct timer_list check_pres_timer;
|
||||
struct workqueue_struct *check_pres_wq;
|
||||
struct work_struct check_pres_work;
|
||||
|
||||
struct nfc_ops *ops;
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the
|
||||
* Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __NFC_SHDLC_H
|
||||
#define __NFC_SHDLC_H
|
||||
|
||||
struct nfc_shdlc;
|
||||
|
||||
struct nfc_shdlc_ops {
|
||||
int (*open) (struct nfc_shdlc *shdlc);
|
||||
void (*close) (struct nfc_shdlc *shdlc);
|
||||
int (*hci_ready) (struct nfc_shdlc *shdlc);
|
||||
int (*xmit) (struct nfc_shdlc *shdlc, struct sk_buff *skb);
|
||||
int (*start_poll) (struct nfc_shdlc *shdlc,
|
||||
u32 im_protocols, u32 tm_protocols);
|
||||
int (*target_from_gate) (struct nfc_shdlc *shdlc, u8 gate,
|
||||
struct nfc_target *target);
|
||||
int (*complete_target_discovered) (struct nfc_shdlc *shdlc, u8 gate,
|
||||
struct nfc_target *target);
|
||||
int (*data_exchange) (struct nfc_shdlc *shdlc,
|
||||
struct nfc_target *target,
|
||||
struct sk_buff *skb, struct sk_buff **res_skb);
|
||||
int (*check_presence)(struct nfc_shdlc *shdlc,
|
||||
struct nfc_target *target);
|
||||
};
|
||||
|
||||
enum shdlc_state {
|
||||
SHDLC_DISCONNECTED = 0,
|
||||
SHDLC_CONNECTING = 1,
|
||||
SHDLC_NEGOCIATING = 2,
|
||||
SHDLC_CONNECTED = 3
|
||||
};
|
||||
|
||||
struct nfc_shdlc {
|
||||
struct mutex state_mutex;
|
||||
enum shdlc_state state;
|
||||
int hard_fault;
|
||||
|
||||
struct nfc_hci_dev *hdev;
|
||||
|
||||
wait_queue_head_t *connect_wq;
|
||||
int connect_tries;
|
||||
int connect_result;
|
||||
struct timer_list connect_timer;/* aka T3 in spec 10.6.1 */
|
||||
|
||||
u8 w; /* window size */
|
||||
bool srej_support;
|
||||
|
||||
struct timer_list t1_timer; /* send ack timeout */
|
||||
bool t1_active;
|
||||
|
||||
struct timer_list t2_timer; /* guard/retransmit timeout */
|
||||
bool t2_active;
|
||||
|
||||
int ns; /* next seq num for send */
|
||||
int nr; /* next expected seq num for receive */
|
||||
int dnr; /* oldest sent unacked seq num */
|
||||
|
||||
struct sk_buff_head rcv_q;
|
||||
|
||||
struct sk_buff_head send_q;
|
||||
bool rnr; /* other side is not ready to receive */
|
||||
|
||||
struct sk_buff_head ack_pending_q;
|
||||
|
||||
struct workqueue_struct *sm_wq;
|
||||
struct work_struct sm_work;
|
||||
|
||||
struct nfc_shdlc_ops *ops;
|
||||
|
||||
int client_headroom;
|
||||
int client_tailroom;
|
||||
|
||||
void *clientdata;
|
||||
};
|
||||
|
||||
void nfc_shdlc_recv_frame(struct nfc_shdlc *shdlc, struct sk_buff *skb);
|
||||
|
||||
struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
|
||||
struct nfc_hci_init_data *init_data,
|
||||
u32 protocols,
|
||||
int tx_headroom, int tx_tailroom,
|
||||
int max_link_payload, const char *devname);
|
||||
|
||||
void nfc_shdlc_free(struct nfc_shdlc *shdlc);
|
||||
|
||||
void nfc_shdlc_set_clientdata(struct nfc_shdlc *shdlc, void *clientdata);
|
||||
void *nfc_shdlc_get_clientdata(struct nfc_shdlc *shdlc);
|
||||
struct nfc_hci_dev *nfc_shdlc_get_hci_dev(struct nfc_shdlc *shdlc);
|
||||
|
||||
#endif /* __NFC_SHDLC_H */
|
||||
Reference in New Issue
Block a user