new file mode 100644
@@ -0,0 +1,117 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * This file contains driver status operations.
+ *
+ * Copyright (C) [2022-2025] Renesas Electronics Corporation and/or its affiliates.
+ */
+
+#include <linux/slab.h>
+
+#include "core.h"
+#include "if.h"
+#include "params.h"
+#include "dbg.h"
+#include "status.h"
+
+void ra6w_status_init(struct ra6w_status *status)
+{
+ spin_lock_init(&status->lock);
+}
+
+void ra6w_status_set(struct ra6w_status *status, u32 value)
+{
+ unsigned long flags = 0;
+
+ spin_lock_irqsave(&status->lock, flags);
+ *(u32 *)&status->value[0] = value;
+ spin_unlock_irqrestore(&status->lock, flags);
+}
+
+void ra6w_status_event_post(struct ra6w_status *status, const struct sk_buff *skb)
+{
+ struct ra6w_status_buf *rsp = (struct ra6w_status_buf *)skb->data;
+
+ if (rsp->ext_len == RA6W_STATUS_EXT_LEN)
+ ra6w_status_set(status, rsp->ext_hdr.status);
+}
+
+u8 ra6w_status_rx_get(struct ra6w_status *status)
+{
+ u8 ret = 0;
+ unsigned long flags = 0;
+
+ spin_lock_irqsave(&status->lock, flags);
+ ret = status->value[RA6W_STATUS_BYTE_STATUS] & BIT(RA6W_STATUS_BIT_RX_EMPTY);
+ spin_unlock_irqrestore(&status->lock, flags);
+
+ return ret;
+}
+
+u8 ra6w_status_tx_get(struct ra6w_status *status, u8 ac)
+{
+ u8 ret = 0;
+ u8 value = 0;
+ unsigned long flags = 0;
+
+ spin_lock_irqsave(&status->lock, flags);
+
+ value = status->value[RA6W_STATUS_BYTE_STATUS];
+
+ switch (ac) {
+ case RA6W_TX_DATA_AC:
+ ret = value & BIT(RA6W_STATUS_BIT_TX_AC_FULL);
+ break;
+ case RA6W_TX_DATA_AC_POWER:
+ ret = value & BIT(RA6W_STATUS_BIT_TX_POWER_FULL);
+ break;
+ default:
+ break;
+ }
+
+ spin_unlock_irqrestore(&status->lock, flags);
+
+ return ret;
+}
+
+u8 ra6w_status_tx_avail_cnt_get(struct ra6w_status *status, u8 ac)
+{
+ u8 cnt = 0;
+ unsigned long flags = 0;
+
+ spin_lock_irqsave(&status->lock, flags);
+
+ switch (ac) {
+ case RA6W_TX_DATA_AC:
+ cnt = status->value[RA6W_STATUS_BYTE_TX_AVAIL_CNT];
+ break;
+ case RA6W_TX_DATA_AC_POWER:
+ cnt = status->value[RA6W_STATUS_BYTE_TX_POWER_AVAIL_CNT];
+ break;
+ default:
+ break;
+ }
+
+ spin_unlock_irqrestore(&status->lock, flags);
+
+ return cnt;
+}
+
+int ra6w_status_err_code_to_errno(u8 err)
+{
+ switch (err) {
+ case RA6W_STATUS_CODE_SUCCESS: return 0;
+ case RA6W_STATUS_CODE_FAIL: return -ENOENT;
+ case RA6W_STATUS_CODE_EMPTY: return -ENODATA;
+ case RA6W_STATUS_CODE_FULL: return -EXFULL;
+ case RA6W_STATUS_CODE_INVALID_PARAM: return -EINVAL;
+ case RA6W_STATUS_CODE_NOT_FOUND: return -ENXIO;
+ case RA6W_STATUS_CODE_NO_MORE: return -ENOSPC;
+ case RA6W_STATUS_CODE_NOT_IN_USE: return -ESPIPE;
+ case RA6W_STATUS_CODE_BUSY: return -EBUSY;
+ case RA6W_STATUS_CODE_IN_PROGRESS: return -EINPROGRESS;
+ case RA6W_STATUS_CODE_MEMORY_FAIL: return -ENOMEM;
+ case RA6W_STATUS_CODE_NOT_SUPPORT: return -EOPNOTSUPP;
+ case RA6W_STATUS_CODE_EXIST: return -EEXIST;
+ default: return -EIO;
+ }
+}