A_STATUS HTCStart(HTC_HANDLE HTCHandle) { adf_nbuf_t netbuf; A_STATUS status = A_OK; HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle); HTC_SETUP_COMPLETE_MSG *SetupComp; AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Enter\n")); do { HTCConfigTargetHIFPipe(HTCHandle); #ifdef HTC_HOST_CREDIT_DIST adf_os_assert(target->InitCredits != NULL); adf_os_assert(target->EpCreditDistributionListHead != NULL); adf_os_assert(target->EpCreditDistributionListHead->pNext != NULL); /* call init credits callback to do the distribution , * NOTE: the first entry in the distribution list is ENDPOINT_0, so * we pass the start of the list after this one. */ target->InitCredits(target->pCredDistContext, target->EpCreditDistributionListHead->pNext, target->TargetCredits); #if 1 adf_os_timer_init(target->os_handle, &target->host_htc_credit_debug_timer, host_htc_credit_show, target); adf_os_timer_start(&target->host_htc_credit_debug_timer, 10000); #endif #endif /* allocate a buffer to send */ //netbuf = adf_nbuf_alloc(anet, sizeof(HTC_SETUP_COMPLETE_MSG), HTC_HDR_LENGTH, 0); netbuf = adf_nbuf_alloc(50, HTC_HDR_LENGTH, 0); if (netbuf == ADF_NBUF_NULL) { status = A_NO_MEMORY; break; } /* assemble setup complete message */ SetupComp = (HTC_SETUP_COMPLETE_MSG *)adf_nbuf_put_tail(netbuf, sizeof(HTC_SETUP_COMPLETE_MSG)); SetupComp->MessageID = adf_os_htons(HTC_MSG_SETUP_COMPLETE_ID); /* assemble the HTC header and send to HIF layer */ status = HTCIssueSend(target, ADF_NBUF_NULL, netbuf, 0, sizeof(HTC_SETUP_COMPLETE_MSG), ENDPOINT0); if (A_FAILED(status)) { break; } } while (FALSE); AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Exit\n")); return status; }
void host_htc_credit_show(void *arg) { HTC_TARGET *target = (HTC_TARGET *)arg; HTC_ENDPOINT_CREDIT_DIST *pCurEpDist = target->EpCreditDistributionListHead; a_uint32_t totalCredit = 0; while (pCurEpDist != NULL) { adf_os_print("ep %u: %u credits\n", pCurEpDist->Endpoint, pCurEpDist->TxCredits); totalCredit += pCurEpDist->TxCredits; pCurEpDist = pCurEpDist->pNext; } adf_os_print("host total credits: %u\n", totalCredit); adf_os_timer_start(&target->host_htc_credit_debug_timer, 10000); }
a_status_t fwd_send_next(fwd_softc_t *sc) { a_uint32_t len, alloclen; adf_nbuf_t nbuf; fwd_cmd_t *h; a_uint8_t *pld; a_uint32_t target_jmp_loc; len = fwd_chunk_len(sc); alloclen = sizeof(fwd_cmd_t) + len; if (fwd_is_first(sc) || fwd_is_last(sc)) alloclen += 4; nbuf = adf_nbuf_alloc(sc->hif_handle, alloclen + 20, 20, 0); if (!nbuf) { adf_os_print("FWD: packet allocation failed. \n"); return A_STATUS_ENOMEM; } h = (fwd_cmd_t *)adf_nbuf_put_tail(nbuf, alloclen); h->more_data = adf_os_htons(!fwd_is_last(sc)); h->len = adf_os_htons(len); h->offset = adf_os_htonl(sc->offset); pld = (a_uint8_t *)(h + 1); if (fwd_is_first(sc)) { *(a_uint32_t *)pld = adf_os_htonl(sc->target_upload_addr); pld += 4; } adf_os_mem_copy(pld, &sc->image[sc->offset], len); if(h->more_data == 0) { target_jmp_loc = adf_os_htonl(fw_exec_addr); adf_os_mem_copy(pld+len, (a_uint8_t *)&target_jmp_loc, 4); } HIFSend(sc->hif_handle, sc->tx_pipe, NULL, nbuf); adf_os_timer_start(&sc->tmr, FWD_TIMEOUT_MSECS); return A_STATUS_OK; }