From: Gokul Sivakumar <gokulkumar.sivakumar@infineon.com>
To: <linux-wireless@vger.kernel.org>, <johannes@sipsolutions.net>
Cc: <arend.vanspriel@broadcom.com>,
<wlan-kernel-dev-list@infineon.com>,
<gokulkumar.sivakumar@infineon.com>
Subject: [PATCH wireless-next v3 13/25] wifi: inffmac: add interface.c/h
Date: Wed, 2 Sep 2026 16:50:44 +0000 [thread overview]
Message-ID: <20260902165057.456447-14-gokulkumar.sivakumar@infineon.com> (raw)
In-Reply-To: <20260902165057.456447-1-gokulkumar.sivakumar@infineon.com>
Implementions the functions for creating, mananging and deleting various
type of WLAN interfaces.
Signed-off-by: Gokul Sivakumar <gokulkumar.sivakumar@infineon.com>
---
.../net/wireless/infineon/inffmac/interface.c | 496 ++++++++++++++++++
.../net/wireless/infineon/inffmac/interface.h | 155 ++++++
2 files changed, 651 insertions(+)
create mode 100644 drivers/net/wireless/infineon/inffmac/interface.c
create mode 100644 drivers/net/wireless/infineon/inffmac/interface.h
diff --git a/drivers/net/wireless/infineon/inffmac/interface.c b/drivers/net/wireless/infineon/inffmac/interface.c
new file mode 100644
index 000000000000..25cb28d08ebc
--- /dev/null
+++ b/drivers/net/wireless/infineon/inffmac/interface.c
@@ -0,0 +1,496 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2010 Broadcom Corporation
+ *
+ * Copyright (c) 2025-2026, Infineon Technologies AG, or an affiliate of Infineon Technologies AG.
+ * All rights reserved.
+ */
+
+#include <linux/kernel.h>
+#include <linux/etherdevice.h>
+#include <linux/module.h>
+#include <linux/vmalloc.h>
+#include <linux/string.h>
+#include <net/cfg80211.h>
+#include <net/netlink.h>
+
+#include "main.h"
+#include "utils.h"
+#include "chan.h"
+#include "debug.h"
+#include "bus_proto.h"
+#include "fwsignal.h"
+#include "cfg80211.h"
+#include "interface.h"
+#include "feature.h"
+#include "dev_cmd.h"
+#include "dev_evt.h"
+#include "net.h"
+#include "chip.h"
+
+void
+inff_cp_cfg80211_link_down(struct inff_if *ifp)
+{
+ struct net_device *ndev = ifp->ndev;
+
+ if (!test_and_clear_bit(INFF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))
+ return;
+
+ cfg80211_disconnected(ndev, 0, NULL, 0, true, GFP_KERNEL);
+}
+
+void
+inff_link_down(struct inff_cfg80211_vif *vif, u16 reason,
+ bool locally_generated)
+{
+ struct inff_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
+ struct inff_pub *drvr = cfg->pub;
+ bool bus_up = drvr->bus_if->state == INFF_BUS_UP;
+ s32 err = 0;
+
+ if (test_and_clear_bit(INFF_VIF_STATUS_CONNECTED, &vif->sme_state)) {
+ if (bus_up) {
+ inff_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
+ err = inff_fwcmd_data_set(vif->ifp,
+ INFF_C_DISASSOC, NULL, 0);
+ if (err)
+ iphy_err(drvr, "WLC_DISASSOC failed (%d)\n", err);
+ }
+
+ if (vif->wdev.iftype == NL80211_IFTYPE_STATION)
+ cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
+ locally_generated, GFP_KERNEL);
+ }
+ clear_bit(INFF_VIF_STATUS_CONNECTING, &vif->sme_state);
+ clear_bit(INFF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
+ clear_bit(INFF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
+ clear_bit(INFF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
+}
+
+static bool
+inff_vif_event_equals(struct inff_cfg80211_vif_event *event,
+ u8 action)
+{
+ u8 evt_action;
+
+ spin_lock(&event->vif_event_lock);
+ evt_action = event->action;
+ spin_unlock(&event->vif_event_lock);
+ return evt_action == action;
+}
+
+void
+inff_arm_vif_event(struct inff_cfg80211_info *cfg,
+ struct inff_cfg80211_vif *vif)
+{
+ struct inff_cfg80211_vif_event *event = &cfg->vif_event;
+
+ spin_lock(&event->vif_event_lock);
+ event->vif = vif;
+ event->action = 0;
+ spin_unlock(&event->vif_event_lock);
+}
+
+void
+inff_disarm_vif_event(struct inff_cfg80211_info *cfg)
+{
+ struct inff_cfg80211_vif_event *event = &cfg->vif_event;
+
+ spin_lock(&event->vif_event_lock);
+ event->vif = NULL;
+ event->action = 0;
+ spin_unlock(&event->vif_event_lock);
+}
+
+bool
+inff_vif_event_armed(struct inff_cfg80211_info *cfg)
+{
+ struct inff_cfg80211_vif_event *event = &cfg->vif_event;
+ bool armed;
+
+ spin_lock(&event->vif_event_lock);
+ armed = (event->vif) ? true : false;
+ spin_unlock(&event->vif_event_lock);
+
+ return armed;
+}
+
+int
+inff_wait_vif_event(struct inff_cfg80211_info *cfg,
+ u8 action, ulong timeout)
+{
+ struct inff_cfg80211_vif_event *event = &cfg->vif_event;
+
+ return wait_event_timeout(event->vif_wq,
+ inff_vif_event_equals(event, action),
+ timeout);
+}
+
+int
+inff_vif_change_validate(struct inff_cfg80211_info *cfg,
+ struct inff_cfg80211_vif *vif,
+ enum nl80211_iftype new_type)
+{
+ struct inff_cfg80211_vif *pos;
+ bool check_combos = false;
+ int ret = 0;
+ struct iface_combination_params params = {
+ .num_different_channels = 1,
+ };
+
+ list_for_each_entry(pos, &cfg->vif_list, list)
+ if (pos == vif) {
+ params.iftype_num[new_type]++;
+ } else {
+ /* concurrent interfaces so need check combinations */
+ check_combos = true;
+ params.iftype_num[pos->wdev.iftype]++;
+ }
+
+ if (check_combos)
+ ret = cfg80211_check_combinations(cfg->wiphy, ¶ms);
+
+ return ret;
+}
+
+bool
+inff_check_vif_up(struct inff_cfg80211_vif *vif)
+{
+ if (!test_bit(INFF_VIF_STATUS_READY, &vif->sme_state)) {
+ inff_dbg(INFO, "device is not ready : status (%lu)\n",
+ vif->sme_state);
+ return false;
+ }
+ return true;
+}
+
+static void
+inff_set_vif_macaddr(struct inff_if *ifp, u8 *mac_addr)
+{
+ u8 mac_idx = ifp->drvr->sta_mac_idx;
+
+ /* set difference MAC address with locally administered bit */
+ memcpy(mac_addr, ifp->mac_addr, ETH_ALEN);
+ mac_addr[0] |= 0x02;
+ mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0;
+ mac_idx++;
+ mac_idx = mac_idx % 2;
+ ifp->drvr->sta_mac_idx = mac_idx;
+}
+
+static int
+inff_vif_req_create(struct inff_if *ifp, enum nl80211_iftype type,
+ u8 *vif_macaddr)
+{
+ struct inff_pub *drvr = ifp->drvr;
+ struct inff_interface_create_v3 iface_v3;
+ u8 macaddr[ETH_ALEN];
+ u32 iface_create_ver = 0;
+ u8 iftype;
+ int err;
+
+ switch (type) {
+ case NL80211_IFTYPE_STATION:
+ iftype = INFF_INTERFACE_CREATE_STA;
+ if (!is_zero_ether_addr(vif_macaddr))
+ memcpy(macaddr, vif_macaddr, ETH_ALEN);
+ else
+ inff_set_vif_macaddr(ifp, macaddr);
+ break;
+ case NL80211_IFTYPE_AP:
+ iftype = INFF_INTERFACE_CREATE_AP;
+ inff_set_vif_macaddr(ifp, macaddr);
+ break;
+ default:
+ err = -EOPNOTSUPP;
+ goto fail;
+ }
+
+ switch (drvr->bus_if->chip) {
+ case INF_CC_ACW74XX_CHIP_ID:
+ fallthrough;
+ case INF_CC_CYW5591X_CHIP_ID:
+ /* interface_create version 3+ */
+ /* get supported version from firmware side */
+ err = inff_fwcmd_bsscfg_int_get(ifp, "interface_create",
+ &iface_create_ver);
+ if (err) {
+ iphy_err(drvr,
+ "failed to get interface create ver, err=%d\n",
+ err);
+ err = -EOPNOTSUPP;
+ break;
+ }
+
+ switch (iface_create_ver) {
+ case INFF_INTERFACE_CREATE_VER_3:
+ memset(&iface_v3, 0, sizeof(iface_v3));
+ iface_v3.ver = INFF_INTERFACE_CREATE_VER_3;
+ iface_v3.flags = INFF_INTERFACE_MAC_USE;
+ iface_v3.iftype = iftype;
+ memcpy(iface_v3.mac_addr, macaddr, ETH_ALEN);
+
+ err = inff_fwcmd_iovar_data_get(ifp, "interface_create",
+ &iface_v3, sizeof(iface_v3));
+ break;
+ default:
+ inff_err("unsupported interface create ver (v%d)\n",
+ iface_create_ver);
+ err = -EOPNOTSUPP;
+ break;
+ }
+ break;
+ default:
+ err = -EOPNOTSUPP;
+ break;
+ }
+fail:
+ if (err) {
+ iphy_err(drvr,
+ "failed to request interface creation, err=%d\n",
+ err);
+ return -EIO;
+ }
+
+ inff_dbg(INFO, "requested interface creation\n");
+
+ return 0;
+}
+
+/**
+ * inff_apsta_add_vif() - create a new AP or STA virtual interface
+ *
+ * @wiphy: wiphy device of new interface.
+ * @name: name of the new interface.
+ * @params: contains mac address for AP or STA device.
+ * @type: interface type.
+ *
+ * Return: pointer to new vif on success, ERR_PTR(-errno) if not
+ */
+struct wireless_dev *
+inff_apsta_add_vif(struct wiphy *wiphy, const char *name,
+ struct vif_params *params,
+ enum nl80211_iftype type)
+{
+ struct inff_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+ struct inff_if *ifp = netdev_priv(cfg_to_ndev(cfg));
+ struct inff_pub *drvr = cfg->pub;
+ struct inff_cfg80211_vif *vif;
+ int err;
+
+ if (type != NL80211_IFTYPE_STATION && type != NL80211_IFTYPE_AP)
+ return ERR_PTR(-EINVAL);
+
+ if (inff_vif_event_armed(cfg))
+ return ERR_PTR(-EBUSY);
+
+ inff_dbg(INFO, "Adding vif \"%s\"\n", name);
+
+ vif = inff_alloc_vif(cfg, type);
+ if (IS_ERR(vif))
+ return (struct wireless_dev *)vif;
+
+ inff_arm_vif_event(cfg, vif);
+
+ err = inff_vif_req_create(ifp, type, params->macaddr);
+ if (err)
+ goto fail;
+
+ /* wait for firmware event */
+ err = inff_wait_vif_event(cfg, INFF_E_IF_ADD,
+ INFF_VIF_EVENT_TIMEOUT);
+ if (!err) {
+ iphy_err(drvr, "vif event timeout occurred\n");
+ err = -EIO;
+ goto fail;
+ }
+
+ /* interface created in firmware */
+ ifp = vif->ifp;
+ if (!ifp) {
+ iphy_err(drvr, "no if pointer provided\n");
+ err = -ENOENT;
+ goto fail;
+ }
+
+ strscpy(ifp->ndev->name, name, sizeof(ifp->ndev->name));
+ err = inff_net_attach(ifp, true);
+ if (err) {
+ iphy_err(drvr, "Registering netdevice failed\n");
+ free_netdev(ifp->ndev);
+ goto fail;
+ }
+ inff_disarm_vif_event(cfg);
+
+ return &ifp->vif->wdev;
+
+fail:
+ inff_disarm_vif_event(cfg);
+ inff_free_vif(vif);
+ return ERR_PTR(err);
+}
+
+/**
+ * inff_setup_ifmodes() - determine interface modes and combinations.
+ *
+ * @wiphy: wiphy object.
+ * @ifp: interface object needed for feat module api.
+ *
+ * The interface modes and combinations are determined dynamically here
+ * based on firmware functionality.
+ *
+ * no mbss:
+ *
+ * #STA <= 1, #AP <= 1, channels = 1, 2 total
+ *
+ * mbss:
+ *
+ * #STA <= 1, #AP <= 1, channels = 1, 2 total
+ * #AP <= 4, matching BI, channels = 1, 4 total
+ *
+ * rsdb:
+ * #STA <= 1, #AP <= 2, channels = 2, 4 total
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+int
+inff_setup_ifmodes(struct wiphy *wiphy, struct inff_if *ifp)
+{
+ struct ieee80211_iface_combination *combo = NULL;
+ struct ieee80211_iface_limit *c0_limits = NULL;
+ struct ieee80211_iface_limit *mbss_limits = NULL;
+ bool mbss, rsdb;
+ int i, c, n_combos, n_limits;
+
+ if (inff_socitype_is_cp(ifp->drvr->bus_if)) {
+ n_combos = 1;
+ combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
+ if (!combo)
+ goto err;
+
+ wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+ BIT(NL80211_IFTYPE_AP);
+
+ c = 0;
+ i = 0;
+ n_limits = 2;
+ c0_limits = kcalloc(n_limits, sizeof(*c0_limits), GFP_KERNEL);
+ if (!c0_limits)
+ goto err;
+
+ combo[c].num_different_channels = 1;
+ c0_limits[i].max = 1;
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
+
+ c0_limits[i].max = 1;
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+
+ combo[c].max_interfaces = i;
+
+ combo[c].n_limits = i;
+ combo[c].limits = c0_limits;
+
+ } else {
+ mbss = inff_feat_is_enabled(ifp, INFF_FEAT_MBSS);
+ rsdb = inff_feat_is_enabled(ifp, INFF_FEAT_RSDB);
+
+ n_combos = 1 + !!mbss;
+ combo = kzalloc_objs(*combo, n_combos);
+ if (!combo)
+ goto err;
+
+ wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+ BIT(NL80211_IFTYPE_AP);
+
+ c = 0;
+ i = 0;
+ n_limits = 2;
+
+ c0_limits = kzalloc_objs(*c0_limits, n_limits);
+ if (!c0_limits)
+ goto err;
+
+ combo[c].num_different_channels = 1 + rsdb;
+ c0_limits[i].max = 1;
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
+
+ if (rsdb) {
+ c0_limits[i].max = 2;
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+ combo[c].max_interfaces = 3;
+ } else {
+ c0_limits[i].max = 1;
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+ combo[c].max_interfaces = i;
+ }
+ combo[c].n_limits = i;
+ combo[c].limits = c0_limits;
+
+ if (mbss) {
+ c++;
+ i = 0;
+ n_limits = 1;
+ mbss_limits = kzalloc_objs(*mbss_limits, n_limits);
+ if (!mbss_limits)
+ goto err;
+ mbss_limits[i].max = 4;
+ mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+ combo[c].beacon_int_infra_match = true;
+ combo[c].num_different_channels = 1;
+ combo[c].max_interfaces = 4;
+ combo[c].n_limits = i;
+ combo[c].limits = mbss_limits;
+ }
+ }
+ wiphy->n_iface_combinations = n_combos;
+ wiphy->iface_combinations = combo;
+ return 0;
+
+err:
+ kfree(c0_limits);
+ kfree(mbss_limits);
+ kfree(combo);
+ return -ENOMEM;
+}
+
+struct inff_cfg80211_vif *
+inff_alloc_vif(struct inff_cfg80211_info *cfg,
+ enum nl80211_iftype type)
+{
+ struct inff_cfg80211_vif *vif_walk;
+ struct inff_cfg80211_vif *vif;
+ bool mbss;
+ struct inff_if *ifp = inff_get_ifp(cfg->pub, 0);
+
+ inff_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
+ sizeof(*vif));
+ vif = kzalloc_obj(*vif);
+ if (!vif)
+ return ERR_PTR(-ENOMEM);
+
+ vif->wdev.wiphy = cfg->wiphy;
+ vif->wdev.iftype = type;
+
+ if (type == NL80211_IFTYPE_AP &&
+ inff_feat_is_enabled(ifp, INFF_FEAT_MBSS)) {
+ mbss = false;
+ list_for_each_entry(vif_walk, &cfg->vif_list, list) {
+ if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
+ mbss = true;
+ break;
+ }
+ }
+ vif->mbss = mbss;
+ }
+
+ init_completion(&vif->mgmt_tx);
+ list_add_tail(&vif->list, &cfg->vif_list);
+ return vif;
+}
+
+void
+inff_free_vif(struct inff_cfg80211_vif *vif)
+{
+ list_del(&vif->list);
+ kfree(vif);
+}
diff --git a/drivers/net/wireless/infineon/inffmac/interface.h b/drivers/net/wireless/infineon/inffmac/interface.h
new file mode 100644
index 000000000000..ab0ad5f1802d
--- /dev/null
+++ b/drivers/net/wireless/infineon/inffmac/interface.h
@@ -0,0 +1,155 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Copyright (c) 2010 Broadcom Corporation
+ *
+ * Copyright (c) 2025-2026, Infineon Technologies AG, or an affiliate of Infineon Technologies AG.
+ * All rights reserved.
+ */
+
+#ifndef INFF_INTERFACE_H
+#define INFF_INTERFACE_H
+
+#define INFF_VIF_EVENT_TIMEOUT msecs_to_jiffies(1500)
+
+#define INFF_INTERFACE_CREATE_VER_2 2
+#define INFF_INTERFACE_CREATE_VER_3 3
+
+#define INFF_INTERFACE_MAC_DONT_USE 0x0
+#define INFF_INTERFACE_MAC_USE 0x2
+
+#define INFF_INTERFACE_CREATE_STA 0x0
+#define INFF_INTERFACE_CREATE_AP 0x1
+
+#define INFF_INTERFACE_PRI_BSSCFGIDX (0)
+#define INFF_INTERFACE_PRI_IFIDX (0)
+
+#define INFF_INTERFACE_SEC_BSSCFGIDX (1)
+#define INFF_INTERFACE_SEC_IFIDX (1)
+
+struct inff_interface_create_v2 {
+ u16 ver; /* structure version */
+ u8 pad1[2];
+ u32 flags; /* flags for operation */
+ u8 mac_addr[ETH_ALEN]; /* MAC address */
+ u8 iftype; /* type of interface created */
+ u8 pad2;
+ u32 wlc_index; /* optional for wlc index */
+};
+
+struct inff_interface_create_v3 {
+ u16 ver; /* structure version */
+ u16 len; /* length of structure + data */
+ u16 fixed_len; /* length of structure */
+ u8 iftype; /* type of interface created */
+ u8 wlc_index; /* optional for wlc index */
+ u32 flags; /* flags for operation */
+ u8 mac_addr[ETH_ALEN]; /* MAC address */
+ u8 bssid[ETH_ALEN]; /* optional for BSSID */
+ u8 if_index; /* interface index request */
+ u8 pad[3];
+ u8 data[]; /* Optional for specific data */
+};
+
+#define WL_IOV_OP_BSSCFG_DISABLE 0
+#define WL_IOV_OP_BSSCFG_ENABLE 1
+#define WL_IOV_OP_MANUAL_STA_BSSCFG_CREATE 2
+#define WL_IOV_OP_MANUAL_AP_BSSCFG_CREATE 3
+
+/**
+ * enum inff_vif_status - bit indices for vif status.
+ *
+ * @INFF_VIF_STATUS_READY: ready for operation.
+ * @INFF_VIF_STATUS_CONNECTING: connect/join in progress.
+ * @INFF_VIF_STATUS_CONNECTED: connected/joined successfully.
+ * @INFF_VIF_STATUS_DISCONNECTING: disconnect/disable in progress.
+ * @INFF_VIF_STATUS_AP_CREATED: AP operation started.
+ * @INFF_VIF_STATUS_EAP_SUCCUSS: EAPOL handshake successful.
+ * @INFF_VIF_STATUS_ASSOC_SUCCESS: successful SET_SSID received.
+ */
+enum inff_vif_status {
+ INFF_VIF_STATUS_READY,
+ INFF_VIF_STATUS_CONNECTING,
+ INFF_VIF_STATUS_CONNECTED,
+ INFF_VIF_STATUS_DISCONNECTING,
+ INFF_VIF_STATUS_AP_CREATED,
+ INFF_VIF_STATUS_EAP_SUCCESS,
+ INFF_VIF_STATUS_ASSOC_SUCCESS,
+};
+
+/**
+ * struct inff_vif_saved_ie - holds saved IEs for a virtual interface.
+ *
+ * @probe_req_ie: IE info for probe request.
+ * @probe_res_ie: IE info for probe response.
+ * @beacon_ie: IE info for beacon frame.
+ * @assoc_req_ie: IE info for association request frame.
+ * @assoc_res_ie: IE info for association response frame.
+ * @probe_req_ie_len: IE info length for probe request.
+ * @probe_res_ie_len: IE info length for probe response.
+ * @beacon_ie_len: IE info length for beacon frame.
+ * @assoc_req_ie_len: IE info length for association request frame.
+ * @assoc_res_ie_len: IE info length for association response frame.
+ */
+struct inff_vif_saved_ie {
+ u8 probe_req_ie[IE_MAX_LEN];
+ u8 probe_res_ie[IE_MAX_LEN];
+ u8 beacon_ie[IE_MAX_LEN];
+ u8 assoc_req_ie[IE_MAX_LEN];
+ u8 assoc_res_ie[IE_MAX_LEN];
+ u32 probe_req_ie_len;
+ u32 probe_res_ie_len;
+ u32 beacon_ie_len;
+ u32 assoc_req_ie_len;
+ u32 assoc_res_ie_len;
+};
+
+/**
+ * struct inff_cfg80211_vif - virtual interface specific information.
+ *
+ * @ifp: lower layer interface pointer
+ * @wdev: wireless device.
+ * @sme_state: SME state using enum inff_vif_status bits.
+ * @saved_id: saved IE info for a vif.
+ * @list: linked list.
+ * @mgmt_rx_reg: registered rx mgmt frame types.
+ * @mbss: Multiple BSS type, set if not first AP
+ * @is_11d: beacon contains country IE, enable regulatory 802.11d support
+ */
+struct inff_cfg80211_vif {
+ struct inff_if *ifp;
+ struct wireless_dev wdev;
+ unsigned long sme_state;
+ struct inff_vif_saved_ie saved_ie;
+ struct list_head list;
+ struct completion mgmt_tx;
+ unsigned long mgmt_tx_status;
+ u32 mgmt_tx_id;
+ u16 mgmt_rx_reg;
+ bool mbss;
+ int is_11d;
+};
+
+void inff_link_down(struct inff_cfg80211_vif *vif, u16 reason,
+ bool locally_generated);
+void inff_arm_vif_event(struct inff_cfg80211_info *cfg,
+ struct inff_cfg80211_vif *vif);
+void inff_disarm_vif_event(struct inff_cfg80211_info *cfg);
+bool inff_vif_event_armed(struct inff_cfg80211_info *cfg);
+int inff_wait_vif_event(struct inff_cfg80211_info *cfg,
+ u8 action, ulong timeout);
+int inff_vif_change_validate(struct inff_cfg80211_info *cfg,
+ struct inff_cfg80211_vif *vif,
+ enum nl80211_iftype new_type);
+bool inff_check_vif_up(struct inff_cfg80211_vif *vif);
+struct wireless_dev *
+inff_apsta_add_vif(struct wiphy *wiphy, const char *name,
+ struct vif_params *params,
+ enum nl80211_iftype type);
+int inff_setup_ifmodes(struct wiphy *wiphy, struct inff_if *ifp);
+struct inff_cfg80211_vif *
+inff_alloc_vif(struct inff_cfg80211_info *cfg, enum nl80211_iftype type);
+void inff_free_vif(struct inff_cfg80211_vif *vif);
+
+void inff_cp_cfg80211_link_down(struct inff_if *ifp);
+
+#endif /* INFF_INTERFACE_H */
--
2.43.0
next prev parent reply other threads:[~2026-09-02 16:54 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 16:50 [PATCH wireless-next v3 00/25] wifi: inffmac: introducing a driver for Infineon's new generation chipsets Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 01/25] wifi: inffmac: add a new driver directory for infineon WLAN vendor Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 02/25] wifi: inffmac: add firmware.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 03/25] wifi: inffmac: add dfu.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 04/25] wifi: inffmac: add trxhdr.h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 05/25] wifi: inffmac: add chip.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 06/25] wifi: inffmac: add chip_{cyw5591x/acw74xx}.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 07/25] wifi: inffmac: add icdc.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 08/25] wifi: inffmac: add main.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 09/25] wifi: inffmac: add dev_cmd.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 10/25] wifi: inffmac: add dev_evt.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 11/25] wifi: inffmac: add net.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 12/25] wifi: inffmac: add cfg80211.c/h Gokul Sivakumar
2026-09-02 16:50 ` Gokul Sivakumar [this message]
2026-09-02 16:50 ` [PATCH wireless-next v3 14/25] wifi: inffmac: add he.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 15/25] wifi: inffmac: add feature.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 16/25] wifi: inffmac: add bus_proto.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 17/25] wifi: inffmac: add sdio.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 18/25] wifi: inffmac: add fwsignal.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 19/25] wifi: inffmac: add bcdc.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 20/25] wifi: inffmac: add ie.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 21/25] wifi: inffmac: add scan.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 22/25] wifi: inffmac: add chan.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 23/25] wifi: inffmac: add debug.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 24/25] wifi: inffmac: add utils.c/h Gokul Sivakumar
2026-09-02 16:50 ` [PATCH wireless-next v3 25/25] wifi: inffmac: add Kconfig, Makefile Gokul Sivakumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260902165057.456447-14-gokulkumar.sivakumar@infineon.com \
--to=gokulkumar.sivakumar@infineon.com \
--cc=arend.vanspriel@broadcom.com \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=wlan-kernel-dev-list@infineon.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox