Exemple #1
0
static ssize_t mv_trace_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
{
    const char      *name = attr->attr.name;
    int             err = 0;
    unsigned int    a, b;

    if (!capable(CAP_NET_ADMIN))
        return -EPERM;

    /* Read arguments */
    sscanf(buf, "%x %x", &a, &b);

    if (!strcmp(name, "start")) {
        if (a)
            TRC_START();
        else
            TRC_STOP();
    } else if (!strcmp(name, "mode"))
        TRC_MODE(a);
    else if (!strcmp(name, "dump"))
        TRC_OUTPUT(a, b);
    else {
        printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name);
        err = -EINVAL;
    }
    return err ? -EINVAL : len;
}
Exemple #2
0
void tdm_if_exit(void)
{
	/* Check if already stopped */
	if(!irq_init && !pcm_enable && !tdm_init)
		return;

	TRC_REC("->%s\n",__FUNCTION__);

	if(irq_init) {
		/* Release IRQ */
		free_irq(irqnr, NULL);
		irq_init = 0;
	}

	/* Stop PCM data sampling */
	if(pcm_enable)
		tdm_if_pcm_stop();

	if(tdm_init) {
#ifdef CONFIG_MV_TDM_SUPPORT
		mvTdmRelease();
#else
		mvCommUnitRelease();
#endif
		tdm_init = 0;
	}

	/* Remove proc directory & entries */
	remove_proc_entry("tdm_init", tdm_stats);
	remove_proc_entry("rx_miss", tdm_stats);
	remove_proc_entry("tx_miss", tdm_stats);
	remove_proc_entry("rx_over", tdm_stats);
	remove_proc_entry("tx_under", tdm_stats);
	remove_proc_entry("tdm", NULL);

	TRC_REC("<-%s\n",__FUNCTION__);

	TRC_OUTPUT();
	TRC_RELEASE();
}
Exemple #3
0
static int mp_close(struct inode *inode, struct file *file_p)
{
	MV_PHONE *mp = file_p->private_data;

	printk("Closing Marvell phone%d device\n",mp->ch);
	TRC_REC("->%s ch%d\n",__FUNCTION__,mp->ch);

	mvTdmChStop(mp->ch_info);

	free_irq(mp->irq, mp);

	if (file_p->f_mode & FMODE_READ)
		mp->readers--;
	if (file_p->f_mode & FMODE_WRITE)
		mp->writers--;

	file_p->private_data = NULL;

	TRC_REC("<-%s\n",__FUNCTION__);
	TRC_OUTPUT();
	return 0;
}
Exemple #4
0
static void __exit mp_exit(void)
{
	MV_PHONE *mp;
	int i;

	TRC_REC("->%s\n",__FUNCTION__);

	for(i=0; i<MV_TDM_MAX_CHANNELS; i++) {
		TRC_REC("ch%d remove\n",i);
		mp = get_mp(i);
		mvTdmChRemove(mp->ch_info);
		mp->irq = 0;
		mp->p.f_op = NULL;
		mp->p.open = NULL;
		mp->p.board = 0;
		phone_unregister_device(&mp->p);
		printk("phone%d removed\n",i);
	}

	TRC_REC("<-%s\n",__FUNCTION__);
	TRC_OUTPUT();
	TRC_RELEASE();
}
Exemple #5
0
MV_STATUS mvCesaIfReadyGet(MV_U8 chan, MV_CESA_RESULT *pResult)
{
	MV_STATUS status;
	MV_CESA_RESULT *pRes = NULL;

	/* Skip policy handling for single channel */
	if(MV_CESA_CHANNELS == 1)
		return mvCesaReadyGet(chan, pResult);

	while(MV_TRUE) {
		
		if(readyStatus[chan] == MV_FALSE)
			break;

		pRes = &resQueue[reqEmpty];

		/* Get next request */
		status = mvCesaReadyGet(chan, pRes);

		if(status != MV_OK) {
			readyStatus[chan] = MV_FALSE;
			break;
		}

		switch(currCesaPolicy) {
			case CESA_WEIGHTED_CHAN_POLICY:
			case CESA_NULL_POLICY:
				chanWeight[chan] -= pRes->mbufSize;
				break;

			case CESA_FLOW_ASSOC_CHAN_POLICY:
				/* TBD - handle policy */
				break;

			case CESA_SINGLE_CHAN_POLICY:
				break;

			default:
				mvOsPrintf("%s: Error, policy not supported\n", __func__);
				return MV_ERROR;		
		}

		if(pResQueue[pRes->reqId] != NULL) {
			mvOsPrintf("%s: Warning, results queue entry is being override(reqId=%d)\n", __func__, pRes->reqId);
			TRC_OUTPUT();
		}

		pResQueue[pRes->reqId] = pRes;
		reqEmpty = ((reqEmpty+1) % resQueueDepth);
	}

	if(pResQueue[currReqId] == NULL) {
		readyStatus[chan] = MV_TRUE;
		return MV_NOT_READY;
	}
	else {
		/* Release results in order */
		readyStatus[chan] = MV_FALSE;
		/*memcpy(pResult, pResQueue[currReqId], sizeof(MV_CESA_RESULT));*/
		pResult->retCode = ((MV_CESA_RESULT*)pResQueue[currReqId])->retCode;
		pResult->pReqPrv = ((MV_CESA_RESULT*)pResQueue[currReqId])->pReqPrv;
		pResult->sessionId = ((MV_CESA_RESULT*)pResQueue[currReqId])->sessionId;
		pResult->mbufSize = ((MV_CESA_RESULT*)pResQueue[currReqId])->mbufSize;
		pResult->reqId = ((MV_CESA_RESULT*)pResQueue[currReqId])->reqId;
		pResQueue[currReqId] = NULL;
		currReqId = ((currReqId+1) % resQueueDepth);
		return MV_OK;
	}
}