/* buffer length (n) specified in bytes */ void BCMROMFN(tkip_mic)(uint32 k0, uint32 k1, int n, uint8 *m, uint32 *left, uint32 *right) { uint32 l = k0; uint32 r = k1; if (((uintptr)m & 3) == 0) { for (; n > 0; n -= 4) { l ^= ltoh32(*(uint *)m); m += 4; tkip_micblock(&l, &r); } } else { for (; n > 0; n -= 4) { l ^= ltoh32_ua(m); m += 4; tkip_micblock(&l, &r); } } *left = l; *right = r; }
static void BCMFASTPATH rpc_dbus_recv_buf(void *handle, uint8 *buf, int len) { rpc_tp_info_t *rpcb = handle; void *pkt; uint32 rpc_len; uint frag; uint agglen; if ((rpcb == NULL) || (buf == NULL)) return; frag = rpcb->tp_host_deagg_cnt_sf; agglen = len; /* TP pkt should have more than encapsulation header */ if (len <= BCM_RPC_TP_ENCAP_LEN) { RPC_TP_ERR(("%s: wrong len %d\n", __FUNCTION__, len)); goto error; } while (len > BCM_RPC_TP_ENCAP_LEN) { rpc_len = ltoh32_ua(buf); if (rpc_len > (uint32)(len - BCM_RPC_TP_ENCAP_LEN)) { rpcb->tp_host_deagg_cnt_badsflen++; return; } /* RPC_BUFFER_RX: allocate */ #if defined(BCM_RPC_ROC) if ((pkt = PKTGET(rpcb->osh, rpc_len, FALSE)) == NULL) { #else if ((pkt = bcm_rpc_tp_pktget(rpcb, rpc_len, FALSE)) == NULL) { #endif printf("%s: bcm_rpc_tp_pktget failed (len %d)\n", __FUNCTION__, len); goto error; } /* RPC_BUFFER_RX: BYTE_COPY from dbus buffer */ bcopy(buf + BCM_RPC_TP_ENCAP_LEN, bcm_rpc_buf_data(rpcb, pkt), rpc_len); /* !! send up */ bcm_rpc_tp_rx(rpcb, pkt); len -= (BCM_RPC_TP_ENCAP_LEN + rpc_len); buf += (BCM_RPC_TP_ENCAP_LEN + rpc_len); if (len > BCM_RPC_TP_ENCAP_LEN) { /* more frag */ rpcb->tp_host_deagg_cnt_sf++; RPC_TP_DEAGG(("%s: deagg %d(remaining %d) bytes\n", __FUNCTION__, rpc_len, len)); } else { if (len != 0) { printf("%s: deagg, remaining len %d is not 0\n", __FUNCTION__, len); } rpcb->tp_host_deagg_cnt_pass++; } } if (frag < rpcb->tp_host_deagg_cnt_sf) { /* aggregated frames */ rpcb->tp_host_deagg_cnt_sf++; /* last one was not counted */ rpcb->tp_host_deagg_cnt_chain++; rpcb->tp_host_deagg_cnt_bytes += agglen; } error: return; } int BCMFASTPATH bcm_rpc_tp_recv_rtn(rpc_tp_info_t *rpcb) { void *pkt; int status = 0; if (!rpcb) return BCME_BADARG; if ((pkt = bcm_rpc_tp_pktget(rpcb, PKTBUFSZ, FALSE)) == NULL) { return BCME_NORESOURCE; } RPC_TP_LOCK(rpcb); if (rpcb->rx_rtn_pkt != NULL) { RPC_TP_UNLOCK(rpcb); if (pkt != NULL) bcm_rpc_tp_pktfree(rpcb, pkt, FALSE); return BCME_BUSY; } rpcb->rx_rtn_pkt = pkt; RPC_TP_UNLOCK(rpcb); #ifndef BCMUSBDEV_EP_FOR_RPCRETURN status = dbus_recv_ctl(rpcb->bus, bcm_rpc_buf_data(rpcb, rpcb->rx_rtn_pkt), PKTBUFSZ); #else if (rpcb->has_2nd_bulk_in_ep) { status = dbus_recv_bulk(rpcb->bus, USBDEV_BULK_IN_EP2); } else { status = dbus_recv_ctl(rpcb->bus, bcm_rpc_buf_data(rpcb, rpcb->rx_rtn_pkt), PKTBUFSZ); } #endif /* BCMUSBDEV_EP_FOR_RPCRETURN */ if (status) { /* May have been cleared by complete routine */ RPC_TP_LOCK(rpcb); pkt = rpcb->rx_rtn_pkt; rpcb->rx_rtn_pkt = NULL; RPC_TP_UNLOCK(rpcb); if (pkt != NULL) bcm_rpc_tp_pktfree(rpcb, pkt, FALSE); if (status == DBUS_ERR_RXFAIL) status = BCME_RXFAIL; else if (status == DBUS_ERR_NODEVICE) status = BCME_NODEVICE; else status = BCME_ERROR; } return status; }