vserver 2.0 rc7
[linux-2.6.git] / net / irda / irlap_event.c
index a58bb70..1cd89f5 100644 (file)
@@ -169,8 +169,8 @@ static void irlap_poll_timer_expired(void *data)
 {
        struct irlap_cb *self = (struct irlap_cb *) data;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        irlap_do_event(self, POLL_TIMER_EXPIRED, NULL, NULL);
 }
@@ -181,10 +181,10 @@ static void irlap_poll_timer_expired(void *data)
  * Make sure that state is XMIT_P/XMIT_S when calling this function
  * (and that nobody messed up with the state). - Jean II
  */
-void irlap_start_poll_timer(struct irlap_cb *self, int timeout)
+static void irlap_start_poll_timer(struct irlap_cb *self, int timeout)
 {
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
 #ifdef CONFIG_IRDA_FAST_RR
        /*
@@ -346,12 +346,12 @@ static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event,
        discovery_t *discovery_rsp;
        int ret = 0;
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case CONNECT_REQUEST:
-               ASSERT(self->netdev != NULL, return -1;);
+               IRDA_ASSERT(self->netdev != NULL, return -1;);
 
                if (self->media_busy) {
                        /* Note : this will never happen, because we test
@@ -389,10 +389,11 @@ static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event,
                }
                break;
        case DISCOVERY_REQUEST:
-               ASSERT(info != NULL, return -1;);
+               IRDA_ASSERT(info != NULL, return -1;);
 
                if (self->media_busy) {
-                       IRDA_DEBUG(0, "%s(), media busy!\n", __FUNCTION__);
+                       IRDA_DEBUG(1, "%s(), DISCOVERY_REQUEST: media busy!\n",
+                                  __FUNCTION__);
                        /* irlap->log.condition = MEDIA_BUSY; */
 
                        /* This will make IrLMP try again */
@@ -414,7 +415,7 @@ static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event,
                irlap_next_state(self, LAP_QUERY);
                break;
        case RECV_DISCOVERY_XID_CMD:
-               ASSERT(info != NULL, return -1;);
+               IRDA_ASSERT(info != NULL, return -1;);
 
                /* Assert that this is not the final slot */
                if (info->s <= info->S) {
@@ -433,10 +434,11 @@ static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event,
                                self->frame_sent = FALSE;
 
                        /*
-                        * Remember to multiply the query timeout value with
-                        * the number of slots used
+                        * Go to reply state until end of discovery to
+                        * inhibit our own transmissions. Set the timer
+                        * to not stay forever there... Jean II
                         */
-                       irlap_start_query_timer(self, QUERY_TIMEOUT*info->S);
+                       irlap_start_query_timer(self, info->S, info->s);
                        irlap_next_state(self, LAP_REPLY);
                } else {
                /* This is the final slot. How is it possible ?
@@ -452,6 +454,9 @@ static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event,
                 * Not much. It's too late to answer those discovery frames,
                 * so we just pass the info to IrLMP who will put it in the
                 * log (and post an event).
+                * Another cause would be devices that do discovery much
+                * slower than us, however the latest fixes should minimise
+                * those cases...
                 * Jean II
                 */
                        IRDA_DEBUG(1, "%s(), Receiving final discovery request, missed the discovery slots :-(\n", __FUNCTION__);
@@ -572,21 +577,21 @@ static int irlap_state_query(struct irlap_cb *self, IRLAP_EVENT event,
 {
        int ret = 0;
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case RECV_DISCOVERY_XID_RSP:
-               ASSERT(info != NULL, return -1;);
-               ASSERT(info->discovery != NULL, return -1;);
+               IRDA_ASSERT(info != NULL, return -1;);
+               IRDA_ASSERT(info->discovery != NULL, return -1;);
 
                IRDA_DEBUG(4, "%s(), daddr=%08x\n", __FUNCTION__,
                           info->discovery->data.daddr);
 
                if (!self->discovery_log) {
-                       WARNING("%s: discovery log is gone! "
-                               "maybe the discovery timeout has been set to "
-                               "short?\n", __FUNCTION__);
+                       IRDA_WARNING("%s: discovery log is gone! "
+                                    "maybe the discovery timeout has been set"
+                                    " to short?\n", __FUNCTION__);
                        break;
                }
                hashbin_insert(self->discovery_log,
@@ -609,7 +614,7 @@ static int irlap_state_query(struct irlap_cb *self, IRLAP_EVENT event,
                 * Jean II
                 */
 
-               ASSERT(info != NULL, return -1;);
+               IRDA_ASSERT(info != NULL, return -1;);
 
                IRDA_DEBUG(1, "%s(), Receiving discovery request (s = %d) while performing discovery :-(\n", __FUNCTION__, info->s);
 
@@ -686,17 +691,17 @@ static int irlap_state_reply(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case QUERY_TIMER_EXPIRED:
-               IRDA_DEBUG(2, "%s(), QUERY_TIMER_EXPIRED <%ld>\n",
+               IRDA_DEBUG(0, "%s(), QUERY_TIMER_EXPIRED <%ld>\n",
                           __FUNCTION__, jiffies);
                irlap_next_state(self, LAP_NDM);
                break;
        case RECV_DISCOVERY_XID_CMD:
-               ASSERT(info != NULL, return -1;);
+               IRDA_ASSERT(info != NULL, return -1;);
                /* Last frame? */
                if (info->s == 0xff) {
                        del_timer(&self->query_timer);
@@ -707,16 +712,26 @@ static int irlap_state_reply(struct irlap_cb *self, IRLAP_EVENT event,
                        irlap_next_state(self, LAP_NDM);
 
                        irlap_discovery_indication(self, info->discovery);
-               } else if ((info->s >= self->slot) && (!self->frame_sent)) {
-                       discovery_rsp = irlmp_get_discovery_response();
-                       discovery_rsp->data.daddr = info->daddr;
+               } else {
+                       /* If it's our slot, send our reply */
+                       if ((info->s >= self->slot) && (!self->frame_sent)) {
+                               discovery_rsp = irlmp_get_discovery_response();
+                               discovery_rsp->data.daddr = info->daddr;
+
+                               irlap_send_discovery_xid_frame(self, info->S,
+                                                              self->slot,
+                                                              FALSE,
+                                                              discovery_rsp);
 
-                       irlap_send_discovery_xid_frame(self, info->S,
-                                                      self->slot, FALSE,
-                                                      discovery_rsp);
+                               self->frame_sent = TRUE;
+                       }
+                       /* Readjust our timer to accomodate devices
+                        * doing faster or slower discovery than us...
+                        * Jean II */
+                       irlap_start_query_timer(self, info->S, info->s);
 
-                       self->frame_sent = TRUE;
-                       irlap_next_state(self, LAP_REPLY);
+                       /* Keep state */
+                       //irlap_next_state(self, LAP_REPLY);
                }
                break;
        default:
@@ -743,14 +758,14 @@ static int irlap_state_conn(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(4, "%s(), event=%s\n", __FUNCTION__, irlap_event[ event]);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case CONNECT_RESPONSE:
                skb_pull(skb, sizeof(struct snrm_frame));
 
-               ASSERT(self->netdev != NULL, return -1;);
+               IRDA_ASSERT(self->netdev != NULL, return -1;);
 
                irlap_qos_negotiate(self, skb);
 
@@ -837,8 +852,8 @@ static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case FINAL_TIMER_EXPIRED:
@@ -866,8 +881,8 @@ static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event,
        case RECV_SNRM_CMD:
                IRDA_DEBUG(4, "%s(), SNRM battle!\n", __FUNCTION__);
 
-               ASSERT(skb != NULL, return 0;);
-               ASSERT(info != NULL, return 0;);
+               IRDA_ASSERT(skb != NULL, return 0;);
+               IRDA_ASSERT(info != NULL, return 0;);
 
                /*
                 *  The device with the largest device address wins the battle
@@ -877,7 +892,7 @@ static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event,
                        del_timer(&self->final_timer);
                        irlap_initiate_connection_state(self);
 
-                       ASSERT(self->netdev != NULL, return -1;);
+                       IRDA_ASSERT(self->netdev != NULL, return -1;);
 
                        skb_pull(skb, sizeof(struct snrm_frame));
 
@@ -909,11 +924,11 @@ static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event,
                irlap_initiate_connection_state(self);
 
                /* Negotiate connection parameters */
-               ASSERT(skb->len > 10, return -1;);
+               IRDA_ASSERT(skb->len > 10, return -1;);
 
                skb_pull(skb, sizeof(struct ua_frame));
 
-               ASSERT(self->netdev != NULL, return -1;);
+               IRDA_ASSERT(self->netdev != NULL, return -1;);
 
                irlap_qos_negotiate(self, skb);
 
@@ -1144,8 +1159,8 @@ static int irlap_state_pclose(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(1, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case RECV_UA_RSP: /* FALLTHROUGH */
@@ -1212,7 +1227,7 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
                 */
                self->fast_RR = FALSE;
 #endif /* CONFIG_IRDA_FAST_RR */
-               ASSERT( info != NULL, return -1;);
+               IRDA_ASSERT( info != NULL, return -1;);
 
                ns_status = irlap_validate_ns_received(self, info->ns);
                nr_status = irlap_validate_nr_received(self, info->nr);
@@ -1446,7 +1461,7 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
                        /* Start poll timer */
                        irlap_start_poll_timer(self, self->poll_timeout);
                } else if (ret == NR_UNEXPECTED) {
-                       ASSERT(info != NULL, return -1;);
+                       IRDA_ASSERT(info != NULL, return -1;);
                        /*
                         *  Unexpected nr!
                         */
@@ -1477,7 +1492,7 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
                }
                break;
        case RECV_RNR_RSP:
-               ASSERT(info != NULL, return -1;);
+               IRDA_ASSERT(info != NULL, return -1;);
 
                /* Stop final timer */
                del_timer(&self->final_timer);
@@ -1598,8 +1613,8 @@ static int irlap_state_reset_wait(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(3, "%s(), event = %s\n", __FUNCTION__, irlap_event[event]);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case RESET_REQUEST:
@@ -1645,8 +1660,8 @@ static int irlap_state_reset(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(3, "%s(), event = %s\n", __FUNCTION__, irlap_event[event]);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case RECV_DISC_CMD:
@@ -1679,7 +1694,7 @@ static int irlap_state_reset(struct irlap_cb *self, IRLAP_EVENT event,
                if (self->retry_count < 3) {
                        irlap_wait_min_turn_around(self, &self->qos_tx);
 
-                       ASSERT(self->netdev != NULL, return -1;);
+                       IRDA_ASSERT(self->netdev != NULL, return -1;);
                        irlap_send_snrm_frame(self, self->qos_dev);
 
                        self->retry_count++; /* Experimental!! */
@@ -1738,8 +1753,8 @@ static int irlap_state_xmit_s(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(4, "%s(), event=%s\n", __FUNCTION__, irlap_event[event]);
 
-       ASSERT(self != NULL, return -ENODEV;);
-       ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
+       IRDA_ASSERT(self != NULL, return -ENODEV;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
 
        switch (event) {
        case SEND_I_CMD:
@@ -1860,8 +1875,8 @@ static int irlap_state_nrm_s(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(4, "%s(), event=%s\n", __FUNCTION__, irlap_event[ event]);
 
-       ASSERT(self != NULL, return -1;);
-       ASSERT(self->magic == LAP_MAGIC, return -1;);
+       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
 
        switch (event) {
        case RECV_I_CMD: /* Optimize for the common case */
@@ -2217,8 +2232,8 @@ static int irlap_state_sclose(struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(1, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return -ENODEV;);
-       ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
+       IRDA_ASSERT(self != NULL, return -ENODEV;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
 
        switch (event) {
        case RECV_DISC_CMD:
@@ -2290,8 +2305,8 @@ static int irlap_state_reset_check( struct irlap_cb *self, IRLAP_EVENT event,
 
        IRDA_DEBUG(1, "%s(), event=%s\n", __FUNCTION__, irlap_event[event]);
 
-       ASSERT(self != NULL, return -ENODEV;);
-       ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
+       IRDA_ASSERT(self != NULL, return -ENODEV;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
 
        switch (event) {
        case RESET_RESPONSE: