Merge "msm: ipa: add ipc logging for ipa driver"
This commit is contained in:
commit
1965689393
16 changed files with 358 additions and 169 deletions
|
@ -450,7 +450,7 @@ static int ipa_open(struct inode *inode, struct file *filp)
|
|||
{
|
||||
struct ipa_context *ctx = NULL;
|
||||
|
||||
IPADBG("ENTER\n");
|
||||
IPADBG_LOW("ENTER\n");
|
||||
ctx = container_of(inode->i_cdev, struct ipa_context, cdev);
|
||||
filp->private_data = ctx;
|
||||
|
||||
|
@ -2936,11 +2936,11 @@ static int ipa_get_clks(struct device *dev)
|
|||
|
||||
void _ipa_enable_clks_v2_0(void)
|
||||
{
|
||||
IPADBG("enabling gcc_ipa_clk\n");
|
||||
IPADBG_LOW("enabling gcc_ipa_clk\n");
|
||||
if (ipa_clk) {
|
||||
clk_prepare(ipa_clk);
|
||||
clk_enable(ipa_clk);
|
||||
IPADBG("curr_ipa_clk_rate=%d", ipa_ctx->curr_ipa_clk_rate);
|
||||
IPADBG_LOW("curr_ipa_clk_rate=%d", ipa_ctx->curr_ipa_clk_rate);
|
||||
clk_set_rate(ipa_clk, ipa_ctx->curr_ipa_clk_rate);
|
||||
ipa_uc_notify_clk_state(true);
|
||||
} else {
|
||||
|
@ -3072,7 +3072,7 @@ void _ipa_disable_clks_v1_1(void)
|
|||
|
||||
void _ipa_disable_clks_v2_0(void)
|
||||
{
|
||||
IPADBG("disabling gcc_ipa_clk\n");
|
||||
IPADBG_LOW("disabling gcc_ipa_clk\n");
|
||||
ipa_suspend_apps_pipes(true);
|
||||
ipa_sps_irq_control_all(false);
|
||||
ipa_uc_notify_clk_state(false);
|
||||
|
@ -3093,7 +3093,7 @@ void _ipa_disable_clks_v2_0(void)
|
|||
*/
|
||||
void ipa_disable_clks(void)
|
||||
{
|
||||
IPADBG("disabling IPA clocks and bus voting\n");
|
||||
IPADBG_LOW("disabling IPA clocks and bus voting\n");
|
||||
|
||||
ipa_ctx->ctrl->ipa_disable_clks();
|
||||
|
||||
|
@ -3237,7 +3237,7 @@ void ipa2_inc_client_enable_clks(struct ipa_active_client_logging_info *id)
|
|||
ipa_ctx->ipa_active_clients.cnt++;
|
||||
if (ipa_ctx->ipa_active_clients.cnt == 1)
|
||||
ipa_enable_clks();
|
||||
IPADBG("active clients = %d\n", ipa_ctx->ipa_active_clients.cnt);
|
||||
IPADBG_LOW("active clients = %d\n", ipa_ctx->ipa_active_clients.cnt);
|
||||
ipa_active_clients_unlock();
|
||||
}
|
||||
|
||||
|
@ -3269,7 +3269,7 @@ int ipa2_inc_client_enable_clks_no_block(struct ipa_active_client_logging_info
|
|||
ipa2_active_clients_log_inc(id, true);
|
||||
|
||||
ipa_ctx->ipa_active_clients.cnt++;
|
||||
IPADBG("active clients = %d\n", ipa_ctx->ipa_active_clients.cnt);
|
||||
IPADBG_LOW("active clients = %d\n", ipa_ctx->ipa_active_clients.cnt);
|
||||
bail:
|
||||
ipa_active_clients_trylock_unlock(&flags);
|
||||
|
||||
|
@ -3297,7 +3297,7 @@ void ipa2_dec_client_disable_clks(struct ipa_active_client_logging_info *id)
|
|||
ipa_active_clients_lock();
|
||||
ipa2_active_clients_log_dec(id, false);
|
||||
ipa_ctx->ipa_active_clients.cnt--;
|
||||
IPADBG("active clients = %d\n", ipa_ctx->ipa_active_clients.cnt);
|
||||
IPADBG_LOW("active clients = %d\n", ipa_ctx->ipa_active_clients.cnt);
|
||||
if (ipa_ctx->ipa_active_clients.cnt == 0) {
|
||||
if (ipa_ctx->tag_process_before_gating) {
|
||||
IPA_ACTIVE_CLIENTS_PREP_SPECIAL(log_info,
|
||||
|
@ -3337,7 +3337,7 @@ void ipa_inc_acquire_wakelock(enum ipa_wakelock_ref_client ref_client)
|
|||
ipa_ctx->wakelock_ref_cnt.cnt |= (1 << ref_client);
|
||||
if (ipa_ctx->wakelock_ref_cnt.cnt)
|
||||
__pm_stay_awake(&ipa_ctx->w_lock);
|
||||
IPADBG("active wakelock ref cnt = %d client enum %d\n",
|
||||
IPADBG_LOW("active wakelock ref cnt = %d client enum %d\n",
|
||||
ipa_ctx->wakelock_ref_cnt.cnt, ref_client);
|
||||
spin_unlock_irqrestore(&ipa_ctx->wakelock_ref_cnt.spinlock, flags);
|
||||
}
|
||||
|
@ -3358,7 +3358,7 @@ void ipa_dec_release_wakelock(enum ipa_wakelock_ref_client ref_client)
|
|||
return;
|
||||
spin_lock_irqsave(&ipa_ctx->wakelock_ref_cnt.spinlock, flags);
|
||||
ipa_ctx->wakelock_ref_cnt.cnt &= ~(1 << ref_client);
|
||||
IPADBG("active wakelock ref cnt = %d client enum %d\n",
|
||||
IPADBG_LOW("active wakelock ref cnt = %d client enum %d\n",
|
||||
ipa_ctx->wakelock_ref_cnt.cnt, ref_client);
|
||||
if (ipa_ctx->wakelock_ref_cnt.cnt == 0)
|
||||
__pm_relax(&ipa_ctx->w_lock);
|
||||
|
@ -3402,7 +3402,7 @@ int ipa2_set_required_perf_profile(enum ipa_voltage_level floor_voltage,
|
|||
enum ipa_voltage_level needed_voltage;
|
||||
u32 clk_rate;
|
||||
|
||||
IPADBG("floor_voltage=%d, bandwidth_mbps=%u",
|
||||
IPADBG_LOW("floor_voltage=%d, bandwidth_mbps=%u",
|
||||
floor_voltage, bandwidth_mbps);
|
||||
|
||||
if (floor_voltage < IPA_VOLTAGE_UNSPECIFIED ||
|
||||
|
@ -3412,7 +3412,7 @@ int ipa2_set_required_perf_profile(enum ipa_voltage_level floor_voltage,
|
|||
}
|
||||
|
||||
if (ipa_ctx->enable_clock_scaling) {
|
||||
IPADBG("Clock scaling is enabled\n");
|
||||
IPADBG_LOW("Clock scaling is enabled\n");
|
||||
if (bandwidth_mbps >=
|
||||
ipa_ctx->ctrl->clock_scaling_bw_threshold_turbo)
|
||||
needed_voltage = IPA_VOLTAGE_TURBO;
|
||||
|
@ -3422,7 +3422,7 @@ int ipa2_set_required_perf_profile(enum ipa_voltage_level floor_voltage,
|
|||
else
|
||||
needed_voltage = IPA_VOLTAGE_SVS;
|
||||
} else {
|
||||
IPADBG("Clock scaling is disabled\n");
|
||||
IPADBG_LOW("Clock scaling is disabled\n");
|
||||
needed_voltage = IPA_VOLTAGE_NOMINAL;
|
||||
}
|
||||
|
||||
|
@ -3444,13 +3444,13 @@ int ipa2_set_required_perf_profile(enum ipa_voltage_level floor_voltage,
|
|||
}
|
||||
|
||||
if (clk_rate == ipa_ctx->curr_ipa_clk_rate) {
|
||||
IPADBG("Same voltage\n");
|
||||
IPADBG_LOW("Same voltage\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ipa_active_clients_lock();
|
||||
ipa_ctx->curr_ipa_clk_rate = clk_rate;
|
||||
IPADBG("setting clock rate to %u\n", ipa_ctx->curr_ipa_clk_rate);
|
||||
IPADBG_LOW("setting clock rate to %u\n", ipa_ctx->curr_ipa_clk_rate);
|
||||
if (ipa_ctx->ipa_active_clients.cnt > 0) {
|
||||
clk_set_rate(ipa_clk, ipa_ctx->curr_ipa_clk_rate);
|
||||
if (ipa_ctx->ipa_hw_mode != IPA_HW_MODE_VIRTUAL)
|
||||
|
@ -3458,10 +3458,10 @@ int ipa2_set_required_perf_profile(enum ipa_voltage_level floor_voltage,
|
|||
ipa_ctx->ipa_bus_hdl, ipa_get_bus_vote()))
|
||||
WARN_ON(1);
|
||||
} else {
|
||||
IPADBG("clocks are gated, not setting rate\n");
|
||||
IPADBG_LOW("clocks are gated, not setting rate\n");
|
||||
}
|
||||
ipa_active_clients_unlock();
|
||||
IPADBG("Done\n");
|
||||
IPADBG_LOW("Done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3755,6 +3755,13 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
|
|||
goto fail_mem_ctx;
|
||||
}
|
||||
|
||||
ipa_ctx->logbuf = ipc_log_context_create(IPA_IPC_LOG_PAGES, "ipa", 0);
|
||||
if (ipa_ctx->logbuf == NULL) {
|
||||
IPAERR("failed to get logbuf\n");
|
||||
result = -ENOMEM;
|
||||
goto fail_logbuf;
|
||||
}
|
||||
|
||||
ipa_ctx->pdev = ipa_dev;
|
||||
ipa_ctx->uc_pdev = ipa_dev;
|
||||
ipa_ctx->smmu_present = smmu_info.present;
|
||||
|
@ -4289,6 +4296,8 @@ fail_bus_reg:
|
|||
fail_bind:
|
||||
kfree(ipa_ctx->ctrl);
|
||||
fail_mem_ctrl:
|
||||
ipc_log_context_destroy(ipa_ctx->logbuf);
|
||||
fail_logbuf:
|
||||
kfree(ipa_ctx);
|
||||
ipa_ctx = NULL;
|
||||
fail_mem_ctx:
|
||||
|
|
|
@ -1804,6 +1804,44 @@ static ssize_t ipa_write_polling_iteration(struct file *file,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t ipa_enable_ipc_low(struct file *file,
|
||||
const char __user *ubuf, size_t count, loff_t *ppos)
|
||||
{
|
||||
unsigned long missing;
|
||||
s8 option = 0;
|
||||
|
||||
if (sizeof(dbg_buff) < count + 1)
|
||||
return -EFAULT;
|
||||
|
||||
missing = copy_from_user(dbg_buff, ubuf, count);
|
||||
if (missing)
|
||||
return -EFAULT;
|
||||
|
||||
dbg_buff[count] = '\0';
|
||||
if (kstrtos8(dbg_buff, 0, &option))
|
||||
return -EFAULT;
|
||||
|
||||
if (option) {
|
||||
if (!ipa_ctx->logbuf_low) {
|
||||
ipa_ctx->logbuf_low =
|
||||
ipc_log_context_create(IPA_IPC_LOG_PAGES,
|
||||
"ipa_low", 0);
|
||||
}
|
||||
|
||||
if (ipa_ctx->logbuf_low == NULL) {
|
||||
IPAERR("failed to get logbuf_low\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (ipa_ctx->logbuf_low)
|
||||
ipc_log_context_destroy(ipa_ctx->logbuf_low);
|
||||
ipa_ctx->logbuf_low = NULL;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
const struct file_operations ipa_gen_reg_ops = {
|
||||
.read = ipa_read_gen_reg,
|
||||
};
|
||||
|
@ -1882,6 +1920,10 @@ const struct file_operations ipa2_active_clients = {
|
|||
.write = ipa2_clear_active_clients_log,
|
||||
};
|
||||
|
||||
const struct file_operations ipa_ipc_low_ops = {
|
||||
.write = ipa_enable_ipc_low,
|
||||
};
|
||||
|
||||
const struct file_operations ipa_rx_poll_time_ops = {
|
||||
.read = ipa_read_rx_polling_timeout,
|
||||
.write = ipa_write_rx_polling_timeout,
|
||||
|
@ -2097,6 +2139,13 @@ void ipa_debugfs_init(void)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
file = debugfs_create_file("enable_low_prio_print", write_only_mode,
|
||||
dent, 0, &ipa_ipc_low_ops);
|
||||
if (!file) {
|
||||
IPAERR("could not create enable_low_prio_print file\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
|
|
|
@ -32,16 +32,39 @@
|
|||
#define IPADMA_DRV_NAME "ipa_dma"
|
||||
|
||||
#define IPADMA_DBG(fmt, args...) \
|
||||
pr_debug(IPADMA_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_debug(IPADMA_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
IPADMA_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
IPADMA_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPADMA_DBG_LOW(fmt, args...) \
|
||||
do { \
|
||||
pr_debug(IPADMA_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
IPADMA_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPADMA_ERR(fmt, args...) \
|
||||
pr_err(IPADMA_DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_err(IPADMA_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
IPADMA_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
IPADMA_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPADMA_FUNC_ENTRY() \
|
||||
IPADMA_DBG("ENTRY\n")
|
||||
IPADMA_DBG_LOW("ENTRY\n")
|
||||
|
||||
#define IPADMA_FUNC_EXIT() \
|
||||
IPADMA_DBG("EXIT\n")
|
||||
IPADMA_DBG_LOW("EXIT\n")
|
||||
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
#define IPADMA_MAX_MSG_LEN 1024
|
||||
|
@ -270,7 +293,7 @@ int ipa2_dma_enable(void)
|
|||
}
|
||||
mutex_lock(&ipa_dma_ctx->enable_lock);
|
||||
if (ipa_dma_ctx->is_enabled) {
|
||||
IPADMA_DBG("Already enabled.\n");
|
||||
IPADMA_ERR("Already enabled.\n");
|
||||
mutex_unlock(&ipa_dma_ctx->enable_lock);
|
||||
return -EPERM;
|
||||
}
|
||||
|
@ -296,7 +319,7 @@ static bool ipa_dma_work_pending(void)
|
|||
IPADMA_DBG("pending uc\n");
|
||||
return true;
|
||||
}
|
||||
IPADMA_DBG("no pending work\n");
|
||||
IPADMA_DBG_LOW("no pending work\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -324,7 +347,7 @@ int ipa2_dma_disable(void)
|
|||
mutex_lock(&ipa_dma_ctx->enable_lock);
|
||||
spin_lock_irqsave(&ipa_dma_ctx->pending_lock, flags);
|
||||
if (!ipa_dma_ctx->is_enabled) {
|
||||
IPADMA_DBG("Already disabled.\n");
|
||||
IPADMA_ERR("Already disabled.\n");
|
||||
spin_unlock_irqrestore(&ipa_dma_ctx->pending_lock, flags);
|
||||
mutex_unlock(&ipa_dma_ctx->enable_lock);
|
||||
return -EPERM;
|
||||
|
@ -371,6 +394,8 @@ int ipa2_dma_sync_memcpy(u64 dest, u64 src, int len)
|
|||
|
||||
IPADMA_FUNC_ENTRY();
|
||||
|
||||
IPADMA_DBG_LOW("dest = 0x%llx, src = 0x%llx, len = %d\n",
|
||||
dest, src, len);
|
||||
if (ipa_dma_ctx == NULL) {
|
||||
IPADMA_ERR("IPADMA isn't initialized, can't memcpy\n");
|
||||
return -EPERM;
|
||||
|
@ -398,7 +423,7 @@ int ipa2_dma_sync_memcpy(u64 dest, u64 src, int len)
|
|||
if (atomic_read(&ipa_dma_ctx->sync_memcpy_pending_cnt) >=
|
||||
IPA_DMA_MAX_PENDING_SYNC) {
|
||||
atomic_dec(&ipa_dma_ctx->sync_memcpy_pending_cnt);
|
||||
IPADMA_DBG("Reached pending requests limit\n");
|
||||
IPADMA_ERR("Reached pending requests limit\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
@ -531,6 +556,8 @@ int ipa2_dma_async_memcpy(u64 dest, u64 src, int len,
|
|||
unsigned long flags;
|
||||
|
||||
IPADMA_FUNC_ENTRY();
|
||||
IPADMA_DBG_LOW("dest = 0x%llx, src = 0x%llx, len = %d\n",
|
||||
dest, src, len);
|
||||
if (ipa_dma_ctx == NULL) {
|
||||
IPADMA_ERR("IPADMA isn't initialized, can't memcpy\n");
|
||||
return -EPERM;
|
||||
|
@ -562,7 +589,7 @@ int ipa2_dma_async_memcpy(u64 dest, u64 src, int len,
|
|||
if (atomic_read(&ipa_dma_ctx->async_memcpy_pending_cnt) >=
|
||||
IPA_DMA_MAX_PENDING_ASYNC) {
|
||||
atomic_dec(&ipa_dma_ctx->async_memcpy_pending_cnt);
|
||||
IPADMA_DBG("Reached pending requests limit\n");
|
||||
IPADMA_ERR("Reached pending requests limit\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
@ -692,7 +719,7 @@ void ipa2_dma_destroy(void)
|
|||
|
||||
IPADMA_FUNC_ENTRY();
|
||||
if (!ipa_dma_ctx) {
|
||||
IPADMA_DBG("IPADMA isn't initialized\n");
|
||||
IPADMA_ERR("IPADMA isn't initialized\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -836,7 +863,7 @@ static ssize_t ipa_dma_debugfs_reset_statistics(struct file *file,
|
|||
switch (in_num) {
|
||||
case 0:
|
||||
if (ipa_dma_work_pending())
|
||||
IPADMA_DBG("Note, there are pending memcpy\n");
|
||||
IPADMA_ERR("Note, there are pending memcpy\n");
|
||||
|
||||
atomic_set(&ipa_dma_ctx->total_async_memcpy, 0);
|
||||
atomic_set(&ipa_dma_ctx->total_sync_memcpy, 0);
|
||||
|
|
|
@ -346,7 +346,7 @@ int ipa_send_one(struct ipa_sys_context *sys, struct ipa_desc *desc,
|
|||
if (desc->type == IPA_IMM_CMD_DESC) {
|
||||
sps_flags |= SPS_IOVEC_FLAG_IMME;
|
||||
len = desc->opcode;
|
||||
IPADBG("sending cmd=%d pyld_len=%d sps_flags=%x\n",
|
||||
IPADBG_LOW("sending cmd=%d pyld_len=%d sps_flags=%x\n",
|
||||
desc->opcode, desc->len, sps_flags);
|
||||
IPA_DUMP_BUFF(desc->pyld, dma_address, desc->len);
|
||||
} else {
|
||||
|
@ -624,7 +624,7 @@ static void ipa_sps_irq_cmd_ack(void *user1, int user2)
|
|||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
IPADBG("got ack for cmd=%d\n", desc->opcode);
|
||||
IPADBG_LOW("got ack for cmd=%d\n", desc->opcode);
|
||||
complete(&desc->xfer_done);
|
||||
}
|
||||
|
||||
|
@ -641,11 +641,12 @@ static void ipa_sps_irq_cmd_ack(void *user1, int user2)
|
|||
int ipa_send_cmd(u16 num_desc, struct ipa_desc *descr)
|
||||
{
|
||||
struct ipa_desc *desc;
|
||||
int result = 0;
|
||||
int i, result = 0;
|
||||
struct ipa_sys_context *sys;
|
||||
int ep_idx;
|
||||
|
||||
IPADBG("sending command\n");
|
||||
for (i = 0; i < num_desc; i++)
|
||||
IPADBG_LOW("sending imm cmd %d\n", descr[i].opcode);
|
||||
|
||||
ep_idx = ipa2_get_ep_mapping(IPA_CLIENT_APPS_CMD_PROD);
|
||||
if (-1 == ep_idx) {
|
||||
|
@ -706,7 +707,7 @@ static void ipa_sps_irq_tx_notify(struct sps_event_notify *notify)
|
|||
struct ipa_sys_context *sys = (struct ipa_sys_context *)notify->user;
|
||||
int ret;
|
||||
|
||||
IPADBG("event %d notified\n", notify->event_id);
|
||||
IPADBG_LOW("event %d notified\n", notify->event_id);
|
||||
|
||||
switch (notify->event_id) {
|
||||
case SPS_EVENT_EOT:
|
||||
|
@ -749,7 +750,7 @@ static void ipa_sps_irq_tx_no_aggr_notify(struct sps_event_notify *notify)
|
|||
{
|
||||
struct ipa_tx_pkt_wrapper *tx_pkt;
|
||||
|
||||
IPADBG("event %d notified\n", notify->event_id);
|
||||
IPADBG_LOW("event %d notified\n", notify->event_id);
|
||||
|
||||
switch (notify->event_id) {
|
||||
case SPS_EVENT_EOT:
|
||||
|
@ -1596,7 +1597,7 @@ static void ipa_tx_comp_usr_notify_release(void *user1, int user2)
|
|||
struct sk_buff *skb = (struct sk_buff *)user1;
|
||||
int ep_idx = user2;
|
||||
|
||||
IPADBG("skb=%p ep=%d\n", skb, ep_idx);
|
||||
IPADBG_LOW("skb=%p ep=%d\n", skb, ep_idx);
|
||||
|
||||
IPA_STATS_INC_CNT(ipa_ctx->stats.tx_pkts_compl);
|
||||
|
||||
|
@ -1916,7 +1917,7 @@ static void ipa_replenish_wlan_rx_cache(struct ipa_sys_context *sys)
|
|||
int ret;
|
||||
u32 rx_len_cached = 0;
|
||||
|
||||
IPADBG("\n");
|
||||
IPADBG_LOW("\n");
|
||||
|
||||
spin_lock_bh(&ipa_ctx->wc_memb.wlan_spinlock);
|
||||
rx_len_cached = sys->len;
|
||||
|
@ -2339,7 +2340,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
}
|
||||
|
||||
if (sys->len_partial) {
|
||||
IPADBG("len_partial %d\n", sys->len_partial);
|
||||
IPADBG_LOW("len_partial %d\n", sys->len_partial);
|
||||
buf = skb_push(skb, sys->len_partial);
|
||||
memcpy(buf, sys->prev_skb->data, sys->len_partial);
|
||||
sys->len_partial = 0;
|
||||
|
@ -2351,7 +2352,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
/* this pipe has TX comp (status only) + mux-ed LAN RX data
|
||||
* (status+data) */
|
||||
if (sys->len_rem) {
|
||||
IPADBG("rem %d skb %d pad %d\n", sys->len_rem, skb->len,
|
||||
IPADBG_LOW("rem %d skb %d pad %d\n", sys->len_rem, skb->len,
|
||||
sys->len_pad);
|
||||
if (sys->len_rem <= skb->len) {
|
||||
if (sys->prev_skb) {
|
||||
|
@ -2402,7 +2403,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
begin:
|
||||
while (skb->len) {
|
||||
sys->drop_packet = false;
|
||||
IPADBG("LEN_REM %d\n", skb->len);
|
||||
IPADBG_LOW("LEN_REM %d\n", skb->len);
|
||||
|
||||
if (skb->len < IPA_PKT_STATUS_SIZE) {
|
||||
WARN_ON(sys->prev_skb != NULL);
|
||||
|
@ -2413,7 +2414,7 @@ begin:
|
|||
}
|
||||
|
||||
status = (struct ipa_hw_pkt_status *)skb->data;
|
||||
IPADBG("STATUS opcode=%d src=%d dst=%d len=%d\n",
|
||||
IPADBG_LOW("STATUS opcode=%d src=%d dst=%d len=%d\n",
|
||||
status->status_opcode, status->endp_src_idx,
|
||||
status->endp_dest_idx, status->pkt_len);
|
||||
if (sys->status_stat) {
|
||||
|
@ -2451,7 +2452,7 @@ begin:
|
|||
if (status->status_mask & IPA_HW_PKT_STATUS_MASK_TAG_VALID) {
|
||||
struct ipa_tag_completion *comp;
|
||||
|
||||
IPADBG("TAG packet arrived\n");
|
||||
IPADBG_LOW("TAG packet arrived\n");
|
||||
if (status->tag_f_2 == IPA_COOKIE) {
|
||||
skb_pull(skb, IPA_PKT_STATUS_SIZE);
|
||||
if (skb->len < sizeof(comp)) {
|
||||
|
@ -2491,7 +2492,7 @@ begin:
|
|||
if (skb->len == IPA_PKT_STATUS_SIZE &&
|
||||
!status->exception) {
|
||||
WARN_ON(sys->prev_skb != NULL);
|
||||
IPADBG("Ins header in next buffer\n");
|
||||
IPADBG_LOW("Ins header in next buffer\n");
|
||||
sys->prev_skb = skb_copy(skb, GFP_KERNEL);
|
||||
sys->len_partial = skb->len;
|
||||
return rc;
|
||||
|
@ -2502,12 +2503,13 @@ begin:
|
|||
|
||||
len = status->pkt_len + pad_len_byte +
|
||||
IPA_SIZE_DL_CSUM_META_TRAILER;
|
||||
IPADBG("pad %d pkt_len %d len %d\n", pad_len_byte,
|
||||
IPADBG_LOW("pad %d pkt_len %d len %d\n", pad_len_byte,
|
||||
status->pkt_len, len);
|
||||
|
||||
if (status->exception ==
|
||||
IPA_HW_PKT_STATUS_EXCEPTION_DEAGGR) {
|
||||
IPADBG("Dropping packet on DeAggr Exception\n");
|
||||
IPADBG_LOW("Dropping packet");
|
||||
IPADBG_LOW(" on DeAggr Exception\n");
|
||||
sys->drop_packet = true;
|
||||
}
|
||||
|
||||
|
@ -2516,7 +2518,7 @@ begin:
|
|||
skb2 = ipa_skb_copy_for_client(skb, skb2_len);
|
||||
if (likely(skb2)) {
|
||||
if (skb->len < len + IPA_PKT_STATUS_SIZE) {
|
||||
IPADBG("SPL skb len %d len %d\n",
|
||||
IPADBG_LOW("SPL skb len %d len %d\n",
|
||||
skb->len, len);
|
||||
sys->prev_skb = skb2;
|
||||
sys->len_rem = len - skb->len +
|
||||
|
@ -2526,7 +2528,7 @@ begin:
|
|||
} else {
|
||||
skb_trim(skb2, status->pkt_len +
|
||||
IPA_PKT_STATUS_SIZE);
|
||||
IPADBG("rx avail for %d\n",
|
||||
IPADBG_LOW("rx avail for %d\n",
|
||||
status->endp_dest_idx);
|
||||
if (sys->drop_packet) {
|
||||
dev_kfree_skb_any(skb2);
|
||||
|
@ -2570,11 +2572,12 @@ begin:
|
|||
}
|
||||
/* TX comp */
|
||||
ipa_wq_write_done_status(src_pipe);
|
||||
IPADBG("tx comp imp for %d\n", src_pipe);
|
||||
IPADBG_LOW("tx comp imp for %d\n", src_pipe);
|
||||
} else {
|
||||
/* TX comp */
|
||||
ipa_wq_write_done_status(status->endp_src_idx);
|
||||
IPADBG("tx comp exp for %d\n", status->endp_src_idx);
|
||||
IPADBG_LOW
|
||||
("tx comp exp for %d\n", status->endp_src_idx);
|
||||
skb_pull(skb, IPA_PKT_STATUS_SIZE);
|
||||
IPA_STATS_INC_CNT(ipa_ctx->stats.stat_compl);
|
||||
IPA_STATS_DEC_CNT(
|
||||
|
@ -2610,13 +2613,13 @@ static void wan_rx_handle_splt_pyld(struct sk_buff *skb,
|
|||
{
|
||||
struct sk_buff *skb2;
|
||||
|
||||
IPADBG("rem %d skb %d\n", sys->len_rem, skb->len);
|
||||
IPADBG_LOW("rem %d skb %d\n", sys->len_rem, skb->len);
|
||||
if (sys->len_rem <= skb->len) {
|
||||
if (sys->prev_skb) {
|
||||
skb2 = join_prev_skb(sys->prev_skb, skb,
|
||||
sys->len_rem);
|
||||
if (likely(skb2)) {
|
||||
IPADBG(
|
||||
IPADBG_LOW(
|
||||
"removing Status element from skb and sending to WAN client");
|
||||
skb_pull(skb2, IPA_PKT_STATUS_SIZE);
|
||||
skb2->truesize = skb2->len +
|
||||
|
@ -2679,14 +2682,14 @@ static int ipa_wan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
|
||||
|
||||
while (skb->len) {
|
||||
IPADBG("LEN_REM %d\n", skb->len);
|
||||
IPADBG_LOW("LEN_REM %d\n", skb->len);
|
||||
if (skb->len < IPA_PKT_STATUS_SIZE) {
|
||||
IPAERR("status straddles buffer\n");
|
||||
WARN_ON(1);
|
||||
goto bail;
|
||||
}
|
||||
status = (struct ipa_hw_pkt_status *)skb->data;
|
||||
IPADBG("STATUS opcode=%d src=%d dst=%d len=%d\n",
|
||||
IPADBG_LOW("STATUS opcode=%d src=%d dst=%d len=%d\n",
|
||||
status->status_opcode, status->endp_src_idx,
|
||||
status->endp_dest_idx, status->pkt_len);
|
||||
|
||||
|
@ -2717,7 +2720,7 @@ static int ipa_wan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
goto bail;
|
||||
}
|
||||
if (status->pkt_len == 0) {
|
||||
IPADBG("Skip aggr close status\n");
|
||||
IPADBG_LOW("Skip aggr close status\n");
|
||||
skb_pull(skb, IPA_PKT_STATUS_SIZE);
|
||||
IPA_STATS_DEC_CNT(ipa_ctx->stats.rx_pkts);
|
||||
IPA_STATS_INC_CNT(ipa_ctx->stats.wan_aggr_close);
|
||||
|
@ -2744,11 +2747,11 @@ static int ipa_wan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
|
||||
/*QMAP is BE: convert the pkt_len field from BE to LE*/
|
||||
pkt_len_with_pad = ntohs((qmap_hdr>>16) & 0xffff);
|
||||
IPADBG("pkt_len with pad %d\n", pkt_len_with_pad);
|
||||
IPADBG_LOW("pkt_len with pad %d\n", pkt_len_with_pad);
|
||||
/*get the CHECKSUM_PROCESS bit*/
|
||||
checksum_trailer_exists = status->status_mask &
|
||||
IPA_HW_PKT_STATUS_MASK_CKSUM_PROCESS;
|
||||
IPADBG("checksum_trailer_exists %d\n",
|
||||
IPADBG_LOW("checksum_trailer_exists %d\n",
|
||||
checksum_trailer_exists);
|
||||
|
||||
frame_len = IPA_PKT_STATUS_SIZE +
|
||||
|
@ -2756,7 +2759,7 @@ static int ipa_wan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
pkt_len_with_pad;
|
||||
if (checksum_trailer_exists)
|
||||
frame_len += IPA_DL_CHECKSUM_LENGTH;
|
||||
IPADBG("frame_len %d\n", frame_len);
|
||||
IPADBG_LOW("frame_len %d\n", frame_len);
|
||||
|
||||
skb2 = skb_clone(skb, GFP_KERNEL);
|
||||
if (likely(skb2)) {
|
||||
|
@ -2765,16 +2768,16 @@ static int ipa_wan_rx_pyld_hdlr(struct sk_buff *skb,
|
|||
* payload split across 2 buff
|
||||
*/
|
||||
if (skb->len < frame_len) {
|
||||
IPADBG("SPL skb len %d len %d\n",
|
||||
IPADBG_LOW("SPL skb len %d len %d\n",
|
||||
skb->len, frame_len);
|
||||
sys->prev_skb = skb2;
|
||||
sys->len_rem = frame_len - skb->len;
|
||||
skb_pull(skb, skb->len);
|
||||
} else {
|
||||
skb_trim(skb2, frame_len);
|
||||
IPADBG("rx avail for %d\n",
|
||||
IPADBG_LOW("rx avail for %d\n",
|
||||
status->endp_dest_idx);
|
||||
IPADBG(
|
||||
IPADBG_LOW(
|
||||
"removing Status element from skb and sending to WAN client");
|
||||
skb_pull(skb2, IPA_PKT_STATUS_SIZE);
|
||||
skb2->truesize = skb2->len +
|
||||
|
@ -2914,7 +2917,7 @@ void ipa_lan_rx_cb(void *priv, enum ipa_dp_evt_type evt, unsigned long data)
|
|||
------------------------------------------
|
||||
*/
|
||||
*(u16 *)rx_skb->cb = ((metadata >> 16) & 0xFFFF);
|
||||
IPADBG("meta_data: 0x%x cb: 0x%x\n",
|
||||
IPADBG_LOW("meta_data: 0x%x cb: 0x%x\n",
|
||||
metadata, *(u32 *)rx_skb->cb);
|
||||
|
||||
ep->client_notify(ep->priv, IPA_RECEIVE, (unsigned long)(rx_skb));
|
||||
|
@ -3017,7 +3020,7 @@ static void ipa_wlan_wq_rx_common(struct ipa_sys_context *sys, u32 size)
|
|||
static void ipa_dma_memcpy_notify(struct ipa_sys_context *sys,
|
||||
struct sps_iovec *iovec)
|
||||
{
|
||||
IPADBG("ENTER.\n");
|
||||
IPADBG_LOW("ENTER.\n");
|
||||
if (unlikely(list_empty(&sys->head_desc_list))) {
|
||||
IPAERR("descriptor list is empty!\n");
|
||||
WARN_ON(1);
|
||||
|
@ -3064,7 +3067,8 @@ void ipa_sps_irq_rx_no_aggr_notify(struct sps_event_notify *notify)
|
|||
if (IPA_CLIENT_IS_APPS_CONS(rx_pkt->sys->ep->client))
|
||||
atomic_set(&ipa_ctx->sps_pm.eot_activity, 1);
|
||||
rx_pkt->len = notify->data.transfer.iovec.size;
|
||||
IPADBG("event %d notified sys=%p len=%u\n", notify->event_id,
|
||||
IPADBG_LOW
|
||||
("event %d notified sys=%p len=%u\n", notify->event_id,
|
||||
notify->user, rx_pkt->len);
|
||||
queue_work(rx_pkt->sys->wq, &rx_pkt->work);
|
||||
break;
|
||||
|
@ -3370,15 +3374,15 @@ static void ipa_tx_client_rx_notify_release(void *user1, int user2)
|
|||
struct ipa_tx_data_desc *dd = (struct ipa_tx_data_desc *)user1;
|
||||
int ep_idx = user2;
|
||||
|
||||
IPADBG("Received data desc anchor:%p\n", dd);
|
||||
IPADBG_LOW("Received data desc anchor:%p\n", dd);
|
||||
|
||||
atomic_inc(&ipa_ctx->ep[ep_idx].avail_fifo_desc);
|
||||
ipa_ctx->ep[ep_idx].wstats.rx_pkts_status_rcvd++;
|
||||
|
||||
/* wlan host driver waits till tx complete before unload */
|
||||
IPADBG("ep=%d fifo_desc_free_count=%d\n",
|
||||
IPADBG_LOW("ep=%d fifo_desc_free_count=%d\n",
|
||||
ep_idx, atomic_read(&ipa_ctx->ep[ep_idx].avail_fifo_desc));
|
||||
IPADBG("calling client notify callback with priv:%p\n",
|
||||
IPADBG_LOW("calling client notify callback with priv:%p\n",
|
||||
ipa_ctx->ep[ep_idx].priv);
|
||||
|
||||
if (ipa_ctx->ep[ep_idx].client_notify) {
|
||||
|
@ -3442,7 +3446,7 @@ int ipa2_tx_dp_mul(enum ipa_client_type src,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
IPADBG("Received data desc anchor:%p\n", data_desc);
|
||||
IPADBG_LOW("Received data desc anchor:%p\n", data_desc);
|
||||
|
||||
spin_lock_bh(&ipa_ctx->wc_memb.ipa_tx_mul_spinlock);
|
||||
|
||||
|
@ -3451,7 +3455,7 @@ int ipa2_tx_dp_mul(enum ipa_client_type src,
|
|||
IPAERR("dest EP does not exist.\n");
|
||||
goto fail_send;
|
||||
}
|
||||
IPADBG("ep idx:%d\n", ep_idx);
|
||||
IPADBG_LOW("ep idx:%d\n", ep_idx);
|
||||
sys = ipa_ctx->ep[ep_idx].sys;
|
||||
|
||||
if (unlikely(ipa_ctx->ep[ep_idx].valid == 0)) {
|
||||
|
@ -3465,7 +3469,7 @@ int ipa2_tx_dp_mul(enum ipa_client_type src,
|
|||
list_for_each_entry(entry, &data_desc->link, link) {
|
||||
num_desc++;
|
||||
}
|
||||
IPADBG("Number of Data Descriptors:%d", num_desc);
|
||||
IPADBG_LOW("Number of Data Descriptors:%d", num_desc);
|
||||
|
||||
if (atomic_read(&sys->ep->avail_fifo_desc) < num_desc) {
|
||||
IPAERR("Insufficient data descriptors available\n");
|
||||
|
@ -3475,7 +3479,7 @@ int ipa2_tx_dp_mul(enum ipa_client_type src,
|
|||
/* Assign callback only for last data descriptor */
|
||||
cnt = 0;
|
||||
list_for_each_entry(entry, &data_desc->link, link) {
|
||||
IPADBG("Parsing data desc :%d\n", cnt);
|
||||
IPADBG_LOW("Parsing data desc :%d\n", cnt);
|
||||
cnt++;
|
||||
((u8 *)entry->pyld_buffer)[IPA_WLAN_HDR_QMAP_ID_OFFSET] =
|
||||
(u8)sys->ep->cfg.meta.qmap_id;
|
||||
|
@ -3484,18 +3488,18 @@ int ipa2_tx_dp_mul(enum ipa_client_type src,
|
|||
desc.type = IPA_DATA_DESC_SKB;
|
||||
desc.user1 = data_desc;
|
||||
desc.user2 = ep_idx;
|
||||
IPADBG("priv:%p pyld_buf:0x%p pyld_len:%d\n",
|
||||
IPADBG_LOW("priv:%p pyld_buf:0x%p pyld_len:%d\n",
|
||||
entry->priv, desc.pyld, desc.len);
|
||||
|
||||
/* In case of last descriptor populate callback */
|
||||
if (cnt == num_desc) {
|
||||
IPADBG("data desc:%p\n", data_desc);
|
||||
IPADBG_LOW("data desc:%p\n", data_desc);
|
||||
desc.callback = ipa_tx_client_rx_notify_release;
|
||||
} else {
|
||||
desc.callback = ipa_tx_client_rx_pkt_status;
|
||||
}
|
||||
|
||||
IPADBG("calling ipa_send_one()\n");
|
||||
IPADBG_LOW("calling ipa_send_one()\n");
|
||||
if (ipa_send_one(sys, &desc, true)) {
|
||||
IPAERR("fail to send skb\n");
|
||||
sys->ep->wstats.rx_pkt_leak += (cnt-1);
|
||||
|
@ -3507,7 +3511,7 @@ int ipa2_tx_dp_mul(enum ipa_client_type src,
|
|||
atomic_dec(&sys->ep->avail_fifo_desc);
|
||||
|
||||
sys->ep->wstats.rx_pkts_rcvd++;
|
||||
IPADBG("ep=%d fifo desc=%d\n",
|
||||
IPADBG_LOW("ep=%d fifo desc=%d\n",
|
||||
ep_idx, atomic_read(&sys->ep->avail_fifo_desc));
|
||||
}
|
||||
|
||||
|
|
|
@ -209,7 +209,7 @@ static int ipa_generate_flt_hw_rule(enum ipa_ip_type ip,
|
|||
}
|
||||
}
|
||||
|
||||
IPADBG("en_rule 0x%x, action=%d, rt_idx=%d, uc=%d, retain_hdr=%d\n",
|
||||
IPADBG_LOW("en_rule 0x%x, action=%d, rt_idx=%d, uc=%d, retain_hdr=%d\n",
|
||||
en_rule,
|
||||
hdr->u.hdr.action,
|
||||
hdr->u.hdr.rt_tbl_idx,
|
||||
|
@ -601,7 +601,7 @@ static void __ipa_reap_sys_flt_tbls(enum ipa_ip_type ip)
|
|||
|
||||
tbl = &ipa_ctx->glob_flt_tbl[ip];
|
||||
if (tbl->prev_mem.phys_base) {
|
||||
IPADBG("reaping glob flt tbl (prev) ip=%d\n", ip);
|
||||
IPADBG_LOW("reaping glob flt tbl (prev) ip=%d\n", ip);
|
||||
dma_free_coherent(ipa_ctx->pdev, tbl->prev_mem.size,
|
||||
tbl->prev_mem.base, tbl->prev_mem.phys_base);
|
||||
memset(&tbl->prev_mem, 0, sizeof(tbl->prev_mem));
|
||||
|
@ -609,7 +609,7 @@ static void __ipa_reap_sys_flt_tbls(enum ipa_ip_type ip)
|
|||
|
||||
if (list_empty(&tbl->head_flt_rule_list)) {
|
||||
if (tbl->curr_mem.phys_base) {
|
||||
IPADBG("reaping glob flt tbl (curr) ip=%d\n", ip);
|
||||
IPADBG_LOW("reaping glob flt tbl (curr) ip=%d\n", ip);
|
||||
dma_free_coherent(ipa_ctx->pdev, tbl->curr_mem.size,
|
||||
tbl->curr_mem.base,
|
||||
tbl->curr_mem.phys_base);
|
||||
|
@ -620,7 +620,8 @@ static void __ipa_reap_sys_flt_tbls(enum ipa_ip_type ip)
|
|||
for (i = 0; i < ipa_ctx->ipa_num_pipes; i++) {
|
||||
tbl = &ipa_ctx->flt_tbl[i][ip];
|
||||
if (tbl->prev_mem.phys_base) {
|
||||
IPADBG("reaping flt tbl (prev) pipe=%d ip=%d\n", i, ip);
|
||||
IPADBG_LOW("reaping flt tbl");
|
||||
IPADBG_LOW("(prev) pipe=%d ip=%d\n", i, ip);
|
||||
dma_free_coherent(ipa_ctx->pdev, tbl->prev_mem.size,
|
||||
tbl->prev_mem.base,
|
||||
tbl->prev_mem.phys_base);
|
||||
|
@ -629,7 +630,8 @@ static void __ipa_reap_sys_flt_tbls(enum ipa_ip_type ip)
|
|||
|
||||
if (list_empty(&tbl->head_flt_rule_list)) {
|
||||
if (tbl->curr_mem.phys_base) {
|
||||
IPADBG("reaping flt tbl (curr) pipe=%d ip=%d\n",
|
||||
IPADBG_LOW("reaping flt tbl");
|
||||
IPADBG_LOW("(curr) pipe=%d ip=%d\n",
|
||||
i, ip);
|
||||
dma_free_coherent(ipa_ctx->pdev,
|
||||
tbl->curr_mem.size,
|
||||
|
@ -897,7 +899,7 @@ int __ipa_commit_flt_v2(enum ipa_ip_type ip)
|
|||
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (ipa_ctx->skip_ep_cfg_shadow[i]) {
|
||||
IPADBG("skip %d\n", i);
|
||||
IPADBG_LOW("skip %d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -906,7 +908,7 @@ int __ipa_commit_flt_v2(enum ipa_ip_type ip)
|
|||
ipa2_get_ep_mapping(IPA_CLIENT_APPS_CMD_PROD) == i ||
|
||||
(ipa2_get_ep_mapping(IPA_CLIENT_APPS_LAN_WAN_PROD) == i
|
||||
&& ipa_ctx->modem_cfg_emb_pipe_flt)) {
|
||||
IPADBG("skip %d\n", i);
|
||||
IPADBG_LOW("skip %d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -932,12 +934,12 @@ int __ipa_commit_flt_v2(enum ipa_ip_type ip)
|
|||
|
||||
for (i = 11; i < ipa_ctx->ipa_num_pipes; i++) {
|
||||
if (ipa_ctx->skip_ep_cfg_shadow[i]) {
|
||||
IPADBG("skip %d\n", i);
|
||||
IPADBG_LOW("skip %d\n", i);
|
||||
continue;
|
||||
}
|
||||
if (ipa2_get_ep_mapping(IPA_CLIENT_APPS_LAN_WAN_PROD) == i &&
|
||||
ipa_ctx->modem_cfg_emb_pipe_flt) {
|
||||
IPADBG("skip %d\n", i);
|
||||
IPADBG_LOW("skip %d\n", i);
|
||||
continue;
|
||||
}
|
||||
if (ip == IPA_IP_v4) {
|
||||
|
@ -1066,7 +1068,7 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip,
|
|||
}
|
||||
*rule_hdl = id;
|
||||
entry->id = id;
|
||||
IPADBG("add flt rule rule_cnt=%d\n", tbl->rule_cnt);
|
||||
IPADBG_LOW("add flt rule rule_cnt=%d\n", tbl->rule_cnt);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1095,7 +1097,7 @@ static int __ipa_del_flt_rule(u32 rule_hdl)
|
|||
entry->tbl->rule_cnt--;
|
||||
if (entry->rt_tbl)
|
||||
entry->rt_tbl->ref_cnt--;
|
||||
IPADBG("del flt rule rule_cnt=%d\n", entry->tbl->rule_cnt);
|
||||
IPADBG_LOW("del flt rule rule_cnt=%d\n", entry->tbl->rule_cnt);
|
||||
entry->cookie = 0;
|
||||
kmem_cache_free(ipa_ctx->flt_rule_cache, entry);
|
||||
|
||||
|
@ -1176,7 +1178,7 @@ static int __ipa_add_global_flt_rule(enum ipa_ip_type ip,
|
|||
}
|
||||
|
||||
tbl = &ipa_ctx->glob_flt_tbl[ip];
|
||||
IPADBG("add global flt rule ip=%d\n", ip);
|
||||
IPADBG_LOW("add global flt rule ip=%d\n", ip);
|
||||
|
||||
return __ipa_add_flt_rule(tbl, ip, rule, add_rear, rule_hdl);
|
||||
}
|
||||
|
@ -1203,7 +1205,7 @@ static int __ipa_add_ep_flt_rule(enum ipa_ip_type ip, enum ipa_client_type ep,
|
|||
IPADBG("ep not connected ep_idx=%d\n", ipa_ep_idx);
|
||||
|
||||
tbl = &ipa_ctx->flt_tbl[ipa_ep_idx][ip];
|
||||
IPADBG("add ep flt rule ip=%d ep=%d\n", ip, ep);
|
||||
IPADBG_LOW("add ep flt rule ip=%d ep=%d\n", ip, ep);
|
||||
|
||||
return __ipa_add_flt_rule(tbl, ip, rule, add_rear, rule_hdl);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ static int ipa_generate_hdr_hw_tbl(struct ipa_mem_buffer *mem)
|
|||
IPAERR("hdr tbl empty\n");
|
||||
return -EPERM;
|
||||
}
|
||||
IPADBG("tbl_sz=%d\n", ipa_ctx->hdr_tbl.end);
|
||||
IPADBG_LOW("tbl_sz=%d\n", ipa_ctx->hdr_tbl.end);
|
||||
|
||||
mem->base = dma_alloc_coherent(ipa_ctx->pdev, mem->size,
|
||||
&mem->phys_base, GFP_KERNEL);
|
||||
|
@ -57,7 +57,7 @@ static int ipa_generate_hdr_hw_tbl(struct ipa_mem_buffer *mem)
|
|||
link) {
|
||||
if (entry->is_hdr_proc_ctx)
|
||||
continue;
|
||||
IPADBG("hdr of len %d ofst=%d\n", entry->hdr_len,
|
||||
IPADBG_LOW("hdr of len %d ofst=%d\n", entry->hdr_len,
|
||||
entry->offset_entry->offset);
|
||||
memcpy(mem->base + entry->offset_entry->offset, entry->hdr,
|
||||
entry->hdr_len);
|
||||
|
@ -74,7 +74,7 @@ static void ipa_hdr_proc_ctx_to_hw_format(struct ipa_mem_buffer *mem,
|
|||
list_for_each_entry(entry,
|
||||
&ipa_ctx->hdr_proc_ctx_tbl.head_proc_ctx_entry_list,
|
||||
link) {
|
||||
IPADBG("processing type %d ofst=%d\n",
|
||||
IPADBG_LOW("processing type %d ofst=%d\n",
|
||||
entry->type, entry->offset_entry->offset);
|
||||
if (entry->type == IPA_HDR_PROC_NONE) {
|
||||
struct ipa_hdr_proc_ctx_add_hdr_seq *ctx;
|
||||
|
@ -88,7 +88,7 @@ static void ipa_hdr_proc_ctx_to_hw_format(struct ipa_mem_buffer *mem,
|
|||
entry->hdr->phys_base :
|
||||
hdr_base_addr +
|
||||
entry->hdr->offset_entry->offset;
|
||||
IPADBG("header address 0x%x\n",
|
||||
IPADBG_LOW("header address 0x%x\n",
|
||||
ctx->hdr_add.hdr_addr);
|
||||
ctx->end.type = IPA_PROC_CTX_TLV_TYPE_END;
|
||||
ctx->end.length = 0;
|
||||
|
@ -105,7 +105,7 @@ static void ipa_hdr_proc_ctx_to_hw_format(struct ipa_mem_buffer *mem,
|
|||
entry->hdr->phys_base :
|
||||
hdr_base_addr +
|
||||
entry->hdr->offset_entry->offset;
|
||||
IPADBG("header address 0x%x\n",
|
||||
IPADBG_LOW("header address 0x%x\n",
|
||||
ctx->hdr_add.hdr_addr);
|
||||
ctx->cmd.type = IPA_PROC_CTX_TLV_TYPE_PROC_CMD;
|
||||
ctx->cmd.length = 0;
|
||||
|
@ -117,7 +117,7 @@ static void ipa_hdr_proc_ctx_to_hw_format(struct ipa_mem_buffer *mem,
|
|||
ctx->cmd.value = IPA_HDR_UCP_802_3_TO_ETHII;
|
||||
else if (entry->type == IPA_HDR_PROC_802_3_TO_802_3)
|
||||
ctx->cmd.value = IPA_HDR_UCP_802_3_TO_802_3;
|
||||
IPADBG("command id %d\n", ctx->cmd.value);
|
||||
IPADBG_LOW("command id %d\n", ctx->cmd.value);
|
||||
ctx->end.type = IPA_PROC_CTX_TLV_TYPE_END;
|
||||
ctx->end.length = 0;
|
||||
ctx->end.value = 0;
|
||||
|
@ -144,7 +144,7 @@ static int ipa_generate_hdr_proc_ctx_hw_tbl(u32 hdr_sys_addr,
|
|||
/* make sure table is aligned */
|
||||
mem->size += IPA_HDR_PROC_CTX_TABLE_ALIGNMENT_BYTE;
|
||||
|
||||
IPADBG("tbl_sz=%d\n", ipa_ctx->hdr_proc_ctx_tbl.end);
|
||||
IPADBG_LOW("tbl_sz=%d\n", ipa_ctx->hdr_proc_ctx_tbl.end);
|
||||
|
||||
mem->base = dma_alloc_coherent(ipa_ctx->pdev, mem->size,
|
||||
&mem->phys_base, GFP_KERNEL);
|
||||
|
@ -487,7 +487,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx,
|
|||
int needed_len;
|
||||
int mem_size;
|
||||
|
||||
IPADBG("processing type %d hdr_hdl %d\n",
|
||||
IPADBG_LOW("processing type %d hdr_hdl %d\n",
|
||||
proc_ctx->type, proc_ctx->hdr_hdl);
|
||||
|
||||
if (!HDR_PROC_TYPE_IS_VALID(proc_ctx->type)) {
|
||||
|
@ -566,7 +566,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx,
|
|||
entry->offset_entry = offset;
|
||||
list_add(&entry->link, &htbl->head_proc_ctx_entry_list);
|
||||
htbl->proc_ctx_cnt++;
|
||||
IPADBG("add proc ctx of sz=%d cnt=%d ofst=%d\n", needed_len,
|
||||
IPADBG_LOW("add proc ctx of sz=%d cnt=%d ofst=%d\n", needed_len,
|
||||
htbl->proc_ctx_cnt, offset->offset);
|
||||
|
||||
id = ipa_id_alloc(entry);
|
||||
|
@ -692,12 +692,12 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr)
|
|||
list_add(&entry->link, &htbl->head_hdr_entry_list);
|
||||
htbl->hdr_cnt++;
|
||||
if (entry->is_hdr_proc_ctx)
|
||||
IPADBG("add hdr of sz=%d hdr_cnt=%d phys_base=%pa\n",
|
||||
IPADBG_LOW("add hdr of sz=%d hdr_cnt=%d phys_base=%pa\n",
|
||||
hdr->hdr_len,
|
||||
htbl->hdr_cnt,
|
||||
&entry->phys_base);
|
||||
else
|
||||
IPADBG("add hdr of sz=%d hdr_cnt=%d ofst=%d\n",
|
||||
IPADBG_LOW("add hdr of sz=%d hdr_cnt=%d ofst=%d\n",
|
||||
hdr->hdr_len,
|
||||
htbl->hdr_cnt,
|
||||
entry->offset_entry->offset);
|
||||
|
|
|
@ -54,10 +54,37 @@
|
|||
|
||||
#define IPA_MAX_STATUS_STAT_NUM 30
|
||||
|
||||
#define IPA_IPC_LOG_PAGES 50
|
||||
|
||||
#define IPADBG(fmt, args...) \
|
||||
pr_debug(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_debug(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args);\
|
||||
if (ipa_ctx) { \
|
||||
IPA_IPC_LOGGING(ipa_ctx->logbuf, \
|
||||
DRV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_ctx->logbuf_low, \
|
||||
DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define IPADBG_LOW(fmt, args...) \
|
||||
do { \
|
||||
pr_debug(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args);\
|
||||
if (ipa_ctx) \
|
||||
IPA_IPC_LOGGING(ipa_ctx->logbuf_low, \
|
||||
DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPAERR(fmt, args...) \
|
||||
pr_err(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_err(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args);\
|
||||
if (ipa_ctx) { \
|
||||
IPA_IPC_LOGGING(ipa_ctx->logbuf, \
|
||||
DRV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_ctx->logbuf_low, \
|
||||
DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define WLAN_AMPDU_TX_EP 15
|
||||
#define WLAN_PROD_TX_EP 19
|
||||
|
@ -1003,6 +1030,8 @@ struct ipacm_client_info {
|
|||
* @use_ipa_teth_bridge: use tethering bridge driver
|
||||
* @ipa_bam_remote_mode: ipa bam is in remote mode
|
||||
* @modem_cfg_emb_pipe_flt: modem configure embedded pipe filtering rules
|
||||
* @logbuf: ipc log buffer for high priority messages
|
||||
* @logbuf_low: ipc log buffer for low priority messages
|
||||
* @ipa_wdi2: using wdi-2.0
|
||||
* @ipa_bus_hdl: msm driver handle for the data path bus
|
||||
* @ctrl: holds the core specific operations based on
|
||||
|
@ -1095,6 +1124,8 @@ struct ipa_context {
|
|||
/* featurize if memory footprint becomes a concern */
|
||||
struct ipa_stats stats;
|
||||
void *smem_pipe_mem;
|
||||
void *logbuf;
|
||||
void *logbuf_low;
|
||||
u32 ipa_bus_hdl;
|
||||
struct ipa_controller *ctrl;
|
||||
struct idr ipa_idr;
|
||||
|
|
|
@ -103,11 +103,12 @@ static int handle_interrupt(int irq_num, bool isr_context)
|
|||
|
||||
switch (interrupt_info.interrupt) {
|
||||
case IPA_TX_SUSPEND_IRQ:
|
||||
IPADBG_LOW("processing TX_SUSPEND interrupt work-around\n");
|
||||
suspend_data = ipa_read_reg(ipa_ctx->mmio,
|
||||
IPA_IRQ_SUSPEND_INFO_EE_n_ADDR(ipa_ee));
|
||||
if (!is_valid_ep(suspend_data))
|
||||
return 0;
|
||||
|
||||
IPADBG_LOW("get interrupt %d\n", suspend_data);
|
||||
suspend_interrupt_data =
|
||||
kzalloc(sizeof(*suspend_interrupt_data), GFP_ATOMIC);
|
||||
if (!suspend_interrupt_data) {
|
||||
|
@ -167,9 +168,11 @@ static void ipa_process_interrupts(bool isr_context)
|
|||
u32 i = 0;
|
||||
u32 en;
|
||||
bool uc_irq;
|
||||
|
||||
en = ipa_read_reg(ipa_ctx->mmio, IPA_IRQ_EN_EE_n_ADDR(ipa_ee));
|
||||
reg = ipa_read_reg(ipa_ctx->mmio, IPA_IRQ_STTS_EE_n_ADDR(ipa_ee));
|
||||
IPADBG_LOW(
|
||||
"ISR enter\n isr_ctx = %d EN reg = 0x%x STTS reg = 0x%x\n",
|
||||
isr_context, en, reg);
|
||||
while (en & reg) {
|
||||
bmsk = 1;
|
||||
for (i = 0; i < IPA_IRQ_NUM_MAX; i++) {
|
||||
|
@ -206,21 +209,22 @@ static void ipa_process_interrupts(bool isr_context)
|
|||
reg = ipa_read_reg(ipa_ctx->mmio,
|
||||
IPA_IRQ_STTS_EE_n_ADDR(ipa_ee));
|
||||
}
|
||||
IPADBG_LOW("Exit\n");
|
||||
}
|
||||
|
||||
static void ipa_interrupt_defer(struct work_struct *work)
|
||||
{
|
||||
IPADBG("processing interrupts in wq\n");
|
||||
IPADBG_LOW("processing interrupts in wq\n");
|
||||
IPA_ACTIVE_CLIENTS_INC_SIMPLE();
|
||||
ipa_process_interrupts(false);
|
||||
IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
|
||||
IPADBG("Done\n");
|
||||
IPADBG_LOW("Done\n");
|
||||
}
|
||||
|
||||
static irqreturn_t ipa_isr(int irq, void *ctxt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
IPADBG_LOW("Enter\n");
|
||||
/* defer interrupt handling in case IPA is not clocked on */
|
||||
if (ipa_active_clients_trylock(&flags) == 0) {
|
||||
IPADBG("defer interrupt processing\n");
|
||||
|
@ -235,7 +239,7 @@ static irqreturn_t ipa_isr(int irq, void *ctxt)
|
|||
}
|
||||
|
||||
ipa_process_interrupts(true);
|
||||
|
||||
IPADBG_LOW("Exit\n");
|
||||
bail:
|
||||
ipa_active_clients_trylock_unlock(&flags);
|
||||
return IRQ_HANDLED;
|
||||
|
@ -260,7 +264,7 @@ int ipa2_add_interrupt_handler(enum ipa_irq_type interrupt,
|
|||
u32 bmsk;
|
||||
int irq_num;
|
||||
|
||||
IPADBG("in ipa2_add_interrupt_handler\n");
|
||||
IPADBG_LOW("in ipa2_add_interrupt_handler\n");
|
||||
if (interrupt < IPA_BAD_SNOC_ACCESS_IRQ ||
|
||||
interrupt >= IPA_IRQ_MAX) {
|
||||
IPAERR("invalid interrupt number %d\n", interrupt);
|
||||
|
@ -284,7 +288,7 @@ int ipa2_add_interrupt_handler(enum ipa_irq_type interrupt,
|
|||
bmsk = 1 << irq_num;
|
||||
val |= bmsk;
|
||||
ipa_write_reg(ipa_ctx->mmio, IPA_IRQ_EN_EE_n_ADDR(ipa_ee), val);
|
||||
IPADBG("wrote IPA_IRQ_EN_EE_n_ADDR register. reg = %d\n", val);
|
||||
IPADBG_LOW("wrote IPA_IRQ_EN_EE_n_ADDR register. reg = %d\n", val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -532,9 +532,8 @@ ssize_t ipa_read(struct file *filp, char __user *buf, size_t count,
|
|||
list_del(&msg->link);
|
||||
}
|
||||
|
||||
IPADBG("msg=%p\n", msg);
|
||||
|
||||
if (msg) {
|
||||
IPADBG("msg=%pK\n", msg);
|
||||
locked = 0;
|
||||
mutex_unlock(&ipa_ctx->msg_lock);
|
||||
if (copy_to_user(buf, &msg->meta,
|
||||
|
@ -558,6 +557,7 @@ ssize_t ipa_read(struct file *filp, char __user *buf, size_t count,
|
|||
IPA_STATS_INC_CNT(
|
||||
ipa_ctx->stats.msg_r[msg->meta.msg_type]);
|
||||
kfree(msg);
|
||||
msg = NULL;
|
||||
}
|
||||
|
||||
ret = -EAGAIN;
|
||||
|
|
|
@ -20,16 +20,40 @@
|
|||
#include "ipa_i.h"
|
||||
#include "ipa_qmi_service.h"
|
||||
|
||||
#define IPA_MHI_DRV_NAME
|
||||
#define IPA_MHI_DRV_NAME "ipa_mhi"
|
||||
#define IPA_MHI_DBG(fmt, args...) \
|
||||
pr_debug(IPA_MHI_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_debug(IPA_MHI_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
IPA_MHI_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
IPA_MHI_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPA_MHI_DBG_LOW(fmt, args...) \
|
||||
do { \
|
||||
pr_debug(IPA_MHI_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
IPA_MHI_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPA_MHI_ERR(fmt, args...) \
|
||||
pr_err(IPA_MHI_DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_err(IPA_MHI_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
IPA_MHI_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
IPA_MHI_DRV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPA_MHI_FUNC_ENTRY() \
|
||||
IPA_MHI_DBG("ENTRY\n")
|
||||
IPA_MHI_DBG_LOW("ENTRY\n")
|
||||
#define IPA_MHI_FUNC_EXIT() \
|
||||
IPA_MHI_DBG("EXIT\n")
|
||||
IPA_MHI_DBG_LOW("EXIT\n")
|
||||
|
||||
|
||||
bool ipa2_mhi_sps_channel_empty(enum ipa_client_type client)
|
||||
{
|
||||
|
|
|
@ -310,7 +310,7 @@ static void ipa_a5_svc_recv_msg(struct work_struct *work)
|
|||
int rc;
|
||||
|
||||
do {
|
||||
IPAWANDBG("Notified about a Receive Event");
|
||||
IPAWANDBG_LOW("Notified about a Receive Event");
|
||||
rc = qmi_recv_msg(ipa_svc_handle);
|
||||
} while (rc == 0);
|
||||
if (rc != -ENOMSG)
|
||||
|
@ -384,7 +384,7 @@ static int ipa_check_qmi_response(int rc,
|
|||
req_id, result, error);
|
||||
return result;
|
||||
}
|
||||
IPAWANDBG("Received %s successfully\n", resp_type);
|
||||
IPAWANDBG_LOW("Received %s successfully\n", resp_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -711,7 +711,7 @@ static void ipa_q6_clnt_recv_msg(struct work_struct *work)
|
|||
int rc;
|
||||
|
||||
do {
|
||||
IPAWANDBG("Notified about a Receive Event");
|
||||
IPAWANDBG_LOW("Notified about a Receive Event");
|
||||
rc = qmi_recv_msg(ipa_q6_clnt);
|
||||
} while (rc == 0);
|
||||
if (rc != -ENOMSG)
|
||||
|
@ -723,7 +723,7 @@ static void ipa_q6_clnt_notify(struct qmi_handle *handle,
|
|||
{
|
||||
switch (event) {
|
||||
case QMI_RECV_MSG:
|
||||
IPAWANDBG("client qmi recv message called");
|
||||
IPAWANDBG_LOW("client qmi recv message called");
|
||||
if (!atomic_read(&workqueues_stopped))
|
||||
queue_delayed_work(ipa_clnt_resp_workqueue,
|
||||
&work_recv_msg_client, 0);
|
||||
|
@ -1094,7 +1094,7 @@ int ipa_qmi_get_data_stats(struct ipa_get_data_stats_req_msg_v01 *req,
|
|||
resp_desc.msg_id = QMI_IPA_GET_DATA_STATS_RESP_V01;
|
||||
resp_desc.ei_array = ipa_get_data_stats_resp_msg_data_v01_ei;
|
||||
|
||||
IPAWANDBG("Sending QMI_IPA_GET_DATA_STATS_REQ_V01\n");
|
||||
IPAWANDBG_LOW("Sending QMI_IPA_GET_DATA_STATS_REQ_V01\n");
|
||||
if (unlikely(!ipa_q6_clnt))
|
||||
return -ETIMEDOUT;
|
||||
rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req,
|
||||
|
@ -1103,7 +1103,7 @@ int ipa_qmi_get_data_stats(struct ipa_get_data_stats_req_msg_v01 *req,
|
|||
sizeof(struct ipa_get_data_stats_resp_msg_v01),
|
||||
QMI_SEND_STATS_REQ_TIMEOUT_MS);
|
||||
|
||||
IPAWANDBG("QMI_IPA_GET_DATA_STATS_RESP_V01 received\n");
|
||||
IPAWANDBG_LOW("QMI_IPA_GET_DATA_STATS_RESP_V01 received\n");
|
||||
|
||||
return ipa_check_qmi_response(rc,
|
||||
QMI_IPA_GET_DATA_STATS_REQ_V01, resp->resp.result,
|
||||
|
@ -1124,7 +1124,7 @@ int ipa_qmi_get_network_stats(struct ipa_get_apn_data_stats_req_msg_v01 *req,
|
|||
resp_desc.msg_id = QMI_IPA_GET_APN_DATA_STATS_RESP_V01;
|
||||
resp_desc.ei_array = ipa_get_apn_data_stats_resp_msg_data_v01_ei;
|
||||
|
||||
IPAWANDBG("Sending QMI_IPA_GET_APN_DATA_STATS_REQ_V01\n");
|
||||
IPAWANDBG_LOW("Sending QMI_IPA_GET_APN_DATA_STATS_REQ_V01\n");
|
||||
if (unlikely(!ipa_q6_clnt))
|
||||
return -ETIMEDOUT;
|
||||
rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req,
|
||||
|
@ -1133,7 +1133,7 @@ int ipa_qmi_get_network_stats(struct ipa_get_apn_data_stats_req_msg_v01 *req,
|
|||
sizeof(struct ipa_get_apn_data_stats_resp_msg_v01),
|
||||
QMI_SEND_STATS_REQ_TIMEOUT_MS);
|
||||
|
||||
IPAWANDBG("QMI_IPA_GET_APN_DATA_STATS_RESP_V01 received\n");
|
||||
IPAWANDBG_LOW("QMI_IPA_GET_APN_DATA_STATS_RESP_V01 received\n");
|
||||
|
||||
return ipa_check_qmi_response(rc,
|
||||
QMI_IPA_GET_APN_DATA_STATS_REQ_V01, resp->resp.result,
|
||||
|
@ -1157,7 +1157,7 @@ int ipa_qmi_set_data_quota(struct ipa_set_data_usage_quota_req_msg_v01 *req)
|
|||
resp_desc.msg_id = QMI_IPA_SET_DATA_USAGE_QUOTA_RESP_V01;
|
||||
resp_desc.ei_array = ipa_set_data_usage_quota_resp_msg_data_v01_ei;
|
||||
|
||||
IPAWANDBG("Sending QMI_IPA_SET_DATA_USAGE_QUOTA_REQ_V01\n");
|
||||
IPAWANDBG_LOW("Sending QMI_IPA_SET_DATA_USAGE_QUOTA_REQ_V01\n");
|
||||
if (unlikely(!ipa_q6_clnt))
|
||||
return -ETIMEDOUT;
|
||||
rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req,
|
||||
|
@ -1165,7 +1165,7 @@ int ipa_qmi_set_data_quota(struct ipa_set_data_usage_quota_req_msg_v01 *req)
|
|||
&resp_desc, &resp, sizeof(resp),
|
||||
QMI_SEND_STATS_REQ_TIMEOUT_MS);
|
||||
|
||||
IPAWANDBG("QMI_IPA_SET_DATA_USAGE_QUOTA_RESP_V01 received\n");
|
||||
IPAWANDBG_LOW("QMI_IPA_SET_DATA_USAGE_QUOTA_RESP_V01 received\n");
|
||||
|
||||
return ipa_check_qmi_response(rc,
|
||||
QMI_IPA_SET_DATA_USAGE_QUOTA_REQ_V01, resp.resp.result,
|
||||
|
@ -1192,14 +1192,14 @@ int ipa_qmi_stop_data_qouta(void)
|
|||
resp_desc.msg_id = QMI_IPA_STOP_DATA_USAGE_QUOTA_RESP_V01;
|
||||
resp_desc.ei_array = ipa_stop_data_usage_quota_resp_msg_data_v01_ei;
|
||||
|
||||
IPAWANDBG("Sending QMI_IPA_STOP_DATA_USAGE_QUOTA_REQ_V01\n");
|
||||
IPAWANDBG_LOW("Sending QMI_IPA_STOP_DATA_USAGE_QUOTA_REQ_V01\n");
|
||||
if (unlikely(!ipa_q6_clnt))
|
||||
return -ETIMEDOUT;
|
||||
rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, &req, sizeof(req),
|
||||
&resp_desc, &resp, sizeof(resp),
|
||||
QMI_SEND_STATS_REQ_TIMEOUT_MS);
|
||||
|
||||
IPAWANDBG("QMI_IPA_STOP_DATA_USAGE_QUOTA_RESP_V01 received\n");
|
||||
IPAWANDBG_LOW("QMI_IPA_STOP_DATA_USAGE_QUOTA_RESP_V01 received\n");
|
||||
|
||||
return ipa_check_qmi_response(rc,
|
||||
QMI_IPA_STOP_DATA_USAGE_QUOTA_REQ_V01, resp.resp.result,
|
||||
|
|
|
@ -31,9 +31,39 @@
|
|||
#define SUBSYS_MODEM "modem"
|
||||
|
||||
#define IPAWANDBG(fmt, args...) \
|
||||
pr_debug(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_debug(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPAWANDBG_LOW(fmt, args...) \
|
||||
do { \
|
||||
pr_debug(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPAWANERR(fmt, args...) \
|
||||
pr_err(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args)
|
||||
do { \
|
||||
pr_err(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IPAWANINFO(fmt, args...) \
|
||||
do { \
|
||||
pr_info(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
|
||||
DEV_NAME " %s:%d " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
|
||||
extern struct ipa_qmi_context *ipa_qmi_ctx;
|
||||
extern struct mutex ipa_qmi_lock;
|
||||
|
|
|
@ -87,7 +87,7 @@ int __ipa_generate_rt_hw_rule_v2(enum ipa_ip_type ip,
|
|||
return -EPERM;
|
||||
}
|
||||
|
||||
IPADBG("en_rule 0x%x\n", en_rule);
|
||||
IPADBG_LOW("en_rule 0x%x\n", en_rule);
|
||||
|
||||
rule_hdr->u.hdr.en_rule = en_rule;
|
||||
ipa_write_32(rule_hdr->u.word, (u8 *)rule_hdr);
|
||||
|
@ -490,7 +490,9 @@ static void __ipa_reap_sys_rt_tbls(enum ipa_ip_type ip)
|
|||
set = &ipa_ctx->rt_tbl_set[ip];
|
||||
list_for_each_entry(tbl, &set->head_rt_tbl_list, link) {
|
||||
if (tbl->prev_mem.phys_base) {
|
||||
IPADBG("reaping rt tbl name=%s ip=%d\n", tbl->name, ip);
|
||||
IPADBG_LOW("reaping rt");
|
||||
IPADBG_LOW("tbl name=%s ip=%d\n",
|
||||
tbl->name, ip);
|
||||
dma_free_coherent(ipa_ctx->pdev, tbl->prev_mem.size,
|
||||
tbl->prev_mem.base,
|
||||
tbl->prev_mem.phys_base);
|
||||
|
@ -503,8 +505,9 @@ static void __ipa_reap_sys_rt_tbls(enum ipa_ip_type ip)
|
|||
list_del(&tbl->link);
|
||||
WARN_ON(tbl->prev_mem.phys_base != 0);
|
||||
if (tbl->curr_mem.phys_base) {
|
||||
IPADBG("reaping sys rt tbl name=%s ip=%d\n", tbl->name,
|
||||
ip);
|
||||
IPADBG_LOW("reaping sys");
|
||||
IPADBG_LOW("rt tbl name=%s ip=%d\n",
|
||||
tbl->name, ip);
|
||||
dma_free_coherent(ipa_ctx->pdev, tbl->curr_mem.size,
|
||||
tbl->curr_mem.base,
|
||||
tbl->curr_mem.phys_base);
|
||||
|
@ -931,7 +934,7 @@ static int __ipa_del_rt_tbl(struct ipa_rt_tbl *entry)
|
|||
list_del(&entry->link);
|
||||
clear_bit(entry->idx, &ipa_ctx->rt_idx_bitmap[ip]);
|
||||
entry->set->tbl_cnt--;
|
||||
IPADBG("del rt tbl_idx=%d tbl_cnt=%d\n", entry->idx,
|
||||
IPADBG_LOW("del rt tbl_idx=%d tbl_cnt=%d\n", entry->idx,
|
||||
entry->set->tbl_cnt);
|
||||
kmem_cache_free(ipa_ctx->rt_tbl_cache, entry);
|
||||
} else {
|
||||
|
@ -939,7 +942,7 @@ static int __ipa_del_rt_tbl(struct ipa_rt_tbl *entry)
|
|||
&ipa_ctx->reap_rt_tbl_set[ip].head_rt_tbl_list);
|
||||
clear_bit(entry->idx, &ipa_ctx->rt_idx_bitmap[ip]);
|
||||
entry->set->tbl_cnt--;
|
||||
IPADBG("del sys rt tbl_idx=%d tbl_cnt=%d\n", entry->idx,
|
||||
IPADBG_LOW("del sys rt tbl_idx=%d tbl_cnt=%d\n", entry->idx,
|
||||
entry->set->tbl_cnt);
|
||||
}
|
||||
|
||||
|
@ -1019,7 +1022,8 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name,
|
|||
WARN_ON(1);
|
||||
goto ipa_insert_failed;
|
||||
}
|
||||
IPADBG("add rt rule tbl_idx=%d rule_cnt=%d\n", tbl->idx, tbl->rule_cnt);
|
||||
IPADBG_LOW("add rt rule tbl_idx=%d", tbl->idx);
|
||||
IPADBG_LOW("rule_cnt=%d\n", tbl->rule_cnt);
|
||||
*rule_hdl = id;
|
||||
entry->id = id;
|
||||
|
||||
|
@ -1103,7 +1107,7 @@ int __ipa_del_rt_rule(u32 rule_hdl)
|
|||
__ipa_release_hdr_proc_ctx(entry->proc_ctx->id);
|
||||
list_del(&entry->link);
|
||||
entry->tbl->rule_cnt--;
|
||||
IPADBG("del rt rule tbl_idx=%d rule_cnt=%d\n", entry->tbl->idx,
|
||||
IPADBG_LOW("del rt rule tbl_idx=%d rule_cnt=%d\n", entry->tbl->idx,
|
||||
entry->tbl->rule_cnt);
|
||||
if (entry->tbl->rule_cnt == 0 && entry->tbl->ref_cnt == 0) {
|
||||
if (__ipa_del_rt_tbl(entry->tbl))
|
||||
|
|
|
@ -1675,6 +1675,7 @@ int ipa_generate_hw_rule(enum ipa_ip_type ip,
|
|||
* OFFSET_MEQ32_0 with mask of 0 and val of 0 and offset 0
|
||||
*/
|
||||
if (attrib->attrib_mask == 0) {
|
||||
IPADBG_LOW("building default rule\n");
|
||||
if (ipa_ofst_meq32[ofst_meq32] == -1) {
|
||||
IPAERR("ran out of meq32 eq\n");
|
||||
return -EPERM;
|
||||
|
@ -4913,13 +4914,17 @@ static int ipa2_stop_gsi_channel(u32 clnt_hdl)
|
|||
|
||||
static void *ipa2_get_ipc_logbuf(void)
|
||||
{
|
||||
/* no support for IPC logging in IPAv2 */
|
||||
if (ipa_ctx)
|
||||
return ipa_ctx->logbuf;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *ipa2_get_ipc_logbuf_low(void)
|
||||
{
|
||||
/* no support for IPC logging in IPAv2 */
|
||||
if (ipa_ctx)
|
||||
return ipa_ctx->logbuf_low;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -1052,7 +1052,7 @@ static int ipa_wwan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct ipa_tx_meta meta;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_MAP)) {
|
||||
IPAWANDBG
|
||||
IPAWANDBG_LOW
|
||||
("SW filtering out none QMAP packet received from %s",
|
||||
current->comm);
|
||||
dev_kfree_skb_any(skb);
|
||||
|
@ -1077,7 +1077,8 @@ static int ipa_wwan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (atomic_read(&wwan_ptr->outstanding_pkts) >=
|
||||
wwan_ptr->outstanding_high) {
|
||||
if (!qmap_check) {
|
||||
IPAWANDBG("pending(%d)/(%d)- stop(%d), qmap_chk(%d)\n",
|
||||
IPAWANDBG_LOW
|
||||
("pending(%d)/(%d)- stop(%d), qmap_chk(%d)\n",
|
||||
atomic_read(&wwan_ptr->outstanding_pkts),
|
||||
wwan_ptr->outstanding_high,
|
||||
netif_queue_stopped(dev),
|
||||
|
@ -1171,7 +1172,8 @@ static void apps_ipa_tx_complete_notify(void *priv,
|
|||
netif_queue_stopped(wwan_ptr->net) &&
|
||||
atomic_read(&wwan_ptr->outstanding_pkts) <
|
||||
(wwan_ptr->outstanding_low)) {
|
||||
IPAWANDBG("Outstanding low (%d) - wake up queue\n",
|
||||
IPAWANDBG_LOW
|
||||
("Outstanding low (%d) - wake up queue\n",
|
||||
wwan_ptr->outstanding_low);
|
||||
netif_wake_queue(wwan_ptr->net);
|
||||
}
|
||||
|
@ -1201,7 +1203,7 @@ static void apps_ipa_packet_receive_notify(void *priv,
|
|||
int result;
|
||||
unsigned int packet_len = skb->len;
|
||||
|
||||
IPAWANDBG("Rx packet was received");
|
||||
IPAWANDBG_LOW("Rx packet was received");
|
||||
skb->dev = ipa_netdevs[0];
|
||||
skb->protocol = htons(ETH_P_MAP);
|
||||
|
||||
|
@ -1763,10 +1765,10 @@ static void q6_rm_notify_cb(void *user_data,
|
|||
{
|
||||
switch (event) {
|
||||
case IPA_RM_RESOURCE_GRANTED:
|
||||
IPAWANDBG("%s: Q6_PROD GRANTED CB\n", __func__);
|
||||
IPAWANDBG_LOW("%s: Q6_PROD GRANTED CB\n", __func__);
|
||||
break;
|
||||
case IPA_RM_RESOURCE_RELEASED:
|
||||
IPAWANDBG("%s: Q6_PROD RELEASED CB\n", __func__);
|
||||
IPAWANDBG_LOW("%s: Q6_PROD RELEASED CB\n", __func__);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
|
@ -1873,7 +1875,7 @@ static void wake_tx_queue(struct work_struct *work)
|
|||
*/
|
||||
static void ipa_rm_resource_granted(void *dev)
|
||||
{
|
||||
IPAWANDBG("Resource Granted - starting queue\n");
|
||||
IPAWANDBG_LOW("Resource Granted - starting queue\n");
|
||||
schedule_work(&ipa_tx_wakequeue_work);
|
||||
}
|
||||
|
||||
|
@ -2246,7 +2248,7 @@ static int rmnet_ipa_ap_suspend(struct device *dev)
|
|||
struct net_device *netdev = ipa_netdevs[0];
|
||||
struct wwan_private *wwan_ptr = netdev_priv(netdev);
|
||||
|
||||
IPAWANDBG("Enter...\n");
|
||||
IPAWANDBG_LOW("Enter...\n");
|
||||
/* Do not allow A7 to suspend in case there are oustanding packets */
|
||||
if (atomic_read(&wwan_ptr->outstanding_pkts) != 0) {
|
||||
IPAWANDBG("Outstanding packets, postponing AP suspend.\n");
|
||||
|
@ -2257,7 +2259,7 @@ static int rmnet_ipa_ap_suspend(struct device *dev)
|
|||
netif_tx_lock_bh(netdev);
|
||||
ipa_rm_release_resource(IPA_RM_RESOURCE_WWAN_0_PROD);
|
||||
netif_tx_unlock_bh(netdev);
|
||||
IPAWANDBG("Exit\n");
|
||||
IPAWANDBG_LOW("Exit\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2276,9 +2278,9 @@ static int rmnet_ipa_ap_resume(struct device *dev)
|
|||
{
|
||||
struct net_device *netdev = ipa_netdevs[0];
|
||||
|
||||
IPAWANDBG("Enter...\n");
|
||||
IPAWANDBG_LOW("Enter...\n");
|
||||
netif_wake_queue(netdev);
|
||||
IPAWANDBG("Exit\n");
|
||||
IPAWANDBG_LOW("Exit\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2355,6 +2357,7 @@ static int ssr_notifier_cb(struct notifier_block *this,
|
|||
return NOTIFY_DONE;
|
||||
}
|
||||
}
|
||||
IPAWANDBG_LOW("Exit\n");
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
|
@ -2658,7 +2661,7 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data,
|
|||
IPAWANERR("reset the pipe stats\n");
|
||||
} else {
|
||||
/* print tethered-client enum */
|
||||
IPAWANDBG("Tethered-client enum(%d)\n", data->ipa_client);
|
||||
IPAWANDBG_LOW("Tethered-client enum(%d)\n", data->ipa_client);
|
||||
}
|
||||
|
||||
rc = ipa_qmi_get_data_stats(req, resp);
|
||||
|
@ -2676,10 +2679,11 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data,
|
|||
if (resp->dl_dst_pipe_stats_list_valid) {
|
||||
for (pipe_len = 0; pipe_len < resp->dl_dst_pipe_stats_list_len;
|
||||
pipe_len++) {
|
||||
IPAWANDBG("Check entry(%d) dl_dst_pipe(%d)\n",
|
||||
IPAWANDBG_LOW("Check entry(%d) dl_dst_pipe(%d)\n",
|
||||
pipe_len, resp->dl_dst_pipe_stats_list
|
||||
[pipe_len].pipe_index);
|
||||
IPAWANDBG("dl_p_v4(%lu)v6(%lu) dl_b_v4(%lu)v6(%lu)\n",
|
||||
IPAWANDBG_LOW
|
||||
("dl_p_v4(%lu)v6(%lu) dl_b_v4(%lu)v6(%lu)\n",
|
||||
(unsigned long int) resp->
|
||||
dl_dst_pipe_stats_list[pipe_len].
|
||||
num_ipv4_packets,
|
||||
|
@ -2715,7 +2719,7 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data,
|
|||
}
|
||||
}
|
||||
}
|
||||
IPAWANDBG("v4_rx_p(%lu) v6_rx_p(%lu) v4_rx_b(%lu) v6_rx_b(%lu)\n",
|
||||
IPAWANDBG_LOW("v4_rx_p(%lu) v6_rx_p(%lu) v4_rx_b(%lu) v6_rx_b(%lu)\n",
|
||||
(unsigned long int) data->ipv4_rx_packets,
|
||||
(unsigned long int) data->ipv6_rx_packets,
|
||||
(unsigned long int) data->ipv4_rx_bytes,
|
||||
|
@ -2724,11 +2728,12 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data,
|
|||
if (resp->ul_src_pipe_stats_list_valid) {
|
||||
for (pipe_len = 0; pipe_len < resp->ul_src_pipe_stats_list_len;
|
||||
pipe_len++) {
|
||||
IPAWANDBG("Check entry(%d) ul_dst_pipe(%d)\n",
|
||||
IPAWANDBG_LOW("Check entry(%d) ul_dst_pipe(%d)\n",
|
||||
pipe_len,
|
||||
resp->ul_src_pipe_stats_list[pipe_len].
|
||||
pipe_index);
|
||||
IPAWANDBG("ul_p_v4(%lu)v6(%lu)ul_b_v4(%lu)v6(%lu)\n",
|
||||
IPAWANDBG_LOW
|
||||
("ul_p_v4(%lu)v6(%lu)ul_b_v4(%lu)v6(%lu)\n",
|
||||
(unsigned long int) resp->
|
||||
ul_src_pipe_stats_list[pipe_len].
|
||||
num_ipv4_packets,
|
||||
|
@ -2764,7 +2769,7 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data,
|
|||
}
|
||||
}
|
||||
}
|
||||
IPAWANDBG("tx_p_v4(%lu)v6(%lu)tx_b_v4(%lu) v6(%lu)\n",
|
||||
IPAWANDBG_LOW("tx_p_v4(%lu)v6(%lu)tx_b_v4(%lu) v6(%lu)\n",
|
||||
(unsigned long int) data->ipv4_tx_packets,
|
||||
(unsigned long int) data->ipv6_tx_packets,
|
||||
(unsigned long int) data->ipv4_tx_bytes,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -145,8 +145,7 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
case WAN_IOC_POLL_TETHERING_STATS:
|
||||
IPAWANDBG("device %s got WAN_IOCTL_POLL_TETHERING_STATS :>>>\n",
|
||||
DRIVER_NAME);
|
||||
IPAWANDBG_LOW("got WAN_IOCTL_POLL_TETHERING_STATS :>>>\n");
|
||||
pyld_sz = sizeof(struct wan_ioctl_poll_tethering_stats);
|
||||
param = kzalloc(pyld_sz, GFP_KERNEL);
|
||||
if (!param) {
|
||||
|
@ -170,8 +169,7 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
case WAN_IOC_SET_DATA_QUOTA:
|
||||
IPAWANDBG("device %s got WAN_IOCTL_SET_DATA_QUOTA :>>>\n",
|
||||
DRIVER_NAME);
|
||||
IPAWANDBG_LOW("got WAN_IOCTL_SET_DATA_QUOTA :>>>\n");
|
||||
pyld_sz = sizeof(struct wan_ioctl_set_data_quota);
|
||||
param = kzalloc(pyld_sz, GFP_KERNEL);
|
||||
if (!param) {
|
||||
|
@ -195,8 +193,7 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
case WAN_IOC_SET_TETHER_CLIENT_PIPE:
|
||||
IPAWANDBG("device %s got WAN_IOC_SET_TETHER_CLIENT_PIPE :>>>\n",
|
||||
DRIVER_NAME);
|
||||
IPAWANDBG_LOW("got WAN_IOC_SET_TETHER_CLIENT_PIPE :>>>\n");
|
||||
pyld_sz = sizeof(struct wan_ioctl_set_tether_client_pipe);
|
||||
param = kzalloc(pyld_sz, GFP_KERNEL);
|
||||
if (!param) {
|
||||
|
@ -216,8 +213,7 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
case WAN_IOC_QUERY_TETHER_STATS:
|
||||
IPAWANDBG("device %s got WAN_IOC_QUERY_TETHER_STATS :>>>\n",
|
||||
DRIVER_NAME);
|
||||
IPAWANDBG_LOW("got WAN_IOC_QUERY_TETHER_STATS :>>>\n");
|
||||
pyld_sz = sizeof(struct wan_ioctl_query_tether_stats);
|
||||
param = kzalloc(pyld_sz, GFP_KERNEL);
|
||||
if (!param) {
|
||||
|
@ -243,8 +239,7 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
case WAN_IOC_RESET_TETHER_STATS:
|
||||
IPAWANDBG("device %s got WAN_IOC_RESET_TETHER_STATS :>>>\n",
|
||||
DRIVER_NAME);
|
||||
IPAWANDBG_LOW("got WAN_IOC_RESET_TETHER_STATS :>>>\n");
|
||||
pyld_sz = sizeof(struct wan_ioctl_reset_tether_stats);
|
||||
param = kzalloc(pyld_sz, GFP_KERNEL);
|
||||
if (!param) {
|
||||
|
|
Loading…
Add table
Reference in a new issue