Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /* Copyright 2014 Cisco Systems, Inc.  All rights reserved. */
0003 
0004 #ifndef _WQ_ENET_DESC_H_
0005 #define _WQ_ENET_DESC_H_
0006 
0007 /* Ethernet work queue descriptor: 16B */
0008 struct wq_enet_desc {
0009     __le64 address;
0010     __le16 length;
0011     __le16 mss_loopback;
0012     __le16 header_length_flags;
0013     __le16 vlan_tag;
0014 };
0015 
0016 #define WQ_ENET_ADDR_BITS       64
0017 #define WQ_ENET_LEN_BITS        14
0018 #define WQ_ENET_LEN_MASK        ((1 << WQ_ENET_LEN_BITS) - 1)
0019 #define WQ_ENET_MSS_BITS        14
0020 #define WQ_ENET_MSS_MASK        ((1 << WQ_ENET_MSS_BITS) - 1)
0021 #define WQ_ENET_MSS_SHIFT       2
0022 #define WQ_ENET_LOOPBACK_SHIFT      1
0023 #define WQ_ENET_HDRLEN_BITS     10
0024 #define WQ_ENET_HDRLEN_MASK     ((1 << WQ_ENET_HDRLEN_BITS) - 1)
0025 #define WQ_ENET_FLAGS_OM_BITS       2
0026 #define WQ_ENET_FLAGS_OM_MASK       ((1 << WQ_ENET_FLAGS_OM_BITS) - 1)
0027 #define WQ_ENET_FLAGS_EOP_SHIFT     12
0028 #define WQ_ENET_FLAGS_CQ_ENTRY_SHIFT    13
0029 #define WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT  14
0030 #define WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT 15
0031 
0032 #define WQ_ENET_OFFLOAD_MODE_CSUM   0
0033 #define WQ_ENET_OFFLOAD_MODE_RESERVED   1
0034 #define WQ_ENET_OFFLOAD_MODE_CSUM_L4    2
0035 #define WQ_ENET_OFFLOAD_MODE_TSO    3
0036 
0037 static inline void wq_enet_desc_enc(struct wq_enet_desc *desc,
0038     u64 address, u16 length, u16 mss, u16 header_length,
0039     u8 offload_mode, u8 eop, u8 cq_entry, u8 fcoe_encap,
0040     u8 vlan_tag_insert, u16 vlan_tag, u8 loopback)
0041 {
0042     desc->address = cpu_to_le64(address);
0043     desc->length = cpu_to_le16(length & WQ_ENET_LEN_MASK);
0044     desc->mss_loopback = cpu_to_le16((mss & WQ_ENET_MSS_MASK) <<
0045         WQ_ENET_MSS_SHIFT | (loopback & 1) << WQ_ENET_LOOPBACK_SHIFT);
0046     desc->header_length_flags = cpu_to_le16(
0047         (header_length & WQ_ENET_HDRLEN_MASK) |
0048         (offload_mode & WQ_ENET_FLAGS_OM_MASK) << WQ_ENET_HDRLEN_BITS |
0049         (eop & 1) << WQ_ENET_FLAGS_EOP_SHIFT |
0050         (cq_entry & 1) << WQ_ENET_FLAGS_CQ_ENTRY_SHIFT |
0051         (fcoe_encap & 1) << WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT |
0052         (vlan_tag_insert & 1) << WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT);
0053     desc->vlan_tag = cpu_to_le16(vlan_tag);
0054 }
0055 
0056 static inline void wq_enet_desc_dec(struct wq_enet_desc *desc,
0057     u64 *address, u16 *length, u16 *mss, u16 *header_length,
0058     u8 *offload_mode, u8 *eop, u8 *cq_entry, u8 *fcoe_encap,
0059     u8 *vlan_tag_insert, u16 *vlan_tag, u8 *loopback)
0060 {
0061     *address = le64_to_cpu(desc->address);
0062     *length = le16_to_cpu(desc->length) & WQ_ENET_LEN_MASK;
0063     *mss = (le16_to_cpu(desc->mss_loopback) >> WQ_ENET_MSS_SHIFT) &
0064         WQ_ENET_MSS_MASK;
0065     *loopback = (u8)((le16_to_cpu(desc->mss_loopback) >>
0066         WQ_ENET_LOOPBACK_SHIFT) & 1);
0067     *header_length = le16_to_cpu(desc->header_length_flags) &
0068         WQ_ENET_HDRLEN_MASK;
0069     *offload_mode = (u8)((le16_to_cpu(desc->header_length_flags) >>
0070         WQ_ENET_HDRLEN_BITS) & WQ_ENET_FLAGS_OM_MASK);
0071     *eop = (u8)((le16_to_cpu(desc->header_length_flags) >>
0072         WQ_ENET_FLAGS_EOP_SHIFT) & 1);
0073     *cq_entry = (u8)((le16_to_cpu(desc->header_length_flags) >>
0074         WQ_ENET_FLAGS_CQ_ENTRY_SHIFT) & 1);
0075     *fcoe_encap = (u8)((le16_to_cpu(desc->header_length_flags) >>
0076         WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT) & 1);
0077     *vlan_tag_insert = (u8)((le16_to_cpu(desc->header_length_flags) >>
0078         WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT) & 1);
0079     *vlan_tag = le16_to_cpu(desc->vlan_tag);
0080 }
0081 
0082 #endif /* _WQ_ENET_DESC_H_ */