162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2008 Cisco Systems, Inc. All rights reserved. 462306a36Sopenharmony_ci * Copyright 2007 Nuova Systems, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef _CQ_EXCH_DESC_H_ 762306a36Sopenharmony_ci#define _CQ_EXCH_DESC_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "cq_desc.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* Exchange completion queue descriptor: 16B */ 1262306a36Sopenharmony_cistruct cq_exch_wq_desc { 1362306a36Sopenharmony_ci u16 completed_index; 1462306a36Sopenharmony_ci u16 q_number; 1562306a36Sopenharmony_ci u16 exchange_id; 1662306a36Sopenharmony_ci u8 tmpl; 1762306a36Sopenharmony_ci u8 reserved0; 1862306a36Sopenharmony_ci u32 reserved1; 1962306a36Sopenharmony_ci u8 exch_status; 2062306a36Sopenharmony_ci u8 reserved2[2]; 2162306a36Sopenharmony_ci u8 type_color; 2262306a36Sopenharmony_ci}; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define CQ_EXCH_WQ_STATUS_BITS 2 2562306a36Sopenharmony_ci#define CQ_EXCH_WQ_STATUS_MASK ((1 << CQ_EXCH_WQ_STATUS_BITS) - 1) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum cq_exch_status_types { 2862306a36Sopenharmony_ci CQ_EXCH_WQ_STATUS_TYPE_COMPLETE = 0, 2962306a36Sopenharmony_ci CQ_EXCH_WQ_STATUS_TYPE_ABORT = 1, 3062306a36Sopenharmony_ci CQ_EXCH_WQ_STATUS_TYPE_SGL_EOF = 2, 3162306a36Sopenharmony_ci CQ_EXCH_WQ_STATUS_TYPE_TMPL_ERR = 3, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic inline void cq_exch_wq_desc_dec(struct cq_exch_wq_desc *desc_ptr, 3562306a36Sopenharmony_ci u8 *type, 3662306a36Sopenharmony_ci u8 *color, 3762306a36Sopenharmony_ci u16 *q_number, 3862306a36Sopenharmony_ci u16 *completed_index, 3962306a36Sopenharmony_ci u8 *exch_status) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci cq_desc_dec((struct cq_desc *)desc_ptr, type, 4262306a36Sopenharmony_ci color, q_number, completed_index); 4362306a36Sopenharmony_ci *exch_status = desc_ptr->exch_status & CQ_EXCH_WQ_STATUS_MASK; 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct cq_fcp_rq_desc { 4762306a36Sopenharmony_ci u16 completed_index_eop_sop_prt; 4862306a36Sopenharmony_ci u16 q_number; 4962306a36Sopenharmony_ci u16 exchange_id; 5062306a36Sopenharmony_ci u16 tmpl; 5162306a36Sopenharmony_ci u16 bytes_written; 5262306a36Sopenharmony_ci u16 vlan; 5362306a36Sopenharmony_ci u8 sof; 5462306a36Sopenharmony_ci u8 eof; 5562306a36Sopenharmony_ci u8 fcs_fer_fck; 5662306a36Sopenharmony_ci u8 type_color; 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FLAGS_SOP (1 << 15) 6062306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FLAGS_EOP (1 << 14) 6162306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FLAGS_PRT (1 << 12) 6262306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_TMPL_MASK 0x1f 6362306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_BYTES_WRITTEN_MASK 0x3fff 6462306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_PACKET_ERR_SHIFT 14 6562306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_PACKET_ERR_MASK (1 << CQ_FCP_RQ_DESC_PACKET_ERR_SHIFT) 6662306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_VS_STRIPPED_SHIFT 15 6762306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_VS_STRIPPED_MASK (1 << CQ_FCP_RQ_DESC_VS_STRIPPED_SHIFT) 6862306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FC_CRC_OK_MASK 0x1 6962306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FCOE_ERR_SHIFT 1 7062306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FCOE_ERR_MASK (1 << CQ_FCP_RQ_DESC_FCOE_ERR_SHIFT) 7162306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FCS_OK_SHIFT 7 7262306a36Sopenharmony_ci#define CQ_FCP_RQ_DESC_FCS_OK_MASK (1 << CQ_FCP_RQ_DESC_FCS_OK_SHIFT) 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic inline void cq_fcp_rq_desc_dec(struct cq_fcp_rq_desc *desc_ptr, 7562306a36Sopenharmony_ci u8 *type, 7662306a36Sopenharmony_ci u8 *color, 7762306a36Sopenharmony_ci u16 *q_number, 7862306a36Sopenharmony_ci u16 *completed_index, 7962306a36Sopenharmony_ci u8 *eop, 8062306a36Sopenharmony_ci u8 *sop, 8162306a36Sopenharmony_ci u8 *fck, 8262306a36Sopenharmony_ci u16 *exchange_id, 8362306a36Sopenharmony_ci u16 *tmpl, 8462306a36Sopenharmony_ci u32 *bytes_written, 8562306a36Sopenharmony_ci u8 *sof, 8662306a36Sopenharmony_ci u8 *eof, 8762306a36Sopenharmony_ci u8 *ingress_port, 8862306a36Sopenharmony_ci u8 *packet_err, 8962306a36Sopenharmony_ci u8 *fcoe_err, 9062306a36Sopenharmony_ci u8 *fcs_ok, 9162306a36Sopenharmony_ci u8 *vlan_stripped, 9262306a36Sopenharmony_ci u16 *vlan) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci cq_desc_dec((struct cq_desc *)desc_ptr, type, 9562306a36Sopenharmony_ci color, q_number, completed_index); 9662306a36Sopenharmony_ci *eop = (desc_ptr->completed_index_eop_sop_prt & 9762306a36Sopenharmony_ci CQ_FCP_RQ_DESC_FLAGS_EOP) ? 1 : 0; 9862306a36Sopenharmony_ci *sop = (desc_ptr->completed_index_eop_sop_prt & 9962306a36Sopenharmony_ci CQ_FCP_RQ_DESC_FLAGS_SOP) ? 1 : 0; 10062306a36Sopenharmony_ci *ingress_port = 10162306a36Sopenharmony_ci (desc_ptr->completed_index_eop_sop_prt & 10262306a36Sopenharmony_ci CQ_FCP_RQ_DESC_FLAGS_PRT) ? 1 : 0; 10362306a36Sopenharmony_ci *exchange_id = desc_ptr->exchange_id; 10462306a36Sopenharmony_ci *tmpl = desc_ptr->tmpl & CQ_FCP_RQ_DESC_TMPL_MASK; 10562306a36Sopenharmony_ci *bytes_written = 10662306a36Sopenharmony_ci desc_ptr->bytes_written & CQ_FCP_RQ_DESC_BYTES_WRITTEN_MASK; 10762306a36Sopenharmony_ci *packet_err = 10862306a36Sopenharmony_ci (desc_ptr->bytes_written & CQ_FCP_RQ_DESC_PACKET_ERR_MASK) >> 10962306a36Sopenharmony_ci CQ_FCP_RQ_DESC_PACKET_ERR_SHIFT; 11062306a36Sopenharmony_ci *vlan_stripped = 11162306a36Sopenharmony_ci (desc_ptr->bytes_written & CQ_FCP_RQ_DESC_VS_STRIPPED_MASK) >> 11262306a36Sopenharmony_ci CQ_FCP_RQ_DESC_VS_STRIPPED_SHIFT; 11362306a36Sopenharmony_ci *vlan = desc_ptr->vlan; 11462306a36Sopenharmony_ci *sof = desc_ptr->sof; 11562306a36Sopenharmony_ci *fck = desc_ptr->fcs_fer_fck & CQ_FCP_RQ_DESC_FC_CRC_OK_MASK; 11662306a36Sopenharmony_ci *fcoe_err = (desc_ptr->fcs_fer_fck & CQ_FCP_RQ_DESC_FCOE_ERR_MASK) >> 11762306a36Sopenharmony_ci CQ_FCP_RQ_DESC_FCOE_ERR_SHIFT; 11862306a36Sopenharmony_ci *eof = desc_ptr->eof; 11962306a36Sopenharmony_ci *fcs_ok = 12062306a36Sopenharmony_ci (desc_ptr->fcs_fer_fck & CQ_FCP_RQ_DESC_FCS_OK_MASK) >> 12162306a36Sopenharmony_ci CQ_FCP_RQ_DESC_FCS_OK_SHIFT; 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistruct cq_sgl_desc { 12562306a36Sopenharmony_ci u16 exchange_id; 12662306a36Sopenharmony_ci u16 q_number; 12762306a36Sopenharmony_ci u32 active_burst_offset; 12862306a36Sopenharmony_ci u32 tot_data_bytes; 12962306a36Sopenharmony_ci u16 tmpl; 13062306a36Sopenharmony_ci u8 sgl_err; 13162306a36Sopenharmony_ci u8 type_color; 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cienum cq_sgl_err_types { 13562306a36Sopenharmony_ci CQ_SGL_ERR_NO_ERROR = 0, 13662306a36Sopenharmony_ci CQ_SGL_ERR_OVERFLOW, /* data ran beyond end of SGL */ 13762306a36Sopenharmony_ci CQ_SGL_ERR_SGL_LCL_ADDR_ERR, /* sgl access to local vnic addr illegal*/ 13862306a36Sopenharmony_ci CQ_SGL_ERR_ADDR_RSP_ERR, /* sgl address error */ 13962306a36Sopenharmony_ci CQ_SGL_ERR_DATA_RSP_ERR, /* sgl data rsp error */ 14062306a36Sopenharmony_ci CQ_SGL_ERR_CNT_ZERO_ERR, /* SGL count is 0 */ 14162306a36Sopenharmony_ci CQ_SGL_ERR_CNT_MAX_ERR, /* SGL count is larger than supported */ 14262306a36Sopenharmony_ci CQ_SGL_ERR_ORDER_ERR, /* frames recv on both ports, order err */ 14362306a36Sopenharmony_ci CQ_SGL_ERR_DATA_LCL_ADDR_ERR,/* sgl data buf to local vnic addr ill */ 14462306a36Sopenharmony_ci CQ_SGL_ERR_HOST_CQ_ERR, /* host cq entry to local vnic addr ill */ 14562306a36Sopenharmony_ci}; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define CQ_SGL_SGL_ERR_MASK 0x1f 14862306a36Sopenharmony_ci#define CQ_SGL_TMPL_MASK 0x1f 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistatic inline void cq_sgl_desc_dec(struct cq_sgl_desc *desc_ptr, 15162306a36Sopenharmony_ci u8 *type, 15262306a36Sopenharmony_ci u8 *color, 15362306a36Sopenharmony_ci u16 *q_number, 15462306a36Sopenharmony_ci u16 *exchange_id, 15562306a36Sopenharmony_ci u32 *active_burst_offset, 15662306a36Sopenharmony_ci u32 *tot_data_bytes, 15762306a36Sopenharmony_ci u16 *tmpl, 15862306a36Sopenharmony_ci u8 *sgl_err) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci /* Cheat a little by assuming exchange_id is the same as completed 16162306a36Sopenharmony_ci index */ 16262306a36Sopenharmony_ci cq_desc_dec((struct cq_desc *)desc_ptr, type, color, q_number, 16362306a36Sopenharmony_ci exchange_id); 16462306a36Sopenharmony_ci *active_burst_offset = desc_ptr->active_burst_offset; 16562306a36Sopenharmony_ci *tot_data_bytes = desc_ptr->tot_data_bytes; 16662306a36Sopenharmony_ci *tmpl = desc_ptr->tmpl & CQ_SGL_TMPL_MASK; 16762306a36Sopenharmony_ci *sgl_err = desc_ptr->sgl_err & CQ_SGL_SGL_ERR_MASK; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci#endif /* _CQ_EXCH_DESC_H_ */ 171