aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaciej S. Szmigiero <mail@maciej.szmigiero.name>2016-03-06 17:40:19 -0500
committerDarren Hart <dvhart@linux.intel.com>2016-03-23 13:05:51 -0400
commitfffcad87d4e7c5f6f6f6e5fc9d337bd6f197f80f (patch)
tree581c052062c9dfb49bb1f837875f401d5e4a73e6
parentc7805e5459f5cac2d99e901e276908c205c3fd3a (diff)
hp-wmi: Remove GPS rfkill support via pre-2009 interface
GPS rfkill support via pre-2009 WMI interface uses hp_wmi_get_sw_state() and hp_wmi_get_hw_state() to query its current hard and soft block state, respectively. In hp_wmi_get_sw_state() a mask is calculated which bit should be checked in an int value returned by firmware to get current block state: 0x200 << (r * 8) which with r being 3 for GPS results in overflow and mask of zero. The same goes for hp_wmi_get_hw_state(). This effectively means that GPS rfkill on this WMI interface is considered always both hard and soft blocked. Unfortunately, later when rfkill subsystem calls hp_wmi_set_block() to sync this block to hardware firmware at least on my old nc6400 gets confused and sets both hard and soft blocks on WiFi and BT. This happens for example on hp-wmi module load. Since due to overflow described above it is dubious that this ever worked correctly and HP laptops with modems having GPS support seem to all have been released well past year 2009 let's just remove GPS rfkill support via pre-2009 WMI interface. Signed-off-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name> Signed-off-by: Darren Hart <dvhart@linux.intel.com>
-rw-r--r--drivers/platform/x86/hp-wmi.c38
1 files changed, 1 insertions, 37 deletions
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
index 78cebc0e358c..6f145f2d004d 100644
--- a/drivers/platform/x86/hp-wmi.c
+++ b/drivers/platform/x86/hp-wmi.c
@@ -157,7 +157,6 @@ static struct platform_device *hp_wmi_platform_dev;
157static struct rfkill *wifi_rfkill; 157static struct rfkill *wifi_rfkill;
158static struct rfkill *bluetooth_rfkill; 158static struct rfkill *bluetooth_rfkill;
159static struct rfkill *wwan_rfkill; 159static struct rfkill *wwan_rfkill;
160static struct rfkill *gps_rfkill;
161 160
162struct rfkill2_device { 161struct rfkill2_device {
163 u8 id; 162 u8 id;
@@ -613,10 +612,6 @@ static void hp_wmi_notify(u32 value, void *context)
613 rfkill_set_states(wwan_rfkill, 612 rfkill_set_states(wwan_rfkill,
614 hp_wmi_get_sw_state(HPWMI_WWAN), 613 hp_wmi_get_sw_state(HPWMI_WWAN),
615 hp_wmi_get_hw_state(HPWMI_WWAN)); 614 hp_wmi_get_hw_state(HPWMI_WWAN));
616 if (gps_rfkill)
617 rfkill_set_states(gps_rfkill,
618 hp_wmi_get_sw_state(HPWMI_GPS),
619 hp_wmi_get_hw_state(HPWMI_GPS));
620 break; 615 break;
621 case HPWMI_CPU_BATTERY_THROTTLE: 616 case HPWMI_CPU_BATTERY_THROTTLE:
622 pr_info("Unimplemented CPU throttle because of 3 Cell battery event detected\n"); 617 pr_info("Unimplemented CPU throttle because of 3 Cell battery event detected\n");
@@ -775,30 +770,8 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device)
775 goto register_wwan_error; 770 goto register_wwan_error;
776 } 771 }
777 772
778 if (wireless & 0x8) {
779 gps_rfkill = rfkill_alloc("hp-gps", &device->dev,
780 RFKILL_TYPE_GPS,
781 &hp_wmi_rfkill_ops,
782 (void *) HPWMI_GPS);
783 if (!gps_rfkill) {
784 err = -ENOMEM;
785 goto register_gps_error;
786 }
787 rfkill_init_sw_state(gps_rfkill,
788 hp_wmi_get_sw_state(HPWMI_GPS));
789 rfkill_set_hw_state(gps_rfkill,
790 hp_wmi_get_hw_state(HPWMI_GPS));
791 err = rfkill_register(gps_rfkill);
792 if (err)
793 goto register_gps_error;
794 }
795
796 return 0; 773 return 0;
797register_gps_error: 774
798 rfkill_destroy(gps_rfkill);
799 gps_rfkill = NULL;
800 if (wwan_rfkill)
801 rfkill_unregister(wwan_rfkill);
802register_wwan_error: 775register_wwan_error:
803 rfkill_destroy(wwan_rfkill); 776 rfkill_destroy(wwan_rfkill);
804 wwan_rfkill = NULL; 777 wwan_rfkill = NULL;
@@ -907,7 +880,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
907 wifi_rfkill = NULL; 880 wifi_rfkill = NULL;
908 bluetooth_rfkill = NULL; 881 bluetooth_rfkill = NULL;
909 wwan_rfkill = NULL; 882 wwan_rfkill = NULL;
910 gps_rfkill = NULL;
911 rfkill2_count = 0; 883 rfkill2_count = 0;
912 884
913 if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device)) 885 if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device))
@@ -960,10 +932,6 @@ static int __exit hp_wmi_bios_remove(struct platform_device *device)
960 rfkill_unregister(wwan_rfkill); 932 rfkill_unregister(wwan_rfkill);
961 rfkill_destroy(wwan_rfkill); 933 rfkill_destroy(wwan_rfkill);
962 } 934 }
963 if (gps_rfkill) {
964 rfkill_unregister(gps_rfkill);
965 rfkill_destroy(gps_rfkill);
966 }
967 935
968 return 0; 936 return 0;
969} 937}
@@ -999,10 +967,6 @@ static int hp_wmi_resume_handler(struct device *device)
999 rfkill_set_states(wwan_rfkill, 967 rfkill_set_states(wwan_rfkill,
1000 hp_wmi_get_sw_state(HPWMI_WWAN), 968 hp_wmi_get_sw_state(HPWMI_WWAN),
1001 hp_wmi_get_hw_state(HPWMI_WWAN)); 969 hp_wmi_get_hw_state(HPWMI_WWAN));
1002 if (gps_rfkill)
1003 rfkill_set_states(gps_rfkill,
1004 hp_wmi_get_sw_state(HPWMI_GPS),
1005 hp_wmi_get_hw_state(HPWMI_GPS));
1006 970
1007 return 0; 971 return 0;
1008} 972}