summaryrefslogtreecommitdiffstats
path: root/drivers/net/fjes/fjes_main.c
diff options
context:
space:
mode:
authorYasuaki Ishimatsu <yasu.isimatu@gmail.com>2017-03-21 16:46:35 +0100
committerDavid S. Miller <davem@davemloft.net>2017-03-22 20:38:17 +0100
commit2b396d302650f1ebb770ed758ddcf5a64328ffd5 (patch)
tree9ad04276164dcbdf7e0a7cd7e133c452de8a4497 /drivers/net/fjes/fjes_main.c
parentfjes: Do not load fjes driver if system does not have extended socket device. (diff)
downloadlinux-2b396d302650f1ebb770ed758ddcf5a64328ffd5.tar.xz
linux-2b396d302650f1ebb770ed758ddcf5a64328ffd5.zip
fjes: Do not load fjes driver if extended socket device is not power on.
The extended device socket cannot turn on/off while system is running. So when system boots up and the device is not power on, the fjes driver does not need be loaded. To check the status of the device, the patch adds ACPI _STA method check. Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> CC: Taku Izumi <izumi.taku@jp.fujitsu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/fjes/fjes_main.c')
-rw-r--r--drivers/net/fjes/fjes_main.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c
index 7b589649ab46..ae48c809bac9 100644
--- a/drivers/net/fjes/fjes_main.c
+++ b/drivers/net/fjes/fjes_main.c
@@ -144,6 +144,24 @@ static bool is_extended_socket_device(struct acpi_device *device)
return true;
}
+static int acpi_check_extended_socket_status(struct acpi_device *device)
+{
+ unsigned long long sta;
+ acpi_status status;
+
+ status = acpi_evaluate_integer(device->handle, "_STA", NULL, &sta);
+ if (ACPI_FAILURE(status))
+ return -ENODEV;
+
+ if (!((sta & ACPI_STA_DEVICE_PRESENT) &&
+ (sta & ACPI_STA_DEVICE_ENABLED) &&
+ (sta & ACPI_STA_DEVICE_UI) &&
+ (sta & ACPI_STA_DEVICE_FUNCTIONING)))
+ return -ENODEV;
+
+ return 0;
+}
+
static int fjes_acpi_add(struct acpi_device *device)
{
struct platform_device *plat_dev;
@@ -152,6 +170,9 @@ static int fjes_acpi_add(struct acpi_device *device)
if (!is_extended_socket_device(device))
return -ENODEV;
+ if (acpi_check_extended_socket_status(device))
+ return -ENODEV;
+
status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
fjes_get_acpi_resource, fjes_resource);
if (ACPI_FAILURE(status))
@@ -1503,6 +1524,9 @@ acpi_find_extended_socket_device(acpi_handle obj_handle, u32 level,
if (!is_extended_socket_device(device))
return AE_OK;
+ if (acpi_check_extended_socket_status(device))
+ return AE_OK;
+
*found = true;
return AE_CTRL_TERMINATE;
}