Merge git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus
[pandora-kernel.git] / drivers / net / vxge / vxge-config.c
index 401bebf..32763b2 100644 (file)
@@ -159,16 +159,15 @@ vxge_hw_vpath_fw_api(struct __vxge_hw_virtualpath *vpath, u32 action,
                     u32 fw_memo, u32 offset, u64 *data0, u64 *data1,
                     u64 *steer_ctrl)
 {
-       struct vxge_hw_vpath_reg __iomem *vp_reg;
+       struct vxge_hw_vpath_reg __iomem *vp_reg = vpath->vp_reg;
        enum vxge_hw_status status;
        u64 val64;
-       u32 retry = 0, max_retry = 100;
-
-       vp_reg = vpath->vp_reg;
+       u32 retry = 0, max_retry = 3;
 
-       if (vpath->vp_open) {
-               max_retry = 3;
-               spin_lock(&vpath->lock);
+       spin_lock(&vpath->lock);
+       if (!vpath->vp_open) {
+               spin_unlock(&vpath->lock);
+               max_retry = 100;
        }
 
        writeq(*data0, &vp_reg->rts_access_steer_data0);
@@ -1000,7 +999,7 @@ exit:
 /**
  * vxge_hw_device_hw_info_get - Get the hw information
  * Returns the vpath mask that has the bits set for each vpath allocated
- * for the driver, FW version information and the first mac addresse for
+ * for the driver, FW version information, and the first mac address for
  * each vpath
  */
 enum vxge_hw_status __devinit
@@ -1064,9 +1063,10 @@ vxge_hw_device_hw_info_get(void __iomem *bar0,
 
                val64 = readq(&toc->toc_vpath_pointer[i]);
 
+               spin_lock_init(&vpath.lock);
                vpath.vp_reg = (struct vxge_hw_vpath_reg __iomem *)
                               (bar0 + val64);
-               vpath.vp_open = 0;
+               vpath.vp_open = VXGE_HW_VP_NOT_OPEN;
 
                status = __vxge_hw_vpath_pci_func_mode_get(&vpath, hw_info);
                if (status != VXGE_HW_OK)
@@ -1090,7 +1090,7 @@ vxge_hw_device_hw_info_get(void __iomem *bar0,
                val64 = readq(&toc->toc_vpath_pointer[i]);
                vpath.vp_reg = (struct vxge_hw_vpath_reg __iomem *)
                               (bar0 + val64);
-               vpath.vp_open = 0;
+               vpath.vp_open = VXGE_HW_VP_NOT_OPEN;
 
                status =  __vxge_hw_vpath_addr_get(&vpath,
                                hw_info->mac_addrs[i],
@@ -4646,7 +4646,27 @@ static void __vxge_hw_vp_terminate(struct __vxge_hw_device *hldev, u32 vp_id)
                vpath->hldev->tim_int_mask1, vpath->vp_id);
        hldev->stats.hw_dev_info_stats.vpath_info[vpath->vp_id] = NULL;
 
-       memset(vpath, 0, sizeof(struct __vxge_hw_virtualpath));
+       /* If the whole struct __vxge_hw_virtualpath is zeroed, nothing will
+        * work after the interface is brought down.
+        */
+       spin_lock(&vpath->lock);
+       vpath->vp_open = VXGE_HW_VP_NOT_OPEN;
+       spin_unlock(&vpath->lock);
+
+       vpath->vpmgmt_reg = NULL;
+       vpath->nofl_db = NULL;
+       vpath->max_mtu = 0;
+       vpath->vsport_number = 0;
+       vpath->max_kdfc_db = 0;
+       vpath->max_nofl_db = 0;
+       vpath->ringh = NULL;
+       vpath->fifoh = NULL;
+       memset(&vpath->vpath_handles, 0, sizeof(struct list_head));
+       vpath->stats_block = 0;
+       vpath->hw_stats = NULL;
+       vpath->hw_stats_sav = NULL;
+       vpath->sw_stats = NULL;
+
 exit:
        return;
 }
@@ -4670,7 +4690,7 @@ __vxge_hw_vp_initialize(struct __vxge_hw_device *hldev, u32 vp_id,
 
        vpath = &hldev->virtual_paths[vp_id];
 
-       spin_lock_init(&hldev->virtual_paths[vp_id].lock);
+       spin_lock_init(&vpath->lock);
        vpath->vp_id = vp_id;
        vpath->vp_open = VXGE_HW_VP_OPEN;
        vpath->hldev = hldev;
@@ -5019,10 +5039,6 @@ enum vxge_hw_status vxge_hw_vpath_close(struct __vxge_hw_vpath_handle *vp)
 
        __vxge_hw_vp_terminate(devh, vp_id);
 
-       spin_lock(&vpath->lock);
-       vpath->vp_open = VXGE_HW_VP_NOT_OPEN;
-       spin_unlock(&vpath->lock);
-
 vpath_close_exit:
        return status;
 }