156b2bdd1SGireesh Nagabhushana /* 256b2bdd1SGireesh Nagabhushana * This file and its contents are supplied under the terms of the 356b2bdd1SGireesh Nagabhushana * Common Development and Distribution License ("CDDL"), version 1.0. 456b2bdd1SGireesh Nagabhushana * You may only use this file in accordance with the terms of version 556b2bdd1SGireesh Nagabhushana * 1.0 of the CDDL. 656b2bdd1SGireesh Nagabhushana * 756b2bdd1SGireesh Nagabhushana * A full copy of the text of the CDDL should have accompanied this 856b2bdd1SGireesh Nagabhushana * source. A copy of the CDDL is also available via the Internet at 956b2bdd1SGireesh Nagabhushana * http://www.illumos.org/license/CDDL. 1056b2bdd1SGireesh Nagabhushana */ 1156b2bdd1SGireesh Nagabhushana 1256b2bdd1SGireesh Nagabhushana /* 1356b2bdd1SGireesh Nagabhushana * This file is part of the Chelsio T4 support code. 1456b2bdd1SGireesh Nagabhushana * 1556b2bdd1SGireesh Nagabhushana * Copyright (C) 2010-2013 Chelsio Communications. All rights reserved. 1656b2bdd1SGireesh Nagabhushana * 1756b2bdd1SGireesh Nagabhushana * This program is distributed in the hope that it will be useful, but WITHOUT 1856b2bdd1SGireesh Nagabhushana * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1956b2bdd1SGireesh Nagabhushana * FITNESS FOR A PARTICULAR PURPOSE. See the LICENSE file included in this 2056b2bdd1SGireesh Nagabhushana * release for licensing terms and conditions. 2156b2bdd1SGireesh Nagabhushana */ 2256b2bdd1SGireesh Nagabhushana 2356b2bdd1SGireesh Nagabhushana #ifndef __CXGBE_OFFLOAD_H 2456b2bdd1SGireesh Nagabhushana #define __CXGBE_OFFLOAD_H 2556b2bdd1SGireesh Nagabhushana 2656b2bdd1SGireesh Nagabhushana /* 2756b2bdd1SGireesh Nagabhushana * Max # of ATIDs. The absolute HW max is 16K but we keep it lower. 2856b2bdd1SGireesh Nagabhushana */ 2956b2bdd1SGireesh Nagabhushana #define MAX_ATIDS 8192U 3056b2bdd1SGireesh Nagabhushana 3156b2bdd1SGireesh Nagabhushana #define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \ 3256b2bdd1SGireesh Nagabhushana (w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | \ 3356b2bdd1SGireesh Nagabhushana V_FW_WR_ATOMIC(atomic)); \ 3456b2bdd1SGireesh Nagabhushana (w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \ 3556b2bdd1SGireesh Nagabhushana V_FW_WR_FLOWID(tid)); \ 3656b2bdd1SGireesh Nagabhushana (w)->wr.wr_lo = cpu_to_be64(0); \ 3756b2bdd1SGireesh Nagabhushana } while (0) 3856b2bdd1SGireesh Nagabhushana 3956b2bdd1SGireesh Nagabhushana #define INIT_TP_WR(w, tid) do { \ 4056b2bdd1SGireesh Nagabhushana (w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | \ 4156b2bdd1SGireesh Nagabhushana V_FW_WR_IMMDLEN(sizeof (*w) - sizeof (w->wr))); \ 4256b2bdd1SGireesh Nagabhushana (w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(sizeof (*w), 16)) | \ 4356b2bdd1SGireesh Nagabhushana V_FW_WR_FLOWID(tid)); \ 4456b2bdd1SGireesh Nagabhushana (w)->wr.wr_lo = cpu_to_be64(0); \ 4556b2bdd1SGireesh Nagabhushana } while (0) 4656b2bdd1SGireesh Nagabhushana 4756b2bdd1SGireesh Nagabhushana #define INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \ 4856b2bdd1SGireesh Nagabhushana INIT_TP_WR(w, tid); \ 4956b2bdd1SGireesh Nagabhushana OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \ 5056b2bdd1SGireesh Nagabhushana } while (0) 5156b2bdd1SGireesh Nagabhushana 5256b2bdd1SGireesh Nagabhushana union serv_entry { 5356b2bdd1SGireesh Nagabhushana void *data; 5456b2bdd1SGireesh Nagabhushana union serv_entry *next; 5556b2bdd1SGireesh Nagabhushana }; 5656b2bdd1SGireesh Nagabhushana 5756b2bdd1SGireesh Nagabhushana union aopen_entry { 5856b2bdd1SGireesh Nagabhushana void *data; 5956b2bdd1SGireesh Nagabhushana union aopen_entry *next; 6056b2bdd1SGireesh Nagabhushana }; 6156b2bdd1SGireesh Nagabhushana 6256b2bdd1SGireesh Nagabhushana /* 6356b2bdd1SGireesh Nagabhushana * Holds the size, base address, free list start, etc of the TID, server TID, 6456b2bdd1SGireesh Nagabhushana * and active-open TID tables. The tables themselves are allocated dynamically. 6556b2bdd1SGireesh Nagabhushana */ 6656b2bdd1SGireesh Nagabhushana struct tid_info { 6756b2bdd1SGireesh Nagabhushana void **tid_tab; 6856b2bdd1SGireesh Nagabhushana unsigned int ntids; 6956b2bdd1SGireesh Nagabhushana 7056b2bdd1SGireesh Nagabhushana union serv_entry *stid_tab; 7156b2bdd1SGireesh Nagabhushana unsigned int nstids; 7256b2bdd1SGireesh Nagabhushana unsigned int stid_base; 7356b2bdd1SGireesh Nagabhushana 7456b2bdd1SGireesh Nagabhushana union aopen_entry *atid_tab; 7556b2bdd1SGireesh Nagabhushana unsigned int natids; 7656b2bdd1SGireesh Nagabhushana 7756b2bdd1SGireesh Nagabhushana struct filter_entry *ftid_tab; 7856b2bdd1SGireesh Nagabhushana unsigned int nftids; 7956b2bdd1SGireesh Nagabhushana unsigned int ftid_base; 8056b2bdd1SGireesh Nagabhushana unsigned int ftids_in_use; 8156b2bdd1SGireesh Nagabhushana 8256b2bdd1SGireesh Nagabhushana kmutex_t atid_lock; 8356b2bdd1SGireesh Nagabhushana union aopen_entry *afree; 8456b2bdd1SGireesh Nagabhushana unsigned int atids_in_use; 8556b2bdd1SGireesh Nagabhushana 8656b2bdd1SGireesh Nagabhushana kmutex_t stid_lock; 8756b2bdd1SGireesh Nagabhushana union serv_entry *sfree; 8856b2bdd1SGireesh Nagabhushana unsigned int stids_in_use; 8956b2bdd1SGireesh Nagabhushana 9056b2bdd1SGireesh Nagabhushana unsigned int tids_in_use; 9156b2bdd1SGireesh Nagabhushana }; 9256b2bdd1SGireesh Nagabhushana 9356b2bdd1SGireesh Nagabhushana struct t4_range { 94de483253SVishal Kulkarni u_int start; 95de483253SVishal Kulkarni u_int size; 9656b2bdd1SGireesh Nagabhushana }; 9756b2bdd1SGireesh Nagabhushana 9856b2bdd1SGireesh Nagabhushana struct t4_virt_res { /* virtualized HW resources */ 9956b2bdd1SGireesh Nagabhushana struct t4_range ddp; 10056b2bdd1SGireesh Nagabhushana struct t4_range iscsi; 10156b2bdd1SGireesh Nagabhushana struct t4_range stag; 10256b2bdd1SGireesh Nagabhushana struct t4_range rq; 10356b2bdd1SGireesh Nagabhushana struct t4_range pbl; 104de483253SVishal Kulkarni struct t4_range l2t; 10556b2bdd1SGireesh Nagabhushana }; 10656b2bdd1SGireesh Nagabhushana 10756b2bdd1SGireesh Nagabhushana struct adapter; 10856b2bdd1SGireesh Nagabhushana struct port_info; 10956b2bdd1SGireesh Nagabhushana 11056b2bdd1SGireesh Nagabhushana enum { 11156b2bdd1SGireesh Nagabhushana ULD_TOM = 1, 11256b2bdd1SGireesh Nagabhushana }; 11356b2bdd1SGireesh Nagabhushana 11456b2bdd1SGireesh Nagabhushana enum cxgb4_control { 11556b2bdd1SGireesh Nagabhushana CXGB4_CONTROL_SET_OFFLOAD_POLICY, 11656b2bdd1SGireesh Nagabhushana }; 11756b2bdd1SGireesh Nagabhushana 11856b2bdd1SGireesh Nagabhushana struct uld_info { 11956b2bdd1SGireesh Nagabhushana SLIST_ENTRY(uld_info) link; 12056b2bdd1SGireesh Nagabhushana int refcount; 12156b2bdd1SGireesh Nagabhushana int uld_id; 12256b2bdd1SGireesh Nagabhushana int (*attach)(struct adapter *, void **); 12356b2bdd1SGireesh Nagabhushana int (*detach)(void *); 12456b2bdd1SGireesh Nagabhushana int (*rx)(void *, const void *, mblk_t *); 12556b2bdd1SGireesh Nagabhushana int (*control)(void *handle, enum cxgb4_control control, ...); 12656b2bdd1SGireesh Nagabhushana }; 12756b2bdd1SGireesh Nagabhushana 12856b2bdd1SGireesh Nagabhushana struct uld_softc { 12956b2bdd1SGireesh Nagabhushana struct uld_info *uld; 13056b2bdd1SGireesh Nagabhushana void *softc; 13156b2bdd1SGireesh Nagabhushana }; 13256b2bdd1SGireesh Nagabhushana 13356b2bdd1SGireesh Nagabhushana struct tom_tunables { 13456b2bdd1SGireesh Nagabhushana int sndbuf; 13556b2bdd1SGireesh Nagabhushana int ddp; 13656b2bdd1SGireesh Nagabhushana int indsz; 13756b2bdd1SGireesh Nagabhushana int ddp_thres; 13856b2bdd1SGireesh Nagabhushana }; 13956b2bdd1SGireesh Nagabhushana 140*3dde7c95SVishal Kulkarni #ifdef TCP_OFFLOAD_ENABLE 14156b2bdd1SGireesh Nagabhushana struct offload_req { 14256b2bdd1SGireesh Nagabhushana __be32 sip[4]; 14356b2bdd1SGireesh Nagabhushana __be32 dip[4]; 14456b2bdd1SGireesh Nagabhushana __be16 sport; 14556b2bdd1SGireesh Nagabhushana __be16 dport; 14656b2bdd1SGireesh Nagabhushana __u8 ipvers_opentype; 14756b2bdd1SGireesh Nagabhushana __u8 tos; 14856b2bdd1SGireesh Nagabhushana __be16 vlan; 14956b2bdd1SGireesh Nagabhushana __u32 mark; 15056b2bdd1SGireesh Nagabhushana }; 15156b2bdd1SGireesh Nagabhushana 15256b2bdd1SGireesh Nagabhushana enum { OPEN_TYPE_LISTEN, OPEN_TYPE_ACTIVE, OPEN_TYPE_PASSIVE }; 15356b2bdd1SGireesh Nagabhushana 15456b2bdd1SGireesh Nagabhushana struct offload_settings { 15556b2bdd1SGireesh Nagabhushana __u8 offload; 15656b2bdd1SGireesh Nagabhushana int8_t ddp; 15756b2bdd1SGireesh Nagabhushana int8_t rx_coalesce; 15856b2bdd1SGireesh Nagabhushana int8_t cong_algo; 15956b2bdd1SGireesh Nagabhushana int32_t rssq; 16056b2bdd1SGireesh Nagabhushana int16_t sched_class; 16156b2bdd1SGireesh Nagabhushana int8_t tstamp; 16256b2bdd1SGireesh Nagabhushana int8_t sack; 16356b2bdd1SGireesh Nagabhushana 16456b2bdd1SGireesh Nagabhushana }; 16556b2bdd1SGireesh Nagabhushana #endif 16656b2bdd1SGireesh Nagabhushana 16756b2bdd1SGireesh Nagabhushana extern int t4_register_uld(struct uld_info *ui); 16856b2bdd1SGireesh Nagabhushana extern int t4_unregister_uld(struct uld_info *ui); 16956b2bdd1SGireesh Nagabhushana 17056b2bdd1SGireesh Nagabhushana #endif /* __CXGBE_OFFLOAD_H */ 171