1 /*- 2 * Copyright (c) 2010 Chelsio Communications, Inc. 3 * All rights reserved. 4 * Written by: Navdeep Parhar <np@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 * 29 */ 30 31 #ifndef __T4_OFFLOAD_H__ 32 #define __T4_OFFLOAD_H__ 33 34 /* XXX: flagrant misuse of mbuf fields (during tx by TOM) */ 35 #define MBUF_EQ(m) (*((void **)(&(m)->m_pkthdr.rcvif))) 36 /* These have to work for !M_PKTHDR so we use a field from m_hdr. */ 37 #define MBUF_TX_CREDITS(m) ((m)->m_hdr.pad[0]) 38 #define MBUF_DMA_MAPPED(m) ((m)->m_hdr.pad[1]) 39 40 #define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \ 41 (w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | V_FW_WR_ATOMIC(atomic)); \ 42 (w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \ 43 V_FW_WR_FLOWID(tid)); \ 44 (w)->wr.wr_lo = cpu_to_be64(0); \ 45 } while (0) 46 47 #define INIT_TP_WR(w, tid) do { \ 48 (w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | \ 49 V_FW_WR_IMMDLEN(sizeof(*w) - sizeof(w->wr))); \ 50 (w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(sizeof(*w), 16)) | \ 51 V_FW_WR_FLOWID(tid)); \ 52 (w)->wr.wr_lo = cpu_to_be64(0); \ 53 } while (0) 54 55 #define INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \ 56 INIT_TP_WR(w, tid); \ 57 OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \ 58 } while (0) 59 60 /* 61 * Max # of ATIDs. The absolute HW max is 16K but we keep it lower. 62 */ 63 #define MAX_ATIDS 8192U 64 65 union serv_entry { 66 void *data; 67 union serv_entry *next; 68 }; 69 70 union aopen_entry { 71 void *data; 72 union aopen_entry *next; 73 }; 74 75 /* 76 * Holds the size, base address, free list start, etc of the TID, server TID, 77 * and active-open TID tables. The tables themselves are allocated dynamically. 78 */ 79 struct tid_info { 80 void **tid_tab; 81 unsigned int ntids; 82 83 union serv_entry *stid_tab; 84 unsigned int nstids; 85 unsigned int stid_base; 86 87 union aopen_entry *atid_tab; 88 unsigned int natids; 89 90 struct filter_entry *ftid_tab; 91 unsigned int nftids; 92 unsigned int ftid_base; 93 unsigned int ftids_in_use; 94 95 struct mtx atid_lock; 96 union aopen_entry *afree; 97 unsigned int atids_in_use; 98 99 struct mtx stid_lock; 100 union serv_entry *sfree; 101 unsigned int stids_in_use; 102 103 unsigned int tids_in_use; 104 }; 105 106 struct t4_range { 107 unsigned int start; 108 unsigned int size; 109 }; 110 111 struct t4_virt_res { /* virtualized HW resources */ 112 struct t4_range ddp; 113 struct t4_range iscsi; 114 struct t4_range stag; 115 struct t4_range rq; 116 struct t4_range pbl; 117 struct t4_range qp; 118 struct t4_range cq; 119 struct t4_range ocq; 120 }; 121 122 #ifndef TCP_OFFLOAD_DISABLE 123 enum { 124 ULD_TOM = 1, 125 }; 126 127 struct adapter; 128 struct port_info; 129 struct uld_info { 130 SLIST_ENTRY(uld_info) link; 131 int refcount; 132 int uld_id; 133 int (*attach)(struct adapter *, void **); 134 int (*detach)(void *); 135 }; 136 137 struct uld_softc { 138 struct uld_info *uld; 139 void *softc; 140 }; 141 142 struct tom_tunables { 143 int sndbuf; 144 int ddp; 145 int indsz; 146 int ddp_thres; 147 }; 148 149 int t4_register_uld(struct uld_info *); 150 int t4_unregister_uld(struct uld_info *); 151 #endif 152 153 #endif 154