.. | .. |
---|
1625 | 1625 | static int dsp_count_valid; /* if we have last sample count */ |
---|
1626 | 1626 | |
---|
1627 | 1627 | void |
---|
1628 | | -dsp_cmx_send(void *arg) |
---|
| 1628 | +dsp_cmx_send(struct timer_list *arg) |
---|
1629 | 1629 | { |
---|
1630 | 1630 | struct dsp_conf *conf; |
---|
1631 | 1631 | struct dsp_conf_member *member; |
---|
.. | .. |
---|
1676 | 1676 | #ifdef CMX_CONF_DEBUG |
---|
1677 | 1677 | if (conf->software && members > 1) |
---|
1678 | 1678 | #else |
---|
1679 | | - if (conf->software && members > 2) |
---|
| 1679 | + if (conf->software && members > 2) |
---|
1680 | 1680 | #endif |
---|
1681 | | - mustmix = 1; |
---|
| 1681 | + mustmix = 1; |
---|
1682 | 1682 | } |
---|
1683 | 1683 | |
---|
1684 | 1684 | /* transmission required */ |
---|
.. | .. |
---|
1699 | 1699 | #ifdef CMX_CONF_DEBUG |
---|
1700 | 1700 | if (conf->software && members > 1) { |
---|
1701 | 1701 | #else |
---|
1702 | | - if (conf->software && members > 2) { |
---|
| 1702 | + if (conf->software && members > 2) { |
---|
1703 | 1703 | #endif |
---|
1704 | | - /* check for hdlc conf */ |
---|
1705 | | - member = list_entry(conf->mlist.next, |
---|
1706 | | - struct dsp_conf_member, list); |
---|
1707 | | - if (member->dsp->hdlc) |
---|
1708 | | - continue; |
---|
1709 | | - /* mix all data */ |
---|
1710 | | - memset(mixbuffer, 0, length * sizeof(s32)); |
---|
1711 | | - list_for_each_entry(member, &conf->mlist, list) { |
---|
1712 | | - dsp = member->dsp; |
---|
1713 | | - /* get range of data to mix */ |
---|
1714 | | - c = mixbuffer; |
---|
1715 | | - q = dsp->rx_buff; |
---|
1716 | | - r = dsp->rx_R; |
---|
1717 | | - rr = (r + length) & CMX_BUFF_MASK; |
---|
1718 | | - /* add member's data */ |
---|
1719 | | - while (r != rr) { |
---|
1720 | | - *c++ += dsp_audio_law_to_s32[q[r]]; |
---|
1721 | | - r = (r + 1) & CMX_BUFF_MASK; |
---|
1722 | | - } |
---|
1723 | | - } |
---|
1724 | | - |
---|
1725 | | - /* process each member */ |
---|
1726 | | - list_for_each_entry(member, &conf->mlist, list) { |
---|
1727 | | - /* transmission */ |
---|
1728 | | - dsp_cmx_send_member(member->dsp, length, |
---|
1729 | | - mixbuffer, members); |
---|
| 1704 | + /* check for hdlc conf */ |
---|
| 1705 | + member = list_entry(conf->mlist.next, |
---|
| 1706 | + struct dsp_conf_member, list); |
---|
| 1707 | + if (member->dsp->hdlc) |
---|
| 1708 | + continue; |
---|
| 1709 | + /* mix all data */ |
---|
| 1710 | + memset(mixbuffer, 0, length * sizeof(s32)); |
---|
| 1711 | + list_for_each_entry(member, &conf->mlist, list) { |
---|
| 1712 | + dsp = member->dsp; |
---|
| 1713 | + /* get range of data to mix */ |
---|
| 1714 | + c = mixbuffer; |
---|
| 1715 | + q = dsp->rx_buff; |
---|
| 1716 | + r = dsp->rx_R; |
---|
| 1717 | + rr = (r + length) & CMX_BUFF_MASK; |
---|
| 1718 | + /* add member's data */ |
---|
| 1719 | + while (r != rr) { |
---|
| 1720 | + *c++ += dsp_audio_law_to_s32[q[r]]; |
---|
| 1721 | + r = (r + 1) & CMX_BUFF_MASK; |
---|
1730 | 1722 | } |
---|
1731 | 1723 | } |
---|
| 1724 | + |
---|
| 1725 | + /* process each member */ |
---|
| 1726 | + list_for_each_entry(member, &conf->mlist, list) { |
---|
| 1727 | + /* transmission */ |
---|
| 1728 | + dsp_cmx_send_member(member->dsp, length, |
---|
| 1729 | + mixbuffer, members); |
---|
| 1730 | + } |
---|
| 1731 | + } |
---|
| 1732 | + } |
---|
| 1733 | + |
---|
| 1734 | + /* delete rx-data, increment buffers, change pointers */ |
---|
| 1735 | + list_for_each_entry(dsp, &dsp_ilist, list) { |
---|
| 1736 | + if (dsp->hdlc) |
---|
| 1737 | + continue; |
---|
| 1738 | + p = dsp->rx_buff; |
---|
| 1739 | + q = dsp->tx_buff; |
---|
| 1740 | + r = dsp->rx_R; |
---|
| 1741 | + /* move receive pointer when receiving */ |
---|
| 1742 | + if (!dsp->rx_is_off) { |
---|
| 1743 | + rr = (r + length) & CMX_BUFF_MASK; |
---|
| 1744 | + /* delete rx-data */ |
---|
| 1745 | + while (r != rr) { |
---|
| 1746 | + p[r] = dsp_silence; |
---|
| 1747 | + r = (r + 1) & CMX_BUFF_MASK; |
---|
| 1748 | + } |
---|
| 1749 | + /* increment rx-buffer pointer */ |
---|
| 1750 | + dsp->rx_R = r; /* write incremented read pointer */ |
---|
1732 | 1751 | } |
---|
1733 | 1752 | |
---|
1734 | | - /* delete rx-data, increment buffers, change pointers */ |
---|
1735 | | - list_for_each_entry(dsp, &dsp_ilist, list) { |
---|
1736 | | - if (dsp->hdlc) |
---|
1737 | | - continue; |
---|
1738 | | - p = dsp->rx_buff; |
---|
1739 | | - q = dsp->tx_buff; |
---|
1740 | | - r = dsp->rx_R; |
---|
1741 | | - /* move receive pointer when receiving */ |
---|
1742 | | - if (!dsp->rx_is_off) { |
---|
1743 | | - rr = (r + length) & CMX_BUFF_MASK; |
---|
| 1753 | + /* check current rx_delay */ |
---|
| 1754 | + delay = (dsp->rx_W-dsp->rx_R) & CMX_BUFF_MASK; |
---|
| 1755 | + if (delay >= CMX_BUFF_HALF) |
---|
| 1756 | + delay = 0; /* will be the delay before next write */ |
---|
| 1757 | + /* check for lower delay */ |
---|
| 1758 | + if (delay < dsp->rx_delay[0]) |
---|
| 1759 | + dsp->rx_delay[0] = delay; |
---|
| 1760 | + /* check current tx_delay */ |
---|
| 1761 | + delay = (dsp->tx_W-dsp->tx_R) & CMX_BUFF_MASK; |
---|
| 1762 | + if (delay >= CMX_BUFF_HALF) |
---|
| 1763 | + delay = 0; /* will be the delay before next write */ |
---|
| 1764 | + /* check for lower delay */ |
---|
| 1765 | + if (delay < dsp->tx_delay[0]) |
---|
| 1766 | + dsp->tx_delay[0] = delay; |
---|
| 1767 | + if (jittercheck) { |
---|
| 1768 | + /* find the lowest of all rx_delays */ |
---|
| 1769 | + delay = dsp->rx_delay[0]; |
---|
| 1770 | + i = 1; |
---|
| 1771 | + while (i < MAX_SECONDS_JITTER_CHECK) { |
---|
| 1772 | + if (delay > dsp->rx_delay[i]) |
---|
| 1773 | + delay = dsp->rx_delay[i]; |
---|
| 1774 | + i++; |
---|
| 1775 | + } |
---|
| 1776 | + /* |
---|
| 1777 | + * remove rx_delay only if we have delay AND we |
---|
| 1778 | + * have not preset cmx_delay AND |
---|
| 1779 | + * the delay is greater dsp_poll |
---|
| 1780 | + */ |
---|
| 1781 | + if (delay > dsp_poll && !dsp->cmx_delay) { |
---|
| 1782 | + if (dsp_debug & DEBUG_DSP_CLOCK) |
---|
| 1783 | + printk(KERN_DEBUG |
---|
| 1784 | + "%s lowest rx_delay of %d bytes for" |
---|
| 1785 | + " dsp %s are now removed.\n", |
---|
| 1786 | + __func__, delay, |
---|
| 1787 | + dsp->name); |
---|
| 1788 | + r = dsp->rx_R; |
---|
| 1789 | + rr = (r + delay - (dsp_poll >> 1)) |
---|
| 1790 | + & CMX_BUFF_MASK; |
---|
1744 | 1791 | /* delete rx-data */ |
---|
1745 | 1792 | while (r != rr) { |
---|
1746 | 1793 | p[r] = dsp_silence; |
---|
1747 | 1794 | r = (r + 1) & CMX_BUFF_MASK; |
---|
1748 | 1795 | } |
---|
1749 | 1796 | /* increment rx-buffer pointer */ |
---|
1750 | | - dsp->rx_R = r; /* write incremented read pointer */ |
---|
| 1797 | + dsp->rx_R = r; |
---|
| 1798 | + /* write incremented read pointer */ |
---|
1751 | 1799 | } |
---|
1752 | | - |
---|
1753 | | - /* check current rx_delay */ |
---|
1754 | | - delay = (dsp->rx_W-dsp->rx_R) & CMX_BUFF_MASK; |
---|
1755 | | - if (delay >= CMX_BUFF_HALF) |
---|
1756 | | - delay = 0; /* will be the delay before next write */ |
---|
1757 | | - /* check for lower delay */ |
---|
1758 | | - if (delay < dsp->rx_delay[0]) |
---|
1759 | | - dsp->rx_delay[0] = delay; |
---|
1760 | | - /* check current tx_delay */ |
---|
1761 | | - delay = (dsp->tx_W-dsp->tx_R) & CMX_BUFF_MASK; |
---|
1762 | | - if (delay >= CMX_BUFF_HALF) |
---|
1763 | | - delay = 0; /* will be the delay before next write */ |
---|
1764 | | - /* check for lower delay */ |
---|
1765 | | - if (delay < dsp->tx_delay[0]) |
---|
1766 | | - dsp->tx_delay[0] = delay; |
---|
1767 | | - if (jittercheck) { |
---|
1768 | | - /* find the lowest of all rx_delays */ |
---|
1769 | | - delay = dsp->rx_delay[0]; |
---|
1770 | | - i = 1; |
---|
1771 | | - while (i < MAX_SECONDS_JITTER_CHECK) { |
---|
1772 | | - if (delay > dsp->rx_delay[i]) |
---|
1773 | | - delay = dsp->rx_delay[i]; |
---|
1774 | | - i++; |
---|
1775 | | - } |
---|
1776 | | - /* |
---|
1777 | | - * remove rx_delay only if we have delay AND we |
---|
1778 | | - * have not preset cmx_delay AND |
---|
1779 | | - * the delay is greater dsp_poll |
---|
1780 | | - */ |
---|
1781 | | - if (delay > dsp_poll && !dsp->cmx_delay) { |
---|
1782 | | - if (dsp_debug & DEBUG_DSP_CLOCK) |
---|
1783 | | - printk(KERN_DEBUG |
---|
1784 | | - "%s lowest rx_delay of %d bytes for" |
---|
1785 | | - " dsp %s are now removed.\n", |
---|
1786 | | - __func__, delay, |
---|
1787 | | - dsp->name); |
---|
1788 | | - r = dsp->rx_R; |
---|
1789 | | - rr = (r + delay - (dsp_poll >> 1)) |
---|
1790 | | - & CMX_BUFF_MASK; |
---|
1791 | | - /* delete rx-data */ |
---|
1792 | | - while (r != rr) { |
---|
1793 | | - p[r] = dsp_silence; |
---|
1794 | | - r = (r + 1) & CMX_BUFF_MASK; |
---|
1795 | | - } |
---|
1796 | | - /* increment rx-buffer pointer */ |
---|
1797 | | - dsp->rx_R = r; |
---|
1798 | | - /* write incremented read pointer */ |
---|
1799 | | - } |
---|
1800 | | - /* find the lowest of all tx_delays */ |
---|
1801 | | - delay = dsp->tx_delay[0]; |
---|
1802 | | - i = 1; |
---|
1803 | | - while (i < MAX_SECONDS_JITTER_CHECK) { |
---|
1804 | | - if (delay > dsp->tx_delay[i]) |
---|
1805 | | - delay = dsp->tx_delay[i]; |
---|
1806 | | - i++; |
---|
1807 | | - } |
---|
1808 | | - /* |
---|
1809 | | - * remove delay only if we have delay AND we |
---|
1810 | | - * have enabled tx_dejitter |
---|
1811 | | - */ |
---|
1812 | | - if (delay > dsp_poll && dsp->tx_dejitter) { |
---|
1813 | | - if (dsp_debug & DEBUG_DSP_CLOCK) |
---|
1814 | | - printk(KERN_DEBUG |
---|
1815 | | - "%s lowest tx_delay of %d bytes for" |
---|
1816 | | - " dsp %s are now removed.\n", |
---|
1817 | | - __func__, delay, |
---|
1818 | | - dsp->name); |
---|
1819 | | - r = dsp->tx_R; |
---|
1820 | | - rr = (r + delay - (dsp_poll >> 1)) |
---|
1821 | | - & CMX_BUFF_MASK; |
---|
1822 | | - /* delete tx-data */ |
---|
1823 | | - while (r != rr) { |
---|
1824 | | - q[r] = dsp_silence; |
---|
1825 | | - r = (r + 1) & CMX_BUFF_MASK; |
---|
1826 | | - } |
---|
1827 | | - /* increment rx-buffer pointer */ |
---|
1828 | | - dsp->tx_R = r; |
---|
1829 | | - /* write incremented read pointer */ |
---|
1830 | | - } |
---|
1831 | | - /* scroll up delays */ |
---|
1832 | | - i = MAX_SECONDS_JITTER_CHECK - 1; |
---|
1833 | | - while (i) { |
---|
1834 | | - dsp->rx_delay[i] = dsp->rx_delay[i - 1]; |
---|
1835 | | - dsp->tx_delay[i] = dsp->tx_delay[i - 1]; |
---|
1836 | | - i--; |
---|
1837 | | - } |
---|
1838 | | - dsp->tx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */ |
---|
1839 | | - dsp->rx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */ |
---|
| 1800 | + /* find the lowest of all tx_delays */ |
---|
| 1801 | + delay = dsp->tx_delay[0]; |
---|
| 1802 | + i = 1; |
---|
| 1803 | + while (i < MAX_SECONDS_JITTER_CHECK) { |
---|
| 1804 | + if (delay > dsp->tx_delay[i]) |
---|
| 1805 | + delay = dsp->tx_delay[i]; |
---|
| 1806 | + i++; |
---|
1840 | 1807 | } |
---|
| 1808 | + /* |
---|
| 1809 | + * remove delay only if we have delay AND we |
---|
| 1810 | + * have enabled tx_dejitter |
---|
| 1811 | + */ |
---|
| 1812 | + if (delay > dsp_poll && dsp->tx_dejitter) { |
---|
| 1813 | + if (dsp_debug & DEBUG_DSP_CLOCK) |
---|
| 1814 | + printk(KERN_DEBUG |
---|
| 1815 | + "%s lowest tx_delay of %d bytes for" |
---|
| 1816 | + " dsp %s are now removed.\n", |
---|
| 1817 | + __func__, delay, |
---|
| 1818 | + dsp->name); |
---|
| 1819 | + r = dsp->tx_R; |
---|
| 1820 | + rr = (r + delay - (dsp_poll >> 1)) |
---|
| 1821 | + & CMX_BUFF_MASK; |
---|
| 1822 | + /* delete tx-data */ |
---|
| 1823 | + while (r != rr) { |
---|
| 1824 | + q[r] = dsp_silence; |
---|
| 1825 | + r = (r + 1) & CMX_BUFF_MASK; |
---|
| 1826 | + } |
---|
| 1827 | + /* increment rx-buffer pointer */ |
---|
| 1828 | + dsp->tx_R = r; |
---|
| 1829 | + /* write incremented read pointer */ |
---|
| 1830 | + } |
---|
| 1831 | + /* scroll up delays */ |
---|
| 1832 | + i = MAX_SECONDS_JITTER_CHECK - 1; |
---|
| 1833 | + while (i) { |
---|
| 1834 | + dsp->rx_delay[i] = dsp->rx_delay[i - 1]; |
---|
| 1835 | + dsp->tx_delay[i] = dsp->tx_delay[i - 1]; |
---|
| 1836 | + i--; |
---|
| 1837 | + } |
---|
| 1838 | + dsp->tx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */ |
---|
| 1839 | + dsp->rx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */ |
---|
1841 | 1840 | } |
---|
1842 | | - |
---|
1843 | | - /* if next event would be in the past ... */ |
---|
1844 | | - if ((s32)(dsp_spl_jiffies + dsp_tics-jiffies) <= 0) |
---|
1845 | | - dsp_spl_jiffies = jiffies + 1; |
---|
1846 | | - else |
---|
1847 | | - dsp_spl_jiffies += dsp_tics; |
---|
1848 | | - |
---|
1849 | | - dsp_spl_tl.expires = dsp_spl_jiffies; |
---|
1850 | | - add_timer(&dsp_spl_tl); |
---|
1851 | | - |
---|
1852 | | - /* unlock */ |
---|
1853 | | - spin_unlock_irqrestore(&dsp_lock, flags); |
---|
1854 | 1841 | } |
---|
| 1842 | + |
---|
| 1843 | + /* if next event would be in the past ... */ |
---|
| 1844 | + if ((s32)(dsp_spl_jiffies + dsp_tics-jiffies) <= 0) |
---|
| 1845 | + dsp_spl_jiffies = jiffies + 1; |
---|
| 1846 | + else |
---|
| 1847 | + dsp_spl_jiffies += dsp_tics; |
---|
| 1848 | + |
---|
| 1849 | + dsp_spl_tl.expires = dsp_spl_jiffies; |
---|
| 1850 | + add_timer(&dsp_spl_tl); |
---|
| 1851 | + |
---|
| 1852 | + /* unlock */ |
---|
| 1853 | + spin_unlock_irqrestore(&dsp_lock, flags); |
---|
| 1854 | +} |
---|
1855 | 1855 | |
---|
1856 | 1856 | /* |
---|
1857 | 1857 | * audio data is transmitted from upper layer to the dsp |
---|
1858 | 1858 | */ |
---|
1859 | | - void |
---|
1860 | | - dsp_cmx_transmit(struct dsp *dsp, struct sk_buff *skb) |
---|
1861 | | - { |
---|
1862 | | - u_int w, ww; |
---|
1863 | | - u8 *d, *p; |
---|
1864 | | - int space; /* todo: , l = skb->len; */ |
---|
| 1859 | +void |
---|
| 1860 | +dsp_cmx_transmit(struct dsp *dsp, struct sk_buff *skb) |
---|
| 1861 | +{ |
---|
| 1862 | + u_int w, ww; |
---|
| 1863 | + u8 *d, *p; |
---|
| 1864 | + int space; /* todo: , l = skb->len; */ |
---|
1865 | 1865 | #ifdef CMX_TX_DEBUG |
---|
1866 | | - char debugbuf[256] = ""; |
---|
| 1866 | + char debugbuf[256] = ""; |
---|
1867 | 1867 | #endif |
---|
1868 | 1868 | |
---|
1869 | | - /* check if there is enough space, and then copy */ |
---|
1870 | | - w = dsp->tx_W; |
---|
1871 | | - ww = dsp->tx_R; |
---|
1872 | | - p = dsp->tx_buff; |
---|
1873 | | - d = skb->data; |
---|
1874 | | - space = (ww - w - 1) & CMX_BUFF_MASK; |
---|
1875 | | - /* write-pointer should not overrun nor reach read pointer */ |
---|
1876 | | - if (space < skb->len) { |
---|
1877 | | - /* write to the space we have left */ |
---|
1878 | | - ww = (ww - 1) & CMX_BUFF_MASK; /* end one byte prior tx_R */ |
---|
1879 | | - if (dsp_debug & DEBUG_DSP_CLOCK) |
---|
1880 | | - printk(KERN_DEBUG "%s: TX overflow space=%d skb->len=" |
---|
1881 | | - "%d, w=0x%04x, ww=0x%04x\n", __func__, space, |
---|
1882 | | - skb->len, w, ww); |
---|
1883 | | - } else |
---|
1884 | | - /* write until all byte are copied */ |
---|
1885 | | - ww = (w + skb->len) & CMX_BUFF_MASK; |
---|
1886 | | - dsp->tx_W = ww; |
---|
1887 | | - |
---|
| 1869 | + /* check if there is enough space, and then copy */ |
---|
| 1870 | + w = dsp->tx_W; |
---|
| 1871 | + ww = dsp->tx_R; |
---|
| 1872 | + p = dsp->tx_buff; |
---|
| 1873 | + d = skb->data; |
---|
| 1874 | + space = (ww - w - 1) & CMX_BUFF_MASK; |
---|
| 1875 | + /* write-pointer should not overrun nor reach read pointer */ |
---|
| 1876 | + if (space < skb->len) { |
---|
| 1877 | + /* write to the space we have left */ |
---|
| 1878 | + ww = (ww - 1) & CMX_BUFF_MASK; /* end one byte prior tx_R */ |
---|
| 1879 | + if (dsp_debug & DEBUG_DSP_CLOCK) |
---|
| 1880 | + printk(KERN_DEBUG "%s: TX overflow space=%d skb->len=" |
---|
| 1881 | + "%d, w=0x%04x, ww=0x%04x\n", __func__, space, |
---|
| 1882 | + skb->len, w, ww); |
---|
| 1883 | + } else |
---|
| 1884 | + /* write until all byte are copied */ |
---|
| 1885 | + ww = (w + skb->len) & CMX_BUFF_MASK; |
---|
| 1886 | + dsp->tx_W = ww; |
---|
1888 | 1887 | /* show current buffer */ |
---|
1889 | 1888 | #ifdef CMX_DEBUG |
---|
1890 | | - printk(KERN_DEBUG |
---|
1891 | | - "cmx_transmit(dsp=%lx) %d bytes to 0x%x-0x%x. %s\n", |
---|
1892 | | - (u_long)dsp, (ww - w) & CMX_BUFF_MASK, w, ww, dsp->name); |
---|
| 1889 | + printk(KERN_DEBUG |
---|
| 1890 | + "cmx_transmit(dsp=%lx) %d bytes to 0x%x-0x%x. %s\n", |
---|
| 1891 | + (u_long)dsp, (ww - w) & CMX_BUFF_MASK, w, ww, dsp->name); |
---|
1893 | 1892 | #endif |
---|
1894 | 1893 | |
---|
1895 | | - /* copy transmit data to tx-buffer */ |
---|
| 1894 | + /* copy transmit data to tx-buffer */ |
---|
1896 | 1895 | #ifdef CMX_TX_DEBUG |
---|
1897 | | - sprintf(debugbuf, "TX getting (%04x-%04x)%p: ", w, ww, p); |
---|
| 1896 | + sprintf(debugbuf, "TX getting (%04x-%04x)%p: ", w, ww, p); |
---|
1898 | 1897 | #endif |
---|
1899 | | - while (w != ww) { |
---|
| 1898 | + while (w != ww) { |
---|
1900 | 1899 | #ifdef CMX_TX_DEBUG |
---|
1901 | | - if (strlen(debugbuf) < 48) |
---|
1902 | | - sprintf(debugbuf + strlen(debugbuf), " %02x", *d); |
---|
| 1900 | + if (strlen(debugbuf) < 48) |
---|
| 1901 | + sprintf(debugbuf + strlen(debugbuf), " %02x", *d); |
---|
1903 | 1902 | #endif |
---|
1904 | | - p[w] = *d++; |
---|
1905 | | - w = (w + 1) & CMX_BUFF_MASK; |
---|
1906 | | - } |
---|
1907 | | -#ifdef CMX_TX_DEBUG |
---|
1908 | | - printk(KERN_DEBUG "%s\n", debugbuf); |
---|
1909 | | -#endif |
---|
1910 | | - |
---|
| 1903 | + p[w] = *d++; |
---|
| 1904 | + w = (w + 1) & CMX_BUFF_MASK; |
---|
1911 | 1905 | } |
---|
| 1906 | +#ifdef CMX_TX_DEBUG |
---|
| 1907 | + printk(KERN_DEBUG "%s\n", debugbuf); |
---|
| 1908 | +#endif |
---|
| 1909 | + |
---|
| 1910 | +} |
---|
1912 | 1911 | |
---|
1913 | 1912 | /* |
---|
1914 | 1913 | * hdlc data is received from card and sent to all members. |
---|
1915 | 1914 | */ |
---|
1916 | | - void |
---|
1917 | | - dsp_cmx_hdlc(struct dsp *dsp, struct sk_buff *skb) |
---|
1918 | | - { |
---|
1919 | | - struct sk_buff *nskb = NULL; |
---|
1920 | | - struct dsp_conf_member *member; |
---|
1921 | | - struct mISDNhead *hh; |
---|
| 1915 | +void |
---|
| 1916 | +dsp_cmx_hdlc(struct dsp *dsp, struct sk_buff *skb) |
---|
| 1917 | +{ |
---|
| 1918 | + struct sk_buff *nskb = NULL; |
---|
| 1919 | + struct dsp_conf_member *member; |
---|
| 1920 | + struct mISDNhead *hh; |
---|
1922 | 1921 | |
---|
1923 | | - /* not if not active */ |
---|
1924 | | - if (!dsp->b_active) |
---|
1925 | | - return; |
---|
| 1922 | + /* not if not active */ |
---|
| 1923 | + if (!dsp->b_active) |
---|
| 1924 | + return; |
---|
1926 | 1925 | |
---|
1927 | | - /* check if we have sompen */ |
---|
1928 | | - if (skb->len < 1) |
---|
1929 | | - return; |
---|
| 1926 | + /* check if we have sompen */ |
---|
| 1927 | + if (skb->len < 1) |
---|
| 1928 | + return; |
---|
1930 | 1929 | |
---|
1931 | | - /* no conf */ |
---|
1932 | | - if (!dsp->conf) { |
---|
1933 | | - /* in case of software echo */ |
---|
1934 | | - if (dsp->echo.software) { |
---|
1935 | | - nskb = skb_clone(skb, GFP_ATOMIC); |
---|
1936 | | - if (nskb) { |
---|
1937 | | - hh = mISDN_HEAD_P(nskb); |
---|
1938 | | - hh->prim = PH_DATA_REQ; |
---|
1939 | | - hh->id = 0; |
---|
1940 | | - skb_queue_tail(&dsp->sendq, nskb); |
---|
1941 | | - schedule_work(&dsp->workq); |
---|
1942 | | - } |
---|
| 1930 | + /* no conf */ |
---|
| 1931 | + if (!dsp->conf) { |
---|
| 1932 | + /* in case of software echo */ |
---|
| 1933 | + if (dsp->echo.software) { |
---|
| 1934 | + nskb = skb_clone(skb, GFP_ATOMIC); |
---|
| 1935 | + if (nskb) { |
---|
| 1936 | + hh = mISDN_HEAD_P(nskb); |
---|
| 1937 | + hh->prim = PH_DATA_REQ; |
---|
| 1938 | + hh->id = 0; |
---|
| 1939 | + skb_queue_tail(&dsp->sendq, nskb); |
---|
| 1940 | + schedule_work(&dsp->workq); |
---|
1943 | 1941 | } |
---|
1944 | | - return; |
---|
1945 | 1942 | } |
---|
1946 | | - /* in case of hardware conference */ |
---|
1947 | | - if (dsp->conf->hardware) |
---|
1948 | | - return; |
---|
1949 | | - list_for_each_entry(member, &dsp->conf->mlist, list) { |
---|
1950 | | - if (dsp->echo.software || member->dsp != dsp) { |
---|
1951 | | - nskb = skb_clone(skb, GFP_ATOMIC); |
---|
1952 | | - if (nskb) { |
---|
1953 | | - hh = mISDN_HEAD_P(nskb); |
---|
1954 | | - hh->prim = PH_DATA_REQ; |
---|
1955 | | - hh->id = 0; |
---|
1956 | | - skb_queue_tail(&member->dsp->sendq, nskb); |
---|
1957 | | - schedule_work(&member->dsp->workq); |
---|
1958 | | - } |
---|
| 1943 | + return; |
---|
| 1944 | + } |
---|
| 1945 | + /* in case of hardware conference */ |
---|
| 1946 | + if (dsp->conf->hardware) |
---|
| 1947 | + return; |
---|
| 1948 | + list_for_each_entry(member, &dsp->conf->mlist, list) { |
---|
| 1949 | + if (dsp->echo.software || member->dsp != dsp) { |
---|
| 1950 | + nskb = skb_clone(skb, GFP_ATOMIC); |
---|
| 1951 | + if (nskb) { |
---|
| 1952 | + hh = mISDN_HEAD_P(nskb); |
---|
| 1953 | + hh->prim = PH_DATA_REQ; |
---|
| 1954 | + hh->id = 0; |
---|
| 1955 | + skb_queue_tail(&member->dsp->sendq, nskb); |
---|
| 1956 | + schedule_work(&member->dsp->workq); |
---|
1959 | 1957 | } |
---|
1960 | 1958 | } |
---|
1961 | 1959 | } |
---|
| 1960 | +} |
---|