diag: Add additional buffer for RIVA-APPS diag traffic.
DIAG forwarding uses two buffer to maintain traffic between peripheral
and APPS. Adding a second buffer for RIVA to improve performance.
Change-Id: I4bfa4739fca2bfa0cca72ec04fe351651d2ac241
Signed-off-by: Ashay Jaiswal <ashayj@codeaurora.org>
diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h
index cd32152..926bd69 100644
--- a/drivers/char/diag/diagchar.h
+++ b/drivers/char/diag/diagchar.h
@@ -164,7 +164,8 @@
unsigned char *buf_in_qdsp_1;
unsigned char *buf_in_qdsp_2;
unsigned char *buf_in_qdsp_cntl;
- unsigned char *buf_in_wcnss;
+ unsigned char *buf_in_wcnss_1;
+ unsigned char *buf_in_wcnss_2;
unsigned char *buf_in_wcnss_cntl;
unsigned char *usb_buf_out;
unsigned char *apps_rsp_buf;
@@ -183,7 +184,8 @@
int in_busy_2;
int in_busy_qdsp_1;
int in_busy_qdsp_2;
- int in_busy_wcnss;
+ int in_busy_wcnss_1;
+ int in_busy_wcnss_2;
int read_len_legacy;
unsigned char *hdlc_buf;
unsigned hdlc_count;
@@ -222,7 +224,8 @@
struct diag_request *write_ptr_svc;
struct diag_request *write_ptr_qdsp_1;
struct diag_request *write_ptr_qdsp_2;
- struct diag_request *write_ptr_wcnss;
+ struct diag_request *write_ptr_wcnss_1;
+ struct diag_request *write_ptr_wcnss_2;
int logging_mode;
int mask_check;
int logging_process_id;
diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c
index d9f12ac..7e2333a 100644
--- a/drivers/char/diag/diagchar_core.c
+++ b/drivers/char/diag/diagchar_core.c
@@ -424,7 +424,8 @@
driver->in_busy_2 = 1;
driver->in_busy_qdsp_1 = 1;
driver->in_busy_qdsp_2 = 1;
- driver->in_busy_wcnss = 1;
+ driver->in_busy_wcnss_1 = 1;
+ driver->in_busy_wcnss_2 = 1;
#ifdef CONFIG_DIAG_SDIO_PIPE
driver->in_busy_sdio = 1;
#endif
@@ -434,7 +435,8 @@
driver->in_busy_2 = 0;
driver->in_busy_qdsp_1 = 0;
driver->in_busy_qdsp_2 = 0;
- driver->in_busy_wcnss = 0;
+ driver->in_busy_wcnss_1 = 0;
+ driver->in_busy_wcnss_2 = 0;
/* Poll SMD channels to check for data*/
if (driver->ch)
queue_work(driver->diag_wq,
@@ -465,9 +467,10 @@
diagfwd_disconnect();
driver->in_busy_1 = 0;
driver->in_busy_2 = 0;
+ driver->in_busy_qdsp_1 = 0;
driver->in_busy_qdsp_2 = 0;
- driver->in_busy_qdsp_2 = 0;
- driver->in_busy_wcnss = 0;
+ driver->in_busy_wcnss_1 = 0;
+ driver->in_busy_wcnss_2 = 0;
/* Poll SMD channels to check for data*/
if (driver->ch)
queue_work(driver->diag_wq,
@@ -607,16 +610,27 @@
driver->in_busy_qdsp_2 = 0;
}
/* copy wncss data */
- if (driver->in_busy_wcnss == 1) {
+ if (driver->in_busy_wcnss_1 == 1) {
num_data++;
/*Copy the length of data being passed*/
COPY_USER_SPACE_OR_EXIT(buf+ret,
- (driver->write_ptr_wcnss->length), 4);
+ (driver->write_ptr_wcnss_1->length), 4);
/*Copy the actual data being passed*/
COPY_USER_SPACE_OR_EXIT(buf+ret, *(driver->
- buf_in_wcnss),
- driver->write_ptr_wcnss->length);
- driver->in_busy_wcnss = 0;
+ buf_in_wcnss_1),
+ driver->write_ptr_wcnss_1->length);
+ driver->in_busy_wcnss_1 = 0;
+ }
+ if (driver->in_busy_wcnss_2 == 1) {
+ num_data++;
+ /*Copy the length of data being passed*/
+ COPY_USER_SPACE_OR_EXIT(buf+ret,
+ (driver->write_ptr_wcnss_2->length), 4);
+ /*Copy the actual data being passed*/
+ COPY_USER_SPACE_OR_EXIT(buf+ret, *(driver->
+ buf_in_wcnss_2),
+ driver->write_ptr_wcnss_2->length);
+ driver->in_busy_wcnss_2 = 0;
}
#ifdef CONFIG_DIAG_SDIO_PIPE
/* copy 9K data over SDIO */
diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c
index 4cf6d33..a77d825 100644
--- a/drivers/char/diag/diagfwd.c
+++ b/drivers/char/diag/diagfwd.c
@@ -271,7 +271,8 @@
queue_work(driver->diag_wq, &(driver->
diag_read_smd_qdsp_work));
} else if (proc_num == WCNSS_DATA) {
- driver->in_busy_wcnss = 0;
+ driver->in_busy_wcnss_1 = 0;
+ driver->in_busy_wcnss_2 = 0;
queue_work(driver->diag_wq, &(driver->
diag_read_smd_wcnss_work));
}
@@ -343,11 +344,21 @@
void __diag_smd_wcnss_send_req(void)
{
- void *buf = driver->buf_in_wcnss;
- int *in_busy_wcnss_ptr = &(driver->in_busy_wcnss);
- struct diag_request *write_ptr_wcnss = driver->write_ptr_wcnss;
+ void *buf = NULL;
+ int *in_busy_wcnss_ptr = NULL;
+ struct diag_request *write_ptr_wcnss = NULL;
- if ((!driver->in_busy_wcnss) && driver->ch_wcnss && buf) {
+ if (!driver->in_busy_wcnss_1) {
+ buf = driver->buf_in_wcnss_1;
+ write_ptr_wcnss = driver->write_ptr_wcnss_1;
+ in_busy_wcnss_ptr = &(driver->in_busy_wcnss_1);
+ } else if (!driver->in_busy_wcnss_2) {
+ buf = driver->buf_in_wcnss_2;
+ write_ptr_wcnss = driver->write_ptr_wcnss_2;
+ in_busy_wcnss_ptr = &(driver->in_busy_wcnss_2);
+ }
+
+ if (driver->ch_wcnss && buf) {
int r = smd_read_avail(driver->ch_wcnss);
if (r > IN_BUF_SIZE) {
if (r < MAX_IN_BUF_SIZE) {
@@ -1248,7 +1259,8 @@
driver->in_busy_2 = 0;
driver->in_busy_qdsp_1 = 0;
driver->in_busy_qdsp_2 = 0;
- driver->in_busy_wcnss = 0;
+ driver->in_busy_wcnss_1 = 0;
+ driver->in_busy_wcnss_2 = 0;
/* Poll SMD channels to check for data*/
queue_work(driver->diag_wq, &(driver->diag_read_smd_work));
@@ -1282,7 +1294,8 @@
driver->in_busy_2 = 1;
driver->in_busy_qdsp_1 = 1;
driver->in_busy_qdsp_2 = 1;
- driver->in_busy_wcnss = 1;
+ driver->in_busy_wcnss_1 = 1;
+ driver->in_busy_wcnss_2 = 1;
}
#ifdef CONFIG_DIAG_SDIO_PIPE
if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa())
@@ -1314,8 +1327,13 @@
driver->in_busy_qdsp_2 = 0;
APPEND_DEBUG('P');
queue_work(driver->diag_wq, &(driver->diag_read_smd_qdsp_work));
- } else if (buf == (void *)driver->buf_in_wcnss) {
- driver->in_busy_wcnss = 0;
+ } else if (buf == driver->buf_in_wcnss_1) {
+ driver->in_busy_wcnss_1 = 0;
+ APPEND_DEBUG('r');
+ queue_work(driver->diag_wq,
+ &(driver->diag_read_smd_wcnss_work));
+ } else if (buf == driver->buf_in_wcnss_2) {
+ driver->in_busy_wcnss_2 = 0;
APPEND_DEBUG('R');
queue_work(driver->diag_wq,
&(driver->diag_read_smd_wcnss_work));
@@ -1568,11 +1586,17 @@
if (driver->buf_in_qdsp_2 == NULL)
goto err;
}
- if (driver->buf_in_wcnss == NULL) {
- driver->buf_in_wcnss = kzalloc(IN_BUF_SIZE, GFP_KERNEL);
- if (driver->buf_in_wcnss == NULL)
+ if (driver->buf_in_wcnss_1 == NULL) {
+ driver->buf_in_wcnss_1 = kzalloc(IN_BUF_SIZE, GFP_KERNEL);
+ if (driver->buf_in_wcnss_1 == NULL)
goto err;
}
+ if (driver->buf_in_wcnss_2 == NULL) {
+ driver->buf_in_wcnss_2 = kzalloc(IN_BUF_SIZE, GFP_KERNEL);
+ if (driver->buf_in_wcnss_2 == NULL)
+ goto err;
+ }
+
if (driver->buf_msg_mask_update == NULL) {
driver->buf_msg_mask_update = kzalloc(APPS_BUF_SIZE,
GFP_KERNEL);
@@ -1657,12 +1681,19 @@
if (driver->write_ptr_qdsp_2 == NULL)
goto err;
}
- if (driver->write_ptr_wcnss == NULL) {
- driver->write_ptr_wcnss = kzalloc(
+ if (driver->write_ptr_wcnss_1 == NULL) {
+ driver->write_ptr_wcnss_1 = kzalloc(
sizeof(struct diag_request), GFP_KERNEL);
- if (driver->write_ptr_wcnss == NULL)
+ if (driver->write_ptr_wcnss_1 == NULL)
goto err;
}
+ if (driver->write_ptr_wcnss_2 == NULL) {
+ driver->write_ptr_wcnss_2 = kzalloc(
+ sizeof(struct diag_request), GFP_KERNEL);
+ if (driver->write_ptr_wcnss_2 == NULL)
+ goto err;
+ }
+
if (driver->usb_read_ptr == NULL) {
driver->usb_read_ptr = kzalloc(
sizeof(struct diag_request), GFP_KERNEL);
@@ -1712,7 +1743,8 @@
kfree(driver->buf_in_2);
kfree(driver->buf_in_qdsp_1);
kfree(driver->buf_in_qdsp_2);
- kfree(driver->buf_in_wcnss);
+ kfree(driver->buf_in_wcnss_1);
+ kfree(driver->buf_in_wcnss_2);
kfree(driver->buf_msg_mask_update);
kfree(driver->buf_log_mask_update);
kfree(driver->buf_event_mask_update);
@@ -1730,7 +1762,8 @@
kfree(driver->write_ptr_2);
kfree(driver->write_ptr_qdsp_1);
kfree(driver->write_ptr_qdsp_2);
- kfree(driver->write_ptr_wcnss);
+ kfree(driver->write_ptr_wcnss_1);
+ kfree(driver->write_ptr_wcnss_2);
kfree(driver->usb_read_ptr);
kfree(driver->apps_rsp_buf);
kfree(driver->user_space_data);
@@ -1760,7 +1793,8 @@
kfree(driver->buf_in_2);
kfree(driver->buf_in_qdsp_1);
kfree(driver->buf_in_qdsp_2);
- kfree(driver->buf_in_wcnss);
+ kfree(driver->buf_in_wcnss_1);
+ kfree(driver->buf_in_wcnss_2);
kfree(driver->buf_msg_mask_update);
kfree(driver->buf_log_mask_update);
kfree(driver->buf_event_mask_update);
@@ -1778,7 +1812,8 @@
kfree(driver->write_ptr_2);
kfree(driver->write_ptr_qdsp_1);
kfree(driver->write_ptr_qdsp_2);
- kfree(driver->write_ptr_wcnss);
+ kfree(driver->write_ptr_wcnss_1);
+ kfree(driver->write_ptr_wcnss_2);
kfree(driver->usb_read_ptr);
kfree(driver->apps_rsp_buf);
kfree(driver->user_space_data);