예제 #1
0
static void astribank_release(struct device *dev)
{
	xbus_t *xbus;

	BUG_ON(!dev);
	xbus = dev_to_xbus(dev);
	if (XBUS_FLAGS(xbus, CONNECTED)) {
		XBUS_ERR(xbus, "Try to release CONNECTED device.\n");
		BUG();
	}
	if (!XBUS_IS(xbus, IDLE) && !XBUS_IS(xbus, FAIL)
	    && !XBUS_IS(xbus, DEACTIVATED)) {
		XBUS_ERR(xbus, "Try to release in state %s\n",
			 xbus_statename(XBUS_STATE(xbus)));
		BUG();
	}
	XBUS_INFO(xbus, "[%s] Astribank Release\n", xbus->label);
	xbus_free(xbus);
}
예제 #2
0
static DEVICE_ATTR_WRITER(xbus_state_store, dev, buf, count)
{
	xbus_t *xbus;

	xbus = dev_to_xbus(dev);
	XBUS_DBG(GENERAL, xbus, "%s\n", buf);
	if (strncmp(buf, "stop", 4) == 0)
		xbus_deactivate(xbus);
	else if (XBUS_IS(xbus, IDLE) && strncmp(buf, "start", 5) == 0)
		xbus_activate(xbus);
	else {
		XBUS_NOTICE(xbus,
			    "%s: Illegal action %s in state %s. Ignored.\n",
			    __func__, buf, xbus_statename(XBUS_STATE(xbus)));
		return -EINVAL;
	}
	return count;
}
예제 #3
0
int xframe_receive(xbus_t *xbus, xframe_t *xframe)
{
	int		ret = 0;
	struct timeval	now;
	struct timeval	tv_received;
	int		usec;

	if(XFRAME_LEN(xframe) < RPACKET_HEADERSIZE) {
		static int	rate_limit;

		if((rate_limit++ % 1003) == 0) {
			XBUS_NOTICE(xbus, "short xframe\n");
			dump_xframe("short xframe", xbus, xframe, debug);
		}
		FREE_RECV_XFRAME(xbus, xframe);
		return -EPROTO;
	}
	if(!XBUS_FLAGS(xbus, CONNECTED)) {
		XBUS_DBG(GENERAL, xbus, "Dropped xframe. Is shutting down.\n");
		return -ENODEV;
	}
	tv_received = xframe->tv_received;
	/*
	 * We want to check that xframes do not mix PCM and other commands
	 */
	if(XPACKET_IS_PCM((xpacket_t *)xframe->packets)) {
		if(!XBUS_IS(xbus, READY))
			FREE_RECV_XFRAME(xbus, xframe);
		else
			xframe_receive_pcm(xbus, xframe);
	} else {
		XBUS_COUNTER(xbus, RX_CMD)++;
		ret = xframe_receive_cmd(xbus, xframe);
	}
	/* Calculate total processing time */
	do_gettimeofday(&now);
	usec = (now.tv_sec - tv_received.tv_sec) * 1000000 +
		now.tv_usec - tv_received.tv_usec;
	if(usec > xbus->max_rx_process)
		xbus->max_rx_process = usec;
	return ret;
}
예제 #4
0
/*
 * For backward compatibility with old dahdi-tools
 * Remove after dahdi_registration is upgraded
 */
static DEVICE_ATTR_WRITER(span_store, dev, buf, count)
{
	xpd_t *xpd;
	int dahdi_reg;
	int ret;

	BUG_ON(!dev);
	xpd = dev_to_xpd(dev);
	if (!xpd)
		return -ENODEV;
	ret = sscanf(buf, "%d", &dahdi_reg);
	if (ret != 1)
		return -EINVAL;
	if (!XBUS_IS(xpd->xbus, READY))
		return -ENODEV;
	XPD_DBG(DEVICES, xpd, "%s -- deprecated (should use assigned-spans)\n",
		(dahdi_reg) ? "register" : "unregister");
	if (dahdi_reg)
		xbus_register_dahdi_device(xpd->xbus);
	  else
		xbus_unregister_dahdi_device(xpd->xbus);
	return count;
}
예제 #5
0
/*
 * For backward compatibility with old dahdi-tools
 * Remove after dahdi_registration is upgraded
 */
static DEVICE_ATTR_WRITER(span_store, dev, buf, count)
{
	xpd_t *xpd;
	int dahdi_reg;
	int ret;

	BUG_ON(!dev);
	xpd = dev_to_xpd(dev);
	if (!xpd)
		return -ENODEV;
	ret = sscanf(buf, "%d", &dahdi_reg);
	if (ret != 1)
		return -EINVAL;
	if (!XBUS_IS(xpd->xbus, READY))
		return -ENODEV;
	XPD_DBG(DEVICES, xpd, "%s -- deprecated (should use pinned-spans)\n",
		(dahdi_reg) ? "register" : "unregister");
	if (xbus_is_registered(xpd->xbus)) {
		if (dahdi_reg) {
			XPD_DBG(DEVICES, xpd,
				"already registered %s. Ignored.\n",
				xpd->xbus->busname);
		} else {
			xbus_unregister_dahdi_device(xpd->xbus);
		}
	} else {
		if (!dahdi_reg) {
			XPD_DBG(DEVICES, xpd,
				"already unregistered %s. Ignored.\n",
				xpd->xbus->busname);
		} else {
			xbus_register_dahdi_device(xpd->xbus);
		}
	}
	return count;
}