enum _ecore_status_t ecore_ptt_pool_alloc(struct ecore_hwfn *p_hwfn) { struct ecore_ptt_pool *p_pool = OSAL_ALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(*p_pool)); int i; if (!p_pool) return ECORE_NOMEM; OSAL_LIST_INIT(&p_pool->free_list); for (i = 0; i < PXP_EXTERNAL_BAR_PF_WINDOW_NUM; i++) { p_pool->ptts[i].idx = i; p_pool->ptts[i].pxp.offset = ECORE_BAR_INVALID_OFFSET; p_pool->ptts[i].pxp.pretend.control = 0; p_pool->ptts[i].hwfn_id = p_hwfn->my_id; /* There are special PTT entries that are taken only by design. * The rest are added ot the list for general usage. */ if (i >= RESERVED_PTT_MAX) OSAL_LIST_PUSH_HEAD(&p_pool->ptts[i].list_entry, &p_pool->free_list); } p_hwfn->p_ptt_pool = p_pool; OSAL_SPIN_LOCK_ALLOC(p_hwfn, &p_pool->lock); OSAL_SPIN_LOCK_INIT(&p_pool->lock); return ECORE_SUCCESS; }
enum _ecore_status_t ecore_ooo_alloc(struct ecore_hwfn *p_hwfn) { u16 max_num_archipelagos = 0, cid_base; struct ecore_ooo_info *p_ooo_info; u16 max_num_isles = 0; u32 i; switch (p_hwfn->hw_info.personality) { case ECORE_PCI_ISCSI: max_num_archipelagos = p_hwfn->pf_params.iscsi_pf_params.num_cons; cid_base =(u16)ecore_cxt_get_proto_cid_start(p_hwfn, PROTOCOLID_ISCSI); break; case ECORE_PCI_ETH_RDMA: case ECORE_PCI_ETH_IWARP: max_num_archipelagos = (u16)ecore_cxt_get_proto_cid_count(p_hwfn, PROTOCOLID_IWARP, OSAL_NULL); cid_base = (u16)ecore_cxt_get_proto_cid_start(p_hwfn, PROTOCOLID_IWARP); break; default: DP_NOTICE(p_hwfn, true, "Failed to allocate ecore_ooo_info: unknown personalization\n"); return ECORE_INVAL; } max_num_isles = ECORE_MAX_NUM_ISLES + max_num_archipelagos; if (!max_num_archipelagos) { DP_NOTICE(p_hwfn, true, "Failed to allocate ecore_ooo_info: unknown amount of connections\n"); return ECORE_INVAL; } p_ooo_info = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(*p_ooo_info)); if (!p_ooo_info) { DP_NOTICE(p_hwfn, true, "Failed to allocate ecore_ooo_info\n"); return ECORE_NOMEM; } p_ooo_info->cid_base = cid_base; /* We look only at the icid */ p_ooo_info->max_num_archipelagos = max_num_archipelagos; OSAL_LIST_INIT(&p_ooo_info->free_buffers_list); OSAL_LIST_INIT(&p_ooo_info->ready_buffers_list); OSAL_LIST_INIT(&p_ooo_info->free_isles_list); p_ooo_info->p_isles_mem = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(struct ecore_ooo_isle) * max_num_isles); if (!p_ooo_info->p_isles_mem) { DP_NOTICE(p_hwfn,true, "Failed to allocate ecore_ooo_info (isles)\n"); goto no_isles_mem; } for (i = 0; i < max_num_isles; i++) { OSAL_LIST_INIT(&p_ooo_info->p_isles_mem[i].buffers_list); OSAL_LIST_PUSH_TAIL(&p_ooo_info->p_isles_mem[i].list_entry, &p_ooo_info->free_isles_list); } p_ooo_info->p_archipelagos_mem = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(struct ecore_ooo_archipelago) * max_num_archipelagos); if (!p_ooo_info->p_archipelagos_mem) { DP_NOTICE(p_hwfn,true, "Failed to allocate ecore_ooo_info(archpelagos)\n"); goto no_archipelagos_mem; } for (i = 0; i < max_num_archipelagos; i++) { OSAL_LIST_INIT(&p_ooo_info->p_archipelagos_mem[i].isles_list); } p_ooo_info->ooo_history.p_cqes = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(struct ooo_opaque) * ECORE_MAX_NUM_OOO_HISTORY_ENTRIES); if (!p_ooo_info->ooo_history.p_cqes) { DP_NOTICE(p_hwfn,true, "Failed to allocate ecore_ooo_info(history)\n"); goto no_history_mem; } p_ooo_info->ooo_history.num_of_cqes = ECORE_MAX_NUM_OOO_HISTORY_ENTRIES; p_hwfn->p_ooo_info = p_ooo_info; return ECORE_SUCCESS; no_history_mem: OSAL_FREE(p_hwfn->p_dev, p_ooo_info->p_archipelagos_mem); no_archipelagos_mem: OSAL_FREE(p_hwfn->p_dev, p_ooo_info->p_isles_mem); no_isles_mem: OSAL_FREE(p_hwfn->p_dev, p_ooo_info); return ECORE_NOMEM; }