Lines Matching refs:msgbuf
291 static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf);
416 static void brcmf_msgbuf_release_pktids(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_release_pktids() argument
418 if (msgbuf->rx_pktids) in brcmf_msgbuf_release_pktids()
419 brcmf_msgbuf_release_array(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_release_pktids()
420 msgbuf->rx_pktids); in brcmf_msgbuf_release_pktids()
421 if (msgbuf->tx_pktids) in brcmf_msgbuf_release_pktids()
422 brcmf_msgbuf_release_array(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_release_pktids()
423 msgbuf->tx_pktids); in brcmf_msgbuf_release_pktids()
430 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_tx_ioctl() local
437 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_tx_ioctl()
446 msgbuf->reqid++; in brcmf_msgbuf_tx_ioctl()
455 request->trans_id = cpu_to_le16(msgbuf->reqid); in brcmf_msgbuf_tx_ioctl()
459 request->req_buf_addr.high_addr = cpu_to_le32(msgbuf->ioctbuf_phys_hi); in brcmf_msgbuf_tx_ioctl()
460 request->req_buf_addr.low_addr = cpu_to_le32(msgbuf->ioctbuf_phys_lo); in brcmf_msgbuf_tx_ioctl()
462 memcpy(msgbuf->ioctbuf, buf, buf_len); in brcmf_msgbuf_tx_ioctl()
464 memset(msgbuf->ioctbuf, 0, buf_len); in brcmf_msgbuf_tx_ioctl()
474 static int brcmf_msgbuf_ioctl_resp_wait(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_ioctl_resp_wait() argument
476 return wait_event_timeout(msgbuf->ioctl_resp_wait, in brcmf_msgbuf_ioctl_resp_wait()
477 msgbuf->ctl_completed, in brcmf_msgbuf_ioctl_resp_wait()
482 static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_ioctl_resp_wake() argument
484 msgbuf->ctl_completed = true; in brcmf_msgbuf_ioctl_resp_wake()
485 if (waitqueue_active(&msgbuf->ioctl_resp_wait)) in brcmf_msgbuf_ioctl_resp_wake()
486 wake_up(&msgbuf->ioctl_resp_wait); in brcmf_msgbuf_ioctl_resp_wake()
493 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_query_dcmd() local
499 msgbuf->ctl_completed = false; in brcmf_msgbuf_query_dcmd()
504 timeout = brcmf_msgbuf_ioctl_resp_wait(msgbuf); in brcmf_msgbuf_query_dcmd()
510 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_query_dcmd()
511 msgbuf->rx_pktids, in brcmf_msgbuf_query_dcmd()
512 msgbuf->ioctl_resp_pktid); in brcmf_msgbuf_query_dcmd()
513 if (msgbuf->ioctl_resp_ret_len != 0) { in brcmf_msgbuf_query_dcmd()
517 memcpy(buf, skb->data, (len < msgbuf->ioctl_resp_ret_len) ? in brcmf_msgbuf_query_dcmd()
518 len : msgbuf->ioctl_resp_ret_len); in brcmf_msgbuf_query_dcmd()
522 return msgbuf->ioctl_resp_status; in brcmf_msgbuf_query_dcmd()
541 brcmf_msgbuf_remove_flowring(struct brcmf_msgbuf *msgbuf, u16 flowid) in brcmf_msgbuf_remove_flowring() argument
549 dma_buf = msgbuf->flowrings[flowid]->buf_addr; in brcmf_msgbuf_remove_flowring()
550 dma_free_coherent(msgbuf->drvr->bus_if->dev, dma_sz, dma_buf, in brcmf_msgbuf_remove_flowring()
551 msgbuf->flowring_dma_handle[flowid]); in brcmf_msgbuf_remove_flowring()
553 brcmf_flowring_delete(msgbuf->flow, flowid); in brcmf_msgbuf_remove_flowring()
558 brcmf_msgbuf_dequeue_work(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_dequeue_work() argument
563 spin_lock_irqsave(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_dequeue_work()
564 if (!list_empty(&msgbuf->work_queue)) { in brcmf_msgbuf_dequeue_work()
565 work = list_first_entry(&msgbuf->work_queue, in brcmf_msgbuf_dequeue_work()
569 spin_unlock_irqrestore(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_dequeue_work()
576 brcmf_msgbuf_flowring_create_worker(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_flowring_create_worker() argument
590 dma_buf = dma_alloc_coherent(msgbuf->drvr->bus_if->dev, dma_sz, in brcmf_msgbuf_flowring_create_worker()
591 &msgbuf->flowring_dma_handle[flowid], in brcmf_msgbuf_flowring_create_worker()
595 brcmf_flowring_delete(msgbuf->flow, flowid); in brcmf_msgbuf_flowring_create_worker()
599 brcmf_commonring_config(msgbuf->flowrings[flowid], in brcmf_msgbuf_flowring_create_worker()
603 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_flowring_create_worker()
609 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_flowring_create_worker()
617 create->tid = brcmf_flowring_tid(msgbuf->flow, flowid); in brcmf_msgbuf_flowring_create_worker()
622 address = (u64)msgbuf->flowring_dma_handle[flowid]; in brcmf_msgbuf_flowring_create_worker()
635 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_flowring_create_worker()
645 struct brcmf_msgbuf *msgbuf; in brcmf_msgbuf_flowring_worker() local
648 msgbuf = container_of(work, struct brcmf_msgbuf, flowring_work); in brcmf_msgbuf_flowring_worker()
650 while ((create = brcmf_msgbuf_dequeue_work(msgbuf))) { in brcmf_msgbuf_flowring_worker()
651 brcmf_msgbuf_flowring_create_worker(msgbuf, create); in brcmf_msgbuf_flowring_worker()
657 static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx, in brcmf_msgbuf_flowring_create() argument
669 flowid = brcmf_flowring_create(msgbuf->flow, eh->h_dest, in brcmf_msgbuf_flowring_create()
681 spin_lock_irqsave(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_flowring_create()
682 list_add_tail(&create->queue, &msgbuf->work_queue); in brcmf_msgbuf_flowring_create()
683 spin_unlock_irqrestore(&msgbuf->flowring_work_lock, flags); in brcmf_msgbuf_flowring_create()
684 schedule_work(&msgbuf->flowring_work); in brcmf_msgbuf_flowring_create()
690 static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u8 flowid) in brcmf_msgbuf_txflow() argument
692 struct brcmf_flowring *flow = msgbuf->flow; in brcmf_msgbuf_txflow()
702 commonring = msgbuf->flowrings[flowid]; in brcmf_msgbuf_txflow()
717 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_txflow()
718 msgbuf->tx_pktids, skb, ETH_HLEN, in brcmf_msgbuf_txflow()
726 brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_txflow()
727 msgbuf->tx_pktids, pktid); in brcmf_msgbuf_txflow()
765 struct brcmf_msgbuf *msgbuf; in brcmf_msgbuf_txflow_worker() local
768 msgbuf = container_of(worker, struct brcmf_msgbuf, txflow_work); in brcmf_msgbuf_txflow_worker()
769 for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->nrof_flowrings) { in brcmf_msgbuf_txflow_worker()
770 clear_bit(flowid, msgbuf->flow_map); in brcmf_msgbuf_txflow_worker()
771 brcmf_msgbuf_txflow(msgbuf, flowid); in brcmf_msgbuf_txflow_worker()
776 static int brcmf_msgbuf_schedule_txdata(struct brcmf_msgbuf *msgbuf, u32 flowid, in brcmf_msgbuf_schedule_txdata() argument
781 set_bit(flowid, msgbuf->flow_map); in brcmf_msgbuf_schedule_txdata()
782 commonring = msgbuf->flowrings[flowid]; in brcmf_msgbuf_schedule_txdata()
785 queue_work(msgbuf->txflow_wq, &msgbuf->txflow_work); in brcmf_msgbuf_schedule_txdata()
794 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_txdata() local
795 struct brcmf_flowring *flow = msgbuf->flow; in brcmf_msgbuf_txdata()
801 flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb); in brcmf_msgbuf_txdata()
806 brcmf_msgbuf_schedule_txdata(msgbuf, flowid, false); in brcmf_msgbuf_txdata()
816 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_configure_addr_mode() local
818 brcmf_flowring_configure_addr_mode(msgbuf->flow, ifidx, addr_mode); in brcmf_msgbuf_configure_addr_mode()
825 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_delete_peer() local
827 brcmf_flowring_delete_peer(msgbuf->flow, ifidx, peer); in brcmf_msgbuf_delete_peer()
834 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_add_tdls_peer() local
836 brcmf_flowring_add_tdls_peer(msgbuf->flow, ifidx, peer); in brcmf_msgbuf_add_tdls_peer()
841 brcmf_msgbuf_process_ioctl_complete(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_ioctl_complete() argument
847 msgbuf->ioctl_resp_status = in brcmf_msgbuf_process_ioctl_complete()
849 msgbuf->ioctl_resp_ret_len = le16_to_cpu(ioctl_resp->resp_len); in brcmf_msgbuf_process_ioctl_complete()
850 msgbuf->ioctl_resp_pktid = le32_to_cpu(ioctl_resp->msg.request_id); in brcmf_msgbuf_process_ioctl_complete()
852 brcmf_msgbuf_ioctl_resp_wake(msgbuf); in brcmf_msgbuf_process_ioctl_complete()
854 if (msgbuf->cur_ioctlrespbuf) in brcmf_msgbuf_process_ioctl_complete()
855 msgbuf->cur_ioctlrespbuf--; in brcmf_msgbuf_process_ioctl_complete()
856 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf); in brcmf_msgbuf_process_ioctl_complete()
861 brcmf_msgbuf_process_txstatus(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_txstatus() argument
873 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_process_txstatus()
874 msgbuf->tx_pktids, idx); in brcmf_msgbuf_process_txstatus()
878 set_bit(flowid, msgbuf->txstatus_done_map); in brcmf_msgbuf_process_txstatus()
879 commonring = msgbuf->flowrings[flowid]; in brcmf_msgbuf_process_txstatus()
882 brcmf_txfinalize(msgbuf->drvr, skb, tx_status->msg.ifidx, true); in brcmf_msgbuf_process_txstatus()
886 static u32 brcmf_msgbuf_rxbuf_data_post(struct brcmf_msgbuf *msgbuf, u32 count) in brcmf_msgbuf_rxbuf_data_post() argument
899 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_RXPOST_SUBMIT]; in brcmf_msgbuf_rxbuf_data_post()
921 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_rxbuf_data_post()
922 msgbuf->rx_pktids, skb, 0, in brcmf_msgbuf_rxbuf_data_post()
930 if (msgbuf->rx_metadata_offset) { in brcmf_msgbuf_rxbuf_data_post()
933 cpu_to_le16(msgbuf->rx_metadata_offset); in brcmf_msgbuf_rxbuf_data_post()
939 skb_pull(skb, msgbuf->rx_metadata_offset); in brcmf_msgbuf_rxbuf_data_post()
941 physaddr += msgbuf->rx_metadata_offset; in brcmf_msgbuf_rxbuf_data_post()
964 brcmf_msgbuf_rxbuf_data_fill(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_rxbuf_data_fill() argument
969 fillbufs = msgbuf->max_rxbufpost - msgbuf->rxbufpost; in brcmf_msgbuf_rxbuf_data_fill()
972 retcount = brcmf_msgbuf_rxbuf_data_post(msgbuf, fillbufs); in brcmf_msgbuf_rxbuf_data_fill()
975 msgbuf->rxbufpost += retcount; in brcmf_msgbuf_rxbuf_data_fill()
982 brcmf_msgbuf_update_rxbufpost_count(struct brcmf_msgbuf *msgbuf, u16 rxcnt) in brcmf_msgbuf_update_rxbufpost_count() argument
984 msgbuf->rxbufpost -= rxcnt; in brcmf_msgbuf_update_rxbufpost_count()
985 if (msgbuf->rxbufpost <= (msgbuf->max_rxbufpost - in brcmf_msgbuf_update_rxbufpost_count()
987 brcmf_msgbuf_rxbuf_data_fill(msgbuf); in brcmf_msgbuf_update_rxbufpost_count()
992 brcmf_msgbuf_rxbuf_ctrl_post(struct brcmf_msgbuf *msgbuf, bool event_buf, in brcmf_msgbuf_rxbuf_ctrl_post() argument
1006 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_rxbuf_ctrl_post()
1030 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_rxbuf_ctrl_post()
1031 msgbuf->rx_pktids, skb, 0, in brcmf_msgbuf_rxbuf_ctrl_post()
1064 static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_rxbuf_ioctlresp_post() argument
1068 count = msgbuf->max_ioctlrespbuf - msgbuf->cur_ioctlrespbuf; in brcmf_msgbuf_rxbuf_ioctlresp_post()
1069 count = brcmf_msgbuf_rxbuf_ctrl_post(msgbuf, false, count); in brcmf_msgbuf_rxbuf_ioctlresp_post()
1070 msgbuf->cur_ioctlrespbuf += count; in brcmf_msgbuf_rxbuf_ioctlresp_post()
1074 static void brcmf_msgbuf_rxbuf_event_post(struct brcmf_msgbuf *msgbuf) in brcmf_msgbuf_rxbuf_event_post() argument
1078 count = msgbuf->max_eventbuf - msgbuf->cur_eventbuf; in brcmf_msgbuf_rxbuf_event_post()
1079 count = brcmf_msgbuf_rxbuf_ctrl_post(msgbuf, true, count); in brcmf_msgbuf_rxbuf_event_post()
1080 msgbuf->cur_eventbuf += count; in brcmf_msgbuf_rxbuf_event_post()
1085 brcmf_msgbuf_rx_skb(struct brcmf_msgbuf *msgbuf, struct sk_buff *skb, in brcmf_msgbuf_rx_skb() argument
1098 ifp = msgbuf->drvr->iflist[ifidx]; in brcmf_msgbuf_rx_skb()
1108 static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_event() argument
1119 if (msgbuf->cur_eventbuf) in brcmf_msgbuf_process_event()
1120 msgbuf->cur_eventbuf--; in brcmf_msgbuf_process_event()
1121 brcmf_msgbuf_rxbuf_event_post(msgbuf); in brcmf_msgbuf_process_event()
1123 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_process_event()
1124 msgbuf->rx_pktids, idx); in brcmf_msgbuf_process_event()
1128 if (msgbuf->rx_dataoffset) in brcmf_msgbuf_process_event()
1129 skb_pull(skb, msgbuf->rx_dataoffset); in brcmf_msgbuf_process_event()
1133 brcmf_msgbuf_rx_skb(msgbuf, skb, event->msg.ifidx); in brcmf_msgbuf_process_event()
1138 brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_rx_complete() argument
1146 brcmf_msgbuf_update_rxbufpost_count(msgbuf, 1); in brcmf_msgbuf_process_rx_complete()
1153 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, in brcmf_msgbuf_process_rx_complete()
1154 msgbuf->rx_pktids, idx); in brcmf_msgbuf_process_rx_complete()
1160 else if (msgbuf->rx_dataoffset) in brcmf_msgbuf_process_rx_complete()
1161 skb_pull(skb, msgbuf->rx_dataoffset); in brcmf_msgbuf_process_rx_complete()
1165 brcmf_msgbuf_rx_skb(msgbuf, skb, rx_complete->msg.ifidx); in brcmf_msgbuf_process_rx_complete()
1170 brcmf_msgbuf_process_flow_ring_create_response(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_flow_ring_create_response() argument
1185 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_process_flow_ring_create_response()
1191 brcmf_flowring_open(msgbuf->flow, flowid); in brcmf_msgbuf_process_flow_ring_create_response()
1193 brcmf_msgbuf_schedule_txdata(msgbuf, flowid, true); in brcmf_msgbuf_process_flow_ring_create_response()
1198 brcmf_msgbuf_process_flow_ring_delete_response(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_flow_ring_delete_response() argument
1213 brcmf_flowring_delete(msgbuf->flow, flowid); in brcmf_msgbuf_process_flow_ring_delete_response()
1219 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_process_flow_ring_delete_response()
1223 static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) in brcmf_msgbuf_process_msgtype() argument
1231 brcmf_msgbuf_process_flow_ring_create_response(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1235 brcmf_msgbuf_process_flow_ring_delete_response(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1242 brcmf_msgbuf_process_ioctl_complete(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1246 brcmf_msgbuf_process_event(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1250 brcmf_msgbuf_process_txstatus(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1254 brcmf_msgbuf_process_rx_complete(msgbuf, buf); in brcmf_msgbuf_process_msgtype()
1263 static void brcmf_msgbuf_process_rx(struct brcmf_msgbuf *msgbuf, in brcmf_msgbuf_process_rx() argument
1275 brcmf_msgbuf_process_msgtype(msgbuf, in brcmf_msgbuf_process_rx()
1276 buf + msgbuf->rx_dataoffset); in brcmf_msgbuf_process_rx()
1291 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_proto_msgbuf_rx_trigger() local
1297 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_RX_COMPLETE]; in brcmf_proto_msgbuf_rx_trigger()
1298 brcmf_msgbuf_process_rx(msgbuf, buf); in brcmf_proto_msgbuf_rx_trigger()
1299 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_TX_COMPLETE]; in brcmf_proto_msgbuf_rx_trigger()
1300 brcmf_msgbuf_process_rx(msgbuf, buf); in brcmf_proto_msgbuf_rx_trigger()
1301 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_CONTROL_COMPLETE]; in brcmf_proto_msgbuf_rx_trigger()
1302 brcmf_msgbuf_process_rx(msgbuf, buf); in brcmf_proto_msgbuf_rx_trigger()
1304 for_each_set_bit(flowid, msgbuf->txstatus_done_map, in brcmf_proto_msgbuf_rx_trigger()
1305 msgbuf->nrof_flowrings) { in brcmf_proto_msgbuf_rx_trigger()
1306 clear_bit(flowid, msgbuf->txstatus_done_map); in brcmf_proto_msgbuf_rx_trigger()
1307 commonring = msgbuf->flowrings[flowid]; in brcmf_proto_msgbuf_rx_trigger()
1308 qlen = brcmf_flowring_qlen(msgbuf->flow, flowid); in brcmf_proto_msgbuf_rx_trigger()
1312 brcmf_msgbuf_schedule_txdata(msgbuf, flowid, true); in brcmf_proto_msgbuf_rx_trigger()
1321 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_msgbuf_delete_flowring() local
1328 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; in brcmf_msgbuf_delete_flowring()
1334 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_delete_flowring()
1340 ifidx = brcmf_flowring_ifidx_get(msgbuf->flow, flowid); in brcmf_msgbuf_delete_flowring()
1357 brcmf_msgbuf_remove_flowring(msgbuf, flowid); in brcmf_msgbuf_delete_flowring()
1365 struct brcmf_msgbuf *msgbuf; in brcmf_proto_msgbuf_attach() local
1369 if_msgbuf = drvr->bus_if->msgbuf; in brcmf_proto_msgbuf_attach()
1370 msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1371 if (!msgbuf) in brcmf_proto_msgbuf_attach()
1374 msgbuf->txflow_wq = create_singlethread_workqueue("msgbuf_txflow"); in brcmf_proto_msgbuf_attach()
1375 if (msgbuf->txflow_wq == NULL) { in brcmf_proto_msgbuf_attach()
1379 INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker); in brcmf_proto_msgbuf_attach()
1382 msgbuf->flow_map = kzalloc(count, GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1383 if (!msgbuf->flow_map) in brcmf_proto_msgbuf_attach()
1386 msgbuf->txstatus_done_map = kzalloc(count, GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1387 if (!msgbuf->txstatus_done_map) in brcmf_proto_msgbuf_attach()
1390 msgbuf->drvr = drvr; in brcmf_proto_msgbuf_attach()
1391 msgbuf->ioctbuf = dma_alloc_coherent(drvr->bus_if->dev, in brcmf_proto_msgbuf_attach()
1393 &msgbuf->ioctbuf_handle, in brcmf_proto_msgbuf_attach()
1395 if (!msgbuf->ioctbuf) in brcmf_proto_msgbuf_attach()
1397 address = (u64)msgbuf->ioctbuf_handle; in brcmf_proto_msgbuf_attach()
1398 msgbuf->ioctbuf_phys_hi = address >> 32; in brcmf_proto_msgbuf_attach()
1399 msgbuf->ioctbuf_phys_lo = address & 0xffffffff; in brcmf_proto_msgbuf_attach()
1408 drvr->proto->pd = msgbuf; in brcmf_proto_msgbuf_attach()
1410 init_waitqueue_head(&msgbuf->ioctl_resp_wait); in brcmf_proto_msgbuf_attach()
1412 msgbuf->commonrings = in brcmf_proto_msgbuf_attach()
1414 msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings; in brcmf_proto_msgbuf_attach()
1415 msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings; in brcmf_proto_msgbuf_attach()
1416 msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings * in brcmf_proto_msgbuf_attach()
1417 sizeof(*msgbuf->flowring_dma_handle), GFP_KERNEL); in brcmf_proto_msgbuf_attach()
1418 if (!msgbuf->flowring_dma_handle) in brcmf_proto_msgbuf_attach()
1421 msgbuf->rx_dataoffset = if_msgbuf->rx_dataoffset; in brcmf_proto_msgbuf_attach()
1422 msgbuf->max_rxbufpost = if_msgbuf->max_rxbufpost; in brcmf_proto_msgbuf_attach()
1424 msgbuf->max_ioctlrespbuf = BRCMF_MSGBUF_MAX_IOCTLRESPBUF_POST; in brcmf_proto_msgbuf_attach()
1425 msgbuf->max_eventbuf = BRCMF_MSGBUF_MAX_EVENTBUF_POST; in brcmf_proto_msgbuf_attach()
1427 msgbuf->tx_pktids = brcmf_msgbuf_init_pktids(NR_TX_PKTIDS, in brcmf_proto_msgbuf_attach()
1429 if (!msgbuf->tx_pktids) in brcmf_proto_msgbuf_attach()
1431 msgbuf->rx_pktids = brcmf_msgbuf_init_pktids(NR_RX_PKTIDS, in brcmf_proto_msgbuf_attach()
1433 if (!msgbuf->rx_pktids) in brcmf_proto_msgbuf_attach()
1436 msgbuf->flow = brcmf_flowring_attach(drvr->bus_if->dev, in brcmf_proto_msgbuf_attach()
1438 if (!msgbuf->flow) in brcmf_proto_msgbuf_attach()
1443 msgbuf->max_rxbufpost, msgbuf->max_eventbuf, in brcmf_proto_msgbuf_attach()
1444 msgbuf->max_ioctlrespbuf); in brcmf_proto_msgbuf_attach()
1447 brcmf_msgbuf_rxbuf_data_fill(msgbuf); in brcmf_proto_msgbuf_attach()
1448 if (msgbuf->max_rxbufpost != msgbuf->rxbufpost) in brcmf_proto_msgbuf_attach()
1454 brcmf_msgbuf_rxbuf_event_post(msgbuf); in brcmf_proto_msgbuf_attach()
1455 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf); in brcmf_proto_msgbuf_attach()
1457 INIT_WORK(&msgbuf->flowring_work, brcmf_msgbuf_flowring_worker); in brcmf_proto_msgbuf_attach()
1458 spin_lock_init(&msgbuf->flowring_work_lock); in brcmf_proto_msgbuf_attach()
1459 INIT_LIST_HEAD(&msgbuf->work_queue); in brcmf_proto_msgbuf_attach()
1464 if (msgbuf) { in brcmf_proto_msgbuf_attach()
1465 kfree(msgbuf->flow_map); in brcmf_proto_msgbuf_attach()
1466 kfree(msgbuf->txstatus_done_map); in brcmf_proto_msgbuf_attach()
1467 brcmf_msgbuf_release_pktids(msgbuf); in brcmf_proto_msgbuf_attach()
1468 kfree(msgbuf->flowring_dma_handle); in brcmf_proto_msgbuf_attach()
1469 if (msgbuf->ioctbuf) in brcmf_proto_msgbuf_attach()
1472 msgbuf->ioctbuf, in brcmf_proto_msgbuf_attach()
1473 msgbuf->ioctbuf_handle); in brcmf_proto_msgbuf_attach()
1474 kfree(msgbuf); in brcmf_proto_msgbuf_attach()
1482 struct brcmf_msgbuf *msgbuf; in brcmf_proto_msgbuf_detach() local
1487 msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; in brcmf_proto_msgbuf_detach()
1488 cancel_work_sync(&msgbuf->flowring_work); in brcmf_proto_msgbuf_detach()
1489 while (!list_empty(&msgbuf->work_queue)) { in brcmf_proto_msgbuf_detach()
1490 work = list_first_entry(&msgbuf->work_queue, in brcmf_proto_msgbuf_detach()
1496 kfree(msgbuf->flow_map); in brcmf_proto_msgbuf_detach()
1497 kfree(msgbuf->txstatus_done_map); in brcmf_proto_msgbuf_detach()
1498 if (msgbuf->txflow_wq) in brcmf_proto_msgbuf_detach()
1499 destroy_workqueue(msgbuf->txflow_wq); in brcmf_proto_msgbuf_detach()
1501 brcmf_flowring_detach(msgbuf->flow); in brcmf_proto_msgbuf_detach()
1504 msgbuf->ioctbuf, msgbuf->ioctbuf_handle); in brcmf_proto_msgbuf_detach()
1505 brcmf_msgbuf_release_pktids(msgbuf); in brcmf_proto_msgbuf_detach()
1506 kfree(msgbuf->flowring_dma_handle); in brcmf_proto_msgbuf_detach()
1507 kfree(msgbuf); in brcmf_proto_msgbuf_detach()