0001
0002
0003
0004 #ifndef _IAVF_ADMINQ_H_
0005 #define _IAVF_ADMINQ_H_
0006
0007 #include "iavf_osdep.h"
0008 #include "iavf_status.h"
0009 #include "iavf_adminq_cmd.h"
0010
0011 #define IAVF_ADMINQ_DESC(R, i) \
0012 (&(((struct iavf_aq_desc *)((R).desc_buf.va))[i]))
0013
0014 #define IAVF_ADMINQ_DESC_ALIGNMENT 4096
0015
0016 struct iavf_adminq_ring {
0017 struct iavf_virt_mem dma_head;
0018 struct iavf_dma_mem desc_buf;
0019 struct iavf_virt_mem cmd_buf;
0020
0021 union {
0022 struct iavf_dma_mem *asq_bi;
0023 struct iavf_dma_mem *arq_bi;
0024 } r;
0025
0026 u16 count;
0027 u16 rx_buf_len;
0028
0029
0030 u16 next_to_use;
0031 u16 next_to_clean;
0032
0033
0034 u32 head;
0035 u32 tail;
0036 u32 len;
0037 u32 bah;
0038 u32 bal;
0039 };
0040
0041
0042 struct iavf_asq_cmd_details {
0043 void *callback;
0044 u64 cookie;
0045 u16 flags_ena;
0046 u16 flags_dis;
0047 bool async;
0048 bool postpone;
0049 struct iavf_aq_desc *wb_desc;
0050 };
0051
0052 #define IAVF_ADMINQ_DETAILS(R, i) \
0053 (&(((struct iavf_asq_cmd_details *)((R).cmd_buf.va))[i]))
0054
0055
0056 struct iavf_arq_event_info {
0057 struct iavf_aq_desc desc;
0058 u16 msg_len;
0059 u16 buf_len;
0060 u8 *msg_buf;
0061 };
0062
0063
0064 struct iavf_adminq_info {
0065 struct iavf_adminq_ring arq;
0066 struct iavf_adminq_ring asq;
0067 u32 asq_cmd_timeout;
0068 u16 num_arq_entries;
0069 u16 num_asq_entries;
0070 u16 arq_buf_size;
0071 u16 asq_buf_size;
0072 u16 fw_maj_ver;
0073 u16 fw_min_ver;
0074 u32 fw_build;
0075 u16 api_maj_ver;
0076 u16 api_min_ver;
0077
0078 struct mutex asq_mutex;
0079 struct mutex arq_mutex;
0080
0081
0082 enum iavf_admin_queue_err asq_last_status;
0083 enum iavf_admin_queue_err arq_last_status;
0084 };
0085
0086
0087
0088
0089
0090
0091 static inline int iavf_aq_rc_to_posix(int aq_ret, int aq_rc)
0092 {
0093 int aq_to_posix[] = {
0094 0,
0095 -EPERM,
0096 -ENOENT,
0097 -ESRCH,
0098 -EINTR,
0099 -EIO,
0100 -ENXIO,
0101 -E2BIG,
0102 -EAGAIN,
0103 -ENOMEM,
0104 -EACCES,
0105 -EFAULT,
0106 -EBUSY,
0107 -EEXIST,
0108 -EINVAL,
0109 -ENOTTY,
0110 -ENOSPC,
0111 -ENOSYS,
0112 -ERANGE,
0113 -EPIPE,
0114 -ESPIPE,
0115 -EROFS,
0116 -EFBIG,
0117 };
0118
0119
0120 if (aq_ret == IAVF_ERR_ADMIN_QUEUE_TIMEOUT)
0121 return -EAGAIN;
0122
0123 if (!((u32)aq_rc < (sizeof(aq_to_posix) / sizeof((aq_to_posix)[0]))))
0124 return -ERANGE;
0125
0126 return aq_to_posix[aq_rc];
0127 }
0128
0129
0130 #define IAVF_AQ_LARGE_BUF 512
0131 #define IAVF_ASQ_CMD_TIMEOUT 250000
0132
0133 void iavf_fill_default_direct_cmd_desc(struct iavf_aq_desc *desc, u16 opcode);
0134
0135 #endif