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