Public bug reported:

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.

** Affects: linux (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1797772

Title:
  ideapad_laptop disables WiFi/BT radios on Lenovo Y530

Status in linux package in Ubuntu:
  New

Bug 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.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1797772/+subscriptions

-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to