1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright 2008 Cisco Systems, Inc. All rights reserved. |
4 | * Copyright 2007 Nuova Systems, Inc. All rights reserved. |
5 | */ |
6 | #ifndef _CQ_EXCH_DESC_H_ |
7 | #define _CQ_EXCH_DESC_H_ |
8 | |
9 | #include "cq_desc.h" |
10 | |
11 | /* Exchange completion queue descriptor: 16B */ |
12 | struct cq_exch_wq_desc { |
13 | u16 completed_index; |
14 | u16 q_number; |
15 | u16 exchange_id; |
16 | u8 tmpl; |
17 | u8 reserved0; |
18 | u32 reserved1; |
19 | u8 exch_status; |
20 | u8 reserved2[2]; |
21 | u8 type_color; |
22 | }; |
23 | |
24 | #define CQ_EXCH_WQ_STATUS_BITS 2 |
25 | #define CQ_EXCH_WQ_STATUS_MASK ((1 << CQ_EXCH_WQ_STATUS_BITS) - 1) |
26 | |
27 | enum cq_exch_status_types { |
28 | CQ_EXCH_WQ_STATUS_TYPE_COMPLETE = 0, |
29 | CQ_EXCH_WQ_STATUS_TYPE_ABORT = 1, |
30 | CQ_EXCH_WQ_STATUS_TYPE_SGL_EOF = 2, |
31 | CQ_EXCH_WQ_STATUS_TYPE_TMPL_ERR = 3, |
32 | }; |
33 | |
34 | static inline void cq_exch_wq_desc_dec(struct cq_exch_wq_desc *desc_ptr, |
35 | u8 *type, |
36 | u8 *color, |
37 | u16 *q_number, |
38 | u16 *completed_index, |
39 | u8 *exch_status) |
40 | { |
41 | cq_desc_dec(desc_arg: (struct cq_desc *)desc_ptr, type, |
42 | color, q_number, completed_index); |
43 | *exch_status = desc_ptr->exch_status & CQ_EXCH_WQ_STATUS_MASK; |
44 | } |
45 | |
46 | struct cq_fcp_rq_desc { |
47 | u16 completed_index_eop_sop_prt; |
48 | u16 q_number; |
49 | u16 exchange_id; |
50 | u16 tmpl; |
51 | u16 bytes_written; |
52 | u16 vlan; |
53 | u8 sof; |
54 | u8 eof; |
55 | u8 fcs_fer_fck; |
56 | u8 type_color; |
57 | }; |
58 | |
59 | #define CQ_FCP_RQ_DESC_FLAGS_SOP (1 << 15) |
60 | #define CQ_FCP_RQ_DESC_FLAGS_EOP (1 << 14) |
61 | #define CQ_FCP_RQ_DESC_FLAGS_PRT (1 << 12) |
62 | #define CQ_FCP_RQ_DESC_TMPL_MASK 0x1f |
63 | #define CQ_FCP_RQ_DESC_BYTES_WRITTEN_MASK 0x3fff |
64 | #define CQ_FCP_RQ_DESC_PACKET_ERR_SHIFT 14 |
65 | #define CQ_FCP_RQ_DESC_PACKET_ERR_MASK (1 << CQ_FCP_RQ_DESC_PACKET_ERR_SHIFT) |
66 | #define CQ_FCP_RQ_DESC_VS_STRIPPED_SHIFT 15 |
67 | #define CQ_FCP_RQ_DESC_VS_STRIPPED_MASK (1 << CQ_FCP_RQ_DESC_VS_STRIPPED_SHIFT) |
68 | #define CQ_FCP_RQ_DESC_FC_CRC_OK_MASK 0x1 |
69 | #define CQ_FCP_RQ_DESC_FCOE_ERR_SHIFT 1 |
70 | #define CQ_FCP_RQ_DESC_FCOE_ERR_MASK (1 << CQ_FCP_RQ_DESC_FCOE_ERR_SHIFT) |
71 | #define CQ_FCP_RQ_DESC_FCS_OK_SHIFT 7 |
72 | #define CQ_FCP_RQ_DESC_FCS_OK_MASK (1 << CQ_FCP_RQ_DESC_FCS_OK_SHIFT) |
73 | |
74 | static inline void cq_fcp_rq_desc_dec(struct cq_fcp_rq_desc *desc_ptr, |
75 | u8 *type, |
76 | u8 *color, |
77 | u16 *q_number, |
78 | u16 *completed_index, |
79 | u8 *eop, |
80 | u8 *sop, |
81 | u8 *fck, |
82 | u16 *exchange_id, |
83 | u16 *tmpl, |
84 | u32 *bytes_written, |
85 | u8 *sof, |
86 | u8 *eof, |
87 | u8 *ingress_port, |
88 | u8 *packet_err, |
89 | u8 *fcoe_err, |
90 | u8 *fcs_ok, |
91 | u8 *vlan_stripped, |
92 | u16 *vlan) |
93 | { |
94 | cq_desc_dec(desc_arg: (struct cq_desc *)desc_ptr, type, |
95 | color, q_number, completed_index); |
96 | *eop = (desc_ptr->completed_index_eop_sop_prt & |
97 | CQ_FCP_RQ_DESC_FLAGS_EOP) ? 1 : 0; |
98 | *sop = (desc_ptr->completed_index_eop_sop_prt & |
99 | CQ_FCP_RQ_DESC_FLAGS_SOP) ? 1 : 0; |
100 | *ingress_port = |
101 | (desc_ptr->completed_index_eop_sop_prt & |
102 | CQ_FCP_RQ_DESC_FLAGS_PRT) ? 1 : 0; |
103 | *exchange_id = desc_ptr->exchange_id; |
104 | *tmpl = desc_ptr->tmpl & CQ_FCP_RQ_DESC_TMPL_MASK; |
105 | *bytes_written = |
106 | desc_ptr->bytes_written & CQ_FCP_RQ_DESC_BYTES_WRITTEN_MASK; |
107 | *packet_err = |
108 | (desc_ptr->bytes_written & CQ_FCP_RQ_DESC_PACKET_ERR_MASK) >> |
109 | CQ_FCP_RQ_DESC_PACKET_ERR_SHIFT; |
110 | *vlan_stripped = |
111 | (desc_ptr->bytes_written & CQ_FCP_RQ_DESC_VS_STRIPPED_MASK) >> |
112 | CQ_FCP_RQ_DESC_VS_STRIPPED_SHIFT; |
113 | *vlan = desc_ptr->vlan; |
114 | *sof = desc_ptr->sof; |
115 | *fck = desc_ptr->fcs_fer_fck & CQ_FCP_RQ_DESC_FC_CRC_OK_MASK; |
116 | *fcoe_err = (desc_ptr->fcs_fer_fck & CQ_FCP_RQ_DESC_FCOE_ERR_MASK) >> |
117 | CQ_FCP_RQ_DESC_FCOE_ERR_SHIFT; |
118 | *eof = desc_ptr->eof; |
119 | *fcs_ok = |
120 | (desc_ptr->fcs_fer_fck & CQ_FCP_RQ_DESC_FCS_OK_MASK) >> |
121 | CQ_FCP_RQ_DESC_FCS_OK_SHIFT; |
122 | } |
123 | |
124 | struct cq_sgl_desc { |
125 | u16 exchange_id; |
126 | u16 q_number; |
127 | u32 active_burst_offset; |
128 | u32 tot_data_bytes; |
129 | u16 tmpl; |
130 | u8 sgl_err; |
131 | u8 type_color; |
132 | }; |
133 | |
134 | enum cq_sgl_err_types { |
135 | CQ_SGL_ERR_NO_ERROR = 0, |
136 | CQ_SGL_ERR_OVERFLOW, /* data ran beyond end of SGL */ |
137 | CQ_SGL_ERR_SGL_LCL_ADDR_ERR, /* sgl access to local vnic addr illegal*/ |
138 | CQ_SGL_ERR_ADDR_RSP_ERR, /* sgl address error */ |
139 | CQ_SGL_ERR_DATA_RSP_ERR, /* sgl data rsp error */ |
140 | CQ_SGL_ERR_CNT_ZERO_ERR, /* SGL count is 0 */ |
141 | CQ_SGL_ERR_CNT_MAX_ERR, /* SGL count is larger than supported */ |
142 | CQ_SGL_ERR_ORDER_ERR, /* frames recv on both ports, order err */ |
143 | CQ_SGL_ERR_DATA_LCL_ADDR_ERR,/* sgl data buf to local vnic addr ill */ |
144 | CQ_SGL_ERR_HOST_CQ_ERR, /* host cq entry to local vnic addr ill */ |
145 | }; |
146 | |
147 | #define CQ_SGL_SGL_ERR_MASK 0x1f |
148 | #define CQ_SGL_TMPL_MASK 0x1f |
149 | |
150 | static inline void cq_sgl_desc_dec(struct cq_sgl_desc *desc_ptr, |
151 | u8 *type, |
152 | u8 *color, |
153 | u16 *q_number, |
154 | u16 *exchange_id, |
155 | u32 *active_burst_offset, |
156 | u32 *tot_data_bytes, |
157 | u16 *tmpl, |
158 | u8 *sgl_err) |
159 | { |
160 | /* Cheat a little by assuming exchange_id is the same as completed |
161 | index */ |
162 | cq_desc_dec(desc_arg: (struct cq_desc *)desc_ptr, type, color, q_number, |
163 | completed_index: exchange_id); |
164 | *active_burst_offset = desc_ptr->active_burst_offset; |
165 | *tot_data_bytes = desc_ptr->tot_data_bytes; |
166 | *tmpl = desc_ptr->tmpl & CQ_SGL_TMPL_MASK; |
167 | *sgl_err = desc_ptr->sgl_err & CQ_SGL_SGL_ERR_MASK; |
168 | } |
169 | |
170 | #endif /* _CQ_EXCH_DESC_H_ */ |
171 | |