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((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((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((struct cq_desc *)desc_ptr, type, color, q_number, 163 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