patch-2.4.19 linux-2.4.19/net/irda/irlap_event.c
Next file: linux-2.4.19/net/irda/irlap_frame.c
Previous file: linux-2.4.19/net/irda/irlap.c
Back to the patch index
Back to the overall index
- Lines: 101
- Date:
Fri Aug 2 17:39:46 2002
- Orig file:
linux-2.4.18/net/irda/irlap_event.c
- Orig date:
Mon Feb 25 11:38:14 2002
diff -urN linux-2.4.18/net/irda/irlap_event.c linux-2.4.19/net/irda/irlap_event.c
@@ -252,6 +252,9 @@
* that will change the state away form XMIT
*/
if (skb_queue_len(&self->txq)) {
+ /* Prevent race conditions with irlap_data_request() */
+ self->local_busy = TRUE;
+
/* Try to send away all queued data frames */
while ((skb = skb_dequeue(&self->txq)) != NULL) {
ret = (*state[self->state])(self, SEND_I_CMD,
@@ -260,6 +263,8 @@
if (ret == -EPROTO)
break; /* Try again later! */
}
+ /* Finished transmitting */
+ self->local_busy = FALSE;
} else if (self->disconnect_pending) {
self->disconnect_pending = FALSE;
@@ -282,25 +287,15 @@
* Switches state and provides debug information
*
*/
-void irlap_next_state(struct irlap_cb *self, IRLAP_STATE state)
+static inline void irlap_next_state(struct irlap_cb *self, IRLAP_STATE state)
{
+ /*
if (!self || self->magic != LAP_MAGIC)
return;
IRDA_DEBUG(4, "next LAP state = %s\n", irlap_state[state]);
-
+ */
self->state = state;
-
-#ifdef CONFIG_IRDA_DYNAMIC_WINDOW
- /*
- * If we are swithing away from a XMIT state then we are allowed to
- * transmit a maximum number of bytes again when we enter the XMIT
- * state again. Since its possible to "switch" from XMIT to XMIT,
- * we cannot do this when swithing into the XMIT state :-)
- */
- if ((state != LAP_XMIT_P) && (state != LAP_XMIT_S))
- self->bytes_left = self->line_capacity;
-#endif /* CONFIG_IRDA_DYNAMIC_WINDOW */
}
/*
@@ -1017,6 +1012,12 @@
IRDA_DEBUG(3, __FUNCTION__ "(), POLL_TIMER_EXPIRED (%ld)\n",
jiffies);
irlap_send_rr_frame(self, CMD_FRAME);
+ /* Return to NRM properly - Jean II */
+ self->window = self->window_size;
+#ifdef CONFIG_IRDA_DYNAMIC_WINDOW
+ /* Allowed to transmit a maximum number of bytes again. */
+ self->bytes_left = self->line_capacity;
+#endif /* CONFIG_IRDA_DYNAMIC_WINDOW */
irlap_start_final_timer(self, self->final_timeout);
irlap_next_state(self, LAP_NRM_P);
break;
@@ -1029,6 +1030,10 @@
self->retry_count = 0;
irlap_next_state(self, LAP_PCLOSE);
break;
+ case DATA_REQUEST:
+ /* Nothing to do, irlap_do_event() will send the packet
+ * when we return... - Jean II */
+ break;
default:
IRDA_DEBUG(0, __FUNCTION__ "(), Unknown event %s\n",
irlap_event[event]);
@@ -1645,12 +1650,17 @@
*/
if (skb->len > self->bytes_left) {
skb_queue_head(&self->txq, skb_get(skb));
+
/*
* Switch to NRM_S, this is only possible
* when we are in secondary mode, since we
* must be sure that we don't miss any RR
* frames
*/
+ self->window = self->window_size;
+ self->bytes_left = self->line_capacity;
+ irlap_start_wd_timer(self, self->wd_timeout);
+
irlap_next_state(self, LAP_NRM_S);
return -EPROTO; /* Try again later */
@@ -1688,6 +1698,10 @@
irlap_start_wd_timer(self, self->wd_timeout);
irlap_next_state(self, LAP_SCLOSE);
break;
+ case DATA_REQUEST:
+ /* Nothing to do, irlap_do_event() will send the packet
+ * when we return... - Jean II */
+ break;
default:
IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n",
irlap_event[event]);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)