diff options
Diffstat (limited to 'drivers/net/can/sja1000/sja1000.c')
-rw-r--r-- | drivers/net/can/sja1000/sja1000.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c index ace103a44833..145b1a731a53 100644 --- a/drivers/net/can/sja1000/sja1000.c +++ b/drivers/net/can/sja1000/sja1000.c | |||
@@ -130,8 +130,12 @@ static void set_normal_mode(struct net_device *dev) | |||
130 | /* check reset bit */ | 130 | /* check reset bit */ |
131 | if ((status & MOD_RM) == 0) { | 131 | if ((status & MOD_RM) == 0) { |
132 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 132 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
133 | /* enable all interrupts */ | 133 | /* enable interrupts */ |
134 | priv->write_reg(priv, REG_IER, IRQ_ALL); | 134 | if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) |
135 | priv->write_reg(priv, REG_IER, IRQ_ALL); | ||
136 | else | ||
137 | priv->write_reg(priv, REG_IER, | ||
138 | IRQ_ALL & ~IRQ_BEI); | ||
135 | return; | 139 | return; |
136 | } | 140 | } |
137 | 141 | ||
@@ -203,6 +207,17 @@ static int sja1000_set_bittiming(struct net_device *dev) | |||
203 | return 0; | 207 | return 0; |
204 | } | 208 | } |
205 | 209 | ||
210 | static int sja1000_get_berr_counter(const struct net_device *dev, | ||
211 | struct can_berr_counter *bec) | ||
212 | { | ||
213 | struct sja1000_priv *priv = netdev_priv(dev); | ||
214 | |||
215 | bec->txerr = priv->read_reg(priv, REG_TXERR); | ||
216 | bec->rxerr = priv->read_reg(priv, REG_RXERR); | ||
217 | |||
218 | return 0; | ||
219 | } | ||
220 | |||
206 | /* | 221 | /* |
207 | * initialize SJA1000 chip: | 222 | * initialize SJA1000 chip: |
208 | * - reset chip | 223 | * - reset chip |
@@ -437,6 +452,8 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
437 | CAN_ERR_CRTL_TX_PASSIVE : | 452 | CAN_ERR_CRTL_TX_PASSIVE : |
438 | CAN_ERR_CRTL_RX_PASSIVE; | 453 | CAN_ERR_CRTL_RX_PASSIVE; |
439 | } | 454 | } |
455 | cf->data[6] = txerr; | ||
456 | cf->data[7] = rxerr; | ||
440 | } | 457 | } |
441 | 458 | ||
442 | priv->can.state = state; | 459 | priv->can.state = state; |
@@ -567,7 +584,9 @@ struct net_device *alloc_sja1000dev(int sizeof_priv) | |||
567 | priv->can.bittiming_const = &sja1000_bittiming_const; | 584 | priv->can.bittiming_const = &sja1000_bittiming_const; |
568 | priv->can.do_set_bittiming = sja1000_set_bittiming; | 585 | priv->can.do_set_bittiming = sja1000_set_bittiming; |
569 | priv->can.do_set_mode = sja1000_set_mode; | 586 | priv->can.do_set_mode = sja1000_set_mode; |
570 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | 587 | priv->can.do_get_berr_counter = sja1000_get_berr_counter; |
588 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | | ||
589 | CAN_CTRLMODE_BERR_REPORTING; | ||
571 | 590 | ||
572 | if (sizeof_priv) | 591 | if (sizeof_priv) |
573 | priv->priv = (void *)priv + sizeof(struct sja1000_priv); | 592 | priv->priv = (void *)priv + sizeof(struct sja1000_priv); |