Module Name: src
Committed By: msaitoh
Date: Mon Oct 23 09:23:25 UTC 2017
Modified Files:
src/sys/arch/arm/broadcom: bcm53xx_eth.c
Log Message:
If error occured in bcmeth_ccb_attach(), free resources and return.
To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/arm/broadcom/bcm53xx_eth.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/broadcom/bcm53xx_eth.c
diff -u src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.30
--- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29 Thu Dec 15 09:28:02 2016
+++ src/sys/arch/arm/broadcom/bcm53xx_eth.c Mon Oct 23 09:23:25 2017
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.29 2016/12/15 09:28:02 ozaki-r Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.30 2017/10/23 09:23:25 msaitoh Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -321,45 +321,52 @@ bcmeth_ccb_attach(device_t parent, devic
error = bcmeth_rxq_attach(sc, &sc->sc_rxq, 0);
if (error) {
aprint_error(": failed to init rxq: %d\n", error);
- return;
+ goto fail_1;
}
error = bcmeth_txq_attach(sc, &sc->sc_txq, 0);
if (error) {
aprint_error(": failed to init txq: %d\n", error);
- return;
+ goto fail_1;
}
error = bcmeth_mapcache_create(sc, &sc->sc_rx_mapcache,
BCMETH_MAXRXMBUFS, MCLBYTES, BCMETH_NRXSEGS);
if (error) {
aprint_error(": failed to allocate rx dmamaps: %d\n", error);
- return;
+ goto fail_1;
}
error = bcmeth_mapcache_create(sc, &sc->sc_tx_mapcache,
BCMETH_MAXTXMBUFS, MCLBYTES, BCMETH_NTXSEGS);
if (error) {
aprint_error(": failed to allocate tx dmamaps: %d\n", error);
- return;
+ goto fail_1;
}
error = workqueue_create(&sc->sc_workq, xname, bcmeth_worker, sc,
(PRI_USER + MAXPRI_USER) / 2, IPL_NET, WQ_MPSAFE|WQ_PERCPU);
if (error) {
aprint_error(": failed to create workqueue: %d\n", error);
- return;
+ goto fail_2;
}
sc->sc_soft_ih = softint_establish(SOFTINT_MPSAFE | SOFTINT_NET,
bcmeth_soft_intr, sc);
+ if (sc->sc_ih == NULL) {
+ aprint_error_dev(self, "failed to establish interrupt %d\n",
+ loc->loc_intrs[0]);
+ goto fail_3;
+ }
+
sc->sc_ih = intr_establish(loc->loc_intrs[0], IPL_VM, IST_LEVEL,
bcmeth_intr, sc);
if (sc->sc_ih == NULL) {
aprint_error_dev(self, "failed to establish interrupt %d\n",
loc->loc_intrs[0]);
+ goto fail_4;
} else {
aprint_normal_dev(self, "interrupting on irq %d\n",
loc->loc_intrs[0]);
@@ -401,7 +408,12 @@ bcmeth_ccb_attach(device_t parent, devic
/*
* Attach the interface.
*/
- if_initialize(ifp);
+ error = if_initialize(ifp);
+ if (error != 0) {
+ aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+ error);
+ goto fail_5;
+ }
ether_ifattach(ifp, sc->sc_enaddr);
if_register(ifp);
@@ -419,6 +431,20 @@ bcmeth_ccb_attach(device_t parent, devic
evcnt_attach_dynamic(&sc->sc_ev_rx_badmagic_hi, EVCNT_TYPE_MISC,
NULL, xname, "rx badmagic hi");
#endif
+
+ return;
+
+fail_5:
+ ifmedia_removeall(&sc->sc_media);
+fail_4:
+ intr_disestablish(sc->sc_ih);
+fail_3:
+ softint_disestablish(sc->sc_soft_ih);
+fail_2:
+ workqueue_destroy(sc->sc_workq);
+fail_1:
+ mutex_obj_free(sc->sc_lock);
+ mutex_obj_free(sc->sc_hwlock);
}
static int