int num_fw_handles, k, l;
 
        /* Determine number of handles */
+       mutex_lock(&ehea_fw_handles.lock);
+
        list_for_each_entry(adapter, &adapter_list, list) {
                num_adapters++;
 
        if (num_fw_handles) {
                arr = kzalloc(num_fw_handles * sizeof(*arr), GFP_KERNEL);
                if (!arr)
-                       return;  /* Keep the existing array */
+                       goto out;  /* Keep the existing array */
        } else
                goto out_update;
 
        list_for_each_entry(adapter, &adapter_list, list) {
+               if (num_adapters == 0)
+                       break;
+
                for (k = 0; k < EHEA_MAX_PORTS; k++) {
                        struct ehea_port *port = adapter->port[k];
 
-                       if (!port || (port->state != EHEA_PORT_UP))
+                       if (!port || (port->state != EHEA_PORT_UP)
+                               || (num_ports == 0))
                                continue;
 
                        for (l = 0;
                        }
                        arr[i].adh = adapter->handle;
                        arr[i++].fwh = port->qp_eq->fw_handle;
+                       num_ports--;
                }
 
                arr[i].adh = adapter->handle;
                        arr[i].adh = adapter->handle;
                        arr[i++].fwh = adapter->mr.handle;
                }
+               num_adapters--;
        }
 
 out_update:
        kfree(ehea_fw_handles.arr);
        ehea_fw_handles.arr = arr;
        ehea_fw_handles.num_entries = i;
+out:
+       mutex_unlock(&ehea_fw_handles.lock);
 }
 
 static void ehea_update_bcmc_registrations(void)
 {
+       unsigned long flags;
        struct ehea_bcmc_reg_entry *arr = NULL;
        struct ehea_adapter *adapter;
        struct ehea_mc_list *mc_entry;
        int i = 0;
        int k;
 
+       spin_lock_irqsave(&ehea_bcmc_regs.lock, flags);
+
        /* Determine number of registrations */
        list_for_each_entry(adapter, &adapter_list, list)
                for (k = 0; k < EHEA_MAX_PORTS; k++) {
        if (num_registrations) {
                arr = kzalloc(num_registrations * sizeof(*arr), GFP_ATOMIC);
                if (!arr)
-                       return;  /* Keep the existing array */
+                       goto out;  /* Keep the existing array */
        } else
                goto out_update;
 
                        if (!port || (port->state != EHEA_PORT_UP))
                                continue;
 
+                       if (num_registrations == 0)
+                               goto out_update;
+
                        arr[i].adh = adapter->handle;
                        arr[i].port_id = port->logical_port_id;
                        arr[i].reg_type = EHEA_BCMC_BROADCAST |
                        arr[i].reg_type = EHEA_BCMC_BROADCAST |
                                          EHEA_BCMC_VLANID_ALL;
                        arr[i++].macaddr = port->mac_addr;
+                       num_registrations -= 2;
 
                        list_for_each_entry(mc_entry,
                                            &port->mc_list->list, list) {
+                               if (num_registrations == 0)
+                                       goto out_update;
+
                                arr[i].adh = adapter->handle;
                                arr[i].port_id = port->logical_port_id;
                                arr[i].reg_type = EHEA_BCMC_SCOPE_ALL |
                                                  EHEA_BCMC_MULTICAST |
                                                  EHEA_BCMC_VLANID_ALL;
                                arr[i++].macaddr = mc_entry->macaddr;
+                               num_registrations -= 2;
                        }
                }
        }
        kfree(ehea_bcmc_regs.arr);
        ehea_bcmc_regs.arr = arr;
        ehea_bcmc_regs.num_entries = i;
+out:
+       spin_unlock_irqrestore(&ehea_bcmc_regs.lock, flags);
 }
 
 static struct net_device_stats *ehea_get_stats(struct net_device *dev)
 
        memcpy(dev->dev_addr, mac_addr->sa_data, dev->addr_len);
 
-       spin_lock(&ehea_bcmc_regs.lock);
-
        /* Deregister old MAC in pHYP */
        if (port->state == EHEA_PORT_UP) {
                ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
 
 out_upregs:
        ehea_update_bcmc_registrations();
-       spin_unlock(&ehea_bcmc_regs.lock);
 out_free:
        free_page((unsigned long)cb0);
 out:
        }
        ehea_promiscuous(dev, 0);
 
-       spin_lock(&ehea_bcmc_regs.lock);
-
        if (dev->flags & IFF_ALLMULTI) {
                ehea_allmulti(dev, 1);
                goto out;
        }
 out:
        ehea_update_bcmc_registrations();
-       spin_unlock(&ehea_bcmc_regs.lock);
        return;
 }
 
        if (port->state == EHEA_PORT_UP)
                return 0;
 
-       mutex_lock(&ehea_fw_handles.lock);
-
        ret = ehea_port_res_setup(port, port->num_def_qps,
                                  port->num_add_tx_qps);
        if (ret) {
                }
        }
 
-       spin_lock(&ehea_bcmc_regs.lock);
-
        ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
        if (ret) {
                ret = -EIO;
                ehea_info("Failed starting %s. ret=%i", dev->name, ret);
 
        ehea_update_bcmc_registrations();
-       spin_unlock(&ehea_bcmc_regs.lock);
-
        ehea_update_firmware_handles();
-       mutex_unlock(&ehea_fw_handles.lock);
 
        return ret;
 }
        if (port->state == EHEA_PORT_DOWN)
                return 0;
 
-       mutex_lock(&ehea_fw_handles.lock);
-
-       spin_lock(&ehea_bcmc_regs.lock);
        ehea_drop_multicast_list(dev);
        ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
 
        port->state = EHEA_PORT_DOWN;
 
        ehea_update_bcmc_registrations();
-       spin_unlock(&ehea_bcmc_regs.lock);
 
        ret = ehea_clean_all_portres(port);
        if (ret)
                          dev->name, ret);
 
        ehea_update_firmware_handles();
-       mutex_unlock(&ehea_fw_handles.lock);
 
        return ret;
 }
                ehea_error("Invalid ibmebus device probed");
                return -EINVAL;
        }
-       mutex_lock(&ehea_fw_handles.lock);
 
        adapter = kzalloc(sizeof(*adapter), GFP_KERNEL);
        if (!adapter) {
 
 out:
        ehea_update_firmware_handles();
-       mutex_unlock(&ehea_fw_handles.lock);
+
        return ret;
 }
 
 
        flush_scheduled_work();
 
-       mutex_lock(&ehea_fw_handles.lock);
-
        ibmebus_free_irq(adapter->neq->attr.ist1, adapter);
        tasklet_kill(&adapter->neq_tasklet);
 
        kfree(adapter);
 
        ehea_update_firmware_handles();
-       mutex_unlock(&ehea_fw_handles.lock);
 
        return 0;
 }
        default:
                break;
        }
+
+       ehea_update_firmware_handles();
+
        return NOTIFY_OK;
 }