Messages in this thread |  | | Date | Sat, 28 May 2022 09:34:57 +0200 | From | Jimmy Assarsson <> | Subject | Re: [PATCH 03/12] can: kvaser_usb: Fix possible completions during init_completion |
| |
On 5/16/22 15:47, Anssi Hannula wrote: > kvaser_usb uses completions to signal when a response event is received > for outgoing commands. > > However, it uses init_completion() to reinitialize the start_comp and > stop_comp completions before sending the start/stop commands. > > In case the device sends the corresponding response just before the > actual command is sent, complete() may be called concurrently with > init_completion() which is not safe. > > This might be triggerable even with a properly functioning device by > stopping the interface (CMD_STOP_CHIP) just after it goes bus-off (which > also causes the driver to send CMD_STOP_CHIP when restart-ms is off), > but that was not tested. > > Fix the issue by using reinit_completion() instead. > > Fixes: 080f40a6fa28 ("can: kvaser_usb: Add support for Kvaser CAN/USB devices") > Signed-off-by: Anssi Hannula <anssi.hannula@bitwise.fi>
Looks good to me. Tested-by: Jimmy Assarsson <extja@kvaser.com>
> --- > drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 4 ++-- > drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 4 ++-- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c > index 4e90a4b7f95a..b0094f162964 100644 > --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c > +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c > @@ -1869,7 +1869,7 @@ static int kvaser_usb_hydra_start_chip(struct kvaser_usb_net_priv *priv) > { > int err; > > - init_completion(&priv->start_comp); > + reinit_completion(&priv->start_comp); > > err = kvaser_usb_hydra_send_simple_cmd(priv->dev, CMD_START_CHIP_REQ, > priv->channel); > @@ -1887,7 +1887,7 @@ static int kvaser_usb_hydra_stop_chip(struct kvaser_usb_net_priv *priv) > { > int err; > > - init_completion(&priv->stop_comp); > + reinit_completion(&priv->stop_comp); > > /* Make sure we do not report invalid BUS_OFF from CMD_CHIP_STATE_EVENT > * see comment in kvaser_usb_hydra_update_state() > diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c > index d9f40b9702a5..09ade66256b2 100644 > --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c > +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c > @@ -1300,7 +1300,7 @@ static int kvaser_usb_leaf_start_chip(struct kvaser_usb_net_priv *priv) > { > int err; > > - init_completion(&priv->start_comp); > + reinit_completion(&priv->start_comp); > > err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_START_CHIP, > priv->channel); > @@ -1318,7 +1318,7 @@ static int kvaser_usb_leaf_stop_chip(struct kvaser_usb_net_priv *priv) > { > int err; > > - init_completion(&priv->stop_comp); > + reinit_completion(&priv->stop_comp); > > err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_STOP_CHIP, > priv->channel);
|  |