static int omap_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) { struct omap_irda *omap_ir = netdev_priv(dev); int speed = irda_get_next_speed(skb); int mtt = irda_get_mtt(skb); int xbofs = irda_get_next_xbofs(skb); /* * Does this packet contain a request to change the interface * speed? If so, remember it until we complete the transmission * of this frame. */ if (speed != omap_ir->speed && speed != -1) omap_ir->newspeed = speed; if (xbofs) /* Set number of addtional BOFS */ uart_reg_out(UART3_EBLR, xbofs + 1); /* * If this is an empty frame, we can bypass a lot. */ if (skb->len == 0) { if (omap_ir->newspeed) { omap_ir->newspeed = 0; omap_irda_set_speed(dev, speed); } dev_kfree_skb(skb); return 0; } netif_stop_queue(dev); /* Copy skb data to DMA buffer */ skb_copy_from_linear_data(skb, omap_ir->tx_buf_dma_virt, skb->len); /* Copy skb data to DMA buffer */ omap_ir->stats.tx_bytes += skb->len; /* Set frame length */ uart_reg_out(UART3_TXFLL, (skb->len & 0xff)); uart_reg_out(UART3_TXFLH, (skb->len >> 8)); if (mtt > 1000) mdelay(mtt / 1000); else udelay(mtt); /* Start TX DMA transfer */ omap_start_tx_dma(omap_ir, skb->len); /* We can free skb now because it's already in DMA buffer */ dev_kfree_skb(skb); dev->trans_start = jiffies; return 0; }
static int omap1610_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) { struct omap1610_irda *si = dev->priv; int speed = irda_get_next_speed(skb); int mtt = irda_get_mtt(skb); int xbofs = irda_get_next_xbofs(skb); __ECHO_IN; /* * Does this packet contain a request to change the interface * speed? If so, remember it until we complete the transmission * of this frame. */ if (speed != si->speed && speed != -1) si->newspeed = speed; if (xbofs) { /* Set number of addtional BOFS */ omap_writeb(xbofs + 1, UART3_EBLR); } /* * If this is an empty frame, we can bypass a lot. */ if (skb->len == 0) { if (si->newspeed) { si->newspeed = 0; omap1610_irda_set_speed(dev, speed); } dev_kfree_skb(skb); return 0; } netif_stop_queue(dev); /* Copy skb data to DMA buffer */ memcpy(si->tx_buf_dma_virt, skb->data, skb->len); si->stats.tx_bytes += skb->len; /* Set frame length */ omap_writeb((skb->len & 0xff), UART3_TXFLL); omap_writeb((skb->len >> 8), UART3_TXFLH); if (mtt > 1000) mdelay(mtt / 1000); else udelay(mtt); /* Start TX DMA transfer */ omap1610_start_tx_dma(si, skb->len); /* We can free skb now because it's already in DMA buffer */ dev_kfree_skb(skb); dev->trans_start = jiffies; __ECHO_OUT; return 0; }