⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qos.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 2 页
字号:
		return ret;	skb_put(skb, ret);	/* Insert link disconnect/threshold time */	ret = irda_param_insert(self, PI_LINK_DISC, skb->tail, 				skb_tailroom(skb), &irlap_param_info);	if (ret < 0)		return ret;	skb_put(skb, ret);	return 0;}/* * Function irlap_param_baud_rate (instance, param, get) * *    Negotiate data-rate * */static int irlap_param_baud_rate(void *instance, irda_param_t *param, int get){	__u16 final;	struct irlap_cb *self = (struct irlap_cb *) instance;	ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);	if (get) {		param->pv.i = self->qos_rx.baud_rate.bits;		IRDA_DEBUG(2, __FUNCTION__ "(), baud rate = 0x%02x\n", 			   param->pv.i);			} else {		/* 		 *  Stations must agree on baud rate, so calculate		 *  intersection 		 */		IRDA_DEBUG(2, "Requested BAUD_RATE: 0x%04x\n", param->pv.s);		final = param->pv.s & self->qos_rx.baud_rate.bits;		IRDA_DEBUG(2, "Final BAUD_RATE: 0x%04x\n", final);		self->qos_tx.baud_rate.bits = final;		self->qos_rx.baud_rate.bits = final;	}	return 0;}/* * Function irlap_param_link_disconnect (instance, param, get) * *    Negotiate link disconnect/threshold time.  * */static int irlap_param_link_disconnect(void *instance, irda_param_t *param, 				       int get){	__u16 final;		struct irlap_cb *self = (struct irlap_cb *) instance;		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);		if (get)		param->pv.b = self->qos_rx.link_disc_time.bits;	else {		/*  		 *  Stations must agree on link disconnect/threshold 		 *  time.		 */		IRDA_DEBUG(2, "LINK_DISC: %02x\n", param->pv.b);		final = param->pv.b & self->qos_rx.link_disc_time.bits;		IRDA_DEBUG(2, "Final LINK_DISC: %02x\n", final);		self->qos_tx.link_disc_time.bits = final;		self->qos_rx.link_disc_time.bits = final;	}	return 0;}/* * Function irlap_param_max_turn_time (instance, param, get) * *    Negotiate the maximum turnaround time. This is a type 1 parameter and *    will be negotiated independently for each station * */static int irlap_param_max_turn_time(void *instance, irda_param_t *param, 				     int get){	struct irlap_cb *self = (struct irlap_cb *) instance;		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);		if (get)		param->pv.b = self->qos_rx.max_turn_time.bits;	else		self->qos_tx.max_turn_time.bits = param->pv.b;	return 0;}/* * Function irlap_param_data_size (instance, param, get) * *    Negotiate the data size. This is a type 1 parameter and *    will be negotiated independently for each station * */static int irlap_param_data_size(void *instance, irda_param_t *param, int get){	struct irlap_cb *self = (struct irlap_cb *) instance;		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);		if (get)		param->pv.b = self->qos_rx.data_size.bits;	else		self->qos_tx.data_size.bits = param->pv.b;	return 0;}/* * Function irlap_param_window_size (instance, param, get) * *    Negotiate the window size. This is a type 1 parameter and *    will be negotiated independently for each station * */static int irlap_param_window_size(void *instance, irda_param_t *param, 				   int get){	struct irlap_cb *self = (struct irlap_cb *) instance;		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);		if (get)		param->pv.b = self->qos_rx.window_size.bits;	else		self->qos_tx.window_size.bits = param->pv.b;	return 0;}/* * Function irlap_param_additional_bofs (instance, param, get) * *    Negotiate additional BOF characters. This is a type 1 parameter and *    will be negotiated independently for each station. */static int irlap_param_additional_bofs(void *instance, irda_param_t *param, int get){	struct irlap_cb *self = (struct irlap_cb *) instance;		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);		if (get)		param->pv.b = self->qos_rx.additional_bofs.bits;	else		self->qos_tx.additional_bofs.bits = param->pv.b;	return 0;}/* * Function irlap_param_min_turn_time (instance, param, get) * *    Negotiate the minimum turn around time. This is a type 1 parameter and *    will be negotiated independently for each station */static int irlap_param_min_turn_time(void *instance, irda_param_t *param, 				     int get){	struct irlap_cb *self = (struct irlap_cb *) instance;		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == LAP_MAGIC, return -1;);		if (get)		param->pv.b = self->qos_rx.min_turn_time.bits;	else		self->qos_tx.min_turn_time.bits = param->pv.b;	return 0;}/* * Function irlap_max_line_capacity (speed, max_turn_time, min_turn_time) * *    Calculate the maximum line capacity * */__u32 irlap_max_line_capacity(__u32 speed, __u32 max_turn_time){	__u32 line_capacity;	int i,j;	IRDA_DEBUG(2, __FUNCTION__ "(), speed=%d, max_turn_time=%d\n",		   speed, max_turn_time);	i = value_index(speed, baud_rates, 10);	j = value_index(max_turn_time, max_turn_times, 4);	ASSERT(((i >=0) && (i <=10)), return 0;);	ASSERT(((j >=0) && (j <=4)), return 0;);	line_capacity = max_line_capacities[i][j];	IRDA_DEBUG(2, __FUNCTION__ "(), line capacity=%d bytes\n", 		   line_capacity);		return line_capacity;}__u32 irlap_requested_line_capacity(struct qos_info *qos){	__u32 line_capacity;		line_capacity = qos->window_size.value * 		(qos->data_size.value + 6 + qos->additional_bofs.value) +		irlap_min_turn_time_in_bytes(qos->baud_rate.value, 					     qos->min_turn_time.value);		IRDA_DEBUG(2, __FUNCTION__ "(), requested line capacity=%d\n",		   line_capacity);		return line_capacity;			       		  }__u32 irlap_min_turn_time_in_bytes(__u32 speed, __u32 min_turn_time){	__u32 bytes;		bytes = speed * min_turn_time / 10000000;		return bytes;}static __u32 byte_value(__u8 byte, __u32 *array) {	int index;	ASSERT(array != NULL, return -1;);	index = msb_index(byte);	return index_value(index, array);}/* * Function msb_index (word) * *    Returns index to most significant bit (MSB) in word * */int msb_index (__u16 word) {	__u16 msb = 0x8000;	int index = 15;   /* Current MSB */		while (msb) {		if (word & msb)			break;   /* Found it! */		msb >>=1;		index--;	}	return index;}/* * Function value_index (value, array, size) * *    Returns the index to the value in the specified array */static int value_index(__u32 value, __u32 *array, int size){	int i;		for (i=0; i < size; i++)		if (array[i] == value)			break;	return i;}/* * Function index_value (index, array) * *    Returns value to index in array, easy! * */static __u32 index_value(int index, __u32 *array) {	return array[index];}/* * Function value_lower_bits (value, array) * *    Returns a bit field marking all possibility lower than value. *    We may need a "value_higher_bits" in the future... */static int value_lower_bits(__u32 value, __u32 *array, int size, __u16 *field){	int	i;	__u16	mask = 0x1;	__u16	result = 0x0;	for (i=0; i < size; i++) {		/* Add the current value to the bit field, shift mask */		result |= mask;		mask <<= 1;		/* Finished ? */		if (array[i] >= value)			break;	}	/* Send back a valid index */	if(i >= size)	  i = size - 1;	/* Last item */	*field = result;	return i;}void irda_qos_bits_to_value(struct qos_info *qos){	int index;	ASSERT(qos != NULL, return;);		index = msb_index(qos->baud_rate.bits);	qos->baud_rate.value = baud_rates[index];	index = msb_index(qos->data_size.bits);	qos->data_size.value = data_sizes[index];	index = msb_index(qos->window_size.bits);	qos->window_size.value = index+1;	index = msb_index(qos->min_turn_time.bits);	qos->min_turn_time.value = min_turn_times[index];		index = msb_index(qos->max_turn_time.bits);	qos->max_turn_time.value = max_turn_times[index];	index = msb_index(qos->link_disc_time.bits);	qos->link_disc_time.value = link_disc_times[index];		index = msb_index(qos->additional_bofs.bits);	qos->additional_bofs.value = add_bofs[index];#ifdef CONFIG_IRDA_COMPRESSION	index = msb_index(qos->compression.bits);	if (index >= 0)		qos->compression.value = compressions[index];	else 		qos->compression.value = 0;#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -