Пример #1
0
static int hsi_ch_tty_write(int chno, void *data, int len)
{
	void *buf = NULL;
	int err;
  
	buf = hsi_mem_alloc(len);
  
	if (!buf)
		return -ENOMEM;
    
	//printk("\n data = %c, len = %d\n",((char*)data)[0], len);
    
	memcpy(buf, data, len);

	hsi_channels[chno].write_happening = HSI_TRUE;
  
	err = hsi_ll_write(chno, (unsigned char *)buf, len);
	if (err < 0) {
#if MCM_DBG_ERR_LOG
		printk("\nmcm: hsi_ll_write failed\n");
#endif
		hsi_channels[chno].write_happening = HSI_FALSE;
	}
  
	if (hsi_channels[chno].write_happening == HSI_TRUE) { //spinlock may be used for write_happening
#if MCM_DBG_LOG
		printk("\nmcm:locking mutex for ch: %d\n",chno);
#endif
		wait_event(hsi_channels[chno].write_wait, hsi_channels[chno].write_happening == HSI_FALSE);
	}
  
	return err;
}
Пример #2
0
static int hsi_ch_tty_write(int chno, void *data, int len)
{
	void *buf = NULL;
	int err;

	buf = hsi_mem_alloc(len);

	if (!buf) {
		return -ENOMEM;
	}

	memcpy(buf, data, len);

	hsi_channels[chno].write_happening = HSI_TRUE;

	err = hsi_ll_write(chno, (unsigned char *)buf, len);
	
	if (err < 0) {
#if MCM_DBG_ERR_LOG
		printk("\nmcm: hsi_ll_write(...) failed. err=%d\n",err);
#endif

/* Should free in error case */
#if 1
		hsi_mem_free(buf);
#endif

		hsi_channels[chno].write_happening = HSI_FALSE;
	}
#if defined(MIPI_HSI_TTY_WRITE_TIMEOUT_FEATURE)	
	else {
#if MCM_DBG_LOG
		printk("\nmcm:locking mutex start for ch: %d\n", chno);
#endif

#if defined (TARGET_CARRIER_ATT) && !defined (MIPI_HSI_CHECK_CP_RX_INFO)
		if(chno == XMD_TTY_CIQ_CHANNEL) {
			wait_event(hsi_channels[chno].write_wait,
				hsi_channels[chno].write_happening == HSI_FALSE);
#if MCM_DBG_LOG
			printk("\nmcm:locking mutex end for ch: %d\n", chno);
#endif
		}
		else
#endif 
		{
			err = hsi_ch_write_timeout(chno, buf);

#if MCM_DBG_LOG
			if (err < 0)
				printk("\nmcm:hsi_ch_write_timeout ret %d for ch: %d\n", err, chno);
#endif
		}

#if defined(HSI_MCM_NOTIFY_TO_CHARGER)
		hsi_ch_notify_to_charger(err);
#endif
	}
#else 
	else {
Пример #3
0
static int hsi_ch_tty_write(int chno, void *data, int len)
{
	void *buf = NULL;
	int err;

	buf = hsi_mem_alloc(len);

	if (!buf) {
		return -ENOMEM;
	}

	memcpy(buf, data, len);

	hsi_channels[chno].write_happening = HSI_TRUE;

	err = hsi_ll_write(chno, (unsigned char *)buf, len);
	if (err < 0) {
#if MCM_DBG_ERR_LOG
		printk("\nmcm: hsi_ll_write(...) failed. err=%d\n",err);
#endif
		hsi_channels[chno].write_happening = HSI_FALSE;
	} else {
#if MCM_DBG_LOG
		printk("\nmcm:locking mutex for ch: %d\n",chno);
#endif
/*                                                                                       */
#if 0  //ORGINAL
		wait_event (hsi_channels[chno].write_wait,
					hsi_channels[chno].write_happening == HSI_FALSE);
#else  //RIL Recovery fail patch
		wait_event_timeout (hsi_channels[chno].write_wait,
							hsi_channels[chno].write_happening == HSI_FALSE,
							HSI_MCM_TTY_TX_TIMEOUT_VAL);
		if (hsi_channels[chno].write_happening == HSI_TRUE){
			printk("mcm:[RIL Recovery]hsi_ch_tty_write failed. err= -9\n");
			err = -9;
			}
#endif
/*                                                                                     */
	}

	return err;
}
Пример #4
0
void hsi_write_work(struct work_struct *work)
{
	//function registered with write work q
	struct hsi_channel *ch = (struct hsi_channel*) container_of(work, struct hsi_channel,write_work);
	int chno = ch->info->chno;
	struct x_data *data = NULL;
	int err;

	if (hsi_channels[chno].write_queued == HSI_TRUE) {
#if MCM_DBG_ERR_LOG
		printk("\nmcm: write wq already in progress\n");
#endif
		return;
	}
  
	hsi_channels[chno].write_queued = HSI_TRUE;
  
	while ((data = read_q(chno, &hsi_channels[chno].tx_q)) != NULL) {
		hsi_channels[chno].write_happening = HSI_TRUE; //spinlock may be used for read_happening
		data->being_used = HSI_TRUE;
		err = hsi_ll_write(chno, (unsigned char *)data->buf, data->size);
		if (err < 0) {
#if MCM_DBG_ERR_LOG
			printk("\nmcm: hsi_ll_write failed\n");
#endif
			hsi_channels[chno].write_happening = HSI_FALSE;
		}
    
		if (hsi_channels[chno].write_happening == HSI_TRUE) { //spinlock may be used for write_happening
#if MCM_DBG_LOG
			printk("\nmcm:locking mutex for ch: %d\n",chno);
#endif
			wait_event(hsi_channels[chno].write_wait, hsi_channels[chno].write_happening == HSI_FALSE);
		}
		data->being_used = HSI_FALSE;
	}
	hsi_channels[chno].write_queued = HSI_FALSE;
}
Пример #5
0
void hsi_write_work(struct work_struct *work)
{
	/* function registered with write work q */
	struct hsi_channel *ch = (struct hsi_channel*) container_of(work,
													struct hsi_channel,
													write_work);
	int chno = ch->info->chno;
	struct x_data *data = NULL;
	int err;

//                                                  
/* RIL recovery memory initialization  */
#if 0
	if (hsi_mcm_state == HSI_MCM_STATE_ERR_RECOVERY) {
#if MCM_DBG_ERR_RECOVERY_LOG
		printk("\nmcm:Dropping packets of channel %d from WQ as error recovery is in progress\n", chno);
#endif
		goto quit_write_wq;
	}
#endif
//                                                

	if (hsi_channels[chno].write_queued == HSI_TRUE) {
#if MCM_DBG_LOG
		printk("\nmcm: write wq already in progress\n");
#endif
		return;
	}

	hsi_channels[chno].write_queued = HSI_TRUE;

	while ((data = read_q(chno, &hsi_channels[chno].tx_q)) != NULL) {
//                                                  
/* RIL recovery memory initialization  */
#if 1
		if (hsi_mcm_state == HSI_MCM_STATE_ERR_RECOVERY) {
#if MCM_DBG_ERR_RECOVERY_LOG
			printk("\nmcm:Dropping packets of channel %d from WQ "
					"as error recovery is in progress\n", chno);
#endif
			hsi_mem_free(data->buf);
			continue;
		}
#endif
//                                                
		hsi_channels[chno].write_happening = HSI_TRUE;
		data->being_used = HSI_TRUE;
		err = hsi_ll_write(chno, (unsigned char *)data->buf, data->size);
		if (err < 0) {
#if MCM_DBG_ERR_LOG
			printk("\nmcm: hsi_ll_write failed\n");
#endif
			hsi_channels[chno].write_happening = HSI_FALSE;
		} else {
#if MCM_DBG_LOG
			printk("\nmcm:locking mutex for ch: %d\n",chno);
#endif
			wait_event(hsi_channels[chno].write_wait,
						hsi_channels[chno].write_happening == HSI_FALSE);
		}
		hsi_channels[chno].pending_tx_msgs--;
		data->being_used = HSI_FALSE;

		if (hsi_channels[chno].tx_blocked == 1) {
			hsi_channels[chno].tx_blocked = 0;
//#if MCM_DBG_LOG
			printk("\nmcm: Channel queue free , restarting TX queue for ch %d \n",chno);
//#endif
			rmnet_restart_queue(chno);
		}
	}

//                                                  
#if 0
/* RIL recovery memory initialization  */
quit_write_wq:
#endif
//                                                
	hsi_channels[chno].write_queued = HSI_FALSE;
}
Пример #6
0
static int hsi_ch_write_timeout(int chno, void *buf, long timeout)
{
	int err = 0, rc = 0, i =0;

#if 1
	while (1) {
		i++;
#else		
	for (i = 0; i < HSI_WRITE_TIMEOUT_TRY; i++) {
#endif
		
		rc = wait_event_timeout(hsi_channels[chno].write_wait,
				hsi_channels[chno].write_happening == HSI_FALSE, timeout);

		if( hsi_mcm_state == HSI_MCM_STATE_ERR_RECOVERY) {
#if MCM_DBG_LOG
			printk("\nmcm:locking 1st mutex end for ch: %d\n", chno);
#endif
			err= -EREMOTEIO;
			break;
		}

		if (rc == 0) {
			int ret = hsi_ll_check_channel(chno);

			
			if(ret == -EPERM) {
				err = -EREMOTEIO;
				
				hsi_channels[chno].write_happening = HSI_FALSE;
				hsi_ll_reset_write_channel(chno);
				hsi_mem_free(buf);
#if MCM_DBG_ERR_LOG
				printk("\nmcm: hsi_ll_check_channel - hsi_ch_write_timeout(...) failed\n");
#endif
				break;
			}
			
			else if(ret == -EACCES){
				hsi_channels[chno].write_happening = HSI_FALSE;
				err = -EREMOTEIO;
				
#if MCM_DBG_ERR_LOG
				printk("\nmcm:unlocking 1st mutex end for ch: %d\n", chno);
#endif
				break;				
			}
#if 0
			
			else if(ret == -EAGAIN){
				rc = wait_event_timeout(hsi_channels[chno].write_wait,
						hsi_channels[chno].write_happening == HSI_FALSE, timeout);

				if (rc == 0) {
					err = -EREMOTEIO;
					hsi_ll_reset_write_channel(chno);
					hsi_mem_free(buf);
#if MCM_DBG_ERR_LOG
					printk("\nmcm: hsi_ll_check_channel - 2st hsi_ch_write_timeout(...) failed\n");
#endif
				}
				else {
					err = 0;
#if MCM_DBG_LOG
					printk("\nmcm:unlocking 2st mutex end for ch: %d\n", chno);
#endif
				}
			}
#endif
			
			else if(ret == -EBUSY){
#if 1
			
#if MCM_DBG_ERR_LOG
				if(i % HSI_WRITE_TIMEOUT_TRY == 0)
					printk("\nmcm:hsi_ch_write_timeout - EBUSY for ch: %d\n", chno);
#endif
				err = -EBUSY;
#else
				wait_event(hsi_channels[chno].write_wait,
					hsi_channels[chno].write_happening == HSI_FALSE);
				err = 0;
#if MCM_DBG_LOG
				printk("\nmcm:unlocking 3st mutex end for ch: %d\n", chno);
#endif
#endif
			}
		
			else {
				err = 0;
#if MCM_DBG_LOG
				printk("\nmcm:unlocking 4st mutex end for ch: %d\n", chno);
#endif
				break;
			}
		}
	
		else { 
			err = 0;
#if MCM_DBG_LOG
			printk("\nmcm:unlocking 4st mutex end for ch: %d\n", chno);
#endif
			break;
		}
	}

#if 0
	if(err == -EBUSY) {
		err = 0;

		hsi_channels[chno].write_happening = HSI_FALSE;
		hsi_ll_reset_write_channel(chno);
		hsi_mem_free(buf);
#if MCM_DBG_ERR_LOG
		printk("\nmcm: hsi_ll_check_channel - EBUSY(...) failed\n");
#endif		
	}
#endif

	return err;
}
#endif

static int hsi_ch_tty_write(int chno, void *data, int len)
{
	void *buf = NULL;
	int err;

	buf = hsi_mem_alloc(len);

	if (!buf) {
		return -ENOMEM;
	}

	memcpy(buf, data, len);

	hsi_channels[chno].write_happening = HSI_TRUE;

	err = hsi_ll_write(chno, (unsigned char *)buf, len);
	
	if (err < 0) {
#if MCM_DBG_ERR_LOG
		printk("\nmcm: hsi_ll_write(...) failed. err=%d\n",err);
#endif

/* Should free in error case */
#if 1
		hsi_mem_free(buf);
#endif


		hsi_channels[chno].write_happening = HSI_FALSE;
	}
#if defined(MIPI_HSI_TTY_WRITE_TIMEOUT_FEATURE)	
	else {
#if MCM_DBG_LOG
		printk("\nmcm:locking mutex start for ch: %d\n", chno);
#endif

#if defined (TARGET_CARRIER_ATT) && !defined (MIPI_HSI_CHECK_CP_RX_INFO)
	
		if(chno == XMD_TTY_CIQ_CHANNEL) {
			wait_event(hsi_channels[chno].write_wait,
				hsi_channels[chno].write_happening == HSI_FALSE);
#if MCM_DBG_LOG
			printk("\nmcm:locking mutex end for ch: %d\n", chno);
#endif
		}
		else
#endif 
		{
			err = hsi_ch_write_timeout(chno, buf, HSI_WRITE_TTY_TIMEOUT);

#if MCM_DBG_LOG
			if (err < 0)
				printk("\nmcm:hsi_ch_write_timeout ret %d for ch: %d\n", err, chno);
#endif
		}

#if defined(HSI_MCM_NOTIFY_TO_CHARGER)
		hsi_ch_notify_to_charger(err);
#endif
	}
#else 
	else {