diff options
author | Andri Yngvason <andri.yngvason@marel.com> | 2015-01-16 09:30:28 -0500 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2015-01-20 07:56:53 -0500 |
commit | be38a6f9f4093b0f1fa9e7d8cb47d588bc117c21 (patch) | |
tree | 41a834156d6483c55fa28eccfc208449bff67d95 | |
parent | 0c49087462e8587c12ecfeaf1dd46fdc0ddc4532 (diff) |
can: move can_stats.bus_off++ from can_bus_off into can_change_state
In order to be able to move the stats increment from can_bus_off() into
can_change_state(), the increment had to be moved back into code that was using
can_bus_off() but not can_change_state().
As a side-effect, this patch fixes the following bugs:
* Redundant call to can_bus_off() in c_can.
* Bus-off counted twice in xilinx_can.
Signed-off-by: Andri Yngvason <andri.yngvason@marel.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r-- | drivers/net/can/bfin_can.c | 1 | ||||
-rw-r--r-- | drivers/net/can/c_can/c_can.c | 2 | ||||
-rw-r--r-- | drivers/net/can/cc770/cc770.c | 1 | ||||
-rw-r--r-- | drivers/net/can/dev.c | 3 | ||||
-rw-r--r-- | drivers/net/can/janz-ican3.c | 1 | ||||
-rw-r--r-- | drivers/net/can/m_can/m_can.c | 1 | ||||
-rw-r--r-- | drivers/net/can/pch_can.c | 1 | ||||
-rw-r--r-- | drivers/net/can/rcar_can.c | 1 | ||||
-rw-r--r-- | drivers/net/can/softing/softing_main.c | 1 | ||||
-rw-r--r-- | drivers/net/can/spi/mcp251x.c | 1 | ||||
-rw-r--r-- | drivers/net/can/ti_hecc.c | 1 | ||||
-rw-r--r-- | drivers/net/can/usb/ems_usb.c | 1 | ||||
-rw-r--r-- | drivers/net/can/usb/esd_usb2.c | 1 | ||||
-rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb.c | 1 | ||||
-rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_pro.c | 1 | ||||
-rw-r--r-- | drivers/net/can/usb/usb_8dev.c | 1 |
16 files changed, 17 insertions, 2 deletions
diff --git a/drivers/net/can/bfin_can.c b/drivers/net/can/bfin_can.c index 417d50998e31..e7a6363e736b 100644 --- a/drivers/net/can/bfin_can.c +++ b/drivers/net/can/bfin_can.c | |||
@@ -352,6 +352,7 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) | |||
352 | netdev_dbg(dev, "bus-off mode interrupt\n"); | 352 | netdev_dbg(dev, "bus-off mode interrupt\n"); |
353 | state = CAN_STATE_BUS_OFF; | 353 | state = CAN_STATE_BUS_OFF; |
354 | cf->can_id |= CAN_ERR_BUSOFF; | 354 | cf->can_id |= CAN_ERR_BUSOFF; |
355 | priv->can.can_stats.bus_off++; | ||
355 | can_bus_off(dev); | 356 | can_bus_off(dev); |
356 | } | 357 | } |
357 | 358 | ||
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index f94a9fa60488..70f77e96d409 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
@@ -866,7 +866,7 @@ static int c_can_handle_state_change(struct net_device *dev, | |||
866 | case C_CAN_BUS_OFF: | 866 | case C_CAN_BUS_OFF: |
867 | /* bus-off state */ | 867 | /* bus-off state */ |
868 | priv->can.state = CAN_STATE_BUS_OFF; | 868 | priv->can.state = CAN_STATE_BUS_OFF; |
869 | can_bus_off(dev); | 869 | priv->can.can_stats.bus_off++; |
870 | break; | 870 | break; |
871 | default: | 871 | default: |
872 | break; | 872 | break; |
diff --git a/drivers/net/can/cc770/cc770.c b/drivers/net/can/cc770/cc770.c index c486fe510f37..c11d44984036 100644 --- a/drivers/net/can/cc770/cc770.c +++ b/drivers/net/can/cc770/cc770.c | |||
@@ -535,6 +535,7 @@ static int cc770_err(struct net_device *dev, u8 status) | |||
535 | cc770_write_reg(priv, control, CTRL_INI); | 535 | cc770_write_reg(priv, control, CTRL_INI); |
536 | cf->can_id |= CAN_ERR_BUSOFF; | 536 | cf->can_id |= CAN_ERR_BUSOFF; |
537 | priv->can.state = CAN_STATE_BUS_OFF; | 537 | priv->can.state = CAN_STATE_BUS_OFF; |
538 | priv->can.can_stats.bus_off++; | ||
538 | can_bus_off(dev); | 539 | can_bus_off(dev); |
539 | } else if (status & STAT_WARN) { | 540 | } else if (status & STAT_WARN) { |
540 | cf->can_id |= CAN_ERR_CRTL; | 541 | cf->can_id |= CAN_ERR_CRTL; |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 3ec8f6f25e5f..e54dbc1a76ba 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -289,6 +289,8 @@ static void can_update_state_error_stats(struct net_device *dev, | |||
289 | priv->can_stats.error_passive++; | 289 | priv->can_stats.error_passive++; |
290 | break; | 290 | break; |
291 | case CAN_STATE_BUS_OFF: | 291 | case CAN_STATE_BUS_OFF: |
292 | priv->can_stats.bus_off++; | ||
293 | break; | ||
292 | default: | 294 | default: |
293 | break; | 295 | break; |
294 | }; | 296 | }; |
@@ -544,7 +546,6 @@ void can_bus_off(struct net_device *dev) | |||
544 | netdev_dbg(dev, "bus-off\n"); | 546 | netdev_dbg(dev, "bus-off\n"); |
545 | 547 | ||
546 | netif_carrier_off(dev); | 548 | netif_carrier_off(dev); |
547 | priv->can_stats.bus_off++; | ||
548 | 549 | ||
549 | if (priv->restart_ms) | 550 | if (priv->restart_ms) |
550 | mod_timer(&priv->restart_timer, | 551 | mod_timer(&priv->restart_timer, |
diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c index 1b118394907f..0eb4d181ae4d 100644 --- a/drivers/net/can/janz-ican3.c +++ b/drivers/net/can/janz-ican3.c | |||
@@ -1008,6 +1008,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) | |||
1008 | if (status & SR_BS) { | 1008 | if (status & SR_BS) { |
1009 | state = CAN_STATE_BUS_OFF; | 1009 | state = CAN_STATE_BUS_OFF; |
1010 | cf->can_id |= CAN_ERR_BUSOFF; | 1010 | cf->can_id |= CAN_ERR_BUSOFF; |
1011 | mod->can.can_stats.bus_off++; | ||
1011 | can_bus_off(dev); | 1012 | can_bus_off(dev); |
1012 | } else if (status & SR_ES) { | 1013 | } else if (status & SR_ES) { |
1013 | if (rxerr >= 128 || txerr >= 128) | 1014 | if (rxerr >= 128 || txerr >= 128) |
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index d7bc462aafdc..b2ecb6c5e94b 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c | |||
@@ -589,6 +589,7 @@ static int m_can_handle_state_change(struct net_device *dev, | |||
589 | /* bus-off state */ | 589 | /* bus-off state */ |
590 | priv->can.state = CAN_STATE_BUS_OFF; | 590 | priv->can.state = CAN_STATE_BUS_OFF; |
591 | m_can_disable_all_interrupts(priv); | 591 | m_can_disable_all_interrupts(priv); |
592 | priv->can.can_stats.bus_off++; | ||
592 | can_bus_off(dev); | 593 | can_bus_off(dev); |
593 | break; | 594 | break; |
594 | default: | 595 | default: |
diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c index a67eb01f3028..e187ca783da0 100644 --- a/drivers/net/can/pch_can.c +++ b/drivers/net/can/pch_can.c | |||
@@ -505,6 +505,7 @@ static void pch_can_error(struct net_device *ndev, u32 status) | |||
505 | pch_can_set_rx_all(priv, 0); | 505 | pch_can_set_rx_all(priv, 0); |
506 | state = CAN_STATE_BUS_OFF; | 506 | state = CAN_STATE_BUS_OFF; |
507 | cf->can_id |= CAN_ERR_BUSOFF; | 507 | cf->can_id |= CAN_ERR_BUSOFF; |
508 | priv->can.can_stats.bus_off++; | ||
508 | can_bus_off(ndev); | 509 | can_bus_off(ndev); |
509 | } | 510 | } |
510 | 511 | ||
diff --git a/drivers/net/can/rcar_can.c b/drivers/net/can/rcar_can.c index 91cd48ca0efc..7deb80dcbe8c 100644 --- a/drivers/net/can/rcar_can.c +++ b/drivers/net/can/rcar_can.c | |||
@@ -331,6 +331,7 @@ static void rcar_can_error(struct net_device *ndev) | |||
331 | priv->can.state = CAN_STATE_BUS_OFF; | 331 | priv->can.state = CAN_STATE_BUS_OFF; |
332 | /* Clear interrupt condition */ | 332 | /* Clear interrupt condition */ |
333 | writeb(~RCAR_CAN_EIFR_BOEIF, &priv->regs->eifr); | 333 | writeb(~RCAR_CAN_EIFR_BOEIF, &priv->regs->eifr); |
334 | priv->can.can_stats.bus_off++; | ||
334 | can_bus_off(ndev); | 335 | can_bus_off(ndev); |
335 | if (skb) | 336 | if (skb) |
336 | cf->can_id |= CAN_ERR_BUSOFF; | 337 | cf->can_id |= CAN_ERR_BUSOFF; |
diff --git a/drivers/net/can/softing/softing_main.c b/drivers/net/can/softing/softing_main.c index 2bf98d862302..7621f91a8a20 100644 --- a/drivers/net/can/softing/softing_main.c +++ b/drivers/net/can/softing/softing_main.c | |||
@@ -261,6 +261,7 @@ static int softing_handle_1(struct softing *card) | |||
261 | ++priv->can.can_stats.error_passive; | 261 | ++priv->can.can_stats.error_passive; |
262 | else if (can_state == CAN_STATE_BUS_OFF) { | 262 | else if (can_state == CAN_STATE_BUS_OFF) { |
263 | /* this calls can_close_cleanup() */ | 263 | /* this calls can_close_cleanup() */ |
264 | ++priv->can.can_stats.bus_off; | ||
264 | can_bus_off(netdev); | 265 | can_bus_off(netdev); |
265 | netif_stop_queue(netdev); | 266 | netif_stop_queue(netdev); |
266 | } | 267 | } |
diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c index c66d699640a9..bf63fee4e743 100644 --- a/drivers/net/can/spi/mcp251x.c +++ b/drivers/net/can/spi/mcp251x.c | |||
@@ -905,6 +905,7 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) | |||
905 | if (priv->can.state == CAN_STATE_BUS_OFF) { | 905 | if (priv->can.state == CAN_STATE_BUS_OFF) { |
906 | if (priv->can.restart_ms == 0) { | 906 | if (priv->can.restart_ms == 0) { |
907 | priv->force_quit = 1; | 907 | priv->force_quit = 1; |
908 | priv->can.can_stats.bus_off++; | ||
908 | can_bus_off(net); | 909 | can_bus_off(net); |
909 | mcp251x_hw_sleep(spi); | 910 | mcp251x_hw_sleep(spi); |
910 | break; | 911 | break; |
diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c index 9a07eafe554b..e95a9e1a889f 100644 --- a/drivers/net/can/ti_hecc.c +++ b/drivers/net/can/ti_hecc.c | |||
@@ -715,6 +715,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
715 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR); | 715 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR); |
716 | /* Disable all interrupts in bus-off to avoid int hog */ | 716 | /* Disable all interrupts in bus-off to avoid int hog */ |
717 | hecc_write(priv, HECC_CANGIM, 0); | 717 | hecc_write(priv, HECC_CANGIM, 0); |
718 | ++priv->can.can_stats.bus_off; | ||
718 | can_bus_off(ndev); | 719 | can_bus_off(ndev); |
719 | } | 720 | } |
720 | 721 | ||
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 29d3f0938eb8..9376f5e5b94e 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
@@ -347,6 +347,7 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
347 | dev->can.state = CAN_STATE_BUS_OFF; | 347 | dev->can.state = CAN_STATE_BUS_OFF; |
348 | cf->can_id |= CAN_ERR_BUSOFF; | 348 | cf->can_id |= CAN_ERR_BUSOFF; |
349 | 349 | ||
350 | dev->can.can_stats.bus_off++; | ||
350 | can_bus_off(dev->netdev); | 351 | can_bus_off(dev->netdev); |
351 | } else if (state & SJA1000_SR_ES) { | 352 | } else if (state & SJA1000_SR_ES) { |
352 | dev->can.state = CAN_STATE_ERROR_WARNING; | 353 | dev->can.state = CAN_STATE_ERROR_WARNING; |
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index c063a54ab8dd..bacca0bd89c1 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c | |||
@@ -250,6 +250,7 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv, | |||
250 | case ESD_BUSSTATE_BUSOFF: | 250 | case ESD_BUSSTATE_BUSOFF: |
251 | priv->can.state = CAN_STATE_BUS_OFF; | 251 | priv->can.state = CAN_STATE_BUS_OFF; |
252 | cf->can_id |= CAN_ERR_BUSOFF; | 252 | cf->can_id |= CAN_ERR_BUSOFF; |
253 | priv->can.can_stats.bus_off++; | ||
253 | can_bus_off(priv->netdev); | 254 | can_bus_off(priv->netdev); |
254 | break; | 255 | break; |
255 | case ESD_BUSSTATE_WARN: | 256 | case ESD_BUSSTATE_WARN: |
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c index 4e1659d07979..2a1c9ce53fae 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb.c | |||
@@ -488,6 +488,7 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, | |||
488 | switch (new_state) { | 488 | switch (new_state) { |
489 | case CAN_STATE_BUS_OFF: | 489 | case CAN_STATE_BUS_OFF: |
490 | cf->can_id |= CAN_ERR_BUSOFF; | 490 | cf->can_id |= CAN_ERR_BUSOFF; |
491 | mc->pdev->dev.can.can_stats.bus_off++; | ||
491 | can_bus_off(mc->netdev); | 492 | can_bus_off(mc->netdev); |
492 | break; | 493 | break; |
493 | 494 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index 4cfa3b8605b1..145fa87c31b9 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | |||
@@ -634,6 +634,7 @@ static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, | |||
634 | switch (new_state) { | 634 | switch (new_state) { |
635 | case CAN_STATE_BUS_OFF: | 635 | case CAN_STATE_BUS_OFF: |
636 | can_frame->can_id |= CAN_ERR_BUSOFF; | 636 | can_frame->can_id |= CAN_ERR_BUSOFF; |
637 | dev->can.can_stats.bus_off++; | ||
637 | can_bus_off(netdev); | 638 | can_bus_off(netdev); |
638 | break; | 639 | break; |
639 | 640 | ||
diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c index ef674ecb82f8..dd52c7a4c80d 100644 --- a/drivers/net/can/usb/usb_8dev.c +++ b/drivers/net/can/usb/usb_8dev.c | |||
@@ -377,6 +377,7 @@ static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv, | |||
377 | case USB_8DEV_STATUSMSG_BUSOFF: | 377 | case USB_8DEV_STATUSMSG_BUSOFF: |
378 | priv->can.state = CAN_STATE_BUS_OFF; | 378 | priv->can.state = CAN_STATE_BUS_OFF; |
379 | cf->can_id |= CAN_ERR_BUSOFF; | 379 | cf->can_id |= CAN_ERR_BUSOFF; |
380 | priv->can.can_stats.bus_off++; | ||
380 | can_bus_off(priv->netdev); | 381 | can_bus_off(priv->netdev); |
381 | break; | 382 | break; |
382 | case USB_8DEV_STATUSMSG_OVERRUN: | 383 | case USB_8DEV_STATUSMSG_OVERRUN: |