From 297b60346df8beafee954a0fd7c2d64f33f3b9bc Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 11 May 2024 01:44:05 +0000
Subject: [PATCH] rtl8211F_led_control
---
kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/bcmmsgbuf.h | 607 +++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 544 insertions(+), 63 deletions(-)
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/bcmmsgbuf.h b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/bcmmsgbuf.h
index 6527b61..6ebe60c 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/bcmmsgbuf.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/bcmmsgbuf.h
@@ -1,18 +1,19 @@
-/* SPDX-License-Identifier: GPL-2.0 */
/*
* MSGBUF network driver ioctl/indication encoding
* Broadcom 802.11abg Networking Device Driver
*
* Definitions subject to change without notice.
*
- * Copyright (C) 1999-2019, Broadcom Corporation
- *
+ * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation
+ *
+ * Copyright (C) 1999-2017, Broadcom Corporation
+ *
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to you
* under the terms of the GNU General Public License version 2 (the "GPL"),
* available at http://www.broadcom.com/licenses/GPLv2.php, with the
* following added to such license:
- *
+ *
* As a special exception, the copyright holders of this software give you
* permission to link this software with independent modules, and to copy and
* distribute the resulting executable under terms of your choice, provided that
@@ -20,7 +21,7 @@
* the license of that module. An independent module is a module which is not
* derived from this software. The special exception does not apply to any
* modifications of the software.
- *
+ *
* Notwithstanding the above, under no circumstances may you combine this
* software in any way with any other Broadcom software provided under a license
* other than the GPL, without Broadcom's express prior written consent.
@@ -28,12 +29,12 @@
*
* <<Broadcom-WL-IPTag/Open:>>
*
- * $Id: bcmmsgbuf.h 541060 2015-03-13 23:28:01Z $
+ * $Id$
*/
#ifndef _bcmmsgbuf_h_
#define _bcmmsgbuf_h_
-#include <proto/ethernet.h>
+#include <ethernet.h>
#include <wlioctl.h>
#include <bcmpcie.h>
@@ -48,15 +49,32 @@
#define H2DRING_TXPOST_ITEMSIZE 48
#define H2DRING_RXPOST_ITEMSIZE 32
#define H2DRING_CTRL_SUB_ITEMSIZE 40
-#define D2HRING_TXCMPLT_ITEMSIZE 16
-#define D2HRING_RXCMPLT_ITEMSIZE 32
+
+#define D2HRING_TXCMPLT_ITEMSIZE 24
+#define D2HRING_RXCMPLT_ITEMSIZE 40
+
+#define D2HRING_TXCMPLT_ITEMSIZE_PREREV7 16
+#define D2HRING_RXCMPLT_ITEMSIZE_PREREV7 32
+
#define D2HRING_CTRL_CMPLT_ITEMSIZE 24
+#define H2DRING_INFO_BUFPOST_ITEMSIZE H2DRING_CTRL_SUB_ITEMSIZE
+#define D2HRING_INFO_BUFCMPLT_ITEMSIZE D2HRING_CTRL_CMPLT_ITEMSIZE
+
+#define D2HRING_SNAPSHOT_CMPLT_ITEMSIZE 20
#define H2DRING_TXPOST_MAX_ITEM 512
#define H2DRING_RXPOST_MAX_ITEM 512
#define H2DRING_CTRL_SUB_MAX_ITEM 64
#define D2HRING_TXCMPLT_MAX_ITEM 1024
#define D2HRING_RXCMPLT_MAX_ITEM 512
+
+#define H2DRING_DYNAMIC_INFO_MAX_ITEM 32
+#define D2HRING_DYNAMIC_INFO_MAX_ITEM 32
+
+#define D2HRING_EDL_HDR_SIZE 48u
+#define D2HRING_EDL_ITEMSIZE 2048u
+#define D2HRING_EDL_MAX_ITEM 256u
+#define D2HRING_EDL_WATERMARK (D2HRING_EDL_MAX_ITEM >> 5u)
#define D2HRING_CTRL_CMPLT_MAX_ITEM 64
@@ -74,6 +92,11 @@
};
#define MESSAGE_PAYLOAD(a) (a & MSG_TYPE_INTERNAL_USE_START) ? TRUE : FALSE
+#define PCIEDEV_FIRMWARE_TSINFO 0x1
+#define PCIEDEV_FIRMWARE_TSINFO_FIRST 0x1
+#define PCIEDEV_FIRMWARE_TSINFO_MIDDLE 0x2
+#define PCIEDEV_BTLOG_POST 0x3
+#define PCIEDEV_BT_SNAPSHOT_POST 0x4
#ifdef PCIE_API_REV1
@@ -136,12 +159,16 @@
/** message type */
typedef enum bcmpcie_msgtype {
- MSG_TYPE_GEN_STATUS = 0x1,
+ MSG_TYPE_GEN_STATUS = 0x1,
MSG_TYPE_RING_STATUS = 0x2,
MSG_TYPE_FLOW_RING_CREATE = 0x3,
MSG_TYPE_FLOW_RING_CREATE_CMPLT = 0x4,
+ /* Enum value as copied from BISON 7.15: new generic message */
+ MSG_TYPE_RING_CREATE_CMPLT = 0x4,
MSG_TYPE_FLOW_RING_DELETE = 0x5,
MSG_TYPE_FLOW_RING_DELETE_CMPLT = 0x6,
+ /* Enum value as copied from BISON 7.15: new generic message */
+ MSG_TYPE_RING_DELETE_CMPLT = 0x6,
MSG_TYPE_FLOW_RING_FLUSH = 0x7,
MSG_TYPE_FLOW_RING_FLUSH_CMPLT = 0x8,
MSG_TYPE_IOCTLPTR_REQ = 0x9,
@@ -154,7 +181,7 @@
MSG_TYPE_TX_STATUS = 0x10,
MSG_TYPE_RXBUF_POST = 0x11,
MSG_TYPE_RX_CMPLT = 0x12,
- MSG_TYPE_LPBK_DMAXFER = 0x13,
+ MSG_TYPE_LPBK_DMAXFER = 0x13,
MSG_TYPE_LPBK_DMAXFER_CMPLT = 0x14,
MSG_TYPE_FLOW_RING_RESUME = 0x15,
MSG_TYPE_FLOW_RING_RESUME_CMPLT = 0x16,
@@ -172,7 +199,16 @@
MSG_TYPE_D2H_RING_CONFIG_CMPLT = 0x22,
MSG_TYPE_H2D_MAILBOX_DATA = 0x23,
MSG_TYPE_D2H_MAILBOX_DATA = 0x24,
-
+ MSG_TYPE_TIMSTAMP_BUFPOST = 0x25,
+ MSG_TYPE_HOSTTIMSTAMP = 0x26,
+ MSG_TYPE_HOSTTIMSTAMP_CMPLT = 0x27,
+ MSG_TYPE_FIRMWARE_TIMESTAMP = 0x28,
+ MSG_TYPE_SNAPSHOT_UPLOAD = 0x29,
+ MSG_TYPE_SNAPSHOT_CMPLT = 0x2A,
+ MSG_TYPE_H2D_RING_DELETE = 0x2B,
+ MSG_TYPE_D2H_RING_DELETE = 0x2C,
+ MSG_TYPE_H2D_RING_DELETE_CMPLT = 0x2D,
+ MSG_TYPE_D2H_RING_DELETE_CMPLT = 0x2E,
MSG_TYPE_API_MAX_RSVD = 0x3F
} bcmpcie_msg_type_t;
@@ -184,7 +220,14 @@
MSG_TYPE_HOST_FETCH = 0x44,
MSG_TYPE_LPBK_DMAXFER_PYLD = 0x45,
MSG_TYPE_TXMETADATA_PYLD = 0x46,
- MSG_TYPE_INDX_UPDATE = 0x47
+ MSG_TYPE_INDX_UPDATE = 0x47,
+ MSG_TYPE_INFO_PYLD = 0x48,
+ MSG_TYPE_TS_EVENT_PYLD = 0x49,
+ MSG_TYPE_PVT_BTLOG_CMPLT = 0x4A,
+ MSG_TYPE_BTLOG_PYLD = 0x4B,
+ MSG_TYPE_HMAPTEST_PYLD = 0x4C,
+ MSG_TYPE_PVT_BT_SNAPSHOT_CMPLT = 0x4D,
+ MSG_TYPE_BT_SNAPSHOT_PYLD = 0x4E
} bcmpcie_msgtype_int_t;
typedef enum bcmpcie_msgtype_u {
@@ -212,6 +255,44 @@
uint16 msecs; /* interrupt coalescing: timeout in millisecs */
} bcmpcie_soft_doorbell_t;
+/**
+ * D2H interrupt using MSI instead of INTX
+ * Host configures MSI vector offset for each D2H interrupt
+ *
+ * D2H_RING_CONFIG_SUBTYPE_MSI_DOORBELL
+ */
+typedef enum bcmpcie_msi_intr_idx {
+ MSI_INTR_IDX_CTRL_CMPL_RING = 0,
+ MSI_INTR_IDX_TXP_CMPL_RING = 1,
+ MSI_INTR_IDX_RXP_CMPL_RING = 2,
+ MSI_INTR_IDX_INFO_CMPL_RING = 3,
+ MSI_INTR_IDX_MAILBOX = 4,
+ MSI_INTR_IDX_MAX = 5
+} bcmpcie_msi_intr_idx_t;
+
+#define BCMPCIE_D2H_MSI_OFFSET_SINGLE 0
+typedef enum bcmpcie_msi_offset_type {
+ BCMPCIE_D2H_MSI_OFFSET_MB0 = 2,
+ BCMPCIE_D2H_MSI_OFFSET_MB1 = 3,
+ BCMPCIE_D2H_MSI_OFFSET_DB0 = 4,
+ BCMPCIE_D2H_MSI_OFFSET_DB1 = 5,
+ BCMPCIE_D2H_MSI_OFFSET_H1_DB0 = 6,
+ BCMPCIE_D2H_MSI_OFFSET_MAX = 7
+} bcmpcie_msi_offset_type_t;
+
+typedef struct bcmpcie_msi_offset {
+ uint16 intr_idx; /* interrupt index */
+ uint16 msi_offset; /* msi vector offset */
+} bcmpcie_msi_offset_t;
+
+typedef struct bcmpcie_msi_offset_config {
+ uint32 len;
+ bcmpcie_msi_offset_t bcmpcie_msi_offset[MSI_INTR_IDX_MAX];
+} bcmpcie_msi_offset_config_t;
+
+#define BCMPCIE_D2H_MSI_OFFSET_DEFAULT BCMPCIE_D2H_MSI_OFFSET_DB1
+
+#define BCMPCIE_D2H_MSI_SINGLE 0xFFFE
/* if_id */
#define BCMPCIE_CMNHDR_IFIDX_PHYINTF_SHFT 5
@@ -226,13 +307,14 @@
/* flags */
#define BCMPCIE_CMNHDR_FLAGS_DMA_R_IDX 0x1
#define BCMPCIE_CMNHDR_FLAGS_DMA_R_IDX_INTR 0x2
+#define BCMPCIE_CMNHDR_FLAGS_TS_SEQNUM_INIT 0x4
#define BCMPCIE_CMNHDR_FLAGS_PHASE_BIT 0x80
-
+#define BCMPCIE_CMNHDR_PHASE_BIT_INIT 0x80
/* IOCTL request message */
typedef struct ioctl_req_msg {
/** common message header */
- cmn_msg_hdr_t cmn_hdr;
+ cmn_msg_hdr_t cmn_hdr;
/** ioctl command type */
uint32 cmd;
/** ioctl transaction ID, to pair with a ioctl response */
@@ -262,6 +344,76 @@
uint32 rsvd[4];
} ioctl_resp_evt_buf_post_msg_t;
+/* buffer post messages for device to use to return dbg buffers */
+typedef ioctl_resp_evt_buf_post_msg_t info_buf_post_msg_t;
+
+#define DHD_INFOBUF_RX_BUFPOST_PKTSZ (2 * 1024)
+
+#define DHD_BTLOG_RX_BUFPOST_PKTSZ (2 * 1024)
+
+/* An infobuf host buffer starts with a 32 bit (LE) version. */
+#define PCIE_INFOBUF_V1 1
+/* Infobuf v1 type MSGTRACE's data is exactly the same as the MSGTRACE data that
+ * is wrapped previously/also in a WLC_E_TRACE event. See structure
+ * msgrace_hdr_t in msgtrace.h.
+*/
+#define PCIE_INFOBUF_V1_TYPE_MSGTRACE 1
+
+/* Infobuf v1 type LOGTRACE data is exactly the same as the LOGTRACE data that
+ * is wrapped previously/also in a WLC_E_TRACE event. See structure
+ * msgrace_hdr_t in msgtrace.h. (The only difference between a MSGTRACE
+ * and a LOGTRACE is the "trace type" field.)
+*/
+#define PCIE_INFOBUF_V1_TYPE_LOGTRACE 2
+
+/* An infobuf version 1 host buffer has a single TLV. The information on the
+ * version 1 types follow this structure definition. (int's LE)
+*/
+typedef struct info_buf_payload_hdr_s {
+ uint16 type;
+ uint16 length;
+} info_buf_payload_hdr_t;
+
+/* BT logs/memory to DMA directly from BT memory to host */
+typedef struct info_buf_btlog_s {
+ void (*status_cb)(void *ctx, void *p, int error); /* obsolete - to be removed */
+ void *ctx;
+ dma64addr_t src_addr;
+ uint32 length;
+ bool (*pcie_status_cb)(osl_t *osh, void *p, int error);
+ uint32 bt_intstatus;
+ int error;
+} info_buf_btlog_t;
+
+/** snapshot upload request message */
+typedef struct snapshot_upload_request_msg {
+ /** common message header */
+ cmn_msg_hdr_t cmn_hdr;
+ /** length of the snaphost buffer supplied */
+ uint32 snapshot_buf_len;
+ /** type of snapshot */
+ uint8 snapshot_type;
+ /** snapshot param */
+ uint8 snapshot_param;
+ /** to align the host address on 8 byte boundary */
+ uint8 reserved[2];
+ /** always align on 8 byte boundary */
+ bcm_addr64_t host_buf_addr;
+ uint32 rsvd[4];
+} snapshot_upload_request_msg_t;
+
+/** snapshot types */
+typedef enum bcmpcie_snapshot_type {
+ SNAPSHOT_TYPE_BT = 0, /* Bluetooth SRAM and patch RAM */
+ SNAPSHOT_TYPE_WLAN_SOCRAM = 1, /* WLAN SOCRAM */
+ SNAPSHOT_TYPE_WLAN_HEAP = 2, /* WLAN HEAP */
+ SNAPSHOT_TYPE_WLAN_REGISTER = 3 /* WLAN registers */
+} bcmpcie_snapshot_type_t;
+
+#define PCIE_DMA_XFER_FLG_D11_LPBK_MASK 0xF
+#define PCIE_DMA_XFER_FLG_D11_LPBK_SHIFT 2
+#define PCIE_DMA_XFER_FLG_CORE_NUMBER_MASK 3
+#define PCIE_DMA_XFER_FLG_CORE_NUMBER_SHIFT 0
typedef struct pcie_dma_xfer_params {
/** common message header */
@@ -279,20 +431,26 @@
uint32 srcdelay;
/** delay before doing the dest txfer */
uint32 destdelay;
- uint32 rsvd;
+ uint8 rsvd[3];
+ /* bit0: D11 DMA loopback flag */
+ uint8 flags;
} pcie_dma_xfer_params_t;
+#define BCMPCIE_FLOW_RING_INTF_HP2P 0x1
/** Complete msgbuf hdr for flow ring update from host to dongle */
typedef struct tx_flowring_create_request {
cmn_msg_hdr_t msg;
uint8 da[ETHER_ADDR_LEN];
uint8 sa[ETHER_ADDR_LEN];
uint8 tid;
- uint8 if_flags;
+ uint8 if_flags;
uint16 flow_ring_id;
- uint8 tc;
- uint8 priority;
- uint16 int_vector;
+ uint8 tc;
+ /* priority_ifrmmask is to define core mask in ifrm mode.
+ * currently it is not used for priority. so uses solely for ifrm mask
+ */
+ uint8 priority_ifrmmask;
+ uint16 int_vector;
uint16 max_items;
uint16 len_item;
bcm_addr64_t flow_ring_ptr;
@@ -301,14 +459,17 @@
typedef struct tx_flowring_delete_request {
cmn_msg_hdr_t msg;
uint16 flow_ring_id;
- uint16 reason;
+ uint16 reason;
uint32 rsvd[7];
} tx_flowring_delete_request_t;
+
+typedef tx_flowring_delete_request_t d2h_ring_delete_req_t;
+typedef tx_flowring_delete_request_t h2d_ring_delete_req_t;
typedef struct tx_flowring_flush_request {
cmn_msg_hdr_t msg;
uint16 flow_ring_id;
- uint16 reason;
+ uint16 reason;
uint32 rsvd[7];
} tx_flowring_flush_request_t;
@@ -328,8 +489,73 @@
uint32 data[6];
/** D2H_RING_CONFIG_SUBTYPE_SOFT_DOORBELL */
bcmpcie_soft_doorbell_t soft_doorbell;
+ /** D2H_RING_CONFIG_SUBTYPE_MSI_DOORBELL */
+ bcmpcie_msi_offset_config_t msi_offset;
};
} ring_config_req_t;
+
+/* data structure to use to create on the fly d2h rings */
+typedef struct d2h_ring_create_req {
+ cmn_msg_hdr_t msg;
+ uint16 ring_id;
+ uint16 ring_type;
+ uint32 flags;
+ bcm_addr64_t ring_ptr;
+ uint16 max_items;
+ uint16 len_item;
+ uint32 rsvd[3];
+} d2h_ring_create_req_t;
+
+/* data structure to use to create on the fly h2d rings */
+#define MAX_COMPLETION_RING_IDS_ASSOCIATED 4
+typedef struct h2d_ring_create_req {
+ cmn_msg_hdr_t msg;
+ uint16 ring_id;
+ uint8 ring_type;
+ uint8 n_completion_ids;
+ uint32 flags;
+ bcm_addr64_t ring_ptr;
+ uint16 max_items;
+ uint16 len_item;
+ uint16 completion_ring_ids[MAX_COMPLETION_RING_IDS_ASSOCIATED];
+ uint32 rsvd;
+} h2d_ring_create_req_t;
+
+typedef struct d2h_ring_config_req {
+ cmn_msg_hdr_t msg;
+ uint16 d2h_ring_config_subtype;
+ uint16 d2h_ring_id;
+ uint32 d2h_ring_config_data[4];
+ uint32 rsvd[3];
+} d2h_ring_config_req_t;
+
+typedef struct h2d_ring_config_req {
+ cmn_msg_hdr_t msg;
+ uint16 h2d_ring_config_subtype;
+ uint16 h2d_ring_id;
+ uint32 h2d_ring_config_data;
+ uint32 rsvd[6];
+} h2d_ring_config_req_t;
+
+typedef struct h2d_mailbox_data {
+ cmn_msg_hdr_t msg;
+ uint32 mail_box_data;
+ uint32 rsvd[7];
+} h2d_mailbox_data_t;
+typedef struct host_timestamp_msg {
+ cmn_msg_hdr_t msg;
+ uint16 xt_id; /* transaction ID */
+ uint16 input_data_len; /* data len at the host_buf_addr, data in TLVs */
+ uint16 seqnum; /* number of times host captured the timestamp */
+ uint16 rsvd;
+ /* always align on 8 byte boundary */
+ bcm_addr64_t host_buf_addr;
+ /* rsvd */
+ uint32 rsvd1[4];
+} host_timestamp_msg_t;
+
+/* buffer post message for timestamp events MSG_TYPE_TIMSTAMP_BUFPOST */
+typedef ioctl_resp_evt_buf_post_msg_t ts_buf_post_msg_t;
typedef union ctrl_submit_item {
ioctl_req_msg_t ioctl_req;
@@ -339,19 +565,77 @@
tx_flowring_delete_request_t flow_delete;
tx_flowring_flush_request_t flow_flush;
ring_config_req_t ring_config_req;
+ d2h_ring_create_req_t d2h_create;
+ h2d_ring_create_req_t h2d_create;
+ d2h_ring_config_req_t d2h_config;
+ h2d_ring_config_req_t h2d_config;
+ h2d_mailbox_data_t h2d_mailbox_data;
+ host_timestamp_msg_t host_ts;
+ ts_buf_post_msg_t ts_buf_post;
+ d2h_ring_delete_req_t d2h_delete;
+ h2d_ring_delete_req_t h2d_delete;
unsigned char check[H2DRING_CTRL_SUB_ITEMSIZE];
} ctrl_submit_item_t;
+
+typedef struct info_ring_submit_item {
+ info_buf_post_msg_t info_buf_post;
+ unsigned char check[H2DRING_INFO_BUFPOST_ITEMSIZE];
+} info_sumbit_item_t;
/** Control Completion messages (20 bytes) */
typedef struct compl_msg_hdr {
/** status for the completion */
int16 status;
/** submisison flow ring id which generated this status */
- uint16 flow_ring_id;
+ union {
+ uint16 ring_id;
+ uint16 flow_ring_id;
+ };
} compl_msg_hdr_t;
/** XOR checksum or a magic number to audit DMA done */
typedef uint32 dma_done_t;
+
+#define MAX_CLKSRC_ID 0xF
+#define TX_PKT_RETRY_CNT_0_MASK 0x000000FF
+#define TX_PKT_RETRY_CNT_0_SHIFT 0
+#define TX_PKT_RETRY_CNT_1_MASK 0x0000FF00
+#define TX_PKT_RETRY_CNT_1_SHIFT 8
+#define TX_PKT_RETRY_CNT_2_MASK 0x00FF0000
+#define TX_PKT_RETRY_CNT_2_SHIFT 16
+#define TX_PKT_BAND_INFO 0x0F000000
+#define TX_PKT_BAND_INFO_SHIFT 24
+#define TX_PKT_VALID_INFO 0xF0000000
+#define TX_PKT_VALID_INFO_SHIFT 28
+
+typedef struct ts_timestamp_srcid {
+ union {
+ uint32 ts_low; /* time stamp low 32 bits */
+ uint32 rate_spec; /* use ratespec */
+ };
+ union {
+ uint32 ts_high; /* time stamp high 28 bits */
+ union {
+ uint32 ts_high_ext :28; /* time stamp high 28 bits */
+ uint32 clk_id_ext :3; /* clock ID source */
+ uint32 phase :1; /* Phase bit */
+ dma_done_t marker_ext;
+ };
+ uint32 tx_pkt_band_retry_info;
+ };
+} ts_timestamp_srcid_t;
+
+typedef ts_timestamp_srcid_t ipc_timestamp_t;
+
+typedef struct ts_timestamp {
+ uint32 low;
+ uint32 high;
+} ts_timestamp_t;
+
+typedef ts_timestamp_t tick_count_64_t;
+typedef ts_timestamp_t ts_timestamp_ns_64_t;
+typedef ts_timestamp_t ts_correction_m_t;
+typedef ts_timestamp_t ts_correction_b_t;
/* completion header status codes */
#define BCMPCIE_SUCCESS 0
@@ -366,6 +650,19 @@
#define BCMPCIE_NO_IOCTLRESP_BUF 9
#define BCMPCIE_MAX_IOCTLRESP_BUF 10
#define BCMPCIE_MAX_EVENT_BUF 11
+#define BCMPCIE_BAD_PHASE 12
+#define BCMPCIE_INVALID_CPL_RINGID 13
+#define BCMPCIE_RING_TYPE_INVALID 14
+#define BCMPCIE_NO_TS_EVENT_BUF 15
+#define BCMPCIE_MAX_TS_EVENT_BUF 16
+#define BCMPCIE_PCIE_NO_BTLOG_BUF 17
+#define BCMPCIE_BT_DMA_ERR 18
+#define BCMPCIE_BT_DMA_DESCR_FETCH_ERR 19
+#define BCMPCIE_SNAPSHOT_ERR 20
+#define BCMPCIE_NOT_READY 21
+#define BCMPCIE_INVALID_DATA 22
+#define BCMPCIE_NO_RESPONSE 23
+#define BCMPCIE_NO_CLOCK 24
/** IOCTL completion response */
typedef struct ioctl_compl_resp_msg {
@@ -388,7 +685,7 @@
/** common message header */
cmn_msg_hdr_t cmn_hdr;
/** completion message header */
- compl_msg_hdr_t compl_hdr;
+ compl_msg_hdr_t compl_hdr;
/** cmd id */
uint32 cmd;
uint32 rsvd;
@@ -447,25 +744,33 @@
dma_done_t marker;
} pcie_ring_status_t;
-typedef struct tx_flowring_create_response {
- cmn_msg_hdr_t msg;
- compl_msg_hdr_t cmplt;
+typedef struct ring_create_response {
+ cmn_msg_hdr_t cmn_hdr;
+ compl_msg_hdr_t cmplt;
uint32 rsvd[2];
/** XOR checksum or a magic number to audit DMA done */
dma_done_t marker;
-} tx_flowring_create_response_t;
+} ring_create_response_t;
+
+typedef ring_create_response_t tx_flowring_create_response_t;
+typedef ring_create_response_t h2d_ring_create_response_t;
+typedef ring_create_response_t d2h_ring_create_response_t;
typedef struct tx_flowring_delete_response {
cmn_msg_hdr_t msg;
- compl_msg_hdr_t cmplt;
- uint32 rsvd[2];
+ compl_msg_hdr_t cmplt;
+ uint16 read_idx;
+ uint16 rsvd[3];
/** XOR checksum or a magic number to audit DMA done */
dma_done_t marker;
} tx_flowring_delete_response_t;
+typedef tx_flowring_delete_response_t h2d_ring_delete_response_t;
+typedef tx_flowring_delete_response_t d2h_ring_delete_response_t;
+
typedef struct tx_flowring_flush_response {
cmn_msg_hdr_t msg;
- compl_msg_hdr_t cmplt;
+ compl_msg_hdr_t cmplt;
uint32 rsvd[2];
/** XOR checksum or a magic number to audit DMA done */
dma_done_t marker;
@@ -487,10 +792,80 @@
cmn_msg_hdr_t cmn_hdr;
/** completion message header */
compl_msg_hdr_t compl_hdr;
- uint32 rsvd[2];
+ uint16 subtype;
+ uint16 rsvd[3];
/** XOR checksum or a magic number to audit DMA done */
dma_done_t marker;
} ring_config_resp_t;
+
+typedef struct d2h_mailbox_data {
+ cmn_msg_hdr_t msg;
+ compl_msg_hdr_t cmplt;
+ uint32 d2h_mailbox_data;
+ uint32 rsvd[1];
+ /* XOR checksum or a magic number to audit DMA done */
+ dma_done_t marker;
+} d2h_mailbox_data_t;
+
+/* dbg buf completion msg: send from device to host */
+typedef struct info_buf_resp {
+ /* common message header */
+ cmn_msg_hdr_t cmn_hdr;
+ /* completion message header */
+ compl_msg_hdr_t compl_hdr;
+ /* event data len valid with the event buffer */
+ uint16 info_data_len;
+ /* sequence number */
+ uint16 seqnum;
+ /* destination */
+ uint8 dest;
+ /* rsvd */
+ uint8 rsvd[3];
+ /* XOR checksum or a magic number to audit DMA done */
+ dma_done_t marker;
+} info_buf_resp_t;
+
+/* snapshot completion msg: send from device to host */
+typedef struct snapshot_resp {
+ /* common message header */
+ cmn_msg_hdr_t cmn_hdr;
+ /* completion message header */
+ compl_msg_hdr_t compl_hdr;
+ /* snapshot length uploaded */
+ uint32 resp_len;
+ /* snapshot type */
+ uint8 type;
+ /* rsvd */
+ uint8 rsvd[3];
+ /* XOR checksum or a magic number to audit DMA done */
+ dma_done_t marker;
+} snapshot_resp_t;
+
+typedef struct info_ring_cpl_item {
+ info_buf_resp_t info_buf_post;
+ unsigned char check[D2HRING_INFO_BUFCMPLT_ITEMSIZE];
+} info_cpl_item_t;
+
+typedef struct host_timestamp_msg_cpl {
+ cmn_msg_hdr_t msg;
+ compl_msg_hdr_t cmplt;
+ uint16 xt_id; /* transaction ID */
+ uint16 rsvd;
+ uint32 rsvd1;
+ /* XOR checksum or a magic number to audit DMA done */
+ dma_done_t marker;
+} host_timestamp_msg_cpl_t;
+
+typedef struct fw_timestamp_event_msg {
+ cmn_msg_hdr_t msg;
+ compl_msg_hdr_t cmplt;
+ /* fw captures time stamp info and passed that to host in TLVs */
+ uint16 buf_len; /* length of the time stamp data copied in host buf */
+ uint16 seqnum; /* number of times fw captured time stamp */
+ uint32 rsvd;
+ /* XOR checksum or a magic number to audit DMA done */
+ dma_done_t marker;
+} fw_timestamp_event_msg_t;
typedef union ctrl_completion_item {
ioctl_comp_resp_msg_t ioctl_resp;
@@ -504,7 +879,15 @@
tx_flowring_flush_response_t txfl_flush_resp;
ctrl_compl_msg_t ctrl_compl;
ring_config_resp_t ring_config_resp;
- unsigned char check[D2HRING_CTRL_CMPLT_ITEMSIZE];
+ d2h_mailbox_data_t d2h_mailbox_data;
+ info_buf_resp_t dbg_resp;
+ h2d_ring_create_response_t h2d_ring_create_resp;
+ d2h_ring_create_response_t d2h_ring_create_resp;
+ host_timestamp_msg_cpl_t host_ts_cpl;
+ fw_timestamp_event_msg_t fw_ts_event;
+ h2d_ring_delete_response_t h2d_ring_delete_resp;
+ d2h_ring_delete_response_t d2h_ring_delete_resp;
+ unsigned char ctrl_response[D2HRING_CTRL_CMPLT_ITEMSIZE];
} ctrl_completion_item_t;
/** H2D Rxpost ring work items */
@@ -528,8 +911,7 @@
unsigned char check[H2DRING_RXPOST_ITEMSIZE];
} rxbuf_submit_item_t;
-
-/** D2H Rxcompletion ring work items */
+/* D2H Rxcompletion ring work items for IPC rev7 */
typedef struct host_rxbuf_cmpl {
/** common message header */
cmn_msg_hdr_t cmn_hdr;
@@ -541,20 +923,22 @@
uint16 data_len;
/** offset in the host rx buffer where the data starts */
uint16 data_offset;
- /** offset in the host rx buffer where the data starts */
+ /** Flags */
uint16 flags;
/** rx status */
uint32 rx_status_0;
uint32 rx_status_1;
/** XOR checksum or a magic number to audit DMA done */
+ /* This is for rev6 only. For IPC rev7, this is a reserved field */
dma_done_t marker;
+ /* timestamp */
+ ipc_timestamp_t ts;
} host_rxbuf_cmpl_t;
typedef union rxbuf_complete_item {
host_rxbuf_cmpl_t rxcmpl;
unsigned char check[D2HRING_RXCMPLT_ITEMSIZE];
} rxbuf_complete_item_t;
-
typedef struct host_txbuf_post {
/** common message header */
@@ -574,19 +958,41 @@
uint16 metadata_buf_len;
/** provided data buffer len to receive data */
uint16 data_len;
- /** XOR checksum or a magic number to audit DMA done */
- dma_done_t marker;
+ union {
+ struct {
+ /** extended transmit flags */
+ uint8 ext_flags;
+ uint8 rsvd1;
+
+ /** user defined rate */
+ uint8 rate;
+ uint8 exp_time;
+ };
+ /** XOR checksum or a magic number to audit DMA done */
+ dma_done_t marker;
+ };
} host_txbuf_post_t;
#define BCMPCIE_PKT_FLAGS_FRAME_802_3 0x01
#define BCMPCIE_PKT_FLAGS_FRAME_802_11 0x02
+#define BCMPCIE_PKT_FLAGS_FRAME_NORETRY 0x01 /* Disable retry on this frame */
+#define BCMPCIE_PKT_FLAGS_FRAME_NOAGGR 0x02 /* Disable aggregation for this frame */
+#define BCMPCIE_PKT_FLAGS_FRAME_UDR 0x04 /* User defined rate for this frame */
+#define BCMPCIE_PKT_FLAGS_FRAME_ATTR_MASK 0x07 /* Attribute mask */
+
#define BCMPCIE_PKT_FLAGS_FRAME_EXEMPT_MASK 0x03 /* Exempt uses 2 bits */
#define BCMPCIE_PKT_FLAGS_FRAME_EXEMPT_SHIFT 0x02 /* needs to be shifted past other bits */
-
#define BCMPCIE_PKT_FLAGS_PRIO_SHIFT 5
#define BCMPCIE_PKT_FLAGS_PRIO_MASK (7 << BCMPCIE_PKT_FLAGS_PRIO_SHIFT)
+#define BCMPCIE_PKT_FLAGS_MONITOR_NO_AMSDU 0x00
+#define BCMPCIE_PKT_FLAGS_MONITOR_FIRST_PKT 0x01
+#define BCMPCIE_PKT_FLAGS_MONITOR_INTER_PKT 0x02
+#define BCMPCIE_PKT_FLAGS_MONITOR_LAST_PKT 0x03
+#define BCMPCIE_PKT_FLAGS_NO_FORWARD 0x04
+#define BCMPCIE_PKT_FLAGS_MONITOR_SHIFT 8
+#define BCMPCIE_PKT_FLAGS_MONITOR_MASK (3 << BCMPCIE_PKT_FLAGS_MONITOR_SHIFT)
/* These are added to fix up compile issues */
#define BCMPCIE_TXPOST_FLAGS_FRAME_802_3 BCMPCIE_PKT_FLAGS_FRAME_802_3
@@ -594,13 +1000,13 @@
#define BCMPCIE_TXPOST_FLAGS_PRIO_SHIFT BCMPCIE_PKT_FLAGS_PRIO_SHIFT
#define BCMPCIE_TXPOST_FLAGS_PRIO_MASK BCMPCIE_PKT_FLAGS_PRIO_MASK
-/** H2D Txpost ring work items */
+/* H2D Txpost ring work items */
typedef union txbuf_submit_item {
host_txbuf_post_t txpost;
unsigned char check[H2DRING_TXPOST_ITEMSIZE];
} txbuf_submit_item_t;
-/** D2H Txcompletion ring work items */
+/* D2H Txcompletion ring work items - extended for IOC rev7 */
typedef struct host_txbuf_cmpl {
/** common message header */
cmn_msg_hdr_t cmn_hdr;
@@ -608,14 +1014,22 @@
compl_msg_hdr_t compl_hdr;
union {
struct {
- /** provided meta data len */
- uint16 metadata_len;
+ union {
+ /** provided meta data len */
+ uint16 metadata_len;
+ /** provided extended TX status */
+ uint16 tx_status_ext;
+ };
/** WLAN side txstatus */
uint16 tx_status;
};
/** XOR checksum or a magic number to audit DMA done */
+ /* This is for rev6 only. For IPC rev7, this is not used */
dma_done_t marker;
};
+ /* timestamp */
+ ipc_timestamp_t ts;
+
} host_txbuf_cmpl_t;
typedef union txbuf_complete_item {
@@ -632,20 +1046,19 @@
uint32 high_addr;
} ret_buf_t;
-
#ifdef PCIE_API_REV1
/* ioctl specific hdr */
typedef struct ioctl_hdr {
- uint16 cmd;
+ uint16 cmd;
uint16 retbuf_len;
uint32 cmd_id;
} ioctl_hdr_t;
typedef struct ioctlptr_hdr {
- uint16 cmd;
+ uint16 cmd;
uint16 retbuf_len;
- uint16 buflen;
+ uint16 buflen;
uint16 rsvd;
uint32 cmd_id;
} ioctlptr_hdr_t;
@@ -654,15 +1067,14 @@
typedef struct ioctl_req_hdr {
uint32 pkt_id; /**< Packet ID */
- uint32 cmd; /**< IOCTL ID */
+ uint32 cmd; /**< IOCTL ID */
uint16 retbuf_len;
- uint16 buflen;
+ uint16 buflen;
uint16 xt_id; /**< transaction ID */
uint16 rsvd[1];
} ioctl_req_hdr_t;
#endif /* PCIE_API_REV1 */
-
/** Complete msgbuf hdr for ioctl from host to dongle */
typedef struct ioct_reqst_hdr {
@@ -671,7 +1083,7 @@
ioctl_hdr_t ioct_hdr;
#else
ioctl_req_hdr_t ioct_hdr;
-#endif
+#endif // endif
ret_buf_t ret_buf;
} ioct_reqst_hdr_t;
@@ -681,7 +1093,7 @@
ioctlptr_hdr_t ioct_hdr;
#else
ioctl_req_hdr_t ioct_hdr;
-#endif
+#endif // endif
ret_buf_t ret_buf;
ret_buf_t ioct_buf;
} ioctptr_reqst_hdr_t;
@@ -693,7 +1105,7 @@
uint32 cmd_id;
#else
uint32 pkt_id;
-#endif
+#endif // endif
uint32 status;
uint32 ret_len;
uint32 inline_data;
@@ -701,7 +1113,7 @@
#else
uint16 xt_id; /**< transaction ID */
uint16 rsvd[1];
-#endif
+#endif // endif
} ioct_resp_hdr_t;
/* ioct resp header used in dongle */
@@ -835,30 +1247,99 @@
#define MAX_SUSPEND_REQ 15
typedef struct tx_idle_flowring_suspend_request {
- cmn_msg_hdr_t msg;
- uint16 ring_id[MAX_SUSPEND_REQ]; /**< ring Id's */
- uint16 num; /**< number of flowid's to suspend */
+ cmn_msg_hdr_t msg;
+ uint16 ring_id[MAX_SUSPEND_REQ]; /* ring Id's */
+ uint16 num; /* number of flowid's to suspend */
} tx_idle_flowring_suspend_request_t;
typedef struct tx_idle_flowring_suspend_response {
- cmn_msg_hdr_t msg;
- compl_msg_hdr_t cmplt;
+ cmn_msg_hdr_t msg;
+ compl_msg_hdr_t cmplt;
uint32 rsvd[2];
dma_done_t marker;
} tx_idle_flowring_suspend_response_t;
typedef struct tx_idle_flowring_resume_request {
- cmn_msg_hdr_t msg;
+ cmn_msg_hdr_t msg;
uint16 flow_ring_id;
uint16 reason;
uint32 rsvd[7];
} tx_idle_flowring_resume_request_t;
typedef struct tx_idle_flowring_resume_response {
- cmn_msg_hdr_t msg;
- compl_msg_hdr_t cmplt;
+ cmn_msg_hdr_t msg;
+ compl_msg_hdr_t cmplt;
uint32 rsvd[2];
dma_done_t marker;
} tx_idle_flowring_resume_response_t;
+/* timesync related additions */
+
+typedef struct _bcm_xtlv {
+ uint16 id; /* TLV idenitifier */
+ uint16 len; /* TLV length in bytes */
+} _bcm_xtlv_t;
+
+#define BCMMSGBUF_FW_CLOCK_INFO_TAG 0
+#define BCMMSGBUF_HOST_CLOCK_INFO_TAG 1
+#define BCMMSGBUF_HOST_CLOCK_SELECT_TAG 2
+#define BCMMSGBUF_D2H_CLOCK_CORRECTION_TAG 3
+#define BCMMSGBUF_HOST_TIMESTAMPING_CONFIG_TAG 4
+#define BCMMSGBUF_MAX_TSYNC_TAG 5
+
+/* Flags in fw clock info TLV */
+#define CAP_DEVICE_TS (1 << 0)
+#define CAP_CORRECTED_TS (1 << 1)
+#define TS_CLK_ACTIVE (1 << 2)
+
+typedef struct ts_fw_clock_info {
+ _bcm_xtlv_t xtlv; /* BCMMSGBUF_FW_CLOCK_INFO_TAG */
+ ts_timestamp_srcid_t ts; /* tick count */
+ uchar clk_src[4]; /* clock source acronym ILP/AVB/TSF */
+ uint32 nominal_clock_freq;
+ uint32 reset_cnt;
+ uint8 flags;
+ uint8 rsvd[3];
+} ts_fw_clock_info_t;
+
+typedef struct ts_host_clock_info {
+ _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_CLOCK_INFO_TAG */
+ tick_count_64_t ticks; /* 64 bit host tick counter */
+ ts_timestamp_ns_64_t ns; /* 64 bit host time in nano seconds */
+} ts_host_clock_info_t;
+
+typedef struct ts_host_clock_sel {
+ _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_CLOCK_SELECT_TAG */
+ uint32 seqnum; /* number of times GPIO time sync toggled */
+ uint8 min_clk_idx; /* clock idenitifer configured for packet tiem stamping */
+ uint8 max_clk_idx; /* clock idenitifer configured for packet tiem stamping */
+ uint16 rsvd[1];
+} ts_host_clock_sel_t;
+
+typedef struct ts_d2h_clock_correction {
+ _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_CLOCK_INFO_TAG */
+ uint8 clk_id; /* clock source in the device */
+ uint8 rsvd[3];
+ ts_correction_m_t m; /* y = 'm' x + b */
+ ts_correction_b_t b; /* y = 'm' x + 'c' */
+} ts_d2h_clock_correction_t;
+
+typedef struct ts_host_timestamping_config {
+ _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_TIMESTAMPING_CONFIG_TAG */
+ /* time period to capture the device time stamp and toggle WLAN_TIME_SYNC_GPIO */
+ uint16 period_ms;
+ uint8 flags;
+ uint8 post_delay;
+ uint32 reset_cnt;
+} ts_host_timestamping_config_t;
+
+/* Flags in host timestamping config TLV */
+#define FLAG_HOST_RESET (1 << 0)
+#define IS_HOST_RESET(x) ((x) & FLAG_HOST_RESET)
+#define CLEAR_HOST_RESET(x) ((x) & ~FLAG_HOST_RESET)
+
+#define FLAG_CONFIG_NODROP (1 << 1)
+#define IS_CONFIG_NODROP(x) ((x) & FLAG_CONFIG_NODROP)
+#define CLEAR_CONFIG_NODROP(x) ((x) & ~FLAG_CONFIG_NODROP)
+
#endif /* _bcmmsgbuf_h_ */
--
Gitblit v1.6.2