blob: 9fcd7ba8af5cd8bf5f9b4972fb148e46bbc4dc27 [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01002
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01003#include <device/device.h>
4#include <device/pci.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02005#include <device/pci_ops.h>
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01006#include <device/pci_ids.h>
Naresh G Solanki3c6377f2017-07-03 21:57:11 +05307#include <elog.h>
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01008#include <smbios.h>
9#include <string.h>
Duncan Laurie5c026442016-05-11 14:05:07 -070010#include "chip.h"
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060011#include "drivers/wifi/generic_wifi.h"
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010012
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053013#define PMCS_DR 0xcc
14#define PME_STS (1 << 15)
15
Julius Wernercd49cce2019-03-05 16:53:33 -080016#if CONFIG(GENERATE_SMBIOS_TABLES)
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010017static int smbios_write_wifi(struct device *dev, int *handle,
18 unsigned long *current)
19{
20 struct smbios_type_intel_wifi {
21 u8 type;
22 u8 length;
23 u16 handle;
24 u8 str;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +030025 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +020026 } __packed;
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010027
Duncan Laurie5c026442016-05-11 14:05:07 -070028 struct smbios_type_intel_wifi *t =
29 (struct smbios_type_intel_wifi *)*current;
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010030 int len = sizeof(struct smbios_type_intel_wifi);
31
32 memset(t, 0, sizeof(struct smbios_type_intel_wifi));
33 t->type = 0x85;
34 t->length = len - 2;
35 t->handle = *handle;
Duncan Laurie5c026442016-05-11 14:05:07 -070036 /*
37 * Intel wifi driver expects this string to be in the table 0x85
38 * with PCI IDs enumerated below.
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010039 */
40 t->str = smbios_add_string(t->eos, "KHOIHGIUCCHHII");
41
42 len = t->length + smbios_string_table_len(t->eos);
43 *current += len;
44 *handle += 1;
45 return len;
46}
Kyösti Mälkki828e73e2016-07-28 17:26:39 +030047#endif
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010048
Julius Wernercd49cce2019-03-05 16:53:33 -080049#if CONFIG(HAVE_ACPI_TABLES)
Furquan Shaikh7536a392020-04-24 21:59:21 -070050static void intel_wifi_fill_ssdt(const struct device *dev)
Duncan Laurie5c026442016-05-11 14:05:07 -070051{
52 struct drivers_intel_wifi_config *config = dev->chip_info;
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060053 struct generic_wifi_config generic_config;
Duncan Laurie5c026442016-05-11 14:05:07 -070054
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060055 if (config) {
56 generic_config.wake = config->wake;
57 /* By default, all intel wifi chips wake from S3 */
58 generic_config.maxsleep = 3;
Duncan Laurie5c026442016-05-11 14:05:07 -070059 }
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060060 generic_wifi_fill_ssdt(dev, config ? &generic_config : NULL);
Duncan Laurie5c026442016-05-11 14:05:07 -070061}
62#endif
63
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053064static void wifi_pci_dev_init(struct device *dev)
65{
66 pci_dev_init(dev);
67
Julius Wernercd49cce2019-03-05 16:53:33 -080068 if (CONFIG(ELOG)) {
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053069 uint32_t val;
70 val = pci_read_config16(dev, PMCS_DR);
71 if (val & PME_STS)
72 elog_add_event_wake(ELOG_WAKE_SOURCE_PME_WIFI, 0);
Elyes HAOUAS88607a42018-10-05 10:36:45 +020073 }
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053074}
75
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010076struct device_operations device_ops = {
Nico Huber68680dd2020-03-31 17:34:52 +020077 .read_resources = pci_dev_read_resources,
78 .set_resources = pci_dev_set_resources,
79 .enable_resources = pci_dev_enable_resources,
80 .init = wifi_pci_dev_init,
Julius Wernercd49cce2019-03-05 16:53:33 -080081#if CONFIG(GENERATE_SMBIOS_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +020082 .get_smbios_data = smbios_write_wifi,
Kyösti Mälkki828e73e2016-07-28 17:26:39 +030083#endif
Angel Pons1fc0edd2020-05-31 00:03:28 +020084 .ops_pci = &pci_dev_ops_pci,
Julius Wernercd49cce2019-03-05 16:53:33 -080085#if CONFIG(HAVE_ACPI_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +020086 .acpi_name = generic_wifi_acpi_name,
87 .acpi_fill_ssdt = intel_wifi_fill_ssdt,
Duncan Laurie5c026442016-05-11 14:05:07 -070088#endif
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010089};
90
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010091static const unsigned short pci_device_ids[] = {
Subrata Banikf9529832018-03-22 05:25:45 +053092 PCI_DEVICE_ID_1000_SERIES_WIFI,
93 PCI_DEVICE_ID_6005_SERIES_WIFI,
94 PCI_DEVICE_ID_6005_I_SERIES_WIFI,
95 PCI_DEVICE_ID_1030_SERIES_WIFI,
96 PCI_DEVICE_ID_6030_I_SERIES_WIFI,
97 PCI_DEVICE_ID_6030_SERIES_WIFI,
98 PCI_DEVICE_ID_6150_SERIES_WIFI,
99 PCI_DEVICE_ID_2030_SERIES_WIFI,
100 PCI_DEVICE_ID_2000_SERIES_WIFI,
101 PCI_DEVICE_ID_0135_SERIES_WIFI,
102 PCI_DEVICE_ID_0105_SERIES_WIFI,
103 PCI_DEVICE_ID_6035_SERIES_WIFI,
104 PCI_DEVICE_ID_5300_SERIES_WIFI,
105 PCI_DEVICE_ID_5100_SERIES_WIFI,
106 PCI_DEVICE_ID_6000_SERIES_WIFI,
107 PCI_DEVICE_ID_6000_I_SERIES_WIFI,
108 PCI_DEVICE_ID_5350_SERIES_WIFI,
109 PCI_DEVICE_ID_5150_SERIES_WIFI,
110 /* Wilkins Peak 2 */
111 PCI_DEVICE_ID_WP_7260_SERIES_1_WIFI,
112 PCI_DEVICE_ID_WP_7260_SERIES_2_WIFI,
113 /* Stone Peak 2 */
114 PCI_DEVICE_ID_SP_7265_SERIES_1_WIFI,
115 PCI_DEVICE_ID_SP_7265_SERIES_2_WIFI,
Subrata Banik4530af22018-09-28 22:43:10 +0530116 /* Stone Field Peak */
117 PCI_DEVICE_ID_SFP_8260_SERIES_1_WIFI,
118 PCI_DEVICE_ID_SFP_8260_SERIES_2_WIFI,
119 /* Windstorm Peak */
120 PCI_DEVICE_ID_WSP_8275_SERIES_1_WIFI,
Subrata Banikf9529832018-03-22 05:25:45 +0530121 /* Jefferson Peak */
122 PCI_DEVICE_ID_JP_9000_SERIES_1_WIFI,
123 PCI_DEVICE_ID_JP_9000_SERIES_2_WIFI,
124 PCI_DEVICE_ID_JP_9000_SERIES_3_WIFI,
Furquan Shaikh39130a42018-05-30 19:57:14 -0700125 /* Thunder Peak 2 */
126 PCI_DEVICE_ID_TP_9260_SERIES_WIFI,
Subrata Banikf9529832018-03-22 05:25:45 +0530127 /* Harrison Peak */
128 PCI_DEVICE_ID_HrP_9560_SERIES_1_WIFI,
129 PCI_DEVICE_ID_HrP_9560_SERIES_2_WIFI,
Subrata Banik71da5fe2019-02-19 12:11:26 +0530130 PCI_DEVICE_ID_HrP_9560_SERIES_3_WIFI,
Subrata Banik13f53602019-03-28 10:35:30 +0530131 PCI_DEVICE_ID_HrP_9560_SERIES_4_WIFI,
Subrata Banikb98c8962020-04-06 12:08:01 +0530132 PCI_DEVICE_ID_HrP_6SERIES_WIFI,
133 /* Cyclone Peak */
134 PCI_DEVICE_ID_CyP_6SERIES_WIFI,
135 /* Typhoon Peak */
136 PCI_DEVICE_ID_TyP_6SERIES_WIFI,
137 /* Garfiled Peak */
138 PCI_DEVICE_ID_GrP_6SERIES_1_WIFI,
139 PCI_DEVICE_ID_GrP_6SERIES_2_WIFI,
Duncan Laurie5c026442016-05-11 14:05:07 -0700140 0
141};
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +0100142
143static const struct pci_driver pch_intel_wifi __pci_driver = {
144 .ops = &device_ops,
145 .vendor = PCI_VENDOR_ID_INTEL,
146 .devices = pci_device_ids,
147};
Duncan Laurie5c026442016-05-11 14:05:07 -0700148
149static void intel_wifi_enable(struct device *dev)
150{
151 dev->ops = &device_ops;
152}
153
154struct chip_operations drivers_intel_wifi_ops = {
155 CHIP_NAME("Intel WiFi")
Elyes HAOUAS2aa3b162018-11-27 17:02:10 +0100156 .enable_dev = intel_wifi_enable
Duncan Laurie5c026442016-05-11 14:05:07 -0700157};