2018-10-14 13:34:49 |
TJ |
bug |
|
|
added bug |
2018-10-14 13:41:30 |
TJ |
description |
I've been working with a user that has a Lenovo Legion Y530-15ICH where booting Ubuntu 18.10 (kernel 4.18.0-8) results in the radios being disabled by the platform driver "ideapad-laptop". Unloading or blacklisting the module solves the issue but disables other platform ACPI interfaces.
The system has the most recent firmware:
[ 0.000000] DMI: LENOVO 81FV/LNVNB161216, BIOS 8JCN44WW 08/13/2018
The wifi device is:
00:14.3 Network controller [0280]: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:a370] (rev 10)
Subsystem: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:0034]
Kernel driver in use: iwlwifi
We investigated the issue extensively and built the module with additional logic without solving the issue. It is well-known that some Lenovo models do not have a separate hardware radio kill switch (this model uses hot-keys Fn + F7) and need to use a DMI match to disable the rfkill logic.
We used dmidecode to get the correct Version string:
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 81FV
Version: Lenovo Legion Y530-15ICH
Serial Number: PF18CD10
UUID: A44F71C1-5E3D-11E8-9379-8C16458E3F9D
Wake-up Type: Power Switch
SKU Number: LENOVO_MT_81FV_BU_idea_FM_Legion Y530-15ICH
Family: Legion Y530-15ICH
and added it to no_hw_rfkill_list[]:
{
.ident = "Lenovo Legion Y530-15ICH",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
},
},
However, rfkill was still listing the platform devices "ideapad_wlan" and "ideapad_bluetooth":
/sys/class/rfkill/rfkill0/hard=1
/sys/class/rfkill/rfkill0/index=0
/sys/class/rfkill/rfkill0/name=ideapad_wlan
/sys/class/rfkill/rfkill0/persistent=1
/sys/class/rfkill/rfkill0/soft=0
/sys/class/rfkill/rfkill0/state=2
/sys/class/rfkill/rfkill0/type=wlan
/sys/class/rfkill/rfkill0/uevent=RFKILL_NAME=ideapad_wlan RFKILL_TYPE=wlan RFKILL_STATE=2
/sys/class/rfkill/rfkill1/hard=1
/sys/class/rfkill/rfkill1/index=1
/sys/class/rfkill/rfkill1/name=ideapad_bluetooth
/sys/class/rfkill/rfkill1/persistent=1
/sys/class/rfkill/rfkill1/soft=1
/sys/class/rfkill/rfkill1/state=2
/sys/class/rfkill/rfkill1/type=bluetooth
/sys/class/rfkill/rfkill1/uevent=RFKILL_NAME=ideapad_bluetooth RFKILL_TYPE=bluetooth RFKILL_STATE=2
/sys/class/rfkill/rfkill3/hard=0
/sys/class/rfkill/rfkill3/index=3
/sys/class/rfkill/rfkill3/name=phy0
/sys/class/rfkill/rfkill3/persistent=0
/sys/class/rfkill/rfkill3/soft=0
/sys/class/rfkill/rfkill3/state=1
/sys/class/rfkill/rfkill3/type=wlan
/sys/class/rfkill/rfkill3/uevent=RFKILL_NAME=phy0 RFKILL_TYPE=wlan RFKILL_STATE=1
/sys/class/rfkill/rfkill4/hard=0
/sys/class/rfkill/rfkill4/index=4
/sys/class/rfkill/rfkill4/name=hci0
/sys/class/rfkill/rfkill4/persistent=0
/sys/class/rfkill/rfkill4/soft=1
/sys/class/rfkill/rfkill4/state=0
/sys/class/rfkill/rfkill4/type=bluetooth
/sys/class/rfkill/rfkill4/uevent=RFKILL_NAME=hci0 RFKILL_TYPE=bluetooth RFKILL_STATE=0
We then added printk(KERN_NOTICE ... in the module's platform_driver.probe function ideapad_acpi_add() both at entry and later to report the DMI and status of the hardware switch control flag:
diff -u /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c ./ideapad-laptop.c
--- /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c 2018-10-14 01:46:49.506088219 +0100
+++ ./ideapad-laptop.c 2018-10-14 06:19:48.843813865 +0100
@@ -1147,6 +1147,13 @@
},
},
{
+ .ident = "Lenovo Legion Y530-15ICH",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
+ },
+ },
+ {
.ident = "Lenovo Legion Y720-15IKB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1239,6 +1246,7 @@
int cfg;
struct ideapad_private *priv;
struct acpi_device *adev;
+ const char *dmi_vendor, *dmi_version;
ret = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
if (ret)
@@ -1257,6 +1265,10 @@
priv->platform_device = pdev;
priv->has_hw_rfkill_switch = !dmi_check_system(no_hw_rfkill_list);
+ dmi_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ dmi_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
+ printk(KERN_NOTICE "DMI: %s, %s. has_hw_rfkill_switch=%d\n", dmi_vendor, dmi_version, priv->has_hw_rfkill_switch);
+
ret = ideapad_sysfs_init(priv);
if (ret)
return ret;
And this revealed that the function is not being called - the KERN_NOTICE messages do not appear in 'dmesg' output.
This suggests:
static const struct acpi_device_id ideapad_device_ids[] = {
{ "VPC2004", 0},
is not being matched via platform_driver.driver.acpi_match_table = ACPI_PTR(ideapad_device_ids),
We then decompiled the ACPI DSDT and confirmed that _HID is being set to VPC2004:
grep -C4 VPC2004 dsdt.dsl
Scope (\_SB.PCI0.LPCB.EC0)
{
Device (VPC0)
{
Name (_HID, "VPC2004") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_VPC, 0xFC0DF516)
Name (VPCD, Zero)
Method (_STA, 0, NotSerialized) // _STA: Status
At this point we're not sure what the next step should be. Wifi works correctly with the module blacklisted but it would be good to fix this properly. |
I've been working with a user that has a Lenovo Legion Y530-15ICH where booting Ubuntu 18.10 (kernel 4.18.0-8) results in the radios being disabled by the platform driver "ideapad-laptop". Unloading or blacklisting the module solves the issue but disables other platform ACPI interfaces.
The system has the most recent firmware:
[ 0.000000] DMI: LENOVO 81FV/LNVNB161216, BIOS 8JCN44WW 08/13/2018
The wifi device is:
00:14.3 Network controller [0280]: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:a370] (rev 10)
Subsystem: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:0034]
Kernel driver in use: iwlwifi
We investigated the issue extensively and built the module with additional logic without solving the issue. It is well-known that some Lenovo models do not have a separate hardware radio kill switch (this model uses hot-keys Fn + F7) and need to use a DMI match to disable the rfkill logic.
We used dmidecode to get the correct Version string:
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 81FV
Version: Lenovo Legion Y530-15ICH
Serial Number: PF18CD10
UUID: A44F71C1-5E3D-11E8-9379-8C16458E3F9D
Wake-up Type: Power Switch
SKU Number: LENOVO_MT_81FV_BU_idea_FM_Legion Y530-15ICH
Family: Legion Y530-15ICH
and added it to no_hw_rfkill_list[]:
{
.ident = "Lenovo Legion Y530-15ICH",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
},
},
However, rfkill was still listing the platform devices "ideapad_wlan" and "ideapad_bluetooth":
0: ideapad_wlan: Wireless LAN
Soft blocked: no
Hard blocked: yes
1: ideapad_bluetooth: Bluetooth
Soft blocked: yes
Hard blocked: yes
3: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
4: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
/sys/class/rfkill/rfkill0/hard=1
/sys/class/rfkill/rfkill0/index=0
/sys/class/rfkill/rfkill0/name=ideapad_wlan
/sys/class/rfkill/rfkill0/persistent=1
/sys/class/rfkill/rfkill0/soft=0
/sys/class/rfkill/rfkill0/state=2
/sys/class/rfkill/rfkill0/type=wlan
/sys/class/rfkill/rfkill0/uevent=RFKILL_NAME=ideapad_wlan RFKILL_TYPE=wlan RFKILL_STATE=2
/sys/class/rfkill/rfkill1/hard=1
/sys/class/rfkill/rfkill1/index=1
/sys/class/rfkill/rfkill1/name=ideapad_bluetooth
/sys/class/rfkill/rfkill1/persistent=1
/sys/class/rfkill/rfkill1/soft=1
/sys/class/rfkill/rfkill1/state=2
/sys/class/rfkill/rfkill1/type=bluetooth
/sys/class/rfkill/rfkill1/uevent=RFKILL_NAME=ideapad_bluetooth RFKILL_TYPE=bluetooth RFKILL_STATE=2
/sys/class/rfkill/rfkill3/hard=0
/sys/class/rfkill/rfkill3/index=3
/sys/class/rfkill/rfkill3/name=phy0
/sys/class/rfkill/rfkill3/persistent=0
/sys/class/rfkill/rfkill3/soft=0
/sys/class/rfkill/rfkill3/state=1
/sys/class/rfkill/rfkill3/type=wlan
/sys/class/rfkill/rfkill3/uevent=RFKILL_NAME=phy0 RFKILL_TYPE=wlan RFKILL_STATE=1
/sys/class/rfkill/rfkill4/hard=0
/sys/class/rfkill/rfkill4/index=4
/sys/class/rfkill/rfkill4/name=hci0
/sys/class/rfkill/rfkill4/persistent=0
/sys/class/rfkill/rfkill4/soft=1
/sys/class/rfkill/rfkill4/state=0
/sys/class/rfkill/rfkill4/type=bluetooth
/sys/class/rfkill/rfkill4/uevent=RFKILL_NAME=hci0 RFKILL_TYPE=bluetooth RFKILL_STATE=0
We then added printk(KERN_NOTICE ... in the module's platform_driver.probe function ideapad_acpi_add() both at entry and later to report the DMI and status of the hardware switch control flag:
diff -u /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c ./ideapad-laptop.c
--- /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c 2018-10-14 01:46:49.506088219 +0100
+++ ./ideapad-laptop.c 2018-10-14 06:19:48.843813865 +0100
@@ -1147,6 +1147,13 @@
},
},
{
+ .ident = "Lenovo Legion Y530-15ICH",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
+ },
+ },
+ {
.ident = "Lenovo Legion Y720-15IKB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1239,6 +1246,7 @@
int cfg;
struct ideapad_private *priv;
struct acpi_device *adev;
+ const char *dmi_vendor, *dmi_version;
ret = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
if (ret)
@@ -1257,6 +1265,10 @@
priv->platform_device = pdev;
priv->has_hw_rfkill_switch = !dmi_check_system(no_hw_rfkill_list);
+ dmi_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ dmi_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
+ printk(KERN_NOTICE "DMI: %s, %s. has_hw_rfkill_switch=%d\n", dmi_vendor, dmi_version, priv->has_hw_rfkill_switch);
+
ret = ideapad_sysfs_init(priv);
if (ret)
return ret;
And this revealed that the function is not being called - the KERN_NOTICE messages do not appear in 'dmesg' output.
This suggests:
static const struct acpi_device_id ideapad_device_ids[] = {
{ "VPC2004", 0},
is not being matched via platform_driver.driver.acpi_match_table = ACPI_PTR(ideapad_device_ids),
We then decompiled the ACPI DSDT and confirmed that _HID is being set to VPC2004:
grep -C4 VPC2004 dsdt.dsl
Scope (\_SB.PCI0.LPCB.EC0)
{
Device (VPC0)
{
Name (_HID, "VPC2004") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_VPC, 0xFC0DF516)
Name (VPCD, Zero)
Method (_STA, 0, NotSerialized) // _STA: Status
At this point we're not sure what the next step should be. Wifi works correctly with the module blacklisted but it would be good to fix this properly. |
|
2018-10-14 14:00:05 |
Ubuntu Kernel Bot |
linux (Ubuntu): status |
New |
Incomplete |
|
2018-10-14 14:29:20 |
TJ |
description |
I've been working with a user that has a Lenovo Legion Y530-15ICH where booting Ubuntu 18.10 (kernel 4.18.0-8) results in the radios being disabled by the platform driver "ideapad-laptop". Unloading or blacklisting the module solves the issue but disables other platform ACPI interfaces.
The system has the most recent firmware:
[ 0.000000] DMI: LENOVO 81FV/LNVNB161216, BIOS 8JCN44WW 08/13/2018
The wifi device is:
00:14.3 Network controller [0280]: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:a370] (rev 10)
Subsystem: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:0034]
Kernel driver in use: iwlwifi
We investigated the issue extensively and built the module with additional logic without solving the issue. It is well-known that some Lenovo models do not have a separate hardware radio kill switch (this model uses hot-keys Fn + F7) and need to use a DMI match to disable the rfkill logic.
We used dmidecode to get the correct Version string:
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 81FV
Version: Lenovo Legion Y530-15ICH
Serial Number: PF18CD10
UUID: A44F71C1-5E3D-11E8-9379-8C16458E3F9D
Wake-up Type: Power Switch
SKU Number: LENOVO_MT_81FV_BU_idea_FM_Legion Y530-15ICH
Family: Legion Y530-15ICH
and added it to no_hw_rfkill_list[]:
{
.ident = "Lenovo Legion Y530-15ICH",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
},
},
However, rfkill was still listing the platform devices "ideapad_wlan" and "ideapad_bluetooth":
0: ideapad_wlan: Wireless LAN
Soft blocked: no
Hard blocked: yes
1: ideapad_bluetooth: Bluetooth
Soft blocked: yes
Hard blocked: yes
3: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
4: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
/sys/class/rfkill/rfkill0/hard=1
/sys/class/rfkill/rfkill0/index=0
/sys/class/rfkill/rfkill0/name=ideapad_wlan
/sys/class/rfkill/rfkill0/persistent=1
/sys/class/rfkill/rfkill0/soft=0
/sys/class/rfkill/rfkill0/state=2
/sys/class/rfkill/rfkill0/type=wlan
/sys/class/rfkill/rfkill0/uevent=RFKILL_NAME=ideapad_wlan RFKILL_TYPE=wlan RFKILL_STATE=2
/sys/class/rfkill/rfkill1/hard=1
/sys/class/rfkill/rfkill1/index=1
/sys/class/rfkill/rfkill1/name=ideapad_bluetooth
/sys/class/rfkill/rfkill1/persistent=1
/sys/class/rfkill/rfkill1/soft=1
/sys/class/rfkill/rfkill1/state=2
/sys/class/rfkill/rfkill1/type=bluetooth
/sys/class/rfkill/rfkill1/uevent=RFKILL_NAME=ideapad_bluetooth RFKILL_TYPE=bluetooth RFKILL_STATE=2
/sys/class/rfkill/rfkill3/hard=0
/sys/class/rfkill/rfkill3/index=3
/sys/class/rfkill/rfkill3/name=phy0
/sys/class/rfkill/rfkill3/persistent=0
/sys/class/rfkill/rfkill3/soft=0
/sys/class/rfkill/rfkill3/state=1
/sys/class/rfkill/rfkill3/type=wlan
/sys/class/rfkill/rfkill3/uevent=RFKILL_NAME=phy0 RFKILL_TYPE=wlan RFKILL_STATE=1
/sys/class/rfkill/rfkill4/hard=0
/sys/class/rfkill/rfkill4/index=4
/sys/class/rfkill/rfkill4/name=hci0
/sys/class/rfkill/rfkill4/persistent=0
/sys/class/rfkill/rfkill4/soft=1
/sys/class/rfkill/rfkill4/state=0
/sys/class/rfkill/rfkill4/type=bluetooth
/sys/class/rfkill/rfkill4/uevent=RFKILL_NAME=hci0 RFKILL_TYPE=bluetooth RFKILL_STATE=0
We then added printk(KERN_NOTICE ... in the module's platform_driver.probe function ideapad_acpi_add() both at entry and later to report the DMI and status of the hardware switch control flag:
diff -u /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c ./ideapad-laptop.c
--- /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c 2018-10-14 01:46:49.506088219 +0100
+++ ./ideapad-laptop.c 2018-10-14 06:19:48.843813865 +0100
@@ -1147,6 +1147,13 @@
},
},
{
+ .ident = "Lenovo Legion Y530-15ICH",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
+ },
+ },
+ {
.ident = "Lenovo Legion Y720-15IKB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1239,6 +1246,7 @@
int cfg;
struct ideapad_private *priv;
struct acpi_device *adev;
+ const char *dmi_vendor, *dmi_version;
ret = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
if (ret)
@@ -1257,6 +1265,10 @@
priv->platform_device = pdev;
priv->has_hw_rfkill_switch = !dmi_check_system(no_hw_rfkill_list);
+ dmi_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ dmi_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
+ printk(KERN_NOTICE "DMI: %s, %s. has_hw_rfkill_switch=%d\n", dmi_vendor, dmi_version, priv->has_hw_rfkill_switch);
+
ret = ideapad_sysfs_init(priv);
if (ret)
return ret;
And this revealed that the function is not being called - the KERN_NOTICE messages do not appear in 'dmesg' output.
This suggests:
static const struct acpi_device_id ideapad_device_ids[] = {
{ "VPC2004", 0},
is not being matched via platform_driver.driver.acpi_match_table = ACPI_PTR(ideapad_device_ids),
We then decompiled the ACPI DSDT and confirmed that _HID is being set to VPC2004:
grep -C4 VPC2004 dsdt.dsl
Scope (\_SB.PCI0.LPCB.EC0)
{
Device (VPC0)
{
Name (_HID, "VPC2004") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_VPC, 0xFC0DF516)
Name (VPCD, Zero)
Method (_STA, 0, NotSerialized) // _STA: Status
At this point we're not sure what the next step should be. Wifi works correctly with the module blacklisted but it would be good to fix this properly. |
I've been working with a user that has a Lenovo Legion Y530-15ICH where booting Ubuntu 18.10 (kernel 4.18.0-8) results in the radios being disabled by the platform driver "ideapad-laptop".
Unloading or blacklisting the module solves the issue but disables other platform ACPI interfaces:
$ sudo tee /etc/modprobe.d/ideapad.conf <<< "blacklist ideapad_laptop"
The system has the most recent firmware:
[ 0.000000] DMI: LENOVO 81FV/LNVNB161216, BIOS 8JCN44WW 08/13/2018
The wifi device is:
00:14.3 Network controller [0280]: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:a370] (rev 10)
Subsystem: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:0034]
Kernel driver in use: iwlwifi
We investigated the issue extensively and built the module with additional logic without solving the issue. It is well-known that some Lenovo models do not have a separate hardware radio kill switch (this model uses hot-keys Fn + F7) and need to use a DMI match to disable the rfkill logic.
We used dmidecode to get the correct Version string:
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 81FV
Version: Lenovo Legion Y530-15ICH
Serial Number: PF18CD10
UUID: A44F71C1-5E3D-11E8-9379-8C16458E3F9D
Wake-up Type: Power Switch
SKU Number: LENOVO_MT_81FV_BU_idea_FM_Legion Y530-15ICH
Family: Legion Y530-15ICH
and added it to no_hw_rfkill_list[]:
{
.ident = "Lenovo Legion Y530-15ICH",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
},
},
However, rfkill was still listing the platform devices "ideapad_wlan" and "ideapad_bluetooth":
0: ideapad_wlan: Wireless LAN
Soft blocked: no
Hard blocked: yes
1: ideapad_bluetooth: Bluetooth
Soft blocked: yes
Hard blocked: yes
3: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
4: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
/sys/class/rfkill/rfkill0/hard=1
/sys/class/rfkill/rfkill0/index=0
/sys/class/rfkill/rfkill0/name=ideapad_wlan
/sys/class/rfkill/rfkill0/persistent=1
/sys/class/rfkill/rfkill0/soft=0
/sys/class/rfkill/rfkill0/state=2
/sys/class/rfkill/rfkill0/type=wlan
/sys/class/rfkill/rfkill0/uevent=RFKILL_NAME=ideapad_wlan RFKILL_TYPE=wlan RFKILL_STATE=2
/sys/class/rfkill/rfkill1/hard=1
/sys/class/rfkill/rfkill1/index=1
/sys/class/rfkill/rfkill1/name=ideapad_bluetooth
/sys/class/rfkill/rfkill1/persistent=1
/sys/class/rfkill/rfkill1/soft=1
/sys/class/rfkill/rfkill1/state=2
/sys/class/rfkill/rfkill1/type=bluetooth
/sys/class/rfkill/rfkill1/uevent=RFKILL_NAME=ideapad_bluetooth RFKILL_TYPE=bluetooth RFKILL_STATE=2
/sys/class/rfkill/rfkill3/hard=0
/sys/class/rfkill/rfkill3/index=3
/sys/class/rfkill/rfkill3/name=phy0
/sys/class/rfkill/rfkill3/persistent=0
/sys/class/rfkill/rfkill3/soft=0
/sys/class/rfkill/rfkill3/state=1
/sys/class/rfkill/rfkill3/type=wlan
/sys/class/rfkill/rfkill3/uevent=RFKILL_NAME=phy0 RFKILL_TYPE=wlan RFKILL_STATE=1
/sys/class/rfkill/rfkill4/hard=0
/sys/class/rfkill/rfkill4/index=4
/sys/class/rfkill/rfkill4/name=hci0
/sys/class/rfkill/rfkill4/persistent=0
/sys/class/rfkill/rfkill4/soft=1
/sys/class/rfkill/rfkill4/state=0
/sys/class/rfkill/rfkill4/type=bluetooth
/sys/class/rfkill/rfkill4/uevent=RFKILL_NAME=hci0 RFKILL_TYPE=bluetooth RFKILL_STATE=0
We then added printk(KERN_NOTICE ... in the module's platform_driver.probe function ideapad_acpi_add() both at entry and later to report the DMI and status of the hardware switch control flag:
diff -u /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c ./ideapad-laptop.c
--- /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c 2018-10-14 01:46:49.506088219 +0100
+++ ./ideapad-laptop.c 2018-10-14 06:19:48.843813865 +0100
@@ -1147,6 +1147,13 @@
},
},
{
+ .ident = "Lenovo Legion Y530-15ICH",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
+ },
+ },
+ {
.ident = "Lenovo Legion Y720-15IKB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1239,6 +1246,7 @@
int cfg;
struct ideapad_private *priv;
struct acpi_device *adev;
+ const char *dmi_vendor, *dmi_version;
ret = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
if (ret)
@@ -1257,6 +1265,10 @@
priv->platform_device = pdev;
priv->has_hw_rfkill_switch = !dmi_check_system(no_hw_rfkill_list);
+ dmi_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ dmi_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
+ printk(KERN_NOTICE "DMI: %s, %s. has_hw_rfkill_switch=%d\n", dmi_vendor, dmi_version, priv->has_hw_rfkill_switch);
+
ret = ideapad_sysfs_init(priv);
if (ret)
return ret;
And this revealed that the function is not being called - the KERN_NOTICE messages do not appear in 'dmesg' output.
This suggests:
static const struct acpi_device_id ideapad_device_ids[] = {
{ "VPC2004", 0},
is not being matched via platform_driver.driver.acpi_match_table = ACPI_PTR(ideapad_device_ids),
We then decompiled the ACPI DSDT and confirmed that _HID is being set to VPC2004:
grep -C4 VPC2004 dsdt.dsl
Scope (\_SB.PCI0.LPCB.EC0)
{
Device (VPC0)
{
Name (_HID, "VPC2004") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_VPC, 0xFC0DF516)
Name (VPCD, Zero)
Method (_STA, 0, NotSerialized) // _STA: Status
At this point we're not sure what the next step should be. Wifi works correctly with the module blacklisted but it would be good to fix this properly. |
|
2018-10-14 15:33:49 |
TJ |
description |
I've been working with a user that has a Lenovo Legion Y530-15ICH where booting Ubuntu 18.10 (kernel 4.18.0-8) results in the radios being disabled by the platform driver "ideapad-laptop".
Unloading or blacklisting the module solves the issue but disables other platform ACPI interfaces:
$ sudo tee /etc/modprobe.d/ideapad.conf <<< "blacklist ideapad_laptop"
The system has the most recent firmware:
[ 0.000000] DMI: LENOVO 81FV/LNVNB161216, BIOS 8JCN44WW 08/13/2018
The wifi device is:
00:14.3 Network controller [0280]: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:a370] (rev 10)
Subsystem: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:0034]
Kernel driver in use: iwlwifi
We investigated the issue extensively and built the module with additional logic without solving the issue. It is well-known that some Lenovo models do not have a separate hardware radio kill switch (this model uses hot-keys Fn + F7) and need to use a DMI match to disable the rfkill logic.
We used dmidecode to get the correct Version string:
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 81FV
Version: Lenovo Legion Y530-15ICH
Serial Number: PF18CD10
UUID: A44F71C1-5E3D-11E8-9379-8C16458E3F9D
Wake-up Type: Power Switch
SKU Number: LENOVO_MT_81FV_BU_idea_FM_Legion Y530-15ICH
Family: Legion Y530-15ICH
and added it to no_hw_rfkill_list[]:
{
.ident = "Lenovo Legion Y530-15ICH",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
},
},
However, rfkill was still listing the platform devices "ideapad_wlan" and "ideapad_bluetooth":
0: ideapad_wlan: Wireless LAN
Soft blocked: no
Hard blocked: yes
1: ideapad_bluetooth: Bluetooth
Soft blocked: yes
Hard blocked: yes
3: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
4: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
/sys/class/rfkill/rfkill0/hard=1
/sys/class/rfkill/rfkill0/index=0
/sys/class/rfkill/rfkill0/name=ideapad_wlan
/sys/class/rfkill/rfkill0/persistent=1
/sys/class/rfkill/rfkill0/soft=0
/sys/class/rfkill/rfkill0/state=2
/sys/class/rfkill/rfkill0/type=wlan
/sys/class/rfkill/rfkill0/uevent=RFKILL_NAME=ideapad_wlan RFKILL_TYPE=wlan RFKILL_STATE=2
/sys/class/rfkill/rfkill1/hard=1
/sys/class/rfkill/rfkill1/index=1
/sys/class/rfkill/rfkill1/name=ideapad_bluetooth
/sys/class/rfkill/rfkill1/persistent=1
/sys/class/rfkill/rfkill1/soft=1
/sys/class/rfkill/rfkill1/state=2
/sys/class/rfkill/rfkill1/type=bluetooth
/sys/class/rfkill/rfkill1/uevent=RFKILL_NAME=ideapad_bluetooth RFKILL_TYPE=bluetooth RFKILL_STATE=2
/sys/class/rfkill/rfkill3/hard=0
/sys/class/rfkill/rfkill3/index=3
/sys/class/rfkill/rfkill3/name=phy0
/sys/class/rfkill/rfkill3/persistent=0
/sys/class/rfkill/rfkill3/soft=0
/sys/class/rfkill/rfkill3/state=1
/sys/class/rfkill/rfkill3/type=wlan
/sys/class/rfkill/rfkill3/uevent=RFKILL_NAME=phy0 RFKILL_TYPE=wlan RFKILL_STATE=1
/sys/class/rfkill/rfkill4/hard=0
/sys/class/rfkill/rfkill4/index=4
/sys/class/rfkill/rfkill4/name=hci0
/sys/class/rfkill/rfkill4/persistent=0
/sys/class/rfkill/rfkill4/soft=1
/sys/class/rfkill/rfkill4/state=0
/sys/class/rfkill/rfkill4/type=bluetooth
/sys/class/rfkill/rfkill4/uevent=RFKILL_NAME=hci0 RFKILL_TYPE=bluetooth RFKILL_STATE=0
We then added printk(KERN_NOTICE ... in the module's platform_driver.probe function ideapad_acpi_add() both at entry and later to report the DMI and status of the hardware switch control flag:
diff -u /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c ./ideapad-laptop.c
--- /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c 2018-10-14 01:46:49.506088219 +0100
+++ ./ideapad-laptop.c 2018-10-14 06:19:48.843813865 +0100
@@ -1147,6 +1147,13 @@
},
},
{
+ .ident = "Lenovo Legion Y530-15ICH",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
+ },
+ },
+ {
.ident = "Lenovo Legion Y720-15IKB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1239,6 +1246,7 @@
int cfg;
struct ideapad_private *priv;
struct acpi_device *adev;
+ const char *dmi_vendor, *dmi_version;
ret = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
if (ret)
@@ -1257,6 +1265,10 @@
priv->platform_device = pdev;
priv->has_hw_rfkill_switch = !dmi_check_system(no_hw_rfkill_list);
+ dmi_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ dmi_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
+ printk(KERN_NOTICE "DMI: %s, %s. has_hw_rfkill_switch=%d\n", dmi_vendor, dmi_version, priv->has_hw_rfkill_switch);
+
ret = ideapad_sysfs_init(priv);
if (ret)
return ret;
And this revealed that the function is not being called - the KERN_NOTICE messages do not appear in 'dmesg' output.
This suggests:
static const struct acpi_device_id ideapad_device_ids[] = {
{ "VPC2004", 0},
is not being matched via platform_driver.driver.acpi_match_table = ACPI_PTR(ideapad_device_ids),
We then decompiled the ACPI DSDT and confirmed that _HID is being set to VPC2004:
grep -C4 VPC2004 dsdt.dsl
Scope (\_SB.PCI0.LPCB.EC0)
{
Device (VPC0)
{
Name (_HID, "VPC2004") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_VPC, 0xFC0DF516)
Name (VPCD, Zero)
Method (_STA, 0, NotSerialized) // _STA: Status
At this point we're not sure what the next step should be. Wifi works correctly with the module blacklisted but it would be good to fix this properly. |
I've been working with a user that has a Lenovo Legion Y530-15ICH where booting Ubuntu 18.10 (kernel 4.18.0-8) results in the radios being disabled by the platform driver "ideapad-laptop".
Unloading or blacklisting the module solves the issue but disables other platform ACPI interfaces:
$ sudo tee /etc/modprobe.d/ideapad.conf <<< "blacklist ideapad_laptop"
The system has the most recent firmware:
[ 0.000000] DMI: LENOVO 81FV/LNVNB161216, BIOS 8JCN44WW 08/13/2018
The wifi device is:
00:14.3 Network controller [0280]: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:a370] (rev 10)
Subsystem: Intel Corporation Wireless-AC 9560 [Jefferson Peak] [8086:0034]
Kernel driver in use: iwlwifi
We investigated the issue extensively and built the module with additional logic without solving the issue. It is well-known that some Lenovo models do not have a separate hardware radio kill switch (this model uses hot-keys Fn + F7 for 'Airplane mode') and need to use a DMI match to disable the rfkill logic.
We used dmidecode to get the correct Version string:
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 81FV
Version: Lenovo Legion Y530-15ICH
Serial Number: PF18CD10
UUID: A44F71C1-5E3D-11E8-9379-8C16458E3F9D
Wake-up Type: Power Switch
SKU Number: LENOVO_MT_81FV_BU_idea_FM_Legion Y530-15ICH
Family: Legion Y530-15ICH
and added it to no_hw_rfkill_list[]:
{
.ident = "Lenovo Legion Y530-15ICH",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
},
},
However, rfkill was still listing the platform devices "ideapad_wlan" and "ideapad_bluetooth":
0: ideapad_wlan: Wireless LAN
Soft blocked: no
Hard blocked: yes
1: ideapad_bluetooth: Bluetooth
Soft blocked: yes
Hard blocked: yes
3: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
4: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
/sys/class/rfkill/rfkill0/hard=1
/sys/class/rfkill/rfkill0/index=0
/sys/class/rfkill/rfkill0/name=ideapad_wlan
/sys/class/rfkill/rfkill0/persistent=1
/sys/class/rfkill/rfkill0/soft=0
/sys/class/rfkill/rfkill0/state=2
/sys/class/rfkill/rfkill0/type=wlan
/sys/class/rfkill/rfkill0/uevent=RFKILL_NAME=ideapad_wlan RFKILL_TYPE=wlan RFKILL_STATE=2
/sys/class/rfkill/rfkill1/hard=1
/sys/class/rfkill/rfkill1/index=1
/sys/class/rfkill/rfkill1/name=ideapad_bluetooth
/sys/class/rfkill/rfkill1/persistent=1
/sys/class/rfkill/rfkill1/soft=1
/sys/class/rfkill/rfkill1/state=2
/sys/class/rfkill/rfkill1/type=bluetooth
/sys/class/rfkill/rfkill1/uevent=RFKILL_NAME=ideapad_bluetooth RFKILL_TYPE=bluetooth RFKILL_STATE=2
/sys/class/rfkill/rfkill3/hard=0
/sys/class/rfkill/rfkill3/index=3
/sys/class/rfkill/rfkill3/name=phy0
/sys/class/rfkill/rfkill3/persistent=0
/sys/class/rfkill/rfkill3/soft=0
/sys/class/rfkill/rfkill3/state=1
/sys/class/rfkill/rfkill3/type=wlan
/sys/class/rfkill/rfkill3/uevent=RFKILL_NAME=phy0 RFKILL_TYPE=wlan RFKILL_STATE=1
/sys/class/rfkill/rfkill4/hard=0
/sys/class/rfkill/rfkill4/index=4
/sys/class/rfkill/rfkill4/name=hci0
/sys/class/rfkill/rfkill4/persistent=0
/sys/class/rfkill/rfkill4/soft=1
/sys/class/rfkill/rfkill4/state=0
/sys/class/rfkill/rfkill4/type=bluetooth
/sys/class/rfkill/rfkill4/uevent=RFKILL_NAME=hci0 RFKILL_TYPE=bluetooth RFKILL_STATE=0
We then added printk(KERN_NOTICE ... in the module's platform_driver.probe function ideapad_acpi_add() both at entry and later to report the DMI and status of the hardware switch control flag:
diff -u /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c ./ideapad-laptop.c
--- /home/all/SourceCode/linux/linux/drivers/platform/x86/ideapad-laptop.c 2018-10-14 01:46:49.506088219 +0100
+++ ./ideapad-laptop.c 2018-10-14 06:19:48.843813865 +0100
@@ -1147,6 +1147,13 @@
},
},
{
+ .ident = "Lenovo Legion Y530-15ICH",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH"),
+ },
+ },
+ {
.ident = "Lenovo Legion Y720-15IKB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1239,6 +1246,7 @@
int cfg;
struct ideapad_private *priv;
struct acpi_device *adev;
+ const char *dmi_vendor, *dmi_version;
ret = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
if (ret)
@@ -1257,6 +1265,10 @@
priv->platform_device = pdev;
priv->has_hw_rfkill_switch = !dmi_check_system(no_hw_rfkill_list);
+ dmi_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ dmi_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
+ printk(KERN_NOTICE "DMI: %s, %s. has_hw_rfkill_switch=%d\n", dmi_vendor, dmi_version, priv->has_hw_rfkill_switch);
+
ret = ideapad_sysfs_init(priv);
if (ret)
return ret;
And this revealed that the function is not being called - the KERN_NOTICE messages do not appear in 'dmesg' output.
This suggests:
static const struct acpi_device_id ideapad_device_ids[] = {
{ "VPC2004", 0},
is not being matched via platform_driver.driver.acpi_match_table = ACPI_PTR(ideapad_device_ids),
We then decompiled the ACPI DSDT and confirmed that _HID is being set to VPC2004:
grep -C4 VPC2004 dsdt.dsl
Scope (\_SB.PCI0.LPCB.EC0)
{
Device (VPC0)
{
Name (_HID, "VPC2004") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_VPC, 0xFC0DF516)
Name (VPCD, Zero)
Method (_STA, 0, NotSerialized) // _STA: Status
At this point we're not sure what the next step should be. Wifi works correctly with the module blacklisted but it would be good to fix this properly. |
|
2018-10-14 22:39:41 |
Nisankh Acharjya |
linux (Ubuntu): assignee |
|
Nisankh Acharjya (nisankhubuntu) |
|
2018-10-14 22:41:33 |
TJ |
linux (Ubuntu): assignee |
Nisankh Acharjya (nisankhubuntu) |
|
|
2018-10-15 13:17:53 |
TJ |
linux (Ubuntu): status |
Incomplete |
Confirmed |
|
2018-10-15 17:30:18 |
Joseph Salisbury |
linux (Ubuntu): importance |
Undecided |
Medium |
|
2018-10-15 17:30:56 |
Joseph Salisbury |
linux (Ubuntu): status |
Confirmed |
Incomplete |
|
2018-10-15 17:31:07 |
Joseph Salisbury |
tags |
|
cosmic kernel-da-key |
|
2018-10-20 17:57:10 |
TJ |
linux (Ubuntu): status |
Incomplete |
Confirmed |
|