162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright (c) 2016 Chelsio Communications, Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify
562306a36Sopenharmony_ci * it under the terms of the GNU General Public License as published by
662306a36Sopenharmony_ci * the Free Software Foundation.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef	__CXGBIT_LRO_H__
1162306a36Sopenharmony_ci#define	__CXGBIT_LRO_H__
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/kernel.h>
1462306a36Sopenharmony_ci#include <linux/module.h>
1562306a36Sopenharmony_ci#include <linux/errno.h>
1662306a36Sopenharmony_ci#include <linux/types.h>
1762306a36Sopenharmony_ci#include <linux/skbuff.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define LRO_FLUSH_LEN_MAX	65535
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct cxgbit_lro_cb {
2262306a36Sopenharmony_ci	struct cxgbit_sock *csk;
2362306a36Sopenharmony_ci	u32 pdu_totallen;
2462306a36Sopenharmony_ci	u32 offset;
2562306a36Sopenharmony_ci	u8 pdu_idx;
2662306a36Sopenharmony_ci	bool complete;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cienum cxgbit_pducb_flags {
3062306a36Sopenharmony_ci	PDUCBF_RX_HDR		= (1 << 0), /* received pdu header */
3162306a36Sopenharmony_ci	PDUCBF_RX_DATA		= (1 << 1), /* received pdu payload */
3262306a36Sopenharmony_ci	PDUCBF_RX_STATUS	= (1 << 2), /* received ddp status */
3362306a36Sopenharmony_ci	PDUCBF_RX_DATA_DDPD	= (1 << 3), /* pdu payload ddp'd */
3462306a36Sopenharmony_ci	PDUCBF_RX_DDP_CMP	= (1 << 4), /* ddp completion */
3562306a36Sopenharmony_ci	PDUCBF_RX_HCRC_ERR	= (1 << 5), /* header digest error */
3662306a36Sopenharmony_ci	PDUCBF_RX_DCRC_ERR	= (1 << 6), /* data digest error */
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct cxgbit_lro_pdu_cb {
4062306a36Sopenharmony_ci	u8 flags;
4162306a36Sopenharmony_ci	u8 frags;
4262306a36Sopenharmony_ci	u8 hfrag_idx;
4362306a36Sopenharmony_ci	u8 nr_dfrags;
4462306a36Sopenharmony_ci	u8 dfrag_idx;
4562306a36Sopenharmony_ci	bool complete;
4662306a36Sopenharmony_ci	u32 seq;
4762306a36Sopenharmony_ci	u32 pdulen;
4862306a36Sopenharmony_ci	u32 hlen;
4962306a36Sopenharmony_ci	u32 dlen;
5062306a36Sopenharmony_ci	u32 doffset;
5162306a36Sopenharmony_ci	u32 ddigest;
5262306a36Sopenharmony_ci	void *hdr;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define LRO_SKB_MAX_HEADROOM  \
5662306a36Sopenharmony_ci		(sizeof(struct cxgbit_lro_cb) + \
5762306a36Sopenharmony_ci		 (MAX_SKB_FRAGS * sizeof(struct cxgbit_lro_pdu_cb)))
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define LRO_SKB_MIN_HEADROOM  \
6062306a36Sopenharmony_ci		(sizeof(struct cxgbit_lro_cb) + \
6162306a36Sopenharmony_ci		 sizeof(struct cxgbit_lro_pdu_cb))
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define cxgbit_skb_lro_cb(skb)	((struct cxgbit_lro_cb *)skb->data)
6462306a36Sopenharmony_ci#define cxgbit_skb_lro_pdu_cb(skb, i)	\
6562306a36Sopenharmony_ci	((struct cxgbit_lro_pdu_cb *)(skb->data + sizeof(struct cxgbit_lro_cb) \
6662306a36Sopenharmony_ci		+ (i * sizeof(struct cxgbit_lro_pdu_cb))))
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#define CPL_RX_ISCSI_DDP_STATUS_DDP_SHIFT	16 /* ddp'able */
6962306a36Sopenharmony_ci#define CPL_RX_ISCSI_DDP_STATUS_PAD_SHIFT	19 /* pad error */
7062306a36Sopenharmony_ci#define CPL_RX_ISCSI_DDP_STATUS_HCRC_SHIFT	20 /* hcrc error */
7162306a36Sopenharmony_ci#define CPL_RX_ISCSI_DDP_STATUS_DCRC_SHIFT	21 /* dcrc error */
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#endif	/*__CXGBIT_LRO_H_*/
74