ssize_t GPS_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { int retval = 0; int written = 0; down(&wr_mtx); /* GPS_TRC_FUNC(); */ /*printk("%s: count %d pos %lld\n", __func__, count, *f_pos); */ if (count > 0) { int copy_size = (count < MTKSTP_BUFFER_SIZE) ? count : MTKSTP_BUFFER_SIZE; if (copy_from_user(&o_buf[0], &buf[0], copy_size)) { retval = -EFAULT; goto out; } /* printk("%02x ", val); */ #if GPS_DEBUG_TRACE_GPIO mtk_wcn_stp_debug_gpio_assert(IDX_GPS_TX, DBG_TIE_LOW); #endif written = mtk_wcn_stp_send_data(&o_buf[0], copy_size, GPS_TASK_INDX); #if GPS_DEBUG_TRACE_GPIO mtk_wcn_stp_debug_gpio_assert(IDX_GPS_TX, DBG_TIE_HIGH); #endif #if GPS_DEBUG_DUMP { unsigned char *buf_ptr = &o_buf[0]; int k = 0; pr_debug("--[GPS-WRITE]--"); for (k = 0; k < 10; k++) { if (k % 16 == 0) pr_debug("\n"); pr_debug("0x%02x ", o_buf[k]); } pr_debug("\n"); } #endif /* If cannot send successfully, enqueue again if (written != copy_size) { // George: FIXME! Move GPS retry handling from app to driver } */ if (0 == written) { retval = -ENOSPC; /*no windowspace in STP is available, native process should not call GPS_write with no delay at all */ GPS_ERR_FUNC("target packet length:%zd, write success length:%d, retval = %d.\n", count, written, retval); } else { retval = written; } } else { retval = -EFAULT; GPS_ERR_FUNC("target packet length:%zd is not allowed, retval = %d.\n", count, retval); } out: up(&wr_mtx); return retval; }
static void stp_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count) { #if 0 mtk_wcn_stp_debug_gpio_assert(IDX_STP_RX_PROC, DBG_TIE_LOW); #endif if(count > 2000){ /*this is abnormal*/ UART_ERR_FUNC("stp_uart_tty_receive buffer count = %d\n", count); } #if 0 { struct timeval now; do_gettimeofday(&now); printk("[+STP][ ][R] %4d --> sec = %d, --> usec --> %d\n", count, now.tv_sec, now.tv_usec); } #endif /*There are multi-context to access here? Need to spinlock?*/ /*Only one context: flush_to_ldisc in tty_buffer.c*/ mtk_wcn_stp_parser_data((UINT8 *)data, (UINT32)count); #if 0 mtk_wcn_stp_debug_gpio_assert(IDX_STP_RX_PROC, DBG_TIE_HIGH); #endif tty_unthrottle(tty); #if 0 { struct timeval now; do_gettimeofday(&now); printk("[-STP][ ][R] %4d --> sec = %d, --> usec --> %d\n", count, now.tv_sec, now.tv_usec); } #endif return; }
ssize_t GPS_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { long val = 0; int retval; down(&rd_mtx); /* printk("GPS_read(): count %d pos %lld\n", count, *f_pos);*/ if(count > MTKSTP_BUFFER_SIZE) { count = MTKSTP_BUFFER_SIZE; } #if GPS_DEBUG_TRACE_GPIO mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_LOW); #endif retval = mtk_wcn_stp_receive_data(i_buf, count, GPS_TASK_INDX); #if GPS_DEBUG_TRACE_GPIO mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_HIGH); #endif while(retval == 0) // got nothing, wait for STP's signal { /*wait_event(GPS_wq, flag != 0);*/ /* George: let signal wake up */ val = wait_event_interruptible(GPS_wq, flag != 0); flag = 0; #if GPS_DEBUG_TRACE_GPIO mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_LOW); #endif retval = mtk_wcn_stp_receive_data(i_buf, count, GPS_TASK_INDX); #if GPS_DEBUG_TRACE_GPIO mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_HIGH); #endif /* if we are signaled */ if (val) { if (-ERESTARTSYS == val) { GPS_INFO_FUNC("signaled by -ERESTARTSYS(%ld) \n ", val); } else { GPS_INFO_FUNC("signaled by %ld \n ", val); } break; } } #if GPS_DEBUG_DUMP { unsigned char *buf_ptr = &i_buf[0]; int k=0; printk("--[GPS-READ]--"); for(k=0; k < 10 ; k++){ if(k%16 == 0) printk("\n"); printk("0x%02x ", i_buf[k]); } printk("--\n"); } #endif if (retval) { // we got something from STP driver if (copy_to_user(buf, i_buf, retval)) { retval = -EFAULT; goto OUT; } else { /* success */ } } else { // we got nothing from STP driver, being signaled retval = val; } OUT: up(&rd_mtx); /* printk("GPS_read(): retval = %d\n", retval);*/ return (retval); }