forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/drivers/isdn/mISDN/dsp_cmx.c
....@@ -1625,7 +1625,7 @@
16251625 static int dsp_count_valid; /* if we have last sample count */
16261626
16271627 void
1628
-dsp_cmx_send(void *arg)
1628
+dsp_cmx_send(struct timer_list *arg)
16291629 {
16301630 struct dsp_conf *conf;
16311631 struct dsp_conf_member *member;
....@@ -1676,9 +1676,9 @@
16761676 #ifdef CMX_CONF_DEBUG
16771677 if (conf->software && members > 1)
16781678 #else
1679
- if (conf->software && members > 2)
1679
+ if (conf->software && members > 2)
16801680 #endif
1681
- mustmix = 1;
1681
+ mustmix = 1;
16821682 }
16831683
16841684 /* transmission required */
....@@ -1699,263 +1699,262 @@
16991699 #ifdef CMX_CONF_DEBUG
17001700 if (conf->software && members > 1) {
17011701 #else
1702
- if (conf->software && members > 2) {
1702
+ if (conf->software && members > 2) {
17031703 #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;
17301722 }
17311723 }
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 */
17321751 }
17331752
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;
17441791 /* delete rx-data */
17451792 while (r != rr) {
17461793 p[r] = dsp_silence;
17471794 r = (r + 1) & CMX_BUFF_MASK;
17481795 }
17491796 /* increment rx-buffer pointer */
1750
- dsp->rx_R = r; /* write incremented read pointer */
1797
+ dsp->rx_R = r;
1798
+ /* write incremented read pointer */
17511799 }
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++;
18401807 }
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 */
18411840 }
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);
18541841 }
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
+}
18551855
18561856 /*
18571857 * audio data is transmitted from upper layer to the dsp
18581858 */
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; */
18651865 #ifdef CMX_TX_DEBUG
1866
- char debugbuf[256] = "";
1866
+ char debugbuf[256] = "";
18671867 #endif
18681868
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;
18881887 /* show current buffer */
18891888 #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);
18931892 #endif
18941893
1895
- /* copy transmit data to tx-buffer */
1894
+ /* copy transmit data to tx-buffer */
18961895 #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);
18981897 #endif
1899
- while (w != ww) {
1898
+ while (w != ww) {
19001899 #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);
19031902 #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;
19111905 }
1906
+#ifdef CMX_TX_DEBUG
1907
+ printk(KERN_DEBUG "%s\n", debugbuf);
1908
+#endif
1909
+
1910
+}
19121911
19131912 /*
19141913 * hdlc data is received from card and sent to all members.
19151914 */
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;
19221921
1923
- /* not if not active */
1924
- if (!dsp->b_active)
1925
- return;
1922
+ /* not if not active */
1923
+ if (!dsp->b_active)
1924
+ return;
19261925
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;
19301929
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);
19431941 }
1944
- return;
19451942 }
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);
19591957 }
19601958 }
19611959 }
1960
+}