** Changed in: linux (Ubuntu)
       Status: Incomplete => Confirmed

-- 
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:
  Confirmed

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:

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

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