extern "C" void ar6k_rx(void *Context, HTC_PACKET *pPacket) { CAR6KMini *Adapter = (CAR6KMini *)Context; struct ndis_mini_buf_t * skb = (struct ndis_mini_buf_t *)pPacket->pPktContext; A_STATUS status = pPacket->Status; HTC_ENDPOINT_ID ept = pPacket->Endpoint; NDIS_DEBUG_PRINTF(0, " %s() + Enter \r\n",__FUNCTION__); A_ASSERT((status != A_OK) || (pPacket->pBuffer == (A_NETBUF_DATA(skb) + HTC_HEADER_LEN))); Adapter->m_RxBuffers[ept]--; if (A_SUCCESS(status)) { Adapter->Lock(); A_NETBUF_PUT(skb, pPacket->ActualLength + HTC_HEADER_LEN); A_NETBUF_PULL(skb, HTC_HEADER_LEN); Adapter->Unlock(); } if (status != A_OK) { A_NETBUF_FREE(skb); } else if (Adapter->m_WMIEnabled == TRUE) { if (ept == Adapter->m_ControlEp) { /* * this is a wmi control msg */ //wmi_control_rx((wmi_t *)ar->arWmi, skb, ar->arPhyCapability); /* Bug 82893 */ Adapter->ReceiveWMIControlPacket(pPacket); } else { // WMI Data packet (e.g. IP data packet) Adapter->ReceiveWMIDataPacket(pPacket); } } if (status != A_ECANCELED) { /* * HTC provides A_ECANCELED status when it doesn't want to be refilled * (probably due to a shutdown) */ Adapter->AR6KRxRefill(ept); } NDIS_DEBUG_PRINTF(0, "%s() -Exit \r\n", __FUNCTION__); }
static void ar6000_hci_pkt_recv(void *pContext, HTC_PACKET *pPacket) { AR6K_HCI_BRIDGE_INFO *pHcidevInfo = (AR6K_HCI_BRIDGE_INFO *)pContext; struct sk_buff *skb; AR_SOFTC_DEV_T *arDev = pHcidevInfo->ar->arDev[0]; A_ASSERT(pHcidevInfo != NULL); skb = (struct sk_buff *)pPacket->pPktContext; A_ASSERT(skb != NULL); do { if (A_FAILED(pPacket->Status)) { break; } AR_DEBUG_PRINTF(ATH_DEBUG_HCI_RECV, ("HCI Bridge, packet received type : %d len:%d \n", HCI_GET_PACKET_TYPE(pPacket),pPacket->ActualLength)); /* set the actual buffer position in the os buffer, HTC recv buffers posted to HCI are set * to fill the front of the buffer */ A_NETBUF_PUT(skb,pPacket->ActualLength + pHcidevInfo->HCIProps.HeadRoom); A_NETBUF_PULL(skb,pHcidevInfo->HCIProps.HeadRoom); if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_HCI_DUMP)) { AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("<<< Recv HCI %s packet len:%d \n", (HCI_GET_PACKET_TYPE(pPacket) == HCI_EVENT_TYPE) ? "EVENT" : "ACL", skb->len)); AR_DEBUG_PRINTBUF(skb->data, skb->len,"BT HCI RECV Packet Dump"); } if (pHcidevInfo->HciNormalMode) { /* indicate the packet */ if (bt_indicate_recv(pHcidevInfo,HCI_GET_PACKET_TYPE(pPacket),skb)) { /* bt stack accepted the packet */ skb = NULL; } break; } /* for testing, indicate packet to the network stack */ #ifdef EXPORT_HCI_BRIDGE_INTERFACE skb->dev = (struct net_device *)(pHcidevInfo->HCITransHdl.netDevice); if ((((struct net_device *)pHcidevInfo->HCITransHdl.netDevice)->flags & IFF_UP) == IFF_UP) { skb->protocol = eth_type_trans(skb, (struct net_device *)(pHcidevInfo->HCITransHdl.netDevice)); #else skb->dev = arDev->arNetDev; if ((arDev->arNetDev->flags & IFF_UP) == IFF_UP) { skb->protocol = eth_type_trans(skb, arDev->arNetDev); #endif netif_rx(skb); skb = NULL; } } while (FALSE); FreeHTCStruct(pHcidevInfo,pPacket); if (skb != NULL) { /* packet was not accepted, free it */ FreeBtOsBuf(pHcidevInfo,skb); } } static void ar6000_hci_pkt_refill(void *pContext, HCI_TRANSPORT_PACKET_TYPE Type, int BuffersAvailable) { AR6K_HCI_BRIDGE_INFO *pHcidevInfo = (AR6K_HCI_BRIDGE_INFO *)pContext; int refillCount; if (Type == HCI_ACL_TYPE) { refillCount = MAX_ACL_RECV_BUFS - BuffersAvailable; } else { refillCount = MAX_EVT_RECV_BUFS - BuffersAvailable; } if (refillCount > 0) { RefillRecvBuffers(pHcidevInfo,Type,refillCount); } }