2011-02-18 08:00:26 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 2010 Chelsio Communications, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
* Written by: Navdeep Parhar <np@FreeBSD.org>
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __T4_OFFLOAD_H__
|
|
|
|
#define __T4_OFFLOAD_H__
|
|
|
|
|
2011-12-16 02:09:51 +00:00
|
|
|
#define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
|
|
|
|
(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | V_FW_WR_ATOMIC(atomic)); \
|
|
|
|
(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
|
|
|
|
V_FW_WR_FLOWID(tid)); \
|
|
|
|
(w)->wr.wr_lo = cpu_to_be64(0); \
|
|
|
|
} while (0)
|
2011-05-30 21:07:26 +00:00
|
|
|
|
|
|
|
#define INIT_TP_WR(w, tid) do { \
|
|
|
|
(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | \
|
|
|
|
V_FW_WR_IMMDLEN(sizeof(*w) - sizeof(w->wr))); \
|
|
|
|
(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(sizeof(*w), 16)) | \
|
|
|
|
V_FW_WR_FLOWID(tid)); \
|
|
|
|
(w)->wr.wr_lo = cpu_to_be64(0); \
|
|
|
|
} while (0)
|
|
|
|
|
2011-12-16 02:09:51 +00:00
|
|
|
#define INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \
|
|
|
|
INIT_TP_WR(w, tid); \
|
|
|
|
OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \
|
|
|
|
} while (0)
|
|
|
|
|
2011-02-18 08:00:26 +00:00
|
|
|
/*
|
|
|
|
* Max # of ATIDs. The absolute HW max is 16K but we keep it lower.
|
|
|
|
*/
|
|
|
|
#define MAX_ATIDS 8192U
|
|
|
|
|
2011-12-16 02:09:51 +00:00
|
|
|
union serv_entry {
|
2011-02-18 08:00:26 +00:00
|
|
|
void *data;
|
2011-12-16 02:09:51 +00:00
|
|
|
union serv_entry *next;
|
2011-02-18 08:00:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
union aopen_entry {
|
|
|
|
void *data;
|
|
|
|
union aopen_entry *next;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Holds the size, base address, free list start, etc of the TID, server TID,
|
|
|
|
* and active-open TID tables. The tables themselves are allocated dynamically.
|
|
|
|
*/
|
|
|
|
struct tid_info {
|
|
|
|
void **tid_tab;
|
|
|
|
unsigned int ntids;
|
|
|
|
|
2011-12-16 02:09:51 +00:00
|
|
|
union serv_entry *stid_tab;
|
2011-02-18 08:00:26 +00:00
|
|
|
unsigned int nstids;
|
|
|
|
unsigned int stid_base;
|
|
|
|
|
|
|
|
union aopen_entry *atid_tab;
|
|
|
|
unsigned int natids;
|
|
|
|
|
T4 packet filtering/steering.
- Enable 5-tuple and every-packet lookup.
- Setup the default filter mode to allow filtering/steering based on IP
protocol, ingress port, inner VLAN ID, IP frag, FCoE, and MPS match
type; all combined together. You can also filter based on MAC index,
Ethernet type, IP TOS/IPv6 Traffic Class, and outer VLAN ID but you'll
have to modify the default filter mode and exclude some of the
match-fields in it.
IPv4 and IPv6 SIP/DIP/SPORT/DPORT are always available in all filter
rules.
- Add driver ioctls to get/set the global filter mode.
- Add driver ioctls to program and delete hardware filters. A couple of
the "switch" actions that rewrite Ethernet and VLAN information and
switch the packet out of another port may not work as the L2 code is not
yet in place. Everything else, including all "drop" and "pass" rules
with RSS or absolute qid, should work.
Obtained from: Chelsio Communications
2011-05-05 02:04:56 +00:00
|
|
|
struct filter_entry *ftid_tab;
|
2011-02-18 08:00:26 +00:00
|
|
|
unsigned int nftids;
|
|
|
|
unsigned int ftid_base;
|
T4 packet filtering/steering.
- Enable 5-tuple and every-packet lookup.
- Setup the default filter mode to allow filtering/steering based on IP
protocol, ingress port, inner VLAN ID, IP frag, FCoE, and MPS match
type; all combined together. You can also filter based on MAC index,
Ethernet type, IP TOS/IPv6 Traffic Class, and outer VLAN ID but you'll
have to modify the default filter mode and exclude some of the
match-fields in it.
IPv4 and IPv6 SIP/DIP/SPORT/DPORT are always available in all filter
rules.
- Add driver ioctls to get/set the global filter mode.
- Add driver ioctls to program and delete hardware filters. A couple of
the "switch" actions that rewrite Ethernet and VLAN information and
switch the packet out of another port may not work as the L2 code is not
yet in place. Everything else, including all "drop" and "pass" rules
with RSS or absolute qid, should work.
Obtained from: Chelsio Communications
2011-05-05 02:04:56 +00:00
|
|
|
unsigned int ftids_in_use;
|
2011-02-18 08:00:26 +00:00
|
|
|
|
2011-12-16 02:09:51 +00:00
|
|
|
struct mtx atid_lock;
|
2011-02-18 08:00:26 +00:00
|
|
|
union aopen_entry *afree;
|
|
|
|
unsigned int atids_in_use;
|
|
|
|
|
2011-12-16 02:09:51 +00:00
|
|
|
struct mtx stid_lock;
|
|
|
|
union serv_entry *sfree;
|
2011-02-18 08:00:26 +00:00
|
|
|
unsigned int stids_in_use;
|
2011-12-16 02:09:51 +00:00
|
|
|
|
|
|
|
unsigned int tids_in_use;
|
2011-02-18 08:00:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct t4_range {
|
|
|
|
unsigned int start;
|
|
|
|
unsigned int size;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct t4_virt_res { /* virtualized HW resources */
|
|
|
|
struct t4_range ddp;
|
|
|
|
struct t4_range iscsi;
|
|
|
|
struct t4_range stag;
|
|
|
|
struct t4_range rq;
|
|
|
|
struct t4_range pbl;
|
2011-12-16 02:09:51 +00:00
|
|
|
struct t4_range qp;
|
|
|
|
struct t4_range cq;
|
|
|
|
struct t4_range ocq;
|
2011-02-18 08:00:26 +00:00
|
|
|
};
|
|
|
|
|
2012-06-19 07:34:13 +00:00
|
|
|
#ifdef TCP_OFFLOAD
|
2011-12-16 02:09:51 +00:00
|
|
|
enum {
|
|
|
|
ULD_TOM = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct adapter;
|
|
|
|
struct port_info;
|
|
|
|
struct uld_info {
|
|
|
|
SLIST_ENTRY(uld_info) link;
|
|
|
|
int refcount;
|
|
|
|
int uld_id;
|
2012-06-19 07:34:13 +00:00
|
|
|
int (*activate)(struct adapter *);
|
|
|
|
int (*deactivate)(struct adapter *);
|
2011-12-16 02:09:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct tom_tunables {
|
|
|
|
int sndbuf;
|
|
|
|
int ddp;
|
|
|
|
int indsz;
|
|
|
|
int ddp_thres;
|
|
|
|
};
|
|
|
|
|
|
|
|
int t4_register_uld(struct uld_info *);
|
|
|
|
int t4_unregister_uld(struct uld_info *);
|
2012-06-19 07:34:13 +00:00
|
|
|
int t4_activate_uld(struct adapter *, int);
|
|
|
|
int t4_deactivate_uld(struct adapter *, int);
|
2011-12-16 02:09:51 +00:00
|
|
|
#endif
|
|
|
|
|
2011-02-18 08:00:26 +00:00
|
|
|
#endif
|