Merge branch 'devicetree/next' of git://git.secretlab.ca/git/linux-2.6
[pandora-kernel.git] / drivers / net / vxge / vxge-config.c
index 401bebf..1520c57 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);
@@ -583,7 +582,7 @@ __vxge_hw_device_toc_get(void __iomem *bar0)
                goto exit;
 
        val64 = readq(&legacy_reg->toc_first_pointer);
-       toc = (struct vxge_hw_toc_reg __iomem *)(bar0+val64);
+       toc = bar0 + val64;
 exit:
        return toc;
 }
@@ -601,7 +600,7 @@ __vxge_hw_device_reg_addr_get(struct __vxge_hw_device *hldev)
        u32 i;
        enum vxge_hw_status status = VXGE_HW_OK;
 
-       hldev->legacy_reg = (struct vxge_hw_legacy_reg __iomem *)hldev->bar0;
+       hldev->legacy_reg = hldev->bar0;
 
        hldev->toc_reg = __vxge_hw_device_toc_get(hldev->bar0);
        if (hldev->toc_reg  == NULL) {
@@ -610,39 +609,31 @@ __vxge_hw_device_reg_addr_get(struct __vxge_hw_device *hldev)
        }
 
        val64 = readq(&hldev->toc_reg->toc_common_pointer);
-       hldev->common_reg =
-       (struct vxge_hw_common_reg __iomem *)(hldev->bar0 + val64);
+       hldev->common_reg = hldev->bar0 + val64;
 
        val64 = readq(&hldev->toc_reg->toc_mrpcim_pointer);
-       hldev->mrpcim_reg =
-               (struct vxge_hw_mrpcim_reg __iomem *)(hldev->bar0 + val64);
+       hldev->mrpcim_reg = hldev->bar0 + val64;
 
        for (i = 0; i < VXGE_HW_TITAN_SRPCIM_REG_SPACES; i++) {
                val64 = readq(&hldev->toc_reg->toc_srpcim_pointer[i]);
-               hldev->srpcim_reg[i] =
-                       (struct vxge_hw_srpcim_reg __iomem *)
-                               (hldev->bar0 + val64);
+               hldev->srpcim_reg[i] = hldev->bar0 + val64;
        }
 
        for (i = 0; i < VXGE_HW_TITAN_VPMGMT_REG_SPACES; i++) {
                val64 = readq(&hldev->toc_reg->toc_vpmgmt_pointer[i]);
-               hldev->vpmgmt_reg[i] =
-               (struct vxge_hw_vpmgmt_reg __iomem *)(hldev->bar0 + val64);
+               hldev->vpmgmt_reg[i] = hldev->bar0 + val64;
        }
 
        for (i = 0; i < VXGE_HW_TITAN_VPATH_REG_SPACES; i++) {
                val64 = readq(&hldev->toc_reg->toc_vpath_pointer[i]);
-               hldev->vpath_reg[i] =
-                       (struct vxge_hw_vpath_reg __iomem *)
-                               (hldev->bar0 + val64);
+               hldev->vpath_reg[i] = hldev->bar0 + val64;
        }
 
        val64 = readq(&hldev->toc_reg->toc_kdfc);
 
        switch (VXGE_HW_TOC_GET_KDFC_INITIAL_BIR(val64)) {
        case 0:
-               hldev->kdfc = (u8 __iomem *)(hldev->bar0 +
-                       VXGE_HW_TOC_GET_KDFC_INITIAL_OFFSET(val64));
+               hldev->kdfc = hldev->bar0 + VXGE_HW_TOC_GET_KDFC_INITIAL_OFFSET(val64) ;
                break;
        default:
                break;
@@ -762,12 +753,11 @@ static void __vxge_hw_device_host_info_get(struct __vxge_hw_device *hldev)
 static enum vxge_hw_status
 __vxge_hw_verify_pci_e_info(struct __vxge_hw_device *hldev)
 {
-       int exp_cap;
+       struct pci_dev *dev = hldev->pdev;
        u16 lnk;
 
        /* Get the negotiated link width and speed from PCI config space */
-       exp_cap = pci_find_capability(hldev->pdev, PCI_CAP_ID_EXP);
-       pci_read_config_word(hldev->pdev, exp_cap + PCI_EXP_LNKSTA, &lnk);
+       pci_read_config_word(dev, dev->pcie_cap + PCI_EXP_LNKSTA, &lnk);
 
        if ((lnk & PCI_EXP_LNKSTA_CLS) != 1)
                return VXGE_HW_ERR_INVALID_PCI_INFO;
@@ -1000,7 +990,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
@@ -1025,7 +1015,7 @@ vxge_hw_device_hw_info_get(void __iomem *bar0,
        }
 
        val64 = readq(&toc->toc_common_pointer);
-       common_reg = (struct vxge_hw_common_reg __iomem *)(bar0 + val64);
+       common_reg = bar0 + val64;
 
        status = __vxge_hw_device_vpath_reset_in_prog_check(
                (u64 __iomem *)&common_reg->vpath_rst_in_prog);
@@ -1045,8 +1035,7 @@ vxge_hw_device_hw_info_get(void __iomem *bar0,
 
                val64 = readq(&toc->toc_vpmgmt_pointer[i]);
 
-               vpmgmt_reg = (struct vxge_hw_vpmgmt_reg __iomem *)
-                               (bar0 + val64);
+               vpmgmt_reg = bar0 + val64;
 
                hw_info->func_id = __vxge_hw_vpath_func_id_get(vpmgmt_reg);
                if (__vxge_hw_device_access_rights_get(hw_info->host_type,
@@ -1055,8 +1044,7 @@ vxge_hw_device_hw_info_get(void __iomem *bar0,
 
                        val64 = readq(&toc->toc_mrpcim_pointer);
 
-                       mrpcim_reg = (struct vxge_hw_mrpcim_reg __iomem *)
-                                       (bar0 + val64);
+                       mrpcim_reg = bar0 + val64;
 
                        writeq(0, &mrpcim_reg->xgmac_gen_fw_memo_mask);
                        wmb();
@@ -1064,9 +1052,9 @@ 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;
+               spin_lock_init(&vpath.lock);
+               vpath.vp_reg = bar0 + val64;
+               vpath.vp_open = VXGE_HW_VP_NOT_OPEN;
 
                status = __vxge_hw_vpath_pci_func_mode_get(&vpath, hw_info);
                if (status != VXGE_HW_OK)
@@ -1088,9 +1076,8 @@ vxge_hw_device_hw_info_get(void __iomem *bar0,
                        continue;
 
                val64 = readq(&toc->toc_vpath_pointer[i]);
-               vpath.vp_reg = (struct vxge_hw_vpath_reg __iomem *)
-                              (bar0 + val64);
-               vpath.vp_open = 0;
+               vpath.vp_reg = bar0 + val64;
+               vpath.vp_open = VXGE_HW_VP_NOT_OPEN;
 
                status =  __vxge_hw_vpath_addr_get(&vpath,
                                hw_info->mac_addrs[i],
@@ -1994,13 +1981,11 @@ exit:
 
 u16 vxge_hw_device_link_width_get(struct __vxge_hw_device *hldev)
 {
-       int link_width, exp_cap;
+       struct pci_dev *dev = hldev->pdev;
        u16 lnk;
 
-       exp_cap = pci_find_capability(hldev->pdev, PCI_CAP_ID_EXP);
-       pci_read_config_word(hldev->pdev, exp_cap + PCI_EXP_LNKSTA, &lnk);
-       link_width = (lnk & VXGE_HW_PCI_EXP_LNKCAP_LNK_WIDTH) >> 4;
-       return link_width;
+       pci_read_config_word(dev, dev->pcie_cap + PCI_EXP_LNKSTA, &lnk);
+       return (lnk & VXGE_HW_PCI_EXP_LNKCAP_LNK_WIDTH) >> 4;
 }
 
 /*
@@ -2140,8 +2125,7 @@ __vxge_hw_ring_mempool_item_alloc(struct vxge_hw_mempool *mempoolh,
                                        memblock_index, item,
                                        &memblock_item_idx);
 
-               rxdp = (struct vxge_hw_ring_rxd_1 *)
-                               ring->channel.reserve_arr[reserve_index];
+               rxdp = ring->channel.reserve_arr[reserve_index];
 
                uld_priv = ((u8 *)rxdblock_priv + ring->rxd_priv_size * i);
 
@@ -4646,7 +4630,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 +4674,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;
@@ -4860,8 +4864,7 @@ vxge_hw_vpath_open(struct __vxge_hw_device *hldev,
                goto vpath_open_exit8;
        }
 
-       vpath->hw_stats = (struct vxge_hw_vpath_stats_hw_info *)vpath->
-                       stats_block->memblock;
+       vpath->hw_stats = vpath->stats_block->memblock;
        memset(vpath->hw_stats, 0,
                sizeof(struct vxge_hw_vpath_stats_hw_info));
 
@@ -5019,10 +5022,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;
 }