|  | /* | 
|  | * Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon company) or | 
|  | * an affiliate of Cypress Semiconductor Corporation | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <whd_buffer_api.h> | 
|  | #include <zephyr/drivers/gpio.h> | 
|  | #include <zephyr/net/wifi_mgmt.h> | 
|  |  | 
|  | #ifdef CONFIG_AIROC_WIFI_BUS_SDIO | 
|  | #include <zephyr/sd/sd.h> | 
|  | #include <zephyr/sd/sdio.h> | 
|  | #endif | 
|  | #ifdef CONFIG_AIROC_WIFI_BUS_SPI | 
|  | #include <zephyr/drivers/spi.h> | 
|  | #endif | 
|  |  | 
|  | #include <cy_utils.h> | 
|  |  | 
|  | #define DT_DRV_COMPAT infineon_airoc_wifi | 
|  |  | 
|  | #if DT_PROP(DT_DRV_INST(0), spi_data_irq_shared) | 
|  | #define SPI_DATA_IRQ_SHARED | 
|  | #include <zephyr/drivers/pinctrl.h> | 
|  |  | 
|  | #define PINCTRL_STATE_HOST_WAKE PINCTRL_STATE_PRIV_START | 
|  | #endif | 
|  |  | 
|  | #if defined(CONFIG_AIROC_WIFI_BUS_SPI) | 
|  | #define AIROC_WIFI_SPI_OPERATION (SPI_WORD_SET(DT_PROP_OR(DT_DRV_INST(0), spi_word_size, 8)) \ | 
|  | | (DT_PROP(DT_DRV_INST(0), spi_half_duplex) \ | 
|  | ? SPI_HALF_DUPLEX : SPI_FULL_DUPLEX) \ | 
|  | | SPI_TRANSFER_MSB) | 
|  | #endif | 
|  |  | 
|  | struct airoc_wifi_data { | 
|  | #if defined(CONFIG_AIROC_WIFI_BUS_SDIO) | 
|  | struct sd_card card; | 
|  | struct sdio_func sdio_func1; | 
|  | struct sdio_func sdio_func2; | 
|  | #endif | 
|  | #if defined(SPI_DATA_IRQ_SHARED) | 
|  | uint8_t prev_irq_state; | 
|  | #endif | 
|  | struct net_if *iface; | 
|  | bool second_interface_init; | 
|  | bool is_ap_up; | 
|  | bool is_sta_connected; | 
|  | uint8_t mac_addr[6]; | 
|  | scan_result_cb_t scan_rslt_cb; | 
|  | whd_ssid_t ssid; | 
|  | whd_scan_result_t scan_result; | 
|  | struct k_sem sema_common; | 
|  | struct k_sem sema_scan; | 
|  | #if defined(CONFIG_NET_STATISTICS_WIFI) | 
|  | struct net_stats_wifi stats; | 
|  | #endif | 
|  | whd_driver_t whd_drv; | 
|  | struct gpio_callback host_oob_pin_cb; | 
|  | uint8_t frame_buf[NET_ETH_MAX_FRAME_SIZE]; | 
|  | }; | 
|  |  | 
|  | union airoc_wifi_bus { | 
|  | #if defined(CONFIG_AIROC_WIFI_BUS_SDIO) | 
|  | const struct device *bus_sdio; | 
|  | #endif | 
|  | #if defined(CONFIG_AIROC_WIFI_BUS_SPI) | 
|  | const struct spi_dt_spec bus_spi; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | struct airoc_wifi_config { | 
|  | const union airoc_wifi_bus bus_dev; | 
|  | struct gpio_dt_spec wifi_reg_on_gpio; | 
|  | struct gpio_dt_spec wifi_host_wake_gpio; | 
|  | struct gpio_dt_spec wifi_dev_wake_gpio; | 
|  | #if defined(CONFIG_AIROC_WIFI_BUS_SPI) | 
|  | struct gpio_dt_spec bus_select_gpio; | 
|  | #if defined(SPI_DATA_IRQ_SHARED) | 
|  | const struct pinctrl_dev_config *pcfg; | 
|  | #endif | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * \brief This function returns pointer type to handle instance | 
|  | *        of whd interface (whd_interface_t) which allocated in | 
|  | *        Zephyr AIROC driver (drivers/wifi/infineon/airoc_wifi.c) | 
|  | */ | 
|  |  | 
|  | whd_interface_t airoc_wifi_get_whd_interface(void); |