Lines Matching refs:msgbuf

292 static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf);
420 static void brcmf_msgbuf_release_pktids(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_release_pktids() argument
422 if (msgbuf->rx_pktids) in brcmf_msgbuf_release_pktids()
423 brcmf_msgbuf_release_array(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_release_pktids()
424 msgbuf->rx_pktids); in brcmf_msgbuf_release_pktids()
425 if (msgbuf->tx_pktids) in brcmf_msgbuf_release_pktids()
426 brcmf_msgbuf_release_array(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_release_pktids()
427 msgbuf->tx_pktids); in brcmf_msgbuf_release_pktids()
434 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_tx_ioctl() local
441 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_tx_ioctl()
450 msgbuf->reqid++; in brcmf_msgbuf_tx_ioctl()
459 request->trans_id = cpu_to_le16(msgbuf->reqid); in brcmf_msgbuf_tx_ioctl()
463 request->req_buf_addr.high_addr = cpu_to_le32(msgbuf->ioctbuf_phys_hi); in brcmf_msgbuf_tx_ioctl()
464 request->req_buf_addr.low_addr = cpu_to_le32(msgbuf->ioctbuf_phys_lo); in brcmf_msgbuf_tx_ioctl()
466 memcpy(msgbuf->ioctbuf, buf, buf_len); in brcmf_msgbuf_tx_ioctl()
468 memset(msgbuf->ioctbuf, 0, buf_len); in brcmf_msgbuf_tx_ioctl()
477 static int brcmf_msgbuf_ioctl_resp_wait(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_ioctl_resp_wait() argument
479 return wait_event_timeout(msgbuf->ioctl_resp_wait, in brcmf_msgbuf_ioctl_resp_wait()
480 msgbuf->ctl_completed, in brcmf_msgbuf_ioctl_resp_wait()
485 static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_ioctl_resp_wake() argument
487 msgbuf->ctl_completed = true; in brcmf_msgbuf_ioctl_resp_wake()
488 wake_up(&msgbuf->ioctl_resp_wait); in brcmf_msgbuf_ioctl_resp_wake()
495 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_query_dcmd() local
502 msgbuf->ctl_completed = false; in brcmf_msgbuf_query_dcmd()
507 timeout = brcmf_msgbuf_ioctl_resp_wait(msgbuf); in brcmf_msgbuf_query_dcmd()
513 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_query_dcmd()
514 msgbuf->rx_pktids, in brcmf_msgbuf_query_dcmd()
515 msgbuf->ioctl_resp_pktid); in brcmf_msgbuf_query_dcmd()
516 if (msgbuf->ioctl_resp_ret_len != 0) { in brcmf_msgbuf_query_dcmd()
520 memcpy(buf, skb->data, (len < msgbuf->ioctl_resp_ret_len) ? in brcmf_msgbuf_query_dcmd()
521 len : msgbuf->ioctl_resp_ret_len); in brcmf_msgbuf_query_dcmd()
525 *fwerr = msgbuf->ioctl_resp_status; in brcmf_msgbuf_query_dcmd()
548 brcmf_msgbuf_remove_flowring(struct brcmf_msgbuf *msgbuf, u16 flowid) in brcmf_msgbuf_remove_flowring() argument
556 dma_buf = msgbuf->flowrings[flowid]->buf_addr; in brcmf_msgbuf_remove_flowring()
557 dma_free_coherent(msgbuf->drvr->bus_if->dev, dma_sz, dma_buf, in brcmf_msgbuf_remove_flowring()
558 msgbuf->flowring_dma_handle[flowid]); in brcmf_msgbuf_remove_flowring()
560 brcmf_flowring_delete(msgbuf->flow, flowid); in brcmf_msgbuf_remove_flowring()
565 brcmf_msgbuf_dequeue_work(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_dequeue_work() argument
570 spin_lock_irqsave(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_dequeue_work()
571 if (!list_empty(&msgbuf->work_queue)) { in brcmf_msgbuf_dequeue_work()
572 work = list_first_entry(&msgbuf->work_queue, in brcmf_msgbuf_dequeue_work()
576 spin_unlock_irqrestore(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_dequeue_work()
583 brcmf_msgbuf_flowring_create_worker(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_flowring_create_worker() argument
586 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_flowring_create_worker()
598 dma_buf = dma_alloc_coherent(msgbuf->drvr->bus_if->dev, dma_sz, in brcmf_msgbuf_flowring_create_worker()
599 &msgbuf->flowring_dma_handle[flowid], in brcmf_msgbuf_flowring_create_worker()
603 brcmf_flowring_delete(msgbuf->flow, flowid); in brcmf_msgbuf_flowring_create_worker()
607 brcmf_commonring_config(msgbuf->flowrings[flowid], in brcmf_msgbuf_flowring_create_worker()
611 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_flowring_create_worker()
617 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_flowring_create_worker()
625 create->tid = brcmf_flowring_tid(msgbuf->flow, flowid); in brcmf_msgbuf_flowring_create_worker()
630 address = (u64)msgbuf->flowring_dma_handle[flowid]; in brcmf_msgbuf_flowring_create_worker()
643 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_flowring_create_worker()
653 struct brcmf_msgbuf *msgbuf; in brcmf_msgbuf_flowring_worker() local
656 msgbuf = container_of(work, struct brcmf_msgbuf, flowring_work); in brcmf_msgbuf_flowring_worker()
658 while ((create = brcmf_msgbuf_dequeue_work(msgbuf))) { in brcmf_msgbuf_flowring_worker()
659 brcmf_msgbuf_flowring_create_worker(msgbuf, create); in brcmf_msgbuf_flowring_worker()
665 static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx, in brcmf_msgbuf_flowring_create() argument
677 flowid = brcmf_flowring_create(msgbuf->flow, eh->h_dest, in brcmf_msgbuf_flowring_create()
689 spin_lock_irqsave(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_flowring_create()
690 list_add_tail(&create->queue, &msgbuf->work_queue); in brcmf_msgbuf_flowring_create()
691 spin_unlock_irqrestore(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_flowring_create()
692 schedule_work(&msgbuf->flowring_work); in brcmf_msgbuf_flowring_create()
698 static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u16 flowid) in brcmf_msgbuf_txflow() argument
700 struct brcmf_flowring *flow = msgbuf->flow; in brcmf_msgbuf_txflow()
701 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_txflow()
711 commonring = msgbuf->flowrings[flowid]; in brcmf_msgbuf_txflow()
726 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_txflow()
727 msgbuf->tx_pktids, skb, ETH_HLEN, in brcmf_msgbuf_txflow()
735 brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_txflow()
736 msgbuf->tx_pktids, pktid); in brcmf_msgbuf_txflow()
774 struct brcmf_msgbuf *msgbuf; in brcmf_msgbuf_txflow_worker() local
777 msgbuf = container_of(worker, struct brcmf_msgbuf, txflow_work); in brcmf_msgbuf_txflow_worker()
778 for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->max_flowrings) { in brcmf_msgbuf_txflow_worker()
779 clear_bit(flowid, msgbuf->flow_map); in brcmf_msgbuf_txflow_worker()
780 brcmf_msgbuf_txflow(msgbuf, flowid); in brcmf_msgbuf_txflow_worker()
785 static int brcmf_msgbuf_schedule_txdata(struct brcmf_msgbuf *msgbuf, u32 flowid, in brcmf_msgbuf_schedule_txdata() argument
790 set_bit(flowid, msgbuf->flow_map); in brcmf_msgbuf_schedule_txdata()
791 commonring = msgbuf->flowrings[flowid]; in brcmf_msgbuf_schedule_txdata()
794 queue_work(msgbuf->txflow_wq, &msgbuf->txflow_work); in brcmf_msgbuf_schedule_txdata()
803 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_tx_queue_data() local
804 struct brcmf_flowring *flow = msgbuf->flow; in brcmf_msgbuf_tx_queue_data()
812 flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb); in brcmf_msgbuf_tx_queue_data()
822 brcmf_msgbuf_schedule_txdata(msgbuf, flowid, force); in brcmf_msgbuf_tx_queue_data()
832 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_configure_addr_mode() local
834 brcmf_flowring_configure_addr_mode(msgbuf->flow, ifidx, addr_mode); in brcmf_msgbuf_configure_addr_mode()
841 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_delete_peer() local
843 brcmf_flowring_delete_peer(msgbuf->flow, ifidx, peer); in brcmf_msgbuf_delete_peer()
850 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_add_tdls_peer() local
852 brcmf_flowring_add_tdls_peer(msgbuf->flow, ifidx, peer); in brcmf_msgbuf_add_tdls_peer()
857 brcmf_msgbuf_process_ioctl_complete(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_ioctl_complete() argument
863 msgbuf->ioctl_resp_status = in brcmf_msgbuf_process_ioctl_complete()
865 msgbuf->ioctl_resp_ret_len = le16_to_cpu(ioctl_resp->resp_len); in brcmf_msgbuf_process_ioctl_complete()
866 msgbuf->ioctl_resp_pktid = le32_to_cpu(ioctl_resp->msg.request_id); in brcmf_msgbuf_process_ioctl_complete()
868 brcmf_msgbuf_ioctl_resp_wake(msgbuf); in brcmf_msgbuf_process_ioctl_complete()
870 if (msgbuf->cur_ioctlrespbuf) in brcmf_msgbuf_process_ioctl_complete()
871 msgbuf->cur_ioctlrespbuf--; in brcmf_msgbuf_process_ioctl_complete()
872 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf); in brcmf_msgbuf_process_ioctl_complete()
877 brcmf_msgbuf_process_txstatus(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_txstatus() argument
889 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_process_txstatus()
890 msgbuf->tx_pktids, idx); in brcmf_msgbuf_process_txstatus()
894 set_bit(flowid, msgbuf->txstatus_done_map); in brcmf_msgbuf_process_txstatus()
895 commonring = msgbuf->flowrings[flowid]; in brcmf_msgbuf_process_txstatus()
898 brcmf_txfinalize(brcmf_get_ifp(msgbuf->drvr, tx_status->msg.ifidx), in brcmf_msgbuf_process_txstatus()
903 static u32 brcmf_msgbuf_rxbuf_data_post(struct brcmf_msgbuf *msgbuf, u32 count) in brcmf_msgbuf_rxbuf_data_post() argument
905 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_rxbuf_data_post()
917 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_RXPOST_SUBMIT]; in brcmf_msgbuf_rxbuf_data_post()
939 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_rxbuf_data_post()
940 msgbuf->rx_pktids, skb, 0, in brcmf_msgbuf_rxbuf_data_post()
948 if (msgbuf->rx_metadata_offset) { in brcmf_msgbuf_rxbuf_data_post()
951 cpu_to_le16(msgbuf->rx_metadata_offset); in brcmf_msgbuf_rxbuf_data_post()
957 skb_pull(skb, msgbuf->rx_metadata_offset); in brcmf_msgbuf_rxbuf_data_post()
959 physaddr += msgbuf->rx_metadata_offset; in brcmf_msgbuf_rxbuf_data_post()
982 brcmf_msgbuf_rxbuf_data_fill(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_rxbuf_data_fill() argument
987 fillbufs = msgbuf->max_rxbufpost - msgbuf->rxbufpost; in brcmf_msgbuf_rxbuf_data_fill()
990 retcount = brcmf_msgbuf_rxbuf_data_post(msgbuf, fillbufs); in brcmf_msgbuf_rxbuf_data_fill()
993 msgbuf->rxbufpost += retcount; in brcmf_msgbuf_rxbuf_data_fill()
1000 brcmf_msgbuf_update_rxbufpost_count(struct brcmf_msgbuf *msgbuf, u16 rxcnt) in brcmf_msgbuf_update_rxbufpost_count() argument
1002 msgbuf->rxbufpost -= rxcnt; in brcmf_msgbuf_update_rxbufpost_count()
1003 if (msgbuf->rxbufpost <= (msgbuf->max_rxbufpost - in brcmf_msgbuf_update_rxbufpost_count()
1005 brcmf_msgbuf_rxbuf_data_fill(msgbuf); in brcmf_msgbuf_update_rxbufpost_count()
1010 brcmf_msgbuf_rxbuf_ctrl_post(struct brcmf_msgbuf *msgbuf, bool event_buf, in brcmf_msgbuf_rxbuf_ctrl_post() argument
1013 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_rxbuf_ctrl_post()
1025 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_rxbuf_ctrl_post()
1049 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_rxbuf_ctrl_post()
1050 msgbuf->rx_pktids, skb, 0, in brcmf_msgbuf_rxbuf_ctrl_post()
1083 static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_rxbuf_ioctlresp_post() argument
1087 count = msgbuf->max_ioctlrespbuf - msgbuf->cur_ioctlrespbuf; in brcmf_msgbuf_rxbuf_ioctlresp_post()
1088 count = brcmf_msgbuf_rxbuf_ctrl_post(msgbuf, false, count); in brcmf_msgbuf_rxbuf_ioctlresp_post()
1089 msgbuf->cur_ioctlrespbuf += count; in brcmf_msgbuf_rxbuf_ioctlresp_post()
1093 static void brcmf_msgbuf_rxbuf_event_post(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_rxbuf_event_post() argument
1097 count = msgbuf->max_eventbuf - msgbuf->cur_eventbuf; in brcmf_msgbuf_rxbuf_event_post()
1098 count = brcmf_msgbuf_rxbuf_ctrl_post(msgbuf, true, count); in brcmf_msgbuf_rxbuf_event_post()
1099 msgbuf->cur_eventbuf += count; in brcmf_msgbuf_rxbuf_event_post()
1103 static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_event() argument
1105 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_event()
1116 if (msgbuf->cur_eventbuf) in brcmf_msgbuf_process_event()
1117 msgbuf->cur_eventbuf--; in brcmf_msgbuf_process_event()
1118 brcmf_msgbuf_rxbuf_event_post(msgbuf); in brcmf_msgbuf_process_event()
1120 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_process_event()
1121 msgbuf->rx_pktids, idx); in brcmf_msgbuf_process_event()
1125 if (msgbuf->rx_dataoffset) in brcmf_msgbuf_process_event()
1126 skb_pull(skb, msgbuf->rx_dataoffset); in brcmf_msgbuf_process_event()
1130 ifp = brcmf_get_ifp(msgbuf->drvr, event->msg.ifidx); in brcmf_msgbuf_process_event()
1147 brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_rx_complete() argument
1149 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_rx_complete()
1158 brcmf_msgbuf_update_rxbufpost_count(msgbuf, 1); in brcmf_msgbuf_process_rx_complete()
1166 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_process_rx_complete()
1167 msgbuf->rx_pktids, idx); in brcmf_msgbuf_process_rx_complete()
1173 else if (msgbuf->rx_dataoffset) in brcmf_msgbuf_process_rx_complete()
1174 skb_pull(skb, msgbuf->rx_dataoffset); in brcmf_msgbuf_process_rx_complete()
1180 ifp = msgbuf->drvr->mon_if; in brcmf_msgbuf_process_rx_complete()
1192 ifp = brcmf_get_ifp(msgbuf->drvr, rx_complete->msg.ifidx); in brcmf_msgbuf_process_rx_complete()
1204 static void brcmf_msgbuf_process_gen_status(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_gen_status() argument
1208 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_gen_status()
1216 static void brcmf_msgbuf_process_ring_status(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_ring_status() argument
1220 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_ring_status()
1233 brcmf_msgbuf_process_flow_ring_create_response(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_flow_ring_create_response() argument
1236 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_flow_ring_create_response()
1249 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_process_flow_ring_create_response()
1255 brcmf_flowring_open(msgbuf->flow, flowid); in brcmf_msgbuf_process_flow_ring_create_response()
1257 brcmf_msgbuf_schedule_txdata(msgbuf, flowid, true); in brcmf_msgbuf_process_flow_ring_create_response()
1262 brcmf_msgbuf_process_flow_ring_delete_response(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_flow_ring_delete_response() argument
1265 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_flow_ring_delete_response()
1278 brcmf_flowring_delete(msgbuf->flow, flowid); in brcmf_msgbuf_process_flow_ring_delete_response()
1284 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_process_flow_ring_delete_response()
1288 static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_msgtype() argument
1290 struct brcmf_pub *drvr = msgbuf->drvr; in brcmf_msgbuf_process_msgtype()
1297 brcmf_msgbuf_process_gen_status(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1301 brcmf_msgbuf_process_ring_status(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1305 brcmf_msgbuf_process_flow_ring_create_response(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1309 brcmf_msgbuf_process_flow_ring_delete_response(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1316 brcmf_msgbuf_process_ioctl_complete(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1320 brcmf_msgbuf_process_event(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1324 brcmf_msgbuf_process_txstatus(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1328 brcmf_msgbuf_process_rx_complete(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1337 static void brcmf_msgbuf_process_rx(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_rx() argument
1351 brcmf_msgbuf_process_msgtype(msgbuf, in brcmf_msgbuf_process_rx()
1352 buf + msgbuf->rx_dataoffset); in brcmf_msgbuf_process_rx()
1373 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_proto_msgbuf_rx_trigger() local
1379 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_RX_COMPLETE]; in brcmf_proto_msgbuf_rx_trigger()
1380 brcmf_msgbuf_process_rx(msgbuf, buf); in brcmf_proto_msgbuf_rx_trigger()
1381 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_TX_COMPLETE]; in brcmf_proto_msgbuf_rx_trigger()
1382 brcmf_msgbuf_process_rx(msgbuf, buf); in brcmf_proto_msgbuf_rx_trigger()
1383 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_CONTROL_COMPLETE]; in brcmf_proto_msgbuf_rx_trigger()
1384 brcmf_msgbuf_process_rx(msgbuf, buf); in brcmf_proto_msgbuf_rx_trigger()
1386 for_each_set_bit(flowid, msgbuf->txstatus_done_map, in brcmf_proto_msgbuf_rx_trigger()
1387 msgbuf->max_flowrings) { in brcmf_proto_msgbuf_rx_trigger()
1388 clear_bit(flowid, msgbuf->txstatus_done_map); in brcmf_proto_msgbuf_rx_trigger()
1389 commonring = msgbuf->flowrings[flowid]; in brcmf_proto_msgbuf_rx_trigger()
1390 qlen = brcmf_flowring_qlen(msgbuf->flow, flowid); in brcmf_proto_msgbuf_rx_trigger()
1394 brcmf_msgbuf_schedule_txdata(msgbuf, flowid, true); in brcmf_proto_msgbuf_rx_trigger()
1403 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_delete_flowring() local
1406 struct brcmf_commonring *commonring_del = msgbuf->flowrings[flowid]; in brcmf_msgbuf_delete_flowring()
1407 struct brcmf_flowring *flow = msgbuf->flow; in brcmf_msgbuf_delete_flowring()
1431 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_delete_flowring()
1435 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_delete_flowring()
1441 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_delete_flowring()
1447 ifidx = brcmf_flowring_ifidx_get(msgbuf->flow, flowid); in brcmf_msgbuf_delete_flowring()
1464 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_delete_flowring()
1473 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_stats_read() local
1479 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_stats_read()
1482 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_RXPOST_SUBMIT]; in brcmf_msgbuf_stats_read()
1485 commonring = msgbuf->commonrings[BRCMF_D2H_MSGRING_CONTROL_COMPLETE]; in brcmf_msgbuf_stats_read()
1488 commonring = msgbuf->commonrings[BRCMF_D2H_MSGRING_TX_COMPLETE]; in brcmf_msgbuf_stats_read()
1491 commonring = msgbuf->commonrings[BRCMF_D2H_MSGRING_RX_COMPLETE]; in brcmf_msgbuf_stats_read()
1498 for (i = 0; i < msgbuf->flow->nrofrings; i++) { in brcmf_msgbuf_stats_read()
1499 if (!msgbuf->flow->rings[i]) in brcmf_msgbuf_stats_read()
1501 ring = msgbuf->flow->rings[i]; in brcmf_msgbuf_stats_read()
1504 commonring = msgbuf->flowrings[i]; in brcmf_msgbuf_stats_read()
1505 hash = &msgbuf->flow->hash[ring->hash_id]; in brcmf_msgbuf_stats_read()
1530 struct brcmf_msgbuf *msgbuf; in brcmf_proto_msgbuf_attach() local
1534 if_msgbuf = drvr->bus_if->msgbuf; in brcmf_proto_msgbuf_attach()
1542 msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1543 if (!msgbuf) in brcmf_proto_msgbuf_attach()
1546 msgbuf->txflow_wq = create_singlethread_workqueue("msgbuf_txflow"); in brcmf_proto_msgbuf_attach()
1547 if (msgbuf->txflow_wq == NULL) { in brcmf_proto_msgbuf_attach()
1551 INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker); in brcmf_proto_msgbuf_attach()
1554 msgbuf->flow_map = kzalloc(count, GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1555 if (!msgbuf->flow_map) in brcmf_proto_msgbuf_attach()
1558 msgbuf->txstatus_done_map = kzalloc(count, GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1559 if (!msgbuf->txstatus_done_map) in brcmf_proto_msgbuf_attach()
1562 msgbuf->drvr = drvr; in brcmf_proto_msgbuf_attach()
1563 msgbuf->ioctbuf = dma_alloc_coherent(drvr->bus_if->dev, in brcmf_proto_msgbuf_attach()
1565 &msgbuf->ioctbuf_handle, in brcmf_proto_msgbuf_attach()
1567 if (!msgbuf->ioctbuf) in brcmf_proto_msgbuf_attach()
1569 address = (u64)msgbuf->ioctbuf_handle; in brcmf_proto_msgbuf_attach()
1570 msgbuf->ioctbuf_phys_hi = address >> 32; in brcmf_proto_msgbuf_attach()
1571 msgbuf->ioctbuf_phys_lo = address & 0xffffffff; in brcmf_proto_msgbuf_attach()
1582 drvr->proto->pd = msgbuf; in brcmf_proto_msgbuf_attach()
1584 init_waitqueue_head(&msgbuf->ioctl_resp_wait); in brcmf_proto_msgbuf_attach()
1586 msgbuf->commonrings = in brcmf_proto_msgbuf_attach()
1588 msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings; in brcmf_proto_msgbuf_attach()
1589 msgbuf->max_flowrings = if_msgbuf->max_flowrings; in brcmf_proto_msgbuf_attach()
1590 msgbuf->flowring_dma_handle = in brcmf_proto_msgbuf_attach()
1591 kcalloc(msgbuf->max_flowrings, in brcmf_proto_msgbuf_attach()
1592 sizeof(*msgbuf->flowring_dma_handle), GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1593 if (!msgbuf->flowring_dma_handle) in brcmf_proto_msgbuf_attach()
1596 msgbuf->rx_dataoffset = if_msgbuf->rx_dataoffset; in brcmf_proto_msgbuf_attach()
1597 msgbuf->max_rxbufpost = if_msgbuf->max_rxbufpost; in brcmf_proto_msgbuf_attach()
1599 msgbuf->max_ioctlrespbuf = BRCMF_MSGBUF_MAX_IOCTLRESPBUF_POST; in brcmf_proto_msgbuf_attach()
1600 msgbuf->max_eventbuf = BRCMF_MSGBUF_MAX_EVENTBUF_POST; in brcmf_proto_msgbuf_attach()
1602 msgbuf->tx_pktids = brcmf_msgbuf_init_pktids(NR_TX_PKTIDS, in brcmf_proto_msgbuf_attach()
1604 if (!msgbuf->tx_pktids) in brcmf_proto_msgbuf_attach()
1606 msgbuf->rx_pktids = brcmf_msgbuf_init_pktids(NR_RX_PKTIDS, in brcmf_proto_msgbuf_attach()
1608 if (!msgbuf->rx_pktids) in brcmf_proto_msgbuf_attach()
1611 msgbuf->flow = brcmf_flowring_attach(drvr->bus_if->dev, in brcmf_proto_msgbuf_attach()
1613 if (!msgbuf->flow) in brcmf_proto_msgbuf_attach()
1618 msgbuf->max_rxbufpost, msgbuf->max_eventbuf, in brcmf_proto_msgbuf_attach()
1619 msgbuf->max_ioctlrespbuf); in brcmf_proto_msgbuf_attach()
1622 brcmf_msgbuf_rxbuf_data_fill(msgbuf); in brcmf_proto_msgbuf_attach()
1623 if (msgbuf->max_rxbufpost != msgbuf->rxbufpost) in brcmf_proto_msgbuf_attach()
1629 brcmf_msgbuf_rxbuf_event_post(msgbuf); in brcmf_proto_msgbuf_attach()
1630 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf); in brcmf_proto_msgbuf_attach()
1632 INIT_WORK(&msgbuf->flowring_work, brcmf_msgbuf_flowring_worker); in brcmf_proto_msgbuf_attach()
1633 spin_lock_init(&msgbuf->flowring_work_lock); in brcmf_proto_msgbuf_attach()
1634 INIT_LIST_HEAD(&msgbuf->work_queue); in brcmf_proto_msgbuf_attach()
1639 if (msgbuf) { in brcmf_proto_msgbuf_attach()
1640 kfree(msgbuf->flow_map); in brcmf_proto_msgbuf_attach()
1641 kfree(msgbuf->txstatus_done_map); in brcmf_proto_msgbuf_attach()
1642 brcmf_msgbuf_release_pktids(msgbuf); in brcmf_proto_msgbuf_attach()
1643 kfree(msgbuf->flowring_dma_handle); in brcmf_proto_msgbuf_attach()
1644 if (msgbuf->ioctbuf) in brcmf_proto_msgbuf_attach()
1647 msgbuf->ioctbuf, in brcmf_proto_msgbuf_attach()
1648 msgbuf->ioctbuf_handle); in brcmf_proto_msgbuf_attach()
1649 if (msgbuf->txflow_wq) in brcmf_proto_msgbuf_attach()
1650 destroy_workqueue(msgbuf->txflow_wq); in brcmf_proto_msgbuf_attach()
1651 kfree(msgbuf); in brcmf_proto_msgbuf_attach()
1659 struct brcmf_msgbuf *msgbuf; in brcmf_proto_msgbuf_detach() local
1664 msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_proto_msgbuf_detach()
1665 cancel_work_sync(&msgbuf->flowring_work); in brcmf_proto_msgbuf_detach()
1666 while (!list_empty(&msgbuf->work_queue)) { in brcmf_proto_msgbuf_detach()
1667 work = list_first_entry(&msgbuf->work_queue, in brcmf_proto_msgbuf_detach()
1673 kfree(msgbuf->flow_map); in brcmf_proto_msgbuf_detach()
1674 kfree(msgbuf->txstatus_done_map); in brcmf_proto_msgbuf_detach()
1675 if (msgbuf->txflow_wq) in brcmf_proto_msgbuf_detach()
1676 destroy_workqueue(msgbuf->txflow_wq); in brcmf_proto_msgbuf_detach()
1678 brcmf_flowring_detach(msgbuf->flow); in brcmf_proto_msgbuf_detach()
1681 msgbuf->ioctbuf, msgbuf->ioctbuf_handle); in brcmf_proto_msgbuf_detach()
1682 brcmf_msgbuf_release_pktids(msgbuf); in brcmf_proto_msgbuf_detach()
1683 kfree(msgbuf->flowring_dma_handle); in brcmf_proto_msgbuf_detach()
1684 kfree(msgbuf); in brcmf_proto_msgbuf_detach()