int qed_sp_init_request(struct qed_hwfn *p_hwfn, struct qed_spq_entry **pp_ent, u8 cmd, u8 protocol, struct qed_sp_init_data *p_data) { u32 opaque_cid = p_data->opaque_fid << 16 | p_data->cid; struct qed_spq_entry *p_ent = NULL; int rc; if (!pp_ent) return -ENOMEM; rc = qed_spq_get_entry(p_hwfn, pp_ent); if (rc) return rc; p_ent = *pp_ent; p_ent->elem.hdr.cid = cpu_to_le32(opaque_cid); p_ent->elem.hdr.cmd_id = cmd; p_ent->elem.hdr.protocol_id = protocol; p_ent->priority = QED_SPQ_PRIORITY_NORMAL; p_ent->comp_mode = p_data->comp_mode; p_ent->comp_done.done = 0; switch (p_ent->comp_mode) { case QED_SPQ_MODE_EBLOCK: p_ent->comp_cb.cookie = &p_ent->comp_done; break; case QED_SPQ_MODE_BLOCK: if (!p_data->p_comp_data) goto err; p_ent->comp_cb.cookie = p_data->p_comp_data->cookie; break; case QED_SPQ_MODE_CB: if (!p_data->p_comp_data) p_ent->comp_cb.function = NULL; else p_ent->comp_cb = *p_data->p_comp_data; break; default: DP_NOTICE(p_hwfn, "Unknown SPQE completion mode %d\n", p_ent->comp_mode); goto err; } DP_VERBOSE(p_hwfn, QED_MSG_SPQ, "Initialized: CID %08x cmd %02x protocol %02x data_addr %lu comp_mode [%s]\n", opaque_cid, cmd, protocol, (unsigned long)&p_ent->ramrod, D_TRINE(p_ent->comp_mode, QED_SPQ_MODE_EBLOCK, QED_SPQ_MODE_BLOCK, "MODE_EBLOCK", "MODE_BLOCK", "MODE_CB")); memset(&p_ent->ramrod, 0, sizeof(p_ent->ramrod)); return 0; err: qed_sp_destroy_request(p_hwfn, p_ent); return -EINVAL; }
enum _ecore_status_t ecore_sp_init_request(struct ecore_hwfn *p_hwfn, struct ecore_spq_entry **pp_ent, u8 cmd, u8 protocol, struct ecore_sp_init_data *p_data) { u32 opaque_cid = p_data->opaque_fid << 16 | p_data->cid; struct ecore_spq_entry *p_ent = OSAL_NULL; enum _ecore_status_t rc; if (!pp_ent) return ECORE_INVAL; /* Get an SPQ entry */ rc = ecore_spq_get_entry(p_hwfn, pp_ent); if (rc != ECORE_SUCCESS) return rc; /* Fill the SPQ entry */ p_ent = *pp_ent; p_ent->elem.hdr.cid = OSAL_CPU_TO_LE32(opaque_cid); p_ent->elem.hdr.cmd_id = cmd; p_ent->elem.hdr.protocol_id = protocol; p_ent->priority = ECORE_SPQ_PRIORITY_NORMAL; p_ent->comp_mode = p_data->comp_mode; p_ent->comp_done.done = 0; switch (p_ent->comp_mode) { case ECORE_SPQ_MODE_EBLOCK: p_ent->comp_cb.cookie = &p_ent->comp_done; break; case ECORE_SPQ_MODE_BLOCK: if (!p_data->p_comp_data) return ECORE_INVAL; p_ent->comp_cb.cookie = p_data->p_comp_data->cookie; break; case ECORE_SPQ_MODE_CB: if (!p_data->p_comp_data) p_ent->comp_cb.function = OSAL_NULL; else p_ent->comp_cb = *p_data->p_comp_data; break; default: DP_NOTICE(p_hwfn, true, "Unknown SPQE completion mode %d\n", p_ent->comp_mode); return ECORE_INVAL; } DP_VERBOSE(p_hwfn, ECORE_MSG_SPQ, "Initialized: CID %08x cmd %02x protocol %02x data_addr %lu comp_mode [%s]\n", opaque_cid, cmd, protocol, (unsigned long)&p_ent->ramrod, D_TRINE(p_ent->comp_mode, ECORE_SPQ_MODE_EBLOCK, ECORE_SPQ_MODE_BLOCK, "MODE_EBLOCK", "MODE_BLOCK", "MODE_CB")); OSAL_MEMSET(&p_ent->ramrod, 0, sizeof(p_ent->ramrod)); return ECORE_SUCCESS; }