From 875b556c2a6c4cb2319b38607585bd7a1a584c3a Mon Sep 17 00:00:00 2001 From: Kim Phillips Date: Thu, 17 Jul 2008 20:16:40 +0800 Subject: [PATCH] --- yaml --- r: 106495 b: refs/heads/master c: ec6644d6325b5a38525f1d5b20fd4bf7db05cf2a h: refs/heads/master i: 106493: 5d65a7918b587bd341fd8c06373db8d1da00a775 106491: 74de1d2b796db5df8e2f553ff39a30a22e77377f 106487: 71697cc819e0741def7b4a93b54d38c4ca32ddd8 106479: 0de8ae57ae58e98118383184fda00f7d26b57ba5 106463: 036e73e2eb97522935eaa43c8c911ee09595e953 106431: 5f5367d66e1db14eecec58385a90404f54aac2f0 106367: 736060be62e3a5c487003707ef0029cd3a411008 106239: a129d423e02069ef81f275394733ff4a3f88fbd8 105983: 9be9cc827446e03ee670ab54363b28620e5521c5 105471: dd6076418e8746619181b3b0a87240f37fe8caee 104447: 36ecbd682292842230ecb63974d9cd4cffc150ab 102399: 63fdcdaf4356b95cb44246c04a5df2626bacf212 98303: 8d3fd52306c01a77327e5a8547cc363fa60bb45f v: v3 --- [refs] | 2 +- trunk/drivers/crypto/talitos.c | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 1f51e85777b9..f583b5972e32 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 695ad589698571046d42a4450c2d801486905535 +refs/heads/master: ec6644d6325b5a38525f1d5b20fd4bf7db05cf2a diff --git a/trunk/drivers/crypto/talitos.c b/trunk/drivers/crypto/talitos.c index f644fba35c8c..fdb0680f6ffe 100644 --- a/trunk/drivers/crypto/talitos.c +++ b/trunk/drivers/crypto/talitos.c @@ -99,6 +99,9 @@ struct talitos_private { /* next channel to be assigned next incoming descriptor */ atomic_t last_chan; + /* per-channel number of requests pending in channel h/w fifo */ + atomic_t *submit_count; + /* per-channel request fifo */ struct talitos_request **fifo; @@ -263,15 +266,15 @@ static int talitos_submit(struct device *dev, struct talitos_desc *desc, spin_lock_irqsave(&priv->head_lock[ch], flags); - head = priv->head[ch]; - request = &priv->fifo[ch][head]; - - if (request->desc) { - /* request queue is full */ + if (!atomic_inc_not_zero(&priv->submit_count[ch])) { + /* h/w fifo is full */ spin_unlock_irqrestore(&priv->head_lock[ch], flags); return -EAGAIN; } + head = priv->head[ch]; + request = &priv->fifo[ch][head]; + /* map descriptor and save caller data */ request->dma_desc = dma_map_single(dev, desc, sizeof(*desc), DMA_BIDIRECTIONAL); @@ -335,6 +338,9 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch) priv->tail[ch] = (tail + 1) & (priv->fifo_len - 1); spin_unlock_irqrestore(&priv->tail_lock[ch], flags); + + atomic_dec(&priv->submit_count[ch]); + saved_req.callback(dev, saved_req.desc, saved_req.context, status); /* channel may resume processing in single desc error case */ @@ -1337,6 +1343,7 @@ static int __devexit talitos_remove(struct of_device *ofdev) if (hw_supports(dev, DESC_HDR_SEL0_RNG)) talitos_unregister_rng(dev); + kfree(priv->submit_count); kfree(priv->tail); kfree(priv->head); @@ -1501,6 +1508,16 @@ static int talitos_probe(struct of_device *ofdev, } } + priv->submit_count = kmalloc(sizeof(int) * priv->num_channels, + GFP_KERNEL); + if (!priv->submit_count) { + dev_err(dev, "failed to allocate fifo submit count space\n"); + err = -ENOMEM; + goto err_out; + } + for (i = 0; i < priv->num_channels; i++) + atomic_set(&priv->submit_count[i], -priv->chfifo_len); + priv->head = kzalloc(sizeof(int) * priv->num_channels, GFP_KERNEL); priv->tail = kzalloc(sizeof(int) * priv->num_channels, GFP_KERNEL); if (!priv->head || !priv->tail) {