1d9836fb4SBjoern A. Zeeb /*- 2*a4128aadSBjoern A. Zeeb * Copyright (c) 2022-2024 The FreeBSD Foundation 3d9836fb4SBjoern A. Zeeb * 4d9836fb4SBjoern A. Zeeb * This software was developed by Björn Zeeb under sponsorship from 5d9836fb4SBjoern A. Zeeb * the FreeBSD Foundation. 6d9836fb4SBjoern A. Zeeb * 7d9836fb4SBjoern A. Zeeb * Redistribution and use in source and binary forms, with or without 8d9836fb4SBjoern A. Zeeb * modification, are permitted provided that the following conditions 9d9836fb4SBjoern A. Zeeb * are met: 10d9836fb4SBjoern A. Zeeb * 1. Redistributions of source code must retain the above copyright 11d9836fb4SBjoern A. Zeeb * notice, this list of conditions and the following disclaimer. 12d9836fb4SBjoern A. Zeeb * 2. Redistributions in binary form must reproduce the above copyright 13d9836fb4SBjoern A. Zeeb * notice, this list of conditions and the following disclaimer in the 14d9836fb4SBjoern A. Zeeb * documentation and/or other materials provided with the distribution. 15d9836fb4SBjoern A. Zeeb * 16d9836fb4SBjoern A. Zeeb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17d9836fb4SBjoern A. Zeeb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18d9836fb4SBjoern A. Zeeb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19d9836fb4SBjoern A. Zeeb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20d9836fb4SBjoern A. Zeeb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21d9836fb4SBjoern A. Zeeb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22d9836fb4SBjoern A. Zeeb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23d9836fb4SBjoern A. Zeeb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24d9836fb4SBjoern A. Zeeb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25d9836fb4SBjoern A. Zeeb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26d9836fb4SBjoern A. Zeeb * SUCH DAMAGE. 27d9836fb4SBjoern A. Zeeb * 28d9836fb4SBjoern A. Zeeb * $FreeBSD$ 29d9836fb4SBjoern A. Zeeb */ 30d9836fb4SBjoern A. Zeeb 31d9836fb4SBjoern A. Zeeb #ifndef _IWL_MEI_IWL_MEI_H 32d9836fb4SBjoern A. Zeeb #define _IWL_MEI_IWL_MEI_H 33d9836fb4SBjoern A. Zeeb 34d9836fb4SBjoern A. Zeeb #include <linux/types.h> 35d9836fb4SBjoern A. Zeeb #include <linux/kernel.h> 36d9836fb4SBjoern A. Zeeb #include <linux/netdevice.h> 37d9836fb4SBjoern A. Zeeb #include <linux/skbuff.h> 38d9836fb4SBjoern A. Zeeb 39d9836fb4SBjoern A. Zeeb enum mei_nvm_caps { 40d9836fb4SBjoern A. Zeeb MEI_NVM_CAPS_11AX_SUPPORT = BIT(0), 41d9836fb4SBjoern A. Zeeb MEI_NVM_CAPS_LARI_SUPPORT = BIT(1), 42d9836fb4SBjoern A. Zeeb }; 43d9836fb4SBjoern A. Zeeb 44d9836fb4SBjoern A. Zeeb struct iwl_mei_nvm { 45d9836fb4SBjoern A. Zeeb uint8_t n_hw_addrs; 46d9836fb4SBjoern A. Zeeb enum mei_nvm_caps caps; 47d9836fb4SBjoern A. Zeeb uint32_t nvm_version; 48d9836fb4SBjoern A. Zeeb uint32_t radio_cfg; 49d9836fb4SBjoern A. Zeeb uint32_t channels[110 /* IWL_NVM_NUM_CHANNELS_UHB */]; 50d9836fb4SBjoern A. Zeeb }; 51d9836fb4SBjoern A. Zeeb 52d9836fb4SBjoern A. Zeeb struct iwl_mei_conn_info { 539af1bba4SBjoern A. Zeeb uint8_t lp_state; 549af1bba4SBjoern A. Zeeb uint8_t band; 559af1bba4SBjoern A. Zeeb uint8_t channel; 569af1bba4SBjoern A. Zeeb uint8_t ssid_len; 579af1bba4SBjoern A. Zeeb uint8_t bssid[ETH_ALEN]; 589af1bba4SBjoern A. Zeeb uint8_t ssid[IEEE80211_MAX_SSID_LEN]; 59d9836fb4SBjoern A. Zeeb }; 60d9836fb4SBjoern A. Zeeb 61d9836fb4SBjoern A. Zeeb struct iwl_mei_ops { 62d9836fb4SBjoern A. Zeeb void (*me_conn_status)(void *, const struct iwl_mei_conn_info *); 63d9836fb4SBjoern A. Zeeb void (*nic_stolen)(void *); 64d9836fb4SBjoern A. Zeeb void (*rfkill)(void *, bool); 65d9836fb4SBjoern A. Zeeb void (*roaming_forbidden)(void *, bool); 66d9836fb4SBjoern A. Zeeb void (*sap_connected)(void *); 67d9836fb4SBjoern A. Zeeb }; 68d9836fb4SBjoern A. Zeeb 69d9836fb4SBjoern A. Zeeb #if IS_ENABLED(CONFIG_IWLMEI) 70d9836fb4SBjoern A. Zeeb #error No MEI support in FreeBSD currently 71d9836fb4SBjoern A. Zeeb #else 72d9836fb4SBjoern A. Zeeb 73d9836fb4SBjoern A. Zeeb static __inline void 74d9836fb4SBjoern A. Zeeb iwl_mei_device_down(void) 75d9836fb4SBjoern A. Zeeb { 76d9836fb4SBjoern A. Zeeb } 77d9836fb4SBjoern A. Zeeb 78d9836fb4SBjoern A. Zeeb static __inline struct iwl_mei_nvm * 79d9836fb4SBjoern A. Zeeb iwl_mei_get_nvm(void) 80d9836fb4SBjoern A. Zeeb { 81d9836fb4SBjoern A. Zeeb return (NULL); 82d9836fb4SBjoern A. Zeeb } 83d9836fb4SBjoern A. Zeeb 84d9836fb4SBjoern A. Zeeb static __inline int 85d9836fb4SBjoern A. Zeeb iwl_mei_get_ownership(void) 86d9836fb4SBjoern A. Zeeb { 87d9836fb4SBjoern A. Zeeb return (0); 88d9836fb4SBjoern A. Zeeb } 89d9836fb4SBjoern A. Zeeb 90d9836fb4SBjoern A. Zeeb static __inline void 91d9836fb4SBjoern A. Zeeb iwl_mei_host_disassociated(void) 92d9836fb4SBjoern A. Zeeb { 93d9836fb4SBjoern A. Zeeb } 94d9836fb4SBjoern A. Zeeb 95d9836fb4SBjoern A. Zeeb static __inline bool 96d9836fb4SBjoern A. Zeeb iwl_mei_is_connected(void) 97d9836fb4SBjoern A. Zeeb { 98d9836fb4SBjoern A. Zeeb return (false); 99d9836fb4SBjoern A. Zeeb } 100d9836fb4SBjoern A. Zeeb 101d9836fb4SBjoern A. Zeeb static __inline void 102d9836fb4SBjoern A. Zeeb iwl_mei_set_country_code(uint16_t mcc __unused) 103d9836fb4SBjoern A. Zeeb { 104d9836fb4SBjoern A. Zeeb } 105d9836fb4SBjoern A. Zeeb 106d9836fb4SBjoern A. Zeeb static __inline void 107d9836fb4SBjoern A. Zeeb iwl_mei_set_netdev(struct net_device *netdevice __unused) 108d9836fb4SBjoern A. Zeeb { 109d9836fb4SBjoern A. Zeeb } 110d9836fb4SBjoern A. Zeeb 111d9836fb4SBjoern A. Zeeb static __inline void 112d9836fb4SBjoern A. Zeeb iwl_mei_set_nic_info(const uint8_t *addr __unused, const uint8_t *hw_addr __unused) 113d9836fb4SBjoern A. Zeeb { 114d9836fb4SBjoern A. Zeeb } 115d9836fb4SBjoern A. Zeeb 116d9836fb4SBjoern A. Zeeb static __inline void 117d9836fb4SBjoern A. Zeeb iwl_mei_set_rfkill_state(bool rf_killed __unused, bool sw_rfkill __unused) 118d9836fb4SBjoern A. Zeeb { 119d9836fb4SBjoern A. Zeeb } 120d9836fb4SBjoern A. Zeeb 121d9836fb4SBjoern A. Zeeb static __inline void 122d9836fb4SBjoern A. Zeeb iwl_mei_tx_copy_to_csme(struct sk_buff *skb __unused, unsigned int ivlen __unused) 123d9836fb4SBjoern A. Zeeb { 124d9836fb4SBjoern A. Zeeb } 125d9836fb4SBjoern A. Zeeb 126d9836fb4SBjoern A. Zeeb static __inline int 127d9836fb4SBjoern A. Zeeb iwl_mei_register(void *mvm __unused, const struct iwl_mei_ops *ops __unused) 128d9836fb4SBjoern A. Zeeb { 129d9836fb4SBjoern A. Zeeb return (0); 130d9836fb4SBjoern A. Zeeb } 131d9836fb4SBjoern A. Zeeb 132d9836fb4SBjoern A. Zeeb static __inline void 133d9836fb4SBjoern A. Zeeb iwl_mei_start_unregister(void) 134d9836fb4SBjoern A. Zeeb { 135d9836fb4SBjoern A. Zeeb } 136d9836fb4SBjoern A. Zeeb 137d9836fb4SBjoern A. Zeeb static __inline void 138d9836fb4SBjoern A. Zeeb iwl_mei_unregister_complete(void) 139d9836fb4SBjoern A. Zeeb { 140d9836fb4SBjoern A. Zeeb } 1419af1bba4SBjoern A. Zeeb 1429af1bba4SBjoern A. Zeeb static __inline void 1439af1bba4SBjoern A. Zeeb iwl_mei_device_state(bool up __unused) 1449af1bba4SBjoern A. Zeeb { 1459af1bba4SBjoern A. Zeeb } 1469af1bba4SBjoern A. Zeeb 1479af1bba4SBjoern A. Zeeb static __inline void 1489af1bba4SBjoern A. Zeeb iwl_mei_alive_notif(bool x __unused) 1499af1bba4SBjoern A. Zeeb { 1509af1bba4SBjoern A. Zeeb } 1519af1bba4SBjoern A. Zeeb 1529af1bba4SBjoern A. Zeeb static __inline bool 1539af1bba4SBjoern A. Zeeb iwl_mei_pldr_req(void) 1549af1bba4SBjoern A. Zeeb { 1559af1bba4SBjoern A. Zeeb return (false); 1569af1bba4SBjoern A. Zeeb } 157*a4128aadSBjoern A. Zeeb 158*a4128aadSBjoern A. Zeeb static __inline void 159*a4128aadSBjoern A. Zeeb iwl_mei_set_power_limit(__le16 *x __unused) 160*a4128aadSBjoern A. Zeeb { 161*a4128aadSBjoern A. Zeeb } 162d9836fb4SBjoern A. Zeeb #endif 163d9836fb4SBjoern A. Zeeb 164d9836fb4SBjoern A. Zeeb #endif /* _IWL_MEI_IWL_MEI_H */ 165