Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: fix assignment of error location in CAN error messages

As Dan Carpenter reported in http://marc.info/?l=linux-can&m=144793696016187
the assignment of the error location in CAN error messages had some bit wise
overlaps. Indeed the value to be assigned in data[3] is no bitfield but defines
a single value which points to a location inside the CAN frame on the wire.

This patch fixes the assignments for the error locations in error messages.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Oliver Hartkopp and committed by
Marc Kleine-Budde
ffd461f8 7cecd9ab

+18 -28
+2 -4
drivers/net/can/c_can/c_can.c
··· 975 975 break; 976 976 case LEC_ACK_ERROR: 977 977 netdev_dbg(dev, "ack error\n"); 978 - cf->data[3] |= (CAN_ERR_PROT_LOC_ACK | 979 - CAN_ERR_PROT_LOC_ACK_DEL); 978 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 980 979 break; 981 980 case LEC_BIT1_ERROR: 982 981 netdev_dbg(dev, "bit1 error\n"); ··· 987 988 break; 988 989 case LEC_CRC_ERROR: 989 990 netdev_dbg(dev, "CRC error\n"); 990 - cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | 991 - CAN_ERR_PROT_LOC_CRC_DEL); 991 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 992 992 break; 993 993 default: 994 994 break;
+1 -1
drivers/net/can/cc770/cc770.c
··· 578 578 cf->data[2] |= CAN_ERR_PROT_BIT0; 579 579 break; 580 580 case STAT_LEC_CRC: 581 - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; 581 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 582 582 break; 583 583 } 584 584 }
+2 -2
drivers/net/can/flexcan.c
··· 535 535 if (reg_esr & FLEXCAN_ESR_ACK_ERR) { 536 536 netdev_dbg(dev, "ACK_ERR irq\n"); 537 537 cf->can_id |= CAN_ERR_ACK; 538 - cf->data[3] |= CAN_ERR_PROT_LOC_ACK; 538 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 539 539 tx_errors = 1; 540 540 } 541 541 if (reg_esr & FLEXCAN_ESR_CRC_ERR) { 542 542 netdev_dbg(dev, "CRC_ERR irq\n"); 543 543 cf->data[2] |= CAN_ERR_PROT_BIT; 544 - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; 544 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 545 545 rx_errors = 1; 546 546 } 547 547 if (reg_esr & FLEXCAN_ESR_FRM_ERR) {
+2 -4
drivers/net/can/m_can/m_can.c
··· 500 500 break; 501 501 case LEC_ACK_ERROR: 502 502 netdev_dbg(dev, "ack error\n"); 503 - cf->data[3] |= (CAN_ERR_PROT_LOC_ACK | 504 - CAN_ERR_PROT_LOC_ACK_DEL); 503 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 505 504 break; 506 505 case LEC_BIT1_ERROR: 507 506 netdev_dbg(dev, "bit1 error\n"); ··· 512 513 break; 513 514 case LEC_CRC_ERROR: 514 515 netdev_dbg(dev, "CRC error\n"); 515 - cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | 516 - CAN_ERR_PROT_LOC_CRC_DEL); 516 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 517 517 break; 518 518 default: 519 519 break;
+1 -2
drivers/net/can/pch_can.c
··· 559 559 stats->rx_errors++; 560 560 break; 561 561 case PCH_CRC_ERR: 562 - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | 563 - CAN_ERR_PROT_LOC_CRC_DEL; 562 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 564 563 priv->can.can_stats.bus_error++; 565 564 stats->rx_errors++; 566 565 break;
+3 -3
drivers/net/can/rcar_can.c
··· 251 251 tx_errors++; 252 252 writeb(~RCAR_CAN_ECSR_ADEF, &priv->regs->ecsr); 253 253 if (skb) 254 - cf->data[3] |= CAN_ERR_PROT_LOC_ACK_DEL; 254 + cf->data[3] = CAN_ERR_PROT_LOC_ACK_DEL; 255 255 } 256 256 if (ecsr & RCAR_CAN_ECSR_BE0F) { 257 257 netdev_dbg(priv->ndev, "Bit Error (dominant)\n"); ··· 272 272 rx_errors++; 273 273 writeb(~RCAR_CAN_ECSR_CEF, &priv->regs->ecsr); 274 274 if (skb) 275 - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; 275 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 276 276 } 277 277 if (ecsr & RCAR_CAN_ECSR_AEF) { 278 278 netdev_dbg(priv->ndev, "ACK Error\n"); ··· 280 280 writeb(~RCAR_CAN_ECSR_AEF, &priv->regs->ecsr); 281 281 if (skb) { 282 282 cf->can_id |= CAN_ERR_ACK; 283 - cf->data[3] |= CAN_ERR_PROT_LOC_ACK; 283 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 284 284 } 285 285 } 286 286 if (ecsr & RCAR_CAN_ECSR_FEF) {
+2 -4
drivers/net/can/ti_hecc.c
··· 737 737 } 738 738 if (err_status & HECC_CANES_CRCE) { 739 739 hecc_set_bit(priv, HECC_CANES, HECC_CANES_CRCE); 740 - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | 741 - CAN_ERR_PROT_LOC_CRC_DEL; 740 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 742 741 } 743 742 if (err_status & HECC_CANES_ACKE) { 744 743 hecc_set_bit(priv, HECC_CANES, HECC_CANES_ACKE); 745 - cf->data[3] |= CAN_ERR_PROT_LOC_ACK | 746 - CAN_ERR_PROT_LOC_ACK_DEL; 744 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 747 745 } 748 746 } 749 747
+2 -3
drivers/net/can/usb/kvaser_usb.c
··· 944 944 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; 945 945 946 946 if (es->leaf.error_factor & M16C_EF_ACKE) 947 - cf->data[3] |= (CAN_ERR_PROT_LOC_ACK); 947 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 948 948 if (es->leaf.error_factor & M16C_EF_CRCE) 949 - cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | 950 - CAN_ERR_PROT_LOC_CRC_DEL); 949 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 951 950 if (es->leaf.error_factor & M16C_EF_FORME) 952 951 cf->data[2] |= CAN_ERR_PROT_FORM; 953 952 if (es->leaf.error_factor & M16C_EF_STFE)
+1 -2
drivers/net/can/usb/usb_8dev.c
··· 402 402 break; 403 403 case USB_8DEV_STATUSMSG_CRC: 404 404 cf->data[2] |= CAN_ERR_PROT_UNSPEC; 405 - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | 406 - CAN_ERR_PROT_LOC_CRC_DEL; 405 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 407 406 rx_errors = 1; 408 407 break; 409 408 case USB_8DEV_STATUSMSG_BIT0:
+2 -3
drivers/net/can/xilinx_can.c
··· 618 618 stats->tx_errors++; 619 619 if (skb) { 620 620 cf->can_id |= CAN_ERR_ACK; 621 - cf->data[3] |= CAN_ERR_PROT_LOC_ACK; 621 + cf->data[3] = CAN_ERR_PROT_LOC_ACK; 622 622 } 623 623 } 624 624 ··· 654 654 stats->rx_errors++; 655 655 if (skb) { 656 656 cf->can_id |= CAN_ERR_PROT; 657 - cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ | 658 - CAN_ERR_PROT_LOC_CRC_DEL; 657 + cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; 659 658 } 660 659 } 661 660 priv->can.can_stats.bus_error++;