📄 qos.c
字号:
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 + -