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