/*
 * Copyright (c) 2016 Chelsio Communications, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 */

#ifndef	__CXGBIT_LRO_H__
#define	__CXGBIT_LRO_H__

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/skbuff.h>

#define LRO_FLUSH_LEN_MAX	65535

struct cxgbit_lro_cb {
	struct cxgbit_sock *csk;
	u32 pdu_totallen;
	u32 offset;
	u8 pdu_idx;
	bool complete;
};

enum cxgbit_pducb_flags {
	PDUCBF_RX_HDR		= (1 << 0), /* received pdu header */
	PDUCBF_RX_DATA		= (1 << 1), /* received pdu payload */
	PDUCBF_RX_STATUS	= (1 << 2), /* received ddp status */
	PDUCBF_RX_DATA_DDPD	= (1 << 3), /* pdu payload ddp'd */
	PDUCBF_RX_DDP_CMP	= (1 << 4), /* ddp completion */
	PDUCBF_RX_HCRC_ERR	= (1 << 5), /* header digest error */
	PDUCBF_RX_DCRC_ERR	= (1 << 6), /* data digest error */
};

struct cxgbit_lro_pdu_cb {
	u8 flags;
	u8 frags;
	u8 hfrag_idx;
	u8 nr_dfrags;
	u8 dfrag_idx;
	bool complete;
	u32 seq;
	u32 pdulen;
	u32 hlen;
	u32 dlen;
	u32 doffset;
	u32 ddigest;
	void *hdr;
};

#define LRO_SKB_MAX_HEADROOM  \
		(sizeof(struct cxgbit_lro_cb) + \
		 (MAX_SKB_FRAGS * sizeof(struct cxgbit_lro_pdu_cb)))

#define LRO_SKB_MIN_HEADROOM  \
		(sizeof(struct cxgbit_lro_cb) + \
		 sizeof(struct cxgbit_lro_pdu_cb))

#define cxgbit_skb_lro_cb(skb)	((struct cxgbit_lro_cb *)skb->data)
#define cxgbit_skb_lro_pdu_cb(skb, i)	\
	((struct cxgbit_lro_pdu_cb *)(skb->data + sizeof(struct cxgbit_lro_cb) \
		+ (i * sizeof(struct cxgbit_lro_pdu_cb))))

#define CPL_RX_ISCSI_DDP_STATUS_DDP_SHIFT	16 /* ddp'able */
#define CPL_RX_ISCSI_DDP_STATUS_PAD_SHIFT	19 /* pad error */
#define CPL_RX_ISCSI_DDP_STATUS_HCRC_SHIFT	20 /* hcrc error */
#define CPL_RX_ISCSI_DDP_STATUS_DCRC_SHIFT	21 /* dcrc error */

#endif	/*__CXGBIT_LRO_H_*/
