1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _CXGB3I_OFFLOAD_H
16#define _CXGB3I_OFFLOAD_H
17
18#include <linux/skbuff.h>
19#include <linux/in.h>
20
21#include "common.h"
22#include "adapter.h"
23#include "t3cdev.h"
24#include "cxgb3_offload.h"
25
26#define cxgb3i_log_error(fmt...) printk(KERN_ERR "cxgb3i: ERR! " fmt)
27#define cxgb3i_log_warn(fmt...) printk(KERN_WARNING "cxgb3i: WARN! " fmt)
28#define cxgb3i_log_info(fmt...) printk(KERN_INFO "cxgb3i: " fmt)
29#define cxgb3i_log_debug(fmt, args...) \
30 printk(KERN_INFO "cxgb3i: %s - " fmt, __func__ , ## args)
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69struct s3_conn {
70 struct net_device *dev;
71 struct t3cdev *cdev;
72 unsigned long flags;
73 int tid;
74 int qset;
75 int mss_idx;
76 struct l2t_entry *l2t;
77 int wr_max;
78 int wr_avail;
79 int wr_unacked;
80 struct sk_buff *wr_pending_head;
81 struct sk_buff *wr_pending_tail;
82 struct sk_buff *cpl_close;
83 struct sk_buff *cpl_abort_req;
84 struct sk_buff *cpl_abort_rpl;
85 spinlock_t lock;
86 atomic_t refcnt;
87 volatile unsigned int state;
88 struct sockaddr_in saddr;
89 struct sockaddr_in daddr;
90 struct dst_entry *dst_cache;
91 struct sk_buff_head receive_queue;
92 struct sk_buff_head write_queue;
93 struct timer_list retry_timer;
94 int err;
95 rwlock_t callback_lock;
96 void *user_data;
97
98 u32 rcv_nxt;
99 u32 copied_seq;
100 u32 rcv_wup;
101 u32 snd_nxt;
102 u32 snd_una;
103 u32 write_seq;
104};
105
106
107
108
109enum conn_states {
110 C3CN_STATE_CONNECTING = 1,
111 C3CN_STATE_ESTABLISHED,
112 C3CN_STATE_ACTIVE_CLOSE,
113 C3CN_STATE_PASSIVE_CLOSE,
114 C3CN_STATE_CLOSE_WAIT_1,
115 C3CN_STATE_CLOSE_WAIT_2,
116 C3CN_STATE_ABORTING,
117 C3CN_STATE_CLOSED,
118};
119
120static inline unsigned int c3cn_is_closing(const struct s3_conn *c3cn)
121{
122 return c3cn->state >= C3CN_STATE_ACTIVE_CLOSE;
123}
124static inline unsigned int c3cn_is_established(const struct s3_conn *c3cn)
125{
126 return c3cn->state == C3CN_STATE_ESTABLISHED;
127}
128
129
130
131
132enum c3cn_flags {
133 C3CN_ABORT_RPL_RCVD,
134 C3CN_ABORT_REQ_RCVD,
135 C3CN_ABORT_RPL_PENDING,
136 C3CN_TX_DATA_SENT,
137 C3CN_ACTIVE_CLOSE_NEEDED,
138 C3CN_OFFLOAD_DOWN
139};
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154struct cxgb3i_sdev_data {
155 struct list_head list;
156 struct t3cdev *cdev;
157 struct cxgb3_client *client;
158 struct adap_ports ports;
159 spinlock_t lock;
160 unsigned int sport_next;
161 struct s3_conn *sport_conn[0];
162};
163#define NDEV2CDATA(ndev) (*(struct cxgb3i_sdev_data **)&(ndev)->ec_ptr)
164#define CXGB3_SDEV_DATA(cdev) NDEV2CDATA((cdev)->lldev)
165
166void cxgb3i_sdev_cleanup(void);
167int cxgb3i_sdev_init(cxgb3_cpl_handler_func *);
168void cxgb3i_sdev_add(struct t3cdev *, struct cxgb3_client *);
169void cxgb3i_sdev_remove(struct t3cdev *);
170
171struct s3_conn *cxgb3i_c3cn_create(void);
172int cxgb3i_c3cn_connect(struct net_device *, struct s3_conn *,
173 struct sockaddr_in *);
174void cxgb3i_c3cn_rx_credits(struct s3_conn *, int);
175int cxgb3i_c3cn_send_pdus(struct s3_conn *, struct sk_buff *);
176void cxgb3i_c3cn_release(struct s3_conn *);
177
178
179
180
181
182
183
184
185struct cxgb3_skb_rx_cb {
186 __u32 ddigest;
187 __u32 pdulen;
188};
189
190struct cxgb3_skb_tx_cb {
191 struct sk_buff *wr_next;
192};
193
194struct cxgb3_skb_cb {
195 __u8 flags;
196 __u8 ulp_mode;
197 __u32 seq;
198 union {
199 struct cxgb3_skb_rx_cb rx;
200 struct cxgb3_skb_tx_cb tx;
201 };
202};
203
204#define CXGB3_SKB_CB(skb) ((struct cxgb3_skb_cb *)&((skb)->cb[0]))
205#define skb_flags(skb) (CXGB3_SKB_CB(skb)->flags)
206#define skb_ulp_mode(skb) (CXGB3_SKB_CB(skb)->ulp_mode)
207#define skb_tcp_seq(skb) (CXGB3_SKB_CB(skb)->seq)
208#define skb_rx_ddigest(skb) (CXGB3_SKB_CB(skb)->rx.ddigest)
209#define skb_rx_pdulen(skb) (CXGB3_SKB_CB(skb)->rx.pdulen)
210#define skb_tx_wr_next(skb) (CXGB3_SKB_CB(skb)->tx.wr_next)
211
212enum c3cb_flags {
213 C3CB_FLAG_NEED_HDR = 1 << 0,
214 C3CB_FLAG_NO_APPEND = 1 << 1,
215 C3CB_FLAG_COMPL = 1 << 2,
216};
217
218
219
220
221
222
223struct sge_opaque_hdr {
224 void *dev;
225 dma_addr_t addr[MAX_SKB_FRAGS + 1];
226};
227
228
229#define TX_HEADER_LEN \
230 (sizeof(struct tx_data_wr) + sizeof(struct sge_opaque_hdr))
231#define SKB_TX_HEADROOM SKB_MAX_HEAD(TX_HEADER_LEN)
232
233
234
235
236#define cxgb3i_get_private_ipv4addr(ndev) \
237 (((struct port_info *)(netdev_priv(ndev)))->iscsi_ipv4addr)
238#define cxgb3i_set_private_ipv4addr(ndev, addr) \
239 (((struct port_info *)(netdev_priv(ndev)))->iscsi_ipv4addr) = addr
240
241
242#define CXGB3I_MAX_CONN 16384
243#endif
244