drivers/wifi: Adapt generic wifi driver into a chip driver

Re-organize the existing generic wifi driver into a generic wifi chip
driver. This allows generic wifi chip information to be added to the
devicetree.

BUG=None
TEST=./util/abuild/abuild

Change-Id: I63f957a008ecf4a6a810c2a135ed62ea81a79fe0
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43768
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Karthikeyan Ramasubramanian 2020-07-23 00:25:25 -06:00 committed by Patrick Georgi
parent ff7b9970f4
commit afeb7b3f68
7 changed files with 50 additions and 23 deletions

View File

@ -2,7 +2,7 @@ config DRIVERS_INTEL_WIFI
bool "Support Intel PCI-e WiFi adapters" bool "Support Intel PCI-e WiFi adapters"
depends on PCI depends on PCI
default y if PCIEXP_PLUGIN_SUPPORT default y if PCIEXP_PLUGIN_SUPPORT
select DRIVERS_GENERIC_WIFI if HAVE_ACPI_TABLES select DRIVERS_WIFI_GENERIC if HAVE_ACPI_TABLES
help help
When enabled, add identifiers in ACPI and SMBIOS tables to When enabled, add identifiers in ACPI and SMBIOS tables to
make OS drivers work with certain Intel PCI-e WiFi chipsets. make OS drivers work with certain Intel PCI-e WiFi chipsets.

View File

@ -8,7 +8,7 @@
#include <smbios.h> #include <smbios.h>
#include <string.h> #include <string.h>
#include "chip.h" #include "chip.h"
#include "drivers/wifi/generic_wifi.h" #include "drivers/wifi/generic/chip.h"
#define PMCS_DR 0xcc #define PMCS_DR 0xcc
#define PME_STS (1 << 15) #define PME_STS (1 << 15)
@ -50,14 +50,14 @@ static int smbios_write_wifi(struct device *dev, int *handle,
static void intel_wifi_fill_ssdt(const struct device *dev) static void intel_wifi_fill_ssdt(const struct device *dev)
{ {
struct drivers_intel_wifi_config *config = dev->chip_info; struct drivers_intel_wifi_config *config = dev->chip_info;
struct generic_wifi_config generic_config; struct drivers_wifi_generic_config generic_config;
if (config) { if (config) {
generic_config.wake = config->wake; generic_config.wake = config->wake;
/* By default, all intel wifi chips wake from S3 */ /* By default, all intel wifi chips wake from S3 */
generic_config.maxsleep = 3; generic_config.maxsleep = 3;
} }
generic_wifi_fill_ssdt(dev, config ? &generic_config : NULL); wifi_generic_fill_ssdt(dev, config ? &generic_config : NULL);
} }
#endif #endif
@ -83,7 +83,7 @@ struct device_operations device_ops = {
#endif #endif
.ops_pci = &pci_dev_ops_pci, .ops_pci = &pci_dev_ops_pci,
#if CONFIG(HAVE_ACPI_TABLES) #if CONFIG(HAVE_ACPI_TABLES)
.acpi_name = generic_wifi_acpi_name, .acpi_name = wifi_generic_acpi_name,
.acpi_fill_ssdt = intel_wifi_fill_ssdt, .acpi_fill_ssdt = intel_wifi_fill_ssdt,
#endif #endif
}; };

View File

@ -1 +0,0 @@
ramstage-$(CONFIG_DRIVERS_GENERIC_WIFI) += generic.c

View File

@ -1,4 +1,4 @@
config DRIVERS_GENERIC_WIFI config DRIVERS_WIFI_GENERIC
bool bool
default n default n
depends on HAVE_ACPI_TABLES depends on HAVE_ACPI_TABLES
@ -6,7 +6,7 @@ config DRIVERS_GENERIC_WIFI
When enabled, add identifiers in ACPI tables that are common When enabled, add identifiers in ACPI tables that are common
to WiFi chipsets from multiple vendors. to WiFi chipsets from multiple vendors.
if DRIVERS_GENERIC_WIFI if DRIVERS_WIFI_GENERIC
config USE_SAR config USE_SAR
bool bool
@ -54,4 +54,4 @@ config DSAR_SET_NUM
help help
There can be up to 3 optional SAR table sets. There can be up to 3 optional SAR table sets.
endif # DRIVERS_GENERIC_WIFI endif # DRIVERS_WIFI_GENERIC

View File

@ -0,0 +1 @@
ramstage-$(CONFIG_DRIVERS_WIFI_GENERIC) += generic.c

View File

@ -1,31 +1,31 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
#ifndef _GENERIC_WIFI_H_ #ifndef _WIFI_GENERIC_H_
#define _GENERIC_WIFI_H_ #define _WIFI_GENERIC_H_
/** /**
* struct generic_wifi_config - Data structure to contain common wifi config * struct drivers_wifi_generic_config - Data structure to contain generic wifi config
* @wake: Wake pin for ACPI _PRW * @wake: Wake pin for ACPI _PRW
* @maxsleep: Maximum sleep state to wake from * @maxsleep: Maximum sleep state to wake from
*/ */
struct generic_wifi_config { struct drivers_wifi_generic_config {
unsigned int wake; unsigned int wake;
unsigned int maxsleep; unsigned int maxsleep;
}; };
/** /**
* wifi_fill_ssdt() - Fill ACPI SSDT table for WiFi controller * wifi_generic_fill_ssdt() - Fill ACPI SSDT table for WiFi controller
* @dev: Device structure corresponding to WiFi controller. * @dev: Device structure corresponding to WiFi controller.
* @config: Common wifi config required to fill ACPI SSDT table. * @config: Generic wifi config required to fill ACPI SSDT table.
* *
* This function implements common device operation to help fill ACPI SSDT * This function implements common device operation to help fill ACPI SSDT
* table for WiFi controller. * table for WiFi controller.
*/ */
void generic_wifi_fill_ssdt(const struct device *dev, void wifi_generic_fill_ssdt(const struct device *dev,
const struct generic_wifi_config *config); const struct drivers_wifi_generic_config *config);
/** /**
* wifi_acpi_name() - Get ACPI name for WiFi controller * wifi_generic_acpi_name() - Get ACPI name for WiFi controller
* @dev: Device structure corresponding to WiFi controller. * @dev: Device structure corresponding to WiFi controller.
* *
* This function implements common device operation to get the ACPI name for * This function implements common device operation to get the ACPI name for
@ -33,6 +33,6 @@ void generic_wifi_fill_ssdt(const struct device *dev,
* *
* Return: string representing the ACPI name for WiFi controller. * Return: string representing the ACPI name for WiFi controller.
*/ */
const char *generic_wifi_acpi_name(const struct device *dev); const char *wifi_generic_acpi_name(const struct device *dev);
#endif /* _GENERIC_WIFI_H_ */ #endif /* _GENERIC_WIFI_H_ */

View File

@ -8,7 +8,7 @@
#include <sar.h> #include <sar.h>
#include <string.h> #include <string.h>
#include <wrdd.h> #include <wrdd.h>
#include "generic_wifi.h" #include "chip.h"
/* WRDS Spec Revision */ /* WRDS Spec Revision */
#define WRDS_REVISION 0x0 #define WRDS_REVISION 0x0
@ -159,8 +159,8 @@ static void emit_sar_acpi_structures(void)
acpigen_pop_len(); acpigen_pop_len();
} }
void generic_wifi_fill_ssdt(const struct device *dev, void wifi_generic_fill_ssdt(const struct device *dev,
const struct generic_wifi_config *config) const struct drivers_wifi_generic_config *config)
{ {
const char *path; const char *path;
u32 address; u32 address;
@ -222,7 +222,7 @@ void generic_wifi_fill_ssdt(const struct device *dev,
dev->chip_ops ? dev->chip_ops->name : "", dev_path(dev)); dev->chip_ops ? dev->chip_ops->name : "", dev_path(dev));
} }
const char *generic_wifi_acpi_name(const struct device *dev) const char *wifi_generic_acpi_name(const struct device *dev)
{ {
static char wifi_acpi_name[WIFI_ACPI_NAME_MAX_LEN]; static char wifi_acpi_name[WIFI_ACPI_NAME_MAX_LEN];
@ -231,3 +231,30 @@ const char *generic_wifi_acpi_name(const struct device *dev)
(dev_path_encode(dev) & 0xff)); (dev_path_encode(dev) & 0xff));
return wifi_acpi_name; return wifi_acpi_name;
} }
static void wifi_generic_fill_ssdt_generator(const struct device *dev)
{
wifi_generic_fill_ssdt(dev, dev->chip_info);
}
static struct device_operations wifi_generic_ops = {
.read_resources = noop_read_resources,
.set_resources = noop_set_resources,
.acpi_name = wifi_generic_acpi_name,
.acpi_fill_ssdt = wifi_generic_fill_ssdt_generator,
};
static void wifi_generic_enable(struct device *dev)
{
struct drivers_wifi_generic_config *config = dev ? dev->chip_info : NULL;
if (!config)
return;
dev->ops = &wifi_generic_ops;
}
struct chip_operations drivers_wifi_generic_ops = {
CHIP_NAME("WIFI Device")
.enable_dev = wifi_generic_enable
};