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