Commit ac23d3ca authored by Yasuaki Ishimatsu's avatar Yasuaki Ishimatsu Committed by David S. Miller

fjes: Do not load fjes driver if system does not have extended socket device.

The fjes driver is used only by FUJITSU servers and almost of all
servers in the world never use it. But currently if ACPI PNP0C02
is defined in the ACPI table, the following message is always shown:

 "FUJITSU Extended Socket Network Device Driver - version 1.2
  - Copyright (c) 2015 FUJITSU LIMITED"

The message makes users confused because there is no reason that
the message is shown in other vendor servers.

To avoid the confusion, the patch adds a check that the server
has a extended socket device or not.
Signed-off-by: default avatarYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
CC: Taku Izumi <izumi.taku@jp.fujitsu.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent efad54a1
...@@ -45,6 +45,8 @@ MODULE_DESCRIPTION("FUJITSU Extended Socket Network Device Driver"); ...@@ -45,6 +45,8 @@ MODULE_DESCRIPTION("FUJITSU Extended Socket Network Device Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
#define ACPI_MOTHERBOARD_RESOURCE_HID "PNP0C02"
static int fjes_request_irq(struct fjes_adapter *); static int fjes_request_irq(struct fjes_adapter *);
static void fjes_free_irq(struct fjes_adapter *); static void fjes_free_irq(struct fjes_adapter *);
...@@ -78,7 +80,7 @@ static void fjes_rx_irq(struct fjes_adapter *, int); ...@@ -78,7 +80,7 @@ static void fjes_rx_irq(struct fjes_adapter *, int);
static int fjes_poll(struct napi_struct *, int); static int fjes_poll(struct napi_struct *, int);
static const struct acpi_device_id fjes_acpi_ids[] = { static const struct acpi_device_id fjes_acpi_ids[] = {
{"PNP0C02", 0}, {ACPI_MOTHERBOARD_RESOURCE_HID, 0},
{"", 0}, {"", 0},
}; };
MODULE_DEVICE_TABLE(acpi, fjes_acpi_ids); MODULE_DEVICE_TABLE(acpi, fjes_acpi_ids);
...@@ -115,18 +117,17 @@ static struct resource fjes_resource[] = { ...@@ -115,18 +117,17 @@ static struct resource fjes_resource[] = {
}, },
}; };
static int fjes_acpi_add(struct acpi_device *device) static bool is_extended_socket_device(struct acpi_device *device)
{ {
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL};
char str_buf[sizeof(FJES_ACPI_SYMBOL) + 1]; char str_buf[sizeof(FJES_ACPI_SYMBOL) + 1];
struct platform_device *plat_dev;
union acpi_object *str; union acpi_object *str;
acpi_status status; acpi_status status;
int result; int result;
status = acpi_evaluate_object(device->handle, "_STR", NULL, &buffer); status = acpi_evaluate_object(device->handle, "_STR", NULL, &buffer);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return false;
str = buffer.pointer; str = buffer.pointer;
result = utf16s_to_utf8s((wchar_t *)str->string.pointer, result = utf16s_to_utf8s((wchar_t *)str->string.pointer,
...@@ -136,10 +137,21 @@ static int fjes_acpi_add(struct acpi_device *device) ...@@ -136,10 +137,21 @@ static int fjes_acpi_add(struct acpi_device *device)
if (strncmp(FJES_ACPI_SYMBOL, str_buf, strlen(FJES_ACPI_SYMBOL)) != 0) { if (strncmp(FJES_ACPI_SYMBOL, str_buf, strlen(FJES_ACPI_SYMBOL)) != 0) {
kfree(buffer.pointer); kfree(buffer.pointer);
return -ENODEV; return false;
} }
kfree(buffer.pointer); kfree(buffer.pointer);
return true;
}
static int fjes_acpi_add(struct acpi_device *device)
{
struct platform_device *plat_dev;
acpi_status status;
if (!is_extended_socket_device(device))
return -ENODEV;
status = acpi_walk_resources(device->handle, METHOD_NAME__CRS, status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
fjes_get_acpi_resource, fjes_resource); fjes_get_acpi_resource, fjes_resource);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
...@@ -1473,11 +1485,41 @@ static void fjes_watch_unshare_task(struct work_struct *work) ...@@ -1473,11 +1485,41 @@ static void fjes_watch_unshare_task(struct work_struct *work)
} }
} }
static acpi_status
acpi_find_extended_socket_device(acpi_handle obj_handle, u32 level,
void *context, void **return_value)
{
struct acpi_device *device;
bool *found = context;
int result;
result = acpi_bus_get_device(obj_handle, &device);
if (result)
return AE_OK;
if (strcmp(acpi_device_hid(device), ACPI_MOTHERBOARD_RESOURCE_HID))
return AE_OK;
if (!is_extended_socket_device(device))
return AE_OK;
*found = true;
return AE_CTRL_TERMINATE;
}
/* fjes_init_module - Driver Registration Routine */ /* fjes_init_module - Driver Registration Routine */
static int __init fjes_init_module(void) static int __init fjes_init_module(void)
{ {
bool found = false;
int result; int result;
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
acpi_find_extended_socket_device, NULL, &found,
NULL);
if (!found)
return -ENODEV;
pr_info("%s - version %s - %s\n", pr_info("%s - version %s - %s\n",
fjes_driver_string, fjes_driver_version, fjes_copyright); fjes_driver_string, fjes_driver_version, fjes_copyright);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment