Skip to content

Commit

Permalink
[CRYPTO] geode: relax in busy loop and care about return value
Browse files Browse the repository at this point in the history
The code waits in a busy loop until the hardware finishes the encryption
or decryption process. This wants a cpu_relax() :)
The busy loop finishes either if the encryption is done or if the counter
is zero. If the latter is true than the hardware failed. Since this
should not happen, leave sith a BUG().

Signed-off-by: Sebastian Siewior <sebastian@breakpoint.cc>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Sebastian Siewior authored and Herbert Xu committed Jan 10, 2008
1 parent 2d506d4 commit 1f4e477
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions drivers/crypto/geode-aes.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,10 @@ do_crypt(void *src, void *dst, int len, u32 flags)
/* Start the operation */
iowrite32(AES_CTRL_START | flags, _iobase + AES_CTRLA_REG);

do
do {
status = ioread32(_iobase + AES_INTR_REG);
while(!(status & AES_INTRA_PENDING) && --counter);
cpu_relax();
} while(!(status & AES_INTRA_PENDING) && --counter);

/* Clear the event */
iowrite32((status & 0xFF) | AES_INTRA_PENDING, _iobase + AES_INTR_REG);
Expand All @@ -102,6 +103,7 @@ geode_aes_crypt(struct geode_aes_op *op)
{
u32 flags = 0;
unsigned long iflags;
int ret;

if (op->len == 0)
return 0;
Expand Down Expand Up @@ -130,7 +132,8 @@ geode_aes_crypt(struct geode_aes_op *op)
_writefield(AES_WRITEKEY0_REG, op->key);
}

do_crypt(op->src, op->dst, op->len, flags);
ret = do_crypt(op->src, op->dst, op->len, flags);
BUG_ON(ret);

if (op->mode == AES_MODE_CBC)
_readfield(AES_WRITEIV0_REG, op->iv);
Expand Down

0 comments on commit 1f4e477

Please sign in to comment.