|
@@ -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;
|
|
|
}
|