18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2008 Cisco Systems, Inc. All rights reserved. 38c2ecf20Sopenharmony_ci * Copyright 2007 Nuova Systems, Inc. All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This program is free software; you may redistribute it and/or modify 68c2ecf20Sopenharmony_ci * it under the terms of the GNU General Public License as published by 78c2ecf20Sopenharmony_ci * the Free Software Foundation; version 2 of the License. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 108c2ecf20Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 118c2ecf20Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 128c2ecf20Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 138c2ecf20Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 148c2ecf20Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 158c2ecf20Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 168c2ecf20Sopenharmony_ci * SOFTWARE. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci#ifndef _WQ_ENET_DESC_H_ 198c2ecf20Sopenharmony_ci#define _WQ_ENET_DESC_H_ 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci/* Ethernet work queue descriptor: 16B */ 228c2ecf20Sopenharmony_cistruct wq_enet_desc { 238c2ecf20Sopenharmony_ci __le64 address; 248c2ecf20Sopenharmony_ci __le16 length; 258c2ecf20Sopenharmony_ci __le16 mss_loopback; 268c2ecf20Sopenharmony_ci __le16 header_length_flags; 278c2ecf20Sopenharmony_ci __le16 vlan_tag; 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#define WQ_ENET_ADDR_BITS 64 318c2ecf20Sopenharmony_ci#define WQ_ENET_LEN_BITS 14 328c2ecf20Sopenharmony_ci#define WQ_ENET_LEN_MASK ((1 << WQ_ENET_LEN_BITS) - 1) 338c2ecf20Sopenharmony_ci#define WQ_ENET_MSS_BITS 14 348c2ecf20Sopenharmony_ci#define WQ_ENET_MSS_MASK ((1 << WQ_ENET_MSS_BITS) - 1) 358c2ecf20Sopenharmony_ci#define WQ_ENET_MSS_SHIFT 2 368c2ecf20Sopenharmony_ci#define WQ_ENET_LOOPBACK_SHIFT 1 378c2ecf20Sopenharmony_ci#define WQ_ENET_HDRLEN_BITS 10 388c2ecf20Sopenharmony_ci#define WQ_ENET_HDRLEN_MASK ((1 << WQ_ENET_HDRLEN_BITS) - 1) 398c2ecf20Sopenharmony_ci#define WQ_ENET_FLAGS_OM_BITS 2 408c2ecf20Sopenharmony_ci#define WQ_ENET_FLAGS_OM_MASK ((1 << WQ_ENET_FLAGS_OM_BITS) - 1) 418c2ecf20Sopenharmony_ci#define WQ_ENET_FLAGS_EOP_SHIFT 12 428c2ecf20Sopenharmony_ci#define WQ_ENET_FLAGS_CQ_ENTRY_SHIFT 13 438c2ecf20Sopenharmony_ci#define WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT 14 448c2ecf20Sopenharmony_ci#define WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT 15 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_CSUM 0 478c2ecf20Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_RESERVED 1 488c2ecf20Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_CSUM_L4 2 498c2ecf20Sopenharmony_ci#define WQ_ENET_OFFLOAD_MODE_TSO 3 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic inline void wq_enet_desc_enc(struct wq_enet_desc *desc, 528c2ecf20Sopenharmony_ci u64 address, u16 length, u16 mss, u16 header_length, 538c2ecf20Sopenharmony_ci u8 offload_mode, u8 eop, u8 cq_entry, u8 fcoe_encap, 548c2ecf20Sopenharmony_ci u8 vlan_tag_insert, u16 vlan_tag, u8 loopback) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci desc->address = cpu_to_le64(address); 578c2ecf20Sopenharmony_ci desc->length = cpu_to_le16(length & WQ_ENET_LEN_MASK); 588c2ecf20Sopenharmony_ci desc->mss_loopback = cpu_to_le16((mss & WQ_ENET_MSS_MASK) << 598c2ecf20Sopenharmony_ci WQ_ENET_MSS_SHIFT | (loopback & 1) << WQ_ENET_LOOPBACK_SHIFT); 608c2ecf20Sopenharmony_ci desc->header_length_flags = cpu_to_le16( 618c2ecf20Sopenharmony_ci (header_length & WQ_ENET_HDRLEN_MASK) | 628c2ecf20Sopenharmony_ci (offload_mode & WQ_ENET_FLAGS_OM_MASK) << WQ_ENET_HDRLEN_BITS | 638c2ecf20Sopenharmony_ci (eop & 1) << WQ_ENET_FLAGS_EOP_SHIFT | 648c2ecf20Sopenharmony_ci (cq_entry & 1) << WQ_ENET_FLAGS_CQ_ENTRY_SHIFT | 658c2ecf20Sopenharmony_ci (fcoe_encap & 1) << WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT | 668c2ecf20Sopenharmony_ci (vlan_tag_insert & 1) << WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT); 678c2ecf20Sopenharmony_ci desc->vlan_tag = cpu_to_le16(vlan_tag); 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistatic inline void wq_enet_desc_dec(struct wq_enet_desc *desc, 718c2ecf20Sopenharmony_ci u64 *address, u16 *length, u16 *mss, u16 *header_length, 728c2ecf20Sopenharmony_ci u8 *offload_mode, u8 *eop, u8 *cq_entry, u8 *fcoe_encap, 738c2ecf20Sopenharmony_ci u8 *vlan_tag_insert, u16 *vlan_tag, u8 *loopback) 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci *address = le64_to_cpu(desc->address); 768c2ecf20Sopenharmony_ci *length = le16_to_cpu(desc->length) & WQ_ENET_LEN_MASK; 778c2ecf20Sopenharmony_ci *mss = (le16_to_cpu(desc->mss_loopback) >> WQ_ENET_MSS_SHIFT) & 788c2ecf20Sopenharmony_ci WQ_ENET_MSS_MASK; 798c2ecf20Sopenharmony_ci *loopback = (u8)((le16_to_cpu(desc->mss_loopback) >> 808c2ecf20Sopenharmony_ci WQ_ENET_LOOPBACK_SHIFT) & 1); 818c2ecf20Sopenharmony_ci *header_length = le16_to_cpu(desc->header_length_flags) & 828c2ecf20Sopenharmony_ci WQ_ENET_HDRLEN_MASK; 838c2ecf20Sopenharmony_ci *offload_mode = (u8)((le16_to_cpu(desc->header_length_flags) >> 848c2ecf20Sopenharmony_ci WQ_ENET_HDRLEN_BITS) & WQ_ENET_FLAGS_OM_MASK); 858c2ecf20Sopenharmony_ci *eop = (u8)((le16_to_cpu(desc->header_length_flags) >> 868c2ecf20Sopenharmony_ci WQ_ENET_FLAGS_EOP_SHIFT) & 1); 878c2ecf20Sopenharmony_ci *cq_entry = (u8)((le16_to_cpu(desc->header_length_flags) >> 888c2ecf20Sopenharmony_ci WQ_ENET_FLAGS_CQ_ENTRY_SHIFT) & 1); 898c2ecf20Sopenharmony_ci *fcoe_encap = (u8)((le16_to_cpu(desc->header_length_flags) >> 908c2ecf20Sopenharmony_ci WQ_ENET_FLAGS_FCOE_ENCAP_SHIFT) & 1); 918c2ecf20Sopenharmony_ci *vlan_tag_insert = (u8)((le16_to_cpu(desc->header_length_flags) >> 928c2ecf20Sopenharmony_ci WQ_ENET_FLAGS_VLAN_TAG_INSERT_SHIFT) & 1); 938c2ecf20Sopenharmony_ci *vlan_tag = le16_to_cpu(desc->vlan_tag); 948c2ecf20Sopenharmony_ci} 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#endif /* _WQ_ENET_DESC_H_ */ 97