diff options
author | Oliver Hartkopp <socketcan@hartkopp.net> | 2015-11-21 12:41:20 -0500 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2015-11-23 03:37:34 -0500 |
commit | ffd461f80d536336811d573f197f3e6d9872d054 (patch) | |
tree | 2bbab4a1de8d6f21b063f85648ddf68a6d21f88c | |
parent | 7cecd9ab80f43972c056dc068338f7bcc407b71c (diff) |
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>
-rw-r--r-- | drivers/net/can/c_can/c_can.c | 6 | ||||
-rw-r--r-- | drivers/net/can/cc770/cc770.c | 2 | ||||
-rw-r--r-- | drivers/net/can/flexcan.c | 4 | ||||
-rw-r--r-- | drivers/net/can/m_can/m_can.c | 6 | ||||
-rw-r--r-- | drivers/net/can/pch_can.c | 3 | ||||
-rw-r--r-- | drivers/net/can/rcar_can.c | 6 | ||||
-rw-r--r-- | drivers/net/can/ti_hecc.c | 6 | ||||
-rw-r--r-- | drivers/net/can/usb/kvaser_usb.c | 5 | ||||
-rw-r--r-- | drivers/net/can/usb/usb_8dev.c | 3 | ||||
-rw-r--r-- | drivers/net/can/xilinx_can.c | 5 |
10 files changed, 18 insertions, 28 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index 5d214d135332..7c9892ab0a6a 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
@@ -975,8 +975,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | |||
975 | break; | 975 | break; |
976 | case LEC_ACK_ERROR: | 976 | case LEC_ACK_ERROR: |
977 | netdev_dbg(dev, "ack error\n"); | 977 | netdev_dbg(dev, "ack error\n"); |
978 | cf->data[3] |= (CAN_ERR_PROT_LOC_ACK | | 978 | cf->data[3] = CAN_ERR_PROT_LOC_ACK; |
979 | CAN_ERR_PROT_LOC_ACK_DEL); | ||
980 | break; | 979 | break; |
981 | case LEC_BIT1_ERROR: | 980 | case LEC_BIT1_ERROR: |
982 | netdev_dbg(dev, "bit1 error\n"); | 981 | netdev_dbg(dev, "bit1 error\n"); |
@@ -988,8 +987,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | |||
988 | break; | 987 | break; |
989 | case LEC_CRC_ERROR: | 988 | case LEC_CRC_ERROR: |
990 | netdev_dbg(dev, "CRC error\n"); | 989 | netdev_dbg(dev, "CRC error\n"); |
991 | cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | 990 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
992 | CAN_ERR_PROT_LOC_CRC_DEL); | ||
993 | break; | 991 | break; |
994 | default: | 992 | default: |
995 | break; | 993 | break; |
diff --git a/drivers/net/can/cc770/cc770.c b/drivers/net/can/cc770/cc770.c index 70a8cbb29e75..1e37313054f3 100644 --- a/drivers/net/can/cc770/cc770.c +++ b/drivers/net/can/cc770/cc770.c | |||
@@ -578,7 +578,7 @@ static int cc770_err(struct net_device *dev, u8 status) | |||
578 | cf->data[2] |= CAN_ERR_PROT_BIT0; | 578 | cf->data[2] |= CAN_ERR_PROT_BIT0; |
579 | break; | 579 | break; |
580 | case STAT_LEC_CRC: | 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 | break; | 582 | break; |
583 | } | 583 | } |
584 | } | 584 | } |
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 868fe945e35a..41c0fc9f3b14 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
@@ -535,13 +535,13 @@ static void do_bus_err(struct net_device *dev, | |||
535 | if (reg_esr & FLEXCAN_ESR_ACK_ERR) { | 535 | if (reg_esr & FLEXCAN_ESR_ACK_ERR) { |
536 | netdev_dbg(dev, "ACK_ERR irq\n"); | 536 | netdev_dbg(dev, "ACK_ERR irq\n"); |
537 | cf->can_id |= CAN_ERR_ACK; | 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 | tx_errors = 1; | 539 | tx_errors = 1; |
540 | } | 540 | } |
541 | if (reg_esr & FLEXCAN_ESR_CRC_ERR) { | 541 | if (reg_esr & FLEXCAN_ESR_CRC_ERR) { |
542 | netdev_dbg(dev, "CRC_ERR irq\n"); | 542 | netdev_dbg(dev, "CRC_ERR irq\n"); |
543 | cf->data[2] |= CAN_ERR_PROT_BIT; | 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 | rx_errors = 1; | 545 | rx_errors = 1; |
546 | } | 546 | } |
547 | if (reg_esr & FLEXCAN_ESR_FRM_ERR) { | 547 | if (reg_esr & FLEXCAN_ESR_FRM_ERR) { |
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index ef655177bb5e..9dd3ca7a73aa 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c | |||
@@ -500,8 +500,7 @@ static int m_can_handle_lec_err(struct net_device *dev, | |||
500 | break; | 500 | break; |
501 | case LEC_ACK_ERROR: | 501 | case LEC_ACK_ERROR: |
502 | netdev_dbg(dev, "ack error\n"); | 502 | netdev_dbg(dev, "ack error\n"); |
503 | cf->data[3] |= (CAN_ERR_PROT_LOC_ACK | | 503 | cf->data[3] = CAN_ERR_PROT_LOC_ACK; |
504 | CAN_ERR_PROT_LOC_ACK_DEL); | ||
505 | break; | 504 | break; |
506 | case LEC_BIT1_ERROR: | 505 | case LEC_BIT1_ERROR: |
507 | netdev_dbg(dev, "bit1 error\n"); | 506 | netdev_dbg(dev, "bit1 error\n"); |
@@ -513,8 +512,7 @@ static int m_can_handle_lec_err(struct net_device *dev, | |||
513 | break; | 512 | break; |
514 | case LEC_CRC_ERROR: | 513 | case LEC_CRC_ERROR: |
515 | netdev_dbg(dev, "CRC error\n"); | 514 | netdev_dbg(dev, "CRC error\n"); |
516 | cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | 515 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
517 | CAN_ERR_PROT_LOC_CRC_DEL); | ||
518 | break; | 516 | break; |
519 | default: | 517 | default: |
520 | break; | 518 | break; |
diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c index e187ca783da0..c1317889d3d8 100644 --- a/drivers/net/can/pch_can.c +++ b/drivers/net/can/pch_can.c | |||
@@ -559,8 +559,7 @@ static void pch_can_error(struct net_device *ndev, u32 status) | |||
559 | stats->rx_errors++; | 559 | stats->rx_errors++; |
560 | break; | 560 | break; |
561 | case PCH_CRC_ERR: | 561 | case PCH_CRC_ERR: |
562 | cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | 562 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
563 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
564 | priv->can.can_stats.bus_error++; | 563 | priv->can.can_stats.bus_error++; |
565 | stats->rx_errors++; | 564 | stats->rx_errors++; |
566 | break; | 565 | break; |
diff --git a/drivers/net/can/rcar_can.c b/drivers/net/can/rcar_can.c index 7bd54191f962..9161f045d44c 100644 --- a/drivers/net/can/rcar_can.c +++ b/drivers/net/can/rcar_can.c | |||
@@ -251,7 +251,7 @@ static void rcar_can_error(struct net_device *ndev) | |||
251 | tx_errors++; | 251 | tx_errors++; |
252 | writeb(~RCAR_CAN_ECSR_ADEF, &priv->regs->ecsr); | 252 | writeb(~RCAR_CAN_ECSR_ADEF, &priv->regs->ecsr); |
253 | if (skb) | 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 | if (ecsr & RCAR_CAN_ECSR_BE0F) { | 256 | if (ecsr & RCAR_CAN_ECSR_BE0F) { |
257 | netdev_dbg(priv->ndev, "Bit Error (dominant)\n"); | 257 | netdev_dbg(priv->ndev, "Bit Error (dominant)\n"); |
@@ -272,7 +272,7 @@ static void rcar_can_error(struct net_device *ndev) | |||
272 | rx_errors++; | 272 | rx_errors++; |
273 | writeb(~RCAR_CAN_ECSR_CEF, &priv->regs->ecsr); | 273 | writeb(~RCAR_CAN_ECSR_CEF, &priv->regs->ecsr); |
274 | if (skb) | 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 | if (ecsr & RCAR_CAN_ECSR_AEF) { | 277 | if (ecsr & RCAR_CAN_ECSR_AEF) { |
278 | netdev_dbg(priv->ndev, "ACK Error\n"); | 278 | netdev_dbg(priv->ndev, "ACK Error\n"); |
@@ -280,7 +280,7 @@ static void rcar_can_error(struct net_device *ndev) | |||
280 | writeb(~RCAR_CAN_ECSR_AEF, &priv->regs->ecsr); | 280 | writeb(~RCAR_CAN_ECSR_AEF, &priv->regs->ecsr); |
281 | if (skb) { | 281 | if (skb) { |
282 | cf->can_id |= CAN_ERR_ACK; | 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 | if (ecsr & RCAR_CAN_ECSR_FEF) { | 286 | if (ecsr & RCAR_CAN_ECSR_FEF) { |
diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c index cf345cbfe819..6eab4fe7e872 100644 --- a/drivers/net/can/ti_hecc.c +++ b/drivers/net/can/ti_hecc.c | |||
@@ -737,13 +737,11 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
737 | } | 737 | } |
738 | if (err_status & HECC_CANES_CRCE) { | 738 | if (err_status & HECC_CANES_CRCE) { |
739 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_CRCE); | 739 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_CRCE); |
740 | cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | 740 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
741 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
742 | } | 741 | } |
743 | if (err_status & HECC_CANES_ACKE) { | 742 | if (err_status & HECC_CANES_ACKE) { |
744 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_ACKE); | 743 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_ACKE); |
745 | cf->data[3] |= CAN_ERR_PROT_LOC_ACK | | 744 | cf->data[3] = CAN_ERR_PROT_LOC_ACK; |
746 | CAN_ERR_PROT_LOC_ACK_DEL; | ||
747 | } | 745 | } |
748 | } | 746 | } |
749 | 747 | ||
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 8b17a9065b0b..022bfa13ebfa 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
@@ -944,10 +944,9 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
944 | cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; | 944 | cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; |
945 | 945 | ||
946 | if (es->leaf.error_factor & M16C_EF_ACKE) | 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 | if (es->leaf.error_factor & M16C_EF_CRCE) | 948 | if (es->leaf.error_factor & M16C_EF_CRCE) |
949 | cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | 949 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
950 | CAN_ERR_PROT_LOC_CRC_DEL); | ||
951 | if (es->leaf.error_factor & M16C_EF_FORME) | 950 | if (es->leaf.error_factor & M16C_EF_FORME) |
952 | cf->data[2] |= CAN_ERR_PROT_FORM; | 951 | cf->data[2] |= CAN_ERR_PROT_FORM; |
953 | if (es->leaf.error_factor & M16C_EF_STFE) | 952 | if (es->leaf.error_factor & M16C_EF_STFE) |
diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c index de95b1ccba3e..017ae5002169 100644 --- a/drivers/net/can/usb/usb_8dev.c +++ b/drivers/net/can/usb/usb_8dev.c | |||
@@ -402,8 +402,7 @@ static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv, | |||
402 | break; | 402 | break; |
403 | case USB_8DEV_STATUSMSG_CRC: | 403 | case USB_8DEV_STATUSMSG_CRC: |
404 | cf->data[2] |= CAN_ERR_PROT_UNSPEC; | 404 | cf->data[2] |= CAN_ERR_PROT_UNSPEC; |
405 | cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | 405 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
406 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
407 | rx_errors = 1; | 406 | rx_errors = 1; |
408 | break; | 407 | break; |
409 | case USB_8DEV_STATUSMSG_BIT0: | 408 | case USB_8DEV_STATUSMSG_BIT0: |
diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c index fc55e8e0351d..4c57ddf12684 100644 --- a/drivers/net/can/xilinx_can.c +++ b/drivers/net/can/xilinx_can.c | |||
@@ -618,7 +618,7 @@ static void xcan_err_interrupt(struct net_device *ndev, u32 isr) | |||
618 | stats->tx_errors++; | 618 | stats->tx_errors++; |
619 | if (skb) { | 619 | if (skb) { |
620 | cf->can_id |= CAN_ERR_ACK; | 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,8 +654,7 @@ static void xcan_err_interrupt(struct net_device *ndev, u32 isr) | |||
654 | stats->rx_errors++; | 654 | stats->rx_errors++; |
655 | if (skb) { | 655 | if (skb) { |
656 | cf->can_id |= CAN_ERR_PROT; | 656 | cf->can_id |= CAN_ERR_PROT; |
657 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ | | 657 | cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; |
658 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
659 | } | 658 | } |
660 | } | 659 | } |
661 | priv->can.can_stats.bus_error++; | 660 | priv->can.can_stats.bus_error++; |