diff mbox series

[31/38] ra6w: add status.c

Message ID 20250417135236.52410-32-oleksandr.savchenko.dn@bp.renesas.com
State New
Headers show
Series wireless: ra6w driver for Renesas IEEE 802.11ax devices | expand

Commit Message

Alexander Savchenko April 17, 2025, 1:52 p.m. UTC
Part of the split. Please, take a look at the cover letter for more details

Reviewed-by: Viktor Barna <viktor.barna.rj@bp.renesas.com>
Reviewed-by: Gal Gur <gal.gur.jx@renesas.com>
Signed-off-by: Alexander Savchenko <oleksandr.savchenko.dn@bp.renesas.com>
---
 drivers/net/wireless/renesas/ra6w/status.c | 117 +++++++++++++++++++++
 1 file changed, 117 insertions(+)
 create mode 100644 drivers/net/wireless/renesas/ra6w/status.c
diff mbox series

Patch

diff --git a/drivers/net/wireless/renesas/ra6w/status.c b/drivers/net/wireless/renesas/ra6w/status.c
new file mode 100644
index 000000000000..86427b2be610
--- /dev/null
+++ b/drivers/net/wireless/renesas/ra6w/status.c
@@ -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;
+	}
+}