Thadeu Lima de Souza Cascardo wrote:
The RFKILL device shares the same ACPI device used for backlight. So, it
required a new struct sharing both a backlight_device and a rfkill
device.
Signed-off-by: Thadeu Lima de Souza Cascardo <[email protected]>
---
Apologies for tardiness. You did ask for review, so I've scanned it for some
common rfkill pitfalls.
drivers/platform/x86/classmate-laptop.c | 170 +++++++++++++++++++++++++++----
1 files changed, 148 insertions(+), 22 deletions(-)
diff --git a/drivers/platform/x86/classmate-laptop.c
b/drivers/platform/x86/classmate-laptop.c
index 7f9e5dd..3bf399f 100644
--- a/drivers/platform/x86/classmate-laptop.c
+++ b/drivers/platform/x86/classmate-laptop.c
+static const struct rfkill_ops cmpc_rfkill_ops = {
+ .query = cmpc_rfkill_query,
+ .set_block = cmpc_rfkill_block,
+};
You said down-thread that firmware does not change the state. In that case, I
believe the query method is unnecessary
* @query: query the rfkill block state(s) and call exactly one of the
* rfkill_set{,_hw,_sw}_state family of functions. Assign this
* method if input events can cause hardware state changes to make
* the rfkill core query your driver before setting a requested
* block.
Generally, the rfkill core caches the soft blocked state. It doesn't call query() during
registration either - it calls set_block() with a default value (usually
"unblocked"). query() is only used to minimize a race with the firmware during
set_block().
+ ipml->rf = rfkill_alloc("cmpc_rfkill", &acpi->dev, RFKILL_TYPE_WLAN,
+ &cmpc_rfkill_ops, acpi->handle);
+ /* rfkill_alloc may fail if RFKILL is disabled. We should still work
+ * anyway. */
+ if (!IS_ERR(ipml->rf)) {
+ retval = rfkill_register(ipml->rf);
+ if (retval) {
+ rfkill_destroy(ipml->rf);
+ ipml->rf = NULL;
+ }
+ } else {
+ ipml->rf = NULL;
+ }
I think the comment is wrong, and so is the code it references.
rfkill_alloc() is documented as returning NULL on failure, not an ERR_PTR. So
you're going to pass NULL into rfkill_register() on allocation failure, which
will BUG out.
eeepc_laptop tests for NULL here, not ERR_PTR.
If you look at the implementation when RFKILL is disabled, rfkill_register() is
designed to accept ERR_PTR(-ENODEV) without complaint. (And the other rfkill
functions won't care either; they'll just be completely empty stubs).
Regards
Alan
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86"
in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html