cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dsp_hwec.c (2311B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * dsp_hwec.c:
      4 * builtin mISDN dsp pipeline element for enabling the hw echocanceller
      5 *
      6 * Copyright (C) 2007, Nadi Sarrar
      7 *
      8 * Nadi Sarrar <nadi@beronet.com>
      9 */
     10
     11#include <linux/kernel.h>
     12#include <linux/string.h>
     13#include <linux/mISDNdsp.h>
     14#include <linux/mISDNif.h>
     15#include "core.h"
     16#include "dsp.h"
     17#include "dsp_hwec.h"
     18
     19static struct mISDN_dsp_element_arg args[] = {
     20	{ "deftaps", "128", "Set the number of taps of cancellation." },
     21};
     22
     23static struct mISDN_dsp_element dsp_hwec_p = {
     24	.name = "hwec",
     25	.new = NULL,
     26	.free = NULL,
     27	.process_tx = NULL,
     28	.process_rx = NULL,
     29	.num_args = ARRAY_SIZE(args),
     30	.args = args,
     31};
     32struct mISDN_dsp_element *dsp_hwec = &dsp_hwec_p;
     33
     34void dsp_hwec_enable(struct dsp *dsp, const char *arg)
     35{
     36	int deftaps = 128,
     37		len;
     38	struct mISDN_ctrl_req	cq;
     39
     40	if (!dsp) {
     41		printk(KERN_ERR "%s: failed to enable hwec: dsp is NULL\n",
     42		       __func__);
     43		return;
     44	}
     45
     46	if (!arg)
     47		goto _do;
     48
     49	len = strlen(arg);
     50	if (!len)
     51		goto _do;
     52
     53	{
     54		char *dup, *tok, *name, *val;
     55		int tmp;
     56
     57		dup = kstrdup(arg, GFP_ATOMIC);
     58		if (!dup)
     59			return;
     60
     61		while ((tok = strsep(&dup, ","))) {
     62			if (!strlen(tok))
     63				continue;
     64			name = strsep(&tok, "=");
     65			val = tok;
     66
     67			if (!val)
     68				continue;
     69
     70			if (!strcmp(name, "deftaps")) {
     71				if (sscanf(val, "%d", &tmp) == 1)
     72					deftaps = tmp;
     73			}
     74		}
     75
     76		kfree(dup);
     77	}
     78
     79_do:
     80	printk(KERN_DEBUG "%s: enabling hwec with deftaps=%d\n",
     81	       __func__, deftaps);
     82	memset(&cq, 0, sizeof(cq));
     83	cq.op = MISDN_CTRL_HFC_ECHOCAN_ON;
     84	cq.p1 = deftaps;
     85	if (!dsp->ch.peer->ctrl(&dsp->ch, CONTROL_CHANNEL, &cq)) {
     86		printk(KERN_DEBUG "%s: CONTROL_CHANNEL failed\n",
     87		       __func__);
     88		return;
     89	}
     90}
     91
     92void dsp_hwec_disable(struct dsp *dsp)
     93{
     94	struct mISDN_ctrl_req	cq;
     95
     96	if (!dsp) {
     97		printk(KERN_ERR "%s: failed to disable hwec: dsp is NULL\n",
     98		       __func__);
     99		return;
    100	}
    101
    102	printk(KERN_DEBUG "%s: disabling hwec\n", __func__);
    103	memset(&cq, 0, sizeof(cq));
    104	cq.op = MISDN_CTRL_HFC_ECHOCAN_OFF;
    105	if (!dsp->ch.peer->ctrl(&dsp->ch, CONTROL_CHANNEL, &cq)) {
    106		printk(KERN_DEBUG "%s: CONTROL_CHANNEL failed\n",
    107		       __func__);
    108		return;
    109	}
    110}
    111
    112int dsp_hwec_init(void)
    113{
    114	mISDN_dsp_element_register(dsp_hwec);
    115
    116	return 0;
    117}
    118
    119void dsp_hwec_exit(void)
    120{
    121	mISDN_dsp_element_unregister(dsp_hwec);
    122}