Home | History | Annotate | Line # | Download | only in cxgb
      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