static int cc2520_csma_tx(u8 * buf, u8 len)
{
	int backoff;

	if (!csma_enabled) {
		return csma_bottom->tx(buf, len);
	}

	spin_lock_irqsave(&state_sl, flags);
	if (csma_state == CC2520_CSMA_IDLE) {
		csma_state = CC2520_CSMA_TX;
		spin_unlock_irqrestore(&state_sl, flags);

		memcpy(cur_tx_buf, buf, len);
		cur_tx_len = len;

		backoff = cc2520_csma_get_backoff(backoff_min, backoff_max_init);

		DBG((KERN_INFO "[cc2520] - waiting %d uS to send.\n", backoff));
		cc2520_csma_start_timer(backoff);
	}
	else {
		spin_unlock_irqrestore(&state_sl, flags);
		DBG((KERN_INFO "[cc2520] - csma layer busy.\n"));
		csma_top->tx_done(-CC2520_TX_BUSY);
	}

	return 0;
}
Beispiel #2
0
static int cc2520_csma_tx(u8 * buf, u8 len)
{
	int backoff;

	spin_lock(&state_sl);
	if (csma_state == CC2520_CSMA_IDLE) {
		csma_state = CC2520_CSMA_TX;
		spin_unlock(&state_sl);

		memcpy(cur_tx_buf, buf, len);
		cur_tx_len = len;

		backoff = cc2520_csma_get_backoff(backoff_min, backoff_max_init);

		//printk(KERN_INFO "[cc2520] - waiting %d uS to send.\n", backoff);
		cc2520_csma_start_timer(backoff);
	}
	else {
		spin_unlock(&state_sl);
		csma_top->tx_done(-CC2520_TX_BUSY);
	}

	return 0;
}