patch-2.4.17 linux/net/irda/qos.c
Next file: linux/net/netlink/netlink_dev.c
Previous file: linux/net/irda/irsysctl.c
Back to the patch index
Back to the overall index
- Lines: 92
- Date:
Fri Dec 21 16:40:33 2001
- Orig file:
linux-2.4.16/net/irda/qos.c
- Orig date:
Fri Nov 9 22:22:17 2001
diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.16/net/irda/qos.c linux/net/irda/qos.c
@@ -51,7 +51,16 @@
* may want to keep the LAP alive longuer or shorter in case of link failure.
* Remember that the threshold time (early warning) is fixed to 3s...
*/
-int sysctl_max_inactive_time = 12;
+int sysctl_max_noreply_time = 12;
+/*
+ * Minimum turn time to be applied before transmitting to the peer.
+ * Nonzero values (usec) are used as lower limit to the per-connection
+ * mtt value which was announced by the other end during negotiation.
+ * Might be helpful if the peer device provides too short mtt.
+ * Default is 10 which means using the unmodified value given by the peer
+ * except if it's 0 (0 is likely a bug in the other stack).
+ */
+unsigned sysctl_min_tx_turn_time = 10;
static int irlap_param_baud_rate(void *instance, irda_param_t *param, int get);
static int irlap_param_link_disconnect(void *instance, irda_param_t *parm,
@@ -184,7 +193,6 @@
* 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 inline int value_lower_bits(__u32 value, __u32 *array, int size, __u16 *field)
{
@@ -207,6 +215,33 @@
return i;
}
+/*
+ * Function value_highest_bit (value, array)
+ *
+ * Returns a bit field marking the highest possibility lower than value.
+ */
+static inline int value_highest_bit(__u32 value, __u32 *array, int size, __u16 *field)
+{
+ int i;
+ __u16 mask = 0x1;
+ __u16 result = 0x0;
+
+ for (i=0; i < size; i++) {
+ /* Finished ? */
+ if (array[i] <= value)
+ break;
+ /* Shift mask */
+ mask <<= 1;
+ }
+ /* Set the current value to the bit field */
+ result |= mask;
+ /* Send back a valid index */
+ if(i >= size)
+ i = size - 1; /* Last item */
+ *field = result;
+ return i;
+}
+
/* -------------------------- MAIN CALLS -------------------------- */
/*
@@ -254,9 +289,9 @@
sysctl_max_baud_rate = index_value(i, baud_rates);
/* Set configured max disc time */
- i = value_lower_bits(sysctl_max_inactive_time, link_disc_times, 8,
+ i = value_lower_bits(sysctl_max_noreply_time, link_disc_times, 8,
&qos->link_disc_time.bits);
- sysctl_max_inactive_time = index_value(i, link_disc_times);
+ sysctl_max_noreply_time = index_value(i, link_disc_times);
/* LSB is first byte, MSB is second byte */
qos->baud_rate.bits &= 0x03ff;
@@ -281,6 +316,19 @@
int index;
IRDA_DEBUG(2, __FUNCTION__ "()\n");
+
+ /*
+ * Make sure the mintt is sensible.
+ */
+ if (sysctl_min_tx_turn_time > qos->min_turn_time.value) {
+ int i;
+
+ /* We don't really need bits, but easier this way */
+ i = value_highest_bit(sysctl_min_tx_turn_time, min_turn_times,
+ 8, &qos->min_turn_time.bits);
+ sysctl_min_tx_turn_time = index_value(i, min_turn_times);
+ qos->min_turn_time.value = sysctl_min_tx_turn_time;
+ }
/*
* Not allowed to use a max turn time less than 500 ms if the baudrate
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)