cxgb_toedev.h revision 1.1.6.2 1 1.1.6.2 yamt
2 1.1.6.2 yamt /**************************************************************************
3 1.1.6.2 yamt
4 1.1.6.2 yamt Copyright (c) 2007, Chelsio Inc.
5 1.1.6.2 yamt All rights reserved.
6 1.1.6.2 yamt
7 1.1.6.2 yamt Redistribution and use in source and binary forms, with or without
8 1.1.6.2 yamt modification, are permitted provided that the following conditions are met:
9 1.1.6.2 yamt
10 1.1.6.2 yamt 1. Redistributions of source code must retain the above copyright notice,
11 1.1.6.2 yamt this list of conditions and the following disclaimer.
12 1.1.6.2 yamt
13 1.1.6.2 yamt 2. Neither the name of the Chelsio Corporation nor the names of its
14 1.1.6.2 yamt contributors may be used to endorse or promote products derived from
15 1.1.6.2 yamt this software without specific prior written permission.
16 1.1.6.2 yamt
17 1.1.6.2 yamt THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 1.1.6.2 yamt AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 1.1.6.2 yamt IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 1.1.6.2 yamt ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 1.1.6.2 yamt LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 1.1.6.2 yamt CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 1.1.6.2 yamt SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 1.1.6.2 yamt INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 1.1.6.2 yamt CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 1.1.6.2 yamt ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 1.1.6.2 yamt POSSIBILITY OF SUCH DAMAGE.
28 1.1.6.2 yamt
29 1.1.6.2 yamt ***************************************************************************/
30 1.1.6.2 yamt
31 1.1.6.2 yamt #ifndef _OFFLOAD_DEV_H_
32 1.1.6.2 yamt #define _OFFLOAD_DEV_H_
33 1.1.6.2 yamt
34 1.1.6.2 yamt #include <net/route.h>
35 1.1.6.2 yamt
36 1.1.6.2 yamt /* Parameter values for offload_get_phys_egress() */
37 1.1.6.2 yamt enum {
38 1.1.6.2 yamt TOE_OPEN,
39 1.1.6.2 yamt TOE_FAILOVER,
40 1.1.6.2 yamt };
41 1.1.6.2 yamt
42 1.1.6.2 yamt /* Parameter values for toe_failover() */
43 1.1.6.2 yamt enum {
44 1.1.6.2 yamt TOE_ACTIVE_SLAVE,
45 1.1.6.2 yamt TOE_LINK_DOWN,
46 1.1.6.2 yamt TOE_LINK_UP,
47 1.1.6.2 yamt TOE_RELEASE,
48 1.1.6.2 yamt TOE_RELEASE_ALL,
49 1.1.6.2 yamt };
50 1.1.6.2 yamt
51 1.1.6.2 yamt
52 1.1.6.2 yamt #define TOENAMSIZ 16
53 1.1.6.2 yamt
54 1.1.6.2 yamt /* belongs in linux/netdevice.h */
55 1.1.6.2 yamt #define NETIF_F_TCPIP_OFFLOAD (1 << 15)
56 1.1.6.2 yamt
57 1.1.6.2 yamt /* Get the toedev associated with a ifnet */
58 1.1.6.2 yamt #define TOEDEV(netdev) (*(struct toedev **)&(netdev)->if_softc)
59 1.1.6.2 yamt
60 1.1.6.2 yamt /* offload type ids */
61 1.1.6.2 yamt enum {
62 1.1.6.2 yamt TOE_ID_CHELSIO_T1 = 1,
63 1.1.6.2 yamt TOE_ID_CHELSIO_T1C,
64 1.1.6.2 yamt TOE_ID_CHELSIO_T2,
65 1.1.6.2 yamt TOE_ID_CHELSIO_T3,
66 1.1.6.2 yamt TOE_ID_CHELSIO_T3B,
67 1.1.6.2 yamt };
68 1.1.6.2 yamt
69 1.1.6.2 yamt struct offload_id {
70 1.1.6.2 yamt unsigned int id;
71 1.1.6.2 yamt unsigned long data;
72 1.1.6.2 yamt };
73 1.1.6.2 yamt
74 1.1.6.2 yamt struct ifnet;
75 1.1.6.2 yamt struct rt_entry;
76 1.1.6.2 yamt struct tom_info;
77 1.1.6.2 yamt struct sysctl_oid;
78 1.1.6.2 yamt struct socket;
79 1.1.6.2 yamt struct mbuf;
80 1.1.6.2 yamt
81 1.1.6.2 yamt enum toetype {
82 1.1.6.2 yamt T3A = 0,
83 1.1.6.2 yamt T3B
84 1.1.6.2 yamt };
85 1.1.6.2 yamt
86 1.1.6.2 yamt struct toedev {
87 1.1.6.2 yamt char name[TOENAMSIZ]; /* TOE device name */
88 1.1.6.2 yamt enum toetype type;
89 1.1.6.2 yamt struct adapter *adapter;
90 1.1.6.2 yamt unsigned int ttid; /* TOE type id */
91 1.1.6.2 yamt unsigned long flags; /* device flags */
92 1.1.6.2 yamt unsigned int mtu; /* max size of TX offloaded data */
93 1.1.6.2 yamt unsigned int nconn; /* max # of offloaded connections */
94 1.1.6.2 yamt struct ifnet *lldev; /* LL device associated with TOE messages */
95 1.1.6.2 yamt const struct tom_info *offload_mod; /* attached TCP offload module */
96 1.1.6.2 yamt struct sysctl_oid *sysctl_root; /* root of proc dir for this TOE */
97 1.1.6.2 yamt TAILQ_ENTRY(toedev) ofld_entry; /* for list linking */
98 1.1.6.2 yamt int (*open)(struct toedev *dev);
99 1.1.6.2 yamt int (*close)(struct toedev *dev);
100 1.1.6.2 yamt int (*can_offload)(struct toedev *dev, struct socket *so);
101 1.1.6.2 yamt int (*connect)(struct toedev *dev, struct socket *so,
102 1.1.6.2 yamt struct ifnet *egress_ifp);
103 1.1.6.2 yamt int (*send)(struct toedev *dev, struct mbuf *m);
104 1.1.6.2 yamt int (*recv)(struct toedev *dev, struct mbuf **m, int n);
105 1.1.6.2 yamt int (*ctl)(struct toedev *dev, unsigned int req, void *data);
106 1.1.6.2 yamt void (*neigh_update)(struct toedev *dev, struct rtentry *neigh);
107 1.1.6.2 yamt void (*failover)(struct toedev *dev, struct ifnet *bond_ifp,
108 1.1.6.2 yamt struct ifnet *ndev, int event);
109 1.1.6.2 yamt void *priv; /* driver private data */
110 1.1.6.2 yamt void *l2opt; /* optional layer 2 data */
111 1.1.6.2 yamt void *l3opt; /* optional layer 3 data */
112 1.1.6.2 yamt void *l4opt; /* optional layer 4 data */
113 1.1.6.2 yamt void *ulp; /* ulp stuff */
114 1.1.6.2 yamt };
115 1.1.6.2 yamt
116 1.1.6.2 yamt struct tom_info {
117 1.1.6.2 yamt int (*attach)(struct toedev *dev, const struct offload_id *entry);
118 1.1.6.2 yamt int (*detach)(struct toedev *dev);
119 1.1.6.2 yamt const char *name;
120 1.1.6.2 yamt const struct offload_id *id_table;
121 1.1.6.2 yamt TAILQ_ENTRY(tom_info) entry;
122 1.1.6.2 yamt };
123 1.1.6.2 yamt
124 1.1.6.2 yamt static inline void init_offload_dev(struct toedev *dev)
125 1.1.6.2 yamt {
126 1.1.6.2 yamt
127 1.1.6.2 yamt }
128 1.1.6.2 yamt
129 1.1.6.2 yamt extern int register_tom(struct tom_info *t);
130 1.1.6.2 yamt extern int unregister_tom(struct tom_info *t);
131 1.1.6.2 yamt extern int register_toedev(struct toedev *dev, const char *name);
132 1.1.6.2 yamt extern int unregister_toedev(struct toedev *dev);
133 1.1.6.2 yamt extern int activate_offload(struct toedev *dev);
134 1.1.6.2 yamt extern int toe_send(struct toedev *dev, struct mbuf *m);
135 1.1.6.2 yamt extern struct ifnet *offload_get_phys_egress(struct ifnet *dev,
136 1.1.6.2 yamt struct socket *so,
137 1.1.6.2 yamt int context);
138 1.1.6.2 yamt
139 1.1.6.2 yamt #if defined(CONFIG_TCP_OFFLOAD_MODULE)
140 1.1.6.2 yamt static inline int toe_receive_mbuf(struct toedev *dev, struct mbuf **m,
141 1.1.6.2 yamt int n)
142 1.1.6.2 yamt {
143 1.1.6.2 yamt return dev->recv(dev, m, n);
144 1.1.6.2 yamt }
145 1.1.6.2 yamt
146 1.1.6.2 yamt extern int prepare_tcp_for_offload(void);
147 1.1.6.2 yamt extern void restore_tcp_to_nonoffload(void);
148 1.1.6.2 yamt #elif defined(CONFIG_TCP_OFFLOAD)
149 1.1.6.2 yamt extern int toe_receive_mbuf(struct toedev *dev, struct mbuf **m, int n);
150 1.1.6.2 yamt #endif
151 1.1.6.2 yamt
152 1.1.6.2 yamt #if defined(CONFIG_TCP_OFFLOAD) || \
153 1.1.6.2 yamt (defined(CONFIG_TCP_OFFLOAD_MODULE) && defined(MODULE))
154 1.1.6.2 yamt extern void toe_neigh_update(struct rtentry *neigh);
155 1.1.6.2 yamt extern void toe_failover(struct ifnet *bond_ifp,
156 1.1.6.2 yamt struct ifnet *fail_ifp, int event);
157 1.1.6.2 yamt extern int toe_enslave(struct ifnet *bond_ifp,
158 1.1.6.2 yamt struct ifnet *slave_ifp);
159 1.1.6.2 yamt #else
160 1.1.6.2 yamt static inline void toe_neigh_update(struct ifnet *neigh) {}
161 1.1.6.2 yamt static inline void toe_failover(struct ifnet *bond_ifp,
162 1.1.6.2 yamt struct ifnet *fail_ifp, int event)
163 1.1.6.2 yamt {}
164 1.1.6.2 yamt static inline int toe_enslave(struct ifnet *bond_ifp,
165 1.1.6.2 yamt struct ifnet *slave_ifp)
166 1.1.6.2 yamt {
167 1.1.6.2 yamt return 0;
168 1.1.6.2 yamt }
169 1.1.6.2 yamt #endif /* CONFIG_TCP_OFFLOAD */
170 1.1.6.2 yamt
171 1.1.6.2 yamt #endif /* _OFFLOAD_DEV_H_ */
172