aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/e1000/if_lem.c
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2010-08-28 00:09:19 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2010-08-28 00:09:19 +0000
commitad1917be3760d5441402a0fe6403662671faed3e (patch)
tree39f4093f85ed40455ad12783bf77c4ec4cd006dc /sys/dev/e1000/if_lem.c
parent5c8080f0d940f38ed1f5e1c017f7cb5a55b8b775 (diff)
Do not call voluntary panic(9) in case of if_alloc() failure.
Reviewed by: jfv
Notes
Notes: svn path=/head/; revision=211907
Diffstat (limited to 'sys/dev/e1000/if_lem.c')
-rw-r--r--sys/dev/e1000/if_lem.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sys/dev/e1000/if_lem.c b/sys/dev/e1000/if_lem.c
index 1f03f7b46d29..f5c9e2932a34 100644
--- a/sys/dev/e1000/if_lem.c
+++ b/sys/dev/e1000/if_lem.c
@@ -186,7 +186,7 @@ static int lem_allocate_irq(struct adapter *adapter);
static void lem_free_pci_resources(struct adapter *);
static void lem_local_timer(void *);
static int lem_hardware_init(struct adapter *);
-static void lem_setup_interface(device_t, struct adapter *);
+static int lem_setup_interface(device_t, struct adapter *);
static void lem_setup_transmit_structures(struct adapter *);
static void lem_initialize_transmit_unit(struct adapter *);
static int lem_setup_receive_structures(struct adapter *);
@@ -620,7 +620,8 @@ lem_attach(device_t dev)
lem_get_wakeup(dev);
/* Setup OS specific network interface */
- lem_setup_interface(dev, adapter);
+ if (lem_setup_interface(dev, adapter) != 0)
+ goto err_rx_struct;
/* Initialize statistics */
lem_update_stats_counters(adapter);
@@ -672,6 +673,8 @@ err_rx_desc:
lem_dma_free(adapter, &adapter->txdma);
err_tx_desc:
err_pci:
+ if (adapter->ifp != NULL)
+ if_free(adapter->ifp);
lem_free_pci_resources(adapter);
EM_TX_LOCK_DESTROY(adapter);
EM_RX_LOCK_DESTROY(adapter);
@@ -2388,7 +2391,7 @@ lem_hardware_init(struct adapter *adapter)
* Setup networking device structure and register an interface.
*
**********************************************************************/
-static void
+static int
lem_setup_interface(device_t dev, struct adapter *adapter)
{
struct ifnet *ifp;
@@ -2396,8 +2399,10 @@ lem_setup_interface(device_t dev, struct adapter *adapter)
INIT_DEBUGOUT("lem_setup_interface: begin");
ifp = adapter->ifp = if_alloc(IFT_ETHER);
- if (ifp == NULL)
- panic("%s: can not if_alloc()", device_get_nameunit(dev));
+ if (ifp == NULL) {
+ device_printf(dev, "can not allocate ifnet structure\n");
+ return (-1);
+ }
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_mtu = ETHERMTU;
ifp->if_init = lem_init;
@@ -2473,6 +2478,7 @@ lem_setup_interface(device_t dev, struct adapter *adapter)
}
ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
+ return (0);
}