aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/wifi/generic/generic.c
blob: 62a543032fc4480b0ca7d22d2e065f480e2ba7ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* SPDX-License-Identifier: GPL-2.0-only */

#include <device/device.h>
#include <device/pci.h>
#include <device/pci_def.h>
#include <device/pci_ids.h>
#include <elog.h>
#include "chip.h"
#include "wifi_private.h"
#include "wifi.h"

static void wifi_pci_dev_init(struct device *dev)
{
	if (pci_dev_is_wake_source(PCI_BDF(dev)))
		elog_add_event_wake(ELOG_WAKE_SOURCE_PME_WIFI, 0);
}

struct device_operations wifi_pcie_ops = {
	.read_resources		= pci_dev_read_resources,
	.set_resources		= pci_dev_set_resources,
	.enable_resources	= pci_dev_enable_resources,
	.init			= wifi_pci_dev_init,
	.ops_pci		= &pci_dev_ops_pci,
#if CONFIG(HAVE_ACPI_TABLES)
	.acpi_name		= wifi_pcie_acpi_name,
	.acpi_fill_ssdt		= wifi_pcie_fill_ssdt,
#endif
#if CONFIG(GENERATE_SMBIOS_TABLES)
	.get_smbios_data	= smbios_write_wifi_pcie,
#endif
};

struct device_operations wifi_cnvi_ops = {
	.read_resources		= noop_read_resources,
	.set_resources		= noop_set_resources,
#if CONFIG(HAVE_ACPI_TABLES)
	.acpi_fill_ssdt		= wifi_cnvi_fill_ssdt,
#endif
#if CONFIG(GENERATE_SMBIOS_TABLES)
	.get_smbios_data	= smbios_write_wifi_cnvi,
#endif
};

static bool is_cnvi(const struct device *dev)
{
	return dev && dev->path.type != DEVICE_PATH_PCI;
}

bool wifi_generic_cnvi_ddr_rfim_enabled(const struct device *dev)
{
	const struct drivers_wifi_generic_config *config;

	if (!dev || !is_cnvi(dev) || !dev->chip_info)
		return false;

	config = dev->chip_info;
	return config->enable_cnvi_ddr_rfim;
}

static void wifi_generic_enable(struct device *dev)
{
#if !DEVTREE_EARLY
	if (is_cnvi(dev))
		dev->ops = &wifi_cnvi_ops;
	else
		dev->ops = &wifi_pcie_ops;
#endif
}

struct chip_operations drivers_wifi_generic_ops = {
	CHIP_NAME("WIFI Device")
	.enable_dev = wifi_generic_enable
};

static const unsigned short intel_pci_device_ids[] = {
	PCI_DID_1000_SERIES_WIFI,
	PCI_DID_6005_SERIES_WIFI,
	PCI_DID_6005_I_SERIES_WIFI,
	PCI_DID_1030_SERIES_WIFI,
	PCI_DID_6030_I_SERIES_WIFI,
	PCI_DID_6030_SERIES_WIFI,
	PCI_DID_6150_SERIES_WIFI,
	PCI_DID_2030_SERIES_WIFI,
	PCI_DID_2000_SERIES_WIFI,
	PCI_DID_0135_SERIES_WIFI,
	PCI_DID_0105_SERIES_WIFI,
	PCI_DID_6035_SERIES_WIFI,
	PCI_DID_5300_SERIES_WIFI,
	PCI_DID_5100_SERIES_WIFI,
	PCI_DID_6000_SERIES_WIFI,
	PCI_DID_6000_I_SERIES_WIFI,
	PCI_DID_5350_SERIES_WIFI,
	PCI_DID_5150_SERIES_WIFI,
	/* Wilkins Peak 2 */
	PCI_DID_WP_7260_SERIES_1_WIFI,
	PCI_DID_WP_7260_SERIES_2_WIFI,
	/* Stone Peak 2 */
	PCI_DID_SP_7265_SERIES_1_WIFI,
	PCI_DID_SP_7265_SERIES_2_WIFI,
	/* Stone Field Peak */
	PCI_DID_SFP_8260_SERIES_1_WIFI,
	PCI_DID_SFP_8260_SERIES_2_WIFI,
	/* Windstorm Peak */
	PCI_DID_WSP_8275_SERIES_1_WIFI,
	/* Thunder Peak 2 */
	PCI_DID_TP_9260_SERIES_WIFI,
	/* Cyclone Peak */
	PCI_DID_CyP_6SERIES_WIFI,
	/* Typhoon Peak */
	PCI_DID_TyP_6SERIES_WIFI,
	/* Garfield Peak */
	PCI_DID_GrP_6SERIES_1_WIFI,
	PCI_DID_GrP_6SERIES_2_WIFI,
	PCI_DID_GrP_6SERIES_3_WIFI,
	/* Typhoon Peak 2 */
	PCI_DID_TyP2_6SERIES_1_WIFI,
	PCI_DID_TyP2_6SERIES_2_WIFI,
	PCI_DID_TyP2_6SERIES_3_WIFI,
	PCI_DID_TyP2_6SERIES_4_WIFI,
	0
};

/*
 * The PCI driver is retained for backward compatibility with boards that never utilized the
 * chip driver to support Intel WiFi device. For these devices, the PCI driver helps perform the
 * same operations as above (except exposing the wake property) by utilizing the same
 * `wifi_generic_ops`.
 */
static const struct pci_driver intel_wifi_pci_driver __pci_driver = {
	.ops		= &wifi_pcie_ops,
	.vendor		= PCI_VID_INTEL,
	.devices	= intel_pci_device_ids,
};