Revert "ehea: fix mutex and spinlock use"
authorDavid S. Miller <davem@davemloft.net>
Thu, 25 Sep 2008 20:06:59 +0000 (13:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 25 Sep 2008 20:06:59 +0000 (13:06 -0700)
This reverts commit 2eefbd63d0c85daa1317636474c226e236beba81.

On request by driver author and Jeff Garzik.

Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ehea/ehea_main.c

index c765ec609462eec1cc566ac77c836f071fd2d704..b70c5314f53733c3e22beb090a4559781f8f6099 100644 (file)
@@ -219,11 +219,9 @@ static void ehea_update_firmware_handles(void)
        }
 
 out_update:
-       mutex_lock(&ehea_fw_handles.lock);
        kfree(ehea_fw_handles.arr);
        ehea_fw_handles.arr = arr;
        ehea_fw_handles.num_entries = i;
-       mutex_unlock(&ehea_fw_handles.lock);
 }
 
 static void ehea_update_bcmc_registrations(void)
@@ -295,11 +293,9 @@ static void ehea_update_bcmc_registrations(void)
        }
 
 out_update:
-       spin_lock(&ehea_bcmc_regs.lock);
        kfree(ehea_bcmc_regs.arr);
        ehea_bcmc_regs.arr = arr;
        ehea_bcmc_regs.num_entries = i;
-       spin_unlock(&ehea_bcmc_regs.lock);
 }
 
 static struct net_device_stats *ehea_get_stats(struct net_device *dev)
@@ -1774,6 +1770,8 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa)
 
        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);
@@ -1794,6 +1792,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa)
 
 out_upregs:
        ehea_update_bcmc_registrations();
+       spin_unlock(&ehea_bcmc_regs.lock);
 out_free:
        kfree(cb0);
 out:
@@ -1955,6 +1954,8 @@ static void ehea_set_multicast_list(struct net_device *dev)
        }
        ehea_promiscuous(dev, 0);
 
+       spin_lock(&ehea_bcmc_regs.lock);
+
        if (dev->flags & IFF_ALLMULTI) {
                ehea_allmulti(dev, 1);
                goto out;
@@ -1984,6 +1985,7 @@ static void ehea_set_multicast_list(struct net_device *dev)
        }
 out:
        ehea_update_bcmc_registrations();
+       spin_unlock(&ehea_bcmc_regs.lock);
        return;
 }
 
@@ -2464,6 +2466,8 @@ static int ehea_up(struct net_device *dev)
        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) {
@@ -2500,6 +2504,8 @@ static int ehea_up(struct net_device *dev)
                }
        }
 
+       spin_lock(&ehea_bcmc_regs.lock);
+
        ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
        if (ret) {
                ret = -EIO;
@@ -2521,8 +2527,10 @@ out:
                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;
 }
@@ -2572,6 +2580,9 @@ static int ehea_down(struct net_device *dev)
        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);
 
@@ -2580,6 +2591,7 @@ static int ehea_down(struct net_device *dev)
        port->state = EHEA_PORT_DOWN;
 
        ehea_update_bcmc_registrations();
+       spin_unlock(&ehea_bcmc_regs.lock);
 
        ret = ehea_clean_all_portres(port);
        if (ret)
@@ -2587,6 +2599,7 @@ static int ehea_down(struct net_device *dev)
                          dev->name, ret);
 
        ehea_update_firmware_handles();
+       mutex_unlock(&ehea_fw_handles.lock);
 
        return ret;
 }
@@ -3365,6 +3378,7 @@ static int __devinit ehea_probe_adapter(struct of_device *dev,
                ehea_error("Invalid ibmebus device probed");
                return -EINVAL;
        }
+       mutex_lock(&ehea_fw_handles.lock);
 
        adapter = kzalloc(sizeof(*adapter), GFP_KERNEL);
        if (!adapter) {
@@ -3448,6 +3462,7 @@ out_free_ad:
 
 out:
        ehea_update_firmware_handles();
+       mutex_unlock(&ehea_fw_handles.lock);
        return ret;
 }
 
@@ -3466,6 +3481,8 @@ static int __devexit ehea_remove(struct of_device *dev)
 
        flush_scheduled_work();
 
+       mutex_lock(&ehea_fw_handles.lock);
+
        ibmebus_free_irq(adapter->neq->attr.ist1, adapter);
        tasklet_kill(&adapter->neq_tasklet);
 
@@ -3475,6 +3492,7 @@ static int __devexit ehea_remove(struct of_device *dev)
        kfree(adapter);
 
        ehea_update_firmware_handles();
+       mutex_unlock(&ehea_fw_handles.lock);
 
        return 0;
 }