diff options
author | Pyun YongHyeon <yongari@FreeBSD.org> | 2010-08-28 00:09:19 +0000 |
---|---|---|
committer | Pyun YongHyeon <yongari@FreeBSD.org> | 2010-08-28 00:09:19 +0000 |
commit | ad1917be3760d5441402a0fe6403662671faed3e (patch) | |
tree | 39f4093f85ed40455ad12783bf77c4ec4cd006dc /sys/dev/e1000/if_lem.c | |
parent | 5c8080f0d940f38ed1f5e1c017f7cb5a55b8b775 (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.c | 16 |
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); } |