brintos

brintos / linux-shallow public Read only

0
0
Text · 14.7 KiB · fa40d5e Raw
659 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Linux network driver for QLogic BR-series Converged Network Adapter.4 */5/*6 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.7 * Copyright (c) 2014-2015 QLogic Corporation8 * All rights reserved9 * www.qlogic.com10 */11 12/* MSGQ module source file. */13 14#include "bfi.h"15#include "bfa_msgq.h"16#include "bfa_ioc.h"17 18#define call_cmdq_ent_cbfn(_cmdq_ent, _status)				\19{									\20	bfa_msgq_cmdcbfn_t cbfn;					\21	void *cbarg;							\22	cbfn = (_cmdq_ent)->cbfn;					\23	cbarg = (_cmdq_ent)->cbarg;					\24	(_cmdq_ent)->cbfn = NULL;					\25	(_cmdq_ent)->cbarg = NULL;					\26	if (cbfn) {							\27		cbfn(cbarg, (_status));					\28	}								\29}30 31static void bfa_msgq_cmdq_dbell(struct bfa_msgq_cmdq *cmdq);32static void bfa_msgq_cmdq_copy_rsp(struct bfa_msgq_cmdq *cmdq);33 34enum cmdq_event {35	CMDQ_E_START			= 1,36	CMDQ_E_STOP			= 2,37	CMDQ_E_FAIL			= 3,38	CMDQ_E_POST			= 4,39	CMDQ_E_INIT_RESP		= 5,40	CMDQ_E_DB_READY			= 6,41};42 43bfa_fsm_state_decl(cmdq, stopped, struct bfa_msgq_cmdq, enum cmdq_event);44bfa_fsm_state_decl(cmdq, init_wait, struct bfa_msgq_cmdq, enum cmdq_event);45bfa_fsm_state_decl(cmdq, ready, struct bfa_msgq_cmdq, enum cmdq_event);46bfa_fsm_state_decl(cmdq, dbell_wait, struct bfa_msgq_cmdq,47			enum cmdq_event);48 49static void50cmdq_sm_stopped_entry(struct bfa_msgq_cmdq *cmdq)51{52	struct bfa_msgq_cmd_entry *cmdq_ent;53 54	cmdq->producer_index = 0;55	cmdq->consumer_index = 0;56	cmdq->flags = 0;57	cmdq->token = 0;58	cmdq->offset = 0;59	cmdq->bytes_to_copy = 0;60	while (!list_empty(&cmdq->pending_q)) {61		cmdq_ent = list_first_entry(&cmdq->pending_q,62					    struct bfa_msgq_cmd_entry, qe);63		list_del(&cmdq_ent->qe);64		call_cmdq_ent_cbfn(cmdq_ent, BFA_STATUS_FAILED);65	}66}67 68static void69cmdq_sm_stopped(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)70{71	switch (event) {72	case CMDQ_E_START:73		bfa_fsm_set_state(cmdq, cmdq_sm_init_wait);74		break;75 76	case CMDQ_E_STOP:77	case CMDQ_E_FAIL:78		/* No-op */79		break;80 81	case CMDQ_E_POST:82		cmdq->flags |= BFA_MSGQ_CMDQ_F_DB_UPDATE;83		break;84 85	default:86		bfa_sm_fault(event);87	}88}89 90static void91cmdq_sm_init_wait_entry(struct bfa_msgq_cmdq *cmdq)92{93	bfa_wc_down(&cmdq->msgq->init_wc);94}95 96static void97cmdq_sm_init_wait(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)98{99	switch (event) {100	case CMDQ_E_STOP:101	case CMDQ_E_FAIL:102		bfa_fsm_set_state(cmdq, cmdq_sm_stopped);103		break;104 105	case CMDQ_E_POST:106		cmdq->flags |= BFA_MSGQ_CMDQ_F_DB_UPDATE;107		break;108 109	case CMDQ_E_INIT_RESP:110		if (cmdq->flags & BFA_MSGQ_CMDQ_F_DB_UPDATE) {111			cmdq->flags &= ~BFA_MSGQ_CMDQ_F_DB_UPDATE;112			bfa_fsm_set_state(cmdq, cmdq_sm_dbell_wait);113		} else114			bfa_fsm_set_state(cmdq, cmdq_sm_ready);115		break;116 117	default:118		bfa_sm_fault(event);119	}120}121 122static void123cmdq_sm_ready_entry(struct bfa_msgq_cmdq *cmdq)124{125}126 127static void128cmdq_sm_ready(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)129{130	switch (event) {131	case CMDQ_E_STOP:132	case CMDQ_E_FAIL:133		bfa_fsm_set_state(cmdq, cmdq_sm_stopped);134		break;135 136	case CMDQ_E_POST:137		bfa_fsm_set_state(cmdq, cmdq_sm_dbell_wait);138		break;139 140	default:141		bfa_sm_fault(event);142	}143}144 145static void146cmdq_sm_dbell_wait_entry(struct bfa_msgq_cmdq *cmdq)147{148	bfa_msgq_cmdq_dbell(cmdq);149}150 151static void152cmdq_sm_dbell_wait(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)153{154	switch (event) {155	case CMDQ_E_STOP:156	case CMDQ_E_FAIL:157		bfa_fsm_set_state(cmdq, cmdq_sm_stopped);158		break;159 160	case CMDQ_E_POST:161		cmdq->flags |= BFA_MSGQ_CMDQ_F_DB_UPDATE;162		break;163 164	case CMDQ_E_DB_READY:165		if (cmdq->flags & BFA_MSGQ_CMDQ_F_DB_UPDATE) {166			cmdq->flags &= ~BFA_MSGQ_CMDQ_F_DB_UPDATE;167			bfa_fsm_set_state(cmdq, cmdq_sm_dbell_wait);168		} else169			bfa_fsm_set_state(cmdq, cmdq_sm_ready);170		break;171 172	default:173		bfa_sm_fault(event);174	}175}176 177static void178bfa_msgq_cmdq_dbell_ready(void *arg)179{180	struct bfa_msgq_cmdq *cmdq = (struct bfa_msgq_cmdq *)arg;181	bfa_fsm_send_event(cmdq, CMDQ_E_DB_READY);182}183 184static void185bfa_msgq_cmdq_dbell(struct bfa_msgq_cmdq *cmdq)186{187	struct bfi_msgq_h2i_db *dbell =188		(struct bfi_msgq_h2i_db *)(&cmdq->dbell_mb.msg[0]);189 190	memset(dbell, 0, sizeof(struct bfi_msgq_h2i_db));191	bfi_h2i_set(dbell->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_DOORBELL_PI, 0);192	dbell->mh.mtag.i2htok = 0;193	dbell->idx.cmdq_pi = htons(cmdq->producer_index);194 195	if (!bfa_nw_ioc_mbox_queue(cmdq->msgq->ioc, &cmdq->dbell_mb,196				bfa_msgq_cmdq_dbell_ready, cmdq)) {197		bfa_msgq_cmdq_dbell_ready(cmdq);198	}199}200 201static void202__cmd_copy(struct bfa_msgq_cmdq *cmdq, struct bfa_msgq_cmd_entry *cmd)203{204	size_t len = cmd->msg_size;205	size_t to_copy;206	u8 *src, *dst;207 208	src = (u8 *)cmd->msg_hdr;209	dst = (u8 *)cmdq->addr.kva;210	dst += (cmdq->producer_index * BFI_MSGQ_CMD_ENTRY_SIZE);211 212	while (len) {213		to_copy = (len < BFI_MSGQ_CMD_ENTRY_SIZE) ?214				len : BFI_MSGQ_CMD_ENTRY_SIZE;215		memcpy(dst, src, to_copy);216		len -= to_copy;217		src += BFI_MSGQ_CMD_ENTRY_SIZE;218		BFA_MSGQ_INDX_ADD(cmdq->producer_index, 1, cmdq->depth);219		dst = (u8 *)cmdq->addr.kva;220		dst += (cmdq->producer_index * BFI_MSGQ_CMD_ENTRY_SIZE);221	}222 223}224 225static void226bfa_msgq_cmdq_ci_update(struct bfa_msgq_cmdq *cmdq, struct bfi_mbmsg *mb)227{228	struct bfi_msgq_i2h_db *dbell = (struct bfi_msgq_i2h_db *)mb;229	struct bfa_msgq_cmd_entry *cmd;230	int posted = 0;231 232	cmdq->consumer_index = ntohs(dbell->idx.cmdq_ci);233 234	/* Walk through pending list to see if the command can be posted */235	while (!list_empty(&cmdq->pending_q)) {236		cmd = list_first_entry(&cmdq->pending_q,237				       struct bfa_msgq_cmd_entry, qe);238		if (ntohs(cmd->msg_hdr->num_entries) <=239			BFA_MSGQ_FREE_CNT(cmdq)) {240			list_del(&cmd->qe);241			__cmd_copy(cmdq, cmd);242			posted = 1;243			call_cmdq_ent_cbfn(cmd, BFA_STATUS_OK);244		} else {245			break;246		}247	}248 249	if (posted)250		bfa_fsm_send_event(cmdq, CMDQ_E_POST);251}252 253static void254bfa_msgq_cmdq_copy_next(void *arg)255{256	struct bfa_msgq_cmdq *cmdq = (struct bfa_msgq_cmdq *)arg;257 258	if (cmdq->bytes_to_copy)259		bfa_msgq_cmdq_copy_rsp(cmdq);260}261 262static void263bfa_msgq_cmdq_copy_req(struct bfa_msgq_cmdq *cmdq, struct bfi_mbmsg *mb)264{265	struct bfi_msgq_i2h_cmdq_copy_req *req =266		(struct bfi_msgq_i2h_cmdq_copy_req *)mb;267 268	cmdq->token = 0;269	cmdq->offset = ntohs(req->offset);270	cmdq->bytes_to_copy = ntohs(req->len);271	bfa_msgq_cmdq_copy_rsp(cmdq);272}273 274static void275bfa_msgq_cmdq_copy_rsp(struct bfa_msgq_cmdq *cmdq)276{277	struct bfi_msgq_h2i_cmdq_copy_rsp *rsp =278		(struct bfi_msgq_h2i_cmdq_copy_rsp *)&cmdq->copy_mb.msg[0];279	int copied;280	u8 *addr = (u8 *)cmdq->addr.kva;281 282	memset(rsp, 0, sizeof(struct bfi_msgq_h2i_cmdq_copy_rsp));283	bfi_h2i_set(rsp->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_CMDQ_COPY_RSP, 0);284	rsp->mh.mtag.i2htok = htons(cmdq->token);285	copied = (cmdq->bytes_to_copy >= BFI_CMD_COPY_SZ) ? BFI_CMD_COPY_SZ :286		cmdq->bytes_to_copy;287	addr += cmdq->offset;288	memcpy(rsp->data, addr, copied);289 290	cmdq->token++;291	cmdq->offset += copied;292	cmdq->bytes_to_copy -= copied;293 294	if (!bfa_nw_ioc_mbox_queue(cmdq->msgq->ioc, &cmdq->copy_mb,295				bfa_msgq_cmdq_copy_next, cmdq)) {296		bfa_msgq_cmdq_copy_next(cmdq);297	}298}299 300static void301bfa_msgq_cmdq_attach(struct bfa_msgq_cmdq *cmdq, struct bfa_msgq *msgq)302{303	cmdq->depth = BFA_MSGQ_CMDQ_NUM_ENTRY;304	INIT_LIST_HEAD(&cmdq->pending_q);305	cmdq->msgq = msgq;306	bfa_fsm_set_state(cmdq, cmdq_sm_stopped);307}308 309static void bfa_msgq_rspq_dbell(struct bfa_msgq_rspq *rspq);310 311enum rspq_event {312	RSPQ_E_START			= 1,313	RSPQ_E_STOP			= 2,314	RSPQ_E_FAIL			= 3,315	RSPQ_E_RESP			= 4,316	RSPQ_E_INIT_RESP		= 5,317	RSPQ_E_DB_READY			= 6,318};319 320bfa_fsm_state_decl(rspq, stopped, struct bfa_msgq_rspq, enum rspq_event);321bfa_fsm_state_decl(rspq, init_wait, struct bfa_msgq_rspq,322			enum rspq_event);323bfa_fsm_state_decl(rspq, ready, struct bfa_msgq_rspq, enum rspq_event);324bfa_fsm_state_decl(rspq, dbell_wait, struct bfa_msgq_rspq,325			enum rspq_event);326 327static void328rspq_sm_stopped_entry(struct bfa_msgq_rspq *rspq)329{330	rspq->producer_index = 0;331	rspq->consumer_index = 0;332	rspq->flags = 0;333}334 335static void336rspq_sm_stopped(struct bfa_msgq_rspq *rspq, enum rspq_event event)337{338	switch (event) {339	case RSPQ_E_START:340		bfa_fsm_set_state(rspq, rspq_sm_init_wait);341		break;342 343	case RSPQ_E_STOP:344	case RSPQ_E_FAIL:345		/* No-op */346		break;347 348	default:349		bfa_sm_fault(event);350	}351}352 353static void354rspq_sm_init_wait_entry(struct bfa_msgq_rspq *rspq)355{356	bfa_wc_down(&rspq->msgq->init_wc);357}358 359static void360rspq_sm_init_wait(struct bfa_msgq_rspq *rspq, enum rspq_event event)361{362	switch (event) {363	case RSPQ_E_FAIL:364	case RSPQ_E_STOP:365		bfa_fsm_set_state(rspq, rspq_sm_stopped);366		break;367 368	case RSPQ_E_INIT_RESP:369		bfa_fsm_set_state(rspq, rspq_sm_ready);370		break;371 372	default:373		bfa_sm_fault(event);374	}375}376 377static void378rspq_sm_ready_entry(struct bfa_msgq_rspq *rspq)379{380}381 382static void383rspq_sm_ready(struct bfa_msgq_rspq *rspq, enum rspq_event event)384{385	switch (event) {386	case RSPQ_E_STOP:387	case RSPQ_E_FAIL:388		bfa_fsm_set_state(rspq, rspq_sm_stopped);389		break;390 391	case RSPQ_E_RESP:392		bfa_fsm_set_state(rspq, rspq_sm_dbell_wait);393		break;394 395	default:396		bfa_sm_fault(event);397	}398}399 400static void401rspq_sm_dbell_wait_entry(struct bfa_msgq_rspq *rspq)402{403	if (!bfa_nw_ioc_is_disabled(rspq->msgq->ioc))404		bfa_msgq_rspq_dbell(rspq);405}406 407static void408rspq_sm_dbell_wait(struct bfa_msgq_rspq *rspq, enum rspq_event event)409{410	switch (event) {411	case RSPQ_E_STOP:412	case RSPQ_E_FAIL:413		bfa_fsm_set_state(rspq, rspq_sm_stopped);414		break;415 416	case RSPQ_E_RESP:417		rspq->flags |= BFA_MSGQ_RSPQ_F_DB_UPDATE;418		break;419 420	case RSPQ_E_DB_READY:421		if (rspq->flags & BFA_MSGQ_RSPQ_F_DB_UPDATE) {422			rspq->flags &= ~BFA_MSGQ_RSPQ_F_DB_UPDATE;423			bfa_fsm_set_state(rspq, rspq_sm_dbell_wait);424		} else425			bfa_fsm_set_state(rspq, rspq_sm_ready);426		break;427 428	default:429		bfa_sm_fault(event);430	}431}432 433static void434bfa_msgq_rspq_dbell_ready(void *arg)435{436	struct bfa_msgq_rspq *rspq = (struct bfa_msgq_rspq *)arg;437	bfa_fsm_send_event(rspq, RSPQ_E_DB_READY);438}439 440static void441bfa_msgq_rspq_dbell(struct bfa_msgq_rspq *rspq)442{443	struct bfi_msgq_h2i_db *dbell =444		(struct bfi_msgq_h2i_db *)(&rspq->dbell_mb.msg[0]);445 446	memset(dbell, 0, sizeof(struct bfi_msgq_h2i_db));447	bfi_h2i_set(dbell->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_DOORBELL_CI, 0);448	dbell->mh.mtag.i2htok = 0;449	dbell->idx.rspq_ci = htons(rspq->consumer_index);450 451	if (!bfa_nw_ioc_mbox_queue(rspq->msgq->ioc, &rspq->dbell_mb,452				bfa_msgq_rspq_dbell_ready, rspq)) {453		bfa_msgq_rspq_dbell_ready(rspq);454	}455}456 457static void458bfa_msgq_rspq_pi_update(struct bfa_msgq_rspq *rspq, struct bfi_mbmsg *mb)459{460	struct bfi_msgq_i2h_db *dbell = (struct bfi_msgq_i2h_db *)mb;461	struct bfi_msgq_mhdr *msghdr;462	int num_entries;463	int mc;464	u8 *rspq_qe;465 466	rspq->producer_index = ntohs(dbell->idx.rspq_pi);467 468	while (rspq->consumer_index != rspq->producer_index) {469		rspq_qe = (u8 *)rspq->addr.kva;470		rspq_qe += (rspq->consumer_index * BFI_MSGQ_RSP_ENTRY_SIZE);471		msghdr = (struct bfi_msgq_mhdr *)rspq_qe;472 473		mc = msghdr->msg_class;474		num_entries = ntohs(msghdr->num_entries);475 476		if ((mc >= BFI_MC_MAX) || (rspq->rsphdlr[mc].cbfn == NULL))477			break;478 479		(rspq->rsphdlr[mc].cbfn)(rspq->rsphdlr[mc].cbarg, msghdr);480 481		BFA_MSGQ_INDX_ADD(rspq->consumer_index, num_entries,482				rspq->depth);483	}484 485	bfa_fsm_send_event(rspq, RSPQ_E_RESP);486}487 488static void489bfa_msgq_rspq_attach(struct bfa_msgq_rspq *rspq, struct bfa_msgq *msgq)490{491	rspq->depth = BFA_MSGQ_RSPQ_NUM_ENTRY;492	rspq->msgq = msgq;493	bfa_fsm_set_state(rspq, rspq_sm_stopped);494}495 496static void497bfa_msgq_init_rsp(struct bfa_msgq *msgq,498		 struct bfi_mbmsg *mb)499{500	bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_INIT_RESP);501	bfa_fsm_send_event(&msgq->rspq, RSPQ_E_INIT_RESP);502}503 504static void505bfa_msgq_init(void *arg)506{507	struct bfa_msgq *msgq = (struct bfa_msgq *)arg;508	struct bfi_msgq_cfg_req *msgq_cfg =509		(struct bfi_msgq_cfg_req *)&msgq->init_mb.msg[0];510 511	memset(msgq_cfg, 0, sizeof(struct bfi_msgq_cfg_req));512	bfi_h2i_set(msgq_cfg->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_INIT_REQ, 0);513	msgq_cfg->mh.mtag.i2htok = 0;514 515	bfa_dma_be_addr_set(msgq_cfg->cmdq.addr, msgq->cmdq.addr.pa);516	msgq_cfg->cmdq.q_depth = htons(msgq->cmdq.depth);517	bfa_dma_be_addr_set(msgq_cfg->rspq.addr, msgq->rspq.addr.pa);518	msgq_cfg->rspq.q_depth = htons(msgq->rspq.depth);519 520	bfa_nw_ioc_mbox_queue(msgq->ioc, &msgq->init_mb, NULL, NULL);521}522 523static void524bfa_msgq_isr(void *cbarg, struct bfi_mbmsg *msg)525{526	struct bfa_msgq *msgq = (struct bfa_msgq *)cbarg;527 528	switch (msg->mh.msg_id) {529	case BFI_MSGQ_I2H_INIT_RSP:530		bfa_msgq_init_rsp(msgq, msg);531		break;532 533	case BFI_MSGQ_I2H_DOORBELL_PI:534		bfa_msgq_rspq_pi_update(&msgq->rspq, msg);535		break;536 537	case BFI_MSGQ_I2H_DOORBELL_CI:538		bfa_msgq_cmdq_ci_update(&msgq->cmdq, msg);539		break;540 541	case BFI_MSGQ_I2H_CMDQ_COPY_REQ:542		bfa_msgq_cmdq_copy_req(&msgq->cmdq, msg);543		break;544 545	default:546		BUG_ON(1);547	}548}549 550static void551bfa_msgq_notify(void *cbarg, enum bfa_ioc_event event)552{553	struct bfa_msgq *msgq = (struct bfa_msgq *)cbarg;554 555	switch (event) {556	case BFA_IOC_E_ENABLED:557		bfa_wc_init(&msgq->init_wc, bfa_msgq_init, msgq);558		bfa_wc_up(&msgq->init_wc);559		bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_START);560		bfa_wc_up(&msgq->init_wc);561		bfa_fsm_send_event(&msgq->rspq, RSPQ_E_START);562		bfa_wc_wait(&msgq->init_wc);563		break;564 565	case BFA_IOC_E_DISABLED:566		bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_STOP);567		bfa_fsm_send_event(&msgq->rspq, RSPQ_E_STOP);568		break;569 570	case BFA_IOC_E_FAILED:571		bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_FAIL);572		bfa_fsm_send_event(&msgq->rspq, RSPQ_E_FAIL);573		break;574 575	default:576		break;577	}578}579 580u32581bfa_msgq_meminfo(void)582{583	return roundup(BFA_MSGQ_CMDQ_SIZE, BFA_DMA_ALIGN_SZ) +584		roundup(BFA_MSGQ_RSPQ_SIZE, BFA_DMA_ALIGN_SZ);585}586 587void588bfa_msgq_memclaim(struct bfa_msgq *msgq, u8 *kva, u64 pa)589{590	msgq->cmdq.addr.kva = kva;591	msgq->cmdq.addr.pa  = pa;592 593	kva += roundup(BFA_MSGQ_CMDQ_SIZE, BFA_DMA_ALIGN_SZ);594	pa += roundup(BFA_MSGQ_CMDQ_SIZE, BFA_DMA_ALIGN_SZ);595 596	msgq->rspq.addr.kva = kva;597	msgq->rspq.addr.pa = pa;598}599 600void601bfa_msgq_attach(struct bfa_msgq *msgq, struct bfa_ioc *ioc)602{603	msgq->ioc    = ioc;604 605	bfa_msgq_cmdq_attach(&msgq->cmdq, msgq);606	bfa_msgq_rspq_attach(&msgq->rspq, msgq);607 608	bfa_nw_ioc_mbox_regisr(msgq->ioc, BFI_MC_MSGQ, bfa_msgq_isr, msgq);609	bfa_ioc_notify_init(&msgq->ioc_notify, bfa_msgq_notify, msgq);610	bfa_nw_ioc_notify_register(msgq->ioc, &msgq->ioc_notify);611}612 613void614bfa_msgq_regisr(struct bfa_msgq *msgq, enum bfi_mclass mc,615		bfa_msgq_mcfunc_t cbfn, void *cbarg)616{617	msgq->rspq.rsphdlr[mc].cbfn	= cbfn;618	msgq->rspq.rsphdlr[mc].cbarg	= cbarg;619}620 621void622bfa_msgq_cmd_post(struct bfa_msgq *msgq,  struct bfa_msgq_cmd_entry *cmd)623{624	if (ntohs(cmd->msg_hdr->num_entries) <=625		BFA_MSGQ_FREE_CNT(&msgq->cmdq)) {626		__cmd_copy(&msgq->cmdq, cmd);627		call_cmdq_ent_cbfn(cmd, BFA_STATUS_OK);628		bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_POST);629	} else {630		list_add_tail(&cmd->qe, &msgq->cmdq.pending_q);631	}632}633 634void635bfa_msgq_rsp_copy(struct bfa_msgq *msgq, u8 *buf, size_t buf_len)636{637	struct bfa_msgq_rspq *rspq = &msgq->rspq;638	size_t len = buf_len;639	size_t to_copy;640	int ci;641	u8 *src, *dst;642 643	ci = rspq->consumer_index;644	src = (u8 *)rspq->addr.kva;645	src += (ci * BFI_MSGQ_RSP_ENTRY_SIZE);646	dst = buf;647 648	while (len) {649		to_copy = (len < BFI_MSGQ_RSP_ENTRY_SIZE) ?650				len : BFI_MSGQ_RSP_ENTRY_SIZE;651		memcpy(dst, src, to_copy);652		len -= to_copy;653		dst += BFI_MSGQ_RSP_ENTRY_SIZE;654		BFA_MSGQ_INDX_ADD(ci, 1, rspq->depth);655		src = (u8 *)rspq->addr.kva;656		src += (ci * BFI_MSGQ_RSP_ENTRY_SIZE);657	}658}659