crypto: chelsio - request to HW should wrap
authorAtul Gupta <atul.gupta@chelsio.com>
Thu, 10 May 2018 04:44:42 +0000 (10:14 +0530)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 May 2018 16:13:56 +0000 (00:13 +0800)
-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 <atul.gupta@chelsio.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/chelsio/chcr_ipsec.c

index 8e0aa3f..461b97e 100644 (file)
@@ -346,18 +346,23 @@ inline void *copy_cpltx_pktxt(struct sk_buff *skb,
                                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 sk_buff *skb,
                                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 sk_buff *skb,
        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);