From: Greg Kroah-Hartman Date: Wed, 13 Jun 2018 14:46:34 +0000 (+0200) Subject: 4.17-stable patches X-Git-Tag: v4.17.2~36 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f0193cd7d94bb04ed606b4cedcb245220c779686;p=thirdparty%2Fkernel%2Fstable-queue.git 4.17-stable patches added patches: crypto-chelsio-request-to-hw-should-wrap.patch --- diff --git a/queue-4.17/crypto-chelsio-request-to-hw-should-wrap.patch b/queue-4.17/crypto-chelsio-request-to-hw-should-wrap.patch new file mode 100644 index 00000000000..853a276eb10 --- /dev/null +++ b/queue-4.17/crypto-chelsio-request-to-hw-should-wrap.patch @@ -0,0 +1,100 @@ +From 4c826fed675dfffd8485c5477b616d61d1ec9e9a Mon Sep 17 00:00:00 2001 +From: Atul Gupta +Date: Thu, 10 May 2018 10:14:42 +0530 +Subject: crypto: chelsio - request to HW should wrap + +From: Atul Gupta + +commit 4c826fed675dfffd8485c5477b616d61d1ec9e9a upstream. + +-Tx request and data is copied to HW Q in 64B desc, check for +end of queue and adjust the current position to start from +beginning before passing the additional request info. +-key context copy should check key length only +-Few reverse christmas tree correction + +Signed-off-by: Atul Gupta +Signed-off-by: Herbert Xu +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/crypto/chelsio/chcr_ipsec.c | 35 +++++++++++++++++------------------ + 1 file changed, 17 insertions(+), 18 deletions(-) + +--- a/drivers/crypto/chelsio/chcr_ipsec.c ++++ b/drivers/crypto/chelsio/chcr_ipsec.c +@@ -346,18 +346,23 @@ inline void *copy_cpltx_pktxt(struct sk_ + struct net_device *dev, + void *pos) + { ++ struct cpl_tx_pkt_core *cpl; ++ struct sge_eth_txq *q; + struct adapter *adap; + struct port_info *pi; +- struct sge_eth_txq *q; +- struct cpl_tx_pkt_core *cpl; +- u64 cntrl = 0; + u32 ctrl0, qidx; ++ u64 cntrl = 0; ++ int left; + + pi = netdev_priv(dev); + adap = pi->adapter; + qidx = skb->queue_mapping; + q = &adap->sge.ethtxq[qidx + pi->first_qset]; + ++ left = (void *)q->q.stat - pos; ++ if (!left) ++ pos = q->q.desc; ++ + cpl = (struct cpl_tx_pkt_core *)pos; + + cntrl = TXPKT_L4CSUM_DIS_F | TXPKT_IPCSUM_DIS_F; +@@ -382,18 +387,17 @@ inline void *copy_key_cpltx_pktxt(struct + void *pos, + struct ipsec_sa_entry *sa_entry) + { +- struct adapter *adap; +- struct port_info *pi; +- struct sge_eth_txq *q; +- unsigned int len, qidx; + struct _key_ctx *key_ctx; + int left, eoq, key_len; ++ struct sge_eth_txq *q; ++ struct adapter *adap; ++ struct port_info *pi; ++ unsigned int qidx; + + pi = netdev_priv(dev); + adap = pi->adapter; + qidx = skb->queue_mapping; + q = &adap->sge.ethtxq[qidx + pi->first_qset]; +- len = sa_entry->enckey_len + sizeof(struct cpl_tx_pkt_core); + key_len = sa_entry->kctx_len; + + /* end of queue, reset pos to start of queue */ +@@ -411,19 +415,14 @@ inline void *copy_key_cpltx_pktxt(struct + pos += sizeof(struct _key_ctx); + left -= sizeof(struct _key_ctx); + +- if (likely(len <= left)) { ++ if (likely(key_len <= left)) { + memcpy(key_ctx->key, sa_entry->key, key_len); + pos += key_len; + } else { +- if (key_len <= left) { +- memcpy(pos, sa_entry->key, key_len); +- pos += key_len; +- } else { +- memcpy(pos, sa_entry->key, left); +- memcpy(q->q.desc, sa_entry->key + left, +- key_len - left); +- pos = (u8 *)q->q.desc + (key_len - left); +- } ++ memcpy(pos, sa_entry->key, left); ++ memcpy(q->q.desc, sa_entry->key + left, ++ key_len - left); ++ pos = (u8 *)q->q.desc + (key_len - left); + } + /* Copy CPL TX PKT XT */ + pos = copy_cpltx_pktxt(skb, dev, pos);