Lines Matching refs:hw

37 u32 fjes_hw_rd32(struct fjes_hw *hw, u32 reg)  in fjes_hw_rd32()  argument
39 u8 *base = hw->base; in fjes_hw_rd32()
47 static u8 *fjes_hw_iomap(struct fjes_hw *hw) in fjes_hw_iomap() argument
51 if (!request_mem_region(hw->hw_res.start, hw->hw_res.size, in fjes_hw_iomap()
57 base = (u8 *)ioremap_nocache(hw->hw_res.start, hw->hw_res.size); in fjes_hw_iomap()
62 static void fjes_hw_iounmap(struct fjes_hw *hw) in fjes_hw_iounmap() argument
64 iounmap(hw->base); in fjes_hw_iounmap()
65 release_mem_region(hw->hw_res.start, hw->hw_res.size); in fjes_hw_iounmap()
68 int fjes_hw_reset(struct fjes_hw *hw) in fjes_hw_reset() argument
88 static int fjes_hw_get_max_epid(struct fjes_hw *hw) in fjes_hw_get_max_epid() argument
97 static int fjes_hw_get_my_epid(struct fjes_hw *hw) in fjes_hw_get_my_epid() argument
106 static int fjes_hw_alloc_shared_status_region(struct fjes_hw *hw) in fjes_hw_alloc_shared_status_region() argument
111 (sizeof(u8) * hw->max_epid); in fjes_hw_alloc_shared_status_region()
112 hw->hw_info.share = kzalloc(size, GFP_KERNEL); in fjes_hw_alloc_shared_status_region()
113 if (!hw->hw_info.share) in fjes_hw_alloc_shared_status_region()
116 hw->hw_info.share->epnum = hw->max_epid; in fjes_hw_alloc_shared_status_region()
121 static void fjes_hw_free_shared_status_region(struct fjes_hw *hw) in fjes_hw_free_shared_status_region() argument
123 kfree(hw->hw_info.share); in fjes_hw_free_shared_status_region()
124 hw->hw_info.share = NULL; in fjes_hw_free_shared_status_region()
185 fjes_hw_init_command_registers(struct fjes_hw *hw, in fjes_hw_init_command_registers() argument
212 static int fjes_hw_setup(struct fjes_hw *hw) in fjes_hw_setup() argument
222 hw->hw_info.max_epid = &hw->max_epid; in fjes_hw_setup()
223 hw->hw_info.my_epid = &hw->my_epid; in fjes_hw_setup()
225 buf = kcalloc(hw->max_epid, sizeof(struct ep_share_mem_info), in fjes_hw_setup()
230 hw->ep_shm_info = (struct ep_share_mem_info *)buf; in fjes_hw_setup()
232 mem_size = FJES_DEV_REQ_BUF_SIZE(hw->max_epid); in fjes_hw_setup()
233 hw->hw_info.req_buf = kzalloc(mem_size, GFP_KERNEL); in fjes_hw_setup()
234 if (!(hw->hw_info.req_buf)) in fjes_hw_setup()
237 hw->hw_info.req_buf_size = mem_size; in fjes_hw_setup()
239 mem_size = FJES_DEV_RES_BUF_SIZE(hw->max_epid); in fjes_hw_setup()
240 hw->hw_info.res_buf = kzalloc(mem_size, GFP_KERNEL); in fjes_hw_setup()
241 if (!(hw->hw_info.res_buf)) in fjes_hw_setup()
244 hw->hw_info.res_buf_size = mem_size; in fjes_hw_setup()
246 result = fjes_hw_alloc_shared_status_region(hw); in fjes_hw_setup()
250 hw->hw_info.buffer_share_bit = 0; in fjes_hw_setup()
251 hw->hw_info.buffer_unshare_reserve_bit = 0; in fjes_hw_setup()
253 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_setup()
254 if (epidx != hw->my_epid) { in fjes_hw_setup()
255 buf_pair = &hw->ep_shm_info[epidx]; in fjes_hw_setup()
274 param.req_len = hw->hw_info.req_buf_size; in fjes_hw_setup()
275 param.req_start = __pa(hw->hw_info.req_buf); in fjes_hw_setup()
276 param.res_len = hw->hw_info.res_buf_size; in fjes_hw_setup()
277 param.res_start = __pa(hw->hw_info.res_buf); in fjes_hw_setup()
279 param.share_start = __pa(hw->hw_info.share->ep_status); in fjes_hw_setup()
281 fjes_hw_init_command_registers(hw, &param); in fjes_hw_setup()
286 static void fjes_hw_cleanup(struct fjes_hw *hw) in fjes_hw_cleanup() argument
290 if (!hw->ep_shm_info) in fjes_hw_cleanup()
293 fjes_hw_free_shared_status_region(hw); in fjes_hw_cleanup()
295 kfree(hw->hw_info.req_buf); in fjes_hw_cleanup()
296 hw->hw_info.req_buf = NULL; in fjes_hw_cleanup()
298 kfree(hw->hw_info.res_buf); in fjes_hw_cleanup()
299 hw->hw_info.res_buf = NULL; in fjes_hw_cleanup()
301 for (epidx = 0; epidx < hw->max_epid ; epidx++) { in fjes_hw_cleanup()
302 if (epidx == hw->my_epid) in fjes_hw_cleanup()
304 fjes_hw_free_epbuf(&hw->ep_shm_info[epidx].tx); in fjes_hw_cleanup()
305 fjes_hw_free_epbuf(&hw->ep_shm_info[epidx].rx); in fjes_hw_cleanup()
308 kfree(hw->ep_shm_info); in fjes_hw_cleanup()
309 hw->ep_shm_info = NULL; in fjes_hw_cleanup()
312 int fjes_hw_init(struct fjes_hw *hw) in fjes_hw_init() argument
316 hw->base = fjes_hw_iomap(hw); in fjes_hw_init()
317 if (!hw->base) in fjes_hw_init()
320 ret = fjes_hw_reset(hw); in fjes_hw_init()
324 fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, true); in fjes_hw_init()
326 INIT_WORK(&hw->update_zone_task, fjes_hw_update_zone_task); in fjes_hw_init()
327 INIT_WORK(&hw->epstop_task, fjes_hw_epstop_task); in fjes_hw_init()
329 mutex_init(&hw->hw_info.lock); in fjes_hw_init()
331 hw->max_epid = fjes_hw_get_max_epid(hw); in fjes_hw_init()
332 hw->my_epid = fjes_hw_get_my_epid(hw); in fjes_hw_init()
334 if ((hw->max_epid == 0) || (hw->my_epid >= hw->max_epid)) in fjes_hw_init()
337 ret = fjes_hw_setup(hw); in fjes_hw_init()
342 void fjes_hw_exit(struct fjes_hw *hw) in fjes_hw_exit() argument
346 if (hw->base) { in fjes_hw_exit()
347 ret = fjes_hw_reset(hw); in fjes_hw_exit()
351 fjes_hw_iounmap(hw); in fjes_hw_exit()
352 hw->base = NULL; in fjes_hw_exit()
355 fjes_hw_cleanup(hw); in fjes_hw_exit()
357 cancel_work_sync(&hw->update_zone_task); in fjes_hw_exit()
358 cancel_work_sync(&hw->epstop_task); in fjes_hw_exit()
362 fjes_hw_issue_request_command(struct fjes_hw *hw, in fjes_hw_issue_request_command() argument
408 int fjes_hw_request_info(struct fjes_hw *hw) in fjes_hw_request_info() argument
410 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_request_info()
411 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_request_info()
415 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_request_info()
416 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_request_info()
423 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_INFO); in fjes_hw_request_info()
427 if (FJES_DEV_COMMAND_INFO_RES_LEN((*hw->hw_info.max_epid)) != in fjes_hw_request_info()
462 int fjes_hw_register_buff_addr(struct fjes_hw *hw, int dest_epid, in fjes_hw_register_buff_addr() argument
465 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_register_buff_addr()
466 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_register_buff_addr()
474 if (test_bit(dest_epid, &hw->hw_info.buffer_share_bit)) in fjes_hw_register_buff_addr()
477 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_register_buff_addr()
478 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_register_buff_addr()
509 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_SHARE_BUFFER); in fjes_hw_register_buff_addr()
517 msleep(200 + hw->my_epid * 20); in fjes_hw_register_buff_addr()
518 timeout -= (200 + hw->my_epid * 20); in fjes_hw_register_buff_addr()
524 hw, FJES_CMD_REQ_SHARE_BUFFER); in fjes_hw_register_buff_addr()
536 set_bit(dest_epid, &hw->hw_info.buffer_share_bit); in fjes_hw_register_buff_addr()
564 int fjes_hw_unregister_buff_addr(struct fjes_hw *hw, int dest_epid) in fjes_hw_unregister_buff_addr() argument
566 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_unregister_buff_addr()
567 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_unregister_buff_addr()
568 struct fjes_device_shared_info *share = hw->hw_info.share; in fjes_hw_unregister_buff_addr()
573 if (!hw->base) in fjes_hw_unregister_buff_addr()
579 if (!test_bit(dest_epid, &hw->hw_info.buffer_share_bit)) in fjes_hw_unregister_buff_addr()
582 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_unregister_buff_addr()
583 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_unregister_buff_addr()
592 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_UNSHARE_BUFFER); in fjes_hw_unregister_buff_addr()
601 msleep(200 + hw->my_epid * 20); in fjes_hw_unregister_buff_addr()
602 timeout -= (200 + hw->my_epid * 20); in fjes_hw_unregister_buff_addr()
608 fjes_hw_issue_request_command(hw, FJES_CMD_REQ_UNSHARE_BUFFER); in fjes_hw_unregister_buff_addr()
620 clear_bit(dest_epid, &hw->hw_info.buffer_share_bit); in fjes_hw_unregister_buff_addr()
648 int fjes_hw_raise_interrupt(struct fjes_hw *hw, int dest_epid, in fjes_hw_raise_interrupt() argument
658 u32 fjes_hw_capture_interrupt_status(struct fjes_hw *hw) in fjes_hw_capture_interrupt_status() argument
667 void fjes_hw_set_irqmask(struct fjes_hw *hw, in fjes_hw_set_irqmask() argument
676 bool fjes_hw_epid_is_same_zone(struct fjes_hw *hw, int epid) in fjes_hw_epid_is_same_zone() argument
678 if (epid >= hw->max_epid) in fjes_hw_epid_is_same_zone()
681 if ((hw->ep_shm_info[epid].es_status != in fjes_hw_epid_is_same_zone()
683 (hw->ep_shm_info[hw->my_epid].zone == in fjes_hw_epid_is_same_zone()
687 return (hw->ep_shm_info[epid].zone == in fjes_hw_epid_is_same_zone()
688 hw->ep_shm_info[hw->my_epid].zone); in fjes_hw_epid_is_same_zone()
702 static bool fjes_hw_epid_is_stop_requested(struct fjes_hw *hw, int src_epid) in fjes_hw_epid_is_stop_requested() argument
704 return test_bit(src_epid, &hw->txrx_stop_req_bit); in fjes_hw_epid_is_stop_requested()
707 static bool fjes_hw_epid_is_stop_process_done(struct fjes_hw *hw, int src_epid) in fjes_hw_epid_is_stop_process_done() argument
709 return (hw->ep_shm_info[src_epid].tx.info->v1i.rx_status & in fjes_hw_epid_is_stop_process_done()
714 fjes_hw_get_partner_ep_status(struct fjes_hw *hw, int epid) in fjes_hw_get_partner_ep_status() argument
718 if (fjes_hw_epid_is_shared(hw->hw_info.share, epid)) { in fjes_hw_get_partner_ep_status()
719 if (fjes_hw_epid_is_stop_requested(hw, epid)) { in fjes_hw_get_partner_ep_status()
722 if (fjes_hw_epid_is_stop_process_done(hw, epid)) in fjes_hw_get_partner_ep_status()
734 void fjes_hw_raise_epstop(struct fjes_hw *hw) in fjes_hw_raise_epstop() argument
739 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_raise_epstop()
740 if (epidx == hw->my_epid) in fjes_hw_raise_epstop()
743 status = fjes_hw_get_partner_ep_status(hw, epidx); in fjes_hw_raise_epstop()
746 fjes_hw_raise_interrupt(hw, epidx, in fjes_hw_raise_epstop()
753 set_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_raise_epstop()
754 set_bit(epidx, &hw->txrx_stop_req_bit); in fjes_hw_raise_epstop()
756 hw->ep_shm_info[epidx].tx.info->v1i.rx_status |= in fjes_hw_raise_epstop()
761 int fjes_hw_wait_epstop(struct fjes_hw *hw) in fjes_hw_wait_epstop() argument
768 while (hw->hw_info.buffer_unshare_reserve_bit && in fjes_hw_wait_epstop()
770 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_wait_epstop()
771 if (epidx == hw->my_epid) in fjes_hw_wait_epstop()
773 status = fjes_hw_epid_is_shared(hw->hw_info.share, in fjes_hw_wait_epstop()
775 info = hw->ep_shm_info[epidx].rx.info; in fjes_hw_wait_epstop()
780 &hw->hw_info.buffer_unshare_reserve_bit)) { in fjes_hw_wait_epstop()
782 &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_wait_epstop()
790 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_wait_epstop()
791 if (epidx == hw->my_epid) in fjes_hw_wait_epstop()
793 if (test_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit)) in fjes_hw_wait_epstop()
795 &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_wait_epstop()
926 struct fjes_hw *hw = container_of(work, in fjes_hw_update_zone_task() local
943 adapter = (struct fjes_adapter *)hw->back; in fjes_hw_update_zone_task()
945 res_buf = hw->hw_info.res_buf; in fjes_hw_update_zone_task()
948 mutex_lock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
950 ret = fjes_hw_request_info(hw); in fjes_hw_update_zone_task()
963 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_update_zone_task()
964 if (epidx == hw->my_epid) { in fjes_hw_update_zone_task()
965 hw->ep_shm_info[epidx].es_status = in fjes_hw_update_zone_task()
967 hw->ep_shm_info[epidx].zone = in fjes_hw_update_zone_task()
972 pstatus = fjes_hw_get_partner_ep_status(hw, epidx); in fjes_hw_update_zone_task()
981 info[hw->my_epid].zone)) in fjes_hw_update_zone_task()
994 info[hw->my_epid].zone)) { in fjes_hw_update_zone_task()
998 &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_update_zone_task()
1008 info[hw->my_epid].zone)) in fjes_hw_update_zone_task()
1013 hw->ep_shm_info[epidx].es_status = in fjes_hw_update_zone_task()
1015 hw->ep_shm_info[epidx].zone = info[epidx].zone; in fjes_hw_update_zone_task()
1020 mutex_unlock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1022 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_update_zone_task()
1023 if (epidx == hw->my_epid) in fjes_hw_update_zone_task()
1027 fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx, in fjes_hw_update_zone_task()
1030 mutex_lock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1033 hw, epidx, &hw->ep_shm_info[epidx]); in fjes_hw_update_zone_task()
1048 mutex_unlock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1052 mutex_lock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1054 ret = fjes_hw_unregister_buff_addr(hw, epidx); in fjes_hw_update_zone_task()
1070 mutex_unlock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1074 &hw->ep_shm_info[epidx].tx, in fjes_hw_update_zone_task()
1079 fjes_hw_raise_interrupt(hw, epidx, in fjes_hw_update_zone_task()
1082 set_bit(epidx, &hw->txrx_stop_req_bit); in fjes_hw_update_zone_task()
1083 hw->ep_shm_info[epidx].tx. in fjes_hw_update_zone_task()
1086 set_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_update_zone_task()
1099 struct fjes_hw *hw = container_of(work, struct fjes_hw, epstop_task); in fjes_hw_epstop_task() local
1100 struct fjes_adapter *adapter = (struct fjes_adapter *)hw->back; in fjes_hw_epstop_task()
1105 while ((remain_bit = hw->epstop_req_bit)) { in fjes_hw_epstop_task()
1108 hw->ep_shm_info[epid_bit]. in fjes_hw_epstop_task()
1112 clear_bit(epid_bit, &hw->epstop_req_bit); in fjes_hw_epstop_task()