int bcm_rpc_tp_buf_send(rpc_tp_info_t * rpcb, rpc_buf_t *b) { int err; /* Add the TP encapsulation */ bcm_rpc_tp_tx_encap(rpcb, b); /* if aggregation enabled use the agg path, otherwise send immediately */ if (rpcb->tp_tx_aggregation) { err = bcm_rpc_tp_tx_agg(rpcb, b); } else { rpcb->tp_tx_agg_cnt_pass++; err = bcm_rpc_tp_buf_send_internal(rpcb, b); } return err; }
int bcm_rpc_tp_send_callreturn(rpc_tp_info_t * rpc_th, rpc_buf_t *b) { int err, pktlen; struct lbuf *lb; hndrte_dev_t *chained = rpc_th->ctx->chained; ASSERT(chained); /* Add the TP encapsulation */ bcm_rpc_tp_tx_encap(rpc_th, b); /* Pad if pkt size is a multiple of MPS */ pktlen = bcm_rpc_buf_totlen_get(rpc_th, b); if (pktlen % BCM_RPC_TP_DNGL_CTRLEP_MPS == 0) { RPC_TP_AGG(("%s, tp pkt is multiple of %d bytes, padding %d bytes\n", __FUNCTION__, BCM_RPC_TP_DNGL_CTRLEP_MPS, BCM_RPC_TP_DNGL_ZLP_PAD)); bcm_rpc_tp_buf_pad(rpc_th, b, BCM_RPC_TP_DNGL_ZLP_PAD); } lb = PKTTONATIVE(rpc_th->osh, b); if (rpc_th->has_2nd_bulk_in_ep) { err = chained->funcs->xmit2(rpc_th->ctx, chained, lb, USBDEV_BULK_IN_EP2); } else { err = chained->funcs->xmit_ctl(rpc_th->ctx, chained, lb); } /* send through control endpoint */ if (err != 0) { RPC_TP_ERR(("%s: xmit failed; free pkt %p\n", __FUNCTION__, lb)); rpc_th->txerr_cnt++; lb_free(lb); } else { rpc_th->tx_cnt++; /* give pkt ownership to usb driver, decrement the counter */ rpc_th->buf_cnt_inuse -= pktsegcnt(rpc_th->osh, b); } return err; }
int bcm_rpc_tp_buf_send(rpc_tp_info_t * rpc_th, rpc_buf_t *b) { int err; /* Add the TP encapsulation */ bcm_rpc_tp_tx_encap(rpc_th, b); /* if agg successful, done; otherwise, send it */ if (rpc_th->tp_dngl_aggregation) { err = bcm_rpc_tp_dngl_agg(rpc_th, b); return err; } rpc_th->tp_dngl_agg_cnt_pass++; if (rpc_th->tx_flowctl) { bcm_rpc_tp_buf_send_enq(rpc_th, b); err = 0; } else { err = bcm_rpc_tp_buf_send_internal(rpc_th, b, USBDEV_BULK_IN_EP1); } return err; }