From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp9.infineon.com (smtp9.infineon.com [217.10.52.204]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 183A13BBFCD for ; Wed, 2 Sep 2026 16:53:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.10.52.204 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788368020; cv=none; b=P9AjfDEi5oGjMavwlFmqjvM3/HEJ210+MidyDB0taZEPeIYgJu/Y+y77/pEKkD3w/r4xQ8WW5Jw1ozVZEJ4dOH3tRe+LTxZwz4bw7zI/GpAFnNDIegF2skj/lOWGwwOjcgpkCOM+JiiF+nJH0VfXkhBocKyaLJaatIgGtrbxKdw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788368020; c=relaxed/simple; bh=n/Cw7PNQ+GhIBhC217pIr3UFu6oTZCClIYB4IcpEJAs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HVSTH7AwXBHCvs2IunbvmU/1CRFqEDxmGBpAJpgwKKivMVLMQ7SzPD6ya2tpl2SzNMiPfNVzFVA6ikUEFeiI3ogDErzD5erqvDPVBUCerD7PRYhgf6jlhj89tGnwXClUxnQRB0Lv9bB+oc7jS6wQz+Xh7RqxvZwmGMtw0Ys7hdA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=infineon.com; spf=pass smtp.mailfrom=infineon.com; dkim=pass (1024-bit key) header.d=infineon.com header.i=@infineon.com header.b=fhGSirVP; arc=none smtp.client-ip=217.10.52.204 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=infineon.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=infineon.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=infineon.com header.i=@infineon.com header.b="fhGSirVP" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=infineon.com; i=@infineon.com; q=dns/txt; s=IFXMAIL; t=1788368018; x=1819904018; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=n/Cw7PNQ+GhIBhC217pIr3UFu6oTZCClIYB4IcpEJAs=; b=fhGSirVP5abId9qsEnTDpXl0rkgeAV5Jenf8rHvvs00FhYIBKUIc2SfE NbS5Qh/mXdfa1QAoL02ICmTx3Gfww857NB13NNpkk0ocMFik0oZoYoYIw RFh5+lhtoaDgw5zazvsM09Q4S4t3jRx2cfMpcAG0dL6mY/HCS4K/T6cwL o=; X-CSE-ConnectionGUID: hdFeU44DROGUoCwuDzHj1A== X-CSE-MsgGUID: WkVyDSvmTCqScrWLUWXcSg== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="107705841" X-IronPort-AV: E=Sophos;i="6.25,258,1779141600"; d="scan'208";a="107705841" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO MUCSE814.infineon.com) ([172.23.29.40]) by smtp9.infineon.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 18:53:36 +0200 Received: from MUCSE827.infineon.com (172.23.29.20) by MUCSE814.infineon.com (172.23.29.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Wed, 2 Sep 2026 18:53:35 +0200 Received: from ISCN5CG54722ST.infineon.com (10.161.6.196) by MUCSE827.infineon.com (172.23.29.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Wed, 2 Sep 2026 18:53:33 +0200 From: Gokul Sivakumar To: , CC: , , Subject: [PATCH wireless-next v3 11/25] wifi: inffmac: add net.c/h Date: Wed, 2 Sep 2026 16:50:42 +0000 Message-ID: <20260902165057.456447-12-gokulkumar.sivakumar@infineon.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902165057.456447-1-gokulkumar.sivakumar@infineon.com> References: <20260902165057.456447-1-gokulkumar.sivakumar@infineon.com> Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MUCSE804.infineon.com (172.23.29.30) To MUCSE827.infineon.com (172.23.29.20) Integrate the driver with kernel network stack for enabling datapath communication using a netdev for WLAN interfaces. Signed-off-by: Gokul Sivakumar --- drivers/net/wireless/infineon/inffmac/net.c | 500 ++++++++++++++++++++ drivers/net/wireless/infineon/inffmac/net.h | 43 ++ 2 files changed, 543 insertions(+) create mode 100644 drivers/net/wireless/infineon/inffmac/net.c create mode 100644 drivers/net/wireless/infineon/inffmac/net.h diff --git a/drivers/net/wireless/infineon/inffmac/net.c b/drivers/net/wireless/infineon/inffmac/net.c new file mode 100644 index 000000000000..036bf7ebad8b --- /dev/null +++ b/drivers/net/wireless/infineon/inffmac/net.c @@ -0,0 +1,500 @@ +// 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 +#include +#include + +#include "main.h" +#include "net.h" +#include "cfg80211.h" +#include "interface.h" +#include "utils.h" +#include "bus_proto.h" +#include "dev_cmd.h" + +/* Store the mac that user set from cfg80211 api. + * If dongle gets reset, the mac will be restored to dongle. + */ +u8 user_mac_addr[ETH_ALEN] = {0}; + +void inff_net_txflowblock(struct inff_if *ifp, + enum inff_netif_stop_reason reason, bool state) +{ + unsigned long flags; + + if (!ifp || !ifp->ndev) + return; + + inff_dbg(TRACE, "bsscfgidx=%d stop=0x%X reason=%d state=%d\n", + ifp->bsscfgidx, ifp->netif_stop, reason, state); + + spin_lock_irqsave(&ifp->netif_stop_lock, flags); + if (state) { + if (!ifp->netif_stop) + netif_stop_queue(ifp->ndev); + ifp->netif_stop |= reason; + } else { + ifp->netif_stop &= ~reason; + if (!ifp->netif_stop) + netif_wake_queue(ifp->ndev); + } + spin_unlock_irqrestore(&ifp->netif_stop_lock, flags); +} + +void inff_net_setcarrier(struct inff_if *ifp, bool on) +{ + struct net_device *ndev; + + ndev = ifp->ndev; + inff_net_txflowblock(ifp, INFF_NETIF_STOP_REASON_DISCONNECTED, !on); + if (on) { + if (!netif_carrier_ok(ndev)) + netif_carrier_on(ndev); + + } else { + if (netif_carrier_ok(ndev)) + netif_carrier_off(ndev); + } +} + +bool inff_net_rx_preprocess(struct inff_if *ifp, struct sk_buff *skb) +{ + if (skb->pkt_type == PACKET_MULTICAST) + ifp->ndev->stats.multicast++; + + if (!(ifp->ndev->flags & IFF_UP)) { + inff_pkt_buf_free_skb(skb); + return false; + } + + ifp->ndev->stats.rx_bytes += skb->len; + ifp->ndev->stats.rx_packets++; + + return true; +} + +void inff_net_rx(struct inff_if *ifp, struct sk_buff *skb, bool inirq) +{ + if (!inff_net_rx_preprocess(ifp, skb)) + return; + + inff_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol)); + if (ifp->napi.poll && ifp->napi_gro) + napi_gro_receive(&ifp->napi, skb); + else + netif_rx(skb); +} + +static int inff_netdev_open(struct net_device *ndev) +{ + struct inff_if *ifp = netdev_priv(ndev); + struct inff_pub *drvr = ifp->drvr; + struct inff_bus *bus_if = drvr->bus_if; + u32 toe_ol = 0; + int ret; + + /* If bus is not ready, can't continue */ + if (bus_if->state != INFF_BUS_UP) { + iphy_err(drvr, "failed bus is not ready\n"); + return -EAGAIN; + } + + atomic_set(&ifp->pend_8021x_cnt, 0); + + /* Get current TOE mode from dongle */ + if (inff_socitype_is_ai(bus_if)) { + if (inff_fwcmd_iovar_int_get(ifp, "toe_ol", &toe_ol) >= 0 && + (toe_ol & TOE_TX_CSUM_OL) != 0) + ndev->features |= NETIF_F_IP_CSUM; + else + ndev->features &= ~NETIF_F_IP_CSUM; + } + + wiphy_lock(drvr->wiphy); + ret = inff_cfg80211_up(ndev); + wiphy_unlock(drvr->wiphy); + + if (ret) { + iphy_err(drvr, "failed to bring up cfg80211\n"); + return -EIO; + } + + /* Clear, carrier, set when connected or AP mode. */ + netif_carrier_off(ndev); + + return 0; +} + +static int inff_netdev_stop(struct net_device *ndev) +{ + struct inff_if *ifp = netdev_priv(ndev); + struct inff_pub *drvr = ifp->drvr; + + wiphy_lock(drvr->wiphy); + + if (inff_socitype_is_ai(drvr->bus_if)) { + inff_cfg80211_down(ndev); + } else if (inff_socitype_is_cp(drvr->bus_if)) { + inff_cp_cfg80211_link_down(ifp); + clear_bit(INFF_VIF_STATUS_READY, &ifp->vif->sme_state); + } + + wiphy_unlock(drvr->wiphy); + + inff_net_setcarrier(ifp, false); + + return 0; +} + +static netdev_tx_t inff_netdev_start_xmit(struct sk_buff *skb, + struct net_device *ndev) +{ + int ret; + struct inff_if *ifp = netdev_priv(ndev); + struct inff_pub *drvr = ifp->drvr; + struct ethhdr *eh; + int head_delta; + unsigned int tx_bytes = skb->len; + + /* Can the device send data? */ + if (drvr->bus_if->state != INFF_BUS_UP) { + iphy_err(drvr, "xmit rejected state=%d\n", drvr->bus_if->state); + netif_stop_queue(ndev); + dev_kfree_skb(skb); + ret = -ENODEV; + goto done; + } + + /* Make sure there's enough writeable headroom */ + if (skb_headroom(skb) < drvr->hdrlen || skb_header_cloned(skb)) { + head_delta = max_t(int, drvr->hdrlen - skb_headroom(skb), 0); + + inff_dbg(INFO, "%s: %s headroom\n", inff_ifname(ifp), + head_delta ? "insufficient" : "unmodifiable"); + atomic_inc(&drvr->bus_if->stats.pktcowed); + ret = pskb_expand_head(skb, ALIGN(head_delta, NET_SKB_PAD), 0, + GFP_ATOMIC); + if (ret < 0) { + iphy_err(drvr, "%s: failed to expand headroom\n", + inff_ifname(ifp)); + atomic_inc(&drvr->bus_if->stats.pktcow_failed); + dev_kfree_skb(skb); + goto done; + } + } + + /* validate length for ether packet */ + if (skb->len < sizeof(*eh)) { + ret = -EINVAL; + dev_kfree_skb(skb); + goto done; + } + + eh = (struct ethhdr *)(skb->data); + + if (eh->h_proto == htons(ETH_P_PAE)) + atomic_inc(&ifp->pend_8021x_cnt); + + /* determine the priority */ + if (skb->priority == 0 || skb->priority > 7) + skb->priority = cfg80211_classify8021d(skb, NULL); + + /* set pacing shift for packet aggregation */ + sk_pacing_shift_update(skb->sk, 8); + + ret = inff_proto_tx_queue_data(drvr, ifp->ifidx, skb); + if (ret < 0) + inff_txfinalize(ifp, skb, false); + +done: + if (ret) { + ndev->stats.tx_dropped++; + } else { + ndev->stats.tx_packets++; + ndev->stats.tx_bytes += tx_bytes; + } + + /* Return ok: we always eat the packet */ + return NETDEV_TX_OK; +} + +static int inff_netdev_set_mac_address(struct net_device *ndev, void *addr) +{ + struct inff_if *ifp = netdev_priv(ndev); + struct sockaddr *sa = (struct sockaddr *)addr; + int err = 0; + + if (inff_socitype_is_ai(ifp->drvr->bus_if)) { + err = inff_set_cur_etheraddr(ifp, sa->sa_data); + if (err >= 0) { + inff_dbg(TRACE, "MAC Address updated to %pM\n", sa->sa_data); + memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN); + memcpy(user_mac_addr, sa->sa_data, ETH_ALEN); + eth_hw_addr_set(ifp->ndev, ifp->mac_addr); + } + } + + return err; +} + +static void inff_net_set_multicast_list(struct wiphy *wiphy, + struct wiphy_work *work) +{ + struct inff_if *ifp = container_of(work, struct inff_if, + multicast_work); + struct inff_pub *drvr = ifp->drvr; + struct net_device *ndev = ifp->ndev; + struct netdev_hw_addr *ha; + u32 cmd_value, cnt; + __le32 cnt_le; + char *buf, *bufp; + u32 buflen; + s32 err; + + if (inff_socitype_is_cp(ifp->drvr->bus_if)) + return; + + /* Determine initial value of allmulti flag */ + cmd_value = (ndev->flags & IFF_ALLMULTI) ? true : false; + + /* Send down the multicast list first. */ + cnt = netdev_mc_count(ndev); + buflen = sizeof(cnt) + (cnt * ETH_ALEN); + buf = kmalloc(buflen, GFP_KERNEL); + if (!buf) + return; + bufp = buf; + + cnt_le = cpu_to_le32(cnt); + memcpy(bufp, &cnt_le, sizeof(cnt_le)); + bufp += sizeof(cnt_le); + + netdev_for_each_mc_addr(ha, ndev) { + if (!cnt) + break; + memcpy(bufp, ha->addr, ETH_ALEN); + bufp += ETH_ALEN; + cnt--; + } + + err = inff_fwcmd_iovar_data_set(ifp, "mcast_list", buf, buflen); + if (err < 0) { + iphy_err(drvr, "Setting mcast_list failed, %d\n", err); + cmd_value = cnt ? true : cmd_value; + } + + kfree(buf); + + /* + * Now send the allmulti setting. This is based on the setting in the + * net_device flags, but might be modified above to be turned on if we + * were trying to set some addresses and dongle rejected it... + */ + err = inff_fwcmd_iovar_int_set(ifp, "allmulti", cmd_value); + if (err < 0) + iphy_err(drvr, "Setting allmulti failed, %d\n", err); + + /*Finally, pick up the PROMISC flag */ + cmd_value = (ndev->flags & IFF_PROMISC) ? true : false; + err = inff_fwcmd_int_set(ifp, INFF_C_SET_PROMISC, cmd_value); + if (err < 0) { + /* PROMISC unsupported by firmware of older chips */ + if (err == -EBADE) + iphy_info_once(drvr, "INFF_C_SET_PROMISC unsupported\n"); + else + iphy_err(drvr, "Setting INFF_C_SET_PROMISC failed, err=%d\n", + err); + } +} + +static void inff_netdev_set_multicast_list(struct net_device *ndev) +{ + struct inff_if *ifp = netdev_priv(ndev); + + if (inff_socitype_is_ai(ifp->drvr->bus_if)) + wiphy_work_queue(ifp->drvr->wiphy, &ifp->multicast_work); +} + +static const struct net_device_ops inff_netdev_ops_pri = { + .ndo_open = inff_netdev_open, + .ndo_stop = inff_netdev_stop, + .ndo_start_xmit = inff_netdev_start_xmit, + .ndo_set_mac_address = inff_netdev_set_mac_address, + .ndo_set_rx_mode = inff_netdev_set_multicast_list, +}; + +int inff_net_attach(struct inff_if *ifp, bool locked) +{ + struct inff_pub *drvr = ifp->drvr; + struct net_device *ndev = ifp->ndev; + s32 err; + + if (!ndev) + return -EINVAL; + + /* set appropriate operations */ + ndev->netdev_ops = &inff_netdev_ops_pri; + + ndev->needed_headroom += drvr->hdrlen; + + /* set the mac address & netns */ + eth_hw_addr_set(ndev, ifp->mac_addr); + dev_net_set(ndev, wiphy_net(drvr->config->wiphy)); + + wiphy_work_init(&ifp->multicast_work, inff_net_set_multicast_list); + + if (locked) + err = cfg80211_register_netdevice(ndev); + else + err = register_netdev(ndev); + if (err != 0) { + iphy_err(drvr, "couldn't register the net device\n"); + goto fail; + } + + netif_carrier_off(ndev); + + ndev->priv_destructor = inff_cfg80211_free_netdev_priv; + inff_dbg(INFO, "%s: Infineon Dongle Host Driver\n", ndev->name); + return 0; + +fail: + drvr->iflist[ifp->bsscfgidx] = NULL; + ndev->netdev_ops = NULL; + return -EBADE; +} + +void inff_net_detach(struct net_device *ndev, bool locked) +{ + if (ndev->reg_state == NETREG_REGISTERED) { + if (locked) + cfg80211_unregister_netdevice(ndev); + else + unregister_netdev(ndev); + } else { + inff_cfg80211_free_netdev_priv(ndev); + free_netdev(ndev); + } +} + +struct inff_if *inff_net_add_if(struct inff_pub *drvr, s32 bsscfgidx, s32 ifidx, + const char *name, const u8 *mac_addr, + enum nl80211_iftype iftype) +{ + struct inff_if *ifp; + struct net_device *ndev; + int err; + + inff_dbg(TRACE, "bsscfgidx=%d, ifidx=%d\n", bsscfgidx, ifidx); + + switch (iftype) { + case NL80211_IFTYPE_STATION: + fallthrough; + case NL80211_IFTYPE_AP: + inff_dbg(INFO, "adding netdev interface\n"); + /* Allocate netdev, including space for private structure */ + ndev = alloc_netdev(sizeof(*ifp), name, + NET_NAME_UNKNOWN, ether_setup); + if (!ndev) + return ERR_PTR(-ENOMEM); + + ndev->needs_free_netdev = true; + ifp = netdev_priv(ndev); + ifp->ndev = ndev; + /* store mapping ifidx to bsscfgidx */ + if (drvr->if2bss[ifidx] == INFF_BSSIDX_INVALID) + drvr->if2bss[ifidx] = bsscfgidx; + break; + default: + return ERR_PTR(-EINVAL); + } + + ifp->drvr = drvr; + drvr->iflist[bsscfgidx] = ifp; + ifp->ifidx = ifidx; + ifp->bsscfgidx = bsscfgidx; + + if (inff_socitype_is_ai(drvr->bus_if)) { + init_waitqueue_head(&ifp->pend_8021x_wait); + spin_lock_init(&ifp->netif_stop_lock); + } else if (inff_socitype_is_cp(drvr->bus_if)) { + if (drvr->bus_if->state != INFF_BUS_UP) + inff_bus_change_state(drvr->bus_if, INFF_BUS_UP); + + if (iftype == NL80211_IFTYPE_STATION) { + err = inff_cpcmd_data_get(ifp, INFF_CP_C_MAC, ifp->mac_addr, ETH_ALEN); + if (err) { + inff_err("Could not get MAC address (%d)\n", err); + return ERR_PTR(-EINVAL); + } + } else if (iftype == NL80211_IFTYPE_AP) { + err = inff_cpcmd_data_get(ifp, INFF_CP_C_SAP_MAC, ifp->mac_addr, ETH_ALEN); + if (err) { + inff_err("Could not get SoftAP MAC address (%d)\n", err); + return ERR_PTR(-EINVAL); + } + } + } + + if (mac_addr) + memcpy(ifp->mac_addr, mac_addr, ETH_ALEN); + + inff_dbg(TRACE, "%s (%pM) created by pid:%x\n", + name, ifp->mac_addr, current->pid); + + return ifp; +} + +void inff_net_del_if(struct inff_pub *drvr, struct inff_if *ifp, bool locked) +{ + int ifidx; + s32 bsscfgidx; + enum nl80211_iftype iftype = NL80211_IFTYPE_UNSPECIFIED; + + if (!drvr || !ifp) { + inff_err("NULL interface cannot be removed\n"); + return; + } + + ifidx = ifp->ifidx; + bsscfgidx = ifp->bsscfgidx; + + if (ifp->vif) + iftype = ifp->vif->wdev.iftype; + + inff_dbg(TRACE, "bsscfgidx=%d, ifidx=%d\n", bsscfgidx, + ifp->ifidx); + + inff_proto_del_if(drvr, ifp); + + switch (iftype) { + case NL80211_IFTYPE_STATION: + fallthrough; + case NL80211_IFTYPE_AP: + inff_dbg(INFO, "deleting netdev interface\n"); + if (bsscfgidx == 0) { + rtnl_lock(); + inff_netdev_stop(ifp->ndev); + rtnl_unlock(); + } else { + netif_stop_queue(ifp->ndev); + } + + wiphy_work_cancel(drvr->wiphy, &ifp->multicast_work); + inff_net_detach(ifp->ndev, locked); + break; + default: + inff_dbg(TRACE, "Unknown wdev iface type"); + break; + } + + drvr->iflist[bsscfgidx] = NULL; + if (drvr->if2bss[ifidx] == bsscfgidx) + drvr->if2bss[ifidx] = INFF_BSSIDX_INVALID; +} diff --git a/drivers/net/wireless/infineon/inffmac/net.h b/drivers/net/wireless/infineon/inffmac/net.h new file mode 100644 index 000000000000..ac16fbd63235 --- /dev/null +++ b/drivers/net/wireless/infineon/inffmac/net.h @@ -0,0 +1,43 @@ +/* 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_NET_H +#define INFF_NET_H + +#include +#include + +/** + * enum inff_netif_stop_reason - reason for stopping netif queue. + * + * @INFF_NETIF_STOP_REASON_FWS_FC: + * netif stopped due to firmware signalling flow control. + * @INFF_NETIF_STOP_REASON_FLOW: + * netif stopped due to flowring full. + * @INFF_NETIF_STOP_REASON_DISCONNECTED: + * netif stopped due to not being connected (STA mode). + */ +enum inff_netif_stop_reason { + INFF_NETIF_STOP_REASON_FWS_FC = BIT(0), + INFF_NETIF_STOP_REASON_FLOW = BIT(1), + INFF_NETIF_STOP_REASON_DISCONNECTED = BIT(2) +}; + +void inff_net_txflowblock(struct inff_if *ifp, + enum inff_netif_stop_reason reason, bool state); +void inff_net_setcarrier(struct inff_if *ifp, bool on); +bool inff_net_rx_preprocess(struct inff_if *ifp, struct sk_buff *skb); +void inff_net_rx(struct inff_if *ifp, struct sk_buff *skb, bool inirq); +int inff_net_attach(struct inff_if *ifp, bool locked); +void inff_net_detach(struct net_device *ndev, bool locked); +struct inff_if *inff_net_add_if(struct inff_pub *drvr, s32 bsscfgidx, s32 ifidx, + const char *name, const u8 *mac_addr, + enum nl80211_iftype iftype); +void inff_net_del_if(struct inff_pub *drvr, struct inff_if *ifp, bool locked); + +#endif /* INFF_NET_H */ -- 2.43.0