Ejemplo n.º 1
0
static void wp_smd_diag_notify(void *priv, unsigned event)
{

	struct wp_diag_context *ctxt = priv;
	struct diag_packet *dp;
	unsigned long flags;
	unsigned char *discard_buf;

	//printk(KERN_INFO "wp_diag: %s, event %d\n", __FUNCTION__, event);

	if (ctxt->ch && event == SMD_EVENT_DATA)
	{
		int r = smd_read_avail(ctxt->ch);
		//printk(KERN_INFO "wp_diag: smd_read_avail num bytes = %d\n", r);
		if (r > RX_MAX || r <= 0)	{
			printk(KERN_ERR "wp_diag: diag dropped num bytes = %d or invaild num to read\n", r);
			return;
		}

		spin_lock_irqsave(&ctxt->read_q_lock, flags);
		if (_wp_context.read_q_count < READQ_MAX) {
			dp = kmalloc(sizeof(struct diag_packet), GFP_ATOMIC);
			if (!dp) {
				printk(KERN_ERR "wp_diag: kmalloc dp failed\n");
				spin_unlock_irqrestore(&ctxt->read_q_lock, flags);
				return;
			}

			dp->content = kmalloc(r, GFP_ATOMIC);
			if (!dp->content) {
				printk(KERN_ERR "wp_diag: kmalloc dp->content failed\n");
				spin_unlock_irqrestore(&ctxt->read_q_lock, flags);
				return;
			}

			dp->len = smd_read_from_cb(ctxt->ch, dp->content, r);
			//printk(KERN_INFO "wp_diag: smd_read_from_cb %d\n", dp->len);

			list_add_tail(&dp->list, &ctxt->read_q);
			_wp_context.read_q_count++;
			spin_unlock_irqrestore(&ctxt->read_q_lock, flags);

			TRACE("A9>", dp->content, dp->len, 0);
			//printk(KERN_ERR "wp_diag: put readq count %d\n", _wp_context.read_q_count);
		} else {
			printk(KERN_ERR "wp_diag: execeed max num in read q: %d\n", _wp_context.read_q_count);
			discard_buf = kmalloc(r, GFP_ATOMIC);
			smd_read_from_cb(ctxt->ch, discard_buf, r);
			kfree(discard_buf);
			spin_unlock_irqrestore(&ctxt->read_q_lock, flags);
		}
		wake_up_interruptible(&ctxt->wait_q);
	}
}
Ejemplo n.º 2
0
void __diag_smd_qdsp_send_req(int context)
{
	void *buf;

	if (driver->chqdsp && (!driver->in_busy_qdsp)) {
		int r = smd_read_avail(driver->chqdsp);

		if (r > USB_MAX_IN_BUF) {
			printk(KERN_INFO "diag dropped num bytes = %d\n", r);
			return;
		}
		if (r > 0) {
			buf = driver->usb_buf_in_qdsp;
			if (!buf) {
				printk(KERN_INFO "Out of diagmem for q6\n");
			} else {
				APPEND_DEBUG('l');
				if (context == SMD_CONTEXT)
					smd_read_from_cb(
						driver->chqdsp, buf, r);
				else
					smd_read(driver->chqdsp, buf, r);
				APPEND_DEBUG('m');
				driver->usb_write_ptr_qdsp->length = r;
				driver->in_busy_qdsp = 1;
				diag_device_write(buf, QDSP_DATA);
			}
		}

	}
}
static void apr_tal_notify(void *priv, unsigned event)
{
	struct apr_svc_ch_dev *apr_ch = priv;
	int len, r_len, sz;
	int pkt_cnt = 0;
	unsigned long flags;

	pr_debug("event = %d\n", event);
	switch (event) {
	case SMD_EVENT_DATA:
		pkt_cnt = 0;
		spin_lock_irqsave(&apr_ch->lock, flags);
check_pending:
		len = smd_read_avail(apr_ch->ch);
		if (len < 0) {
			pr_err("apr_tal: Invalid Read Event :%d\n", len);
			spin_unlock_irqrestore(&apr_ch->lock, flags);
			return;
		}
		sz = smd_cur_packet_size(apr_ch->ch);
		if (sz < 0) {
			pr_debug("pkt size is zero\n");
			spin_unlock_irqrestore(&apr_ch->lock, flags);
			return;
		}
		if (!len && !sz && !pkt_cnt)
			goto check_write_avail;
		if (!len) {
			pr_debug("len = %d pkt_cnt = %d\n", len, pkt_cnt);
			spin_unlock_irqrestore(&apr_ch->lock, flags);
			return;
		}
		r_len = smd_read_from_cb(apr_ch->ch, apr_ch->data, len);
		if (len != r_len) {
			pr_err("apr_tal: Invalid Read\n");
			spin_unlock_irqrestore(&apr_ch->lock, flags);
			return;
		}
		pkt_cnt++;
		pr_debug("%d %d %d\n", len, sz, pkt_cnt);
		if (apr_ch->func)
			apr_ch->func(apr_ch->data, r_len, apr_ch->priv);
		goto check_pending;
check_write_avail:
		if (smd_write_avail(apr_ch->ch))
			wake_up(&apr_ch->wait);
		spin_unlock_irqrestore(&apr_ch->lock, flags);
		break;
	case SMD_EVENT_OPEN:
		pr_debug("apr_tal: SMD_EVENT_OPEN\n");
		apr_ch->smd_state = 1;
		wake_up(&apr_ch->wait);
		break;
	case SMD_EVENT_CLOSE:
		pr_debug("apr_tal: SMD_EVENT_CLOSE\n");
		break;
	}
}
Ejemplo n.º 4
0
void __diag_smd_send_req(int context)
{
	void *buf;

	if (driver->ch && (!driver->in_busy)) {
		int r = smd_read_avail(driver->ch);

	if (r > USB_MAX_IN_BUF) {
		if (r < MAX_BUF_SIZE) {
				printk(KERN_ALERT "\n diag: SMD sending in "
					   "packets upto %d bytes", r);
				driver->usb_buf_in = krealloc(
					driver->usb_buf_in, r, GFP_KERNEL);
		} else {
			printk(KERN_ALERT "\n diag: SMD sending in "
				 "packets more than %d bytes", MAX_BUF_SIZE);
			return;
		}
	}
		if (r > 0) {

			buf = driver->usb_buf_in;
			if (!buf) {
				printk(KERN_INFO "Out of diagmem for a9\n");
			} else {
				APPEND_DEBUG('i');
				if (context == SMD_CONTEXT)
					smd_read_from_cb(driver->ch, buf, r);
				else
					smd_read(driver->ch, buf, r);
				APPEND_DEBUG('j');
				driver->usb_write_ptr->length = r;
				driver->in_busy = 1;
				diag_device_write(buf, MODEM_DATA);
			}
		}
	}
}
static void radio_hci_smd_recv_event(unsigned long temp)
{
	int len;
	int rc;
	struct sk_buff *skb;
	unsigned  char *buf;
	struct radio_data *hsmd = &hs;
	len = smd_read_avail(hsmd->fm_channel);

	while (len) {
		skb = alloc_skb(len, GFP_KERNEL);
		if (!skb) {
			FMDERR("Memory not allocated for the socket");
			return;
		}

		buf = kmalloc(len, GFP_KERNEL);
		if (!buf) {
			kfree_skb(skb);
			FMDERR("Error in allocating buffer memory");
			return;
		}

		rc = smd_read_from_cb(hsmd->fm_channel, (void *)buf, len);

		memcpy(skb_put(skb, len), buf, len);

		skb_orphan(skb);
		skb->dev = (struct net_device   *)hs.hdev;

		rc = radio_hci_recv_frame(skb);

		kfree(buf);
		len = smd_read_avail(hsmd->fm_channel);
	}
}
static void wp_smd_diag_notify(void *priv, unsigned event)
{
	struct wp_diag_context *ctxt = priv;
	struct diag_packet *dp;
	unsigned long flags;
#ifdef DYNAMIC_ALLOC
	unsigned char *discard_buf;
#endif

	//printk(KERN_INFO "wp_diag: %s, event %d\n", __FUNCTION__, event);

	if (ctxt->ch && event == SMD_EVENT_DATA)
	{
		int r = smd_read_avail(ctxt->ch);
		//printk(KERN_INFO "wp_diag: smd_read_avail num bytes = %d\n", r);
		if (r > RX_MAX || r <= 0)	{
			printk(KERN_ERR "wp_diag: diag dropped num bytes = %d or invaild num to read\n", r);
			return;
		}

		spin_lock_irqsave(&ctxt->read_q_lock, flags);
#ifdef DYNAMIC_ALLOC
		if (_wp_context.read_q_count < READQ_MAX) {
			dp = kmalloc(sizeof(struct diag_packet), GFP_ATOMIC);
			if (!dp) {
				printk(KERN_ERR "wp_diag: kmalloc dp failed\n");
				spin_unlock_irqrestore(&ctxt->read_q_lock, flags);
				return;
			}

			dp->content = kmalloc(r, GFP_ATOMIC);
			if (!dp->content) {
				kfree(dp);
				printk(KERN_ERR "wp_diag: kmalloc dp->content failed\n");
				spin_unlock_irqrestore(&ctxt->read_q_lock, flags);
				return;
			}

			dp->len = smd_read_from_cb(ctxt->ch, dp->content, r);
			//printk(KERN_INFO "wp_diag: smd_read_from_cb %d\n", dp->len);

			list_add_tail(&dp->list, &ctxt->read_q);
			_wp_context.read_q_count++;
			spin_unlock_irqrestore(&ctxt->read_q_lock, flags);

			TRACE("A9>", dp->content, dp->len, 0);
			//printk(KERN_ERR "wp_diag: put readq count %d\n", _wp_context.read_q_count);
		} else {
			printk(KERN_ERR "wp_diag: exceed max num in read q: %d\n", _wp_context.read_q_count);

			discard_buf = kmalloc(r, GFP_ATOMIC);
			smd_read_from_cb(ctxt->ch, discard_buf, r);
			kfree(discard_buf);
			spin_unlock_irqrestore(&ctxt->read_q_lock, flags);
			return;
		}
#else
		// note if small buffer run out, we can use larger buffer
		if (r <= RX_SMALL_MAX && ctxt->s_free_q_count > 0) {
			dp = list_first_entry(&ctxt->s_free_q, struct diag_packet, list);
			list_del(&dp->list);
			ctxt->s_free_q_count--;
		} else if (r <= RX_MEDIUM_MAX && ctxt->m_free_q_count > 0) {