Skip to content

Commit

Permalink
drivers/net: process the result of hdlc_open() and add call of hdlc_c…
Browse files Browse the repository at this point in the history
…lose() in uhdlc_close()

[ Upstream commit a59adda ]

Process the result of hdlc_open() and call uhdlc_close()
in case of an error. It is necessary to pass the error
code up the control flow, similar to a possible
error in request_irq().
Also add a hdlc_close() call to the uhdlc_close()
because the comment to hdlc_close() says it must be called
by the hardware driver when the HDLC device is being closed

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Fixes: c19b6d2 ("drivers/net: support hdlc function for QE-UCC")
Signed-off-by: Alexandra Diupina <adiupina@astralinux.ru>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Alexandra Diupina authored and Greg Kroah-Hartman committed Oct 10, 2023
1 parent ebad2e4 commit 3f6fbbc
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/net/wan/fsl_ucc_hdlc.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
#define TDM_PPPOHT_SLIC_MAXIN
#define RX_BD_ERRORS (R_CD_S | R_OV_S | R_CR_S | R_AB_S | R_NO_S | R_LG_S)

static int uhdlc_close(struct net_device *dev);

static struct ucc_tdm_info utdm_primary_info = {
.uf_info = {
.tsa = 0,
Expand Down Expand Up @@ -705,6 +707,7 @@ static int uhdlc_open(struct net_device *dev)
hdlc_device *hdlc = dev_to_hdlc(dev);
struct ucc_hdlc_private *priv = hdlc->priv;
struct ucc_tdm *utdm = priv->utdm;
int rc = 0;

if (priv->hdlc_busy != 1) {
if (request_irq(priv->ut_info->uf_info.irq,
Expand All @@ -728,10 +731,13 @@ static int uhdlc_open(struct net_device *dev)
napi_enable(&priv->napi);
netdev_reset_queue(dev);
netif_start_queue(dev);
hdlc_open(dev);

rc = hdlc_open(dev);
if (rc)
uhdlc_close(dev);
}

return 0;
return rc;
}

static void uhdlc_memclean(struct ucc_hdlc_private *priv)
Expand Down Expand Up @@ -821,6 +827,8 @@ static int uhdlc_close(struct net_device *dev)
netdev_reset_queue(dev);
priv->hdlc_busy = 0;

hdlc_close(dev);

return 0;
}

Expand Down

0 comments on commit 3f6fbbc

Please sign in to comment.