diff options
-rw-r--r-- | drivers/crypto/talitos.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index 8a0bb417aa11..dbe76b5df9cf 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
@@ -416,7 +416,7 @@ static void talitos_done(unsigned long data) | |||
416 | /* | 416 | /* |
417 | * locate current (offending) descriptor | 417 | * locate current (offending) descriptor |
418 | */ | 418 | */ |
419 | static struct talitos_desc *current_desc(struct device *dev, int ch) | 419 | static u32 current_desc_hdr(struct device *dev, int ch) |
420 | { | 420 | { |
421 | struct talitos_private *priv = dev_get_drvdata(dev); | 421 | struct talitos_private *priv = dev_get_drvdata(dev); |
422 | int tail = priv->chan[ch].tail; | 422 | int tail = priv->chan[ch].tail; |
@@ -428,23 +428,25 @@ static struct talitos_desc *current_desc(struct device *dev, int ch) | |||
428 | tail = (tail + 1) & (priv->fifo_len - 1); | 428 | tail = (tail + 1) & (priv->fifo_len - 1); |
429 | if (tail == priv->chan[ch].tail) { | 429 | if (tail == priv->chan[ch].tail) { |
430 | dev_err(dev, "couldn't locate current descriptor\n"); | 430 | dev_err(dev, "couldn't locate current descriptor\n"); |
431 | return NULL; | 431 | return 0; |
432 | } | 432 | } |
433 | } | 433 | } |
434 | 434 | ||
435 | return priv->chan[ch].fifo[tail].desc; | 435 | return priv->chan[ch].fifo[tail].desc->hdr; |
436 | } | 436 | } |
437 | 437 | ||
438 | /* | 438 | /* |
439 | * user diagnostics; report root cause of error based on execution unit status | 439 | * user diagnostics; report root cause of error based on execution unit status |
440 | */ | 440 | */ |
441 | static void report_eu_error(struct device *dev, int ch, | 441 | static void report_eu_error(struct device *dev, int ch, u32 desc_hdr) |
442 | struct talitos_desc *desc) | ||
443 | { | 442 | { |
444 | struct talitos_private *priv = dev_get_drvdata(dev); | 443 | struct talitos_private *priv = dev_get_drvdata(dev); |
445 | int i; | 444 | int i; |
446 | 445 | ||
447 | switch (desc->hdr & DESC_HDR_SEL0_MASK) { | 446 | if (!desc_hdr) |
447 | desc_hdr = in_be32(priv->reg + TALITOS_DESCBUF(ch)); | ||
448 | |||
449 | switch (desc_hdr & DESC_HDR_SEL0_MASK) { | ||
448 | case DESC_HDR_SEL0_AFEU: | 450 | case DESC_HDR_SEL0_AFEU: |
449 | dev_err(dev, "AFEUISR 0x%08x_%08x\n", | 451 | dev_err(dev, "AFEUISR 0x%08x_%08x\n", |
450 | in_be32(priv->reg + TALITOS_AFEUISR), | 452 | in_be32(priv->reg + TALITOS_AFEUISR), |
@@ -488,7 +490,7 @@ static void report_eu_error(struct device *dev, int ch, | |||
488 | break; | 490 | break; |
489 | } | 491 | } |
490 | 492 | ||
491 | switch (desc->hdr & DESC_HDR_SEL1_MASK) { | 493 | switch (desc_hdr & DESC_HDR_SEL1_MASK) { |
492 | case DESC_HDR_SEL1_MDEUA: | 494 | case DESC_HDR_SEL1_MDEUA: |
493 | case DESC_HDR_SEL1_MDEUB: | 495 | case DESC_HDR_SEL1_MDEUB: |
494 | dev_err(dev, "MDEUISR 0x%08x_%08x\n", | 496 | dev_err(dev, "MDEUISR 0x%08x_%08x\n", |
@@ -550,7 +552,7 @@ static void talitos_error(unsigned long data, u32 isr, u32 isr_lo) | |||
550 | if (v_lo & TALITOS_CCPSR_LO_IEU) | 552 | if (v_lo & TALITOS_CCPSR_LO_IEU) |
551 | dev_err(dev, "invalid execution unit error\n"); | 553 | dev_err(dev, "invalid execution unit error\n"); |
552 | if (v_lo & TALITOS_CCPSR_LO_EU) | 554 | if (v_lo & TALITOS_CCPSR_LO_EU) |
553 | report_eu_error(dev, ch, current_desc(dev, ch)); | 555 | report_eu_error(dev, ch, current_desc_hdr(dev, ch)); |
554 | if (v_lo & TALITOS_CCPSR_LO_GB) | 556 | if (v_lo & TALITOS_CCPSR_LO_GB) |
555 | dev_err(dev, "gather boundary error\n"); | 557 | dev_err(dev, "gather boundary error\n"); |
556 | if (v_lo & TALITOS_CCPSR_LO_GRL) | 558 | if (v_lo & TALITOS_CCPSR_LO_GRL) |