1fe56b9e6SYuval Mintz /* QLogic qed NIC Driver 2fe56b9e6SYuval Mintz * Copyright (c) 2015 QLogic Corporation 3fe56b9e6SYuval Mintz * 4fe56b9e6SYuval Mintz * This software is available under the terms of the GNU General Public License 5fe56b9e6SYuval Mintz * (GPL) Version 2, available from the file COPYING in the main directory of 6fe56b9e6SYuval Mintz * this source tree. 7fe56b9e6SYuval Mintz */ 8fe56b9e6SYuval Mintz 9fe56b9e6SYuval Mintz #include <linux/types.h> 10fe56b9e6SYuval Mintz #include <asm/byteorder.h> 11fe56b9e6SYuval Mintz #include <linux/bitops.h> 12fe56b9e6SYuval Mintz #include <linux/errno.h> 13fe56b9e6SYuval Mintz #include <linux/kernel.h> 14fe56b9e6SYuval Mintz #include <linux/string.h> 15fe56b9e6SYuval Mintz #include "qed.h" 16fe56b9e6SYuval Mintz #include <linux/qed/qed_chain.h> 17fe56b9e6SYuval Mintz #include "qed_cxt.h" 18fe56b9e6SYuval Mintz #include "qed_hsi.h" 19fe56b9e6SYuval Mintz #include "qed_hw.h" 20fe56b9e6SYuval Mintz #include "qed_int.h" 21fe56b9e6SYuval Mintz #include "qed_reg_addr.h" 22fe56b9e6SYuval Mintz #include "qed_sp.h" 23fe56b9e6SYuval Mintz 24fe56b9e6SYuval Mintz int qed_sp_init_request(struct qed_hwfn *p_hwfn, 25fe56b9e6SYuval Mintz struct qed_spq_entry **pp_ent, 26fe56b9e6SYuval Mintz u8 cmd, 27fe56b9e6SYuval Mintz u8 protocol, 2806f56b81SYuval Mintz struct qed_sp_init_data *p_data) 29fe56b9e6SYuval Mintz { 3006f56b81SYuval Mintz u32 opaque_cid = p_data->opaque_fid << 16 | p_data->cid; 31fe56b9e6SYuval Mintz struct qed_spq_entry *p_ent = NULL; 3206f56b81SYuval Mintz int rc; 33fe56b9e6SYuval Mintz 34fe56b9e6SYuval Mintz if (!pp_ent) 35fe56b9e6SYuval Mintz return -ENOMEM; 36fe56b9e6SYuval Mintz 37fe56b9e6SYuval Mintz rc = qed_spq_get_entry(p_hwfn, pp_ent); 38fe56b9e6SYuval Mintz 39fe56b9e6SYuval Mintz if (rc != 0) 40fe56b9e6SYuval Mintz return rc; 41fe56b9e6SYuval Mintz 42fe56b9e6SYuval Mintz p_ent = *pp_ent; 43fe56b9e6SYuval Mintz 44fe56b9e6SYuval Mintz p_ent->elem.hdr.cid = cpu_to_le32(opaque_cid); 45fe56b9e6SYuval Mintz p_ent->elem.hdr.cmd_id = cmd; 46fe56b9e6SYuval Mintz p_ent->elem.hdr.protocol_id = protocol; 47fe56b9e6SYuval Mintz 48fe56b9e6SYuval Mintz p_ent->priority = QED_SPQ_PRIORITY_NORMAL; 4906f56b81SYuval Mintz p_ent->comp_mode = p_data->comp_mode; 50fe56b9e6SYuval Mintz p_ent->comp_done.done = 0; 51fe56b9e6SYuval Mintz 52fe56b9e6SYuval Mintz switch (p_ent->comp_mode) { 53fe56b9e6SYuval Mintz case QED_SPQ_MODE_EBLOCK: 54fe56b9e6SYuval Mintz p_ent->comp_cb.cookie = &p_ent->comp_done; 55fe56b9e6SYuval Mintz break; 56fe56b9e6SYuval Mintz 57fe56b9e6SYuval Mintz case QED_SPQ_MODE_BLOCK: 5806f56b81SYuval Mintz if (!p_data->p_comp_data) 59fe56b9e6SYuval Mintz return -EINVAL; 60fe56b9e6SYuval Mintz 6106f56b81SYuval Mintz p_ent->comp_cb.cookie = p_data->p_comp_data->cookie; 62fe56b9e6SYuval Mintz break; 63fe56b9e6SYuval Mintz 64fe56b9e6SYuval Mintz case QED_SPQ_MODE_CB: 6506f56b81SYuval Mintz if (!p_data->p_comp_data) 66fe56b9e6SYuval Mintz p_ent->comp_cb.function = NULL; 67fe56b9e6SYuval Mintz else 6806f56b81SYuval Mintz p_ent->comp_cb = *p_data->p_comp_data; 69fe56b9e6SYuval Mintz break; 70fe56b9e6SYuval Mintz 71fe56b9e6SYuval Mintz default: 72fe56b9e6SYuval Mintz DP_NOTICE(p_hwfn, "Unknown SPQE completion mode %d\n", 73fe56b9e6SYuval Mintz p_ent->comp_mode); 74fe56b9e6SYuval Mintz return -EINVAL; 75fe56b9e6SYuval Mintz } 76fe56b9e6SYuval Mintz 77fe56b9e6SYuval Mintz DP_VERBOSE(p_hwfn, QED_MSG_SPQ, 78fe56b9e6SYuval Mintz "Initialized: CID %08x cmd %02x protocol %02x data_addr %lu comp_mode [%s]\n", 79fe56b9e6SYuval Mintz opaque_cid, cmd, protocol, 80fe56b9e6SYuval Mintz (unsigned long)&p_ent->ramrod, 81fe56b9e6SYuval Mintz D_TRINE(p_ent->comp_mode, QED_SPQ_MODE_EBLOCK, 82fe56b9e6SYuval Mintz QED_SPQ_MODE_BLOCK, "MODE_EBLOCK", "MODE_BLOCK", 83fe56b9e6SYuval Mintz "MODE_CB")); 8406f56b81SYuval Mintz 8506f56b81SYuval Mintz memset(&p_ent->ramrod, 0, sizeof(p_ent->ramrod)); 86fe56b9e6SYuval Mintz 87fe56b9e6SYuval Mintz return 0; 88fe56b9e6SYuval Mintz } 89fe56b9e6SYuval Mintz 90fe56b9e6SYuval Mintz int qed_sp_pf_start(struct qed_hwfn *p_hwfn, 91fc48b7a6SYuval Mintz enum qed_mf_mode mode) 92fe56b9e6SYuval Mintz { 93fe56b9e6SYuval Mintz struct pf_start_ramrod_data *p_ramrod = NULL; 94fe56b9e6SYuval Mintz u16 sb = qed_int_get_sp_sb_id(p_hwfn); 95fe56b9e6SYuval Mintz u8 sb_index = p_hwfn->p_eq->eq_sb_index; 96fe56b9e6SYuval Mintz struct qed_spq_entry *p_ent = NULL; 9706f56b81SYuval Mintz struct qed_sp_init_data init_data; 98fe56b9e6SYuval Mintz int rc = -EINVAL; 99fe56b9e6SYuval Mintz 100fe56b9e6SYuval Mintz /* update initial eq producer */ 101fe56b9e6SYuval Mintz qed_eq_prod_update(p_hwfn, 102fe56b9e6SYuval Mintz qed_chain_get_prod_idx(&p_hwfn->p_eq->chain)); 103fe56b9e6SYuval Mintz 10406f56b81SYuval Mintz memset(&init_data, 0, sizeof(init_data)); 10506f56b81SYuval Mintz init_data.cid = qed_spq_get_cid(p_hwfn); 10606f56b81SYuval Mintz init_data.opaque_fid = p_hwfn->hw_info.opaque_fid; 10706f56b81SYuval Mintz init_data.comp_mode = QED_SPQ_MODE_EBLOCK; 108fe56b9e6SYuval Mintz 10906f56b81SYuval Mintz rc = qed_sp_init_request(p_hwfn, &p_ent, 110fe56b9e6SYuval Mintz COMMON_RAMROD_PF_START, 111fe56b9e6SYuval Mintz PROTOCOLID_COMMON, 11206f56b81SYuval Mintz &init_data); 113fe56b9e6SYuval Mintz if (rc) 114fe56b9e6SYuval Mintz return rc; 115fe56b9e6SYuval Mintz 116fe56b9e6SYuval Mintz p_ramrod = &p_ent->ramrod.pf_start; 117fe56b9e6SYuval Mintz 118fe56b9e6SYuval Mintz p_ramrod->event_ring_sb_id = cpu_to_le16(sb); 119fe56b9e6SYuval Mintz p_ramrod->event_ring_sb_index = sb_index; 120fe56b9e6SYuval Mintz p_ramrod->path_id = QED_PATH_ID(p_hwfn); 121fe56b9e6SYuval Mintz p_ramrod->dont_log_ramrods = 0; 122fe56b9e6SYuval Mintz p_ramrod->log_type_mask = cpu_to_le16(0xf); 123fe56b9e6SYuval Mintz p_ramrod->mf_mode = mode; 124fc48b7a6SYuval Mintz switch (mode) { 125fc48b7a6SYuval Mintz case QED_MF_DEFAULT: 126fc48b7a6SYuval Mintz case QED_MF_NPAR: 127fc48b7a6SYuval Mintz p_ramrod->mf_mode = MF_NPAR; 128fc48b7a6SYuval Mintz break; 129fc48b7a6SYuval Mintz case QED_MF_OVLAN: 130fc48b7a6SYuval Mintz p_ramrod->mf_mode = MF_OVLAN; 131fc48b7a6SYuval Mintz break; 132fc48b7a6SYuval Mintz default: 133fc48b7a6SYuval Mintz DP_NOTICE(p_hwfn, "Unsupported MF mode, init as DEFAULT\n"); 134fc48b7a6SYuval Mintz p_ramrod->mf_mode = MF_NPAR; 135fc48b7a6SYuval Mintz } 136fe56b9e6SYuval Mintz p_ramrod->outer_tag = p_hwfn->hw_info.ovlan; 137fe56b9e6SYuval Mintz 138fe56b9e6SYuval Mintz /* Place EQ address in RAMROD */ 13994494598SYuval Mintz DMA_REGPAIR_LE(p_ramrod->event_ring_pbl_addr, 14094494598SYuval Mintz p_hwfn->p_eq->chain.pbl.p_phys_table); 141fe56b9e6SYuval Mintz p_ramrod->event_ring_num_pages = (u8)p_hwfn->p_eq->chain.page_cnt; 142fe56b9e6SYuval Mintz 14394494598SYuval Mintz DMA_REGPAIR_LE(p_ramrod->consolid_q_pbl_addr, 14494494598SYuval Mintz p_hwfn->p_consq->chain.pbl.p_phys_table); 145fe56b9e6SYuval Mintz 146fe56b9e6SYuval Mintz p_hwfn->hw_info.personality = PERSONALITY_ETH; 147fe56b9e6SYuval Mintz 148fe56b9e6SYuval Mintz DP_VERBOSE(p_hwfn, QED_MSG_SPQ, 149fc48b7a6SYuval Mintz "Setting event_ring_sb [id %04x index %02x], outer_tag [%d]\n", 150fe56b9e6SYuval Mintz sb, sb_index, 151fe56b9e6SYuval Mintz p_ramrod->outer_tag); 152fe56b9e6SYuval Mintz 153fe56b9e6SYuval Mintz return qed_spq_post(p_hwfn, p_ent, NULL); 154fe56b9e6SYuval Mintz } 155fe56b9e6SYuval Mintz 156fe56b9e6SYuval Mintz int qed_sp_pf_stop(struct qed_hwfn *p_hwfn) 157fe56b9e6SYuval Mintz { 158fe56b9e6SYuval Mintz struct qed_spq_entry *p_ent = NULL; 15906f56b81SYuval Mintz struct qed_sp_init_data init_data; 160fe56b9e6SYuval Mintz int rc = -EINVAL; 161fe56b9e6SYuval Mintz 16206f56b81SYuval Mintz /* Get SPQ entry */ 16306f56b81SYuval Mintz memset(&init_data, 0, sizeof(init_data)); 16406f56b81SYuval Mintz init_data.cid = qed_spq_get_cid(p_hwfn); 16506f56b81SYuval Mintz init_data.opaque_fid = p_hwfn->hw_info.opaque_fid; 16606f56b81SYuval Mintz init_data.comp_mode = QED_SPQ_MODE_EBLOCK; 167fe56b9e6SYuval Mintz 16806f56b81SYuval Mintz rc = qed_sp_init_request(p_hwfn, &p_ent, 169fe56b9e6SYuval Mintz COMMON_RAMROD_PF_STOP, PROTOCOLID_COMMON, 17006f56b81SYuval Mintz &init_data); 171fe56b9e6SYuval Mintz if (rc) 172fe56b9e6SYuval Mintz return rc; 173fe56b9e6SYuval Mintz 174fe56b9e6SYuval Mintz return qed_spq_post(p_hwfn, p_ent, NULL); 175fe56b9e6SYuval Mintz } 176