Commit b6693611 authored by David S. Miller's avatar David S. Miller

Merge branch 'nfc-fixes'

Duoming Zhou says:

====================
Replace improper checks and fix bugs in nfc subsystem

The first patch is used to replace improper checks in netlink related
functions of nfc core, the second patch is used to fix bugs in
nfcmrvl driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 47f753c1 d270453a
...@@ -183,6 +183,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv) ...@@ -183,6 +183,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
{ {
struct nci_dev *ndev = priv->ndev; struct nci_dev *ndev = priv->ndev;
nci_unregister_device(ndev);
if (priv->ndev->nfc_dev->fw_download_in_progress) if (priv->ndev->nfc_dev->fw_download_in_progress)
nfcmrvl_fw_dnld_abort(priv); nfcmrvl_fw_dnld_abort(priv);
...@@ -191,7 +192,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv) ...@@ -191,7 +192,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
if (gpio_is_valid(priv->config.reset_n_io)) if (gpio_is_valid(priv->config.reset_n_io))
gpio_free(priv->config.reset_n_io); gpio_free(priv->config.reset_n_io);
nci_unregister_device(ndev);
nci_free_device(ndev); nci_free_device(ndev);
kfree(priv); kfree(priv);
} }
......
...@@ -38,7 +38,7 @@ int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name) ...@@ -38,7 +38,7 @@ int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -94,7 +94,7 @@ int nfc_dev_up(struct nfc_dev *dev) ...@@ -94,7 +94,7 @@ int nfc_dev_up(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -142,7 +142,7 @@ int nfc_dev_down(struct nfc_dev *dev) ...@@ -142,7 +142,7 @@ int nfc_dev_down(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -207,7 +207,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 im_protocols, u32 tm_protocols) ...@@ -207,7 +207,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 im_protocols, u32 tm_protocols)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -246,7 +246,7 @@ int nfc_stop_poll(struct nfc_dev *dev) ...@@ -246,7 +246,7 @@ int nfc_stop_poll(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -291,7 +291,7 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode) ...@@ -291,7 +291,7 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -335,7 +335,7 @@ int nfc_dep_link_down(struct nfc_dev *dev) ...@@ -335,7 +335,7 @@ int nfc_dep_link_down(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -401,7 +401,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol) ...@@ -401,7 +401,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -448,7 +448,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx, u8 mode) ...@@ -448,7 +448,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx, u8 mode)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -495,7 +495,7 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb, ...@@ -495,7 +495,7 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb,
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
kfree_skb(skb); kfree_skb(skb);
goto error; goto error;
...@@ -552,7 +552,7 @@ int nfc_enable_se(struct nfc_dev *dev, u32 se_idx) ...@@ -552,7 +552,7 @@ int nfc_enable_se(struct nfc_dev *dev, u32 se_idx)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -601,7 +601,7 @@ int nfc_disable_se(struct nfc_dev *dev, u32 se_idx) ...@@ -601,7 +601,7 @@ int nfc_disable_se(struct nfc_dev *dev, u32 se_idx)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -1134,6 +1134,7 @@ int nfc_register_device(struct nfc_dev *dev) ...@@ -1134,6 +1134,7 @@ int nfc_register_device(struct nfc_dev *dev)
dev->rfkill = NULL; dev->rfkill = NULL;
} }
} }
dev->shutting_down = false;
device_unlock(&dev->dev); device_unlock(&dev->dev);
rc = nfc_genl_device_added(dev); rc = nfc_genl_device_added(dev);
...@@ -1166,12 +1167,10 @@ void nfc_unregister_device(struct nfc_dev *dev) ...@@ -1166,12 +1167,10 @@ void nfc_unregister_device(struct nfc_dev *dev)
rfkill_unregister(dev->rfkill); rfkill_unregister(dev->rfkill);
rfkill_destroy(dev->rfkill); rfkill_destroy(dev->rfkill);
} }
dev->shutting_down = true;
device_unlock(&dev->dev); device_unlock(&dev->dev);
if (dev->ops->check_presence) { if (dev->ops->check_presence) {
device_lock(&dev->dev);
dev->shutting_down = true;
device_unlock(&dev->dev);
del_timer_sync(&dev->check_pres_timer); del_timer_sync(&dev->check_pres_timer);
cancel_work_sync(&dev->check_pres_work); cancel_work_sync(&dev->check_pres_work);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment