Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Conflicts: drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
This commit is contained in:
@@ -1,150 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2010,2011 Code Aurora Forum. All rights reserved.
|
||||
Copyright (c) 2011,2012 Intel Corp.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 and
|
||||
only 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.
|
||||
*/
|
||||
|
||||
#ifndef __A2MP_H
|
||||
#define __A2MP_H
|
||||
|
||||
#include <net/bluetooth/l2cap.h>
|
||||
|
||||
#define A2MP_FEAT_EXT 0x8000
|
||||
|
||||
enum amp_mgr_state {
|
||||
READ_LOC_AMP_INFO,
|
||||
READ_LOC_AMP_ASSOC,
|
||||
READ_LOC_AMP_ASSOC_FINAL,
|
||||
WRITE_REMOTE_AMP_ASSOC,
|
||||
};
|
||||
|
||||
struct amp_mgr {
|
||||
struct list_head list;
|
||||
struct l2cap_conn *l2cap_conn;
|
||||
struct l2cap_chan *a2mp_chan;
|
||||
struct l2cap_chan *bredr_chan;
|
||||
struct kref kref;
|
||||
__u8 ident;
|
||||
__u8 handle;
|
||||
unsigned long state;
|
||||
unsigned long flags;
|
||||
|
||||
struct list_head amp_ctrls;
|
||||
struct mutex amp_ctrls_lock;
|
||||
};
|
||||
|
||||
struct a2mp_cmd {
|
||||
__u8 code;
|
||||
__u8 ident;
|
||||
__le16 len;
|
||||
__u8 data[0];
|
||||
} __packed;
|
||||
|
||||
/* A2MP command codes */
|
||||
#define A2MP_COMMAND_REJ 0x01
|
||||
struct a2mp_cmd_rej {
|
||||
__le16 reason;
|
||||
__u8 data[0];
|
||||
} __packed;
|
||||
|
||||
#define A2MP_DISCOVER_REQ 0x02
|
||||
struct a2mp_discov_req {
|
||||
__le16 mtu;
|
||||
__le16 ext_feat;
|
||||
} __packed;
|
||||
|
||||
struct a2mp_cl {
|
||||
__u8 id;
|
||||
__u8 type;
|
||||
__u8 status;
|
||||
} __packed;
|
||||
|
||||
#define A2MP_DISCOVER_RSP 0x03
|
||||
struct a2mp_discov_rsp {
|
||||
__le16 mtu;
|
||||
__le16 ext_feat;
|
||||
struct a2mp_cl cl[0];
|
||||
} __packed;
|
||||
|
||||
#define A2MP_CHANGE_NOTIFY 0x04
|
||||
#define A2MP_CHANGE_RSP 0x05
|
||||
|
||||
#define A2MP_GETINFO_REQ 0x06
|
||||
struct a2mp_info_req {
|
||||
__u8 id;
|
||||
} __packed;
|
||||
|
||||
#define A2MP_GETINFO_RSP 0x07
|
||||
struct a2mp_info_rsp {
|
||||
__u8 id;
|
||||
__u8 status;
|
||||
__le32 total_bw;
|
||||
__le32 max_bw;
|
||||
__le32 min_latency;
|
||||
__le16 pal_cap;
|
||||
__le16 assoc_size;
|
||||
} __packed;
|
||||
|
||||
#define A2MP_GETAMPASSOC_REQ 0x08
|
||||
struct a2mp_amp_assoc_req {
|
||||
__u8 id;
|
||||
} __packed;
|
||||
|
||||
#define A2MP_GETAMPASSOC_RSP 0x09
|
||||
struct a2mp_amp_assoc_rsp {
|
||||
__u8 id;
|
||||
__u8 status;
|
||||
__u8 amp_assoc[0];
|
||||
} __packed;
|
||||
|
||||
#define A2MP_CREATEPHYSLINK_REQ 0x0A
|
||||
#define A2MP_DISCONNPHYSLINK_REQ 0x0C
|
||||
struct a2mp_physlink_req {
|
||||
__u8 local_id;
|
||||
__u8 remote_id;
|
||||
__u8 amp_assoc[0];
|
||||
} __packed;
|
||||
|
||||
#define A2MP_CREATEPHYSLINK_RSP 0x0B
|
||||
#define A2MP_DISCONNPHYSLINK_RSP 0x0D
|
||||
struct a2mp_physlink_rsp {
|
||||
__u8 local_id;
|
||||
__u8 remote_id;
|
||||
__u8 status;
|
||||
} __packed;
|
||||
|
||||
/* A2MP response status */
|
||||
#define A2MP_STATUS_SUCCESS 0x00
|
||||
#define A2MP_STATUS_INVALID_CTRL_ID 0x01
|
||||
#define A2MP_STATUS_UNABLE_START_LINK_CREATION 0x02
|
||||
#define A2MP_STATUS_NO_PHYSICAL_LINK_EXISTS 0x02
|
||||
#define A2MP_STATUS_COLLISION_OCCURED 0x03
|
||||
#define A2MP_STATUS_DISCONN_REQ_RECVD 0x04
|
||||
#define A2MP_STATUS_PHYS_LINK_EXISTS 0x05
|
||||
#define A2MP_STATUS_SECURITY_VIOLATION 0x06
|
||||
|
||||
extern struct list_head amp_mgr_list;
|
||||
extern struct mutex amp_mgr_list_lock;
|
||||
|
||||
struct amp_mgr *amp_mgr_get(struct amp_mgr *mgr);
|
||||
int amp_mgr_put(struct amp_mgr *mgr);
|
||||
u8 __next_ident(struct amp_mgr *mgr);
|
||||
struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn,
|
||||
struct sk_buff *skb);
|
||||
struct amp_mgr *amp_mgr_lookup_by_state(u8 state);
|
||||
void a2mp_send(struct amp_mgr *mgr, u8 code, u8 ident, u16 len, void *data);
|
||||
void a2mp_discover_amp(struct l2cap_chan *chan);
|
||||
void a2mp_send_getinfo_rsp(struct hci_dev *hdev);
|
||||
void a2mp_send_getampassoc_rsp(struct hci_dev *hdev, u8 status);
|
||||
void a2mp_send_create_phy_link_req(struct hci_dev *hdev, u8 status);
|
||||
void a2mp_send_create_phy_link_rsp(struct hci_dev *hdev, u8 status);
|
||||
|
||||
#endif /* __A2MP_H */
|
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2011,2012 Intel Corp.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 and
|
||||
only 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.
|
||||
*/
|
||||
|
||||
#ifndef __AMP_H
|
||||
#define __AMP_H
|
||||
|
||||
struct amp_ctrl {
|
||||
struct list_head list;
|
||||
struct kref kref;
|
||||
__u8 id;
|
||||
__u16 assoc_len_so_far;
|
||||
__u16 assoc_rem_len;
|
||||
__u16 assoc_len;
|
||||
__u8 *assoc;
|
||||
};
|
||||
|
||||
int amp_ctrl_put(struct amp_ctrl *ctrl);
|
||||
void amp_ctrl_get(struct amp_ctrl *ctrl);
|
||||
struct amp_ctrl *amp_ctrl_add(struct amp_mgr *mgr, u8 id);
|
||||
struct amp_ctrl *amp_ctrl_lookup(struct amp_mgr *mgr, u8 id);
|
||||
void amp_ctrl_list_flush(struct amp_mgr *mgr);
|
||||
|
||||
struct hci_conn *phylink_add(struct hci_dev *hdev, struct amp_mgr *mgr,
|
||||
u8 remote_id, bool out);
|
||||
|
||||
int phylink_gen_key(struct hci_conn *hcon, u8 *data, u8 *len, u8 *type);
|
||||
|
||||
void amp_read_loc_info(struct hci_dev *hdev, struct amp_mgr *mgr);
|
||||
void amp_read_loc_assoc_frag(struct hci_dev *hdev, u8 phy_handle);
|
||||
void amp_read_loc_assoc(struct hci_dev *hdev, struct amp_mgr *mgr);
|
||||
void amp_read_loc_assoc_final_data(struct hci_dev *hdev,
|
||||
struct hci_conn *hcon);
|
||||
void amp_create_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
||||
struct hci_conn *hcon);
|
||||
void amp_accept_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
||||
struct hci_conn *hcon);
|
||||
void amp_write_remote_assoc(struct hci_dev *hdev, u8 handle);
|
||||
void amp_write_rem_assoc_continue(struct hci_dev *hdev, u8 handle);
|
||||
void amp_physical_cfm(struct hci_conn *bredr_hcon, struct hci_conn *hs_hcon);
|
||||
void amp_create_logical_link(struct l2cap_chan *chan);
|
||||
void amp_disconnect_logical_link(struct hci_chan *hchan);
|
||||
void amp_destroy_logical_link(struct hci_chan *hchan, u8 reason);
|
||||
|
||||
#endif /* __AMP_H */
|
@@ -218,11 +218,10 @@ void baswap(bdaddr_t *dst, bdaddr_t *src);
|
||||
|
||||
struct bt_sock {
|
||||
struct sock sk;
|
||||
bdaddr_t src;
|
||||
bdaddr_t dst;
|
||||
struct list_head accept_q;
|
||||
struct sock *parent;
|
||||
unsigned long flags;
|
||||
void (*skb_msg_name)(struct sk_buff *, void *, int *);
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -285,6 +284,8 @@ struct bt_skb_cb {
|
||||
__u8 force_active;
|
||||
struct l2cap_ctrl control;
|
||||
struct hci_req_ctrl req;
|
||||
bdaddr_t bdaddr;
|
||||
__le16 psm;
|
||||
};
|
||||
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
|
||||
|
||||
|
@@ -64,16 +64,20 @@
|
||||
#define HCI_AMP 0x01
|
||||
|
||||
/* First BR/EDR Controller shall have ID = 0 */
|
||||
#define HCI_BREDR_ID 0
|
||||
#define AMP_ID_BREDR 0x00
|
||||
|
||||
/* AMP controller types */
|
||||
#define AMP_TYPE_BREDR 0x00
|
||||
#define AMP_TYPE_80211 0x01
|
||||
|
||||
/* AMP controller status */
|
||||
#define AMP_CTRL_POWERED_DOWN 0x00
|
||||
#define AMP_CTRL_BLUETOOTH_ONLY 0x01
|
||||
#define AMP_CTRL_NO_CAPACITY 0x02
|
||||
#define AMP_CTRL_LOW_CAPACITY 0x03
|
||||
#define AMP_CTRL_MEDIUM_CAPACITY 0x04
|
||||
#define AMP_CTRL_HIGH_CAPACITY 0x05
|
||||
#define AMP_CTRL_FULL_CAPACITY 0x06
|
||||
#define AMP_STATUS_POWERED_DOWN 0x00
|
||||
#define AMP_STATUS_BLUETOOTH_ONLY 0x01
|
||||
#define AMP_STATUS_NO_CAPACITY 0x02
|
||||
#define AMP_STATUS_LOW_CAPACITY 0x03
|
||||
#define AMP_STATUS_MEDIUM_CAPACITY 0x04
|
||||
#define AMP_STATUS_HIGH_CAPACITY 0x05
|
||||
#define AMP_STATUS_FULL_CAPACITY 0x06
|
||||
|
||||
/* HCI device quirks */
|
||||
enum {
|
||||
@@ -118,7 +122,7 @@ enum {
|
||||
HCI_SSP_ENABLED,
|
||||
HCI_HS_ENABLED,
|
||||
HCI_LE_ENABLED,
|
||||
HCI_LE_PERIPHERAL,
|
||||
HCI_ADVERTISING,
|
||||
HCI_CONNECTABLE,
|
||||
HCI_DISCOVERABLE,
|
||||
HCI_LINK_SECURITY,
|
||||
@@ -811,6 +815,14 @@ struct hci_cp_host_buffer_size {
|
||||
__le16 sco_max_pkt;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_READ_NUM_SUPPORTED_IAC 0x0c38
|
||||
struct hci_rp_read_num_supported_iac {
|
||||
__u8 status;
|
||||
__u8 num_iac;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_READ_CURRENT_IAC_LAP 0x0c39
|
||||
|
||||
#define HCI_OP_WRITE_INQUIRY_MODE 0x0c45
|
||||
|
||||
#define HCI_MAX_EIR_LENGTH 240
|
||||
@@ -847,6 +859,8 @@ struct hci_rp_read_inq_rsp_tx_power {
|
||||
|
||||
#define HCI_OP_SET_EVENT_MASK_PAGE_2 0x0c63
|
||||
|
||||
#define HCI_OP_READ_LOCATION_DATA 0x0c64
|
||||
|
||||
#define HCI_OP_READ_FLOW_CONTROL_MODE 0x0c66
|
||||
struct hci_rp_read_flow_control_mode {
|
||||
__u8 status;
|
||||
@@ -1042,6 +1056,23 @@ struct hci_rp_le_read_local_features {
|
||||
|
||||
#define HCI_OP_LE_SET_RANDOM_ADDR 0x2005
|
||||
|
||||
#define LE_ADV_IND 0x00
|
||||
#define LE_ADV_DIRECT_IND 0x01
|
||||
#define LE_ADV_SCAN_IND 0x02
|
||||
#define LE_ADV_NONCONN_IND 0x03
|
||||
|
||||
#define HCI_OP_LE_SET_ADV_PARAM 0x2006
|
||||
struct hci_cp_le_set_adv_param {
|
||||
__le16 min_interval;
|
||||
__le16 max_interval;
|
||||
__u8 type;
|
||||
__u8 own_address_type;
|
||||
__u8 direct_addr_type;
|
||||
bdaddr_t direct_addr;
|
||||
__u8 channel_map;
|
||||
__u8 filter_policy;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_LE_READ_ADV_TX_POWER 0x2007
|
||||
struct hci_rp_le_read_adv_tx_power {
|
||||
__u8 status;
|
||||
|
@@ -159,11 +159,14 @@ struct hci_dev {
|
||||
__u16 manufacturer;
|
||||
__u16 lmp_subver;
|
||||
__u16 voice_setting;
|
||||
__u8 num_iac;
|
||||
__u8 io_capability;
|
||||
__s8 inq_tx_power;
|
||||
__u16 page_scan_interval;
|
||||
__u16 page_scan_window;
|
||||
__u8 page_scan_type;
|
||||
__u16 le_scan_interval;
|
||||
__u16 le_scan_window;
|
||||
|
||||
__u16 devid_source;
|
||||
__u16 devid_vendor;
|
||||
@@ -285,9 +288,8 @@ struct hci_dev {
|
||||
int (*close)(struct hci_dev *hdev);
|
||||
int (*flush)(struct hci_dev *hdev);
|
||||
int (*setup)(struct hci_dev *hdev);
|
||||
int (*send)(struct sk_buff *skb);
|
||||
int (*send)(struct hci_dev *hdev, 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);
|
||||
};
|
||||
|
||||
#define HCI_PHY_HANDLE(handle) (handle & 0xff)
|
||||
@@ -299,6 +301,8 @@ struct hci_conn {
|
||||
|
||||
bdaddr_t dst;
|
||||
__u8 dst_type;
|
||||
bdaddr_t src;
|
||||
__u8 src_type;
|
||||
__u16 handle;
|
||||
__u16 state;
|
||||
__u8 mode;
|
||||
@@ -703,19 +707,6 @@ static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
|
||||
dev_set_drvdata(&hdev->dev, data);
|
||||
}
|
||||
|
||||
/* hci_dev_list shall be locked */
|
||||
static inline uint8_t __hci_num_ctrl(void)
|
||||
{
|
||||
uint8_t count = 0;
|
||||
struct list_head *p;
|
||||
|
||||
list_for_each(p, &hci_dev_list) {
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
struct hci_dev *hci_dev_get(int index);
|
||||
struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src);
|
||||
|
||||
@@ -768,7 +759,7 @@ int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
|
||||
|
||||
void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
|
||||
int hci_recv_frame(struct sk_buff *skb);
|
||||
int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
|
||||
int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
|
||||
|
||||
@@ -807,22 +798,6 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
|
||||
#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)
|
||||
{
|
||||
struct hci_dev *hdev;
|
||||
bool ret = false;
|
||||
|
||||
read_lock(&hci_dev_list_lock);
|
||||
list_for_each_entry(hdev, &hci_dev_list, list)
|
||||
if (hdev->amp_type == HCI_AMP &&
|
||||
test_bit(HCI_UP, &hdev->flags))
|
||||
ret = true;
|
||||
read_unlock(&hci_dev_list_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* ----- HCI protocols ----- */
|
||||
#define HCI_PROTO_DEFER 0x01
|
||||
|
||||
@@ -1120,24 +1095,24 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event);
|
||||
#define DISCOV_BREDR_INQUIRY_LEN 0x08
|
||||
|
||||
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
|
||||
int mgmt_index_added(struct hci_dev *hdev);
|
||||
int mgmt_index_removed(struct hci_dev *hdev);
|
||||
int mgmt_set_powered_failed(struct hci_dev *hdev, int err);
|
||||
void mgmt_index_added(struct hci_dev *hdev);
|
||||
void mgmt_index_removed(struct hci_dev *hdev);
|
||||
void mgmt_set_powered_failed(struct hci_dev *hdev, int err);
|
||||
int mgmt_powered(struct hci_dev *hdev, u8 powered);
|
||||
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
|
||||
int mgmt_connectable(struct hci_dev *hdev, u8 connectable);
|
||||
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);
|
||||
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
|
||||
bool persistent);
|
||||
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 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,
|
||||
u8 addr_type, u8 status);
|
||||
void 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);
|
||||
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u8 reason);
|
||||
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u8 status);
|
||||
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, u8 status);
|
||||
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
|
||||
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 status);
|
||||
@@ -1168,16 +1143,16 @@ int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
|
||||
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
|
||||
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
|
||||
u8 *randomizer, u8 status);
|
||||
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
|
||||
u8 ssp, u8 *eir, u16 eir_len);
|
||||
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, s8 rssi, u8 *name, u8 name_len);
|
||||
int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
|
||||
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
|
||||
u8 ssp, u8 *eir, u16 eir_len);
|
||||
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, s8 rssi, u8 *name, u8 name_len);
|
||||
void mgmt_discovering(struct hci_dev *hdev, u8 discovering);
|
||||
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
|
||||
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
|
||||
bool mgmt_valid_hdev(struct hci_dev *hdev);
|
||||
int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent);
|
||||
void mgmt_reenable_advertising(struct hci_dev *hdev);
|
||||
|
||||
/* HCI info for socket */
|
||||
#define hci_pi(sk) ((struct hci_pinfo *) sk)
|
||||
@@ -1214,8 +1189,6 @@ void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
|
||||
void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
|
||||
__u8 ltk[16]);
|
||||
|
||||
u8 bdaddr_to_le(u8 bdaddr_type);
|
||||
|
||||
#define SCO_AIRMODE_MASK 0x0003
|
||||
#define SCO_AIRMODE_CVSD 0x0000
|
||||
#define SCO_AIRMODE_TRANSP 0x0003
|
||||
|
@@ -131,6 +131,7 @@ struct l2cap_conninfo {
|
||||
|
||||
/* L2CAP fixed channels */
|
||||
#define L2CAP_FC_L2CAP 0x02
|
||||
#define L2CAP_FC_CONNLESS 0x04
|
||||
#define L2CAP_FC_A2MP 0x08
|
||||
|
||||
/* L2CAP Control Field bit masks */
|
||||
@@ -237,6 +238,7 @@ struct l2cap_conn_rsp {
|
||||
/* protocol/service multiplexer (PSM) */
|
||||
#define L2CAP_PSM_SDP 0x0001
|
||||
#define L2CAP_PSM_RFCOMM 0x0003
|
||||
#define L2CAP_PSM_3DSP 0x0021
|
||||
|
||||
/* channel indentifier */
|
||||
#define L2CAP_CID_SIGNALING 0x0001
|
||||
@@ -442,7 +444,12 @@ struct l2cap_chan {
|
||||
|
||||
__u8 state;
|
||||
|
||||
bdaddr_t dst;
|
||||
__u8 dst_type;
|
||||
bdaddr_t src;
|
||||
__u8 src_type;
|
||||
__le16 psm;
|
||||
__le16 sport;
|
||||
__u16 dcid;
|
||||
__u16 scid;
|
||||
|
||||
@@ -453,8 +460,6 @@ struct l2cap_chan {
|
||||
__u8 chan_type;
|
||||
__u8 chan_policy;
|
||||
|
||||
__le16 sport;
|
||||
|
||||
__u8 sec_level;
|
||||
|
||||
__u8 ident;
|
||||
@@ -549,6 +554,7 @@ struct l2cap_ops {
|
||||
int state);
|
||||
void (*ready) (struct l2cap_chan *chan);
|
||||
void (*defer) (struct l2cap_chan *chan);
|
||||
void (*resume) (struct l2cap_chan *chan);
|
||||
struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
|
||||
unsigned long len, int nb);
|
||||
};
|
||||
@@ -557,9 +563,6 @@ struct l2cap_conn {
|
||||
struct hci_conn *hcon;
|
||||
struct hci_chan *hchan;
|
||||
|
||||
bdaddr_t *dst;
|
||||
bdaddr_t *src;
|
||||
|
||||
unsigned int mtu;
|
||||
|
||||
__u32 feat_mask;
|
||||
@@ -650,6 +653,7 @@ enum {
|
||||
FLAG_FLUSHABLE,
|
||||
FLAG_EXT_CTRL,
|
||||
FLAG_EFS_ENABLE,
|
||||
FLAG_DEFER_SETUP,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@@ -362,6 +362,13 @@ struct mgmt_cp_set_static_address {
|
||||
} __packed;
|
||||
#define MGMT_SET_STATIC_ADDRESS_SIZE 6
|
||||
|
||||
#define MGMT_OP_SET_SCAN_PARAMS 0x002C
|
||||
struct mgmt_cp_set_scan_params {
|
||||
__le16 interval;
|
||||
__le16 window;
|
||||
} __packed;
|
||||
#define MGMT_SET_SCAN_PARAMS_SIZE 4
|
||||
|
||||
#define MGMT_EV_CMD_COMPLETE 0x0001
|
||||
struct mgmt_ev_cmd_complete {
|
||||
__le16 opcode;
|
||||
|
@@ -300,6 +300,8 @@ struct rfcomm_conninfo {
|
||||
|
||||
struct rfcomm_pinfo {
|
||||
struct bt_sock bt;
|
||||
bdaddr_t src;
|
||||
bdaddr_t dst;
|
||||
struct rfcomm_dlc *dlc;
|
||||
u8 channel;
|
||||
u8 sec_level;
|
||||
|
@@ -55,9 +55,6 @@ struct sco_conninfo {
|
||||
struct sco_conn {
|
||||
struct hci_conn *hcon;
|
||||
|
||||
bdaddr_t *dst;
|
||||
bdaddr_t *src;
|
||||
|
||||
spinlock_t lock;
|
||||
struct sock *sk;
|
||||
|
||||
@@ -72,6 +69,8 @@ struct sco_conn {
|
||||
|
||||
struct sco_pinfo {
|
||||
struct bt_sock bt;
|
||||
bdaddr_t src;
|
||||
bdaddr_t dst;
|
||||
__u32 flags;
|
||||
__u16 setting;
|
||||
struct sco_conn *conn;
|
||||
|
@@ -1,146 +0,0 @@
|
||||
/*
|
||||
BlueZ - Bluetooth protocol stack for Linux
|
||||
Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation;
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
|
||||
CLAIM, OR ANY SPECIAL 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.
|
||||
|
||||
ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
|
||||
COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
|
||||
SOFTWARE IS DISCLAIMED.
|
||||
*/
|
||||
|
||||
#ifndef __SMP_H
|
||||
#define __SMP_H
|
||||
|
||||
struct smp_command_hdr {
|
||||
__u8 code;
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_PAIRING_REQ 0x01
|
||||
#define SMP_CMD_PAIRING_RSP 0x02
|
||||
struct smp_cmd_pairing {
|
||||
__u8 io_capability;
|
||||
__u8 oob_flag;
|
||||
__u8 auth_req;
|
||||
__u8 max_key_size;
|
||||
__u8 init_key_dist;
|
||||
__u8 resp_key_dist;
|
||||
} __packed;
|
||||
|
||||
#define SMP_IO_DISPLAY_ONLY 0x00
|
||||
#define SMP_IO_DISPLAY_YESNO 0x01
|
||||
#define SMP_IO_KEYBOARD_ONLY 0x02
|
||||
#define SMP_IO_NO_INPUT_OUTPUT 0x03
|
||||
#define SMP_IO_KEYBOARD_DISPLAY 0x04
|
||||
|
||||
#define SMP_OOB_NOT_PRESENT 0x00
|
||||
#define SMP_OOB_PRESENT 0x01
|
||||
|
||||
#define SMP_DIST_ENC_KEY 0x01
|
||||
#define SMP_DIST_ID_KEY 0x02
|
||||
#define SMP_DIST_SIGN 0x04
|
||||
|
||||
#define SMP_AUTH_NONE 0x00
|
||||
#define SMP_AUTH_BONDING 0x01
|
||||
#define SMP_AUTH_MITM 0x04
|
||||
|
||||
#define SMP_CMD_PAIRING_CONFIRM 0x03
|
||||
struct smp_cmd_pairing_confirm {
|
||||
__u8 confirm_val[16];
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_PAIRING_RANDOM 0x04
|
||||
struct smp_cmd_pairing_random {
|
||||
__u8 rand_val[16];
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_PAIRING_FAIL 0x05
|
||||
struct smp_cmd_pairing_fail {
|
||||
__u8 reason;
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_ENCRYPT_INFO 0x06
|
||||
struct smp_cmd_encrypt_info {
|
||||
__u8 ltk[16];
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_MASTER_IDENT 0x07
|
||||
struct smp_cmd_master_ident {
|
||||
__le16 ediv;
|
||||
__u8 rand[8];
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_IDENT_INFO 0x08
|
||||
struct smp_cmd_ident_info {
|
||||
__u8 irk[16];
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_IDENT_ADDR_INFO 0x09
|
||||
struct smp_cmd_ident_addr_info {
|
||||
__u8 addr_type;
|
||||
bdaddr_t bdaddr;
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_SIGN_INFO 0x0a
|
||||
struct smp_cmd_sign_info {
|
||||
__u8 csrk[16];
|
||||
} __packed;
|
||||
|
||||
#define SMP_CMD_SECURITY_REQ 0x0b
|
||||
struct smp_cmd_security_req {
|
||||
__u8 auth_req;
|
||||
} __packed;
|
||||
|
||||
#define SMP_PASSKEY_ENTRY_FAILED 0x01
|
||||
#define SMP_OOB_NOT_AVAIL 0x02
|
||||
#define SMP_AUTH_REQUIREMENTS 0x03
|
||||
#define SMP_CONFIRM_FAILED 0x04
|
||||
#define SMP_PAIRING_NOTSUPP 0x05
|
||||
#define SMP_ENC_KEY_SIZE 0x06
|
||||
#define SMP_CMD_NOTSUPP 0x07
|
||||
#define SMP_UNSPECIFIED 0x08
|
||||
#define SMP_REPEATED_ATTEMPTS 0x09
|
||||
|
||||
#define SMP_MIN_ENC_KEY_SIZE 7
|
||||
#define SMP_MAX_ENC_KEY_SIZE 16
|
||||
|
||||
#define SMP_FLAG_TK_VALID 1
|
||||
#define SMP_FLAG_CFM_PENDING 2
|
||||
#define SMP_FLAG_MITM_AUTH 3
|
||||
|
||||
struct smp_chan {
|
||||
struct l2cap_conn *conn;
|
||||
u8 preq[7]; /* SMP Pairing Request */
|
||||
u8 prsp[7]; /* SMP Pairing Response */
|
||||
u8 prnd[16]; /* SMP Pairing Random (local) */
|
||||
u8 rrnd[16]; /* SMP Pairing Random (remote) */
|
||||
u8 pcnf[16]; /* SMP Pairing Confirm */
|
||||
u8 tk[16]; /* SMP Temporary Key */
|
||||
u8 enc_key_size;
|
||||
unsigned long smp_flags;
|
||||
struct crypto_blkcipher *tfm;
|
||||
struct work_struct confirm;
|
||||
struct work_struct random;
|
||||
|
||||
};
|
||||
|
||||
/* SMP Commands */
|
||||
int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
|
||||
int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb);
|
||||
int smp_distribute_keys(struct l2cap_conn *conn, __u8 force);
|
||||
int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
|
||||
|
||||
void smp_chan_destroy(struct l2cap_conn *conn);
|
||||
|
||||
#endif /* __SMP_H */
|
@@ -3483,6 +3483,15 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
|
||||
const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
|
||||
u32 center_freq);
|
||||
|
||||
/**
|
||||
* reg_initiator_name - map regulatory request initiator enum to name
|
||||
* @initiator: the regulatory request initiator
|
||||
*
|
||||
* You can use this to map the regulatory request initiator enum to a
|
||||
* proper string representation.
|
||||
*/
|
||||
const char *reg_initiator_name(enum nl80211_reg_initiator initiator);
|
||||
|
||||
/*
|
||||
* callbacks for asynchronous cfg80211 methods, notification
|
||||
* functions and BSS handling helpers
|
||||
|
227
include/net/nfc/digital.h
Normal file
227
include/net/nfc/digital.h
Normal file
@@ -0,0 +1,227 @@
|
||||
/*
|
||||
* NFC Digital Protocol stack
|
||||
* Copyright (c) 2013, Intel Corporation.
|
||||
*
|
||||
* 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 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __NFC_DIGITAL_H
|
||||
#define __NFC_DIGITAL_H
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/nfc/nfc.h>
|
||||
|
||||
/**
|
||||
* Configuration types for in_configure_hw and tg_configure_hw.
|
||||
*/
|
||||
enum {
|
||||
NFC_DIGITAL_CONFIG_RF_TECH = 0,
|
||||
NFC_DIGITAL_CONFIG_FRAMING,
|
||||
};
|
||||
|
||||
/**
|
||||
* RF technology values passed as param argument to in_configure_hw and
|
||||
* tg_configure_hw for NFC_DIGITAL_CONFIG_RF_TECH configuration type.
|
||||
*/
|
||||
enum {
|
||||
NFC_DIGITAL_RF_TECH_106A = 0,
|
||||
NFC_DIGITAL_RF_TECH_212F,
|
||||
NFC_DIGITAL_RF_TECH_424F,
|
||||
|
||||
NFC_DIGITAL_RF_TECH_LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* Framing configuration passed as param argument to in_configure_hw and
|
||||
* tg_configure_hw for NFC_DIGITAL_CONFIG_FRAMING configuration type.
|
||||
*/
|
||||
enum {
|
||||
NFC_DIGITAL_FRAMING_NFCA_SHORT = 0,
|
||||
NFC_DIGITAL_FRAMING_NFCA_STANDARD,
|
||||
NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A,
|
||||
|
||||
NFC_DIGITAL_FRAMING_NFCA_T1T,
|
||||
NFC_DIGITAL_FRAMING_NFCA_T2T,
|
||||
NFC_DIGITAL_FRAMING_NFCA_NFC_DEP,
|
||||
|
||||
NFC_DIGITAL_FRAMING_NFCF,
|
||||
NFC_DIGITAL_FRAMING_NFCF_T3T,
|
||||
NFC_DIGITAL_FRAMING_NFCF_NFC_DEP,
|
||||
NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED,
|
||||
|
||||
NFC_DIGITAL_FRAMING_LAST,
|
||||
};
|
||||
|
||||
#define DIGITAL_MDAA_NFCID1_SIZE 3
|
||||
|
||||
struct digital_tg_mdaa_params {
|
||||
u16 sens_res;
|
||||
u8 nfcid1[DIGITAL_MDAA_NFCID1_SIZE];
|
||||
u8 sel_res;
|
||||
|
||||
u8 nfcid2[NFC_NFCID2_MAXSIZE];
|
||||
u16 sc;
|
||||
};
|
||||
|
||||
struct nfc_digital_dev;
|
||||
|
||||
/**
|
||||
* nfc_digital_cmd_complete_t - Definition of command result callback
|
||||
*
|
||||
* @ddev: nfc_digital_device ref
|
||||
* @arg: user data
|
||||
* @resp: response data
|
||||
*
|
||||
* resp pointer can be an error code and will be checked with IS_ERR() macro.
|
||||
* The callback is responsible for freeing resp sk_buff.
|
||||
*/
|
||||
typedef void (*nfc_digital_cmd_complete_t)(struct nfc_digital_dev *ddev,
|
||||
void *arg, struct sk_buff *resp);
|
||||
|
||||
/**
|
||||
* Device side NFC Digital operations
|
||||
*
|
||||
* Initiator mode:
|
||||
* @in_configure_hw: Hardware configuration for RF technology and communication
|
||||
* framing in initiator mode. This is a synchronous function.
|
||||
* @in_send_cmd: Initiator mode data exchange using RF technology and framing
|
||||
* previously set with in_configure_hw. The peer response is returned
|
||||
* through callback cb. If an io error occurs or the peer didn't reply
|
||||
* within the specified timeout (ms), the error code is passed back through
|
||||
* the resp pointer. This is an asynchronous function.
|
||||
*
|
||||
* Target mode: Only NFC-DEP protocol is supported in target mode.
|
||||
* @tg_configure_hw: Hardware configuration for RF technology and communication
|
||||
* framing in target mode. This is a synchronous function.
|
||||
* @tg_send_cmd: Target mode data exchange using RF technology and framing
|
||||
* previously set with tg_configure_hw. The peer next command is returned
|
||||
* through callback cb. If an io error occurs or the peer didn't reply
|
||||
* within the specified timeout (ms), the error code is passed back through
|
||||
* the resp pointer. This is an asynchronous function.
|
||||
* @tg_listen: Put the device in listen mode waiting for data from the peer
|
||||
* device. This is an asynchronous function.
|
||||
* @tg_listen_mdaa: If supported, put the device in automatic listen mode with
|
||||
* mode detection and automatic anti-collision. In this mode, the device
|
||||
* automatically detects the RF technology and executes the anti-collision
|
||||
* detection using the command responses specified in mdaa_params. The
|
||||
* mdaa_params structure contains SENS_RES, NFCID1, and SEL_RES for 106A RF
|
||||
* tech. NFCID2 and system code (sc) for 212F and 424F. The driver returns
|
||||
* the NFC-DEP ATR_REQ command through cb. The digital stack deducts the RF
|
||||
* tech by analyzing the SoD of the frame containing the ATR_REQ command.
|
||||
* This is an asynchronous function.
|
||||
*
|
||||
* @switch_rf: Turns device radio on or off. The stack does not call explicitly
|
||||
* switch_rf to turn the radio on. A call to in|tg_configure_hw must turn
|
||||
* the device radio on.
|
||||
* @abort_cmd: Discard the last sent command.
|
||||
*/
|
||||
struct nfc_digital_ops {
|
||||
int (*in_configure_hw)(struct nfc_digital_dev *ddev, int type,
|
||||
int param);
|
||||
int (*in_send_cmd)(struct nfc_digital_dev *ddev, struct sk_buff *skb,
|
||||
u16 timeout, nfc_digital_cmd_complete_t cb,
|
||||
void *arg);
|
||||
|
||||
int (*tg_configure_hw)(struct nfc_digital_dev *ddev, int type,
|
||||
int param);
|
||||
int (*tg_send_cmd)(struct nfc_digital_dev *ddev, struct sk_buff *skb,
|
||||
u16 timeout, nfc_digital_cmd_complete_t cb,
|
||||
void *arg);
|
||||
int (*tg_listen)(struct nfc_digital_dev *ddev, u16 timeout,
|
||||
nfc_digital_cmd_complete_t cb, void *arg);
|
||||
int (*tg_listen_mdaa)(struct nfc_digital_dev *ddev,
|
||||
struct digital_tg_mdaa_params *mdaa_params,
|
||||
u16 timeout, nfc_digital_cmd_complete_t cb,
|
||||
void *arg);
|
||||
|
||||
int (*switch_rf)(struct nfc_digital_dev *ddev, bool on);
|
||||
void (*abort_cmd)(struct nfc_digital_dev *ddev);
|
||||
};
|
||||
|
||||
#define NFC_DIGITAL_POLL_MODE_COUNT_MAX 6 /* 106A, 212F, and 424F in & tg */
|
||||
|
||||
typedef int (*digital_poll_t)(struct nfc_digital_dev *ddev, u8 rf_tech);
|
||||
|
||||
struct digital_poll_tech {
|
||||
u8 rf_tech;
|
||||
digital_poll_t poll_func;
|
||||
};
|
||||
|
||||
/**
|
||||
* Driver capabilities - bit mask made of the following values
|
||||
*
|
||||
* @NFC_DIGITAL_DRV_CAPS_IN_CRC: The driver handles CRC calculation in initiator
|
||||
* mode.
|
||||
* @NFC_DIGITAL_DRV_CAPS_TG_CRC: The driver handles CRC calculation in target
|
||||
* mode.
|
||||
*/
|
||||
#define NFC_DIGITAL_DRV_CAPS_IN_CRC 0x0001
|
||||
#define NFC_DIGITAL_DRV_CAPS_TG_CRC 0x0002
|
||||
|
||||
struct nfc_digital_dev {
|
||||
struct nfc_dev *nfc_dev;
|
||||
struct nfc_digital_ops *ops;
|
||||
|
||||
u32 protocols;
|
||||
|
||||
int tx_headroom;
|
||||
int tx_tailroom;
|
||||
|
||||
u32 driver_capabilities;
|
||||
void *driver_data;
|
||||
|
||||
struct digital_poll_tech poll_techs[NFC_DIGITAL_POLL_MODE_COUNT_MAX];
|
||||
u8 poll_tech_count;
|
||||
u8 poll_tech_index;
|
||||
struct mutex poll_lock;
|
||||
|
||||
struct work_struct cmd_work;
|
||||
struct work_struct cmd_complete_work;
|
||||
struct list_head cmd_queue;
|
||||
struct mutex cmd_lock;
|
||||
|
||||
struct work_struct poll_work;
|
||||
|
||||
u8 curr_protocol;
|
||||
u8 curr_rf_tech;
|
||||
u8 curr_nfc_dep_pni;
|
||||
|
||||
int (*skb_check_crc)(struct sk_buff *skb);
|
||||
void (*skb_add_crc)(struct sk_buff *skb);
|
||||
};
|
||||
|
||||
struct nfc_digital_dev *nfc_digital_allocate_device(struct nfc_digital_ops *ops,
|
||||
__u32 supported_protocols,
|
||||
__u32 driver_capabilities,
|
||||
int tx_headroom,
|
||||
int tx_tailroom);
|
||||
void nfc_digital_free_device(struct nfc_digital_dev *ndev);
|
||||
int nfc_digital_register_device(struct nfc_digital_dev *ndev);
|
||||
void nfc_digital_unregister_device(struct nfc_digital_dev *ndev);
|
||||
|
||||
static inline void nfc_digital_set_parent_dev(struct nfc_digital_dev *ndev,
|
||||
struct device *dev)
|
||||
{
|
||||
nfc_set_parent_dev(ndev->nfc_dev, dev);
|
||||
}
|
||||
|
||||
static inline void nfc_digital_set_drvdata(struct nfc_digital_dev *dev,
|
||||
void *data)
|
||||
{
|
||||
dev->driver_data = data;
|
||||
}
|
||||
|
||||
static inline void *nfc_digital_get_drvdata(struct nfc_digital_dev *dev)
|
||||
{
|
||||
return dev->driver_data;
|
||||
}
|
||||
|
||||
#endif /* __NFC_DIGITAL_H */
|
@@ -24,12 +24,6 @@
|
||||
|
||||
#include <net/nfc/nfc.h>
|
||||
|
||||
struct nfc_phy_ops {
|
||||
int (*write)(void *dev_id, struct sk_buff *skb);
|
||||
int (*enable)(void *dev_id);
|
||||
void (*disable)(void *dev_id);
|
||||
};
|
||||
|
||||
struct nfc_hci_dev;
|
||||
|
||||
struct nfc_hci_ops {
|
||||
|
@@ -166,6 +166,10 @@
|
||||
#define NCI_GID_NFCEE_MGMT 0x2
|
||||
#define NCI_GID_PROPRIETARY 0xf
|
||||
|
||||
/* ----- NCI over SPI head/crc(tail) room needed for outgoing frames ----- */
|
||||
#define NCI_SPI_HDR_LEN 4
|
||||
#define NCI_SPI_CRC_LEN 2
|
||||
|
||||
/* ---- NCI Packet structures ---- */
|
||||
#define NCI_CTRL_HDR_SIZE 3
|
||||
#define NCI_DATA_HDR_SIZE 3
|
||||
|
@@ -207,19 +207,9 @@ int nci_to_errno(__u8 code);
|
||||
#define NCI_SPI_CRC_ENABLED 0x01
|
||||
|
||||
/* ----- NCI SPI structures ----- */
|
||||
struct nci_spi_dev;
|
||||
|
||||
struct nci_spi_ops {
|
||||
int (*open)(struct nci_spi_dev *ndev);
|
||||
int (*close)(struct nci_spi_dev *ndev);
|
||||
void (*assert_int)(struct nci_spi_dev *ndev);
|
||||
void (*deassert_int)(struct nci_spi_dev *ndev);
|
||||
};
|
||||
|
||||
struct nci_spi_dev {
|
||||
struct nci_dev *nci_dev;
|
||||
struct nci_spi {
|
||||
struct nci_dev *ndev;
|
||||
struct spi_device *spi;
|
||||
struct nci_spi_ops *ops;
|
||||
|
||||
unsigned int xfer_udelay; /* microseconds delay between
|
||||
transactions */
|
||||
@@ -227,31 +217,15 @@ struct nci_spi_dev {
|
||||
|
||||
struct completion req_completion;
|
||||
u8 req_result;
|
||||
|
||||
void *driver_data;
|
||||
};
|
||||
|
||||
/* ----- NCI SPI Devices ----- */
|
||||
struct nci_spi_dev *nci_spi_allocate_device(struct spi_device *spi,
|
||||
struct nci_spi_ops *ops,
|
||||
u32 supported_protocols,
|
||||
u32 supported_se,
|
||||
u8 acknowledge_mode,
|
||||
unsigned int delay);
|
||||
void nci_spi_free_device(struct nci_spi_dev *ndev);
|
||||
int nci_spi_register_device(struct nci_spi_dev *ndev);
|
||||
void nci_spi_unregister_device(struct nci_spi_dev *ndev);
|
||||
int nci_spi_recv_frame(struct nci_spi_dev *ndev);
|
||||
|
||||
static inline void nci_spi_set_drvdata(struct nci_spi_dev *ndev,
|
||||
void *data)
|
||||
{
|
||||
ndev->driver_data = data;
|
||||
}
|
||||
|
||||
static inline void *nci_spi_get_drvdata(struct nci_spi_dev *ndev)
|
||||
{
|
||||
return ndev->driver_data;
|
||||
}
|
||||
/* ----- NCI SPI ----- */
|
||||
struct nci_spi *nci_spi_allocate_spi(struct spi_device *spi,
|
||||
u8 acknowledge_mode, unsigned int delay,
|
||||
struct nci_dev *ndev);
|
||||
int nci_spi_send(struct nci_spi *nspi,
|
||||
struct completion *write_handshake_completion,
|
||||
struct sk_buff *skb);
|
||||
struct sk_buff *nci_spi_read(struct nci_spi *nspi);
|
||||
|
||||
#endif /* __NCI_CORE_H */
|
||||
|
@@ -28,9 +28,14 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#define nfc_dev_info(dev, fmt, arg...) dev_info((dev), "NFC: " fmt "\n", ## arg)
|
||||
#define nfc_dev_err(dev, fmt, arg...) dev_err((dev), "NFC: " fmt "\n", ## arg)
|
||||
#define nfc_dev_dbg(dev, fmt, arg...) dev_dbg((dev), fmt "\n", ## arg)
|
||||
#define nfc_info(dev, fmt, ...) dev_info((dev), "NFC: " fmt, ##__VA_ARGS__)
|
||||
#define nfc_err(dev, fmt, ...) dev_err((dev), "NFC: " fmt, ##__VA_ARGS__)
|
||||
|
||||
struct nfc_phy_ops {
|
||||
int (*write)(void *dev_id, struct sk_buff *skb);
|
||||
int (*enable)(void *dev_id);
|
||||
void (*disable)(void *dev_id);
|
||||
};
|
||||
|
||||
struct nfc_dev;
|
||||
|
||||
@@ -48,6 +53,8 @@ struct nfc_dev;
|
||||
typedef void (*data_exchange_cb_t)(void *context, struct sk_buff *skb,
|
||||
int err);
|
||||
|
||||
typedef void (*se_io_cb_t)(void *context, u8 *apdu, size_t apdu_len, int err);
|
||||
|
||||
struct nfc_target;
|
||||
|
||||
struct nfc_ops {
|
||||
@@ -74,12 +81,23 @@ struct nfc_ops {
|
||||
int (*discover_se)(struct nfc_dev *dev);
|
||||
int (*enable_se)(struct nfc_dev *dev, u32 se_idx);
|
||||
int (*disable_se)(struct nfc_dev *dev, u32 se_idx);
|
||||
int (*se_io) (struct nfc_dev *dev, u32 se_idx,
|
||||
u8 *apdu, size_t apdu_length,
|
||||
se_io_cb_t cb, void *cb_context);
|
||||
};
|
||||
|
||||
#define NFC_TARGET_IDX_ANY -1
|
||||
#define NFC_MAX_GT_LEN 48
|
||||
#define NFC_ATR_RES_GT_OFFSET 15
|
||||
|
||||
/**
|
||||
* struct nfc_target - NFC target descriptiom
|
||||
*
|
||||
* @sens_res: 2 bytes describing the target SENS_RES response, if the target
|
||||
* is a type A one. The %sens_res most significant byte must be byte 2
|
||||
* as described by the NFC Forum digital specification (i.e. the platform
|
||||
* configuration one) while %sens_res least significant byte is byte 1.
|
||||
*/
|
||||
struct nfc_target {
|
||||
u32 idx;
|
||||
u32 supported_protocols;
|
||||
@@ -243,5 +261,6 @@ void nfc_driver_failure(struct nfc_dev *dev, int err);
|
||||
|
||||
int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type);
|
||||
int nfc_remove_se(struct nfc_dev *dev, u32 se_idx);
|
||||
struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx);
|
||||
|
||||
#endif /* __NET_NFC_H */
|
||||
|
Reference in New Issue
Block a user