From: Gokul Sivakumar <gokulkumar.sivakumar@infineon.com>
To: <linux-wireless@vger.kernel.org>
Cc: Johannes Berg <johannes@sipsolutions.net>,
Arend van Spriel <arend.vanspriel@broadcom.com>,
<marex@nabladev.com>, <wlan-kernel-dev-list@infineon.com>,
<gokulkumar.sivakumar@infineon.com>
Subject: [PATCH wireless-next v2 08/34] wifi: inffmac: add icdc.c/h
Date: Wed, 14 Jan 2026 02:03:21 +0530 [thread overview]
Message-ID: <20260113203350.16734-9-gokulkumar.sivakumar@infineon.com> (raw)
In-Reply-To: <20260113203350.16734-1-gokulkumar.sivakumar@infineon.com>
Driver implementation of the ICDC protocol used for the Control and Data
communication with Infineon's Chipsets that have the Connectivity processor
(CP) architecture like the CYW5591x sub-family of chipsets, using SDIO.
Signed-off-by: Gokul Sivakumar <gokulkumar.sivakumar@infineon.com>
---
drivers/net/wireless/infineon/inffmac/icdc.c | 450 +++++++++++++++++++
drivers/net/wireless/infineon/inffmac/icdc.h | 34 ++
2 files changed, 484 insertions(+)
create mode 100644 drivers/net/wireless/infineon/inffmac/icdc.c
create mode 100644 drivers/net/wireless/infineon/inffmac/icdc.h
diff --git a/drivers/net/wireless/infineon/inffmac/icdc.c b/drivers/net/wireless/infineon/inffmac/icdc.c
new file mode 100644
index 000000000000..86da37f756ca
--- /dev/null
+++ b/drivers/net/wireless/infineon/inffmac/icdc.c
@@ -0,0 +1,450 @@
+// 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.
+ */
+
+/*******************************************************************************
+ * Communicates with the dongle by using dcmd (CP and FW) codes.
+ * For certain dcmd codes, the dongle interprets string data from the host.
+ ******************************************************************************/
+
+#include <linux/types.h>
+#include <linux/netdevice.h>
+
+#include "main.h"
+#include "net.h"
+#include "utils.h"
+#include "fwsignal.h"
+#include "debug.h"
+#include "bus_proto.h"
+#include "icdc.h"
+
+struct inff_proto_icdc_dcmd {
+ __le32 cmd; /* dongle command value */
+ __le32 len; /* lower 16: output buflen;
+ * upper 16: input buflen (excludes header)
+ */
+ __le32 flags; /* flag defns given below */
+ __le32 status; /* status code returned from the device */
+ unsigned char ioc_key[ICDC_GCM_KEY_SIZE_BYTES]; /* key used for ioc enc */
+ unsigned char ioc_iv[ICDC_GCM_IV_SIZE]; /* enc field */
+};
+
+/* ICDC flag definitions */
+#define ICDC_DCMD_ERROR 0x01 /* 1=cmd failed */
+#define ICDC_DCMD_SET 0x02 /* 0=get, 1=set cmd */
+#define ICDC_DCMD_IF_MASK 0xF000 /* I/F index */
+#define ICDC_DCMD_IF_SHIFT 12
+#define ICDC_DCMD_ID_MASK 0xFFFF0000 /* id an cmd pairing */
+#define ICDC_DCMD_ID_SHIFT 16 /* ID Mask shift bits */
+#define ICDC_DCMD_ID(flags) \
+ (((flags) & ICDC_DCMD_ID_MASK) >> ICDC_DCMD_ID_SHIFT)
+
+/*
+ * ICDC header - Infineon specific extension of CDC.
+ * Used on data packets to convey priority.
+ */
+#define ICDC_HEADER_LEN 4
+#define ICDC_PROTO_VER 2 /* Protocol version */
+#define ICDC_FLAG_VER_MASK 0xf0 /* Protocol version mask */
+#define ICDC_FLAG_VER_SHIFT 4 /* Protocol version shift */
+#define ICDC_FLAG_SUM_GOOD 0x04 /* Good RX checksums */
+#define ICDC_FLAG_SUM_NEEDED 0x08 /* Dongle needs to do TX checksums */
+#define ICDC_PRIORITY_MASK 0x7
+#define ICDC_FLAG2_IF_MASK 0x0f /* packet rx interface in APSTA */
+#define ICDC_FLAG2_IF_SHIFT 0
+
+#define ICDC_GET_IF_IDX(hdr) \
+ ((int)((((hdr)->flags2) & ICDC_FLAG2_IF_MASK) >> ICDC_FLAG2_IF_SHIFT))
+#define ICDC_SET_IF_IDX(hdr, idx) {\
+ typeof(hdr) _hdr = (hdr); \
+ ((_hdr)->flags2 = (((_hdr)->flags2 & ~ICDC_FLAG2_IF_MASK) | \
+ ((idx) << ICDC_FLAG2_IF_SHIFT))); \
+ }
+
+/**
+ * struct inff_proto_icdc_header - ICDC header format
+ *
+ * @flags: flags contain protocol and checksum info.
+ * @priority: 802.1d priority.
+ * @flags2: additional flags containing dongle interface index.
+ * @data_offset: start of packet data. header is following by firmware signals.
+ */
+struct inff_proto_icdc_header {
+ u8 flags;
+ u8 priority;
+ u8 flags2;
+ u8 data_offset;
+ unsigned char data_key[ICDC_GCM_KEY_SIZE_BYTES]; /* key used for ioc enc */
+ unsigned char data_iv[ICDC_GCM_IV_SIZE]; /* enc field */
+};
+
+/*
+ * maximum length of firmware signal data between
+ * the ICDC header and packet data in the tx path.
+ */
+#define INFF_PROT_FW_SIGNAL_MAX_TXBYTES 12
+
+#define RETRIES 2 /* # of retries to retrieve matching dcmd response */
+#define BUS_HEADER_LEN (16 + 64) /* Must be at least SDPCM_RESERVE
+ * (amount of header tha might be added)
+ * plus any space that might be needed
+ * for bus alignment padding.
+ */
+#define ROUND_UP_MARGIN 2048
+
+struct inff_icdc {
+ u16 reqid;
+ u8 bus_header[BUS_HEADER_LEN];
+ struct inff_proto_icdc_dcmd msg;
+ unsigned char buf[INFF_DCMD_MAXLEN];
+};
+
+static int
+inff_proto_icdc_msg(struct inff_pub *drvr, int ifidx, uint cmd, void *buf,
+ uint len, bool set)
+{
+ struct inff_icdc *icdc = (struct inff_icdc *)drvr->proto->pd;
+ struct inff_proto_icdc_dcmd *msg = &icdc->msg;
+ u32 flags;
+
+ memset(msg, 0, sizeof(struct inff_proto_icdc_dcmd));
+
+ msg->cmd = cpu_to_le32(cmd);
+ msg->len = cpu_to_le32(len);
+ flags = (++icdc->reqid << ICDC_DCMD_ID_SHIFT);
+
+ flags = (ICDC_PROTO_VER << ICDC_FLAG_VER_SHIFT);
+ flags |= (++icdc->reqid << ICDC_DCMD_ID_SHIFT);
+
+ if (set)
+ flags |= ICDC_DCMD_SET;
+ flags = (flags & ~ICDC_DCMD_IF_MASK) |
+ (ifidx << ICDC_DCMD_IF_SHIFT);
+ msg->flags = cpu_to_le32(flags);
+
+ if (buf)
+ memcpy(icdc->buf, buf, len);
+
+ len += sizeof(*msg);
+ if (len > INFF_TX_IOCTL_MAX_MSG_SIZE)
+ len = INFF_TX_IOCTL_MAX_MSG_SIZE;
+
+ /* Send request */
+ return inff_bus_txctl(drvr->bus_if, (unsigned char *)&icdc->msg, len);
+}
+
+static int
+inff_proto_icdc_cmplt(struct inff_pub *drvr, u32 id, u32 len)
+{
+ int ret;
+ struct inff_icdc *icdc = (struct inff_icdc *)drvr->proto->pd;
+
+ len += sizeof(struct inff_proto_icdc_dcmd);
+ do {
+ ret = inff_bus_rxctl(drvr->bus_if, (unsigned char *)&icdc->msg,
+ len);
+ if (ret < 0)
+ break;
+ } while (ICDC_DCMD_ID(le32_to_cpu(icdc->msg.flags)) != id);
+
+ return ret;
+}
+
+static int
+inff_proto_icdc_query_dcmd(struct inff_pub *drvr, int ifidx, uint cmd,
+ void *buf, uint len, int *err)
+{
+ struct inff_icdc *icdc = (struct inff_icdc *)drvr->proto->pd;
+ struct inff_proto_icdc_dcmd *msg = &icdc->msg;
+ void *info;
+ int ret = 0, retries = 0;
+ u32 id, flags;
+
+ *err = 0;
+ ret = inff_proto_icdc_msg(drvr, ifidx, cmd, buf, len, false);
+ if (ret < 0) {
+ iphy_err(drvr, "inff_proto_icdc_msg failed w/status %d\n",
+ ret);
+ goto done;
+ }
+
+retry:
+ /* wait for interrupt and get first fragment */
+ ret = inff_proto_icdc_cmplt(drvr, icdc->reqid, len);
+ if (ret < 0)
+ goto done;
+
+ flags = le32_to_cpu(msg->flags);
+ id = (flags & ICDC_DCMD_ID_MASK) >> ICDC_DCMD_ID_SHIFT;
+
+ if (id < icdc->reqid && (++retries < RETRIES))
+ goto retry;
+ if (id != icdc->reqid) {
+ iphy_err(drvr, "%s: unexpected request id %d (expected %d)\n",
+ inff_ifname(inff_get_ifp(drvr, ifidx)), id,
+ icdc->reqid);
+ ret = -EINVAL;
+ goto done;
+ }
+
+ /* Check info buffer */
+ info = (void *)&icdc->buf[0];
+
+ /* Copy info buffer */
+ if (buf) {
+ if (ret < (int)len)
+ len = ret;
+ memcpy(buf, info, len);
+ }
+
+ ret = 0;
+
+ /* Check the ERROR flag */
+ if (flags & ICDC_DCMD_ERROR)
+ *err = le32_to_cpu(msg->status);
+done:
+ return ret;
+}
+
+static int
+inff_proto_icdc_query_cpcmd(struct inff_pub *drvr, int ifidx, uint cmd,
+ void *buf, uint len, int *cperr)
+{
+ inff_dbg(ICDC, "cmd %d len %d\n", cmd, len);
+
+ cmd = (CMD_TYPE_CP << CMD_TYPE_SHIFT) | cmd;
+
+ return inff_proto_icdc_query_dcmd(drvr, ifidx, cmd,
+ buf, len, cperr);
+}
+
+static int
+inff_proto_icdc_query_fwcmd(struct inff_pub *drvr, int ifidx, uint cmd,
+ void *buf, uint len, int *fwerr)
+{
+ inff_dbg(ICDC, "cmd %d len %d\n", cmd, len);
+
+ cmd = (CMD_TYPE_WL << CMD_TYPE_SHIFT) | cmd;
+
+ return inff_proto_icdc_query_dcmd(drvr, ifidx, cmd,
+ buf, len, fwerr);
+}
+
+static int
+inff_proto_icdc_set_dcmd(struct inff_pub *drvr, int ifidx, uint cmd,
+ void *buf, uint len, int *err)
+{
+ struct inff_icdc *icdc = (struct inff_icdc *)drvr->proto->pd;
+ struct inff_proto_icdc_dcmd *msg = &icdc->msg;
+ int ret;
+ u32 flags, id;
+
+ inff_dbg(ICDC, "cmd %d len %d\n", cmd, len);
+
+ *err = 0;
+ ret = inff_proto_icdc_msg(drvr, ifidx, cmd, buf, len, true);
+ if (ret < 0)
+ goto done;
+
+ ret = inff_proto_icdc_cmplt(drvr, icdc->reqid, len);
+ if (ret < 0)
+ goto done;
+
+ flags = le32_to_cpu(msg->flags);
+ id = (flags & ICDC_DCMD_ID_MASK) >> ICDC_DCMD_ID_SHIFT;
+
+ if (id != icdc->reqid) {
+ iphy_err(drvr, "%s: unexpected request id %d (expected %d)\n",
+ inff_ifname(inff_get_ifp(drvr, ifidx)), id,
+ icdc->reqid);
+ ret = -EINVAL;
+ goto done;
+ }
+
+ ret = 0;
+
+ /* Check the ERROR flag */
+ if (flags & ICDC_DCMD_ERROR)
+ *err = le32_to_cpu(msg->status);
+
+done:
+ return ret;
+}
+
+static int
+inff_proto_icdc_set_cpcmd(struct inff_pub *drvr, int ifidx, uint cmd,
+ void *buf, uint len, int *cperr)
+{
+ inff_dbg(ICDC, "cmd %d len %d\n", cmd, len);
+
+ cmd = (CMD_TYPE_CP << CMD_TYPE_SHIFT) | cmd;
+
+ return inff_proto_icdc_set_dcmd(drvr, ifidx, cmd,
+ buf, len, cperr);
+}
+
+static int
+inff_proto_icdc_set_fwcmd(struct inff_pub *drvr, int ifidx, uint cmd,
+ void *buf, uint len, int *fwerr)
+{
+ inff_dbg(ICDC, "cmd %d len %d\n", cmd, len);
+
+ cmd = (CMD_TYPE_WL << CMD_TYPE_SHIFT) | cmd;
+
+ return inff_proto_icdc_set_dcmd(drvr, ifidx, cmd,
+ buf, len, fwerr);
+}
+
+static void
+inff_proto_icdc_hdrpush(struct inff_pub *drvr, int ifidx, u8 offset,
+ struct sk_buff *pktbuf)
+{
+ struct inff_proto_icdc_header *h;
+
+ /* Push BDC header used to convey priority for buses that don't */
+ skb_push(pktbuf, ICDC_HEADER_LEN);
+
+ h = (struct inff_proto_icdc_header *)(pktbuf->data);
+
+ h->flags = (ICDC_PROTO_VER << ICDC_FLAG_VER_SHIFT);
+ if (pktbuf->ip_summed == CHECKSUM_PARTIAL)
+ h->flags |= ICDC_FLAG_SUM_NEEDED;
+
+ h->priority = (pktbuf->priority & ICDC_PRIORITY_MASK);
+ h->flags2 = 0;
+ h->data_offset = offset;
+ ICDC_SET_IF_IDX(h, ifidx);
+}
+
+static int
+inff_proto_icdc_hdrpull(struct inff_pub *drvr, bool do_fws,
+ struct sk_buff *pktbuf, struct inff_if **ifp)
+{
+ struct inff_proto_icdc_header *h;
+ struct inff_if *tmp_if;
+
+ /* Pop ICDC header used to convey priority for buses that don't */
+ if (pktbuf->len <= ICDC_HEADER_LEN) {
+ inff_dbg(INFO, "rx data too short (%d <= %d)\n",
+ pktbuf->len, ICDC_HEADER_LEN);
+ return -EBADE;
+ }
+
+ h = (struct inff_proto_icdc_header *)(pktbuf->data);
+
+ tmp_if = inff_get_ifp(drvr, ICDC_GET_IF_IDX(h));
+ if (!tmp_if) {
+ inff_dbg(INFO, "no matching ifp found for ifidx: %d\n",
+ ICDC_GET_IF_IDX(h));
+ return -EBADE;
+ }
+ if (((h->flags & ICDC_FLAG_VER_MASK) >> ICDC_FLAG_VER_SHIFT) !=
+ ICDC_PROTO_VER) {
+ iphy_err(drvr, "%s: non-ICDC packet received, flags 0x%x\n",
+ inff_ifname(tmp_if), h->flags);
+ return -EBADE;
+ }
+
+ if (h->flags & ICDC_FLAG_SUM_GOOD) {
+ inff_dbg(ICDC, "%s: BDC rcv, good checksum, flags 0x%x\n",
+ inff_ifname(tmp_if), h->flags);
+ pktbuf->ip_summed = CHECKSUM_UNNECESSARY;
+ }
+
+ pktbuf->priority = h->priority & ICDC_PRIORITY_MASK;
+
+ skb_pull(pktbuf, ICDC_HEADER_LEN);
+ if (do_fws)
+ inff_fws_hdrpull(tmp_if, h->data_offset << 2, pktbuf);
+ else
+ skb_pull(pktbuf, h->data_offset << 2);
+
+ if (pktbuf->len == 0)
+ return -ENODATA;
+
+ if (ifp)
+ *ifp = tmp_if;
+ return 0;
+}
+
+static int
+inff_proto_icdc_tx_queue_data(struct inff_pub *drvr, int ifidx,
+ struct sk_buff *skb)
+{
+ return inff_proto_txdata(drvr, ifidx, 0, skb);
+}
+
+static int
+inff_proto_icdc_txdata(struct inff_pub *drvr, int ifidx, u8 offset,
+ struct sk_buff *pktbuf)
+{
+ inff_proto_icdc_hdrpush(drvr, ifidx, offset, pktbuf);
+ return inff_bus_txdata(drvr->bus_if, pktbuf);
+}
+
+static void
+inff_proto_icdc_configure_addr_mode(struct inff_pub *drvr, int ifidx,
+ enum proto_addr_mode addr_mode)
+{
+}
+
+static void
+inff_proto_icdc_delete_peer(struct inff_pub *drvr, int ifidx,
+ u8 peer[ETH_ALEN])
+{
+}
+
+static void
+inff_proto_icdc_debugfs_create(struct inff_pub *drvr)
+{
+}
+
+int
+inff_proto_icdc_attach(struct inff_pub *drvr)
+{
+ struct inff_icdc *icdc;
+
+ icdc = kzalloc(sizeof(*icdc), GFP_ATOMIC);
+ if (!icdc)
+ goto fail;
+
+ /* ensure that the msg buf directly follows the cdc msg struct */
+ if ((unsigned long)(&icdc->msg + 1) != (unsigned long)icdc->buf) {
+ iphy_err(drvr, "struct inff_proto_icdc is not correctly defined\n");
+ goto fail;
+ }
+
+ drvr->proto->query_cpcmd = inff_proto_icdc_query_cpcmd;
+ drvr->proto->set_cpcmd = inff_proto_icdc_set_cpcmd;
+ drvr->proto->query_fwcmd = inff_proto_icdc_query_fwcmd;
+ drvr->proto->set_fwcmd = inff_proto_icdc_set_fwcmd;
+ drvr->proto->hdrpull = inff_proto_icdc_hdrpull;
+ drvr->proto->tx_queue_data = inff_proto_icdc_tx_queue_data;
+ drvr->proto->txdata = inff_proto_icdc_txdata;
+ drvr->proto->configure_addr_mode = inff_proto_icdc_configure_addr_mode;
+ drvr->proto->delete_peer = inff_proto_icdc_delete_peer;
+ drvr->proto->debugfs_create = inff_proto_icdc_debugfs_create;
+ drvr->proto->pd = icdc;
+
+ drvr->hdrlen += ICDC_HEADER_LEN + INFF_PROT_FW_SIGNAL_MAX_TXBYTES;
+ drvr->bus_if->maxctl = INFF_DCMD_MAXLEN +
+ sizeof(struct inff_proto_icdc_dcmd) + ROUND_UP_MARGIN;
+ return 0;
+
+fail:
+ kfree(icdc);
+ return -ENOMEM;
+}
+
+void
+inff_proto_icdc_detach(struct inff_pub *drvr)
+{
+ struct inff_icdc *icdc = drvr->proto->pd;
+
+ drvr->proto->pd = NULL;
+ kfree(icdc);
+}
diff --git a/drivers/net/wireless/infineon/inffmac/icdc.h b/drivers/net/wireless/infineon/inffmac/icdc.h
new file mode 100644
index 000000000000..c1fb4c23a055
--- /dev/null
+++ b/drivers/net/wireless/infineon/inffmac/icdc.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Copyright (c) 2013 Broadcom Corporation
+ *
+ * Copyright (c) 2025-2026, Infineon Technologies AG, or an affiliate of Infineon Technologies AG.
+ * All rights reserved.
+ */
+
+#ifndef INFF_ICDC_H
+#define INFF_ICDC_H
+
+#define ICDC_PROTO_ENC (0x01)
+#define ICDC_IOC_ENC_MASK (0x200)
+#define ICDC_IOC_ENC_SHIFT (0x09)
+
+#define ICDC_DAT_ENC_MASK (0x20)
+#define ICDC_DAT_ENC_SHIFT (0x05)
+
+#define ICDC_GCM_KEY_SIZE_BYTES (16)
+#define ICDC_GCM_IV_SIZE (12)
+
+#ifdef CONFIG_INFFMAC_PROTO_ICDC
+int inff_proto_icdc_attach(struct inff_pub *drvr);
+void inff_proto_icdc_detach(struct inff_pub *drvr);
+void inff_proto_icdc_txflowblock(struct device *dev, bool state);
+void inff_icdc_process_event(struct device *dev, struct sk_buff *skb);
+struct sk_buff *inff_icdc_rx(struct device *dev, struct sk_buff *skb,
+ bool handle_event, bool inirq);
+#else
+static inline int inff_proto_icdc_attach(struct inff_pub *drvr) { return 0; }
+static inline void inff_proto_icdc_detach(struct inff_pub *drvr) {}
+#endif
+
+#endif /* INFF_ICDC_H */
--
2.25.1
next prev parent reply other threads:[~2026-01-13 20:36 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-13 20:33 [PATCH wireless-next v2 00/34] wifi: inffmac: introducing a driver for Infineon's new generation chipsets Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 01/34] wifi: inffmac: add a new driver directory for infineon WLAN vendor Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 02/34] wifi: inffmac: add pmsr.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 03/34] wifi: inffmac: add he.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 04/34] wifi: inffmac: add twt.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 05/34] wifi: inffmac: add trxhdr.h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 06/34] wifi: inffmac: add chip.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 07/34] wifi: inffmac: add chip_{5591x/5551x/5557x/43022}.c/h Gokul Sivakumar
2026-01-13 20:33 ` Gokul Sivakumar [this message]
2026-01-13 20:33 ` [PATCH wireless-next v2 09/34] wifi: inffmac: add dfu.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 10/34] wifi: inffmac: add firmware.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 11/34] wifi: inffmac: add vendor.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 12/34] wifi: inffmac: add main.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 13/34] wifi: inffmac: add dev_evt.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 14/34] wifi: inffmac: add dev_cmd.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 15/34] wifi: inffmac: add net.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 16/34] wifi: inffmac: add cfg80211.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 17/34] wifi: inffmac: add msgbuf.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 18/34] wifi: inffmac: add pcie.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 19/34] wifi: inffmac: add p2p.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 20/34] wifi: inffmac: add interface.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 21/34] wifi: inffmac: add feature.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 22/34] wifi: inffmac: add bus_proto.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 23/34] wifi: inffmac: add commonring.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 24/34] wifi: inffmac: add flowring.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 25/34] wifi: inffmac: add sdio.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 26/34] wifi: inffmac: add ie.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 27/34] wifi: inffmac: add scan.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 28/34] wifi: inffmac: add fwsignal.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 29/34] wifi: inffmac: add security.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 30/34] wifi: inffmac: add bcdc.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 31/34] wifi: inffmac: add chan.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 32/34] wifi: inffmac: add debug.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 33/34] wifi: inffmac: add utils.c/h Gokul Sivakumar
2026-01-13 20:33 ` [PATCH wireless-next v2 34/34] wifi: inffmac: add Kconfig, Makefile Gokul Sivakumar
2026-01-14 3:22 ` [PATCH wireless-next v2 00/34] wifi: inffmac: introducing a driver for Infineon's new generation chipsets Marek Vasut
2026-01-14 8:12 ` Gokul Sivakumar
2026-01-15 17:27 ` Marek Vasut
2026-01-16 16:33 ` Gokul Sivakumar
2026-02-27 10:28 ` Marek Vasut
2026-02-27 14:34 ` Gokul Sivakumar
2026-03-21 16:24 ` Marek Vasut
2026-03-23 13:24 ` 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=20260113203350.16734-9-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=marex@nabladev.com \
--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