cxgb_tom.h revision 183321
1
2/**************************************************************************
3
4Copyright (c) 2007, Chelsio Inc.
5All rights reserved.
6
7Redistribution and use in source and binary forms, with or without
8modification, are permitted provided that the following conditions are met:
9
10 1. Redistributions of source code must retain the above copyright notice,
11    this list of conditions and the following disclaimer.
12
13 2. Neither the name of the Chelsio Corporation nor the names of its
14    contributors may be used to endorse or promote products derived from
15    this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27POSSIBILITY OF SUCH DAMAGE.
28
29
30$FreeBSD: head/sys/dev/cxgb/ulp/tom/cxgb_tom.h 183321 2008-09-24 01:19:08Z kmacy $
31
32***************************************************************************/
33#ifndef CXGB_TOM_H_
34#define CXGB_TOM_H_
35#include <sys/protosw.h>
36#include <netinet/toedev.h>
37
38#define LISTEN_INFO_HASH_SIZE 32
39
40struct listen_info {
41	struct listen_info *next;  /* Link to next entry */
42	struct socket *so;         /* The listening socket */
43	unsigned int stid;         /* The server TID */
44};
45
46
47/*
48 * TOM tunable parameters.  They can be manipulated through sysctl(2) or /proc.
49 */
50struct tom_tunables {
51        int max_host_sndbuf;    // max host RAM consumed by a sndbuf
52        int tx_hold_thres;      // push/pull threshold for non-full TX sk_buffs
53        int max_wrs;            // max # of outstanding WRs per connection
54        int rx_credit_thres;    // min # of RX credits needed for RX_DATA_ACK
55        int cong_alg;           // Congestion control algorithm
56        int mss;                // max TX_DATA WR payload size
57        int delack;             // delayed ACK control
58        int max_conn;           // maximum number of offloaded connections
59        int soft_backlog_limit; // whether the listen backlog limit is soft
60        int ddp;                // whether to put new connections in DDP mode
61        int ddp_thres;          // min recvmsg size before activating DDP
62        int ddp_copy_limit;     // capacity of kernel DDP buffer
63        int ddp_push_wait;      // whether blocking DDP waits for PSH flag
64        int ddp_rcvcoalesce;    // whether receive coalescing is enabled
65        int zcopy_sosend_enabled; // < is never zcopied
66        int zcopy_sosend_partial_thres; // < is never zcopied
67        int zcopy_sosend_partial_copy; // bytes copied in partial zcopy
68        int zcopy_sosend_thres;// >= are mostly zcopied
69        int zcopy_sosend_copy; // bytes coped in zcopied
70        int zcopy_sosend_ret_pending_dma;// pot. return while pending DMA
71        int activated;          // TOE engine activation state
72};
73
74struct tom_data {
75        TAILQ_ENTRY(tom_data) entry;
76
77        struct t3cdev *cdev;
78        struct pci_dev *pdev;
79        struct toedev tdev;
80
81        struct cxgb_client *client;
82        struct tom_tunables conf;
83        struct tom_sysctl_table *sysctl;
84
85        /*
86         * The next three locks listen_lock, deferq.lock, and tid_release_lock
87         * are used rarely so we let them potentially share a cacheline.
88         */
89
90        struct listen_info *listen_hash_tab[LISTEN_INFO_HASH_SIZE];
91        struct mtx listen_lock;
92
93        struct mbuf_head deferq;
94        struct task deferq_task;
95
96        struct socket **tid_release_list;
97        struct mtx tid_release_lock;
98        struct task tid_release_task;
99
100        volatile int tx_dma_pending;
101
102        unsigned int ddp_llimit;
103        unsigned int ddp_ulimit;
104
105        unsigned int rx_page_size;
106
107        u8 *ppod_map;
108        unsigned int nppods;
109        struct mtx ppod_map_lock;
110
111        struct adap_ports *ports;
112	struct taskqueue *tq;
113};
114
115
116struct listen_ctx {
117	struct socket *lso;
118	struct tom_data *tom_data;
119	int ulp_mode;
120	LIST_HEAD(, toepcb) synq_head;
121
122};
123
124#define TOM_DATA(dev) (*(struct tom_data **)&(dev)->tod_l4opt)
125#define T3C_DEV(sk) ((TOM_DATA(TOE_DEV(sk)))->cdev)
126#define TOEP_T3C_DEV(toep) (TOM_DATA(toep->tp_toedev)->cdev)
127#define TOM_TUNABLE(dev, param) (TOM_DATA(dev)->conf.param)
128
129#define TP_DATASENT         	(1 << 0)
130#define TP_TX_WAIT_IDLE      	(1 << 1)
131#define TP_FIN_SENT          	(1 << 2)
132#define TP_ABORT_RPL_PENDING 	(1 << 3)
133#define TP_ABORT_SHUTDOWN    	(1 << 4)
134#define TP_ABORT_RPL_RCVD    	(1 << 5)
135#define TP_ABORT_REQ_RCVD    	(1 << 6)
136#define TP_CLOSE_CON_REQUESTED	(1 << 7)
137#define TP_SYN_RCVD		(1 << 8)
138#define TP_ESTABLISHED		(1 << 9)
139
140void t3_init_tunables(struct tom_data *t);
141
142void t3_sysctl_register(struct adapter *sc, const struct tom_tunables *p);
143
144static __inline struct mbuf *
145m_gethdr_nofail(int len)
146{
147	struct mbuf *m;
148
149	m = m_gethdr(M_NOWAIT, MT_DATA);
150	if (m == NULL) {
151		panic("implement lowmem cache\n");
152	}
153
154	KASSERT(len < MHLEN, ("requested header size too large for mbuf"));
155	m->m_pkthdr.len = m->m_len = len;
156	return (m);
157}
158
159
160#endif
161