mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge tag 'master-2014-10-02' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says:
====================
pull request: wireless-next 2014-10-03
Please pull tihs batch of updates intended for the 3.18 stream!
For the iwlwifi bits, Emmanuel says:
"I have here a few things that depend on the latest mac80211's changes:
RRM, TPC, Quiet Period etc... Eyal keeps improving our rate control
and we have a new device ID. This last patch should probably have
gone to wireless.git, but at that stage, I preferred to send it to
-next and CC stable."
For (most of) the Atheros bits, Kalle says:
"The only new feature is testmode support from me. Ben added a new method
to crash the firmware with an assert for debug purposes. As usual, we
have lots of smaller fixes from Michal. Matteo fixed a Kconfig
dependency with debugfs. I fixed some warnings recently added to
checkpatch."
For the NFC bits, Samuel says:
"We've had major updates for TI and ST Microelectronics drivers, and a
few NCI related changes.
For TI's trf7970a driver:
- Target mode support for trf7970a
- Suspend/resume support for trf7970a
- DT properties additions to handle different quirks
- A bunch of fixes for smartphone IOP related issues
For ST Microelectronics' ST21NFCA and ST21NFCB drivers:
- ISO15693 support for st21nfcb
- checkpatch and sparse related warning fixes
- Code cleanups and a few minor fixes
Finally, Marvell added ISO15693 support to the NCI stack, together with a
couple of NCI fixes."
For the Bluetooth bits, Johan says:
"This 3.18 pull request replaces the one I did on Monday ("bluetooth-next
2014-09-22", which hasn't been pulled yet). The additions since the last
request are:
- SCO connection fix for devices not supporting eSCO
- Cleanups regarding the SCO establishment logic
- Remove unnecessary return value from logging functions
- Header compression fix for 6lowpan
- Cleanups to the ieee802154/mrf24j40 driver
Here's a copy from previous request that this one replaces:
'
Here are some more patches for 3.18. They include various fixes to the
btusb HCI driver, a fix for LE SMP, as well as adding Jukka to the
MAINTAINERS file for generic 6LoWPAN (as requested by Alexander Aring).
I've held on to this pull request a bit since we were waiting for a SCO
related fix to get sorted out first. However, since the merge window is
getting closer I decided not to wait for it. If we do get the fix sorted
out there'll probably be a second small pull request later this week.
'"
And,
"Unless 3.17 gets delayed this will probably be our last -next pull request for
3.18. We've got:
- New Marvell hardware supportr
- Multicast support for 6lowpan
- Several of 6lowpan fixes & cleanups
- Fix for a (false-positive) lockdep warning in L2CAP
- Minor btusb cleanup"
On top of all that comes the usual sort of updates to ath5k, ath9k,
ath10k, brcmfmac, mwifiex, and wil6210. This time around there are
also a number of rtlwifi updates to enable some new hardware and
to reconcile the in-kernel drivers with some newer releases of the
Realtek vendor drivers. Also of note is some device tree work for
the bcma bus.
Please let me know if there are problems!
====================
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
a4b4a2b7f9
325 changed files with 63957 additions and 17040 deletions
|
|
@ -271,6 +271,7 @@ static int st21nfca_hci_i2c_write(void *phy_id, struct sk_buff *skb)
|
|||
static int get_frame_size(u8 *buf, int buflen)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
if (buf[len + 1] == ST21NFCA_SOF_EOF)
|
||||
return 0;
|
||||
|
||||
|
|
@ -311,6 +312,7 @@ static int check_crc(u8 *buf, int buflen)
|
|||
static int st21nfca_hci_i2c_repack(struct sk_buff *skb)
|
||||
{
|
||||
int i, j, r, size;
|
||||
|
||||
if (skb->len < 1 || (skb->len > 1 && skb->data[1] != 0))
|
||||
return -EBADMSG;
|
||||
|
||||
|
|
@ -525,24 +527,19 @@ static int st21nfca_hci_i2c_of_request_resources(struct i2c_client *client)
|
|||
}
|
||||
|
||||
/* GPIO request and configuration */
|
||||
r = devm_gpio_request(&client->dev, gpio, "clf_enable");
|
||||
r = devm_gpio_request_one(&client->dev, gpio, GPIOF_OUT_INIT_HIGH,
|
||||
"clf_enable");
|
||||
if (r) {
|
||||
nfc_err(&client->dev, "Failed to request enable pin\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = gpio_direction_output(gpio, 1);
|
||||
if (r) {
|
||||
nfc_err(&client->dev, "Failed to set enable pin direction as output\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
phy->gpio_ena = gpio;
|
||||
|
||||
/* IRQ */
|
||||
r = irq_of_parse_and_map(pp, 0);
|
||||
if (r < 0) {
|
||||
nfc_err(&client->dev,
|
||||
"Unable to get irq, error: %d\n", r);
|
||||
nfc_err(&client->dev, "Unable to get irq, error: %d\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -576,32 +573,20 @@ static int st21nfca_hci_i2c_request_resources(struct i2c_client *client)
|
|||
phy->gpio_ena = pdata->gpio_ena;
|
||||
phy->irq_polarity = pdata->irq_polarity;
|
||||
|
||||
r = devm_gpio_request(&client->dev, phy->gpio_irq, "wake_up");
|
||||
r = devm_gpio_request_one(&client->dev, phy->gpio_irq, GPIOF_IN,
|
||||
"wake_up");
|
||||
if (r) {
|
||||
pr_err("%s : gpio_request failed\n", __FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = gpio_direction_input(phy->gpio_irq);
|
||||
if (r) {
|
||||
pr_err("%s : gpio_direction_input failed\n", __FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (phy->gpio_ena > 0) {
|
||||
r = devm_gpio_request(&client->dev,
|
||||
phy->gpio_ena, "clf_enable");
|
||||
r = devm_gpio_request_one(&client->dev, phy->gpio_ena,
|
||||
GPIOF_OUT_INIT_HIGH, "clf_enable");
|
||||
if (r) {
|
||||
pr_err("%s : ena gpio_request failed\n", __FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
r = gpio_direction_output(phy->gpio_ena, 1);
|
||||
|
||||
if (r) {
|
||||
pr_err("%s : ena gpio_direction_output failed\n",
|
||||
__FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
/* IRQ */
|
||||
|
|
@ -711,7 +696,6 @@ static struct i2c_driver st21nfca_hci_i2c_driver = {
|
|||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = ST21NFCA_HCI_I2C_DRIVER_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(of_st21nfca_i2c_match),
|
||||
},
|
||||
.probe = st21nfca_hci_i2c_probe,
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
#define ST21NFCA_RF_READER_CMD_PRESENCE_CHECK 0x30
|
||||
|
||||
#define ST21NFCA_RF_READER_ISO15693_GATE 0x12
|
||||
#define ST21NFCA_RF_READER_ISO15693_INVENTORY 0x01
|
||||
#define ST21NFCA_RF_READER_ISO15693_INVENTORY 0x01
|
||||
|
||||
/*
|
||||
* Reader gate for communication with contact-less cards using Type A
|
||||
|
|
@ -45,21 +45,42 @@
|
|||
#define ST21NFCA_RF_READER_14443_3_A_ATQA 0x03
|
||||
#define ST21NFCA_RF_READER_14443_3_A_SAK 0x04
|
||||
|
||||
#define ST21NFCA_RF_READER_F_DATARATE 0x01
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_106 0x01
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_212 0x02
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_424 0x04
|
||||
#define ST21NFCA_RF_READER_F_POL_REQ 0x02
|
||||
#define ST21NFCA_RF_READER_F_POL_REQ_DEFAULT 0xffff0000
|
||||
#define ST21NFCA_RF_READER_F_NFCID2 0x03
|
||||
#define ST21NFCA_RF_READER_F_NFCID1 0x04
|
||||
|
||||
#define ST21NFCA_RF_CARD_F_MODE 0x01
|
||||
#define ST21NFCA_RF_CARD_F_NFCID2_LIST 0x04
|
||||
#define ST21NFCA_RF_CARD_F_NFCID1 0x05
|
||||
#define ST21NFCA_RF_CARD_F_SENS_RES 0x06
|
||||
#define ST21NFCA_RF_CARD_F_SEL_RES 0x07
|
||||
#define ST21NFCA_RF_CARD_F_DATARATE 0x08
|
||||
#define ST21NFCA_RF_CARD_F_DATARATE_212_424 0x01
|
||||
|
||||
#define ST21NFCA_DEVICE_MGNT_GATE 0x01
|
||||
#define ST21NFCA_DEVICE_MGNT_PIPE 0x02
|
||||
|
||||
#define ST21NFCA_DM_GETINFO 0x13
|
||||
#define ST21NFCA_DM_GETINFO_PIPE_LIST 0x02
|
||||
#define ST21NFCA_DM_GETINFO_PIPE_INFO 0x01
|
||||
#define ST21NFCA_DM_PIPE_CREATED 0x02
|
||||
#define ST21NFCA_DM_PIPE_OPEN 0x04
|
||||
#define ST21NFCA_DM_RF_ACTIVE 0x80
|
||||
#define ST21NFCA_DM_DISCONNECT 0x30
|
||||
#define ST21NFCA_DM_GETINFO 0x13
|
||||
#define ST21NFCA_DM_GETINFO_PIPE_LIST 0x02
|
||||
#define ST21NFCA_DM_GETINFO_PIPE_INFO 0x01
|
||||
#define ST21NFCA_DM_PIPE_CREATED 0x02
|
||||
#define ST21NFCA_DM_PIPE_OPEN 0x04
|
||||
#define ST21NFCA_DM_RF_ACTIVE 0x80
|
||||
#define ST21NFCA_DM_DISCONNECT 0x30
|
||||
|
||||
#define ST21NFCA_DM_IS_PIPE_OPEN(p) \
|
||||
((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN))
|
||||
|
||||
#define ST21NFCA_NFC_MODE 0x03 /* NFC_MODE parameter*/
|
||||
#define ST21NFCA_NFC_MODE 0x03 /* NFC_MODE parameter*/
|
||||
#define ST21NFCA_EVT_FIELD_ON 0x11
|
||||
#define ST21NFCA_EVT_CARD_DEACTIVATED 0x12
|
||||
#define ST21NFCA_EVT_CARD_ACTIVATED 0x13
|
||||
#define ST21NFCA_EVT_FIELD_OFF 0x14
|
||||
|
||||
static DECLARE_BITMAP(dev_mask, ST21NFCA_NUM_DEVICES);
|
||||
|
||||
|
|
@ -355,8 +376,8 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
|
|||
if (r < 0)
|
||||
return r;
|
||||
|
||||
pol_req =
|
||||
be32_to_cpu(ST21NFCA_RF_READER_F_POL_REQ_DEFAULT);
|
||||
pol_req = be32_to_cpu((__force __be32)
|
||||
ST21NFCA_RF_READER_F_POL_REQ_DEFAULT);
|
||||
r = nfc_hci_set_param(hdev, ST21NFCA_RF_READER_F_GATE,
|
||||
ST21NFCA_RF_READER_F_POL_REQ,
|
||||
(u8 *) &pol_req, 4);
|
||||
|
|
@ -790,6 +811,7 @@ static int st21nfca_hci_check_presence(struct nfc_hci_dev *hdev,
|
|||
struct nfc_target *target)
|
||||
{
|
||||
u8 fwi = 0x11;
|
||||
|
||||
switch (target->hci_reader_gate) {
|
||||
case NFC_HCI_RF_READER_A_GATE:
|
||||
case NFC_HCI_RF_READER_B_GATE:
|
||||
|
|
@ -839,20 +861,16 @@ static int st21nfca_hci_event_received(struct nfc_hci_dev *hdev, u8 gate,
|
|||
if (gate == ST21NFCA_RF_CARD_F_GATE) {
|
||||
r = st21nfca_tm_event_send_data(hdev, skb, gate);
|
||||
if (r < 0)
|
||||
goto exit;
|
||||
return r;
|
||||
return 0;
|
||||
} else {
|
||||
info->dep_info.curr_nfc_dep_pni = 0;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
info->dep_info.curr_nfc_dep_pni = 0;
|
||||
return 1;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
exit:
|
||||
return r;
|
||||
}
|
||||
|
||||
static struct nfc_hci_ops st21nfca_hci_ops = {
|
||||
|
|
@ -904,8 +922,11 @@ int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops,
|
|||
* persistent info to discriminate 2 identical chips
|
||||
*/
|
||||
dev_num = find_first_zero_bit(dev_mask, ST21NFCA_NUM_DEVICES);
|
||||
|
||||
if (dev_num >= ST21NFCA_NUM_DEVICES)
|
||||
goto err_alloc_hdev;
|
||||
return -ENODEV;
|
||||
|
||||
set_bit(dev_num, dev_mask);
|
||||
|
||||
scnprintf(init_data.session_id, sizeof(init_data.session_id), "%s%2x",
|
||||
"ST21AH", dev_num);
|
||||
|
|
|
|||
|
|
@ -82,30 +82,9 @@ struct st21nfca_hci_info {
|
|||
#define ST21NFCA_WR_XCHG_DATA 0x10
|
||||
|
||||
#define ST21NFCA_RF_READER_F_GATE 0x14
|
||||
#define ST21NFCA_RF_READER_F_DATARATE 0x01
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_106 0x01
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_212 0x02
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_424 0x04
|
||||
#define ST21NFCA_RF_READER_F_POL_REQ 0x02
|
||||
#define ST21NFCA_RF_READER_F_POL_REQ_DEFAULT 0xffff0000
|
||||
#define ST21NFCA_RF_READER_F_NFCID2 0x03
|
||||
#define ST21NFCA_RF_READER_F_NFCID1 0x04
|
||||
#define ST21NFCA_RF_READER_F_SENS_RES 0x05
|
||||
|
||||
#define ST21NFCA_RF_CARD_F_GATE 0x24
|
||||
#define ST21NFCA_RF_CARD_F_MODE 0x01
|
||||
#define ST21NFCA_RF_CARD_F_NFCID2_LIST 0x04
|
||||
#define ST21NFCA_RF_CARD_F_NFCID1 0x05
|
||||
#define ST21NFCA_RF_CARD_F_SENS_RES 0x06
|
||||
#define ST21NFCA_RF_CARD_F_SEL_RES 0x07
|
||||
#define ST21NFCA_RF_CARD_F_DATARATE 0x08
|
||||
#define ST21NFCA_RF_CARD_F_DATARATE_106 0x00
|
||||
#define ST21NFCA_RF_CARD_F_DATARATE_212_424 0x01
|
||||
|
||||
#define ST21NFCA_EVT_SEND_DATA 0x10
|
||||
#define ST21NFCA_EVT_FIELD_ON 0x11
|
||||
#define ST21NFCA_EVT_CARD_DEACTIVATED 0x12
|
||||
#define ST21NFCA_EVT_CARD_ACTIVATED 0x13
|
||||
#define ST21NFCA_EVT_FIELD_OFF 0x14
|
||||
|
||||
#endif /* __LOCAL_ST21NFCA_H_ */
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ static void st21nfca_tx_work(struct work_struct *work)
|
|||
|
||||
struct nfc_dev *dev;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (info) {
|
||||
dev = info->hdev->ndev;
|
||||
skb = info->dep_info.tx_pending;
|
||||
|
|
@ -128,9 +129,8 @@ static void st21nfca_tx_work(struct work_struct *work)
|
|||
device_lock(&dev->dev);
|
||||
|
||||
nfc_hci_send_cmd_async(info->hdev, ST21NFCA_RF_READER_F_GATE,
|
||||
ST21NFCA_WR_XCHG_DATA,
|
||||
skb->data, skb->len,
|
||||
info->async_cb, info);
|
||||
ST21NFCA_WR_XCHG_DATA, skb->data, skb->len,
|
||||
info->async_cb, info);
|
||||
device_unlock(&dev->dev);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
|
@ -185,8 +185,10 @@ static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,
|
|||
|
||||
info->dep_info.curr_nfc_dep_pni = 0;
|
||||
|
||||
return nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
|
||||
r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
|
||||
ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
|
||||
kfree_skb(skb);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
|
||||
|
|
@ -197,10 +199,6 @@ static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
|
|||
int r;
|
||||
|
||||
skb_trim(skb, skb->len - 1);
|
||||
if (IS_ERR(skb)) {
|
||||
r = PTR_ERR(skb);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!skb->len) {
|
||||
r = -EIO;
|
||||
|
|
@ -214,6 +212,11 @@ static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
|
|||
|
||||
atr_req = (struct st21nfca_atr_req *)skb->data;
|
||||
|
||||
if (atr_req->length < sizeof(struct st21nfca_atr_req)) {
|
||||
r = -EPROTO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
r = st21nfca_tm_send_atr_res(hdev, atr_req);
|
||||
if (r)
|
||||
goto exit;
|
||||
|
|
@ -237,7 +240,6 @@ static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
|
|||
struct st21nfca_psl_res *psl_res;
|
||||
struct sk_buff *skb;
|
||||
u8 bitrate[2] = {0, 0};
|
||||
|
||||
int r;
|
||||
|
||||
skb = alloc_skb(sizeof(struct st21nfca_psl_res), GFP_KERNEL);
|
||||
|
|
@ -254,6 +256,8 @@ static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
|
|||
|
||||
r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
|
||||
ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
|
||||
if (r < 0)
|
||||
goto error;
|
||||
|
||||
/*
|
||||
* ST21NFCA only support P2P passive.
|
||||
|
|
@ -269,8 +273,11 @@ static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
|
|||
}
|
||||
|
||||
/* Send an event to change bitrate change event to card f */
|
||||
return nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
|
||||
r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
|
||||
ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2);
|
||||
error:
|
||||
kfree_skb(skb);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
|
||||
|
|
@ -280,11 +287,6 @@ static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
|
|||
int r;
|
||||
|
||||
skb_trim(skb, skb->len - 1);
|
||||
if (IS_ERR(skb)) {
|
||||
r = PTR_ERR(skb);
|
||||
skb = NULL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!skb->len) {
|
||||
r = -EIO;
|
||||
|
|
@ -314,7 +316,7 @@ int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb)
|
|||
*skb_push(skb, 1) = skb->len;
|
||||
|
||||
r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
|
||||
ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
|
||||
ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
|
||||
kfree_skb(skb);
|
||||
|
||||
return r;
|
||||
|
|
@ -330,11 +332,6 @@ static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
|
|||
struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
|
||||
|
||||
skb_trim(skb, skb->len - 1);
|
||||
if (IS_ERR(skb)) {
|
||||
r = PTR_ERR(skb);
|
||||
skb = NULL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
size = 4;
|
||||
|
||||
|
|
@ -368,12 +365,6 @@ static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
|
|||
break;
|
||||
}
|
||||
|
||||
if (IS_ERR(skb)) {
|
||||
r = PTR_ERR(skb);
|
||||
skb = NULL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
skb_pull(skb, size);
|
||||
|
||||
return nfc_tm_data_received(hdev->ndev, skb);
|
||||
|
|
@ -437,8 +428,6 @@ static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
|
|||
*skb_push(skb, 1) = info->dep_info.to | 0x10;
|
||||
|
||||
st21nfca_im_send_pdu(info, skb);
|
||||
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
#define ST21NFCA_CB_TYPE_READER_F 1
|
||||
|
|
@ -452,7 +441,7 @@ static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
|
|||
if (err != 0)
|
||||
return;
|
||||
|
||||
if (IS_ERR(skb))
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
switch (info->async_cb_type) {
|
||||
|
|
@ -484,8 +473,7 @@ static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
|
|||
ST21NFCA_PP2LRI(atr_res->ppi));
|
||||
break;
|
||||
default:
|
||||
if (err == 0)
|
||||
kfree_skb(skb);
|
||||
kfree_skb(skb);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -522,7 +510,7 @@ int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len)
|
|||
memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE);
|
||||
target = hdev->ndev->targets;
|
||||
|
||||
if (target->sensf_res)
|
||||
if (target->sensf_res_len > 0)
|
||||
memcpy(atr_req->nfcid3, target->sensf_res,
|
||||
target->sensf_res_len);
|
||||
else
|
||||
|
|
@ -565,7 +553,7 @@ static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
|
|||
if (err != 0)
|
||||
return;
|
||||
|
||||
if (IS_ERR(skb))
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
switch (info->async_cb_type) {
|
||||
|
|
@ -615,8 +603,7 @@ static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
exit:
|
||||
if (err == 0)
|
||||
kfree_skb(skb);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb)
|
||||
|
|
|
|||
|
|
@ -17,24 +17,16 @@
|
|||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/crc-ccitt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/nfc.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/unaligned/access_ok.h>
|
||||
#include <linux/platform_data/st21nfcb.h>
|
||||
|
||||
#include <net/nfc/nci.h>
|
||||
#include <net/nfc/llc.h>
|
||||
#include <net/nfc/nfc.h>
|
||||
|
||||
#include "ndlc.h"
|
||||
|
||||
#define DRIVER_DESC "NCI NFC driver for ST21NFCB"
|
||||
|
|
@ -63,12 +55,6 @@ struct st21nfcb_i2c_phy {
|
|||
unsigned int irq_polarity;
|
||||
|
||||
int powered;
|
||||
|
||||
/*
|
||||
* < 0 if hardware error occured (e.g. i2c err)
|
||||
* and prevents normal operation.
|
||||
*/
|
||||
int hard_fault;
|
||||
};
|
||||
|
||||
#define I2C_DUMP_SKB(info, skb) \
|
||||
|
|
@ -122,8 +108,8 @@ static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb)
|
|||
|
||||
I2C_DUMP_SKB("st21nfcb_nci_i2c_write", skb);
|
||||
|
||||
if (phy->hard_fault != 0)
|
||||
return phy->hard_fault;
|
||||
if (phy->ndlc->hard_fault != 0)
|
||||
return phy->ndlc->hard_fault;
|
||||
|
||||
r = i2c_master_send(client, skb->data, skb->len);
|
||||
if (r == -EREMOTEIO) { /* Retry, chip was in standby */
|
||||
|
|
@ -168,11 +154,11 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy,
|
|||
if (r == -EREMOTEIO) { /* Retry, chip was in standby */
|
||||
usleep_range(1000, 4000);
|
||||
r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE);
|
||||
} else if (r != ST21NFCB_NCI_I2C_MIN_SIZE) {
|
||||
nfc_err(&client->dev, "cannot read ndlc & nci header\n");
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
if (r != ST21NFCB_NCI_I2C_MIN_SIZE)
|
||||
return -EREMOTEIO;
|
||||
|
||||
len = be16_to_cpu(*(__be16 *) (buf + 2));
|
||||
if (len > ST21NFCB_NCI_I2C_MAX_SIZE) {
|
||||
nfc_err(&client->dev, "invalid frame len\n");
|
||||
|
|
@ -224,7 +210,7 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
|
|||
client = phy->i2c_dev;
|
||||
dev_dbg(&client->dev, "IRQ\n");
|
||||
|
||||
if (phy->hard_fault)
|
||||
if (phy->ndlc->hard_fault)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
if (!phy->powered) {
|
||||
|
|
@ -233,13 +219,8 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
|
|||
}
|
||||
|
||||
r = st21nfcb_nci_i2c_read(phy, &skb);
|
||||
if (r == -EREMOTEIO) {
|
||||
phy->hard_fault = r;
|
||||
ndlc_recv(phy->ndlc, NULL);
|
||||
if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG)
|
||||
return IRQ_HANDLED;
|
||||
} else if (r == -ENOMEM || r == -EBADMSG) {
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
ndlc_recv(phy->ndlc, skb);
|
||||
|
||||
|
|
@ -273,25 +254,18 @@ static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client)
|
|||
}
|
||||
|
||||
/* GPIO request and configuration */
|
||||
r = devm_gpio_request(&client->dev, gpio, "clf_reset");
|
||||
r = devm_gpio_request_one(&client->dev, gpio,
|
||||
GPIOF_OUT_INIT_HIGH, "clf_reset");
|
||||
if (r) {
|
||||
nfc_err(&client->dev, "Failed to request reset pin\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = gpio_direction_output(gpio, 1);
|
||||
if (r) {
|
||||
nfc_err(&client->dev,
|
||||
"Failed to set reset pin direction as output\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
phy->gpio_reset = gpio;
|
||||
|
||||
/* IRQ */
|
||||
r = irq_of_parse_and_map(pp, 0);
|
||||
if (r < 0) {
|
||||
nfc_err(&client->dev,
|
||||
"Unable to get irq, error: %d\n", r);
|
||||
nfc_err(&client->dev, "Unable to get irq, error: %d\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -325,32 +299,20 @@ static int st21nfcb_nci_i2c_request_resources(struct i2c_client *client)
|
|||
phy->gpio_reset = pdata->gpio_reset;
|
||||
phy->irq_polarity = pdata->irq_polarity;
|
||||
|
||||
r = devm_gpio_request(&client->dev, phy->gpio_irq, "wake_up");
|
||||
r = devm_gpio_request_one(&client->dev, phy->gpio_irq,
|
||||
GPIOF_IN, "clf_irq");
|
||||
if (r) {
|
||||
pr_err("%s : gpio_request failed\n", __FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = gpio_direction_input(phy->gpio_irq);
|
||||
if (r) {
|
||||
pr_err("%s : gpio_direction_input failed\n", __FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = devm_gpio_request(&client->dev,
|
||||
phy->gpio_reset, "clf_reset");
|
||||
r = devm_gpio_request_one(&client->dev,
|
||||
phy->gpio_reset, GPIOF_OUT_INIT_HIGH, "clf_reset");
|
||||
if (r) {
|
||||
pr_err("%s : reset gpio_request failed\n", __FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = gpio_direction_output(phy->gpio_reset, 1);
|
||||
if (r) {
|
||||
pr_err("%s : reset gpio_direction_output failed\n",
|
||||
__FILE__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* IRQ */
|
||||
irq = gpio_to_irq(phy->gpio_irq);
|
||||
if (irq < 0) {
|
||||
|
|
@ -448,7 +410,6 @@ static struct i2c_driver st21nfcb_nci_i2c_driver = {
|
|||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = ST21NFCB_NCI_I2C_DRIVER_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(of_st21nfcb_i2c_match),
|
||||
},
|
||||
.probe = st21nfcb_nci_i2c_probe,
|
||||
|
|
|
|||
|
|
@ -112,6 +112,10 @@ static void llt_ndlc_send_queue(struct llt_ndlc *ndlc)
|
|||
ndlc->t1_active = true;
|
||||
mod_timer(&ndlc->t1_timer, time_sent +
|
||||
msecs_to_jiffies(NDLC_TIMER_T1));
|
||||
/* start timer t2 for chip availability */
|
||||
ndlc->t2_active = true;
|
||||
mod_timer(&ndlc->t2_timer, time_sent +
|
||||
msecs_to_jiffies(NDLC_TIMER_T2));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -207,7 +211,7 @@ static void llt_ndlc_sm_work(struct work_struct *work)
|
|||
ndlc->t2_active = false;
|
||||
ndlc->t1_active = false;
|
||||
del_timer_sync(&ndlc->t1_timer);
|
||||
|
||||
del_timer_sync(&ndlc->t2_timer);
|
||||
ndlc_close(ndlc);
|
||||
ndlc->hard_fault = -EREMOTEIO;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ struct llt_ndlc {
|
|||
|
||||
struct device *dev;
|
||||
|
||||
/*
|
||||
* < 0 if hardware error occured
|
||||
* and prevents normal operation.
|
||||
*/
|
||||
int hard_fault;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -22,10 +22,11 @@
|
|||
#include <net/nfc/nci_core.h>
|
||||
|
||||
#include "st21nfcb.h"
|
||||
#include "ndlc.h"
|
||||
|
||||
#define DRIVER_DESC "NCI NFC driver for ST21NFCB"
|
||||
|
||||
#define ST21NFCB_NCI1_X_PROPRIETARY_ISO15693 0x83
|
||||
|
||||
static int st21nfcb_nci_open(struct nci_dev *ndev)
|
||||
{
|
||||
struct st21nfcb_nci_info *info = nci_get_drvdata(ndev);
|
||||
|
|
@ -65,10 +66,18 @@ static int st21nfcb_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
|
|||
return ndlc_send(info->ndlc, skb);
|
||||
}
|
||||
|
||||
static __u32 st21nfcb_nci_get_rfprotocol(struct nci_dev *ndev,
|
||||
__u8 rf_protocol)
|
||||
{
|
||||
return rf_protocol == ST21NFCB_NCI1_X_PROPRIETARY_ISO15693 ?
|
||||
NFC_PROTO_ISO15693_MASK : 0;
|
||||
}
|
||||
|
||||
static struct nci_ops st21nfcb_nci_ops = {
|
||||
.open = st21nfcb_nci_open,
|
||||
.close = st21nfcb_nci_close,
|
||||
.send = st21nfcb_nci_send,
|
||||
.get_rfprotocol = st21nfcb_nci_get_rfprotocol,
|
||||
};
|
||||
|
||||
int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
|
||||
|
|
@ -88,30 +97,26 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
|
|||
| NFC_PROTO_FELICA_MASK
|
||||
| NFC_PROTO_ISO14443_MASK
|
||||
| NFC_PROTO_ISO14443_B_MASK
|
||||
| NFC_PROTO_ISO15693_MASK
|
||||
| NFC_PROTO_NFC_DEP_MASK;
|
||||
|
||||
ndlc->ndev = nci_allocate_device(&st21nfcb_nci_ops, protocols,
|
||||
phy_headroom, phy_tailroom);
|
||||
if (!ndlc->ndev) {
|
||||
pr_err("Cannot allocate nfc ndev\n");
|
||||
r = -ENOMEM;
|
||||
goto err_alloc_ndev;
|
||||
return -ENOMEM;
|
||||
}
|
||||
info->ndlc = ndlc;
|
||||
|
||||
nci_set_drvdata(ndlc->ndev, info);
|
||||
|
||||
r = nci_register_device(ndlc->ndev);
|
||||
if (r)
|
||||
goto err_regdev;
|
||||
if (r) {
|
||||
pr_err("Cannot register nfc device to nci core\n");
|
||||
nci_free_device(ndlc->ndev);
|
||||
}
|
||||
|
||||
return r;
|
||||
err_regdev:
|
||||
nci_free_device(ndlc->ndev);
|
||||
|
||||
err_alloc_ndev:
|
||||
kfree(info);
|
||||
return r;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(st21nfcb_nci_probe);
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,6 @@
|
|||
#ifndef __LOCAL_ST21NFCB_H_
|
||||
#define __LOCAL_ST21NFCB_H_
|
||||
|
||||
#include <net/nfc/nci_core.h>
|
||||
|
||||
#include "ndlc.h"
|
||||
|
||||
/* Define private flags: */
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue