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 _WQ_ENET_DESC_H_ 762306a36Sopenharmony_ci#define _WQ_ENET_DESC_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* Ethernet work queue descriptor: 16B */ 1062306a36Sopenharmony_cistruct wq_enet_desc { 1162306a36Sopenharmony_ci __le64 address; 1262306a36Sopenharmony_ci __le16 length; 1362306a36Sopenharmony_ci __le16 mss_loopback; 1462306a36Sopenharmony_ci __le16 header_length_flags; 1562306a36Sopenharmony_ci __le16 vlan_tag; 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define WQ_ENET_ADDR_BITS 64 1962306a36Sopenharmony_ci#define WQ_ENET_LEN_BITS 14 2062306a36Sopenharmony_ci#define WQ_ENET_LEN_MASK ((1 << WQ_ENET_LEN_BITS) - 1) 2162306a36Sopenharmony_ci#define WQ_ENET_MSS_BITS 14 2262306a36Sopenharmony_ci#define WQ_ENET_MSS_MASK ((1 << WQ_ENET_MSS_BITS) - 1) 2362306a36Sopenharmony_ci#define WQ_ENET_MSS_SHIFT 2 2462306a36Sopenharmony_ci#define WQ_ENET_LOOPBACK_SHIFT 1 2562306a36Sopenharmony_ci#define WQ_ENET_HDRLEN_BITS 10 2662306a36Sopenharmony_ci#define WQ_ENET_HDRLEN_MASK ((1 << WQ_ENET_HDRLEN_BITS) - 1) 2762306a36Sopenharmony_ci#define WQ_ENET_FLAGS_OM_BITS 2 2862306a36Sopenharmony_ci#define WQ_ENET_FLAGS_OM_MASK ((1 << WQ_ENET_FLAGS_OM_BITS) - 1) 2962306a36Sopenharmony_ci#define WQ_ENET_FLAGS_EOP_SHIFT 12 3062306a36Sopenharmony_ci#define WQ_ENET_FLAGS_CQ_ENTRY_SHIFT 13 3162306a36Sopenharmony_ci#define WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT 14 3262306a36Sopenharmony_ci#define WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT 15 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_CSUM 0 3562306a36Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_RESERVED 1 3662306a36Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_CSUM_L4 2 3762306a36Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_TSO 3 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic inline void wq_enet_desc_enc(struct wq_enet_desc *desc, 4062306a36Sopenharmony_ci u64 address, u16 length, u16 mss, u16 header_length, 4162306a36Sopenharmony_ci u8 offload_mode, u8 eop, u8 cq_entry, u8 fcoe_encap, 4262306a36Sopenharmony_ci u8 vlan_tag_insert, u16 vlan_tag, u8 loopback) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci desc->address = cpu_to_le64(address); 4562306a36Sopenharmony_ci desc->length = cpu_to_le16(length & WQ_ENET_LEN_MASK); 4662306a36Sopenharmony_ci desc->mss_loopback = cpu_to_le16((mss & WQ_ENET_MSS_MASK) << 4762306a36Sopenharmony_ci WQ_ENET_MSS_SHIFT | (loopback & 1) << WQ_ENET_LOOPBACK_SHIFT); 4862306a36Sopenharmony_ci desc->header_length_flags = cpu_to_le16( 4962306a36Sopenharmony_ci (header_length & WQ_ENET_HDRLEN_MASK) | 5062306a36Sopenharmony_ci (offload_mode & WQ_ENET_FLAGS_OM_MASK) << WQ_ENET_HDRLEN_BITS | 5162306a36Sopenharmony_ci (eop & 1) << WQ_ENET_FLAGS_EOP_SHIFT | 5262306a36Sopenharmony_ci (cq_entry & 1) << WQ_ENET_FLAGS_CQ_ENTRY_SHIFT | 5362306a36Sopenharmony_ci (fcoe_encap & 1) << WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT | 5462306a36Sopenharmony_ci (vlan_tag_insert & 1) << WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT); 5562306a36Sopenharmony_ci desc->vlan_tag = cpu_to_le16(vlan_tag); 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic inline void wq_enet_desc_dec(struct wq_enet_desc *desc, 5962306a36Sopenharmony_ci u64 *address, u16 *length, u16 *mss, u16 *header_length, 6062306a36Sopenharmony_ci u8 *offload_mode, u8 *eop, u8 *cq_entry, u8 *fcoe_encap, 6162306a36Sopenharmony_ci u8 *vlan_tag_insert, u16 *vlan_tag, u8 *loopback) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci *address = le64_to_cpu(desc->address); 6462306a36Sopenharmony_ci *length = le16_to_cpu(desc->length) & WQ_ENET_LEN_MASK; 6562306a36Sopenharmony_ci *mss = (le16_to_cpu(desc->mss_loopback) >> WQ_ENET_MSS_SHIFT) & 6662306a36Sopenharmony_ci WQ_ENET_MSS_MASK; 6762306a36Sopenharmony_ci *loopback = (u8)((le16_to_cpu(desc->mss_loopback) >> 6862306a36Sopenharmony_ci WQ_ENET_LOOPBACK_SHIFT) & 1); 6962306a36Sopenharmony_ci *header_length = le16_to_cpu(desc->header_length_flags) & 7062306a36Sopenharmony_ci WQ_ENET_HDRLEN_MASK; 7162306a36Sopenharmony_ci *offload_mode = (u8)((le16_to_cpu(desc->header_length_flags) >> 7262306a36Sopenharmony_ci WQ_ENET_HDRLEN_BITS) & WQ_ENET_FLAGS_OM_MASK); 7362306a36Sopenharmony_ci *eop = (u8)((le16_to_cpu(desc->header_length_flags) >> 7462306a36Sopenharmony_ci WQ_ENET_FLAGS_EOP_SHIFT) & 1); 7562306a36Sopenharmony_ci *cq_entry = (u8)((le16_to_cpu(desc->header_length_flags) >> 7662306a36Sopenharmony_ci WQ_ENET_FLAGS_CQ_ENTRY_SHIFT) & 1); 7762306a36Sopenharmony_ci *fcoe_encap = (u8)((le16_to_cpu(desc->header_length_flags) >> 7862306a36Sopenharmony_ci WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT) & 1); 7962306a36Sopenharmony_ci *vlan_tag_insert = (u8)((le16_to_cpu(desc->header_length_flags) >> 8062306a36Sopenharmony_ci WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT) & 1); 8162306a36Sopenharmony_ci *vlan_tag = le16_to_cpu(desc->vlan_tag); 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#endif /* _WQ_ENET_DESC_H_ */ 85