--- x/net/nfc/core.c +++ y/net/nfc/core.c @@ -1110,6 +1110,7 @@ EXPORT_SYMBOL(nfc_allocate_device); int nfc_register_device(struct nfc_dev *dev) { int rc; + struct rfkill *rfkill; pr_debug("dev_name=%s\n", dev_name(&dev->dev)); @@ -1125,15 +1126,14 @@ int nfc_register_device(struct nfc_dev * if (rc) pr_err("Could not register llcp device\n"); - device_lock(&dev->dev); - dev->rfkill = rfkill_alloc(dev_name(&dev->dev), &dev->dev, - RFKILL_TYPE_NFC, &nfc_rfkill_ops, dev); - if (dev->rfkill) { - if (rfkill_register(dev->rfkill) < 0) { - rfkill_destroy(dev->rfkill); - dev->rfkill = NULL; - } + rfkill = rfkill_alloc(dev_name(&dev->dev), &dev->dev, RFKILL_TYPE_NFC, + &nfc_rfkill_ops, dev); + if (rfkill && rfkill_register(rfkill) < 0) { + rfkill_destroy(rfkill); + rfkill = NULL; } + device_lock(&dev->dev); + dev->rfkill = rfkill; dev->shutting_down = false; device_unlock(&dev->dev); @@ -1154,6 +1154,7 @@ EXPORT_SYMBOL(nfc_register_device); void nfc_unregister_device(struct nfc_dev *dev) { int rc; + struct rfkill *rfkill = NULL; pr_debug("dev_name=%s\n", dev_name(&dev->dev)); @@ -1164,13 +1165,16 @@ void nfc_unregister_device(struct nfc_de device_lock(&dev->dev); if (dev->rfkill) { - rfkill_unregister(dev->rfkill); - rfkill_destroy(dev->rfkill); + rfkill = dev->rfkill; dev->rfkill = NULL; } dev->shutting_down = true; device_unlock(&dev->dev); + if (rfkill) { + rfkill_unregister(rfkill); + rfkill_destroy(rfkill); + } if (dev->ops->check_presence) { del_timer_sync(&dev->check_pres_timer); cancel_work_sync(&dev->check_pres_work); --- x/net/nfc/llcp_core.c +++ y/net/nfc/llcp_core.c @@ -1636,7 +1636,9 @@ int nfc_llcp_register_device(struct nfc_ timer_setup(&local->sdreq_timer, nfc_llcp_sdreq_timer, 0); INIT_WORK(&local->sdreq_timeout_work, nfc_llcp_sdreq_timeout_work); + spin_lock(&llcp_devices_lock); list_add(&local->list, &llcp_devices); + spin_unlock(&llcp_devices_lock); return 0; }