int fjes_hw_init(struct fjes_hw *hw) { int ret; hw->base = fjes_hw_iomap(hw); if (!hw->base) return -EIO; ret = fjes_hw_reset(hw); if (ret) return ret; fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, true); INIT_WORK(&hw->update_zone_task, fjes_hw_update_zone_task); INIT_WORK(&hw->epstop_task, fjes_hw_epstop_task); mutex_init(&hw->hw_info.lock); hw->max_epid = fjes_hw_get_max_epid(hw); hw->my_epid = fjes_hw_get_my_epid(hw); if ((hw->max_epid == 0) || (hw->my_epid >= hw->max_epid)) return -ENXIO; ret = fjes_hw_setup(hw); return ret; }
void fjes_hw_exit(struct fjes_hw *hw) { int ret; if (hw->base) { if (hw->debug_mode) { /* disable debug mode */ mutex_lock(&hw->hw_info.lock); fjes_hw_stop_debug(hw); mutex_unlock(&hw->hw_info.lock); } vfree(hw->hw_info.trace); hw->hw_info.trace = NULL; hw->hw_info.trace_size = 0; hw->debug_mode = 0; ret = fjes_hw_reset(hw); if (ret) pr_err("%s: reset error", __func__); fjes_hw_iounmap(hw); hw->base = NULL; } fjes_hw_cleanup(hw); cancel_work_sync(&hw->update_zone_task); cancel_work_sync(&hw->epstop_task); }
int fjes_hw_init(struct fjes_hw *hw) { int ret; hw->base = fjes_hw_iomap(hw); if (!hw->base) return -EIO; ret = fjes_hw_reset(hw); if (ret) return ret; fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, true); INIT_WORK(&hw->update_zone_task, fjes_hw_update_zone_task); INIT_WORK(&hw->epstop_task, fjes_hw_epstop_task); mutex_init(&hw->hw_info.lock); spin_lock_init(&hw->rx_status_lock); hw->max_epid = fjes_hw_get_max_epid(hw); hw->my_epid = fjes_hw_get_my_epid(hw); if ((hw->max_epid == 0) || (hw->my_epid >= hw->max_epid)) return -ENXIO; ret = fjes_hw_setup(hw); hw->hw_info.trace = vzalloc(FJES_DEBUG_BUFFER_SIZE); hw->hw_info.trace_size = FJES_DEBUG_BUFFER_SIZE; return ret; }
static void fjes_free_resources(struct fjes_adapter *adapter) { struct net_device *netdev = adapter->netdev; struct fjes_device_command_param param; struct ep_share_mem_info *buf_pair; struct fjes_hw *hw = &adapter->hw; bool reset_flag = false; unsigned long flags; int result; int epidx; for (epidx = 0; epidx < hw->max_epid; epidx++) { if (epidx == hw->my_epid) continue; mutex_lock(&hw->hw_info.lock); result = fjes_hw_unregister_buff_addr(hw, epidx); mutex_unlock(&hw->hw_info.lock); hw->ep_shm_info[epidx].ep_stats.com_unregist_buf_exec += 1; if (result) reset_flag = true; buf_pair = &hw->ep_shm_info[epidx]; spin_lock_irqsave(&hw->rx_status_lock, flags); fjes_hw_setup_epbuf(&buf_pair->tx, netdev->dev_addr, netdev->mtu); spin_unlock_irqrestore(&hw->rx_status_lock, flags); clear_bit(epidx, &hw->txrx_stop_req_bit); } if (reset_flag || adapter->force_reset) { result = fjes_hw_reset(hw); adapter->force_reset = false; if (result) adapter->open_guard = true; hw->hw_info.buffer_share_bit = 0; memset((void *)¶m, 0, sizeof(param)); param.req_len = hw->hw_info.req_buf_size; param.req_start = __pa(hw->hw_info.req_buf); param.res_len = hw->hw_info.res_buf_size; param.res_start = __pa(hw->hw_info.res_buf); param.share_start = __pa(hw->hw_info.share->ep_status); fjes_hw_init_command_registers(hw, ¶m); } }
void fjes_hw_exit(struct fjes_hw *hw) { int ret; if (hw->base) { ret = fjes_hw_reset(hw); if (ret) pr_err("%s: reset error", __func__); fjes_hw_iounmap(hw); hw->base = NULL; } fjes_hw_cleanup(hw); cancel_work_sync(&hw->update_zone_task); cancel_work_sync(&hw->epstop_task); }